sen
2025-12-25 8ab333f837fce5710568cf2fbfa19e00522a77a9
ui/admin-ui3/src/views/tms/tmsContract/index.vue
@@ -45,6 +45,26 @@
        >导出
        </el-button>
      </template>
      <template #billingCycle-form="scope">
       <div style="display: flex;">
         <div style="width: 40px;flex: 0 0 35px;">上月</div>
         <avue-input-number  style="width: 100px;flex: 0 0 100px;" max="31" min="0" v-model="form.billingCycleLastMonthDay"></avue-input-number>
         <div style="width: 90px;flex: 0 0 88px;">日起,至当月</div>
         <avue-input-number style="width: 100px;flex: 0 0 100px;" max="31" min="0"  v-model="form.billingCycleCurrentMonthDay"></avue-input-number>
       </div>
      </template>
      <template #reconciliation-form="scope">
       <div style="display: flex;">
         <avue-input-number  style="width: 100px;flex: 0 0 100px;" @change="reconciliationDayChange"  min="0" v-model="form.reconciliationDay"></avue-input-number>
         <div style="width: 40px;flex: 0 0 88px;">日+开票账期</div>
         <avue-input-number style="width: 100px;flex: 0 0 100px;"  min="0" @change="invoiceDayChange" v-model="form.invoiceDay"></avue-input-number>
         <div style="width: 40px;flex: 0 0 88px;">日+付款账期</div>
         <avue-input-number style="width: 100px;flex: 0 0 100px;" min="0" @change="paymentDayChange" v-model="form.paymentDay"></avue-input-number>
         <div style="width: 40px;flex: 0 0 88px;">日=总账期</div>
         <avue-input-number style="width: 100px;flex: 0 0 100px;" min="0" v-model="form.totalAccountDay"></avue-input-number>
       </div>
      </template>
    </avue-crud>
  </basicContainer>
</template>
@@ -65,7 +85,10 @@
import {usePagePlus} from "@/hooks/usePagePlus";
import {hasPermission} from "@/utils/permissionUtils";
import {getTmsCustomerInfo, listTmsCustomerInfo} from "@/api/tms/tmsCustomerInfo";
import dayjs from 'dayjs';
import {formatDate} from "@/utils/ruoyi";
import {getTmsSettlementEntity, listTmsSettlementEntity} from "@/api/tms/tmsSettlementEntity";
import router from "@/router";
const {proxy} = useCurrentInstance();
const crudRef = ref();
@@ -108,6 +131,29 @@
            {
              required: true,
              message: "系统编号不能为空", trigger: "blur"
            }
          ],
        },
        isTempContract: {
          label: '临时合同',
          type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_number_is',
          addDisplay: true,value:'1',
          editDisplay: true,
          viewDisplay: true,
          change: ({value}: any) => {
            option.value.group.forEach((item: any) => {
              if (item.prop == 'fjxx') {
                item.column.attachmentPath.rules.forEach((item:any)=>{
                  item.required = value == 1;
                })
              }
            })
            console.log(value)
          },
          rules: [
            {
              required: true,
              message: "是否临时合同不能为空", trigger: "change"
            }
          ],
        },
