Prechádzať zdrojové kódy

Merge branch 'purchaseDev' of http://172.16.100.139/new-business/drp-web into purchaseDev

002390 1 rok pred
rodič
commit
1588249b8a

+ 44 - 4
src/components/super-form/index.vue

@@ -4,15 +4,15 @@ export default {
   props: {
     value: {
       type: [Object],
-      require: true,
+      required: true,
     },
     dict: {
       type: [Object],
-      require: true,
+      required: true,
     },
     columns: {
       type: [Array],
-      require: true,
+      required: true,
     },
   },
   components: {
@@ -46,6 +46,32 @@ export default {
   },
   watch: {},
   methods: {
+    //
+    getFormItemRequired(prop, value) {
+      if (typeof prop.required === "function") {
+        return prop.required(value);
+      }
+      if (typeof prop.required === "boolean") {
+        return prop.required;
+      }
+    },
+    //
+    getFormItemDisabled(prop, value) {
+      if (typeof prop.disabled === "function") {
+        return prop.disabled(value);
+      }
+      if (typeof prop.disabled === "boolean") {
+        return prop.disabled;
+      }
+    },
+    //
+    getPickerOptions(prop, value) {
+      if (typeof prop.disabled === "function") {
+        return prop.pickerOptions(value);
+      } else {
+        return prop.pickerOptions;
+      }
+    },
     // 继承el-table的Method
     extendMethod() {
       const refMethod = Object.entries(this.$refs["superForm"]);
@@ -78,7 +104,11 @@ export default {
         :key="index"
         :span="item.span"
       >
-        <el-form-item :prop="item.key" :label="item.title">
+        <el-form-item
+          :prop="item.key"
+          :label="item.title"
+          :required="getFormItemRequired(item, innerValue)"
+        >
           <slot :name="item.key" :row="innerValue" :item="item" :attr="attr">
             <component
               v-if="attr.is === 'el-select'"
@@ -129,9 +159,19 @@ export default {
             >
             </component>
             <component
+              v-else-if="attr.is === 'el-date-picker'"
+              v-bind="attr"
+              v-model="innerValue[item.key]"
+              :disabled="getFormItemDisabled(attr, innerValue)"
+              :pickerOptions="getPickerOptions(attr, innerValue)"
+              style="width: 100%"
+            >
+            </component>
+            <component
               v-else
               v-bind="attr"
               v-model="innerValue[item.key]"
+              :disabled="getFormItemDisabled(attr, innerValue)"
               style="width: 100%"
             >
             </component>

+ 3 - 4
src/components/super-table/index.vue

@@ -430,6 +430,9 @@ export default {
         justify-content: space-between;
         align-items: center;
       "
+      :style="{
+        height: checkbox || pagination ? '50px' : '0px',
+      }"
     >
       <div class="mr-4">
         <template v-if="checkbox">
@@ -452,10 +455,6 @@ export default {
         </template>
         <template v-if="convenitentOperation">
           <button-hide v-model="innerColumns" @change="onHide"></button-hide>
-          <!-- <button-freeze
-            v-model="showColumns"
-            @freeze="onFreeze"
-          ></button-freeze> -->
         </template>
       </div>
       <pagination

+ 1 - 1
src/utils/init.js

@@ -26,7 +26,7 @@ export const initParams = (prop, key = "key", value = "value") => {
 export const initRules = (prop) => {
   const rules = {};
   prop
-    .filter(({ item }) => item.require)
+    .filter(({ item }) => item.required)
     .forEach(({ item }) => {
       const message = `${item.title}不能为空`;
       rules[item.key] = [

+ 80 - 60
src/views/purchase/contract/add/columns.js

@@ -1,9 +1,10 @@
 import CONFIG from "@/config";
+import { iunitprice } from "@/utils/expression";
 
 export default function useColumns() {
   const TableColumns = [
     {
-      item: { key: "puOrgName", title: "采购组织", require: true, width: 150 },
+      item: { key: "puOrgName", title: "采购组织", required: true, width: 150 },
       attr: {
         is: "el-popover-select-v2",
         valueKey: "name",
@@ -31,11 +32,10 @@ export default function useColumns() {
       item: { key: "lastPuMoney", title: "上年度采购额", width: 100 },
       attr: {
         is: "el-input-number",
-        precision: CONFIG.precision,
       },
     },
     {
-      item: { key: "buyerName", title: "采购员", require: true, width: 100 },
+      item: { key: "buyerName", title: "采购员", required: true, width: 100 },
       attr: {
         is: "el-popover-select-v2",
         valueKey: "name",
@@ -49,7 +49,12 @@ export default function useColumns() {
       },
     },
     {
-      item: { key: "supplierName", title: "供应商", require: true, width: 100 },
+      item: {
+        key: "supplierName",
+        title: "供应商",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-popover-select-v2",
         valueKey: "name",
@@ -64,7 +69,7 @@ export default function useColumns() {
       item: {
         key: "contractType",
         title: "合同类型",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: { is: "el-select", dictName: "puarchase_contract_contract_type" },
@@ -73,11 +78,15 @@ export default function useColumns() {
       item: { key: "puMoneyYear", title: "本年度采购额", width: 100 },
       attr: {
         is: "el-input-number",
-        precision: CONFIG.precision,
       },
     },
     {
-      item: { key: "puDeptName", title: "采购部门", require: true, width: 100 },
+      item: {
+        key: "puDeptName",
+        title: "采购部门",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-popover-select-v2",
         valueKey: "name",
@@ -92,7 +101,7 @@ export default function useColumns() {
       item: {
         key: "supplierTier",
         title: "供应商层级",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: { is: "el-select", dictName: "puarchase_contract_supplier_tier" },
@@ -101,7 +110,7 @@ export default function useColumns() {
       item: {
         key: "contractName",
         title: "合同名称",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: { is: "el-input" },
@@ -110,7 +119,7 @@ export default function useColumns() {
       item: {
         key: "grossRateAverage",
         title: "平均毛利率 (%)",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: {
@@ -122,7 +131,7 @@ export default function useColumns() {
       item: {
         key: "approveFlow",
         title: "审批流程",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: { is: "el-select", dictName: "puarchase_contract_approve_flow" },
@@ -131,7 +140,7 @@ export default function useColumns() {
       item: {
         key: "consumableClass",
         title: "耗材类别",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: {
@@ -143,7 +152,7 @@ export default function useColumns() {
       item: {
         key: "effectiveDate",
         title: "合同生效日期",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: {
@@ -155,7 +164,7 @@ export default function useColumns() {
       item: {
         key: "brandGrossRate",
         title: "同类品牌及毛利率 (%)",
-        require: true,
+        required: true,
       },
       attr: {
         is: "el-input-number",
@@ -166,7 +175,7 @@ export default function useColumns() {
       item: {
         key: "contractFormat",
         title: "合同格式",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: {
@@ -178,7 +187,7 @@ export default function useColumns() {
       item: {
         key: "productName",
         title: "产品类别&名称",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: { is: "el-input" },
@@ -187,16 +196,29 @@ export default function useColumns() {
       item: {
         key: "endDate",
         title: "合同终止日期",
-        require: true,
+        required: true,
         width: 100,
       },
-      attr: { is: "el-date-picker", valueFormat: "yyyy-MM-dd" },
+      attr: {
+        is: "el-date-picker",
+        valueFormat: "yyyy-MM-dd",
+        disabled: (prop) => !prop.effectiveDate,
+        pickerOptions: (prop) => {
+          return {
+            disabledDate(time) {
+              return (
+                time.getTime() < Date.now(prop.effectiveDate) - 3600 * 1000 * 24
+              );
+            },
+          };
+        },
+      },
     },
     {
       item: {
         key: "invoiceTax",
         title: "发票税率 (%)",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: {
@@ -212,7 +234,7 @@ export default function useColumns() {
       item: {
         key: "emergencyDegree",
         title: "紧急程度",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: {
@@ -221,14 +243,14 @@ export default function useColumns() {
       },
     },
     {
-      item: { key: "project", title: "项目医院", require: true, width: 100 },
+      item: { key: "project", title: "项目医院", required: true, width: 100 },
       attr: { is: "el-input" },
     },
     {
       item: {
         key: "deliveryType",
         title: "交货方式",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: { is: "el-select", dictName: "puarchase_contract_delivery_type" },
@@ -253,7 +275,7 @@ export default function useColumns() {
       item: {
         key: "guaranteePeriodEnd",
         title: "质保期限",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: { is: "el-input-number", precision: 2 },
@@ -270,11 +292,21 @@ export default function useColumns() {
       attr: { is: "el-date-picker", valueFormat: "yyyy-MM-dd" },
     },
     {
-      item: { key: "isTarget", title: "是否有指标", require: true, width: 100 },
+      item: {
+        key: "isTarget",
+        title: "是否有指标",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-select", dictName: "sys_yes_no" },
     },
     {
-      item: { key: "contractTarget", title: "合同指标", width: 100 },
+      item: {
+        key: "contractTarget",
+        title: "合同指标",
+        width: 100,
+        required: (prop) => prop.isTarget === "Y",
+      },
       attr: { is: "el-input", placeholder: '当【是否有指标】="有"时,必填' },
     },
     {
@@ -291,7 +323,12 @@ export default function useColumns() {
       },
     },
     {
-      item: { key: "isRebate", title: "是否有返利", require: true, width: 100 },
+      item: {
+        key: "isRebate",
+        title: "是否有返利",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-select", dictName: "sys_yes_no" },
     },
     {
@@ -299,8 +336,8 @@ export default function useColumns() {
         key: "rebatePolicy",
         title: "返利政策",
         span: 18,
-        require: true,
         width: 100,
+        required: (prop) => prop.isRebate === "Y",
       },
       attr: {
         is: "el-input",
@@ -315,7 +352,7 @@ export default function useColumns() {
       item: {
         key: "rollbackPolicy",
         title: "退换货政策",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: { is: "el-input" },
@@ -328,7 +365,7 @@ export default function useColumns() {
       item: {
         key: "contractContent",
         title: "合同主要内容",
-        require: true,
+        required: true,
         span: 24,
         width: 100,
       },
@@ -338,14 +375,6 @@ export default function useColumns() {
       item: { key: "refusalReasons", title: "拒绝理由", span: 24, width: 100 },
       attr: { is: "el-input" },
     },
-    // {
-    //   item: { key: "pigeonhole", title: "是否归档" },
-    //   attr: { is: "el-select", dictName: "sys_yes_no", disabled: true },
-    // },
-    // {
-    //   item: { key: "pigeonholeFile", title: "归档附件", span: 24 },
-    //   attr: { is: "el-file-upload", fileType: ["pdf"], disabled: true },
-    // },
     {
       item: { key: "externalFile", title: "对外附件", span: 24, width: 100 },
       attr: { is: "el-file-upload", fileType: ["pdf"] },
@@ -385,7 +414,7 @@ export default function useColumns() {
       item: {
         key: "paymentAgreement",
         title: "付款协议",
-        require: true,
+        required: true,
         width: 100,
       },
       attr: {
@@ -402,11 +431,10 @@ export default function useColumns() {
       item: { key: "taxPrice", title: "价税合计", width: 100 },
       attr: {
         is: "el-input-number",
-        precision: CONFIG.precision,
       },
     },
     {
-      item: { key: "currencyName", title: "币种", require: true, width: 100 },
+      item: { key: "currencyName", title: "币种", required: true, width: 100 },
       attr: {
         is: "el-popover-select-v2",
         valueKey: "name",
@@ -421,7 +449,6 @@ export default function useColumns() {
       item: { key: "guaranteePeriod", title: "质保期", width: 100 },
       attr: {
         is: "el-input-number",
-        precision: CONFIG.precision,
       },
     },
   ].map(({ item, attr }) => ({
@@ -438,7 +465,7 @@ export default function useColumns() {
           item: {
             title: "物料名称",
             key: "materialName",
-            require: true,
+            required: true,
           },
           attr: {
             is: "el-popover-select-v2",
@@ -489,7 +516,7 @@ export default function useColumns() {
           },
         },
         {
-          item: { title: "税率%", key: "tax", require: true },
+          item: { title: "税率%", key: "tax", required: true },
           attr: {
             is: "el-popover-select-v2",
             valueKey: "ntaxrate",
@@ -506,10 +533,9 @@ export default function useColumns() {
           },
         },
         {
-          item: { title: "含税单价", key: "taxPrice", require: true },
+          item: { title: "含税单价", key: "taxPrice", required: true },
           attr: {
             is: "el-input-number",
-            precision: CONFIG.precision,
           },
         },
         {
@@ -523,14 +549,11 @@ export default function useColumns() {
           },
         },
         {
-          item: { title: "无税单价", key: "taxFreePrice", require: true },
+          item: { title: "无税单价", key: "taxFreePrice", required: true },
           attr: {
             formatter: (prop) => {
               const { tax = 0, taxPrice = 0 } = prop;
-              prop.taxFreePrice = ((taxPrice / (tax / 100 + 1)) * 1).toFixed(
-                CONFIG.precision
-              );
-              return prop.taxFreePrice;
+              return (prop.taxFreePrice = iunitprice(tax, taxPrice));
             },
           },
         },
@@ -539,8 +562,7 @@ export default function useColumns() {
           attr: {
             formatter: (prop) => {
               const { qty = 0, tax = 0, taxPrice = 0 } = prop;
-              prop.taxFreeMoney = qty * (taxPrice / (tax / 100 + 1)) * 1;
-              return prop.taxFreeMoney;
+              return (prop.taxFreeMoney = qty * iunitprice(tax, taxPrice));
             },
           },
         },
@@ -608,7 +630,7 @@ export default function useColumns() {
         },
         {
           item: { title: "费用金额", key: "money", width: "auto" },
-          attr: { is: "el-input-number", precision: CONFIG.precision },
+          attr: { is: "el-input-number" },
         },
       ],
     },
@@ -626,7 +648,7 @@ export default function useColumns() {
           item: {
             title: "付款起点",
             key: "origin",
-            require: true,
+            required: true,
           },
           attr: {
             is: "el-select",
@@ -634,24 +656,22 @@ export default function useColumns() {
           },
         },
         {
-          item: { title: "账期天数", key: "paymetDays", require: true },
+          item: { title: "账期天数", key: "paymetDays", required: true },
           attr: {
             is: "el-input-number",
             precision: 2,
           },
         },
         {
-          item: { title: "付款比例%", key: "ratio", require: true },
+          item: { title: "付款比例%", key: "ratio", required: true },
           attr: {
             is: "el-input-number",
-            precision: CONFIG.precision,
           },
         },
         {
           item: { title: "付款金额", key: "money" },
           attr: {
             is: "el-input-number",
-            precision: CONFIG.precision,
           },
         },
         {
@@ -678,7 +698,7 @@ export default function useColumns() {
           item: {
             title: "结算方式",
             key: "paymentMeans",
-            require: true,
+            required: true,
           },
           attr: {
             is: "el-popover-select-v2",
@@ -729,7 +749,7 @@ export default function useColumns() {
     item,
     TableColumns: TableColumns.map(({ item, attr }) => ({
       attr,
-      item: { ...item, hidden: true, span: item.span || 6 },
+      item: { ...item, hidden: true },
     })),
   }));
   return { TableColumns, TabColumns };

+ 145 - 113
src/views/purchase/contract/add/index.vue

@@ -63,34 +63,51 @@ export default {
       set() {},
     },
   },
-  watch: {},
-  methods: {
-    //
-    async fetchCode() {
-      try {
-        // try
-        this.loading = true;
-        const data = await CODE();
-        if (data) {
-          this.params.code = data;
+  watch: {
+    "params.isRebate": {
+      handler: function (newValue) {
+        if (newValue === "Y") {
+          this.rules.rebatePolicy = [
+            { required: true, message: "返利政策不能为空", trigger: "change" },
+          ];
         } else {
+          this.rules.rebatePolicy = null;
         }
-      } catch (err) {
-        // catch
-        console.error(err);
-      } finally {
-        // finally
-        this.loading = false;
-      }
+      },
+      immediate: true,
+    },
+    "params.isTarget": {
+      handler: function (newValue) {
+        if (newValue === "Y") {
+          this.rules.contractTarget = [
+            { required: true, message: "合同指标不能为空", trigger: "change" },
+          ];
+        } else {
+          this.rules.contractTarget = null;
+        }
+      },
+      immediate: true,
+    },
+  },
+  methods: {
+    //
+    getTabTableColumnParams(prop) {
+      const { TableColumns } = this.TabColumns.find(
+        ({ item: { key } }) => key === prop
+      );
+      return this.$init.params(TableColumns);
     },
     //
     async changePaymentAgreement(prop) {
-      console.log(prop);
       const {
         selectData: { code },
       } = prop;
-      const res = await LINKAGREEMENT(code);
-      console.log("res", res);
+      const { data } = await LINKAGREEMENT(code);
+      this.tabName = "contractAgreementList";
+      this.params.contractAgreementList.push({
+        ...this.getTabTableColumnParams("contractAgreementList"),
+        ...data,
+      });
     },
     //
     async changeMaterialName(prop) {
@@ -111,28 +128,40 @@ export default {
     },
     //
     async open() {
-      this.visible = true;
-      this.fetchCode();
-      const {
-        user: {
-          deptId: puDept,
-          deptName: puDeptName,
-          name: buyer,
-          nickName: buyerName,
-          orgId: puOrg,
-          orgName: puOrgName,
-        },
-      } = this.$store.state;
-      this.params.puOrg = puOrg;
-      this.params.puOrgName = puOrgName;
-      this.params.buyer = buyer;
-      this.params.buyerName = buyerName;
-      this.params.puDept = puDept;
-      this.params.puDeptName = puDeptName;
-      const { id, code, name } = await currency("人民币");
-      this.params.currency = id;
-      this.params.currencyCode = code;
-      this.params.currencyName = name;
+      try {
+        //
+        this.visible = true;
+        this.loading = true;
+        //
+        const {
+          user: {
+            deptId: puDept,
+            deptName: puDeptName,
+            name: buyer,
+            nickName: buyerName,
+            orgId: puOrg,
+            orgName: puOrgName,
+          },
+        } = this.$store.state;
+        this.params.puOrg = puOrg;
+        this.params.puOrgName = puOrgName;
+        this.params.buyer = buyer;
+        this.params.buyerName = buyerName;
+        this.params.puDept = puDept;
+        this.params.puDeptName = puDeptName;
+        //
+        const { id, code, name } = await currency("人民币");
+        this.params.currency = id;
+        this.params.currencyCode = code;
+        this.params.currencyName = name;
+        //
+        this.params.code = await CODE();
+        //
+        this.loading = false;
+      } catch (error) {
+        this.loading = false;
+        this.$notify.error(error);
+      }
     },
     //
     async hide() {
@@ -151,10 +180,7 @@ export default {
     },
     //
     async useRowAdd(prop) {
-      const { TableColumns } = this.TabColumns.find(
-        ({ item: { key } }) => key === prop
-      );
-      this.params[prop].push(this.$init.params(TableColumns));
+      this.params[prop].push(this.getTabTableColumnParams(prop));
     },
     //
     async useRowRemove(prop, scope) {
@@ -213,7 +239,7 @@ export default {
           align-items: center;
         "
       >
-        <h3>{{ title }}</h3>
+        <h3 class="m-0">{{ title }}</h3>
         <div style="text-align: right">
           <el-button
             type="primary"
@@ -227,77 +253,83 @@ export default {
           >
         </div>
       </div>
-
-      <el-super-form
-        v-model="params"
-        :dict="dict"
-        :rules="rules"
-        :size="$attrs.size"
-        :columns="TableColumns"
-        ref="superForm"
-        label-width="auto"
-        label-position="right"
-        style="padding: 20px"
+      <div
+        v-loading="loading"
+        style="height: 100%; display: flex; flex-direction: column"
       >
-        <template slot="paymentAgreement" slot-scope="scope">
-          <component
-            v-bind="scope.attr"
-            v-model="scope.row[scope.item.key]"
-            :size="$attrs.size"
-            :source.sync="scope.row"
-            @change="changePaymentAgreement({ ...scope, selectData: $event })"
-          >
-          </component>
-        </template>
-      </el-super-form>
-
-      <el-tabs v-model="tabName" style="margin: 0 20px">
-        <el-tab-pane
-          v-for="{ item, TableColumns: columns } in TabColumns"
-          :key="item.key"
-          :label="item.title"
-          :name="item.key"
-          lazy
+        <el-super-form
+          v-model="params"
+          :dict="dict"
+          :rules="rules"
+          :size="$attrs.size"
+          :columns="TableColumns"
+          ref="superForm"
+          label-width="auto"
+          label-position="right"
+          style="padding: 18px; flex: 1; overflow-y: auto"
         >
-          <el-super-table
-            v-model="params[item.key]"
-            :dict="dict"
-            :ref="tabName"
-            :columns="columns"
-            :size="$attrs.size"
-            index
+          <template slot="paymentAgreement" slot-scope="scope">
+            <component
+              v-bind="scope.attr"
+              v-model="scope.row[scope.item.key]"
+              :size="$attrs.size"
+              :source.sync="scope.row"
+              @change="changePaymentAgreement({ ...scope, selectData: $event })"
+            >
+            </component>
+          </template>
+        </el-super-form>
+
+        <el-tabs v-model="tabName" style="margin: 0 18px 18px">
+          <el-tab-pane
+            v-for="{ item, TableColumns: columns } in TabColumns"
+            :key="item.key"
+            :label="item.title"
+            :name="item.key"
+            lazy
           >
-            <template slot="materialName" slot-scope="scope">
-              <component
-                v-bind="scope.attr"
-                v-model="scope.row[scope.item.key]"
+            <div style="height: 25vh; display: flex">
+              <el-super-table
+                v-model="params[item.key]"
+                :dict="dict"
+                :ref="tabName"
+                :columns="columns"
                 :size="$attrs.size"
-                :source.sync="scope.row"
-                @change="changeMaterialName(scope)"
+                index
               >
-              </component>
-            </template>
-            <el-table-column fixed="right" label="操作" width="75">
-              <template slot="header" slot-scope="scope">
-                <el-button
-                  type="text"
-                  :size="$attrs.size"
-                  @click="useRowAdd(tabName)"
-                  >增行
-                </el-button>
-              </template>
-              <template slot-scope="scope">
-                <el-button
-                  type="text"
-                  :size="$attrs.size"
-                  @click.native.prevent="useRowRemove(tabName, scope)"
-                  >删行
-                </el-button>
-              </template>
-            </el-table-column>
-          </el-super-table>
-        </el-tab-pane>
-      </el-tabs>
+                <template slot="materialName" slot-scope="scope">
+                  <component
+                    v-bind="scope.attr"
+                    v-model="scope.row[scope.item.key]"
+                    :size="$attrs.size"
+                    :source.sync="scope.row"
+                    @change="changeMaterialName(scope)"
+                  >
+                  </component>
+                </template>
+                <el-table-column fixed="right" label="操作" width="75">
+                  <template slot="header" slot-scope="scope">
+                    <el-button
+                      type="text"
+                      :size="$attrs.size"
+                      @click="useRowAdd(tabName)"
+                      >增行
+                    </el-button>
+                  </template>
+                  <template slot-scope="scope">
+                    <el-button
+                      type="text"
+                      :size="$attrs.size"
+                      @click.native.prevent="useRowRemove(tabName, scope)"
+                      >删行
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-super-table>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
     </el-drawer>
   </el-button>
 </template>

+ 260 - 143
src/views/purchase/contract/edit/columns.js

@@ -1,12 +1,13 @@
 import CONFIG from "@/config";
+import { iunitprice } from "@/utils/expression";
 
 export default function useColumns() {
   const TableColumns = [
     {
-      item: { width:100,key: "puOrgName", title: "采购组织", require: true ,},
+      item: { key: "puOrgName", title: "采购组织", required: true, width: 150 },
       attr: {
         is: "el-popover-select-v2",
-        valuewidth:100,key: "name",
+        valueKey: "name",
         referName: "ORG_PARAM",
         dataMapping: {
           puOrg: "code",
@@ -14,9 +15,12 @@ export default function useColumns() {
         },
       },
     },
-    { item: { width:100,key: "code", title: "合同编码" }, attr: { is: "el-input" } },
     {
-      item: { width:100,key: "status", title: "状态" },
+      item: { key: "code", title: "合同编码", width: 150 },
+      attr: { is: "el-input" },
+    },
+    {
+      item: { key: "status", title: "状态" },
       attr: {
         is: "el-select",
         dictName: "documents_status",
@@ -25,17 +29,16 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "lastPuMoney", title: "上年度采购额" },
+      item: { key: "lastPuMoney", title: "上年度采购额", width: 100 },
       attr: {
         is: "el-input-number",
-        precision: CONFIG.precision,
       },
     },
     {
-      item: { width:100,key: "buyerName", title: "采购员", require: true ,},
+      item: { key: "buyerName", title: "采购员", required: true, width: 100 },
       attr: {
         is: "el-popover-select-v2",
-        valuewidth:100,key: "name",
+        valueKey: "name",
         referName: "CONTACTS_PARAM",
         dataMapping: {
           buyer: "code",
@@ -46,10 +49,15 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "supplierName", title: "供应商", require: true, },
+      item: {
+        key: "supplierName",
+        title: "供应商",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-popover-select-v2",
-        valuewidth:100,key: "name",
+        valueKey: "name",
         referName: "SUPPLIER_PARAM",
         dataMapping: {
           supplier: "code",
@@ -58,21 +66,30 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "contractType", title: "合同类型", require: true ,},
+      item: {
+        key: "contractType",
+        title: "合同类型",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-select", dictName: "puarchase_contract_contract_type" },
     },
     {
-      item: { width:100,key: "puMoneyYear", title: "本年度采购额" },
+      item: { key: "puMoneyYear", title: "本年度采购额", width: 100 },
       attr: {
         is: "el-input-number",
-        precision: CONFIG.precision,
       },
     },
     {
-      item: { width:100,key: "puDeptName", title: "采购部门", require: true, },
+      item: {
+        key: "puDeptName",
+        title: "采购部门",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-popover-select-v2",
-        valuewidth:100,key: "name",
+        valueKey: "name",
         referName: "DEPT_PARAM",
         dataMapping: {
           puDept: "code",
@@ -81,33 +98,63 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "supplierTier", title: "供应商层级", require: true ,},
+      item: {
+        key: "supplierTier",
+        title: "供应商层级",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-select", dictName: "puarchase_contract_supplier_tier" },
     },
     {
-      item: { width:100,key: "contractName", title: "合同名称", require: true, },
+      item: {
+        key: "contractName",
+        title: "合同名称",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-input" },
     },
     {
-      item: { width:100,key: "grossRateAverage", title: "平均毛利率 (%)", require: true ,},
+      item: {
+        key: "grossRateAverage",
+        title: "平均毛利率 (%)",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-input-number",
         precision: 2,
       },
     },
     {
-      item: { width:100,key: "approveFlow", title: "审批流程", require: true, },
+      item: {
+        key: "approveFlow",
+        title: "审批流程",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-select", dictName: "puarchase_contract_approve_flow" },
     },
     {
-      item: { width:100,key: "consumableClass", title: "耗材类别", require: true, },
+      item: {
+        key: "consumableClass",
+        title: "耗材类别",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-select",
         dictName: "puarchase_contract_consumable_class",
       },
     },
     {
-      item: { width:100,key: "effectiveDate", title: "合同生效日期", require: true ,},
+      item: {
+        key: "effectiveDate",
+        title: "合同生效日期",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-date-picker",
         valueFormat: "yyyy-MM-dd",
@@ -115,9 +162,9 @@ export default function useColumns() {
     },
     {
       item: {
-        width:100,key: "brandGrossRate",
+        key: "brandGrossRate",
         title: "同类品牌及毛利率 (%)",
-        require: true,
+        required: true,
       },
       attr: {
         is: "el-input-number",
@@ -125,25 +172,58 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "contractFormat", title: "合同格式", require: true, },
+      item: {
+        key: "contractFormat",
+        title: "合同格式",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-select",
         dictName: "puarchase_contract_contract_format",
       },
     },
     {
-      item: { width:100,key: "productName", title: "产品类别&名称", require: true, },
+      item: {
+        key: "productName",
+        title: "产品类别&名称",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-input" },
     },
     {
-      item: { width:100,key: "endDate", title: "合同终止日期", require: true ,},
-      attr: { is: "el-date-picker", valueFormat: "yyyy-MM-dd" },
+      item: {
+        key: "endDate",
+        title: "合同终止日期",
+        required: true,
+        width: 100,
+      },
+      attr: {
+        is: "el-date-picker",
+        valueFormat: "yyyy-MM-dd",
+        disabled: (prop) => !prop.effectiveDate,
+        pickerOptions: (prop) => {
+          return {
+            disabledDate(time) {
+              return (
+                time.getTime() < Date.now(prop.effectiveDate) - 3600 * 1000 * 24
+              );
+            },
+          };
+        },
+      },
     },
     {
-      item: { width:100,key: "invoiceTax", title: "发票税率 (%)", require: true,},
+      item: {
+        key: "invoiceTax",
+        title: "发票税率 (%)",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-popover-select-v2",
-        valuewidth:100,key: "ntaxrate",
+        valueKey: "ntaxrate",
         referName: "TAX_RATE_PARAM",
         dataMapping: {
           invoiceTax: "ntaxrate",
@@ -151,29 +231,39 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "emergencyDegree", title: "紧急程度", require: true ,},
+      item: {
+        key: "emergencyDegree",
+        title: "紧急程度",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-select",
         dictName: "puarchase_contract_emergency_degree",
       },
     },
     {
-      item: { width:100,key: "project", title: "项目医院", require: true ,},
+      item: { key: "project", title: "项目医院", required: true, width: 100 },
       attr: { is: "el-input" },
     },
     {
-      item: { width:100,key: "deliveryType", title: "交货方式", require: true, },
+      item: {
+        key: "deliveryType",
+        title: "交货方式",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-select", dictName: "puarchase_contract_delivery_type" },
     },
     {
-      item: { width:100,key: "source", title: "合同来源" },
-      attr: { is: "el-input", value: "自制", disabled: true, },
+      item: { key: "source", title: "合同来源", width: 100 },
+      attr: { is: "el-input", value: "自制", disabled: true },
     },
     {
-      item: { width:100,key: "contractPartycName", title: "合同丙方" },
+      item: { key: "contractPartycName", title: "合同丙方", width: 100 },
       attr: {
         is: "el-popover-select-v2",
-        valuewidth:100,key: "name",
+        valueKey: "name",
         referName: "SUPPLIER_PARAM",
         dataMapping: {
           contractPartyc: "code",
@@ -182,30 +272,50 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "guaranteePeriodEnd", title: "质保期限", require: true ,},
+      item: {
+        key: "guaranteePeriodEnd",
+        title: "质保期限",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-input-number", precision: 2 },
     },
     {
-      item: { width:100,key: "freightMethods", title: "运费承担方式" },
+      item: { key: "freightMethods", title: "运费承担方式", width: 100 },
       attr: {
         is: "el-select",
         dictName: "puarchase_contract_freight_methods",
       },
     },
     {
-      item: { width:100,key: "signDate", title: "合同签订日期" },
+      item: { key: "signDate", title: "合同签订日期", width: 100 },
       attr: { is: "el-date-picker", valueFormat: "yyyy-MM-dd" },
     },
     {
-      item: { width:100,key: "isTarget", title: "是否有指标", require: true ,},
+      item: {
+        key: "isTarget",
+        title: "是否有指标",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-select", dictName: "sys_yes_no" },
     },
     {
-      item: { width:100,key: "contractTarget", title: "合同指标", require: true, },
+      item: {
+        key: "contractTarget",
+        title: "合同指标",
+        width: 100,
+        required: (prop) => prop.isTarget === "Y",
+      },
       attr: { is: "el-input", placeholder: '当【是否有指标】="有"时,必填' },
     },
     {
-      item: { width:100,key: "exemptionPostageCondtion", title: "包邮条件", span: 12 },
+      item: {
+        key: "exemptionPostageCondtion",
+        title: "包邮条件",
+        span: 12,
+        width: 100,
+      },
       attr: {
         is: "el-input",
         placeholder:
@@ -213,79 +323,103 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "isRebate", title: "是否有返利", require: true, },
+      item: {
+        key: "isRebate",
+        title: "是否有返利",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-select", dictName: "sys_yes_no" },
     },
     {
-      item: { width:100,key: "rebatePolicy", title: "返利政策", span: 18 },
+      item: {
+        key: "rebatePolicy",
+        title: "返利政策",
+        span: 18,
+        width: 100,
+        required: (prop) => prop.isRebate === "Y",
+      },
       attr: {
         is: "el-input",
         placeholder: '当【是否有返利】="有"时,必填',
       },
     },
     {
-      item: { width:100,key: "externalContract", title: "外部合同号" },
+      item: { key: "externalContract", title: "外部合同号", width: 100 },
       attr: { is: "el-input" },
     },
     {
-      item: { width:100,key: "rollbackPolicy", title: "退换货政策", require: true ,},
+      item: {
+        key: "rollbackPolicy",
+        title: "退换货政策",
+        required: true,
+        width: 100,
+      },
       attr: { is: "el-input" },
     },
     {
-      item: { width:100,key: "enquiryCode", title: "询价单号" },
+      item: { key: "enquiryCode", title: "询价单号", width: 100 },
       attr: { is: "el-input" },
     },
     {
       item: {
-        width:100,key: "contractContent",
+        key: "contractContent",
         title: "合同主要内容",
-        require: true,
+        required: true,
         span: 24,
+        width: 100,
       },
       attr: { is: "el-input", type: "textarea" },
     },
     {
-      item: { width:100,key: "refusalReasons", title: "拒绝理由", span: 24 },
+      item: { key: "refusalReasons", title: "拒绝理由", span: 24, width: 100 },
       attr: { is: "el-input" },
     },
-    // {
-    //   item: { width:100,key: "pigeonhole", title: "是否归档" },
-    //   attr: { is: "el-select", dictName: "sys_yes_no", disabled: true },
-    // },
-    // {
-    //   item: { width:100,key: "pigeonholeFile", title: "归档附件", span: 24 },
-    //   attr: { is: "el-file-upload", fileType: ["pdf"], disabled: true },
-    // },
     {
-      item: { width:100,key: "externalFile", title: "对外附件", span: 24 },
+      item: { key: "externalFile", title: "对外附件", span: 24, width: 100 },
       attr: { is: "el-file-upload", fileType: ["pdf"] },
     },
     {
-      item: { width:100,key: "puFile", title: "采购商盖章合同附件", span: 24 },
+      item: {
+        key: "puFile",
+        title: "采购商盖章合同附件",
+        span: 24,
+        width: 100,
+      },
       attr: { is: "el-file-upload", fileType: ["pdf"] },
     },
     {
-      item: { width:100,key: "supplierFile", title: "供应商盖章合同附件", span: 24 },
+      item: {
+        key: "supplierFile",
+        title: "供应商盖章合同附件",
+        span: 24,
+        width: 100,
+      },
       attr: { is: "el-file-upload", fileType: ["pdf"] },
     },
     {
-      item: { width:100,key: "projectCode", title: "项目编号" },
+      item: { key: "projectCode", title: "项目编号", width: 100 },
       attr: { is: "el-input" },
     },
     {
-      item: { width:100,key: "projectName", title: "项目名称" },
+      item: { key: "projectName", title: "项目名称", width: 100 },
       attr: { is: "el-input" },
     },
-    { item: { width:100,key: "area", title: "区域" }, attr: { is: "el-input" } },
+    { item: { key: "area", title: "区域" }, attr: { is: "el-input" } },
     {
-      item: { width:100,key: "consigneePhone", title: "收货人联系方式" },
+      item: { key: "consigneePhone", title: "收货人联系方式", width: 100 },
       attr: { is: "el-input" },
     },
     {
-      item: { width:100,key: "paymentAgreement", title: "付款协议", require: true, },
+      item: {
+        key: "paymentAgreement",
+        title: "付款协议",
+        required: true,
+        width: 100,
+      },
       attr: {
         is: "el-popover-select-v2",
-        valuewidth:100,key: "name",
+        valueKey: "name",
         referName: "PAYAGREEMENT_PARAM",
         dataMapping: {
           paymentAgreement: "code",
@@ -294,17 +428,16 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "taxPrice", title: "价税合计" },
+      item: { key: "taxPrice", title: "价税合计", width: 100 },
       attr: {
         is: "el-input-number",
-        precision: CONFIG.precision,
       },
     },
     {
-      item: { width:100,key: "currencyName", title: "币种", require: true, },
+      item: { key: "currencyName", title: "币种", required: true, width: 100 },
       attr: {
         is: "el-popover-select-v2",
-        valuewidth:100,key: "name",
+        valueKey: "name",
         referName: "CURRENCY_PARAM",
         dataMapping: {
           currency: "code",
@@ -313,10 +446,9 @@ export default function useColumns() {
       },
     },
     {
-      item: { width:100,key: "guaranteePeriod", title: "质保期" },
+      item: { key: "guaranteePeriod", title: "质保期", width: 100 },
       attr: {
         is: "el-input-number",
-        precision: CONFIG.precision,
       },
     },
   ].map(({ item, attr }) => ({
@@ -326,18 +458,18 @@ export default function useColumns() {
 
   const TabColumns = [
     {
-      item: { title: "物料基本信息", width:100,key: "contractItemList" },
+      item: { title: "物料基本信息", key: "contractItemList" },
       attr: { value: [] },
       TableColumns: [
         {
           item: {
             title: "物料名称",
-            width:100,key: "materialName",
-            require: true ,
+            key: "materialName",
+            required: true,
           },
           attr: {
             is: "el-popover-select-v2",
-            valuewidth:100,key: "name",
+            valueKey: "name",
             referName: "MATERIAL_PARAM",
             dataMapping: {
               material: "code",
@@ -352,32 +484,31 @@ export default function useColumns() {
         {
           item: {
             title: "物料编码",
-            width:100,key: "material",
-            require: true ,
+            key: "material",
           },
           attr: {},
         },
         {
           item: {
             title: "规格",
-            width:100,key: "specification",
+            key: "specification",
           },
           attr: {},
         },
         {
           item: {
             title: "生产厂家",
-            width:100,key: "manufacturer",
+            key: "manufacturer",
           },
           attr: {
             is: "el-input",
           },
         },
         {
-          item: { title: "采购单位", width:100,key: "puUnit" },
+          item: { title: "采购单位", key: "puUnit" },
           attr: {
             is: "el-popover-select-v2",
-            valuewidth:100,key: "name",
+            valueKey: "name",
             referName: "UNIT_PARAM",
             dataMapping: {
               puUnit: "name",
@@ -385,10 +516,10 @@ export default function useColumns() {
           },
         },
         {
-          item: { title: "税率%", width:100,key: "tax" ,require: true, },
+          item: { title: "税率%", key: "tax", required: true },
           attr: {
             is: "el-popover-select-v2",
-            valuewidth:100,key: "ntaxrate",
+            valueKey: "ntaxrate",
             referName: "TAX_RATE_PARAM",
             dataMapping: {
               tax: "ntaxrate",
@@ -396,65 +527,56 @@ export default function useColumns() {
           },
         },
         {
-          item: { title: "采购数量", width:100,key: "qty" },
+          item: { title: "采购数量", key: "qty" },
           attr: {
             is: "el-input-number",
           },
         },
         {
-          item: { title: "含税单价", width:100,key: "taxPrice" ,require: true, },
+          item: { title: "含税单价", key: "taxPrice", required: true },
           attr: {
             is: "el-input-number",
-            precision: CONFIG.precision,
           },
         },
         {
-          item: { title: "含税金额合计", width:100,key: "taxMoney" },
+          item: { title: "含税金额合计", key: "taxMoney" },
           attr: {
             formatter: (prop) => {
               const { qty = 0, taxPrice = 0 } = prop;
-              prop.taxMoney = (qty * taxPrice * 1);
+              prop.taxMoney = qty * taxPrice * 1;
               return prop.taxMoney;
             },
           },
         },
         {
-          item: { title: "无税单价", width:100,key: "taxFreePrice" ,require: true, },
+          item: { title: "无税单价", key: "taxFreePrice", required: true },
           attr: {
             formatter: (prop) => {
               const { tax = 0, taxPrice = 0 } = prop;
-              prop.taxFreePrice = ((taxPrice / (tax / 100 + 1)) * 1).toFixed(
-                CONFIG.precision
-              );
-              return prop.taxFreePrice;
+              return (prop.taxFreePrice = iunitprice(tax, taxPrice));
             },
           },
         },
         {
-          item: { title: "无税金额合计", width:100,key: "taxFreeMoney" },
+          item: { title: "无税金额合计", key: "taxFreeMoney" },
           attr: {
             formatter: (prop) => {
               const { qty = 0, tax = 0, taxPrice = 0 } = prop;
-              prop.taxFreeMoney = (
-                qty *
-                (taxPrice / (tax / 100 + 1)) *
-                1
-              );
-              return prop.taxFreeMoney;
+              return (prop.taxFreeMoney = qty * iunitprice(tax, taxPrice));
             },
           },
         },
         {
-          item: { title: "注册证号及备案凭证号", width:100,key: "registration" },
+          item: { title: "注册证号及备案凭证号", key: "registration" },
           attr: {
             is: "el-input",
           },
         },
         {
-          item: { title: "收货客户", width:100,key: "customerName" },
+          item: { title: "收货客户", key: "customerName" },
           attr: {
             is: "el-popover-select-v2",
-            valuewidth:100,key: "name",
+            valueKey: "name",
             referName: "CUSTOMER_PARAM",
             dataMapping: {
               customer: "code",
@@ -465,68 +587,68 @@ export default function useColumns() {
       ],
     },
     {
-      item: { title: "合同条款", width:100,key: "contractClauseList" },
+      item: { title: "合同条款", key: "contractClauseList" },
       attr: {
         value: [],
       },
       TableColumns: [
         {
-          item: { title: "条款编码", width:100,key: "code", width: "auto" },
+          item: { title: "条款编码", key: "code", width: "auto" },
           attr: { is: "el-input" },
         },
         {
-          item: { title: "条款名称", width:100,key: "name", width: "auto" },
+          item: { title: "条款名称", key: "name", width: "auto" },
           attr: { is: "el-input" },
         },
         {
-          item: { title: "条款内容", width:100,key: "content", width: "auto" },
+          item: { title: "条款内容", key: "content", width: "auto" },
           attr: { is: "el-input" },
         },
         {
-          item: { title: "变量序号", width:100,key: "variableRowno", width: "auto" },
+          item: { title: "变量序号", key: "variableRowno", width: "auto" },
           attr: { is: "el-input" },
         },
         {
-          item: { title: "变量内容", width:100,key: "variableContent", width: "auto" },
+          item: { title: "变量内容", key: "variableContent", width: "auto" },
           attr: { is: "el-input" },
         },
       ],
     },
     {
-      item: { title: "合同费用", width:100,key: "contractExpenseList" },
+      item: { title: "合同费用", key: "contractExpenseList" },
       attr: {
         value: [],
       },
       TableColumns: [
         {
-          item: { title: "费用编码", width:100,key: "code", width: "auto" },
+          item: { title: "费用编码", key: "code", width: "auto" },
           attr: { is: "el-input" },
         },
         {
-          item: { title: "费用名称", width:100,key: "name", width: "auto" },
+          item: { title: "费用名称", key: "name", width: "auto" },
           attr: { is: "el-input" },
         },
         {
-          item: { title: "费用金额", width:100,key: "money", width: "auto" },
-          attr: { is: "el-input-number", precision: CONFIG.precision },
+          item: { title: "费用金额", key: "money", width: "auto" },
+          attr: { is: "el-input-number" },
         },
       ],
     },
     {
-      item: { title: "付款协议信息", width:100,key: "contractAgreementList" },
+      item: { title: "付款协议信息", key: "contractAgreementList" },
       attr: {
         value: [],
       },
       TableColumns: [
         {
-          item: { title: "付款阶段", width:100,key: "satge" },
+          item: { title: "付款阶段", key: "satge" },
           attr: { is: "el-input-number" },
         },
         {
           item: {
             title: "付款起点",
-            width:100,key: "origin",
-            require: true 
+            key: "origin",
+            required: true,
           },
           attr: {
             is: "el-select",
@@ -534,30 +656,28 @@ export default function useColumns() {
           },
         },
         {
-          item: { title: "账期天数", width:100,key: "paymetDays" ,require: true, },
+          item: { title: "账期天数", key: "paymetDays", required: true },
           attr: {
             is: "el-input-number",
             precision: 2,
           },
         },
         {
-          item: { title: "付款比例%", width:100,key: "ratio",require: true,  },
+          item: { title: "付款比例%", key: "ratio", required: true },
           attr: {
             is: "el-input-number",
-            precision: CONFIG.precision,
           },
         },
         {
-          item: { title: "付款金额", width:100,key: "money" },
+          item: { title: "付款金额", key: "money" },
           attr: {
             is: "el-input-number",
-            precision: CONFIG.precision,
           },
         },
         {
           item: {
             title: "是否预付款",
-            width:100,key: "isAdvance",
+            key: "isAdvance",
           },
           attr: {
             is: "el-select",
@@ -567,7 +687,7 @@ export default function useColumns() {
         {
           item: {
             title: "是否质保金",
-            width:100,key: "isQuality",
+            key: "isQuality",
           },
           attr: {
             is: "el-select",
@@ -577,12 +697,12 @@ export default function useColumns() {
         {
           item: {
             title: "结算方式",
-            width:100,key: "paymentMeans",
-            require:true,
+            key: "paymentMeans",
+            required: true,
           },
           attr: {
             is: "el-popover-select-v2",
-            valuewidth:100,key: "name",
+            valueKey: "name",
             referName: "BALATYPE_PARAM",
             dataMapping: {
               paymentMeans: "name",
@@ -592,7 +712,7 @@ export default function useColumns() {
         {
           item: {
             title: "需进度确认",
-            width:100,key: "schedule",
+            key: "schedule",
           },
           attr: {
             is: "el-select",
@@ -602,18 +722,18 @@ export default function useColumns() {
       ],
     },
     {
-      item: { title: "合同执行组织范围", width:100,key: "contractApplyOrgList" },
+      item: { title: "合同执行组织范围", key: "contractApplyOrgList" },
       attr: { value: [] },
       TableColumns: [
         {
           item: {
             title: "组织名称",
-            width:100,key: "orgName",
+            key: "orgName",
             width: "auto",
           },
           attr: {
             is: "el-popover-select-v2",
-            valuewidth:100,key: "name",
+            valueKey: "name",
             referName: "ORG_PARAM",
             dataMapping: {
               org: "code",
@@ -621,19 +741,16 @@ export default function useColumns() {
             },
           },
         },
-        { item: { title: "组织编码", width:100,key: "org", width: "auto" }, attr: {} },
+        { item: { title: "组织编码", key: "org", width: "auto" }, attr: {} },
       ],
     },
-  ].map(({item,attr,TableColumns}) =>({
+  ].map(({ item, attr, TableColumns }) => ({
     attr,
     item,
-    TableColumns:TableColumns.map(({item, attr}) =>({
+    TableColumns: TableColumns.map(({ item, attr }) => ({
       attr,
-      item: { ...item, hidden: true, span: item.span || 6 },
-  
-    }))
-
-  }))
-  ;
+      item: { ...item, hidden: true },
+    })),
+  }));
   return { TableColumns, TabColumns };
 }

+ 139 - 79
src/views/purchase/contract/edit/index.vue

@@ -1,6 +1,5 @@
 <script>
 import useColumns from "./columns";
-import { initParams, initRules } from "@/utils/init.js";
 import { REFER } from "@/components/popover-select/api";
 import {
   EDIT,
@@ -8,6 +7,7 @@ import {
   TABLE,
   ALTERATION,
 } from "@/api/business/purchase/contract";
+import { tax, currency } from "@/components/popover-select-v2/fetch";
 
 export default {
   name: "EditDrawer",
@@ -53,31 +53,78 @@ export default {
   computed: {
     disabled: {
       get() {
-        const { selectData } = this;
+        const {
+          selectData,
+          selectData: [{ status } = {}],
+        } = this;
         if (selectData.length !== 1) {
           return true;
         }
+        if (selectData.length === 1 && status === "1") {
+          return true;
+        }
+        if (selectData.length === 1 && status === "2") {
+          return true;
+        }
       },
       set() {},
     },
   },
-  watch: {},
+  watch: {
+    "params.isRebate": {
+      handler: function (newValue) {
+        if (newValue === "Y") {
+          this.rules.rebatePolicy = [
+            { required: true, message: "返利政策不能为空", trigger: "change" },
+          ];
+        } else {
+          this.rules.rebatePolicy = null;
+        }
+      },
+      immediate: true,
+    },
+    "params.isTarget": {
+      handler: function (newValue) {
+        if (newValue === "Y") {
+          this.rules.contractTarget = [
+            { required: true, message: "合同指标不能为空", trigger: "change" },
+          ];
+        } else {
+          this.rules.contractTarget = null;
+        }
+      },
+      immediate: true,
+    },
+  },
   methods: {
     //
+    getTabTableColumnParams(prop) {
+      const { TableColumns } = this.TabColumns.find(
+        ({ item: { key } }) => key === prop
+      );
+      return this.$init.params(TableColumns);
+    },
+    //
+    async changePaymentAgreement(prop) {
+      const {
+        selectData: { code },
+      } = prop;
+      const { data } = await LINKAGREEMENT(code);
+      this.tabName = "contractAgreementList";
+      this.params.contractAgreementList.push({
+        ...this.getTabTableColumnParams("contractAgreementList"),
+        ...data,
+      });
+    },
+    //
     async changeMaterialName(prop) {
       const { row } = prop;
       const { rateCode } = row;
       try {
         // try
         this.loading = true;
-        const { code, rows } = await REFER({
-          search: rateCode,
-          type: "TAX_RATE_PARAM",
-        });
-        if (code === 200) {
-          const [{ ntaxrate }] = rows;
-          row.tax = ntaxrate === "0E-8" ? "0.00000000" : ntaxrate;
-        }
+        const { ntaxrate } = await tax(rateCode);
+        row.tax = Number(ntaxrate === "0E-8" ? 0 : ntaxrate);
       } catch (err) {
         // catch
         console.error(err);
@@ -94,9 +141,7 @@ export default {
         const { code, data } = await ITEM(prop);
         if (code === 200) {
           this.params = data;
-          return true;
         } else {
-          return false;
         }
       } catch (err) {
         // catch
@@ -110,7 +155,8 @@ export default {
     async open() {
       const { selectData } = this.$props;
       const [{ id }] = selectData;
-      this.visible = await this.fetchItem(id);
+      this.visible = true;
+      await this.fetchItem(id);
     },
     //
     async hide() {
@@ -129,10 +175,7 @@ export default {
     },
     //
     async useRowAdd(prop) {
-      const { TableColumns } = this.TabColumns.find(
-        ({ item: { key } }) => key === prop
-      );
-      this.params[prop].push(this.$init.params(TableColumns));
+      this.params[prop].push(this.getTabTableColumnParams(prop));
     },
     //
     async useRowRemove(prop, scope) {
@@ -246,7 +289,7 @@ export default {
           align-items: center;
         "
       >
-        <h3>{{ title }}</h3>
+        <h3 class="m-0">{{ title }}</h3>
         <div style="text-align: right">
           <el-button
             type="primary"
@@ -260,70 +303,87 @@ export default {
           >
         </div>
       </div>
-      <el-super-form
-        v-model="params"
-        :dict="dict"
-        :rules="rules"
-        :size="$attrs.size"
-        :columns="TableColumns"
-        ref="superForm"
-        label-width="auto"
-        label-position="right"
-        style="padding: 20px"
-      ></el-super-form>
-      <el-tabs v-model="tabName" style="margin: 0 20px">
-        <el-tab-pane
-          v-for="{ item, TableColumns: columns } in TabColumns"
-          :key="item.key"
-          :label="item.title"
-          :name="item.key"
-          lazy
+      <div
+        v-loading="loading"
+        style="height: 100%; display: flex; flex-direction: column"
+      >
+        <el-super-form
+          v-model="params"
+          :dict="dict"
+          :rules="rules"
+          :size="$attrs.size"
+          :columns="TableColumns"
+          ref="superForm"
+          label-width="auto"
+          label-position="right"
+          style="padding: 18px; flex: 1; overflow-y: auto"
         >
-          <el-super-table
-            v-model="params[item.key]"
-            :dict="dict"
-            :ref="tabName"
-            :columns="columns"
-            :size="$attrs.size"
-            index
+          <template slot="paymentAgreement" slot-scope="scope">
+            <component
+              v-bind="scope.attr"
+              v-model="scope.row[scope.item.key]"
+              :size="$attrs.size"
+              :source.sync="scope.row"
+              @change="changePaymentAgreement({ ...scope, selectData: $event })"
+            >
+            </component> </template
+        ></el-super-form>
+        <el-tabs v-model="tabName" style="margin: 0 18px 18px">
+          <el-tab-pane
+            v-for="{ item, TableColumns: columns } in TabColumns"
+            :key="item.key"
+            :label="item.title"
+            :name="item.key"
+            lazy
           >
-            <template slot="materialName" slot-scope="scope">
-              <component
-                v-bind="scope.attr"
-                v-model="scope.row[scope.item.key]"
+            <div style="height: 25vh; display: flex">
+              <el-super-table
+                v-model="params[item.key]"
+                :dict="dict"
+                :ref="tabName"
+                :columns="columns"
                 :size="$attrs.size"
-                :source.sync="scope.row"
-                @change="changeMaterialName(scope)"
+                index
               >
-              </component>
-            </template>
-            <el-table-column fixed="right" label="操作" width="100">
-              <template slot="header" slot-scope="scope">
-                <el-button
-                  type="text"
-                  :size="$attrs.size"
-                  @click="useRowAdd(tabName)"
-                  >增行
-                </el-button>
-              </template>
-              <template slot-scope="scope">
-                <el-button
-                  type="text"
-                  :size="$attrs.size"
-                  @click.native.prevent="useRowSubmit(tabName, scope)"
-                  >更新
-                </el-button>
-                <el-button
-                  type="text"
-                  :size="$attrs.size"
-                  @click.native.prevent="useRowRemove(tabName, scope)"
-                  >删行
-                </el-button>
-              </template>
-            </el-table-column>
-          </el-super-table>
-        </el-tab-pane>
-      </el-tabs>
+                <template slot="materialName" slot-scope="scope">
+                  <component
+                    v-bind="scope.attr"
+                    v-model="scope.row[scope.item.key]"
+                    :size="$attrs.size"
+                    :source.sync="scope.row"
+                    @change="changeMaterialName(scope)"
+                  >
+                  </component>
+                </template>
+                <el-table-column fixed="right" label="操作" width="100">
+                  <template slot="header" slot-scope="scope">
+                    <el-button
+                      type="text"
+                      :size="$attrs.size"
+                      @click="useRowAdd(tabName)"
+                      >增行
+                    </el-button>
+                  </template>
+                  <template slot-scope="scope">
+                    <el-button
+                      type="text"
+                      :size="$attrs.size"
+                      @click.native.prevent="useRowSubmit(tabName, scope)"
+                      >更新
+                    </el-button>
+                    <el-button
+                      type="text"
+                      :size="$attrs.size"
+                      @click.native.prevent="useRowRemove(tabName, scope)"
+                      >删行
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-super-table>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
     </el-drawer>
   </el-button>
 </template>