Browse Source

报价管理新增字段和优化

hezhanp 11 tháng trước cách đây
mục cha
commit
3c9ad6d87b

+ 1441 - 1350
src/BIZComponents/inventoryTable.vue

@@ -107,7 +107,7 @@
           }"
         >
           <el-input
-            :disabled="!!row.productCode"
+            :disabled="!!row.productCode && !isTemporary"
             v-model="row.productName"
             placeholder="请输入"
             style="width: 60%; margin-right: 10px"
@@ -151,23 +151,6 @@
           <el-input v-model="row.customerMark" placeholder="请输入"></el-input>
         </el-form-item>
       </template>
-      <!-- <template v-slot:headerSupplierMark="{ column }">
-        <span :class="isSupplierMark ? 'is-required' : ''">{{
-          column.label
-        }}</span>
-      </template>
-      <template v-slot:supplierMark="{ row, $index }">
-        <el-form-item
-          :prop="'datasource.' + $index + '.supplierMark'"
-          :rules="{
-            required: isSupplierMark ? true : false,
-            message: '请输入',
-            trigger: 'change'
-          }"
-        >
-          <el-input v-model="row.supplierMark" placeholder="请输入"></el-input>
-        </el-form-item>
-      </template> -->
 
       <template v-slot:headerProductName="{ column }">
         <span class="is-required">{{ column.label }}</span>
@@ -175,7 +158,10 @@
 
       <template v-slot:productCode="scope">
         <el-form-item :prop="'datasource.' + scope.$index + '.productCode'">
-          <el-input v-model="scope.row.productCode" :disabled="true"></el-input>
+          <el-input
+            v-model="scope.row.productCode"
+            :disabled="!isTemporary"
+          ></el-input>
         </el-form-item>
       </template>
       <template v-slot:productCategoryName="scope">
@@ -185,24 +171,18 @@
           <el-input v-model="scope.row.productCategoryName" disabled></el-input>
         </el-form-item>
       </template>
-      <!-- <template v-slot:totalCount="scope">
+      <template v-slot:packingSpecification="scope">
         <el-form-item
-         
-          :prop="'datasource.' + scope.$index + '.totalCount'"
-          :rules="{
-            required: isTotalCount ? true : false,
-            message: '请输入数量',
-            trigger: 'change'
-          }"
+          :prop="'datasource.' + scope.$index + '.packingSpecification'"
         >
           <el-input
-            v-model="scope.row.totalCount"
-            type="number"
+            v-model="scope.row.packingSpecification"
+            :disabled="!!scope.row.productCode && !isTemporary"
             placeholder="请输入"
-            @input="changeCount(scope.row, scope.$index)"
           ></el-input>
         </el-form-item>
-      </template> -->
+      </template>
+
       <template v-slot:headerTotalCount="{ column }">
         <span :class="{ 'is-required': isTotalCount }">{{ column.label }}</span>
       </template>
@@ -241,6 +221,72 @@
         </el-form-item>
       </template>
 
+      <!-- 新增字段:厚度 -->
+      <template v-slot:thickNess="{ row, $index }">
+        <el-form-item :prop="'datasource.' + $index + '.thickNess'">
+          <el-input v-model="row.thickNess" placeholder="请输入厚度">
+            <template slot="append">mm</template></el-input
+          >
+        </el-form-item>
+      </template>
+
+      <!-- 新增字段:平方数 -->
+      <template v-slot:squareNumber="{ row, $index }">
+        <el-form-item :prop="'datasource.' + $index + '.squareNumber'">
+          <el-input v-model="row.squareNumber" placeholder="请输入平方数">
+            <template slot="append">cm²</template></el-input
+          >
+        </el-form-item>
+      </template>
+
+      <!-- 新增字段:加工费(未税) -->
+      <template v-slot:processingFeeBeforeTax="{ row, $index }">
+        <el-form-item
+          :prop="'datasource.' + $index + '.processingFeeBeforeTax'"
+        >
+          <el-input
+            v-model="row.processingFeeBeforeTax"
+            placeholder="请输入加工费"
+            @input="updateSubtotal(row, $index)"
+          >
+          </el-input>
+        </el-form-item>
+      </template>
+
+      <!-- 新增字段:包装费(未税) -->
+      <template v-slot:packagingFeeNotTaxed="{ row, $index }">
+        <el-form-item
+          :prop="'datasource.' + $index + '.packagingFeeNotTaxed'"
+        >
+          <el-input
+            v-model="row.packagingFeeNotTaxed"
+            placeholder="请输入包装费"
+            type="number"
+            @input="updateSubtotal(row, $index)"
+          >
+          </el-input>
+        </el-form-item>
+      </template>
+
+      <!-- 新增字段:运输费(未税) -->
+      <template v-slot:transportationFeeWithoutTax="{ row, $index }">
+        <el-form-item
+          :prop="'datasource.' + $index + '.transportationFeeWithoutTax'"
+        >
+          <el-input
+            v-model="row.transportationFeeWithoutTax"
+            placeholder="请输入运输费"
+            type="number"
+            @input="updateSubtotal(row, $index)"
+          >
+          </el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:subtotalWithoutTax="{ row, $index }">
+        <el-form-item :prop="'datasource.' + $index + '.subtotalWithoutTax'">
+          {{ calculateSubtotal(row).toFixed(2) }}元
+        </el-form-item>
+      </template>
       <template v-slot:guaranteePeriod="scope">
         <div class="period">
           <div class="borderleftnone">
@@ -279,7 +325,7 @@
         <el-form-item :prop="'datasource.' + scope.$index + '.measuringUnit'">
           <el-input
             v-model="scope.row.measuringUnit"
-            :disabled="!!scope.row.productCode"
+            :disabled="!!scope.row.productCode && !isTemporary"
             placeholder="请输入"
           ></el-input>
         </el-form-item>
@@ -312,20 +358,6 @@
           </el-input>
         </el-form-item>
       </template>
-      <!-- <template v-slot:notaxSinglePrice="scope">
-        <el-form-item
-         
-          :prop="'datasource.' + scope.$index + '.notaxSinglePrice'"
-        >
-          <el-input
-            v-model="scope.row.notaxSinglePrice"
-            placeholder="请输入"
-            type="number"
-          >
-            <template slot="append">元</template>
-          </el-input>
-        </el-form-item>
-      </template> -->
 
       <template v-slot:taxRate="scope">
         <el-form-item
@@ -762,1409 +794,1468 @@
   </el-form>
 </template>
 <script>