@@ -154,12 +200,6 @@
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          rules: [
            {
              required: true,
              message: "签约日期不能为空", trigger: "blur"
            }
          ],
        },
        contractDate: {
          label: '合同期限',
@@ -176,9 +216,15 @@
          format: 'YYYY-MM-DD HH:mm:ss',
          valueFormat: 'YYYY-MM-DD HH:mm:ss',
          change: ({value}:{value:any}) => {
            if (Array.isArray(value)){
            if (Array.isArray(value) && value.length >1){
              form.value.contractStartDate = value[0]
              form.value.contractEndDate = value[1]
            }
            if (!(Array.isArray(value) && value.length >1)&& form.value.contractStartDate && form.value.contractEndDate){
              form.value.contractDate = [
                formatDate(form.value.contractStartDate),
                formatDate(form.value.contractEndDate)
              ];
            }
          }
        },
@@ -209,7 +255,7 @@
          type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/contract_status',
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          viewDisplay: true,value: '0',
          rules: [
            {
              required: true,
@@ -234,7 +280,7 @@
              message: "甲方名称不能为空", trigger: "change"
            }
          ],
          type: 'table',suffixIcon:'search',
          type: 'table',suffixIcon:'search',dataType: 'string',
          children:{
            border: true,
            searchMenuSpan: 5,
@@ -255,7 +301,7 @@
              contactName: {
                label: '联系人姓名',minWidth: 120,
              },
              signCompany: {
              signCompanyName: {
                label: '签约公司', minWidth: 150,
              },
            },
@@ -283,7 +329,21 @@
              })
            }
          }
          },
          change: (val: any) => {
            const table = crudRef.value?.getPropRef?.('partyAId')?.$refs?.temp;
            if (!table) return;
            let active = table.active;
            if (Array.isArray(active)) active = active[0];
            if (active) {
              Object.assign(form.value, {
                partyAId: active.id,
                partyAName: active.customerShortName,
                partyAContact: active.contactName,
                partyAContactInfo: active.contactPhone,
              });
            }
          },
        },
        partyAContact: {
          label: '甲方联系人',
@@ -303,7 +363,7 @@
      label: '乙方信息',
      prop: 'yfxx',
      column: {
        partyBName: {
        partyBId: {
          label: '乙方名称',
          addDisplay: true,
          editDisplay: true,
@@ -311,10 +371,83 @@
          rules: [
            {
              required: true,
              message: "乙方名称不能为空", trigger: "blur"
              message: "乙方名称不能为空", trigger: "change"
            }
          ],
          type: 'table',suffixIcon:'search',dataType: 'string',
          children:{
            border: true,
            searchMenuSpan: 5,
            column:{
              customerType: {
                label: '客户类型', minWidth: 120,
                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/customer_type',
                search: true,
              },
              customerShortName: {
                label: '客户简称', minWidth: 130,
                search: true,
              },
              customerCode: {
                label: '客户编号',minWidth: 120,
                search: true,
              },
              contactName: {
                label: '联系人姓名',minWidth: 120,
              },
            },
          },
          props:{
            label: 'customerShortName',
            value: 'id'
          },
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback:any) => {
            if (value){
              let id = value;
              if (Array.isArray(value)){
                id = value[0]
              }
              getTmsSettlementEntity(id).then(res=>{
                return callback(res.data||{})
              })
            }else{
              listTmsSettlementEntity({pageSize:page.pageSize,pageNum:page.currentPage,...data}).then(res=>{
                return callback({
                  total: res.total,
                  data: res.rows||[],
                })
              })
            }
          },
          change: (val: any) => {
            const table = crudRef.value?.getPropRef?.('partyBId')?.$refs?.temp;
            if (!table) return;
            let active = table.active;
            if (Array.isArray(active)) active = active[0];
            if (active) {
              Object.assign(form.value, {
                partyBId: active.id,
                partyBName: active.customerShortName,
                partyBContact: active.contactName,
                partyBContactInfo: active.contactPhone,
              });
            }
          },
        },
        // partyBName: {
        //   label: '乙方名称',
        //   addDisplay: true,
        //   editDisplay: true,
        //   viewDisplay: true,
        //   rules: [
        //     {
        //       required: true,
        //       message: "乙方名称不能为空", trigger: "blur"
        //     }
        //   ],
        // },
        partyBContact: {
          label: '乙方联系人',
          addDisplay: true,
@@ -329,66 +462,103 @@
        },
      }
    },
    // {
    //   label: '款项信息',
    //   prop: 'kfxx',
    //   column: {
    //     contractAmount: {
    //       label: '合同金额',
    //       addDisplay: true,
    //       editDisplay: true,
    //       viewDisplay: true,
    //       rules: [
    //         {
    //           required: true,
    //           message: "合同金额不能为空", trigger: "blur"
    //         }
    //       ],
    //     },
    //     // paymentMethod: {
    //     //   label: '付款方式',
    //     //   type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/payment_method',
    //     //   addDisplay: true,
    //     //   editDisplay: true,
    //     //   viewDisplay: true,
    //     //   rules: [
    //     //     {
    //     //       required: true,
    //     //       message: "付款方式不能为空", trigger: "change"
    //     //     }
    //     //   ],
    //     // },
    //     paymentCycle: {
    //       label: '付款周期',
    //       addDisplay: true,
    //       editDisplay: true,
    //       viewDisplay: true,
    //     },
    //     paidAmount: {
    //       label: '已付款项',
    //       addDisplay: true,
    //       editDisplay: true,
    //       viewDisplay: true,
    //     },
    //     unpaidAmount: {
    //       label: '未付款项',
    //       addDisplay: true,
    //       editDisplay: true,
    //       viewDisplay: true,
    //     },
    //     invoiceStatus: {
    //       label: '发票状态',
    //       type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/invoice_status',
    //       addDisplay: true,
    //       editDisplay: true,
    //       viewDisplay: true,
    //       // rules: [
    //       //   {
    //       //     required: true,
    //       //     message: "发票状态不能为空", trigger: "change"
    //       //   }
    //       // ],
    //     },
    //   }
    // },
    {
      label: '款项信息',
      prop: 'kfxx',
      label: '结算信息',
      prop: 'jsxx',
      column: {
        contractAmount: {
          label: '合同金额',
        cycleType: {
          label: '周期类型',
          type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/cycle_type',
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          rules: [
            {
              required: true,
              message: "合同金额不能为空", trigger: "blur"
              message: "周期类型不能为空", trigger: "change"
            }
          ],
        },
        paymentMethod: {
          label: '付款方式',
          type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/payment_method',
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          rules: [
            {
              required: true,
              message: "付款方式不能为空", trigger: "change"
            }
          ],
        billingCycle:{
          label: '账期周期',labelWidth: 80,
          // rules: [
          //   {
          //     required: true,
          //     message: "周期类型不能为空", trigger: "change"
          //   }
          // ],
        },
        paymentCycle: {
          label: '付款周期',
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
        },
        paidAmount: {
          label: '已付款项',
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
        },
        unpaidAmount: {
          label: '未付款项',
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
        },
        invoiceStatus: {
          label: '发票状态',
          type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/invoice_status',
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          rules: [
            {
              required: true,
              message: "发票状态不能为空", trigger: "change"
            }
          ],
        },
        reconciliation:{
          label: '对账账期', span:24,
          // rules: [
          //   {
          //     required: true,
          //     message: "对账账期不能为空", trigger: "change"
          //   }
          // ],
        }
      }
    },
    {
@@ -427,24 +597,37 @@
      label: '附件信息',
      prop: 'fjxx',
      column: {
        attachmentName: {
          label: '附件名称',
          addDisplay: false,
          editDisplay: false,
          viewDisplay: true,
        },
        // attachmentName: {
        //   label: '附件名称',
        //   addDisplay: false,
        //   editDisplay: false,
        //   viewDisplay: true,
        // },
        attachmentPath: {
          label: '附件路径',
          label: '附件',
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          viewDisplay: true,span: 24,
          accept:'string',dataType: 'string',
          type: 'upload',
          action: '/common/upload2',
          propsHttp:{
            home:'url',
            name:'newFileName',
          },
          rules: [
            {
              required: true,
              message: "请上传附件", trigger: "change"
            }
          ],
        },
        uploadedBy: {
          label: '上传人',
          addDisplay: false,
          editDisplay: false,
          viewDisplay: true,
        },
        // uploadedBy: {
        //   label: '上传人',
        //   addDisplay: false,
        //   editDisplay: false,
        //   viewDisplay: true,
        // },
      }
    },
    {
@@ -521,6 +704,13 @@
      hide: false,
      search: true,
    },
    isTempContract: {
      label: '临时合同',
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_number_is',
      display: false,minWidth:150,
      hide: false,
      search: true,
    },
    contractType: {
      label: '合同类型',
      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/contract_type',
@@ -577,13 +767,13 @@
      hide: false,minWidth:150,
      search: false,
    },
    paymentMethod: {
      label: '付款方式',
      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/payment_method',
      display: false,
      hide: false,minWidth:150,
      search: true,
    },
    // paymentMethod: {
    //   label: '付款方式',
    //   type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/payment_method',
    //   display: false,
    //   hide: false,minWidth:150,
    //   search: true,
    // },
    invoiceStatus: {
      label: '发票状态',
@@ -671,39 +861,33 @@
  deleteApi: delTmsContract,
  addApi: addTmsContract,
  updateApi: updateTmsContract,
  getBeginListFunc:()=>{
    queryParams.value.contractStatus = <any>router.currentRoute.value.query.contactStatus || undefined;
  },
  handleUpdateFunc: () => {
    crudRef.value.rowEdit(selectionList.value[0]);
  },
  handleSelectionChangeFunc: (selection: any) => {
    selectionList.value = selection;
  },
  handleEndOpenFunc:()=>{
    if (form.value.contractStartDate && form.value.contractEndDate){
      form.value.contractDate = [form.value.contractStartDate, form.value.contractEndDate]
    }
  }
})
onMounted(() => {
  watch(() => form.value.partyAId, () => {
    if (!form.value.partyAId){
      return;
    }
    const table = crudRef.value?.getPropRef?.('partyAId')?.$refs?.temp;
    if (!table) return;
    let active = table.active;
    if (Array.isArray(active)) active = active[0];
    if (active) {
      Object.assign(form.value, {
        partyAId: active.id,
        partyAName: active.customerShortName,
      });
    }
  });
});
const reconciliationDayChange = ({value}:any)=>{
  const reconciliationDay = Number(value) || 0;
  const paymentDay = Number(form.value.paymentDay) || 0;
  const previousTotal = Number(form.value.paymentDay) || 0;
  form.value.totalAccountDay = reconciliationDay + paymentDay + previousTotal;
}
const invoiceDayChange = ({value}:any)=>{
  const reconciliationDay = Number(form.value.reconciliationDay) || 0;
  const paymentDay =  Number(value) || 0;
  const previousTotal = Number(form.value.paymentDay) || 0;
  form.value.totalAccountDay = reconciliationDay + paymentDay + previousTotal;
}
const paymentDayChange = ({value}:any)=>{
  const reconciliationDay = Number(form.value.reconciliationDay) || 0;
  const paymentDay = Number(form.value.invoiceDay) || 0;
  const previousTotal =  Number(value) || 0;
  form.value.totalAccountDay = reconciliationDay + paymentDay + previousTotal;
}
</script>