-  import { numberReg } from 'ele-admin';
-  import productList from '@/BIZComponents/product-list.vue';
-  import dictMixins from '@/mixins/dictMixins';
-  import fileUpload from '@/components/upload/fileUpload';
-  import headList from '@/BIZComponents/user-select/user-select.vue';
-  import ProductionVersion from '@/components/ProductionVersion2/index.vue';
-  import { getInventoryTotalAPI } from '@/api/wms';
-  // import fileMain from '@/components/addDoc/index.vue';
-  import { pricingWayList, lbjtList } from '@/enum/dict.js';
-  import { changeCount, getAllPrice } from '@/BIZComponents/setProduct.js';
-  import { contactQueryByCategoryIdsAPI } from '@/api/saleManage/contact';
-  import taskinstanceDialog from '@/BIZComponents/procedure/taskinstanceDialog.vue';
-  import timeDialog from '@/components/timeDialog/index.vue';
-  import { copyObj } from '@/utils/util';
-  import selectStockLedgerDialog from '@/BIZComponents/selectStockLedger/selectStockLedgerDialog.vue'; //库存台账
-  import setAllValue from '@/BIZComponents/setAllValue.vue'; //批量修改
-
-  import tabMixins from '@/mixins/tableColumnsMixin';
-  import commodityPriceListDialog from '@/views/commodityManagement/commodityPriceList/components/commodityPriceListDialog.vue';
-  const dayjs = require('dayjs');
-  import { levelList } from '@/enum/dict.js';
-  import {
-    getGoodsPriceByCondition,
-    getGoodsByCategoryId
-  } from '@/api/goodsManage/index';
-  import { parameterGetByCode } from '@/api/main/index.js';
-
-  export default {
-    mixins: [dictMixins, tabMixins],
-    components: {
-      // fileMain,
-      productList,
-      fileUpload,
-      headList,
-      ProductionVersion,
-      taskinstanceDialog,
-      timeDialog,
-      selectStockLedgerDialog,
-      commodityPriceListDialog,
-      setAllValue
+import { numberReg } from 'ele-admin';
+import productList from '@/BIZComponents/product-list.vue';
+import dictMixins from '@/mixins/dictMixins';
+import fileUpload from '@/components/upload/fileUpload';
+import headList from '@/BIZComponents/user-select/user-select.vue';
+import ProductionVersion from '@/components/ProductionVersion2/index.vue';
+import { getInventoryTotalAPI } from '@/api/wms';
+import { pricingWayList, lbjtList } from '@/enum/dict.js';
+import { changeCount, getAllPrice } from '@/BIZComponents/setProduct.js';
+import { contactQueryByCategoryIdsAPI } from '@/api/saleManage/contact';
+import taskinstanceDialog from '@/BIZComponents/procedure/taskinstanceDialog.vue';
+import timeDialog from '@/components/timeDialog/index.vue';
+import { copyObj } from '@/utils/util';
+import selectStockLedgerDialog from '@/BIZComponents/selectStockLedger/selectStockLedgerDialog.vue'; //库存台账
+import setAllValue from '@/BIZComponents/setAllValue.vue'; //批量修改
+
+import tabMixins from '@/mixins/tableColumnsMixin';
+import commodityPriceListDialog from '@/views/commodityManagement/commodityPriceList/components/commodityPriceListDialog.vue';
+const dayjs = require('dayjs');
+import { levelList } from '@/enum/dict.js';
+import {
+  getGoodsPriceByCondition,
+  getGoodsByCategoryId
+} from '@/api/goodsManage/index';
+import { parameterGetByCode } from '@/api/main/index.js';
+
+export default {
+  mixins: [dictMixins, tabMixins],
+  components: {
+    fileUpload,
+    productList,
+    headList,
+    ProductionVersion,
+    taskinstanceDialog,
+    timeDialog,
+    selectStockLedgerDialog,
+    commodityPriceListDialog,
+    setAllValue
+  },
+  props: {
+    pageName: {
+      default: '',
+      type: String
+    },
+    isDiscountTotalPrice: {
+      default: false,
+      type: Boolean
     },
-    props: {
-      pageName: {
-        default: '',
-        type: String
-      },
-      isDiscountTotalPrice: {
-        default: false,
-        type: Boolean
-      },
 
-      isGuaranteePeriod: {
-        default: true,
-        type: Boolean
-      },
+    isGuaranteePeriod: {
+      default: true,
+      type: Boolean
+    },
 
-      customerMark: {
-        default: '',
-        type: String
-      },
+    customerMark: {
+      default: '',
+      type: String
+    },
 
-      isContractId: {
-        type: Boolean,
-        default: false
-      },
+    isContractId: {
+      type: Boolean,
+      default: false
+    },
 
-      isSinglePrice: {
-        //单价必填
-        type: Boolean,
-        default: true
-      },
-      isTotalCount: {
-        //数量必填
-        type: Boolean,
-        default: true
-      },
-      isCustomerMark: {
-        //客户代号必填
-        type: Boolean,
-        default: false
-      },
+    isSinglePrice: {
+      //单价必填
+      type: Boolean,
+      default: true
+    },
+    isTotalCount: {
+      //数量必填
+      type: Boolean,
+      default: true
+    },
+    isCustomerMark: {
+      //客户代号必填
+      type: Boolean,
+      default: false
+    },
 
-      isDiscount: {
-        //折让
-        type: Boolean,
-        default: true
-      },
+    isDiscount: {
+      //折让
+      type: Boolean,
+      default: true
+    },
 
-      isProduceDeliveryDeadline: {
-        //生产交付交期必填
-        type: Boolean,
-        default: false
-      },
+    isProduceDeliveryDeadline: {
+      //生产交付交期必填
+      type: Boolean,
+      default: false
+    },
 
-      isDrawer: {
-        type: Boolean,
-        default: false
-      },
-      isChangeCount: {
-        //默认计算
-        type: Boolean,
-        default: true
-      },
-      contractBookType: {
-        //合同类型 1销售 2采购
-        type: [String, Number],
-        default: 1
-      },
-      // isSupplierMark: {
-      //   //客户代号必填
-      //   type: Boolean,
-      //   default: false
-      // },
-      isTemporary: {
-        //临时
-        type: Boolean,
-        default: false
-      },
-      isSupplier: {
-        //供应商
-        type: Boolean,
-        default: false
-      },
-      isSalesRecord: {
-        default: ''
-      },
-      isArrivalWay: {
-        //分批到货时间
-        type: Boolean,
-        default: false
-      },
-      //订单类型
-      needProduce: {
-        type: [String, Number],
-        default: 1
-      },
-      cacheKeyUrl: '',
-      //是否显示订单编码
-      isOrderNo: {
-        type: Boolean,
-        default: false
-      },
-      isBatchNo: {
-        type: Boolean, //批次号是否必填
-        default: false
-      },
-      orderOption: {
-        default: () => {
-          return [];
-        }
-      },
-      //是否商品
-      isGoods: {
-        type: Boolean,
-        default: false
-      },
-      // 是否税率必填
-      isTaxRate: {
-        type: [Number, String],
-        default: 0
-      },
-      defTaxRate: {
-        type: Number,
-        default: undefined
-      },
-      countObj: {
-        type: Object,
-        default: () => {
-          return {
-            countKey: 'saleCount',
-            unitKey: 'saleUnit',
-            unitIdKey: 'saleUnitId'
-          };
-        }
+    isDrawer: {
+      type: Boolean,
+      default: false
+    },
+    isChangeCount: {
+      //默认计算
+      type: Boolean,
+      default: true
+    },
+    contractBookType: {
+      //合同类型 1销售 2采购
+      type: [String, Number],
+      default: 1
+    },
+    isTemporary: {
+      //临时
+      type: Boolean,
+      default: false
+    },
+    isSupplier: {
+      //供应商
+      type: Boolean,
+      default: false
+    },
+    isSalesRecord: {
+      default: ''
+    },
+    isArrivalWay: {
+      //分批到货时间
+      type: Boolean,
+      default: false
+    },
+    //订单类型
+    needProduce: {
+      type: [String, Number],
+      default: 1
+    },
+    cacheKeyUrl: '',
+    //是否显示订单编码
+    isOrderNo: {
+      type: Boolean,
+      default: false
+    },
+    isBatchNo: {
+      type: Boolean, //批次号是否必填
+      default: false
+    },
+    orderOption: {
+      default: () => {
+        return [];
       }
     },
-    data() {
-      const defaultForm = {
-        key: null,
-        endTime: '',
-        isFirst: 0,
-        name: '',
-        startTime: '',
-        workHour: '',
-        guaranteePeriodUnitCode: '',
-        technicalDrawings: [],
-        arrivalWay: 1
-      };
-      return {
-        levelList,
-        taskinstanceDialogFlag: false,
-        allPrice: 0,
-        numberReg,
-        defaultForm,
-        form: {
-          datasource: [],
-          discountTotalPrice: 0
-        },
-        isDate: 1,
-        pricingWayList,
-        curIndex: '',
-        rules: {},
-        dictList: {},
-        arrivalWayList: [
-          { label: '一次性到货', value: 1 },
-          { label: '分批到货', value: 2 }
-        ],
-        columnsVersion: 1,
-        selection: []
-      };
+    //是否商品
+    isGoods: {
+      type: Boolean,
+      default: false
+    },
+    // 是否税率必填
+    isTaxRate: {
+      type: [Number, String],
+      default: 0
+    },
+    defTaxRate: {
+      type: Number,
+      default: undefined
     },
-    computed: {
-      canHandl() {
-        return this.form.datasource.length;
+    countObj: {
+      type: Object,
+      default: () => {
+        return {
+          countKey: 'saleCount',
+          unitKey: 'saleUnit',
+          unitIdKey: 'saleUnitId'
+        };
+      }
+    }
+  },
+  data() {
+    const defaultForm = {
+      key: null,
+      endTime: '',
+      isFirst: 0,
+      name: '',
+      startTime: '',
+      workHour: '',
+      guaranteePeriodUnitCode: '',
+      technicalDrawings: [],
+      arrivalWay: 1,
+      // 新增字段初始化
+      thickNess: '',
+      squareNumber: '',
+      processingFeeBeforeTax: '',
+      packagingFeeNotTaxed: '',
+      transportationFeeWithoutTax: ''
+    };
+    return {
+      levelList,
+      taskinstanceDialogFlag: false,
+      allPrice: 0,
+      numberReg,
+      defaultForm,
+      form: {
+        datasource: [],
+        discountTotalPrice: 0
       },
-      columns() {
-        let columnsVersion = this.columnsVersion;
-        let orderColumn = {
-          width: 1,
-          show: false
+      isDate: 1,
+      pricingWayList,
+      curIndex: '',
+      rules: {},
+      dictList: {},
+      arrivalWayList: [
+        { label: '一次性到货', value: 1 },
+        { label: '分批到货', value: 2 }
+      ],
+      columnsVersion: 1,
+      selection: []
+    };
+  },
+  computed: {
+    canHandl() {
+      return this.form.datasource.length;
+    },
+    columns() {
+      let columnsVersion = this.columnsVersion;
+      let orderColumn = {
+        width: 1,
+        show: false
+      };
+      if (this.isOrderNo) {
+        orderColumn = {
+          minWidth: 200,
+          prop: 'orderNo',
+          slot: 'orderNo',
+          label: '订单编码',
+          showOverflowTooltip: true,
+          align: 'center'
         };
-        if (this.isOrderNo) {
-          orderColumn = {
-            minWidth: 200,
-            prop: 'orderNo',
-            slot: 'orderNo',
-            label: '订单编码',
-            showOverflowTooltip: true,
-            align: 'center'
-          };
-        }
-        return [
-          {
-            width: 45,
-            type: 'index',
-            columnKey: 'index',
-            align: 'center',
-            fixed: 'left'
-          },
-          {
-            label: '选择',
-            width: 45,
-            type: 'selection',
-            columnKey: 'selection',
-            align: 'center',
-            fixed: 'left'
-          },
-          orderColumn,
-          {
-            width: 280,
-            prop: 'productName',
-            label: '名称',
-            slot: 'productName',
-            headerSlot: 'headerProductName',
-            align: 'center',
-            fixed: 'left'
-          },
-          {
-            width: 120,
-            prop: 'productCode',
-            label: '编码',
-            slot: 'productCode',
-            align: 'center'
-          },
-          {
-            width: 200,
-            prop: 'productCategoryName',
-            label: '类型',
-            slot: 'productCategoryName',
-            align: 'center'
-          },
-          {
-            width: 120,
-            prop: 'specification',
-            label: '规格',
-            slot: 'specification',
-            align: 'center'
-          },
-          {
-            width: 200,
-            prop: 'customerMark',
-            label: this.contractBookType == 1 ? '客户代号' : '供应商代号',
-            slot: 'customerMark',
-            headerSlot: this.isCustomerMark ? 'headerCustomerMark' : '',
-            align: 'center'
-          },
-          {
-            minWidth: 240,
-            prop: 'taskName',
-            label: '工序',
-            slot: 'taskName',
-            align: 'center'
-          },
-          {
-            minWidth: 160,
-            prop: 'productionCodes',
-            label: '生产编号',
-            align: 'center'
-          },
-
-          this.isCustomerMark
-            ? {
-                minWidth: 120,
-                prop: 'entrustedEnterpriseId',
-                label: '受托企业',
-                slot: 'entrustedEnterpriseId',
-                show: this.isCustomerMark,
-                align: 'center'
-              }
-            : {
-                width: 1
-              },
-          {
-            width: 150,
-            prop: 'saleCount',
-            label: '数量',
-            slot: 'saleCount',
-            headerSlot: this.isTotalCount ? 'headerTotalCount' : '',
-            align: 'center'
-          },
-          {
-            width: 150,
-            prop: 'saleUnit',
-            label: '单位',
-            slot: 'saleUnit',
-            // headerSlot: 'headerTotalCount',
-            align: 'center'
-          },
-          {
-            width: 120,
-            prop: 'packingSpecification',
-            align: 'center',
-            label: '包装规格',
-            showOverflowTooltip: true
-          },
-
-          {
-            width: 150,
-            prop: 'totalCount',
-            label: '计量数量',
-            // slot: 'totalCount',
-            headerSlot: 'headerTotalCount',
-            align: 'center'
-          },
-          {
-            width: 120,
-            prop: 'measuringUnit',
-            label: '计量单位',
-            slot: 'measuringUnit',
-            align: 'center'
-          },
-          // {
-          //   width: 160,
-          //   prop: 'pricingWay',
-          //   label: '计价方式',
-          //   headerSlot: 'headerPricingWay',
-          //   slot: 'pricingWay',
-          //   align: 'center'
-          // },
-          {
-            minWidth: 120,
-            prop: 'goodsLevel',
-            label: '物品级别',
-            slot: 'goodsLevel',
-            align: 'center'
-          },
-          {
-            width: 160,
-            prop: 'goodsPriceType',
-            label: '价格类型',
-            slot: 'goodsPriceType',
-            align: 'center'
-          },
-          {
-            width: 200,
-            prop: 'singlePrice',
-            label: '单价',
-            slot: 'singlePrice',
-            headerSlot: this.isSinglePrice ? 'headerSinglePrice' : '',
-            align: 'center'
-          },
-          {
-            width: 160,
-            prop: 'taxRate',
-            label: '税率',
-            slot: 'taxRate',
-            align: 'center',
-            headerSlot: this.isTaxRate == 1 ? 'headerTaxRate' : ''
-          },
-          {
-            width: 180,
-            prop: 'notaxSinglePrice',
-            label: '不含税单价',
-            slot: 'notaxSinglePrice',
-            align: 'center'
-          },
-          this.isDiscount
-            ? {
-                width: 160,
-                prop: 'discountSinglePrice',
-                label: '折让单价',
-                align: 'center',
-                show: this.isDiscount,
-                formatter: (_row, _column, cellValue) => {
-                  return _row.discountSinglePrice
-                    ? Number(_row.discountSinglePrice).toFixed(2)
-                    : '';
-                }
-              }
-            : {
-                width: 1
-              },
-          {
-            width: 120,
-            prop: 'totalPrice',
-            label: '合计',
-            slot: 'totalPrice',
-            align: 'center'
-          },
-
-          this.isDiscount
-            ? {
-                width: 160,
-                prop: 'discountTotalPrice',
-                label: '折让合计',
-                align: 'center',
-                show: this.isDiscount,
-                formatter: (_row, _column, cellValue) => {
-                  return _row.discountTotalPrice
-                    ? Number(_row.discountTotalPrice).toFixed(2)
-                    : '';
-                }
-              }
-            : {
-                width: 1
-              },
-
-          {
-            width: 110,
-            prop: 'batchNo',
-            label: '批次号',
-            slot: 'batchNo',
-            headerSlot: this.isBatchNo ? 'headerBatchNo' : '',
-            align: 'center'
-          },
-          {
-            width: 120,
-            prop: 'availableCountBase',
-            label: '库存数量',
-            slot: 'availableCountBase',
-            align: 'center'
-          },
-          {
-            prop: 'provenance',
-            label: '产地',
-            slot: 'provenance',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 200
-            // show:this.contractBookType==2
-          },
-
-          {
-            width: 120,
-            prop: 'singleWeight',
-            label: '单重',
-            slot: 'singleWeight',
-            headerSlot: 'headerSingleWeight',
-            align: 'center'
-          },
-          {
-            width: 120,
-            prop: 'totalWeight',
-            label: '总重',
-            slot: 'totalWeight',
-            align: 'center'
-          },
-          {
-            width: 120,
-            prop: 'weightUnit',
-            label: '重量单位',
-            slot: 'weightUnit',
-            align: 'center'
-          },
-          {
-            width: 160,
-            prop: 'productBrand',
-            label: '牌号',
-            slot: 'productBrand',
-            align: 'center'
-          },
-          {
-            width: 120,
-            prop: 'modelType',
-            label: '型号',
-            slot: 'modelType',
-            align: 'center'
-          },
-          {
-            width: 160,
-            prop: 'modelKey',
-            label: '机型',
-            slot: 'modelKey',
-            align: 'center'
-          },
-          {
-            width: 160,
-            prop: 'colorKey',
-            label: '颜色',
-            slot: 'colorKey',
-            align: 'center'
-          },
-          {
-            width: 120,
-            prop: 'produceType',
-            align: 'center',
-            label: '属性类型',
-            showOverflowTooltip: true,
-            formatter: (row, column) => {
-              if (row.produceType) {
-                return row.produceType
-                  .map((item) => {
-                    return lbjtList[item];
-                  })
-                  .toString();
-              }
+      }
+      return [
+        {
+          width: 45,
+          type: 'index',
+          columnKey: 'index',
+          align: 'center',
+          fixed: 'left'
+        },
+        {
+          width: 45,
+          type: 'selection',
+          columnKey: 'selection',
+          align: 'center',
+          fixed: 'left'
+        },
+        orderColumn,
+        {
+          width: 280,
+          prop: 'productName',
+          label: '名称',
+          slot: 'productName',
+          headerSlot: 'headerProductName',
+          align: 'center',
+          fixed: 'left'
+        },
+        {
+          width: 120,
+          prop: 'productCode',
+          label: '编码',
+          slot: 'productCode',
+          align: 'center'
+        },
+        {
+          width: 200,
+          prop: 'productCategoryName',
+          label: '类型',
+          slot: 'productCategoryName',
+          align: 'center'
+        },
+        {
+          width: 120,
+          prop: 'specification',
+          label: '规格',
+          slot: 'specification',
+          align: 'center'
+        },
+        // 新增字段:厚度
+        {
+          width: 150,
+          prop: 'thickNess',
+          label: '厚度',
+          slot: 'thickNess',
+          align: 'center'
+        },
+        // 新增字段:平方数
+        {
+          width: 150,
+          prop: 'squareNumber',
+          label: '平方数',
+          slot: 'squareNumber',
+          align: 'center'
+        },
+        // 新增字段:加工费(未税)
+        {
+          width: 150,
+          prop: 'processingFeeBeforeTax',
+          label: '加工费(未税)',
+          slot: 'processingFeeBeforeTax',
+          align: 'center'
+        },
+        // 新增字段:包装费(未税)
+        {
+          width: 150,
+          prop: 'packagingFeeNotTaxed',
+          label: '包装费(未税)',
+          slot: 'packagingFeeNotTaxed',
+          align: 'center'
+        },
+        // 新增字段:运输费(未税)
+        {
+          width: 150,
+          prop: 'transportationFeeWithoutTax',
+          label: '运输费(未税)',
+          slot: 'transportationFeeWithoutTax',
+          align: 'center'
+        },
+        {
+          width: 150,
+          prop: 'subtotalWithoutTax',
+          label: '报价小计(未税)',
+          slot: 'subtotalWithoutTax',
+          align: 'center'
+        },
+        {
+          width: 200,
+          prop: 'customerMark',
+          label: this.contractBookType == 1 ? '客户代号' : '供应商代号',
+          slot: 'customerMark',
+          headerSlot: this.isCustomerMark ? 'headerCustomerMark' : '',
+          align: 'center'
+        },
+        {
+          minWidth: 240,
+          prop: 'taskName',
+          label: '工序',
+          slot: 'taskName',
+          align: 'center'
+        },
+        {
+          minWidth: 160,
+          prop: 'productionCodes',
+          label: '生产编号',
+          align: 'center'
+        },
+
+        this.isCustomerMark
+          ? {
+              minWidth: 120,
+              prop: 'entrustedEnterpriseId',
+              label: '受托企业',
+              slot: 'entrustedEnterpriseId',
+              show: this.isCustomerMark,
+              align: 'center'
             }
-          },
-
-          this.isArrivalWay
-            ? {
-                width: 160,
-                prop: 'arrivalWay',
-                label: '到货方式',
-                slot: 'arrivalWay',
-                align: 'center',
-                show: this.isArrivalWay
-              }
-            : {
-                width: 1
-              },
-          {
-            width: 160,
-            prop: 'customerExpectDeliveryDeadline',
-            label: this.contractBookType == 1 ? '客户期望交期' : '交付日期',
-            slot: 'customerExpectDeliveryDeadline',
-            headerSlot:
-              this.isDate == 1 ? 'headerCustomerExpectDeliveryDeadline' : '',
-            align: 'center'
-          },
-
-          this.contractBookType == 1
-            ? {
-                width: 160,
-                prop: 'produceDeliveryDeadline',
-                label: '生产交付交期',
-                slot: 'produceDeliveryDeadline',
-                headerSlot:
-                  this.isDate == 1 && this.isProduceDeliveryDeadline
-                    ? 'headerProduceDeliveryDeadline'
-                    : '',
-                show: this.contractBookType == 1,
-                align: 'center'
+          : {
+              width: 1
+            },
+        {
+          width: 150,
+          prop: 'saleCount',
+          label: '数量',
+          slot: 'saleCount',
+          headerSlot: this.isTotalCount ? 'headerTotalCount' : '',
+          align: 'center'
+        },
+        {
+          width: 150,
+          prop: 'saleUnit',
+          label: '单位',
+          slot: 'saleUnit',
+          align: 'center'
+        },
+        {
+          width: 120,
+          prop: 'packingSpecification',
+          align: 'center',
+          slot: 'packingSpecification',
+          label: '包装规格',
+          showOverflowTooltip: true
+        },
+
+        {
+          width: 150,
+          prop: 'totalCount',
+          label: '计量数量',
+          headerSlot: 'headerTotalCount',
+          align: 'center'
+        },
+        {
+          width: 120,
+          prop: 'measuringUnit',
+          label: '计量单位',
+          slot: 'measuringUnit',
+          align: 'center'
+        },
+        {
+          minWidth: 120,
+          prop: 'goodsLevel',
+          label: '物品级别',
+          slot: 'goodsLevel',
+          align: 'center'
+        },
+        {
+          width: 160,
+          prop: 'goodsPriceType',
+          label: '价格类型',
+          slot: 'goodsPriceType',
+          align: 'center'
+        },
+        {
+          width: 200,
+          prop: 'singlePrice',
+          label: '单价',
+          slot: 'singlePrice',
+          headerSlot: this.isSinglePrice ? 'headerSinglePrice' : '',
+          align: 'center'
+        },
+        {
+          width: 160,
+          prop: 'taxRate',
+          label: '税率',
+          slot: 'taxRate',
+          align: 'center',
+          headerSlot: this.isTaxRate == 1 ? 'headerTaxRate' : ''
+        },
+        {
+          width: 180,
+          prop: 'notaxSinglePrice',
+          label: '不含税单价',
+          slot: 'notaxSinglePrice',
+          align: 'center'
+        },
+        this.isDiscount
+          ? {
+              width: 160,
+              prop: 'discountSinglePrice',
+              label: '折让单价',
+              align: 'center',
+              show: this.isDiscount,
+              formatter: (_row, _column, cellValue) => {
+                return _row.discountSinglePrice
+                  ? Number(_row.discountSinglePrice).toFixed(2)
+                  : '';
               }
-            : {
-                width: 1
-              },
-
-          {
-            width: 200,
-            prop: 'guaranteePeriod',
-            label: '有效期',
-            slot: 'guaranteePeriod',
-            // headerSlot: 'headerGuaranteePeriod',
-            align: 'center'
-          },
-          this.isGuaranteePeriod
-            ? {
-                width: 200,
-                prop: 'guaranteePeriodDeadline',
-                label: '有效期截止日期',
-                slot: 'guaranteePeriodDeadline',
-                show: this.isGuaranteePeriod,
-                align: 'center'
+            }
+          : {
+              width: 1
+            },
+        {
+          width: 120,
+          prop: 'totalPrice',
+          label: '合计',
+          slot: 'totalPrice',
+          align: 'center'
+        },
+
+        this.isDiscount
+          ? {
+              width: 160,
+              prop: 'discountTotalPrice',
+              label: '折让合计',
+              align: 'center',
+              show: this.isDiscount,
+              formatter: (_row, _column, cellValue) => {
+                return _row.discountTotalPrice
+                  ? Number(_row.discountTotalPrice).toFixed(2)
+                  : '';
               }
-            : {
-                width: 1
-              },
-          {
-            width: 120,
-            prop: 'imgCode',
-            align: 'center',
-            label: '图号/件号',
-            showOverflowTooltip: true
-          },
-          // {
-          //   width: 120,
-          //   prop: 'approvalNumber',
-          //   align: 'center',
-          //   label: '批准文号',
-          //   showOverflowTooltip: true
-          // },
-
-          {
-            width: 220,
-            prop: 'customerReqFiles',
-            label: '客户需求',
-            slot: 'customerReqFiles',
-            align: 'center'
-          },
-          {
-            width: 130,
-            prop: 'technicalAnswerName',
-            label: '技术答疑人',
-            slot: 'technicalAnswerName',
-            align: 'center'
-          },
-          {
-            width: 220,
-            prop: 'technicalParams',
-            label: '技术参数',
-            slot: 'technicalParams',
-            align: 'center'
-          },
-          {
-            width: 240,
-            prop: 'technicalDrawings',
-            label: '技术图纸',
-            slot: 'technicalDrawings',
-            align: 'center'
-          },
-          {
-            width: 120,
-            prop: 'drawingVersion',
-            label: '图纸版本',
-            align: 'center'
-          },
-
-          {
-            width: 240,
-            prop: 'technologyRouteName',
-            label: '工艺路线',
-            slot: 'technologyRouteName',
-            align: 'center'
-          },
-          {
-            width: 240,
-            prop: 'industryArtFiles',
-            label: '工艺附件',
-            slot: 'industryArtFiles',
-            align: 'center'
-          },
-          {
-            width: 240,
-            prop: 'otherFiles',
-            label: '其他附件',
-            slot: 'otherFiles',
-            align: 'center'
-          },
-          {
-            width: 220,
-            prop: 'remark',
-            label: '备注',
-            slot: 'remark',
-            align: 'center'
-          },
-          {
-            columnKey: 'action',
-            label: '操作',
-            width: 120,
-            align: 'center',
-            resizable: false,
-            slot: 'action',
-            fixed: 'right',
-            showOverflowTooltip: true
+            }
+          : {
+              width: 1
+            },
+
+        {
+          width: 110,
+          prop: 'batchNo',
+          label: '批次号',
+          slot: 'batchNo',
+          headerSlot: this.isBatchNo ? 'headerBatchNo' : '',
+          align: 'center'
+        },
+        {
+          width: 120,
+          prop: 'availableCountBase',
+          label: '库存数量',
+          slot: 'availableCountBase',
+          align: 'center'
+        },
+        {
+          prop: 'provenance',
+          label: '产地',
+          slot: 'provenance',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
+
+        {
+          width: 120,
+          prop: 'singleWeight',
+          label: '单重',
+          slot: 'singleWeight',
+          headerSlot: 'headerSingleWeight',
+          align: 'center'
+        },
+        {
+          width: 120,
+          prop: 'totalWeight',
+          label: '总重',
+          slot: 'totalWeight',
+          align: 'center'
+        },
+        {
+          width: 120,
+          prop: 'weightUnit',
+          label: '重量单位',
+          slot: 'weightUnit',
+          align: 'center'
+        },
+        {
+          width: 160,
+          prop: 'productBrand',
+          label: '牌号',
+          slot: 'productBrand',
+          align: 'center'
+        },
+        {
+          width: 120,
+          prop: 'modelType',
+          label: '型号',
+          slot: 'modelType',
+          align: 'center'
+        },
+        {
+          width: 160,
+          prop: 'modelKey',
+          label: '机型',
+          slot: 'modelKey',
+          align: 'center'
+        },
+        {
+          width: 160,
+          prop: 'colorKey',
+          label: '颜色',
+          slot: 'colorKey',
+          align: 'center'
+        },
+        {
+          width: 120,
+          prop: 'produceType',
+          align: 'center',
+          label: '属性类型',
+          showOverflowTooltip: true,
+          formatter: (row, column) => {
+            if (row.produceType) {
+              return row.produceType
+                .map((item) => {
+                  return lbjtList[item];
+                })
+                .toString();
+            }
           }
-        ];
-      }
-    },
+        },
+
+        this.isArrivalWay
+          ? {
+              width: 160,
+              prop: 'arrivalWay',
+              label: '到货方式',
+              slot: 'arrivalWay',
+              align: 'center',
+              show: this.isArrivalWay
+            }
+          : {
+              width: 1
+            },
+        {
+          width: 160,
+          prop: 'customerExpectDeliveryDeadline',
+          label: this.contractBookType == 1 ? '客户期望交期' : '交付日期',
+          slot: 'customerExpectDeliveryDeadline',
+          headerSlot:
+            this.isDate == 1 ? 'headerCustomerExpectDeliveryDeadline' : '',
+          align: 'center'
+        },
+
+        this.contractBookType == 1
+          ? {
+              width: 160,
+              prop: 'produceDeliveryDeadline',
+              label: '生产交付交期',
+              slot: 'produceDeliveryDeadline',
+              headerSlot:
+                this.isDate == 1 && this.isProduceDeliveryDeadline
+                  ? 'headerProduceDeliveryDeadline'
+                  : '',
+              show: this.contractBookType == 1,
+              align: 'center'
+            }
+          : {
+              width: 1
+            },
+
+        {
+          width: 200,
+          prop: 'guaranteePeriod',
+          label: '有效期',
+          slot: 'guaranteePeriod',
+          align: 'center'
+        },
+        this.isGuaranteePeriod
+          ? {
+              width: 200,
+              prop: 'guaranteePeriodDeadline',
+              label: '有效期截止日期',
+              slot: 'guaranteePeriodDeadline',
+              show: this.isGuaranteePeriod,
+              align: 'center'
+            }
+          : {
+              width: 1
+            },
+        {
+          width: 120,
+          prop: 'imgCode',
+          align: 'center',
+          label: '图号/件号',
+          showOverflowTooltip: true
+        },
+
+        {
+          width: 220,
+          prop: 'customerReqFiles',
+          label: '客户需求',
+          slot: 'customerReqFiles',
+          align: 'center'
+        },
+        {
+          width: 130,
+          prop: 'technicalAnswerName',
+          label: '技术答疑人',
+          slot: 'technicalAnswerName',
+          align: 'center'
+        },
+        {
+          width: 220,
+          prop: 'technicalParams',
+          label: '技术参数',
+          slot: 'technicalParams',
+          align: 'center'
+        },
+        {
+          width: 240,
+          prop: 'technicalDrawings',
+          label: '技术图纸',
+          slot: 'technicalDrawings',
+          align: 'center'
+        },
+        {
+          width: 120,
+          prop: 'drawingVersion',
+          label: '图纸版本',
+          align: 'center'
+        },
 
-    created() {
-      // this.requestDict('保质期单位');
-      // this.requestDict('产地');
-      // this.requestDict('商品价格类型');
-      parameterGetByCode({
-        code: 'eom_inventoryTable_customerExpectDeliveryDeadline'
-      }).then((res) => {
-        if (res.value) {
-          this.isDate = res.value;
+        {
+          width: 240,
+          prop: 'technologyRouteName',
+          label: '工艺路线',
+          slot: 'technologyRouteName',
+          align: 'center'
+        },
+        {
+          width: 240,
+          prop: 'industryArtFiles',
+          label: '工艺附件',
+          slot: 'industryArtFiles',
+          align: 'center'
+        },
+        {
+          width: 240,
+          prop: 'otherFiles',
+          label: '其他附件',
+          slot: 'otherFiles',
+          align: 'center'
+        },
+        {
+          width: 220,
+          prop: 'remark',
+          label: '备注',
+          slot: 'remark',
+          align: 'center'
+        },
+        {
+          columnKey: 'action',
+          label: '操作',
+          width: 120,
+          align: 'center',
+          resizable: false,
+          slot: 'action',
+          fixed: 'right',
+          showOverflowTooltip: true
         }
+      ];
+    }
+  },
+
+  created() {
+    parameterGetByCode({
+      code: 'eom_inventoryTable_customerExpectDeliveryDeadline'
+    }).then((res) => {
+      if (res.value) {
+        this.isDate = res.value;
+      }
+    });
+  },
+  methods: {
+    updateSubtotal(row, index) {
+      // this.$set(row, 'subtotalWithoutTax', this.calculateSubtotal(row));
+      // 触发表格重新渲染
+      this.$set(row, 'subtotalWithoutTax', this.calculateSubtotal(row));
+    },
+    calculateSubtotal(row) {
+      const processingFee = Number(row.processingFeeBeforeTax) || 0;
+      const packagingFee = Number(row.packagingFeeNotTaxed) || 0;
+      const transportationFee = Number(row.transportationFeeWithoutTax) || 0;
+      return processingFee + packagingFee + transportationFee;
+    },
+    packingChange(item, index) {
+      this.$set(
+        this.form.datasource[index],
+        this.countObj.unitKey,
+        item.conversionUnit
+      );
+    },
+    openVersion(index) {
+      this.$refs.versionRefs.open(index);
+    },
+    //设置分批到货时间
+    handleMethod(row, index) {
+      this.$refs.timeDialogRef.open(row, index);
+    },
+    chooseTime({ arrivalBatch, index }) {
+      this.$set(
+        this.form.datasource[index],
+        'arrivalBatch',
+        copyObj(arrivalBatch)
+      );
+    },
+    //工艺路线
+    changeProduct(data, index) {
+      this.$set(this.form.datasource[index], 'technologyRouteName', data.name);
+      this.$set(this.form.datasource[index], 'technologyRouteId', data.id);
+    },
+    handleTaskinstance(row, index) {
+      this.taskinstanceDialogFlag = true;
+      this.$nextTick(() => {
+        this.$refs.taskinstanceDialogRef.open(row, index);
       });
     },
-    methods: {
-      packingChange(item, index) {
+    saveTaskInstance(row = {}) {
+      this.$set(this.form.datasource[row.index], 'taskId', row.id);
+      this.$set(this.form.datasource[row.index], 'taskName', row.name);
+      this.$set(
+        this.form.datasource[row.index],
+        'routingId',
+        row.produceRoutingId
+      );
+    },
+    async getSupplierObj(productList, queryName) {
+      try {
+        let categoryIds = productList
+          .filter((item) => item.productId)
+          .map((item) => item.productId);
+        if (categoryIds.length > 0) {
+          return await contactQueryByCategoryIdsAPI({
+            categoryIds
+          });
+        } else {
+          return Promise.resolve({});
+        }
+      } catch (e) {
+        return Promise.resolve({});
+      }
+    },
+    setDeliveryDays(row, index, type, isAll) {
+      if (isAll) {
+        this.form.datasource.forEach((item, i) => {
+          let guaranteePeriodUnitName = this.guaranteePeriodUnit(
+            item.guaranteePeriodUnitCode
+          );
+
+          this.$set(
+            this.form.datasource[i],
+            'guaranteePeriodDeadline',
+            guaranteePeriodUnitName != 'second'
+              ? this.setDay(item.guaranteePeriod, guaranteePeriodUnitName, item)
+              : ''
+          );
+        });
+        return;
+      }
+
+      if (type == 'guaranteePeriod') {
+        let guaranteePeriodUnitName = this.guaranteePeriodUnit(
+          row.guaranteePeriodUnitCode
+        );
         this.$set(
           this.form.datasource[index],
-          this.countObj.unitKey,
-          item.conversionUnit
+          'guaranteePeriodDeadline',
+          guaranteePeriodUnitName != 'second'
+            ? this.setDay(row.guaranteePeriod, guaranteePeriodUnitName, row)
+            : ''
         );
-      },
-      openVersion(index) {
-        this.$refs.versionRefs.open(index);
-      },
-      //设置分批到货时间
-      handleMethod(row, index) {
-        this.$refs.timeDialogRef.open(row, index);
-      },
-      chooseTime({ arrivalBatch, index }) {
+      }
+    },
+    guaranteePeriodUnit(code) {
+      return code == 3
+        ? 'day'
+        : code == 4
+        ? 'month'
+        : code == 5
+        ? 'year'
+        : 'second';
+    },
+    setDay(addDay, dateType = 'day', item) {
+      let tiem =
+        this.contractBookType == 1
+          ? item.produceDeliveryDeadline
+          : item.customerExpectDeliveryDeadline;
+      return dayjs(tiem || new Date())
+        .add(addDay, dateType)
+        .format('YYYY-MM-DD');
+    },
+    // 返回列表数据
+    getTableValue() {
+      let comitDatasource = copyObj(this.form.datasource);
+      if (comitDatasource.length === 0) return [];
+      comitDatasource.forEach((v) => {
+        if (v.guaranteePeriodUnitCode) {
+          v.guaranteePeriodUnitName = this.getDictValue(
+            '保质期单位',
+            v.guaranteePeriodUnitCode
+          );
+        }
+        if (v.modelKey) {
+          v.modelKey = v.modelKey.toString();
+        }
+        if (v.colorKey) {
+          v.colorKey = v.colorKey.toString();
+        }
+        v.technicalDrawings = v.technicalDrawings ? v.technicalDrawings : [];
+        v.customerReqFiles = v.customerReqFiles || [];
+        v.industryArtFiles = v.industryArtFiles || [];
+        v.otherFiles = v.otherFiles || [];
+        // 确保新增字段被正确处理
+        v.thickNess = v.thickNess || '';
+        v.squareNumber = v.squareNumber || '';
+        v.processingFeeBeforeTax = v.processingFeeBeforeTax || '';
+        v.packagingFeeNotTaxed = v.packagingFeeNotTaxed || '';
+        v.transportationFeeWithoutTax = v.transportationFeeWithoutTax || '';
+      });
+      return comitDatasource;
+    },
+    getPrice() {
+      return [this.allPrice, this.form.discountTotalPrice];
+    },
+    //改变数量
+    changeCount(row, index) {
+      if (!row) {
+        this.form.datasource.forEach((item, index) => {
+          this.$set(
+            this.form,
+            'datasource[' + index + ']',
+            changeCount(item, this.countObj)
+          );
+        });
+      } else {
         this.$set(
-          this.form.datasource[index],
-          'arrivalBatch',
-          copyObj(arrivalBatch)
+          this.form,
+          'datasource[' + index + ']',
+          changeCount(row, this.countObj)
         );
-      },
-      //工艺路线
-      changeProduct(data, index) {
+      }
+
+      this.getNotaxSinglePrice();
+      this.changeAll();
+      this.$forceUpdate();
+    },
+    changeAll() {
+      this.allPrice = getAllPrice(this.form.datasource) || 0;
+      if (this.isDiscountTotalPrice) {
+        this.form.discountTotalPrice = this.allPrice;
+        this.$emit('setDiscountTotalPrice', this.allPrice);
+      }
+      this.$emit('setCountAmount', this.allPrice);
+    },
+
+    setCustomerMark(customerMark) {
+      this.form.datasource.forEach((item) => {
+        item['customerMark'] = customerMark;
+        this.$forceUpdate();
+      });
+    },
+
+    //计算不含税单价
+    getNotaxSinglePrice() {
+      this.form.datasource.forEach((item, index) => {
+        if (item.singlePrice && item.taxRate) {
+          this.$set(
+            this.form.datasource[index],
+            'notaxSinglePrice',
+            parseFloat((item.singlePrice / (1 + item.taxRate / 100)).toFixed(2))
+          );
+        } else {
+          this.$set(this.form.datasource[index], 'notaxSinglePrice', '');
+        }
+      });
+    },
+    //设置优惠后总金额修改产品单价
+    discountInputByOrder(val) {
+      this.form.discountTotalPrice = val;
+
+      this.form.datasource.forEach((item, index) => {
         this.$set(
           this.form.datasource[index],
-          'technologyRouteName',
-          data.name
+          'discountSinglePrice',
+          this.getDiscountSinglePrice(item)
         );
-        this.$set(this.form.datasource[index], 'technologyRouteId', data.id);
-      },
-      handleTaskinstance(row, index) {
-        this.taskinstanceDialogFlag = true;
-        this.$nextTick(() => {
-          this.$refs.taskinstanceDialogRef.open(row, index);
-        });
-      },
-      saveTaskInstance(row = {}) {
-        this.$set(this.form.datasource[row.index], 'taskId', row.id);
-        this.$set(this.form.datasource[row.index], 'taskName', row.name);
         this.$set(
-          this.form.datasource[row.index],
-          'routingId',
-          row.produceRoutingId
+          this.form.datasource[index],
+          'discountTotalPrice',
+          this.getDiscountTotalPrice(item)
         );
-      },
-      async getSupplierObj(productList, queryName) {
-        try {
-          let categoryIds = productList
-            .filter((item) => item.productId)
-            .map((item) => item.productId);
-          if (categoryIds.length > 0) {
-            return await contactQueryByCategoryIdsAPI({
-              categoryIds
-            });
-          } else {
-            return Promise.resolve({});
+      });
+      this.$emit('setDiscountTotalPrice', val);
+
+      this.$forceUpdate();
+      this.$refs.table.reRenderTable();
+    },
+    setAllValueChange({ key, value }) {
+      let indexS = this.selection.map((item) => item.key - 1);
+      indexS.forEach((i) => {
+        this.$set(this.form.datasource[i], key, value);
+        this.setDeliveryDays(this.form.datasource[i], i, 'guaranteePeriod');
+      });
+    },
+    //获取折让单价
+    getDiscountSinglePrice(row) {
+      let num =
+        (Number(this.form.discountTotalPrice) / Number(this.allPrice)) *
+        Number(row.singlePrice);
+      return isNaN(num) ? '' : num;
+    },
+
+    //获取折让合计
+    getDiscountTotalPrice(row) {
+      let num = 0;
+      num = Number(row.discountSinglePrice) * Number(row.totalCount);
+      return isNaN(num) ? '' : num.toFixed(2);
+    },
+    orderNoChange(row, item) {
+      row['orderId'] = item.orderId;
+    },
+    //修改回显
+    async putTableValue(data) {
+      let productList =
+        (data &&
+          (data.quoteProductList || data.productList || data.detailList)) ||
+        [];
+      if (productList) {
+        let supplierObj = await this.getSupplierObj(productList, 'productId');
+
+        productList.forEach((item, index) => {
+          item['key'] = index + 1;
+          if (item.modelKey) {
+            item.modelKey = item.modelKey.split(',');
           }
-        } catch (e) {
-          return Promise.resolve({});
-        }
-      },
-      setDeliveryDays(row, index, type, isAll) {
-        if (isAll) {
-          this.form.datasource.forEach((item, i) => {
-            let guaranteePeriodUnitName = this.guaranteePeriodUnit(
-              item.guaranteePeriodUnitCode
-            );
+          if (item.colorKey) {
+            item.colorKey = item.colorKey.split(',');
+          }
+          item.pricingWay =
+            item.pricingWay || data.pricingWay || data?.contractVO?.pricingWay;
 
-            this.$set(
-              this.form.datasource[i],
-              'guaranteePeriodDeadline',
+          item.guaranteePeriodUnitCode = item.guaranteePeriodUnitCode
+            ? item.guaranteePeriodUnitCode + ''
+            : '';
+
+          let guaranteePeriodUnitName = this.guaranteePeriodUnit(
+            item.guaranteePeriodUnitCode
+          );
+          if (item.guaranteePeriod && item.guaranteePeriodUnitCode) {
+            item['guaranteePeriodDeadline'] =
+              item['guaranteePeriodDeadline'] ||
               guaranteePeriodUnitName != 'second'
                 ? this.setDay(
                     item.guaranteePeriod,
                     guaranteePeriodUnitName,
                     item
                   )
-                : ''
-            );
-            // }
-          });
-          return;
-        }
+                : '';
+          }
+          item.entrustedEnterpriseIdList = supplierObj[item.productId];
+          if (supplierObj[item.productId]?.length === 1) {
+            item.entrustedEnterpriseId = supplierObj[item.productId][0].id;
+          }
+          item['customerMark'] = item.customerMark || this.customerMark;
+          item['arrivalWay'] = item.arrivalWay || 1;
 
-        if (type == 'guaranteePeriod') {
-          let guaranteePeriodUnitName = this.guaranteePeriodUnit(
-            row.guaranteePeriodUnitCode
+          // 初始化新增字段
+
+          this.$set(item, 'thickNess', item.thickNess || '');
+          this.$set(item, 'squareNumber', item.squareNumber || '');
+          this.$set(
+            item,
+            'processingFeeBeforeTax',
+            item.processingFeeBeforeTax || ''
           );
           this.$set(
-            this.form.datasource[index],
-            'guaranteePeriodDeadline',
-            guaranteePeriodUnitName != 'second'
-              ? this.setDay(row.guaranteePeriod, guaranteePeriodUnitName, row)
-              : ''
+            item,
+            'packagingFeeNotTaxed',
+            item.packagingFeeNotTaxed || ''
+          );
+          this.$set(
+            item,
+            'transportationFeeWithoutTax',
+            item.transportationFeeWithoutTax || ''
           );
-        }
-      },
-      guaranteePeriodUnit(code) {
-        return code == 3
-          ? 'day'
-          : code == 4
-          ? 'month'
-          : code == 5
-          ? 'year'
-          : 'second';
-      },
-      setDay(addDay, dateType = 'day', item) {
-        let tiem =
-          this.contractBookType == 1
-            ? item.produceDeliveryDeadline
-            : item.customerExpectDeliveryDeadline;
-        return dayjs(tiem || new Date())
-          .add(addDay, dateType)
-          .format('YYYY-MM-DD');
-      },
-      // 返回列表数据
-      getTableValue() {
-        let comitDatasource = copyObj(this.form.datasource);
-        // console.log(comitDatasource)
-        // console.log(this.form.datasource)
-        // return
-        if (comitDatasource.length === 0) return [];
-        comitDatasource.forEach((v) => {
-          if (v.guaranteePeriodUnitCode) {
-            v.guaranteePeriodUnitName = this.getDictValue(
-              '保质期单位',
-              v.guaranteePeriodUnitCode
-            );
-          }
-          if (v.modelKey) {
-            v.modelKey = v.modelKey.toString();
-          }
-          if (v.colorKey) {
-            v.colorKey = v.colorKey.toString();
-          }
-          v.technicalDrawings = v.technicalDrawings ? v.technicalDrawings : [];
-          v.customerReqFiles = v.customerReqFiles || [];
-          v.industryArtFiles = v.industryArtFiles || [];
-          v.otherFiles = v.otherFiles || [];
         });
-        return comitDatasource;
-      },
-      getPrice() {
-        return [this.allPrice, this.form.discountTotalPrice];
-      },
-      //改变数量
-      changeCount(row, index) {
-        if (!row) {
-          this.form.datasource.forEach((item, index) => {
+        this.form.datasource = productList;
+
+        let codeList = this.form.datasource
+          .filter((item) => item.productCode)
+          .map((item) => item.productCode);
+        //获取仓库库存
+        let inventoryTotalList = await getInventoryTotalAPI(codeList);
+        this.form.datasource
+          .filter((item) => item.productCode)
+          .forEach((item, index) => {
+            let find =
+              inventoryTotalList.find((key) => key.code == item.productCode) ||
+              {};
+            this.form.datasource;
             this.$set(
-              this.form,
-              'datasource[' + index + ']',
-              changeCount(item, this.countObj)
+              this.form.datasource[index],
+              'availableCountBase',
+              find.availableCountBase
             );
           });
+        if (this.isChangeCount) {
+          this.changeCount();
         } else {
-          this.$set(
-            this.form,
-            'datasource[' + index + ']',
-            changeCount(row, this.countObj)
-          );
+          this.allPrice = data.totalAmount || data?.contractVO?.totalPrice;
         }
 
-        this.getNotaxSinglePrice();
-        this.changeAll();
-        this.$forceUpdate();
-      },
-      changeAll() {
-        this.allPrice = getAllPrice(this.form.datasource) || 0;
         if (this.isDiscountTotalPrice) {
-          this.form.discountTotalPrice = this.allPrice;
-          this.$emit('setDiscountTotalPrice', this.allPrice);
+          this.form.discountTotalPrice =
+            data.payAmount || data?.contractVO?.discountTotalPrice;
         }
-        this.$emit('setCountAmount', this.allPrice);
-      },
-
-      setCustomerMark(customerMark) {
-        this.form.datasource.forEach((item) => {
-          item['customerMark'] = customerMark;
-          this.$forceUpdate();
-        });
-      },
-
-      //计算不含税单价
-      getNotaxSinglePrice() {
-        this.form.datasource.forEach((item, index) => {
-          if (item.singlePrice && item.taxRate) {
-            this.$set(
-              this.form.datasource[index],
-              'notaxSinglePrice',
-              parseFloat(
-                (item.singlePrice / (1 + item.taxRate / 100)).toFixed(2)
-              )
-            );
-          } else {
-            this.$set(this.form.datasource[index], 'notaxSinglePrice', '');
-          }
-        });
-      },
-      //设置优惠后总金额修改产品单价
-      discountInputByOrder(val) {
-        this.form.discountTotalPrice = val;
+        this.$refs.table.reload();
+      }
+    },
 
-        // //获取优惠金额和总计的差价
-        this.form.datasource.forEach((item, index) => {
-          //获取折让单价
+    //选择产品
+    handParent(row, index) {
+      let item = {
+        id: row?.productCode
+      };
+      if (row?.goodsId) {
+        this.handGoods(index);
+        return;
+      }
+      if (this.needProduce == 1 || this.needProduce == 2) {
+        this.$refs.productListRef.open(item, index);
+      } else {
+        this.$refs.selectStockLedgerDialogRef.open(item, index);
+      }
+    },
+    handGoods(index) {
+      this.$refs.commodityPriceListDialogRef.open(index);
+    },
+    //选择技术人回调
+    changeAnswer(obj, idx) {
+      this.$set(this.form.datasource[idx], 'technicalAnswerId', obj.id);
+      this.$set(this.form.datasource[idx], 'technicalAnswerName', obj.name);
+    },
+    handHead(row, index) {
+      let item = {
+        id: row.technicalAnswerId
+      };
+      this.$refs.headRef.open(item, index);
+    },
+    //选择产品回调
+    changeParent(obj, idx) {
+      obj.forEach((item, index) => {
+        let i = idx == -1 ? index : idx;
+        let row = JSON.parse(JSON.stringify(this.defaultForm));
+        row.key = this.form.datasource.length + 1;
+        let parasm = idx == -1 ? row : this.form.datasource[i];
+
+        this.$set(parasm, 'productId', item.id);
+        this.$set(parasm, 'categoryName', item.name);
+        this.$set(parasm, 'productCategoryId', item.categoryLevelId);
+        this.$set(parasm, 'productBrand', item.brandNum);
+        this.$set(parasm, 'productCategoryName', item.categoryLevelPath);
+        this.$set(parasm, 'productCode', item.code);
+        this.$set(parasm, 'productName', item.name);
+        this.$set(parasm, 'modelType', item.modelType);
+        this.$set(parasm, 'availableCountBase', item.availableCountBase);
+        this.$set(parasm, 'measuringUnit', item.measuringUnit);
+        this.$set(parasm, 'specification', item.specification);
+        this.$set(parasm, 'weightUnit', item.weightUnit);
+        this.$set(parasm, 'singleWeight', item.netWeight);
+        this.$set(parasm, 'pricingWay', 1);
+        this.$set(parasm, 'goodsLevel', item.goodsLevel);
+        this.$set(parasm, 'guaranteePeriod', item.warrantyPeriod);
+        if (item.modelKey) {
+          this.$set(parasm, 'modelKey', item.modelKey.split(','));
+        }
+        if (item.colorKey) {
+          this.$set(parasm, 'colorKey', item.colorKey.split(','));
+        }
+        if (this.defTaxRate) {
+          this.$set(parasm, 'taxRate', parasm.taxRate || this.defTaxRate);
+        }
+        this.$set(
+          parasm,
+          'guaranteePeriodUnitCode',
+          item.warrantyPeriodUnit ? item.warrantyPeriodUnit + '' : ''
+        );
+        if (item.warrantyPeriod && item.warrantyPeriodUnit) {
           this.$set(
-            this.form.datasource[index],
-            'discountSinglePrice',
-            this.getDiscountSinglePrice(item)
+            parasm,
+            'guaranteePeriodDeadline',
+            this.setDay(
+              item.warrantyPeriod,
+              this.guaranteePeriodUnit(item.warrantyPeriodUnit),
+              {}
+            )
           );
+        }
+        this.$set(
+          parasm,
+          'packageDispositionList',
+          item.packageDispositionList
+        );
+        if (item.packageDispositionList?.length) {
           this.$set(
-            this.form.datasource[index],
-            'discountTotalPrice',
-            this.getDiscountTotalPrice(item)
+            parasm,
+            this.countObj.unitIdKey,
+            item.packageDispositionList[0].id
           );
-        });
-        this.$emit('setDiscountTotalPrice', val);
+          this.$set(
+            parasm,
+            this.countObj.unitKey,
+            item.packageDispositionList[0].conversionUnit
+          );
+        }
 
-        this.$forceUpdate();
-        this.$refs.table.reRenderTable();
-      },
-      setAllValueChange({ key, value }) {
-        let indexS = this.selection.map((item) => item.key - 1);
-        indexS.forEach((i) => {
-          this.$set(this.form.datasource[i], key, value);
-          this.setDeliveryDays(this.form.datasource[i], i, 'guaranteePeriod');
-        });
-      },
-      //获取折让单价
-      getDiscountSinglePrice(row) {
-        let num =
-          (Number(this.form.discountTotalPrice) / Number(this.allPrice)) *
-          Number(row.singlePrice);
-        console.log(num, 'num');
-        return isNaN(num) ? '' : num;
-      },
+        this.$set(parasm, 'arrivalWay', item.arrivalWay || 1);
 
-      //获取折让合计
-      getDiscountTotalPrice(row) {
-        let num = 0;
-        num = Number(row.discountSinglePrice) * Number(row.totalCount);
-        return isNaN(num) ? '' : num.toFixed(2);
-      },
-      orderNoChange(row, item) {
-        row['orderId'] = item.orderId;
-      },
-      //修改回显
-      async putTableValue(data) {
-        let productList =
-          (data &&
-            (data.quoteProductList || data.productList || data.detailList)) ||
-          [];
-        if (productList) {
-          let supplierObj = await this.getSupplierObj(productList, 'productId');
-
-          productList.forEach((item, index) => {
-            item['key'] = index + 1;
-            if (item.modelKey) {
-              item.modelKey = item.modelKey.split(',');
-            }
-            if (item.colorKey) {
-              item.colorKey = item.colorKey.split(',');
-            }
-            item.pricingWay =
-              item.pricingWay ||
-              data.pricingWay ||
-              data?.contractVO?.pricingWay;
+        this.$set(parasm, 'imgCode', item.imgCode);
+        this.$set(parasm, 'produceType', item.componentAttribute);
+        if (this.isOrderNo) {
+          this.$set(parasm, 'orderNo', this.orderOption[0]?.orderNo);
+          this.$set(parasm, 'orderId', this.orderOption[0]?.orderId);
+        }
+        if (this.isGoods && item.goodsId) {
+          this.$set(parasm, 'goodsId', item.goodsId);
+          this.$set(parasm, 'goodsPriceId', item.goodsPriceId);
+          this.$set(parasm, 'goodsPriceType', item.goodsPriceType);
+          this.$set(parasm, 'singlePrice', item.singlePrice);
+          this.$set(parasm, 'notaxSinglePrice', item.notaxSinglePrice);
+          this.$set(parasm, 'taxRate', item.taxRate);
+          this.$set(parasm, 'discountSinglePrice', item.singlePrice);
+          this.$set(parasm, 'totalCount', '');
+        } else {
+          this.$set(parasm, 'singlePrice', parasm.singlePrice || 0);
+        }
 
-            item.guaranteePeriodUnitCode = item.guaranteePeriodUnitCode
-              ? item.guaranteePeriodUnitCode + ''
-              : '';
+        if (this.isSupplier) {
+          this.$set(
+            parasm,
+            'entrustedEnterpriseIdList',
+            item.entrustedEnterpriseIdList
+          );
+          this.$set(
+            parasm,
+            'entrustedEnterpriseId',
+            item.entrustedEnterpriseId
+          );
+        }
+        this.$set(parasm, 'approvalNumber', item.extField?.approvalNumber);
+        this.$set(
+          parasm,
+          'packingSpecification',
+          item.extField.packingSpecification
+        );
+        this.$set(parasm, 'customerMark', this.customerMark);
+        if (item.purchaseOrigins?.length > 0) {
+          item.purchaseOrigins = item.purchaseOrigins.map((val) => val + '');
+        }
+        this.$set(parasm, 'provenance', item.purchaseOrigins || []);
 
-            let guaranteePeriodUnitName = this.guaranteePeriodUnit(
-              item.guaranteePeriodUnitCode
-            );
-            if (item.guaranteePeriod && item.guaranteePeriodUnitCode) {
-              item['guaranteePeriodDeadline'] =
-                item['guaranteePeriodDeadline'] ||
-                guaranteePeriodUnitName != 'second'
-                  ? this.setDay(
-                      item.guaranteePeriod,
-                      guaranteePeriodUnitName,
-                      item
-                    )
-                  : '';
-            }
-            item.entrustedEnterpriseIdList = supplierObj[item.productId];
-            if (supplierObj[item.productId]?.length === 1) {
-              item.entrustedEnterpriseId = supplierObj[item.productId][0].id;
-            }
-            item['customerMark'] = item.customerMark || this.customerMark;
-            item['arrivalWay'] = item.arrivalWay || 1;
-          });
-          this.form.datasource = productList;
-
-          let codeList = this.form.datasource
-            .filter((item) => item.productCode)
-            .map((item) => item.productCode);
-          //获取仓库库存
-          let inventoryTotalList = await getInventoryTotalAPI(codeList);
-          this.form.datasource
-            .filter((item) => item.productCode)
-            .forEach((item, index) => {
-              let find =
-                inventoryTotalList.find(
-                  (key) => key.code == item.productCode
-                ) || {};
-              this.form.datasource;
-              this.$set(
-                this.form.datasource[index],
-                'availableCountBase',
-                find.availableCountBase
-              );
-            });
-          if (this.isChangeCount) {
-            this.changeCount();
-          } else {
-            this.allPrice = data.totalAmount || data?.contractVO?.totalPrice;
-          }
+        row.customerExpectDeliveryDeadline = dayjs().format('YYYY-MM-DD');
 
-          if (this.isDiscountTotalPrice) {
-            this.form.discountTotalPrice =
-              data.payAmount || data?.contractVO?.discountTotalPrice;
-          }
-          this.$refs.table.reload();
-        }
-      },
+        this.$set(parasm, this.countObj.countKey, 1);
+        this.$set(parasm, 'totalCount', 1);
 
-      //计算单重
+        // 初始化新增字段
+        this.$set(parasm, 'thickNess', '');
+        this.$set(parasm, 'squareNumber', '');
+        this.$set(parasm, 'processingFeeBeforeTax', '');
+        this.$set(parasm, 'packagingFeeNotTaxed', '');
+        this.$set(parasm, 'transportationFeeWithoutTax', '');
 
-      //选择产品
-      handParent(row, index) {
-        let item = {
-          id: row?.productCode
-        };
-        if (row?.goodsId) {
-          this.handGoods(index);
-          return;
+        if (idx == -1) {
+          this.form.datasource.push(row);
         }
-        if (this.needProduce == 1 || this.needProduce == 2) {
-          this.$refs.productListRef.open(item, index);
+      });
+      this.changeCount();
+    },
+    replaceTable(obj, idx) {
+      obj.forEach(async (item, index) => {
+        let i = idx == -1 ? index : idx;
+        let row = JSON.parse(JSON.stringify(this.defaultForm));
+        row.key = this.form.datasource.length + 1;
+        let parasm = idx == -1 ? row : this.form.datasource[i];
+        this.$set(parasm, 'customerMark', this.customerMark);
+
+        this.$set(parasm, 'productId', item.productId);
+        this.$set(parasm, 'categoryName', item.productName);
+        this.$set(parasm, 'productCategoryId', item.categoryLevelId);
+        this.$set(parasm, 'productBrand', item.productBrand);
+        this.$set(parasm, 'productCategoryName', item.categoryLevelPath);
+        this.$set(parasm, 'productCode', item.productCode);
+        this.$set(parasm, 'productName', item.productName);
+        this.$set(parasm, 'modelType', item.categoryModel);
+        this.$set(parasm, 'availableCountBase', item.measureQuantity);
+        this.$set(parasm, 'measuringUnit', item.measuringUnit);
+        this.$set(parasm, 'specification', item.specification);
+        this.$set(parasm, 'weightUnit', item.weightUnit);
+        this.$set(parasm, 'singleWeight', item.weight);
+        this.$set(parasm, 'pricingWay', 1);
+        this.$set(parasm, 'arrivalWay', item.arrivalWay || 1);
+        this.$set(parasm, 'batchNo', item.batchNo);
+        this.$set(parasm, 'imgCode', '');
+        this.$set(parasm, 'produceType', item.componentAttribute);
+        let goodsData = await getGoodsByCategoryId(item.productId);
+        goodsData = goodsData.filter((item) => item.approvalStatus == 2);
+        if (goodsData?.length) {
+          let goodsPriceList = goodsData[0]?.goodsPriceList[0];
+          this.$set(parasm, 'goodsId', goodsData[0].id);
+          this.$set(parasm, 'goodsPriceId', goodsPriceList.id);
+          this.$set(parasm, 'goodsPriceType', goodsPriceList.priceType);
+          this.$set(parasm, 'singlePrice', goodsPriceList.unitPrice || 0);
+          this.$set(parasm, 'notaxSinglePrice', goodsPriceList.excludeTaxPrice);
+          this.$set(parasm, 'taxRate', goodsPriceList.taxRate);
+          this.$set(parasm, 'discountSinglePrice', goodsPriceList.unitPrice);
+          this.$set(parasm, 'totalCount', '');
         } else {
-          this.$refs.selectStockLedgerDialogRef.open(item, index);
+          this.$set(parasm, 'singlePrice', 0);
         }
-      },
-      handGoods(index) {
-        this.$refs.commodityPriceListDialogRef.open(index);
-      },
-      //选择技术人回调
-      changeAnswer(obj, idx) {
-        this.$set(this.form.datasource[idx], 'technicalAnswerId', obj.id);
-        this.$set(this.form.datasource[idx], 'technicalAnswerName', obj.name);
-      },
-      handHead(row, index) {
-        let item = {
-          id: row.technicalAnswerId
-        };
-        this.$refs.headRef.open(item, index);
-      },
-      //选择产品回调
-      changeParent(obj, idx) {
-        obj.forEach((item, index) => {
-          let i = idx == -1 ? index : idx;
-          let row = JSON.parse(JSON.stringify(this.defaultForm));
-          row.key = this.form.datasource.length + 1;
-          let parasm = idx == -1 ? row : this.form.datasource[i];
-          console.log(this.defTaxRate, 'this.defTaxRate');
-
-          this.$set(parasm, 'productId', item.id);
-          this.$set(parasm, 'categoryName', item.name);
-          this.$set(parasm, 'productCategoryId', item.categoryLevelId);
-          this.$set(parasm, 'productBrand', item.brandNum);
-          this.$set(parasm, 'productCategoryName', item.categoryLevelPath);
-          this.$set(parasm, 'productCode', item.code);
-          this.$set(parasm, 'productName', item.name);
-          this.$set(parasm, 'modelType', item.modelType);
-          this.$set(parasm, 'availableCountBase', item.availableCountBase);
-          this.$set(parasm, 'measuringUnit', item.measuringUnit);
-          this.$set(parasm, 'specification', item.specification);
-          this.$set(parasm, 'weightUnit', item.weightUnit);
-          this.$set(parasm, 'singleWeight', item.netWeight);
-          this.$set(parasm, 'pricingWay', 1);
-          this.$set(parasm, 'goodsLevel', item.goodsLevel);
-          this.$set(parasm, 'guaranteePeriod', item.warrantyPeriod);
-          if (item.modelKey) {
-            this.$set(parasm, 'modelKey', item.modelKey.split(','));
-          }
-          if (item.colorKey) {
-            this.$set(parasm, 'colorKey', item.colorKey.split(','));
-          }
-          if (this.defTaxRate) {
-            this.$set(parasm, 'taxRate',parasm.taxRate ||this.defTaxRate);
-          }
+        if (item.modelKey) {
+          this.$set(parasm, 'modelKey', item.modelKey.split(','));
+        }
+        if (item.colorKey) {
+          this.$set(parasm, 'colorKey', item.colorKey.split(','));
+        }
+        if (this.isSupplier) {
           this.$set(
             parasm,
-            'guaranteePeriodUnitCode',
-            item.warrantyPeriodUnit ? item.warrantyPeriodUnit + '' : ''
+            'entrustedEnterpriseIdList',
+            item.entrustedEnterpriseIdList
           );
-          if (item.warrantyPeriod && item.warrantyPeriodUnit) {
-            this.$set(
-              parasm,
-              'guaranteePeriodDeadline',
-              this.setDay(
-                item.warrantyPeriod,
-                this.guaranteePeriodUnit(item.warrantyPeriodUnit),
-                {}
-              )
-            );
-          }
           this.$set(
             parasm,
-            'packageDispositionList',
-            item.packageDispositionList
+            'entrustedEnterpriseId',
+            item.entrustedEnterpriseId
           );
-          if (item.packageDispositionList?.length) {
-            this.$set(
-              parasm,
-              this.countObj.unitIdKey,
-              item.packageDispositionList[0].id
-            );
-            this.$set(
-              parasm,
-              this.countObj.unitKey,
-              item.packageDispositionList[0].conversionUnit
-            );
-          }
-
-          this.$set(parasm, 'arrivalWay', item.arrivalWay || 1);
-
-          this.$set(parasm, 'imgCode', item.imgCode);
-          this.$set(parasm, 'produceType', item.componentAttribute);
-          if (this.isOrderNo) {
-            this.$set(parasm, 'orderNo', this.orderOption[0]?.orderNo);
-            this.$set(parasm, 'orderId', this.orderOption[0]?.orderId);
-          }
-          if (this.isGoods && item.goodsId) {
-            this.$set(parasm, 'goodsId', item.goodsId);
-            this.$set(parasm, 'goodsPriceId', item.goodsPriceId);
-            this.$set(parasm, 'goodsPriceType', item.goodsPriceType);
-            this.$set(parasm, 'singlePrice', item.singlePrice);
-            this.$set(parasm, 'notaxSinglePrice', item.notaxSinglePrice);
-            this.$set(parasm, 'taxRate', item.taxRate);
-            this.$set(parasm, 'discountSinglePrice', item.singlePrice);
-            this.$set(parasm, 'totalCount', '');
-          } else {
-            this.$set(parasm, 'singlePrice', parasm.singlePrice ||0); // 新增物品清单时,单价默认设为0
-          }
+        }
+        this.$set(parasm, 'approvalNumber', item.extField?.approvalNumber);
+        this.$set(
+          parasm,
+          'packingSpecification',
+          item.extField.packingSpecification
+        );
 
-          if (this.isSupplier) {
-            this.$set(
-              parasm,
-              'entrustedEnterpriseIdList',
-              item.entrustedEnterpriseIdList
-            );
-            this.$set(
-              parasm,
-              'entrustedEnterpriseId',
-              item.entrustedEnterpriseId
-            );
-          }
-          this.$set(parasm, 'approvalNumber', item.extField?.approvalNumber);
+        this.$set(
+          parasm,
+          'packageDispositionList',
+          item.packageDispositionList
+        );
+        if (item.packageDispositionList?.length) {
           this.$set(
             parasm,
-            'packingSpecification',
-            item.extField.packingSpecification
+            this.countObj.unitIdKey,
+            item.packageDispositionList[0].id
           );
-          this.$set(parasm, 'customerMark', this.customerMark);
-          if (item.purchaseOrigins?.length > 0) {
-            item.purchaseOrigins = item.purchaseOrigins.map((val) => val + '');
-          }
-          this.$set(parasm, 'provenance', item.purchaseOrigins || []);
+          this.$set(
+            parasm,
+            this.countObj.unitKey,
+            item.packageDispositionList[0].conversionUnit
+          );
+        }
 
-          if (idx == -1) {
-            this.form.datasource.push(row);
-          }
-        });
-        this.changeCount();
-      },
-      replaceTable(obj, idx) {
-        obj.forEach(async (item, index) => {
-          let i = idx == -1 ? index : idx;
-          let row = JSON.parse(JSON.stringify(this.defaultForm));
-          row.key = this.form.datasource.length + 1;
-          let parasm = idx == -1 ? row : this.form.datasource[i];
-          this.$set(parasm, 'customerMark', this.customerMark);
-
-          this.$set(parasm, 'productId', item.productId);
-          this.$set(parasm, 'categoryName', item.productName);
-          this.$set(parasm, 'productCategoryId', item.categoryLevelId);
-          this.$set(parasm, 'productBrand', item.productBrand);
-          this.$set(parasm, 'productCategoryName', item.categoryLevelPath);
-          this.$set(parasm, 'productCode', item.productCode);
-          this.$set(parasm, 'productName', item.productName);
-          this.$set(parasm, 'modelType', item.categoryModel);
-          this.$set(parasm, 'availableCountBase', item.measureQuantity);
-          this.$set(parasm, 'measuringUnit', item.measuringUnit);
-          this.$set(parasm, 'specification', item.specification);
-          this.$set(parasm, 'weightUnit', item.weightUnit);
-          this.$set(parasm, 'singleWeight', item.weight);
-          this.$set(parasm, 'pricingWay', 1);
-          this.$set(parasm, 'arrivalWay', item.arrivalWay || 1);
-          this.$set(parasm, 'batchNo', item.batchNo);
-          this.$set(parasm, 'imgCode', '');
-          this.$set(parasm, 'produceType', item.componentAttribute);
-          let goodsData = await getGoodsByCategoryId(item.productId);
-          goodsData = goodsData.filter((item) => item.approvalStatus == 2);
-          if (goodsData?.length) {
-            let goodsPriceList = goodsData[0]?.goodsPriceList[0];
-            this.$set(parasm, 'goodsId', goodsData[0].id);
-            this.$set(parasm, 'goodsPriceId', goodsPriceList.id);
-            this.$set(parasm, 'goodsPriceType', goodsPriceList.priceType);
-            this.$set(parasm, 'singlePrice', goodsPriceList.unitPrice || 0);
-            this.$set(
-              parasm,
-              'notaxSinglePrice',
-              goodsPriceList.excludeTaxPrice
-            );
-            this.$set(parasm, 'taxRate', goodsPriceList.taxRate);
-            this.$set(parasm, 'discountSinglePrice', goodsPriceList.unitPrice);
-            this.$set(parasm, 'totalCount', '');
-          } else {
-            this.$set(parasm, 'singlePrice', 0); // 新增物品清单时,单价默认设为0
-          }
-          if (item.modelKey) {
-            this.$set(parasm, 'modelKey', item.modelKey.split(','));
-          }
-          if (item.colorKey) {
-            this.$set(parasm, 'colorKey', item.colorKey.split(','));
+        this.$set(parasm, 'customerMark', this.customerMark);
+        if (item.purchaseOrigins?.length > 0) {
+          item.purchaseOrigins = item.purchaseOrigins.map((val) => val + '');
+        }
+        this.$set(parasm, 'provenance', item.purchaseOrigins || []);
+
+        this.$set(parasm, this.countObj.countKey, 1);
+        this.$set(parasm, 'totalCount', 1);
+
+        // 初始化新增字段
+        this.$set(parasm, 'thickNess', '');
+        this.$set(parasm, 'squareNumber', '');
+        this.$set(parasm, 'processingFeeBeforeTax', '');
+        this.$set(parasm, 'packagingFeeNotTaxed', '');
+        this.$set(parasm, 'transportationFeeWithoutTax', '');
+
+        parasm.customerExpectDeliveryDeadline = dayjs().format('YYYY-MM-DD');
+        if (idx == -1) {
+          this.form.datasource.push(row);
+        }
+      });
+    },
+    remove(index) {
+      this.form.datasource.splice(index, 1);
+      this.setSort();
+      this.changeAll();
+    },
+
+    // 重新排序
+    setSort() {
+      this.form.datasource.forEach((n, index) => {
+        n.key = index + 1;
+      });
+    },
+    // 添加
+    handlAdd() {
+      let item = JSON.parse(JSON.stringify(this.defaultForm));
+      item.key = this.form.datasource.length + 1;
+      item.customerMark = this.customerMark;
+      // 为临时产品初始化可编辑字段
+      item.productName = '';
+      item.productCode = '';
+      item.measuringUnit = '';
+      item.packingSpecification = '';
+      item[this.countObj.countKey] = 1;
+      item.totalCount = 1;
+      item.customerExpectDeliveryDeadline = dayjs().format('YYYY-MM-DD');
+
+      // 初始化新增字段
+      item.thickNess = '';
+      item.squareNumber = '';
+      item.processingFeeBeforeTax = '';
+      item.packagingFeeNotTaxed = '';
+      item.transportationFeeWithoutTax = '';
+
+      this.form.datasource.push(item);
+    },
+
+    validateForm(callback) {
+      this.$refs.form.validate((valid, obj) => {
+        if (obj) {
+          let messages = Object.keys(obj).map((key) => obj[key][0]);
+          if (messages.length > 0) {
+            this.$message.warning(messages[0].message);
           }
-          if (this.isSupplier) {
+        }
+        callback(valid);
+      });
+    },
+    goodsPriceTypeChange(row, index) {
+      if (row.goodsId) {
+        getGoodsPriceByCondition({
+          id: row.goodsId,
+          priceType: row.goodsPriceType
+        }).then((res) => {
+          if (res.id) {
+            this.$set(this.form.datasource[index], 'goodsPriceId', res.id);
             this.$set(
-              parasm,
-              'entrustedEnterpriseIdList',
-              item.entrustedEnterpriseIdList
+              this.form.datasource[index],
+              'goodsPriceType',
+              res.priceType
             );
             this.$set(
-              parasm,
-              'entrustedEnterpriseId',
-              item.entrustedEnterpriseId
+              this.form.datasource[index],
+              'singlePrice',
+              res.unitPrice
             );
-          }
-          this.$set(parasm, 'approvalNumber', item.extField?.approvalNumber);
-          this.$set(
-            parasm,
-            'packingSpecification',
-            item.extField.packingSpecification
-          );
-
-          this.$set(
-            parasm,
-            'packageDispositionList',
-            item.packageDispositionList
-          );
-          if (item.packageDispositionList?.length) {
             this.$set(
-              parasm,
-              this.countObj.unitIdKey,
-              item.packageDispositionList[0].id
+              this.form.datasource[index],
+              'notaxSinglePrice',
+              res.excludeTaxPrice
             );
+            this.$set(this.form.datasource[index], 'taxRate', res.taxRate);
             this.$set(
-              parasm,
-              this.countObj.unitKey,
-              item.packageDispositionList[0].conversionUnit
+              this.form.datasource[index],
+              'discountSinglePrice',
+              res.unitPrice
             );
           }
-
-          this.$set(parasm, 'customerMark', this.customerMark);
-          if (item.purchaseOrigins?.length > 0) {
-            item.purchaseOrigins = item.purchaseOrigins.map((val) => val + '');
-          }
-          this.$set(parasm, 'provenance', item.purchaseOrigins || []);
-
-          if (idx == -1) {
-            this.form.datasource.push(row);
-          }
-        });
-      },
-      remove(index) {
-        this.form.datasource.splice(index, 1);
-        this.setSort();
-        this.changeAll();
-      },
-
-      // 重新排序
-      setSort() {
-        this.form.datasource.forEach((n, index) => {
-          n.key = index + 1;
-        });
-      },
-      // 添加
-      handlAdd() {
-        let item = JSON.parse(JSON.stringify(this.defaultForm));
-        item.key = this.form.datasource.length + 1;
-        item.customerMark = this.customerMark;
-        this.form.datasource.push(item);
-      },
-
-      validateForm(callback) {
-        // let singleWeightData = {};
-        // this.form.datasource.forEach((item) => {
-        //   if (item.pricingWay == 2 && !item.singleWeight) {
-        //     singleWeightData['name'] = item.productName;
-        //     console.log(singleWeightData, 'singleWeightData');
-        //   }
-        // });
-        // if (singleWeightData.name) {
-        //   this.$message.warning(
-        //     singleWeightData.name + '计价方式为按重量计费,单重不能为空'
-        //   );
-        //   callback(false);
-        // }
-        //开始表单校验
-        this.$refs.form.validate((valid, obj) => {
-          if (obj) {
-            let messages = Object.keys(obj).map((key) => obj[key][0]);
-            if (messages.length > 0) {
-              this.$message.warning(messages[0].message);
-            }
-          }
-          callback(valid);
+          this.changeCount(row, index);
         });
-      },
-      goodsPriceTypeChange(row, index) {
-        if (row.goodsId) {
-          getGoodsPriceByCondition({
-            id: row.goodsId,
-            priceType: row.goodsPriceType
-          }).then((res) => {
-            if (res.id) {
-              this.$set(this.form.datasource[index], 'goodsPriceId', res.id);
-              this.$set(
-                this.form.datasource[index],
-                'goodsPriceType',
-                res.priceType
-              );
-              this.$set(
-                this.form.datasource[index],
-                'singlePrice',
-                res.unitPrice
-              );
-              this.$set(
-                this.form.datasource[index],
-                'notaxSinglePrice',
-                res.excludeTaxPrice
-              );
-              this.$set(this.form.datasource[index], 'taxRate', res.taxRate);
-              this.$set(
-                this.form.datasource[index],
-                'discountSinglePrice',
-                res.unitPrice
-              );
-            }
-            this.changeCount(row, index);
-          });
-        }
-      },
-      save() {
-        this.$emit('save');
       }
+    },
+    save() {
+      this.$emit('save');
     }
-  };
+  }
+};
 </script>
 <style lang="scss" scoped>
-  .headbox {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-
-    .amount {
-      font-size: 14px;
-      font-weight: bold;
-      padding-right: 30px;
-    }
-  }
+.headbox {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
 
-  .time-form .el-form-item {
-    margin-bottom: 0 !important;
+  .amount {
+    font-size: 14px;
+    font-weight: bold;
+    padding-right: 30px;
   }
+}
 
-  ::v-deep .period {
-    display: flex;
+.time-form .el-form-item {
+  margin-bottom: 0 !important;
+}
 
-    .borderleftnone {
-      .el-input--medium .el-input__inner {
-        border-top-right-radius: 0;
-        border-bottom-right-radius: 0;
-      }
-    }
+::v-deep .period {
+  display: flex;
 
-    .borderrightnone {
-      .el-input--medium .el-input__inner {
-        border-top-left-radius: 0;
-        border-bottom-left-radius: 0;
-      }
+  .borderleftnone {
+    .el-input--medium .el-input__inner {
+      border-top-right-radius: 0;
+      border-bottom-right-radius: 0;
     }
   }
 
-  ::v-deep .time-form tbody > tr:hover > td {
-    background-color: transparent !important;
-  }
-
-  ::v-deep .time-form .el-table tr {
-    background-color: #ffffff;
-  }
-
-  .pricebox {
-    display: flex;
-    justify-content: flex-start;
-    align-items: center;
-    font-weight: bold;
+  .borderrightnone {
+    .el-input--medium .el-input__inner {
+      border-top-left-radius: 0;
+      border-bottom-left-radius: 0;
+    }
   }
-</style>
+}
+
+::v-deep .time-form tbody > tr:hover > td {
+  background-color: transparent !important;
+}
+
+::v-deep .time-form .el-table tr {
+  background-color: #ffffff;
+}
+
+.pricebox {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  font-weight: bold;
+}
+</style>

+ 518 - 518
src/views/saleManage/quotation/components/addDialog.vue

@@ -78,20 +78,15 @@
             </el-select>
           </el-form-item>
           <el-form-item label="询价方联系人" prop="contactLinkName">
-            <el-select
+            <el-autocomplete
               v-model="form.contactLinkName"
+              :fetch-suggestions="queryContactLink"
+              @select="handleContactSelect"
+              @input="handleContactInput"
+              placeholder="请输入或选择询价方联系人"
               style="width: 100%"
-              placeholder="请选择"
-              @change="onchangeLink"
-            >
-              <el-option
-                v-for="item in linkNameOptions"
-                :key="item.id"
-                :label="item.linkName"
-                :value="item.id"
-              >
-              </el-option>
-            </el-select>
+              clearable
+            ></el-autocomplete>
           </el-form-item>
           <el-form-item label="询价方电话" prop="contactTel">
             <el-input
@@ -270,545 +265,550 @@
 </template>
 
 <script>
-  import { emailReg, phoneReg, numberReg, telReg } from 'ele-admin';
-  import { acceptUnpackoptions } from '@/enum/dict';
-  import inventoryTable from '@/BIZComponents/inventoryTable.vue';
+import { emailReg, phoneReg, numberReg, telReg } from 'ele-admin';
+import { acceptUnpackoptions } from '@/enum/dict';
+import inventoryTable from '@/BIZComponents/inventoryTable.vue';
 
-  import { categoryData } from 'element-china-category-data';
-  import fileUpload from '@/components/upload/fileUpload';
-  import { cityData } from 'ele-admin/packages/utils/regions';
-  import dictMixins from '@/mixins/dictMixins';
-  import deptSelect from '@/components/CommomSelect/dept-select.vue';
-  import personSelect from '@/components/CommomSelect/person-select.vue';
-  import parentList from '@/views/saleManage/contact/components/parentList.vue';
-  import {
-    getDetail,
-    UpdateInformation,
-    addInformation,
-    submit
-  } from '@/api/saleManage/quotation';
-  import {
-    getOpportunityDetail,
-    isHasGeneratedQuoteAPI
-  } from '@/api/saleManage/businessOpportunity';
-  import { getTableList } from '@/api/saleManage/businessOpportunity';
-  import { enterprisePage } from '@/api/contractManage/contractBook';
-  import { getcontactlink } from '@/api/saleManage/businessFollow';
-  import headList from '@/BIZComponents/user-select/user-select.vue';
-  import { copyObj } from '@/utils/util';
-  import {
-    contactDetail,
-    updateRelationStatus
-  } from '@/api/saleManage/contact';
-  // import fileMain from '@/components/addDoc/index.vue';
-  import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
+import { categoryData } from 'element-china-category-data';
+import fileUpload from '@/components/upload/fileUpload';
+import { cityData } from 'ele-admin/packages/utils/regions';
+import dictMixins from '@/mixins/dictMixins';
+import deptSelect from '@/components/CommomSelect/dept-select.vue';
+import personSelect from '@/components/CommomSelect/person-select.vue';
+import parentList from '@/views/saleManage/contact/components/parentList.vue';
+import {
+  getDetail,
+  UpdateInformation,
+  addInformation,
+  submit
+} from '@/api/saleManage/quotation';
+import {
+  getOpportunityDetail,
+  isHasGeneratedQuoteAPI
+} from '@/api/saleManage/businessOpportunity';
+import { getTableList } from '@/api/saleManage/businessOpportunity';
+import { enterprisePage } from '@/api/contractManage/contractBook';
+import { getcontactlink } from '@/api/saleManage/businessFollow';
+import headList from '@/BIZComponents/user-select/user-select.vue';
+import { copyObj } from '@/utils/util';
+import { contactDetail, updateRelationStatus } from '@/api/saleManage/contact';
+// import fileMain from '@/components/addDoc/index.vue';
+import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
 
-  export default {
-    props: {
-      categoryTreeList: Array,
-      contactData: {
-        default: () => {
-          return {};
-        }
-      },
-      businessOpportunityData: {
-        default: () => {
-          return {};
-        }
+export default {
+  props: {
+    categoryTreeList: Array,
+    contactData: {
+      default: () => {
+        return {};
       }
     },
-    mixins: [dictMixins],
-    components: {
-      processSubmitDialog,
-      // fileMain,
-      fileUpload,
-      headList,
-      inventoryTable,
-      deptSelect,
-      parentList,
-      personSelect
-    },
-    data() {
-      let formDef = {
-        id: '',
-        acceptUnpack: 1,
-        askFile: [],
-        contactAddress: '',
-        opportunityId: '',
-        contactEmail: '',
-        contactFax: '',
-        contactId: '',
-        contactLinkId: '',
-        contactLinkName: '',
-        contactName: '',
-        contactTel: '',
-        deliveryDate: '',
-        settlementMode: '',
-        settlementModeName: '',
-        quoteAddress: '',
-        quoteEmail: '',
-        quoteFax: '',
-        quoteLinkId: '',
-        quoteLinkName: '',
-        quoteName: '',
-        quoteTel: '',
-        taxRate: null,
-        totalPrice: null,
-        opportunityType: null
-      };
+    businessOpportunityData: {
+      default: () => {
+        return {};
+      }
+    }
+  },
+  mixins: [dictMixins],
+  components: {
+    processSubmitDialog,
+    // fileMain,
+    fileUpload,
+    headList,
+    inventoryTable,
+    deptSelect,
+    parentList,
+    personSelect
+  },
+  data() {
+    let formDef = {
+      id: '',
+      acceptUnpack: 1,
+      askFile: [],
+      contactAddress: '',
+      opportunityId: '',
+      contactEmail: '',
+      contactFax: '',
+      contactId: '',
+      contactLinkId: '',
+      contactLinkName: '',
+      contactName: '',
+      contactTel: '',
+      deliveryDate: '',
+      settlementMode: '',
+      settlementModeName: '',
+      quoteAddress: '',
+      quoteEmail: '',
+      quoteFax: '',
+      quoteLinkId: '',
+      quoteLinkName: '',
+      quoteName: '',
+      quoteTel: '',
+      taxRate: null,
+      totalPrice: null,
+      opportunityType: null
+    };
 
-      return {
-        fullscreen: false,
-        cacheKeyUrl: 'eos-saleManage-quotation-inventoryTable',
-        opportunityTypeList: [
-          { label: '有', value: 1 },
-          { label: '无', value: 0 }
+    return {
+      fullscreen: false,
+      cacheKeyUrl: 'eos-saleManage-quotation-inventoryTable',
+      opportunityTypeList: [
+        { label: '有', value: 1 },
+        { label: '无', value: 0 }
+      ],
+      payWayOptions: [],
+      delDetailIds: [],
+      linkNameOptions: [],
+      acceptUnpackoptions,
+      visible: false,
+      processSubmitDialogFlag: false,
+      title: '',
+      row: {},
+      activeName: 'base',
+      formDef,
+      form: copyObj(formDef),
+      // removeBankList: [],
+      // removeLinkList: [],
+      tableBankData: [],
+      tableLinkData: [],
+      businessList: [], //商机列表
+      rules: {
+        // opportunityId: [
+        //   { required: true, message: '请选择关联商机', trigger: 'change' }
+        // ],
+        contactName: [
+          { required: true, message: '请选择客户', trigger: 'change' }
         ],
-        payWayOptions: [],
-        delDetailIds: [],
-        linkNameOptions: [],
-        acceptUnpackoptions,
-        visible: false,
-        processSubmitDialogFlag: false,
-        title: '',
-        row: {},
-        activeName: 'base',
-        formDef,
-        form: copyObj(formDef),
-        // removeBankList: [],
-        // removeLinkList: [],
-        tableBankData: [],
-        tableLinkData: [],
-        businessList: [], //商机列表
-        rules: {
-          // opportunityId: [
-          //   { required: true, message: '请选择关联商机', trigger: 'change' }
-          // ],
-          contactName: [
-            { required: true, message: '请选择客户', trigger: 'change' }
-          ],
-          name: [
-            { required: true, message: '请输入客户名称', trigger: 'blur' }
-          ],
-          contactLinkName: [
-            { required: true, message: '请选择联系人', trigger: 'change' }
-          ],
-          acceptUnpack: [
-            { required: true, message: '请选择是否接受', trigger: 'change' }
-          ],
-          contactTel: [
-            // {
-            //   required: true,
-            //   pattern: phoneReg,
-            //   message: '请输入联系电话',
-            //   trigger: 'blur'
-            // },
-            {
-              required: true,
-              pattern: telReg,
-              message: '请输入联系电话',
-              trigger: 'blur'
-            }
-          ],
-          deliveryDate: [
-            { required: true, message: '请选择交货日期', trigger: 'change' }
-          ],
-          settlementMode: [
-            { required: true, message: '请选择结算方式', trigger: 'change' }
-          ],
-          quoteLinkName: [
-            { required: true, message: '请输入报价方联系人', trigger: 'change' }
-          ],
-          quoteName: [
-            { required: true, message: '请输入报价方名称', trigger: 'blur' }
-          ],
-          quoteTel: [
-            {
-              required: true,
-              pattern: telReg,
-              message: '请输入报价方联系电话',
-              trigger: 'blur'
-            }
-          ],
-          quoteEmail: [
-            { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
-          ],
-          contactEmail: [
-            { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
-          ],
-          taxRate: [
-            { pattern: numberReg, message: '请输入数字', trigger: 'blur' }
-          ]
-        },
-        businessId: '',
-        options: {
-          cityData,
-          categoryData
-        },
-        // 提交状态
-        loading: false,
-        // 是否是修改
-        isUpdate: false,
-
-        // 组织机构树形结构数据
-        groupTreeData: [],
-        // 组织机构平铺数据
-        groupData: [],
-        enterprisePage: []
-      };
-    },
-    created() {
-      this.getEnterprisePage();
-    },
-
-    methods: {
-      opportunityTypeChange() {
-        if (this.form.opportunityType === 0) {
-          this.form.opportunityId = '';
-        }
-      },
-      //获取详情
-      async getDetailData(id) {
-        this.businessId = id;
-        this.loading = true;
-        const data = await getDetail(id);
-        this.loading = false;
-        if (data) {
-          this.$nextTick(() => {
-            this.form = data;
-            // if (data.askFile !== '') {
-            //   this.$set(this.form, 'askFile', [data?.askFile]);
-            // }
-            if (data.opportunityId) {
-              this.form.opportunityType = 1;
-            }
-            this.$refs.inventoryTable &&
-              this.$refs.inventoryTable.putTableValue(data);
-            this.getLinkInfo(data.contactId);
-            this.getBusinessList(data.contactId);
-          });
-        }
-      },
-      async opportunityChange(id) {
-        //是否生成过报价单
-        let res = await isHasGeneratedQuoteAPI(id);
-        if (res) this.$message.warning('该商机已生成过报价单,请注意。');
-        //获取台账库存
-        getOpportunityDetail(id).then((res) => {
-          if (res.productList.length > 0) {
-            this.$refs.inventoryTable &&
-              this.$refs.inventoryTable.putTableValue(res);
+        name: [{ required: true, message: '请输入客户名称', trigger: 'blur' }],
+        contactLinkName: [
+          { required: true, message: '请选择联系人', trigger: 'change' }
+        ],
+        acceptUnpack: [
+          { required: true, message: '请选择是否接受', trigger: 'change' }
+        ],
+        contactTel: [
+          // {
+          //   required: true,
+          //   pattern: phoneReg,
+          //   message: '请输入联系电话',
+          //   trigger: 'blur'
+          // },
+          {
+            required: true,
+            pattern: telReg,
+            message: '请输入联系电话',
+            trigger: 'blur'
           }
-        });
+        ],
+        deliveryDate: [
+          { required: true, message: '请选择交货日期', trigger: 'change' }
+        ],
+        settlementMode: [
+          { required: true, message: '请选择结算方式', trigger: 'change' }
+        ],
+        quoteLinkName: [
+          { required: true, message: '请输入报价方联系人', trigger: 'change' }
+        ],
+        quoteName: [
+          { required: true, message: '请输入报价方名称', trigger: 'blur' }
+        ],
+        quoteTel: [
+          {
+            required: true,
+            pattern: telReg,
+            message: '请输入报价方联系电话',
+            trigger: 'blur'
+          }
+        ],
+        quoteEmail: [
+          { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
+        ],
+        contactEmail: [
+          { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
+        ],
+        taxRate: [
+          { pattern: numberReg, message: '请输入数字', trigger: 'blur' }
+        ]
+      },
+      businessId: '',
+      options: {
+        cityData,
+        categoryData
       },
+      // 提交状态
+      loading: false,
+      // 是否是修改
+      isUpdate: false,
 
-      //更新联系人数据
-      async getLinkInfo(contactId) {
-        const data = await getcontactlink({ contactId });
-        if (data && data?.length) {
-          this.linkNameOptions = data;
+      // 组织机构树形结构数据
+      groupTreeData: [],
+      // 组织机构平铺数据
+      groupData: [],
+      enterprisePage: []
+    };
+  },
+  created() {
+    this.getEnterprisePage();
+  },
 
-          let firstLink =
-            this.linkNameOptions.find((item) => item.ifChief == 1) || {};
-          this.form = Object.assign({}, this.form, {
-            contactLinkId: firstLink.id || this.linkNameOptions[0]?.id,
-            contactLinkName:
-              firstLink.linkName || this.linkNameOptions[0]?.linkName,
-            contactTel:
-              firstLink.mobilePhone || this.linkNameOptions[0]?.mobilePhone,
-            contactEmail: firstLink.email || this.linkNameOptions[0]?.email
-          });
-          console.log(this.form);
+  methods: {
+    opportunityTypeChange() {
+      if (this.form.opportunityType === 0) {
+        this.form.opportunityId = '';
+      }
+    },
+    //获取详情
+    async getDetailData(id) {
+      this.businessId = id;
+      this.loading = true;
+      const data = await getDetail(id);
+      this.loading = false;
+      if (data) {
+        this.$nextTick(() => {
+          this.form = data;
+          // if (data.askFile !== '') {
+          //   this.$set(this.form, 'askFile', [data?.askFile]);
+          // }
+          if (data.opportunityId) {
+            this.form.opportunityType = 1;
+          }
+          this.$refs.inventoryTable &&
+            this.$refs.inventoryTable.putTableValue(data);
+          this.getLinkInfo(data.contactId);
+          this.getBusinessList(data.contactId);
+        });
+      }
+    },
+    async opportunityChange(id) {
+      //是否生成过报价单
+      let res = await isHasGeneratedQuoteAPI(id);
+      if (res) this.$message.warning('该商机已生成过报价单,请注意。');
+      //获取台账库存
+      getOpportunityDetail(id).then((res) => {
+        if (res.productList.length > 0) {
+          this.$refs.inventoryTable &&
+            this.$refs.inventoryTable.putTableValue(res);
         }
-      },
+      });
+    },
 
+    //更新联系人数据
+    async getLinkInfo(contactId) {
+      const data = await getcontactlink({ contactId });
+      if (data && data?.length) {
+        this.linkNameOptions = data;
 
-      //获取客户的商机列表
-      async getBusinessList(id) {
-        if (!this.form.contactId)
-          return this.$message.error('请先选择询价方名称');
-        const data = await getTableList({
-          pageNum: 1,
-          size: 30,
-          contactId: id,
-          approvalStatus: 2,
-          status: 1
-        });
-        this.businessList = data.list;
-      },
-      //选择下拉框
-      onchangeLink(selectedOptions) {
-        const option = this.linkNameOptions.find(
-          (opt) => opt.id === selectedOptions
-        );
+        let firstLink =
+          this.linkNameOptions.find((item) => item.ifChief == 1) || {};
         this.form = Object.assign({}, this.form, {
-          contactEmail: option?.email,
-          contactLinkName: option?.linkName || '',
-          contactTel: option?.mobilePhone || option?.phone || '',
-          contactLinkId: option?.id
-        });
-      },
-      handHead() {
-        let item = {
-          id: this.form.quoteLinkId
-        };
-        this.$refs.headRef.open(item);
-      },
-      //选择报价方人回调
-      changePersonel(obj, index) {
-        this.$set(this.form, 'quoteLinkId', obj.id);
-        this.$set(this.form, 'quoteLinkName', obj.name);
-        this.$set(this.form, 'quoteTel', obj.phone);
-        this.$set(this.form, 'quoteEmail', obj.email);
-      },
-      //选择客户回调
-      async changeParent(obj, type) {
-        const { base, other } = await contactDetail(obj.id);
-        this.form = Object.assign({}, this.form, {
-          contactId: base.id,
-          contactName: base.name,
-          contactAddress: other.addressName + other.address,
-          contactLinkId: '',
-          contactLinkName: '',
-          contactEmail: '',
-          contactTel: '',
-          customerMark: base.serialNo
+          contactLinkId: firstLink.id || this.linkNameOptions[0]?.id,
+          contactLinkName:
+            firstLink.linkName || this.linkNameOptions[0]?.linkName,
+          contactTel:
+            firstLink.mobilePhone || this.linkNameOptions[0]?.mobilePhone,
+          contactEmail: firstLink.email || this.linkNameOptions[0]?.email
         });
+        console.log(this.form);
+      }
+    },
+
+    //获取客户的商机列表
+    async getBusinessList(id) {
+      if (!this.form.contactId)
+        return this.$message.error('请先选择询价方名称');
+      const data = await getTableList({
+        pageNum: 1,
+        size: 30,
+        contactId: id,
+        approvalStatus: 2,
+        status: 1
+      });
+      this.businessList = data.list;
+    },
+   queryContactLink(queryString, callback) {
+    const filtered = queryString
+      ? this.linkNameOptions.filter(item => 
+          item.linkName.toLowerCase().includes(queryString.toLowerCase())
+        )
+      : this.linkNameOptions;
+    callback(filtered.map(item => ({ ...item, value: item.linkName })));
+  },
+
+  handleContactSelect(selectedItem) {
+    this.form.contactLinkId = selectedItem.id;
+    this.form.contactTel = selectedItem.mobilePhone || selectedItem.phone || '';
+    this.form.contactEmail = selectedItem.email || '';
+  },
+
+  handleContactInput() {
+    const isExist = this.linkNameOptions.some(
+      item => item.linkName === this.form.contactLinkName
+    );
+    if (!isExist) {
+      this.form.contactLinkId = ''; // 手动输入时无对应ID
+    }
+  },
+    handHead() {
+      let item = {
+        id: this.form.quoteLinkId
+      };
+      this.$refs.headRef.open(item);
+    },
+    //选择报价方人回调
+    changePersonel(obj, index) {
+      this.$set(this.form, 'quoteLinkId', obj.id);
+      this.$set(this.form, 'quoteLinkName', obj.name);
+      this.$set(this.form, 'quoteTel', obj.phone);
+      this.$set(this.form, 'quoteEmail', obj.email);
+    },
+    //选择客户回调
+    async changeParent(obj, type) {
+      const { base, other } = await contactDetail(obj.id);
+      this.form = Object.assign({}, this.form, {
+        contactId: base.id,
+        contactName: base.name,
+        contactAddress: other.addressName + other.address,
+        contactLinkId: '',
+        contactLinkName: '',
+        contactEmail: '',
+        contactTel: '',
+        customerMark: base.serialNo
+      });
 
-        this.getLinkInfo(obj.id);
-        this.getBusinessList(base.id);
-        if (type == 'init') {
-          return;
+      this.getLinkInfo(obj.id);
+      this.getBusinessList(base.id);
+      if (type == 'init') {
+        return;
+      }
+      this.$nextTick(() => {
+        if (this.form.opportunityType == 1) {
+          this.$refs.inventoryTable.putTableValue([]);
+          this.form.opportunityId = '';
         }
-        this.$nextTick(() => {
-          if (this.form.opportunityType == 1) {
-            this.$refs.inventoryTable.putTableValue([]);
-            this.form.opportunityId = '';
-          }
-          this.$refs.inventoryTable.setCustomerMark(base.serialNo);
-        });
-      },
+        this.$refs.inventoryTable.setCustomerMark(base.serialNo);
+      });
+    },
 
-      handParent() {
-        let item = {
-          id: this.form.contactId
-        };
-        this.$refs.parentRef.open(item);
-      },
+    handParent() {
+      let item = {
+        id: this.form.contactId
+      };
+      this.$refs.parentRef.open(item);
+    },
 
-      async open(type, row, contactCategoryId) {
-        this.title = type === 'add' ? '新增' : '修改';
-        this.row = row;
-        this.visible = true;
-        if (this.enterprisePage.length == 0) {
-          await this.getEnterprisePage();
+    async open(type, row, contactCategoryId) {
+      this.title = type === 'add' ? '新增' : '修改';
+      this.row = row;
+      this.visible = true;
+      if (this.enterprisePage.length == 0) {
+        await this.getEnterprisePage();
+      }
+      if (type == 'add') {
+        let userInfo = this.$store.getters.user.info;
+        this.isUpdate = false;
+        userInfo.id = userInfo.userId;
+        this.form.settlementMode = '3';
+        this.changePersonel(userInfo);
+        if (this.enterprisePage.length > 0) {
+          this.form.quoteName = this.enterprisePage[0].name;
+          // this.form.quoteTel = this.enterprisePage[0].tel;
+          this.form.quoteFax = this.enterprisePage[0].fax;
+          this.form.quoteAddress = this.enterprisePage[0].address;
         }
-        if (type == 'add') {
-          let userInfo = this.$store.getters.user.info;
-          this.isUpdate = false;
-          userInfo.id = userInfo.userId;
-          this.form.settlementMode = '3';
-          this.changePersonel(userInfo);
-          if (this.enterprisePage.length > 0) {
-            this.form.quoteName = this.enterprisePage[0].name;
-            // this.form.quoteTel = this.enterprisePage[0].tel;
-            this.form.quoteFax = this.enterprisePage[0].fax;
-            this.form.quoteAddress = this.enterprisePage[0].address;
-          }
-          if (this.contactData.id) {
-            this.changeParent({ id: this.contactData.id }, 'init');
-          }
-          if (this.businessOpportunityData.id) {
-            this.form.opportunityId = this.businessOpportunityData.id;
-            await this.opportunityChange(this.businessOpportunityData.id);
-            this.form.opportunityType = 1;
-            this.changeParent(
-              { id: this.businessOpportunityData.contactId },
-              'init'
-            );
-          }
-          if (row.id) {
-            this.form.opportunityId = row.id;
-            await this.opportunityChange(row.id);
-            this.form.opportunityType = 1;
-            this.changeParent({ id: row.contactId }, 'init');
-          }
-        } else {
-          this.isUpdate = true;
-          await this.getDetailData(row.id);
+        if (this.contactData.id) {
+          this.changeParent({ id: this.contactData.id }, 'init');
         }
-      },
-      getEnterprisePage() {
-        enterprisePage({
-          pageNum: 1,
-          size: 100
-        }).then((res) => {
-          this.enterprisePage = [];
-          this.enterprisePage.push(...res.list);
-        });
-      },
-      getEnterprise() {
-        let data = this.enterprisePage.find(
-          (item) => item.name == this.form.quoteName
-        );
-        this.form.quoteName = data.name;
+        if (this.businessOpportunityData.id) {
+          this.form.opportunityId = this.businessOpportunityData.id;
+          await this.opportunityChange(this.businessOpportunityData.id);
+          this.form.opportunityType = 1;
+          this.changeParent(
+            { id: this.businessOpportunityData.contactId },
+            'init'
+          );
+        }
+        if (row.id) {
+          this.form.opportunityId = row.id;
+          await this.opportunityChange(row.id);
+          this.form.opportunityType = 1;
+          this.changeParent({ id: row.contactId }, 'init');
+        }
+      } else {
+        this.isUpdate = true;
+        await this.getDetailData(row.id);
+      }
+    },
+    getEnterprisePage() {
+      enterprisePage({
+        pageNum: 1,
+        size: 100
+      }).then((res) => {
+        this.enterprisePage = [];
+        this.enterprisePage.push(...res.list);
+      });
+    },
+    getEnterprise() {
+      let data = this.enterprisePage.find(
+        (item) => item.name == this.form.quoteName
+      );
+      this.form.quoteName = data.name;
 
-        // this.form.quoteTel = data.tel;
-        this.form.quoteFax = data.fax;
-        this.form.quoteAddress = data.address;
-      },
-      salesmanChange(val, info) {
-        this.otherForm.salesmanName = info.name;
-      },
+      // this.form.quoteTel = data.tel;
+      this.form.quoteFax = data.fax;
+      this.form.quoteAddress = data.address;
+    },
+    salesmanChange(val, info) {
+      this.otherForm.salesmanName = info.name;
+    },
 
-      ifChiefChange(value, idx) {
-        if (value === 1) {
-          this.tableLinkData.forEach((e) => (e.ifChief = 0));
-          this.tableLinkData[idx].ifChief = 1;
+    ifChiefChange(value, idx) {
+      if (value === 1) {
+        this.tableLinkData.forEach((e) => (e.ifChief = 0));
+        this.tableLinkData[idx].ifChief = 1;
+      }
+    },
+
+    // getValidate() {
+    //   return new Promise((resolve, reject) => {
+    //     this.$refs.form.validate((valid) => {
+    //       if (!valid) {
+    //         reject(false);
+    //       } else {
+    //         resolve(true);
+    //       }
+    //     });
+    //   });
+    // },
+    getValidate() {
+      return Promise.all([
+        new Promise((resolve, reject) => {
+          this.$refs.form.validate((valid) => {
+            if (!valid) {
+              reject(false);
+            } else {
+              resolve(true);
+            }
+          });
+        }),
+        new Promise((resolve, reject) => {
+          this.$refs.inventoryTable.validateForm((valid) => {
+            if (!valid) {
+              reject(false);
+            } else {
+              resolve(true);
+            }
+          });
+        })
+      ]);
+    },
+    async save(type) {
+      try {
+        await this.getValidate();
+        // 表单验证通过,执行保存操作
+        this.loading = true;
+
+        if (!this.isUpdate) {
+          delete this.form.id;
         }
-      },
+        let settlementModeName = this.getDictValue(
+          '结算方式',
+          this.form.settlementMode
+        );
 
-      // getValidate() {
-      //   return new Promise((resolve, reject) => {
-      //     this.$refs.form.validate((valid) => {
-      //       if (!valid) {
-      //         reject(false);
-      //       } else {
-      //         resolve(true);
-      //       }
-      //     });
-      //   });
-      // },
-      getValidate() {
-        return Promise.all([
-          new Promise((resolve, reject) => {
-            this.$refs.form.validate((valid) => {
-              if (!valid) {
-                reject(false);
-              } else {
-                resolve(true);
+        let commitData = Object.assign({}, this.form, {
+          settlementModeName,
+          quoteProductList: this.$refs.inventoryTable.getTableValue(),
+          totalPrice: this.$refs.inventoryTable.getPrice()[0]
+        });
+        if (this.isUpdate) {
+          UpdateInformation(commitData)
+            .then((res) => {
+              this.loading = false;
+              updateRelationStatus([this.form.contactId]);
+              if (type === 'sub') {
+                this.quotationSubmit(res);
+                return;
               }
+              this.$message.success('修改成功');
+              this.cancel();
+              this.$emit('done');
+            })
+            .catch((e) => {
+              //this.loading = false;
             });
-          }),
-          new Promise((resolve, reject) => {
-            this.$refs.inventoryTable.validateForm((valid) => {
-              if (!valid) {
-                reject(false);
-              } else {
-                resolve(true);
+        } else {
+          addInformation(commitData)
+            .then((res) => {
+              this.loading = false;
+              updateRelationStatus([this.form.contactId]);
+              if (type === 'sub') {
+                this.quotationSubmit(res);
+                return;
               }
+              this.$message.success('新增成功');
+              this.cancel();
+              this.$emit('done');
+            })
+            .catch((e) => {
+              //this.loading = false;
             });
-          })
-        ]);
-      },
-      async save(type) {
-        try {
-          await this.getValidate();
-          // 表单验证通过,执行保存操作
-          this.loading = true;
-
-          if (!this.isUpdate) {
-            delete this.form.id;
-          }
-          let settlementModeName = this.getDictValue(
-            '结算方式',
-            this.form.settlementMode
-          );
-
-          let commitData = Object.assign({}, this.form, {
-            settlementModeName,
-            quoteProductList: this.$refs.inventoryTable.getTableValue(),
-            totalPrice: this.$refs.inventoryTable.getPrice()[0]
-          });
-          if (this.isUpdate) {
-            UpdateInformation(commitData)
-              .then((res) => {
-                this.loading = false;
-                updateRelationStatus([this.form.contactId]);
-                if (type === 'sub') {
-                  this.quotationSubmit(res);
-                  return;
-                }
-                this.$message.success('修改成功');
-                this.cancel();
-                this.$emit('done');
-              })
-              .catch((e) => {
-                //this.loading = false;
-              });
-          } else {
-            addInformation(commitData)
-              .then((res) => {
-                this.loading = false;
-                updateRelationStatus([this.form.contactId]);
-                if (type === 'sub') {
-                  this.quotationSubmit(res);
-                  return;
-                }
-                this.$message.success('新增成功');
-                this.cancel();
-                this.$emit('done');
-              })
-              .catch((e) => {
-                //this.loading = false;
-              });
-          }
-        } catch (error) {
-          console.log(error);
-          // 表单验证未通过,不执行保存操作
         }
-      },
-      async quotationSubmit(res) {
-        const data = await getDetail(this.businessId || res);
-        this.processSubmitDialogFlag = true;
-        this.$nextTick(() => {
-          let params = {
-            businessId: this.businessId || res,
-            businessKey: 'quote_approve',
-            formCreateUserId: data.createUserId,
-            variables: {
-              businessCode: data.code,
-              businessName: data.contactName,
-              businessType: '报价单'
-            }
-            // callBackMethodType : '1',
-            // callBackMethod : 'proTargetPlanApproveApiImpl.updatePlanApprovalStatus',
-            // pcHandle : '/bpm/handleTask/components/project-manage/plan-manage/submit.vue',
-            // pcView : '/bpm/handleTask/components/project-manage/plan-manage/detailDialog.vue',
-            // miniHandle : '',
-            // miniView : '',
-          };
+      } catch (error) {
+        console.log(error);
+        // 表单验证未通过,不执行保存操作
+      }
+    },
+    async quotationSubmit(res) {
+      const data = await getDetail(this.businessId || res);
+      this.processSubmitDialogFlag = true;
+      this.$nextTick(() => {
+        let params = {
+          businessId: this.businessId || res,
+          businessKey: 'quote_approve',
+          formCreateUserId: data.createUserId,
+          variables: {
+            businessCode: data.code,
+            businessName: data.contactName,
+            businessType: '报价单'
+          }
+          // callBackMethodType : '1',
+          // callBackMethod : 'proTargetPlanApproveApiImpl.updatePlanApprovalStatus',
+          // pcHandle : '/bpm/handleTask/components/project-manage/plan-manage/submit.vue',
+          // pcView : '/bpm/handleTask/components/project-manage/plan-manage/detailDialog.vue',
+          // miniHandle : '',
+          // miniView : '',
+        };
 
-          this.$refs.processSubmitDialogRef.init(params);
-        });
+        this.$refs.processSubmitDialogRef.init(params);
+      });
 
-        // submit({
-        //   businessId: this.businessId || res
-        // }).then((res) => {
-        //   this.cancel();
-        //   this.$emit('done');
-        // });
-      },
-      reload() {
-        this.cancel();
-        this.$emit('done');
-      },
-      cancel() {
-        this.$nextTick(() => {
-          this.activeName = 'base';
-          // 关闭后,销毁所有的表单数据
-          this.$refs['otherForm'] && this.$refs['otherForm'].resetFields();
-          this.$refs['formRef'] && this.$refs['formRef'].resetFields();
-          this.form = copyObj(this.formDef);
-          this.visible = false;
-        });
-      }
+      // submit({
+      //   businessId: this.businessId || res
+      // }).then((res) => {
+      //   this.cancel();
+      //   this.$emit('done');
+      // });
+    },
+    reload() {
+      this.cancel();
+      this.$emit('done');
+    },
+    cancel() {
+      this.$nextTick(() => {
+        this.activeName = 'base';
+        // 关闭后,销毁所有的表单数据
+        this.$refs['otherForm'] && this.$refs['otherForm'].resetFields();
+        this.$refs['formRef'] && this.$refs['formRef'].resetFields();
+        this.form = copyObj(this.formDef);
+        this.visible = false;
+      });
     }
-  };
+  }
+};
 </script>
 <style scoped lang="scss">
-  .TotalAmount {
-    font-size: 16px;
-    padding-right: 30px;
-  }
+.TotalAmount {
+  font-size: 16px;
+  padding-right: 30px;
+}
 </style>

+ 8 - 0
src/views/salesServiceManagement/vehiclerecord/index.vue

@@ -76,6 +76,14 @@ export default {
           showOverflowTooltip: true,
           minWidth: 200
         },
+        {
+          slot: 'workOrderCode',
+          prop: 'workOrderCode',
+          label: '售后工单编码',
+          align: 'center',
+          showOverflowTooltip: true,
+          minWidth: 200
+        },
         {
           prop: 'pieCarType',
           label: '派车类型',