Просмотр исходного кода

refactor(发票管理): 增加收付款列表弹窗

liujt 6 месяцев назад
Родитель
Сommit
01d8d1b464

+ 2504 - 0
src/BIZComponents/inventoryTableNew.vue

@@ -0,0 +1,2504 @@
+<template>
+  <el-form ref="form" :model="form" :rules="rules">
+    <ele-pro-table
+      ref="table"
+      :needPage="false"
+      :columns="columns"
+      :datasource="form.datasource"
+      class="time-form"
+      height="300"
+      full-height="calc(100vh - 76px)"
+      @columns-change="handleColumnChange"
+      :cache-key="cacheKeyUrl"
+      :selection.sync="selection"
+    >
+      <!-- 表头工具栏 -->
+      <template v-slot:toolbar>
+        <div class="headbox">
+          <div>
+            <el-button
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              @click="handParent('', -1)"
+            >
+              新增
+            </el-button>
+            <el-button
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              v-if="isGoods"
+              @click="handGoods(-1)"
+            >
+              选择商品
+            </el-button>
+            <el-button
+              size="small"
+              type="primary"
+              icon="el-icon-plus"
+              class="ele-btn-icon"
+              v-if="isTemporary"
+              @click="handlAdd"
+            >
+              新增临时产品
+            </el-button>
+            <el-button
+              size="small"
+              type="primary"
+              class="ele-btn-icon"
+              @click="save"
+              v-if="isDrawer"
+            >
+              保存
+            </el-button>
+            <setAllValue
+              :disabled="!selection.length"
+              title="客户期望交期"
+              @success="setAllValueChange"
+              valueKey="customerExpectDeliveryDeadline"
+            />
+            <setAllValue
+              :disabled="!selection.length"
+              title="生产交付交期"
+              valueKey="produceDeliveryDeadline"
+              @success="setAllValueChange"
+            />
+          </div>
+          <div class="pricebox">
+            <span class="amount">总计:{{ allPrice }}元</span>
+
+            <el-form-item
+              style="width: 300px"
+              v-if="isDiscountTotalPrice"
+              label="优惠后总金额:"
+              prop="discountTotalPrice"
+              :rules="{
+                required: true,
+                message: '请输入优惠后总金额',
+                trigger: 'change'
+              }"
+            >
+              <el-input
+                type="number"
+                :min="0"
+                :max="allPrice"
+                :disabled="!allPrice"
+                v-model="form.discountTotalPrice"
+                style="width: 180px"
+                placeholder="请输入"
+                @input="discountInputByOrder(form.discountTotalPrice)"
+              >
+                <template slot="append">元</template>
+              </el-input>
+            </el-form-item>
+          </div>
+        </div>
+      </template>
+      <template v-slot:productName="{ row, $index }">
+        <el-form-item
+          :prop="'datasource.' + $index + '.productName'"
+          :rules="{
+            required: true,
+            message: '请输入',
+            trigger: 'change'
+          }"
+        >
+          <el-input
+            :disabled="!!row.productId && row.productId != 0"
+            v-model="row.productName"
+            placeholder="请输入"
+            style="width: 60%; margin-right: 10px"
+          ></el-input>
+          <el-button
+            size="small"
+            type="primary"
+            @click.native="handParent(row, $index)"
+            >选择
+          </el-button>
+        </el-form-item>
+      </template>
+      <template v-slot:entrustedEnterpriseId="scope">
+        <el-form-item prop="entrustedEnterpriseId">
+          <el-select
+            v-model="scope.row.entrustedEnterpriseId"
+            clearable
+            filterable
+          >
+            <el-option
+              v-for="i in scope.row.entrustedEnterpriseIdList"
+              :key="i.id"
+              :value="i.id"
+              :label="i.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </template>
+      <template v-slot:headerCustomerMark="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+      <template v-slot:customerMark="{ row, $index }">
+        <el-form-item
+          :prop="'datasource.' + $index + '.customerMark'"
+          :rules="{
+            required: isCustomerMark ? true : false,
+            message: '请输入客户代号',
+            trigger: 'change'
+          }"
+        >
+          <el-input
+            v-model="row.customerMark"
+            :disabled="quoteType === 2"
+            placeholder="请输入"
+          ></el-input>
+        </el-form-item>
+      </template>
+
+      <template v-slot:headerProductName="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+
+      <template v-slot:productCode="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.productCode'">
+          <el-input
+            v-model="scope.row.productCode"
+            :disabled="
+              quoteType != 2 ||
+              (!!scope.row.productId && scope.row.productId != 0)
+            "
+          ></el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:productCategoryName="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.productCategoryName'"
+        >
+          <el-input v-model="scope.row.productCategoryName" disabled></el-input>
+        </el-form-item>
+      </template>
+
+      <template v-slot:headerTotalCount="{ column }">
+        <span :class="{ 'is-required': isTotalCount }">{{ column.label }}</span>
+      </template>
+      <template v-slot:headerTaxRate="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+      <template v-slot:totalPrice="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.totalPrice'">
+          {{ (Number(scope.row.totalPrice) || 0).toFixed(2) }}元
+        </el-form-item>
+      </template>
+
+      <template v-slot:productBrand="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.productBrand'">
+          <el-input
+            v-model="scope.row.productBrand"
+            :disabled="!!scope.row.productId && scope.row.productId != 0"
+          ></el-input>
+        </el-form-item>
+      </template>
+
+      <template v-slot:modelType="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.modelType'">
+          <el-input
+            v-model="scope.row.modelType"
+            :disabled="!!scope.row.productId && scope.row.productId != 0"
+          ></el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:specification="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.specification'">
+          <el-input
+            v-model="scope.row.specification"
+            :disabled="!!scope.row.productId && scope.row.productId != 0"
+          ></el-input>
+        </el-form-item>
+      </template>
+
+      <template v-slot:guaranteePeriod="scope">
+        <div class="period">
+          <div class="borderleftnone">
+            <el-form-item
+              :prop="'datasource.' + scope.$index + '.guaranteePeriod'"
+              :rules="{
+                pattern: numberReg,
+                message: '请输入有效期',
+                trigger: 'blur'
+              }"
+            >
+              <el-input
+                v-model="scope.row.guaranteePeriod"
+                @change="
+                  setDeliveryDays(scope.row, scope.$index, 'guaranteePeriod')
+                "
+                placeholder="请输入"
+              ></el-input>
+            </el-form-item>
+          </div>
+          <div class="borderrightnone">
+            <DictSelection
+              dictName="质保期单位"
+              clearable
+              v-model="scope.row.guaranteePeriodUnitCode"
+              @change="
+                setDeliveryDays(scope.row, scope.$index, 'guaranteePeriod')
+              "
+              :isOne="scope.$index === 0"
+            >
+            </DictSelection>
+          </div>
+        </div>
+      </template>
+      <!-- <template v-slot:measuringUnit="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.measuringUnit'">
+          <el-input
+            v-model="scope.row.measuringUnit"
+            :disabled="!!scope.row.productCode"
+            placeholder="请输入"
+          ></el-input>
+        </el-form-item>
+      </template> -->
+      <template v-slot:remark="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.remark'">
+          <el-input
+            v-model="scope.row.remark"
+            type="textarea"
+            placeholder="请输入"
+          ></el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:singlePrice="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.singlePrice'"
+          :rules="{
+            required: quoteType !== 2 && isSinglePrice ? true : false,
+            message: '请输入单价',
+            trigger: 'change'
+          }"
+        >
+          <el-input
+            v-model="scope.row.singlePrice"
+            placeholder="请输入"
+            :disabled="quoteType === 2"
+            @input="handleCountChange(scope.row, scope.$index)"
+            type="number"
+          >
+            <template slot="append">元</template>
+          </el-input>
+        </el-form-item>
+      </template>
+
+      <template v-slot:taxRate="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.taxRate'"
+          :rules="{
+            required: isTaxRate == 1 ? true : false,
+            message: '请输入税率',
+            trigger: 'change'
+          }"
+        >
+          <el-input
+            v-model="scope.row.taxRate"
+            placeholder="请输入"
+            type="number"
+            :disabled="quoteType === 2"
+            @input="getNotaxSinglePrice"
+          >
+            <template slot="append">%</template>
+          </el-input>
+        </el-form-item>
+      </template>
+
+      <template v-slot:headerSinglePrice="{ column }">
+        <span :class="isSinglePrice ? 'is-required' : ''">{{
+          column.label
+        }}</span>
+      </template>
+      <template v-slot:headerCustomerExpectDeliveryDeadline="{ column }">
+        <span :class="isDate == 1 ? 'is-required' : ''">{{
+          column.label
+        }}</span>
+      </template>
+
+      <template v-slot:technicalAnswerName="{ row, $index }">
+        <el-form-item :prop="'datasource.' + $index + '.technicalAnswerName'">
+          <el-input
+            v-model="row.technicalAnswerName"
+            placeholder="请输入"
+            @click.native="handHead(row, $index)"
+          ></el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:technicalParams="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.technicalParams'">
+          <el-input
+            type="textarea"
+            v-model="scope.row.technicalParams"
+            placeholder="请输入"
+          ></el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:technicalDrawings="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.technicalDrawings'"
+        >
+          <fileMain v-model="scope.row.technicalDrawings"></fileMain>
+        </el-form-item>
+      </template>
+      <template v-slot:customerReqFiles="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.customerReqFiles'"
+        >
+          <fileMain v-model="scope.row.customerReqFiles"></fileMain>
+        </el-form-item>
+      </template>
+      <template v-slot:industryArtFiles="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.industryArtFiles'"
+          :rules="{
+            required: false,
+            message: '请输入',
+            trigger: 'change'
+          }"
+        >
+          <fileMain v-model="scope.row.industryArtFiles"></fileMain>
+        </el-form-item>
+      </template>
+      <template v-slot:otherFiles="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '. otherFiles'">
+          <fileMain v-model="scope.row.otherFiles"></fileMain>
+        </el-form-item>
+      </template>
+      <template v-slot:headerProduceDeliveryDeadline="{ column }">
+        <span
+          :class="isProduceDeliveryDeadline && isDate == 1 ? 'is-required' : ''"
+          >{{ column.label }}</span
+        >
+      </template>
+      <template v-slot:produceDeliveryDeadline="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.produceDeliveryDeadline'"
+          :rules="{
+            required: isProduceDeliveryDeadline && isDate == 1 ? true : false,
+            message: '选择生产交付交期',
+            trigger: 'change'
+          }"
+        >
+          <el-date-picker
+            style="width: 140px"
+            value-format="yyyy-MM-dd"
+            v-model="scope.row.produceDeliveryDeadline"
+            @change="
+              setDeliveryDays(scope.row, scope.$index, 'guaranteePeriod')
+            "
+            type="date"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </template>
+      <template v-slot:customerExpectDeliveryDeadline="scope">
+        <el-form-item
+          v-if="scope.row.arrivalWay == 1 || !scope.row.arrivalWay"
+          :rules="{
+            required: isDate == 1 && quoteType != 2 ? true : false,
+            message:
+              contractBookType == 1 ? '请选择客户期望交期' : '请选择交付日期',
+            trigger: 'change'
+          }"
+          :prop="
+            'datasource.' + scope.$index + '.customerExpectDeliveryDeadline'
+          "
+        >
+          <el-date-picker
+            style="width: 140px"
+            v-model="scope.row.customerExpectDeliveryDeadline"
+            value-format="yyyy-MM-dd"
+            @change="
+              setDeliveryDays(scope.row, scope.$index, 'guaranteePeriod')
+            "
+            type="date"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item v-if="scope.row.arrivalWay == 2">
+          <el-link
+            type="primary"
+            :underline="false"
+            @click.native="handleMethod(scope.row, scope.$index)"
+          >
+            设置分批时间
+          </el-link>
+        </el-form-item>
+      </template>
+      <template v-slot:provenance="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.provenance'">
+          <DictSelection
+            dictName="产地"
+            clearable
+            v-model="scope.row.provenance"
+            :disabled="quoteType === 2"
+            collapse-tags
+            multiple
+            :isOne="scope.$index === 0"
+          >
+          </DictSelection>
+        </el-form-item>
+      </template>
+      <template v-slot:guaranteePeriodDeadline="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.guaranteePeriodDeadline'"
+        >
+          <el-date-picker
+            style="width: 140px"
+            v-model="scope.row.guaranteePeriodDeadline"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </template>
+      <template v-slot:singleWeight="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.singleWeight'">
+          <el-input
+            v-model="scope.row.singleWeight"
+            @input="handleCountChange(scope.row, scope.$index)"
+            placeholder="请输入"
+          >
+            <template slot="append">
+              <span v-if="!!scope.row.productId && scope.row.productId != 0">
+                {{ scope.row.weightUnit }}
+              </span>
+              <el-input
+                v-else
+                v-model="scope.row.weightUnit"
+                placeholder="单位"
+                style="width: 80px; padding: 0"
+              ></el-input>
+            </template>
+          </el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:totalWeight="scope">
+        <el-form-item
+          style="margin-bottom: 20px"
+          :rules="{
+            required: false,
+            pattern: numberReg,
+            trigger: 'change'
+          }"
+          :prop="'datasource.' + scope.$index + '.totalWeight'"
+        >
+          <el-input
+            v-model="scope.row.totalWeight"
+            @input="handleCountChange(scope.row, scope.$index, 'totalWeight')"
+            placeholder="请输入"
+          >
+            <template slot="append">
+              {{ scope.row.weightUnit }}
+            </template>
+          </el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:increaseTotalWeight="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.increaseTotalWeight'"
+        >
+          <el-input
+            v-model="scope.row.increaseTotalWeight"
+            @input="setIncreaseTotalWeight(scope.row, scope.$index)"
+            placeholder="请输入"
+          >
+            <template slot="append">
+              <span v-if="!!scope.row.productId && scope.row.productId != 0">
+                {{ scope.row.weightUnit }}
+              </span>
+              <el-input
+                v-else
+                v-model="scope.row.weightUnit"
+                placeholder="单位"
+                style="width: 80px; padding: 0"
+              ></el-input>
+            </template>
+          </el-input>
+        </el-form-item>
+      </template>
+
+      <template v-slot:technologyRouteName="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.technologyRouteName'"
+          :rules="{
+            required: false,
+            message: '请选择',
+            trigger: 'change'
+          }"
+        >
+          <el-input
+            v-model="scope.row.technologyRouteName"
+            placeholder="请选择"
+            @click.native="openVersion(scope.$index)"
+          ></el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:pricingWay="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.pricingWay'">
+          <el-select
+            v-model="scope.row.pricingWay"
+            placeholder="请选择"
+            :rules="{
+              required: true,
+              message: '请选择计价方式',
+              trigger: 'change'
+            }"
+            @change="changeCount(scope.row, scope.$index)"
+          >
+            <el-option
+              v-for="item in pricingWayList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </template>
+      <template v-slot:headerPricingWay="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+
+      <template v-slot:taskName="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.taskName'">
+          <el-input
+            v-model="scope.row.taskName"
+            placeholder="请选择"
+            style="width: 60%; margin-right: 10px"
+            disabled
+          ></el-input>
+          <el-button
+            size="small"
+            type="primary"
+            @click.native="handleTaskinstance(scope.row, scope.$index)"
+            >选择
+          </el-button>
+        </el-form-item>
+      </template>
+
+      <template v-slot:arrivalWay="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.arrivalWay'">
+          <el-select
+            v-model="scope.row.arrivalWay"
+            clearable
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in arrivalWayList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </template>
+      <template v-slot:batchNo="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.batchNo'"
+          :rules="[
+            {
+              required: isBatchNo == 1 ? true : false,
+              message: '请输入批号',
+              trigger: 'blur'
+            }
+          ]"
+        >
+          <el-input
+            v-model="scope.row.batchNo"
+            placeholder="请输入"
+            :disabled="quoteType === 2"
+            v-no-chinese
+          >
+          </el-input>
+        </el-form-item>
+      </template>
+      <template v-slot:headerBatchNo="{ column }">
+        <span class="is-required">{{ column.label }}</span>
+      </template>
+
+      <template v-slot:orderNo="{ row, $index }">
+        <el-form-item :prop="'datasource.' + $index + '.orderNo'">
+          <el-select v-model="row.orderNo" style="width: 100%">
+            <el-option
+              :label="item.orderNo"
+              :value="item.orderNo"
+              @click.native="orderNoChange(row, item)"
+              v-for="(item, index) in orderOption"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </template>
+      <template v-slot:goodsLevel="{ row, $index }">
+        <el-form-item :prop="'datasource.' + $index + '.goodsLevel'">
+          <el-select
+            v-model="row.goodsLevel"
+            style="width: 100%"
+            :disabled="quoteType === 2"
+          >
+            <el-option
+              :label="item.label"
+              :value="item.value"
+              v-for="(item, index) in levelList"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </template>
+      <template v-slot:goodsPriceType="{ row, $index }">
+        <el-form-item :prop="'datasource.' + $index + '.goodsPriceType'">
+          <DictSelection
+            dictName="商品价格类型"
+            clearable
+            :disabled="quoteType === 2"
+            v-model="row.goodsPriceType"
+            @change="goodsPriceTypeChange(row, $index)"
+            :isOne="$index === 0"
+          >
+          </DictSelection>
+        </el-form-item>
+      </template>
+      <template v-slot:saleCount="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.' + countObj.countKey"
+          :rules="{
+            required: quoteType !== 2 && isTotalCount ? true : false,
+            message: '请输入数量',
+            trigger: 'change'
+          }"
+        >
+          <el-input
+            v-model="scope.row[countObj.countKey]"
+            placeholder="请输入"
+            type="number"
+            :min="0"
+            @input="handleCountChange(scope.row, scope.$index)"
+          >
+            <template slot="append">
+              <el-select
+                v-model="scope.row[countObj.unitIdKey]"
+                style="width: 80px"
+                v-if="!!scope.row.productId && scope.row.productId != 0"
+                @change="handleCountChange(scope.row, scope.$index)"
+              >
+                <el-option
+                  :label="item.conversionUnit"
+                  :value="item.id"
+                  v-for="(item, index) in scope.row.packageDispositionList"
+                  :key="index"
+                ></el-option>
+              </el-select>
+              <el-input
+                v-else
+                v-model="scope.row.measuringUnit"
+                placeholder="单位"
+                style="width: 80px; padding: 0"
+              ></el-input>
+            </template>
+          </el-input>
+        </el-form-item>
+      </template>
+      <!-- <template v-slot:saleUnit="scope">
+        <el-form-item
+          :prop="'datasource.' + scope.$index + '.' + countObj.unitIdKey"
+        >
+          <el-select
+            v-model="scope.row[countObj.unitIdKey]"
+            style="width: 100%"
+            @change="changeCount(scope.row, scope.$index)"
+          >
+            <el-option
+              :label="item.conversionUnit"
+              :value="item.id"
+              @click.native="packingChange(item, scope.$index)"
+              v-for="(item, index) in scope.row.packageDispositionList"
+              :key="index"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </template> -->
+      <template v-slot:modelKey="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.' + 'modelKey'">
+          <DictSelection
+            dictName="物品机型"
+            clearable
+            :disabled="quoteType === 2"
+            v-model="scope.row.modelKey"
+            :isOne="scope.$index === 0"
+            filterable
+            allow-create
+            default-first-option
+            multiple
+          >
+          </DictSelection>
+        </el-form-item>
+      </template>
+      <template v-slot:colorKey="scope">
+        <el-form-item :prop="'datasource.' + scope.$index + '.' + 'colorKey'">
+          <DictSelection
+            dictName="物品颜色"
+            clearable
+            v-model="scope.row.colorKey"
+            :isOne="scope.$index === 0"
+            filterable
+            allow-create
+            default-first-option
+            multiple
+          >
+          </DictSelection>
+        </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">m²</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"
+            type="number"
+            placeholder="请输入"
+            @input="calculateIncludingTaxPrice(row, $index)"
+          >
+            <template slot="append">元</template>
+          </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"
+            type="number"
+            placeholder="请输入"
+            @input="calculateIncludingTaxPrice(row, $index)"
+          >
+            <template slot="append">元</template>
+          </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"
+            type="number"
+            placeholder="请输入"
+            @input="calculateIncludingTaxPrice(row, $index)"
+          >
+            <template slot="append">元</template>
+          </el-input>
+        </el-form-item>
+      </template>
+
+      <!-- 新增未税小记列模板 -->
+      <template v-slot:quotationSubtotalBeforeTax="{ row, $index }">
+        <el-form-item
+          :prop="'datasource.' + $index + '.quotationSubtotalBeforeTax'"
+        >
+          {{ (Number(row.quotationSubtotalBeforeTax) || 0).toFixed(2) }}元
+        </el-form-item>
+      </template>
+
+      <template v-slot:extraTax="{ row, $index }">
+        <el-form-item :prop="'datasource.' + $index + '.extraTax'">
+          <el-input
+            v-model="row.extraTax"
+            type="number"
+            placeholder="请输入"
+            @input="calculateIncludingTaxPrice(row, $index)"
+          >
+            <template slot="append">%</template>
+          </el-input>
+        </el-form-item>
+      </template>
+
+      <!-- 含税单价改为含税小计 -->
+      <template v-slot:quotationSubtotalTax="{ row, $index }">
+        <el-form-item :prop="'datasource.' + $index + '.quotationSubtotalTax'">
+          {{ (Number(row.quotationSubtotalTax) || 0).toFixed(2) }}元
+          <!-- <el-input
+            v-model="row.quotationSubtotalTax"
+            type="number"
+            placeholder="请输入"
+          >
+            <template slot="append">元</template>
+          </el-input> -->
+        </el-form-item>
+      </template>
+      <template v-slot:productionRequirements="{ row, $index }">
+        <el-form-item
+          :prop="'datasource.' + $index + '.productionRequirements'"
+        >
+          <el-input
+            v-model="row.productionRequirements"
+            placeholder="请输入"
+            type="textarea"
+          >
+          </el-input>
+        </el-form-item>
+      </template>
+      <!-- 操作列 -->
+      <template v-slot:action="scope">
+        <el-popconfirm
+          class="ele-action"
+          title="确定要删除吗?"
+          @confirm="remove(scope.$index)"
+        >
+          <template v-slot:reference>
+            <el-link type="danger" :underline="false" icon="el-icon-delete">
+              删除
+            </el-link>
+          </template>
+        </el-popconfirm>
+      </template>
+    </ele-pro-table>
+    <product-list
+      ref="productListRef"
+      classType="1"
+      :is-get-inventory-total="true"
+      @changeParent="changeParent"
+      :isSupplier="isSupplier"
+      :isSalesRecord="isSalesRecord"
+    ></product-list>
+    <head-list ref="headRef" @changeParent="changeAnswer"></head-list>
+    <ProductionVersion
+      ref="versionRefs"
+      @changeProduct="changeProduct"
+    ></ProductionVersion>
+    <taskinstance-dialog
+      ref="taskinstanceDialogRef"
+      v-if="taskinstanceDialogFlag"
+      @saveTaskInstance="saveTaskInstance"
+      :visible.sync="taskinstanceDialogFlag"
+    ></taskinstance-dialog>
+    <timeDialog
+      @chooseTime="chooseTime"
+      ref="timeDialogRef"
+      :isBatch="true"
+    ></timeDialog>
+    <selectStockLedgerDialog
+      ref="selectStockLedgerDialogRef"
+      @changeParent="replaceTable"
+      :isSupplier="isSupplier"
+    ></selectStockLedgerDialog>
+    <commodityPriceListDialog
+      ref="commodityPriceListDialogRef"
+      @changeParent="changeParent"
+    ></commodityPriceListDialog>
+  </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 { 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
+      },
+      quoteType: {
+        type: Number,
+        default: 1
+      },
+      isGuaranteePeriod: {
+        default: true,
+        type: Boolean
+      },
+
+      customerMark: {
+        default: '',
+        type: String
+      },
+
+      isContractId: {
+        type: Boolean,
+        default: false
+      },
+
+      isSinglePrice: {
+        //单价必填
+        type: Boolean,
+        default: true
+      },
+      isTotalCount: {
+        //数量必填
+        type: Boolean,
+        default: true
+      },
+      isCustomerMark: {
+        //客户代号必填
+        type: Boolean,
+        default: false
+      },
+
+      isDiscount: {
+        //折让
+        type: Boolean,
+        default: true
+      },
+
+      isProduceDeliveryDeadline: {
+        //生产交付交期必填
+        type: Boolean,
+        default: false
+      },
+
+      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 [];
+        }
+      },
+      //是否商品
+      isGoods: {
+        type: Boolean,
+        default: false
+      },
+      // 是否税率必填
+      isTaxRate: {
+        type: [Number, String],
+        default: 0
+      },
+      defTaxRate: {
+        type: Number,
+        default: undefined
+      },
+      //是否显示增重重量
+      isIncreaseTotalWeight: {
+        type: Boolean,
+        default: false
+      },
+      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: '',
+        extraTax: '',
+        quotationSubtotalTax: '',
+        // 新增未税小记字段
+        quotationSubtotalBeforeTax: ''
+      };
+      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: []
+      };
+    },
+    computed: {
+      canHandl() {
+        return this.form.datasource.length;
+      },
+      columns() {
+        let columnsVersion = this.columnsVersion;
+
+        // 基础列定义
+        let baseColumns = [
+          {
+            width: 45,
+            type: 'index',
+            columnKey: 'index',
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            label: '选择',
+            width: 45,
+            type: 'selection',
+            columnKey: 'selection',
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            minWidth: 200,
+            prop: 'orderNo',
+            slot: 'orderNo',
+            label: '订单编码',
+            isNone: !this.isOrderNo,
+            showOverflowTooltip: true,
+            align: 'center'
+          },
+          {
+            width: 280,
+            prop: 'productName',
+            label: '名称',
+            slot: 'productName',
+            headerSlot: 'headerProductName',
+            align: 'center',
+            fixed: 'left'
+          },
+          {
+            width: 120,
+            prop: 'productCode',
+            label: '编码',
+            slot: 'productCode',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'specification',
+            label: '规格',
+            slot: 'specification',
+            align: 'center'
+          },
+          {
+            minWidth: 240,
+            prop: 'taskName',
+            label: '工序',
+            slot: 'taskName',
+            align: 'center'
+          },
+          {
+            minWidth: 120,
+            prop: 'entrustedEnterpriseId',
+            label: '受托企业',
+            slot: 'entrustedEnterpriseId',
+            isNone: !this.isCustomerMark,
+            align: 'center'
+          },
+          {
+            width: 140,
+            prop: 'pricingWay',
+            label: '计价方式',
+            headerSlot: 'headerPricingWay',
+            slot: 'pricingWay',
+            isNone: this.quoteType === 2,
+            fixed: 'left',
+            align: 'center'
+          },
+          {
+            width: 250,
+            prop: 'saleCount',
+            label: '数量',
+            slot: 'saleCount',
+            headerSlot: this.isTotalCount ? 'headerTotalCount' : '',
+            align: 'center'
+          }
+        ];
+
+        // 当quoteType为2时添加生产加工相关列
+        if (this.quoteType === 2) {
+          baseColumns.push(
+            {
+              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: 'quotationSubtotalBeforeTax',
+              label: '未税小计',
+              slot: 'additionalTaxRate_untaxed',
+              align: 'center'
+            },
+            {
+              width: 150,
+              prop: 'extraTax',
+              label: '税率(%)',
+              slot: 'extraTax',
+              align: 'center'
+            },
+            {
+              width: 150,
+              prop: 'quotationSubtotalTax',
+              label: '含税小计',
+              slot: 'quotationSubtotalTax',
+              align: 'center'
+            }
+          );
+        }
+
+        // 其他列
+        const otherColumns = [
+          {
+            width: 160,
+            prop: 'customerExpectDeliveryDeadline',
+            label: this.contractBookType == 1 ? '客户期望交期' : '交付日期',
+            slot: 'customerExpectDeliveryDeadline',
+            headerSlot:
+              this.isDate == 1 && this.quoteType != 2
+                ? 'headerCustomerExpectDeliveryDeadline'
+                : '',
+            align: 'center'
+          },
+
+          {
+            width: 180,
+            prop: 'singleWeight',
+            label: '单重',
+            slot: 'singleWeight',
+            headerSlot: 'headerSingleWeight',
+            align: 'center'
+          },
+          {
+            minWidth: 120,
+            prop: 'goodsLevel',
+            label: '物品级别',
+            slot: 'goodsLevel',
+            align: 'center',
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 200,
+            prop: 'totalCount',
+            label: '计量数量',
+            headerSlot: 'headerTotalCount',
+            align: 'center',
+            formatter: (_row, _column, cellValue) => {
+              if (_row.totalCount) {
+                return _row.totalCount + ' ' + (_row.measuringUnit || '');
+              }
+            },
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 200,
+            prop: 'customerMark',
+            label: this.contractBookType == 1 ? '客户代号' : '供应商代号',
+            slot: 'customerMark',
+            headerSlot: this.isCustomerMark ? 'headerCustomerMark' : '',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            minWidth: 160,
+            prop: 'productionCodes',
+            label: '生产编号',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            minWidth: 280,
+            prop: 'productionRequirements',
+            label: '生产要求',
+            align: 'center',
+            slot: 'productionRequirements',
+            isNone: !this.isProductionRequirements && this.quoteType === 2
+          },
+          {
+            width: 200,
+            prop: 'productCategoryName',
+            label: '类型',
+            slot: 'productCategoryName',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 120,
+            prop: 'packingSpecification',
+            align: 'center',
+            label: '包装规格',
+            showOverflowTooltip: true,
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 160,
+            prop: 'goodsPriceType',
+            label: '价格类型',
+            slot: 'goodsPriceType',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 200,
+            prop: 'singlePrice',
+            label: '单价',
+            slot: 'singlePrice',
+            headerSlot: this.isSinglePrice ? 'headerSinglePrice' : '',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 160,
+            prop: 'taxRate',
+            label: '税率',
+            slot: 'taxRate',
+            align: 'center',
+            headerSlot: this.isTaxRate == 1 ? 'headerTaxRate' : '',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 180,
+            prop: 'notaxSinglePrice',
+            label: '不含税单价',
+            slot: 'notaxSinglePrice',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 160,
+            prop: 'discountSinglePrice',
+            label: '折让单价',
+            align: 'center',
+            isNone: !this.isDiscount,
+            formatter: (_row, _column, cellValue) => {
+              return _row.discountSinglePrice
+                ? Number(_row.discountSinglePrice).toFixed(2)
+                : '';
+            }
+          },
+          {
+            width: 120,
+            prop: 'totalPrice',
+            label: '合计',
+            slot: 'totalPrice',
+            align: 'center'
+          },
+          {
+            width: 160,
+            prop: 'discountTotalPrice',
+            label: '折让合计',
+            align: 'center',
+            isNone: !this.isDiscount,
+            formatter: (_row, _column, cellValue) => {
+              return _row.discountTotalPrice
+                ? Number(_row.discountTotalPrice).toFixed(2)
+                : '';
+            }
+          },
+          {
+            width: 110,
+            prop: 'batchNo',
+            label: '批次号',
+            slot: 'batchNo',
+            headerSlot: this.isBatchNo ? 'headerBatchNo' : '',
+            align: 'center',
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 120,
+            prop: 'availableCountBase',
+            label: '库存数量',
+            slot: 'availableCountBase',
+            align: 'center',
+            isNone: this.quoteType === 2
+          },
+          {
+            prop: 'provenance',
+            label: '产地',
+            slot: 'provenance',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 200,
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 180,
+            prop: 'totalWeight',
+            label: '总重',
+            slot: 'totalWeight',
+            formatter: (_row, _column, cellValue) => {
+              if (_row.totalWeight) {
+                return _row.totalWeight + ' ' + (_row.weightUnit || '');
+              }
+            },
+            align: 'center'
+          },
+          {
+            width: 180,
+            prop: 'increaseTotalWeight',
+            label: '增重重量',
+            slot: 'increaseTotalWeight',
+            isNone: this.quoteType === 2 || !this.isIncreaseTotalWeight,
+            align: 'center'
+          },
+
+          {
+            width: 160,
+            prop: 'productBrand',
+            label: '牌号',
+            slot: 'productBrand',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 120,
+            prop: 'modelType',
+            label: '型号',
+            slot: 'modelType',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 160,
+            prop: 'modelKey',
+            label: '机型',
+            slot: 'modelKey',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 160,
+            prop: 'colorKey',
+            label: '颜色',
+            slot: 'colorKey',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 120,
+            prop: 'produceType',
+            align: 'center',
+            label: '属性类型',
+
+            isNone: this.quoteType === 2,
+            showOverflowTooltip: true,
+            formatter: (row, column) => {
+              if (row.produceType) {
+                return row.produceType
+                  .map((item) => {
+                    return lbjtList[item];
+                  })
+                  .toString();
+              }
+            }
+          },
+          {
+            width: 160,
+            prop: 'arrivalWay',
+            label: '到货方式',
+            slot: 'arrivalWay',
+            align: 'center',
+            isNone: !this.isArrivalWay || this.quoteType === 2
+          },
+          {
+            width: 160,
+            prop: 'produceDeliveryDeadline',
+            label: '生产交付交期',
+            slot: 'produceDeliveryDeadline',
+            headerSlot:
+              this.isDate == 1 && this.isProduceDeliveryDeadline
+                ? 'headerProduceDeliveryDeadline'
+                : '',
+            isNone: this.contractBookType != 1,
+            align: 'center'
+          },
+          {
+            width: 200,
+            prop: 'guaranteePeriod',
+            label: '有效期',
+            slot: 'guaranteePeriod',
+            align: 'center',
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 200,
+            prop: 'guaranteePeriodDeadline',
+            label: '有效期截止日期',
+            slot: 'guaranteePeriodDeadline',
+            isNone: !this.isGuaranteePeriod || this.quoteType === 2,
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'imgCode',
+            align: 'center',
+            label: '图号/件号',
+            showOverflowTooltip: true,
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 220,
+            prop: 'customerReqFiles',
+            label: '客户需求',
+            slot: 'customerReqFiles',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 130,
+            prop: 'technicalAnswerName',
+            label: '技术答疑人',
+            slot: 'technicalAnswerName',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 220,
+            prop: 'technicalParams',
+            label: '技术参数',
+            slot: 'technicalParams',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 240,
+            prop: 'technicalDrawings',
+            label: '技术图纸',
+            slot: 'technicalDrawings',
+            align: 'center'
+          },
+          {
+            width: 120,
+            prop: 'drawingVersion',
+            label: '图纸版本',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 240,
+            prop: 'technologyRouteName',
+            label: '工艺路线',
+            slot: 'technologyRouteName',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 240,
+            prop: 'industryArtFiles',
+            label: '工艺附件',
+            slot: 'industryArtFiles',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 240,
+            prop: 'otherFiles',
+            label: '其他附件',
+            slot: 'otherFiles',
+            align: 'center',
+
+            isNone: this.quoteType === 2
+          },
+          {
+            width: 220,
+            prop: 'remark',
+            label: '备注',
+            slot: 'remark',
+            align: 'center'
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 120,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            fixed: 'right',
+            showOverflowTooltip: true
+          }
+        ];
+
+        // 合并所有列
+        return [...baseColumns, ...otherColumns].filter((item) => !item.isNone);
+      }
+    },
+    created() {
+      parameterGetByCode({
+        code: 'eom_inventoryTable_customerExpectDeliveryDeadline'
+      }).then((res) => {
+        if (res.value) {
+          this.isDate = res.value;
+        }
+      });
+    },
+    methods: {
+      handleCountChange(row, index,weightType) {
+        // 数量变化时,若为生产加工类型,触发含税小计计算
+        if (this.quoteType === 2) {
+          this.calculateIncludingTaxPrice(row, index);
+        } else {
+          this.changeCount(row, index,weightType);
+        }
+      },
+      packingChange(item, index) {
+        this.$set(
+          this.form.datasource[index],
+          this.countObj.unitKey,
+          item.conversionUnit
+        );
+        this.handleCountChange(this.form.datasource[index], index);
+      },
+      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);
+        });
+      },
+      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],
+            'guaranteePeriodDeadline',
+            guaranteePeriodUnitName != 'second'
+              ? this.setDay(row.guaranteePeriod, guaranteePeriodUnitName, row)
+              : ''
+          );
+        }
+      },
+      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 || [];
+        });
+        return comitDatasource;
+      },
+      getPrice() {
+        return [this.allPrice, this.form.discountTotalPrice];
+      },
+      //改变数量
+      changeCount(row, index, weightType) {
+        if (!row) {
+          this.form.datasource = this.form.datasource.map((item, i) => {
+            return changeCount(item, this.countObj, false);
+          });
+          this.form.datasource.forEach((item, i) => {
+            this.setIncreaseTotalWeight(item, i);
+          });
+        } else {
+          const updatedRow = changeCount(row, this.countObj, false, weightType);
+          this.$set(this.form.datasource, index, updatedRow);
+          this.setIncreaseTotalWeight(row, index);
+        }
+
+        this.$nextTick(() => {
+          // 生产加工类型不需要计算不含税单价,但需要计算含税小计
+          this.getNotaxSinglePrice();
+          this.changeAll();
+        });
+      },
+      setIncreaseTotalWeight(row, index) {
+        if (row.pricingWay == 3) {
+          this.$set(
+            this.form.datasource[index],
+            'totalPrice',
+            ((row.increaseTotalWeight || 0) * row.singlePrice).toFixed(2)
+          );
+          this.changeAll();
+        }
+      },
+      // 计算含税小计(原含税单价逻辑)
+      calculateIncludingTaxPrice(row, index) {
+        if (!row) return;
+
+        // 计算未税小记
+        const quotationSubtotalBeforeTax =
+          (Number(row.processingFeeBeforeTax) || 0) +
+          (Number(row.packagingFeeNotTaxed) || 0) +
+          (Number(row.transportationFeeWithoutTax) || 0);
+
+        // 使用 $nextTick 确保响应式更新完成
+        // this.$nextTick(() => {
+        this.$set(
+          this.form.datasource[index],
+          'quotationSubtotalBeforeTax',
+          quotationSubtotalBeforeTax.toFixed(2)
+        );
+
+        // 计算含税小计
+        const taxRate = (Number(row.extraTax) || 0) / 100;
+        const quotationSubtotalTax = quotationSubtotalBeforeTax * (1 + taxRate);
+        this.$set(
+          this.form.datasource[index],
+          'quotationSubtotalTax',
+          quotationSubtotalTax.toFixed(2)
+        );
+        const quantity = Number(row[this.countObj.countKey]) || 1;
+        const totalPrice = quotationSubtotalTax * quantity;
+        this.$set(
+          this.form.datasource[index],
+          'totalPrice',
+          totalPrice.toFixed(2)
+        );
+        if (
+          row[this.countObj.unitKey] == row.weightUnit &&
+          row.pricingWay == 1
+        ) {
+          this.$set(this.form.datasource[index], 'totalWeight', quantity);
+        } else {
+          if (quantity && row.singleWeight) {
+            this.$set(
+              this.form.datasource[index],
+              'totalWeight',
+              (quantity * row.singleWeight).toFixed(2)
+            );
+          }
+        }
+
+        this.changeAll();
+        // });
+      },
+
+      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],
+            'discountSinglePrice',
+            this.getDiscountSinglePrice(item)
+          );
+          this.$set(
+            this.form.datasource[index],
+            'discountTotalPrice',
+            this.getDiscountTotalPrice(item)
+          );
+        });
+        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[this.countObj.countKey]);
+        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.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
+                    )
+                  : '';
+            }
+            item.entrustedEnterpriseIdList = supplierObj[item.productId];
+            // if (supplierObj[item.productId]?.length === 1) {
+            //   item.entrustedEnterpriseId = supplierObj[item.productId][0].id;
+            // }
+            // item.entrustedEnterpriseId = item.entrustedEnterpriseId || undefined;
+            this.$set(
+              item,
+              'entrustedEnterpriseId',
+              item.entrustedEnterpriseId || ''
+            );
+            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;
+          }
+
+          if (this.isDiscountTotalPrice) {
+            this.form.discountTotalPrice =
+              data.payAmount || data?.contractVO?.discountTotalPrice;
+          }
+          this.$refs.table.reload();
+        }
+      },
+
+      //选择产品
+      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);
+          this.$set(
+            parasm,
+            'customerExpectDeliveryDeadline',
+            dayjs(new Date()).format('YYYY-MM-DD')
+          );
+
+          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(
+              parasm,
+              'guaranteePeriodDeadline',
+              this.setDay(
+                item.warrantyPeriod,
+                this.guaranteePeriodUnit(item.warrantyPeriodUnit),
+                {}
+              )
+            );
+          }
+
+          this.$set(
+            parasm,
+            'packageDispositionList',
+            item.packageDispositionList
+          );
+          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);
+          }
+
+          // 初始化生产加工特有字段及未税小记
+          // 当quoteType为2时,数量默认设置为1
+          if (this.quoteType === 2) {
+            this.processSetValue(parasm);
+          }
+
+          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 || []);
+
+          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);
+          }
+          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,
+              '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,
+            'packageDispositionList',
+            item.packageDispositionList
+          );
+          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, 'customerMark', this.customerMark);
+          if (item.purchaseOrigins?.length > 0) {
+            item.purchaseOrigins = item.purchaseOrigins.map((val) => val + '');
+          }
+          this.$set(parasm, 'provenance', item.purchaseOrigins || []);
+
+          // 初始化生产加工特有字段及未税小记
+          // 当quoteType为2时,数量默认设置为1
+          if (this.quoteType === 2) {
+            this.processSetValue(parasm);
+          }
+          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.customerExpectDeliveryDeadline = dayjs(new Date()).format(
+          'YYYY-MM-DD'
+        );
+
+        // 初始化生产加工特有字段及未税小记
+        // 当quoteType为2时,数量默认设置为1
+        if (this.quoteType === 2) {
+          this.processSetValue(item);
+        }
+
+        this.form.datasource.push(item);
+      },
+      processSetValue(parasm) {
+        this.$set(parasm, this.countObj.countKey, 1);
+        this.$set(parasm, 'thickNess', '');
+        this.$set(parasm, 'squareNumber', '');
+        this.$set(parasm, 'processingFeeBeforeTax', '');
+        this.$set(parasm, 'packagingFeeNotTaxed', '');
+        this.$set(parasm, 'transportationFeeWithoutTax', '');
+        this.$set(parasm, 'extraTax', 13);
+        this.$set(parasm, 'quotationSubtotalBeforeTax', '0.00');
+        this.$set(parasm, 'quotationSubtotalTax', '');
+      },
+
+      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);
+            }
+          }
+          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(
+                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');
+      }
+    }
+  };
+</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;
+    }
+  }
+
+  .time-form .el-form-item {
+    margin-bottom: 0 !important;
+  }
+
+  ::v-deep .period {
+    display: flex;
+
+    .borderleftnone {
+      .el-input--medium .el-input__inner {
+        border-top-right-radius: 0;
+        border-bottom-right-radius: 0;
+      }
+    }
+
+    .borderrightnone {
+      .el-input--medium .el-input__inner {
+        border-top-left-radius: 0;
+        border-bottom-left-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;
+  }
+  :deep(.el-input-group__append) {
+    padding: 0;
+  }
+</style>

+ 17 - 5
src/views/financialManage/invoiceManage/components/addOrEditDialogNew.vue

@@ -342,7 +342,7 @@
       @reload="reload"
     ></process-submit-dialog>
     <!--对账单-->
-    <account-statement-dialog
+    <!-- <account-statement-dialog
       ref="accountStatementDialogRef"
       :form="form"
       v-if="accountStatementDialogFlag"
@@ -351,7 +351,7 @@
       :contactData="contactData"
       :type="form.type"
     >
-    </account-statement-dialog>
+    </account-statement-dialog> -->
     <!--采购订单-->
     <purchasinOrderListDialog
       ref="orderListDialogRef"
@@ -382,6 +382,16 @@
       v-if="paymentListDialogFlag"
       :paymentListDialogFlag.sync="paymentListDialogFlag"
     ></paymentListDialog>
+
+    <!-- 收款计划列表 -->
+    <collectionPlanDialog
+      ref="collectionPlanDialogRef"
+      v-if="collectionPlanDialogFlag"
+      :collectionPlanDialogFlag.sync="collectionPlanDialogFlag"
+      @getAccountData="getAccountData"
+      :type="form.type"
+    ></collectionPlanDialog>
+
   </ele-modal>
 </template>
 <script>
@@ -409,6 +419,7 @@
   // import fileMain from '@/components/addDoc/index.vue';
   import receivableDialog from '@/views/financialManage/receivableManage/components/receivableDialog.vue'; //应收
   import paymentListDialog from '@/views/financialManage/payableManage/components/paymentListDialog.vue'; //应付
+  import collectionPlanDialog from './collectionPlanDialog.vue'   // 收款计划列表
 
   import { updateContractStatus } from '@/api/contractManage/contractBook';
 
@@ -459,7 +470,8 @@
       saleOrderListDialog,
       // fileMain,
       receivableDialog,
-      paymentListDialog
+      paymentListDialog,
+      collectionPlanDialog
     },
     props: {
       addOrEditDialogFlag: {
@@ -646,7 +658,7 @@
         title: '',
         isOtherSourceFlag: false,
         processSubmitDialogFlag: false,
-        accountStatementDialogFlag: false,
+        collectionPlanDialogFlag: false,
         paymentListDialogFlag: false,
         enterprisePage: [],
         totalInvoiceAmount: 0,
@@ -772,7 +784,7 @@
       //来源类型
       async handleSelectAccount(val) {
         if (val == 1) {
-          this.accountStatementDialogFlag = true;
+          this.collectionPlanDialogFlag = true;
         }
         if (val == 2) {
           this.$refs.selectContractRef.open({}, 1, 1);

+ 3 - 3
src/views/financialManage/invoiceManage/components/collectionPlanDialog.vue

@@ -2,7 +2,7 @@
   <el-dialog
     title="选择收款计划"
     custom-class="ele-dialog-form long-dialog-form"
-    :visible.sync="accountstatementDialogFlag"
+    :visible.sync="collectionPlanDialogFlag"
     :before-close="handleClose"
     :close-on-click-modal="false"
     top="5vh"
@@ -63,7 +63,7 @@
         type: String,
         default: 1
       },
-      accountstatementDialogFlag: {
+      collectionPlanDialogFlag: {
         default: false,
         type: Boolean
       },
@@ -198,7 +198,7 @@
         });
       },
       handleClose() {
-        this.$emit('update:accountstatementDialogFlag', false);
+        this.$emit('update:collectionPlanDialogFlag', false);
       }
     }
   };

+ 1850 - 0
src/views/saleManage/saleOrder/components/addDialogNew.vue

@@ -0,0 +1,1850 @@
+<template>
+  <ele-modal
+    custom-class="ele-dialog-form long-dialog-form"
+    :centered="true"
+    v-if="visible"
+    :visible.sync="visible"
+    :close-on-click-modal="false"
+    :append-to-body="true"
+    width="70%"
+    @close="cancel"
+    :maxable="true"
+    :resizable="true"
+    :title="title"
+  >
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="120px"
+      class="el-form-box"
+    >
+      <headerTitle title="订单信息"> </headerTitle>
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="订单类型" prop="needProduce">
+            <el-radio
+              v-model="form.needProduce"
+              :label="1"
+              @change="needProduceChange"
+              >有客户生产性订单</el-radio
+            >
+            <el-radio
+              v-model="form.needProduce"
+              :label="0"
+              @change="needProduceChange"
+              >库存式订单</el-radio
+            >
+            <el-radio
+              v-model="form.needProduce"
+              :label="2"
+              @change="needProduceChange"
+              >无客户生产性订单</el-radio
+            >
+            <el-radio
+              v-model="form.needProduce"
+              :label="5"
+              @change="needProduceChange"
+              >委外订单</el-radio
+            >
+            <el-radio
+              v-model="form.needProduce"
+              :label="4"
+              @change="needProduceChange"
+              v-if="clientEnvironmentId != 5"
+              >不定向订单</el-radio
+            >
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="销售类型" prop="saleType">
+            <DictSelection
+              dictName="销售类型"
+              clearable
+              v-model="form.saleType"
+              :listFormatte="listFormatte"
+              @change="saleTypeChange"
+            >
+            </DictSelection>
+          </el-form-item>
+
+          <el-form-item
+            label="报价单"
+            prop="relationCode"
+            v-if="form.relationType == 2"
+          >
+            <el-input
+              clearable
+              readonly
+              @clear="clearContrcat"
+              v-model="form.relationCode"
+              @click.native="handQuotation"
+              placeholder="请输入"
+            />
+          </el-form-item>
+
+          <el-form-item
+            label="商机名称"
+            prop="relationName"
+            v-if="form.relationType == 1"
+          >
+            <el-input
+              clearable
+              v-model="form.relationName"
+              @click.native="handOpportunity"
+              readonly
+              @clear="clearContrcat"
+              placeholder="请输入"
+            />
+          </el-form-item>
+
+          <el-form-item
+            label="选择合同"
+            prop="relationName"
+            v-if="form.relationType == 3"
+          >
+            <el-input
+              clearable
+              v-model="form.relationName"
+              @click.native="handleContractBtn"
+              @clear="clearContrcat"
+              placeholder="请选择"
+              :disabled="!!projectData.contractId"
+            />
+          </el-form-item>
+          <el-form-item
+            label="项目名称"
+            prop="projectName"
+            v-if="form.relationType == 4"
+          >
+            <el-input
+              clearable
+              v-model="form.projectName"
+              @change="form.relationName = form.projectName"
+              @clear="clearContrcat('project')"
+              placeholder="请输入"
+              style="width: calc(100% - 80px)"
+            />
+            <el-button
+              style="margin-left: 5px"
+              size="small"
+              type="primary"
+              @click.native="handleProjectBtn"
+              >选择
+            </el-button>
+          </el-form-item>
+          <el-form-item
+            label="退货单"
+            prop="relationCode"
+            v-if="form.relationType == 5"
+          >
+            <el-input
+              clearable
+              readonly
+              @clear="clearContrcat"
+              v-model="form.relationCode"
+              @click.native="handleReturnBtn"
+              placeholder="请输入"
+            />
+          </el-form-item>
+
+          <el-form-item label="销售部门" prop="salesDeptId">
+            <ele-tree-select
+              clearable
+              :data="groupTreeData"
+              v-model="form.salesDeptId"
+              valueKey="id"
+              labelKey="name"
+              placeholder="请选择"
+              @change="change_principalDep"
+              default-expand-all
+            />
+          </el-form-item>
+          <!-- <el-form-item label="预销售订单编码" prop="preOrderNo">
+            <el-input
+              clearable
+              v-model="form.preOrderNo"
+              placeholder="请输入"
+            />
+          </el-form-item> -->
+
+          <el-form-item prop="orderFiles" label="订单附件">
+            <fileMain v-model="form.orderFiles"></fileMain>
+          </el-form-item>
+          <el-form-item label="是否挂单" prop="isSuspend">
+            <el-radio-group v-model="form.isSuspend">
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+            <span v-if="form.isSuspend == 1" style="margin-left: 10px; font-size: 12px; color: #1890ff;">
+              挂单只能选择一个产品
+            </span>
+          </el-form-item>
+          <!-- <el-form-item prop="productionRequirements" label="生产要求">
+            <el-input
+              clearable
+              v-model="form.productionRequirements"
+              placeholder="请输入"
+              type="textarea"
+            />
+          </el-form-item> -->
+        </el-col>
+
+        <el-col :span="12">
+          <el-form-item label="来源类型" prop="relationType">
+            <el-select
+              v-model="form.relationType"
+              filterable
+              clearable
+              style="width: 100%"
+              @change="clearContrcat"
+            >
+              <el-option :value="1" label="商机"></el-option>
+              <el-option :value="2" label="报价"></el-option>
+              <el-option :value="3" label="销售合同"></el-option>
+              <el-option :value="4" label="项目"></el-option>
+              <el-option
+                v-if="form.saleType == 4 || form.saleType == 6"
+                :value="5"
+                label="退货单"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item
+            label="合同编号"
+            prop="relationCode"
+            v-if="form.relationType == 3"
+          >
+            <el-input
+              :disabled="!!form.contractId"
+              v-model="form.relationCode"
+            />
+          </el-form-item>
+
+          <el-form-item
+            label="业务员"
+            prop="salesmanId"
+          >
+            <personSelect
+              ref="salseManDirectorRef"
+              v-model="form.salesmanId"
+              @selfChange="salesmanChange"
+              :init="false"
+            />
+          </el-form-item>
+
+          <el-form-item label="结算方式" prop="settlementMode">
+            <DictSelection
+              dictName="结算方式"
+              clearable
+              @itemChange="settlementModeChange"
+              v-model="form.settlementMode"
+            >
+            </DictSelection>
+          </el-form-item>
+
+          <el-form-item
+            label="总数"
+            prop="totalPlanNum"
+            v-if="form.needProduce == 4"
+          >
+            <el-input v-model="form.totalPlanNum" class="totalPlanNum">
+              <template slot="append">
+                <DictSelection
+                  dictName="计量单位"
+                  clearable
+                  v-model="form.planNumUnit"
+                >
+                </DictSelection>
+              </template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="发起人所属部门" prop="createDeptName">
+            <el-input v-model="form.createDeptName" :disabled="true"></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <headerTitle title="基本信息" v-if="form.needProduce != 2"></headerTitle>
+      <el-row v-if="form.needProduce != 2">
+        <el-col :span="12">
+          <el-form-item label="客户名称" prop="partaName">
+            <el-input
+              clearable
+              v-model="form.partaName"
+              @click.native="handParent"
+              placeholder="请选择"
+              readonly
+              :disabled="!!contactData?.id"
+            />
+          </el-form-item>
+          <el-form-item
+            label="客户统一社会信用代码"
+            prop="partaUnifiedSocialCreditCode"
+            class="form_item_label"
+          >
+            <el-input
+              clearable
+              v-model="form.partaUnifiedSocialCreditCode"
+              placeholder="请输入"
+            />
+          </el-form-item>
+          <el-form-item label="客户联系人" prop="partaLinkName">
+            <el-select
+              v-model="form.partaLinkName"
+              placeholder="请选择"
+              @change="onchangeLink"
+              style="width: 100%"
+            >
+              <el-option
+                v-for="item in linkNameOptions"
+                :key="item.id"
+                :label="item.linkName"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="客户电话" prop="partaTel">
+            <el-input
+              clearable
+              :maxlength="20"
+              v-model="form.partaTel"
+              placeholder="请输入"
+            />
+          </el-form-item>
+          <el-form-item label="客户传真" prop="partaFax">
+            <el-input clearable v-model="form.partaFax" placeholder="请输入" />
+          </el-form-item>
+          <el-form-item label="	客户Email" prop="partaEmail">
+            <el-input
+              clearable
+              v-model="form.partaEmail"
+              placeholder="请输入"
+            />
+          </el-form-item>
+          <el-form-item label="客户地址" prop="partaAddress">
+            <el-input
+              clearable
+              v-model="form.partaAddress"
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="售出方名称" prop="partbName">
+            <el-input
+              v-if="enterprisePage.length <= 1"
+              clearable
+              v-model="form.partbName"
+              placeholder="请输入"
+            />
+            <el-select
+              v-if="enterprisePage.length > 1"
+              style="width: 100%"
+              v-model="form.partbName"
+              placeholder="请选择"
+              @change="getEnterprise()"
+            >
+              <el-option
+                v-for="item in enterprisePage"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item
+            label="售出方统一社会信用代码"
+            prop="partbUnifiedSocialCreditCode"
+            class="form_item_label"
+          >
+            <el-input
+              clearable
+              v-model="form.partbUnifiedSocialCreditCode"
+              placeholder="请输入"
+            />
+          </el-form-item>
+          <el-form-item label="售出方联系人" prop="partbLinkName">
+            <el-input
+              clearable
+              v-model="form.partbLinkName"
+              @click.native="handHead"
+              placeholder="请输入"
+            />
+          </el-form-item>
+          <el-form-item prop="partbTel" label="售出方联系电话">
+            <el-input clearable v-model="form.partbTel" placeholder="请输入" />
+          </el-form-item>
+          <el-form-item prop="partbFax" label="售出方传真">
+            <el-input clearable v-model="form.partbFax" placeholder="请输入" />
+          </el-form-item>
+
+          <el-form-item label="售出方Email" prop="partbEmail">
+            <el-input
+              clearable
+              v-model="form.partbEmail"
+              placeholder="请输入"
+            />
+          </el-form-item>
+
+          <el-form-item label="售出方地址" prop="partbAddress">
+            <el-input
+              clearable
+              v-model="form.partbAddress"
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <headerTitle
+        title="物品清单"
+        style="margin-top: 30px"
+        v-if="form.needProduce != 4"
+      >
+        <el-button
+          type="primary"
+          size="mini"
+          style="margin-bottom: 5px"
+          @click="orderListShow"
+          v-if="!form.id"
+          >历史记录</el-button
+        ></headerTitle
+      >
+      <inventoryTable
+        v-if="form.needProduce != 4"
+        :isSuspend="form.isSuspend"
+        :customerMark="customerMark"
+        :isCustomerMark="clientEnvironmentId != 4 && form.needProduce != 2"
+        :isProduceDeliveryDeadline="form.needProduce != 0"
+        ref="inventoryTable"
+        @setCountAmount="setCountAmount"
+        :isContractId="!!form.contractId"
+        :isChangeCount="false"
+        :needProduce="form.needProduce"
+        :isSupplier="true"
+        :isArrivalWay="true"
+        :cacheKeyUrl="cacheKeyUrl"
+        :isGoods="true"
+        :isTaxRate="isTaxRate"
+        :isSinglePrice="form.needProduce != 2 && isSinglePrice != 0"
+        :isBatchNo="isBatchNo == 1 && form.saleTypeName.includes('受托')"
+        :isProductionRequirements="true"
+        :isIncreaseTotalWeight="true"
+      ></inventoryTable>
+      <headerTitle
+        title="类型清单"
+        style="margin-top: 30px"
+        v-if="form.needProduce == 4"
+      ></headerTitle>
+
+      <typeList
+        v-if="form.needProduce == 4"
+        @setCountAmount="setCountAmount"
+        @setTotalPlanNum="setTotalPlanNum"
+        ref="typeListRef"
+      ></typeList>
+
+      <!-- <el-row v-if="form.needProduce == 1">
+        <el-col :span="8">
+          <el-form-item
+            label="自动生成采购计划:"
+            label-width="160px"
+            prop="generatePurchase"
+          >
+            <el-radio-group v-model="form.generatePurchase">
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+
+        <el-col :span="8">
+          <el-form-item
+            label="自动生成生产计划:"
+            label-width="160px"
+            prop="generateProduce"
+          >
+            <el-radio-group v-model="form.generateProduce">
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item
+            label="自动生成项目立项:"
+            label-width="160px"
+            prop="generateProject"
+          >
+            <el-radio-group v-model="form.generateProject">
+              <el-radio :label="1">是</el-radio>
+              <el-radio :label="0">否</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+      </el-row> -->
+      <el-row style="margin-top: 20px">
+        <el-col :span="12">
+          <el-form-item label="总金额" prop="totalAmount">
+            {{ form.totalAmount || 0 }}元
+          </el-form-item>
+          <el-form-item label="收货地址" prop="receiveAddress">
+            <el-input
+              clearable
+              type="textarea"
+              v-model="form.receiveAddress"
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="优惠后总金额">
+            <el-input
+              type="number"
+              :min="0"
+              :max="form.totalAmount"
+              clearable
+              :disabled="!!form.contractId || !form.totalAmount"
+              v-model="form.payAmount"
+              @input="discountInput"
+              placeholder="请输入"
+            >
+              <template slot="append">元</template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="备注" prop="remark">
+            <el-input
+              clearable
+              type="textarea"
+              v-model="form.remark"
+              placeholder="请输入"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row style="margin-top: 20px">
+        <el-col :span="12">
+          <el-form-item label="收货人信息" prop="receivePerson">
+            <el-input clearable v-model="form.receivePerson" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <div slot="footer" class="footer">
+      <el-button type="primary" @click="save" v-click-once>保存</el-button>
+      <el-button
+        type="primary"
+        v-if="isNeed_process_is_close"
+        @click="save('sub')"
+        v-click-once
+        >提交</el-button
+      >
+
+      <el-button @click="cancel">返回</el-button>
+    </div>
+    <quotationList
+      ref="quotationListRef"
+      @changeParent="changeQuotationList"
+      :isContractBook="false"
+    ></quotationList>
+
+    <!-- 商机   -->
+    <opportunity-dialog
+      :opportunityDialogFlag.sync="opportunityDialogFlag"
+      v-if="opportunityDialogFlag"
+      ref="opportunityDialogRef"
+      @changeParent="getOpportunityDetail"
+    ></opportunity-dialog>
+
+    <parentList ref="parentRef" @changeParent="changeParent"></parentList>
+    <head-list ref="headRef" @changeParent="changePersonel"></head-list>
+    <contractListDialog
+      ref="selectContractRef"
+      @changeParent="changeContract"
+      :contactData="contactData"
+      :isCreatedByOrder="2"
+    ></contractListDialog>
+    <projectListDialog
+      :contactData="contactData"
+      ref="selectProjectRef"
+      @changeParent="changeProject"
+    ></projectListDialog>
+    <process-submit-dialog
+      :isNotNeedProcess="true"
+      :processSubmitDialogFlag.sync="processSubmitDialogFlag"
+      v-if="processSubmitDialogFlag"
+      ref="processSubmitDialogRef"
+      @reload="reload"
+      :callBack="callBack"
+    ></process-submit-dialog>
+    <bomDialog
+      ref="bomDialogRef"
+      @handleSubmit="bomDialogSuccess"
+      @reload="reload"
+    ></bomDialog>
+    <saleOrderListDialog
+      ref="saleOrderListDialogRef"
+      :isMy="true"
+      @changeParent="saleOrderListDialogChange"
+    ></saleOrderListDialog>
+    <!--  退货  -->
+    <return-order-dialog
+      :returnOrderDialogFlag.sync="returnOrderDialogFlag"
+      v-if="returnOrderDialogFlag"
+      @changeParent="changeReturn"
+    >
+    </return-order-dialog>
+  </ele-modal>
+</template>
+
+<script>
+  import { emailReg, numberReg, telReg } from 'ele-admin';
+  import inventoryTable from '@/BIZComponents/inventoryTable.vue';
+  import fileUpload from '@/components/upload/fileUpload';
+  import dictMixins from '@/mixins/dictMixins';
+  import parentList from '@/views/saleManage/contact/components/parentList.vue';
+  import {
+    getDetail,
+    updateContractStatus
+  } from '@/api/contractManage/contractBook';
+  import {
+    contactDetail,
+    updateRelationStatus
+  } from '@/api/saleManage/contact';
+
+  import {
+    getSaleOrderDetail,
+    UpdateInformation,
+    addInformation,
+    submit,
+    getByRepeatBomAttribute,
+    saveOrderBomList
+  } from '@/api/saleManage/saleorder';
+  import { getDetail as getOpportunityInfo } from '@/api/saleManage/businessOpportunity';
+  import { getcontactlink } from '@/api/saleManage/businessFollow';
+  import headList from '@/BIZComponents/user-select/user-select.vue';
+  import contractListDialog from './contractListDialog.vue';
+  import projectListDialog from './projectListDialog.vue';
+
+  import paymentList from './paymentList.vue';
+  import { listOrganizations } from '@/api/system/organization';
+  import { copyObj } from '@/utils/util';
+  import { enterprisePage } from '@/api/contractManage/contractBook';
+  // import fileMain from '@/components/addDoc/index.vue';
+  import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
+  import { getUserDetail } from '@/api/system/organization/index.js';
+  import typeList from './typeList.vue';
+  import bomDialog from './bomDialog';
+  import saleOrderListDialog from '@/views/saleManage/saleOrder/invoice/components/orderListDialog.vue';
+  import { parameterGetByCode } from '@/api/main/index.js';
+  import quotationList from '@/views/contractManage/contractBook/components/quotationList.vue';
+  import returnOrderDialog from '@/views/saleManage/saleOrder/customerReturnOrder/returnOrderDialog.vue';
+  import opportunityDialog from '@/views/financialManage/components/opportunityDialog.vue';
+  import { mapGetters } from 'vuex';
+  import personSelect from '@/components/CommomSelect/person-select.vue';
+  import { resetPassword } from '@/api/system/user';
+  export default {
+    mixins: [dictMixins],
+    components: {
+      processSubmitDialog,
+      returnOrderDialog,
+      // fileMain,
+      fileUpload,
+      headList,
+      contractListDialog,
+      projectListDialog,
+      paymentList,
+      inventoryTable,
+      parentList,
+      typeList,
+      bomDialog,
+      quotationList,
+      saleOrderListDialog,
+      opportunityDialog,
+      personSelect,
+    },
+    props: {
+      contactData: {
+        type: Object,
+        default: () => {
+          return {};
+        }
+      },
+      isRequired: {
+        type: Boolean,
+        default: true
+      }
+    },
+    data() {
+      let formDef = {
+        id: '',
+        isSuspend: 0,
+        contractId: '',
+        orderFiles: [],
+        contractName: '',
+        projectName: '',
+        projectId: '',
+        pricingWay: 1,
+        payAmount: '',
+        generatePurchase: 0,
+        generateProduce: 0,
+        generateProject: 0,
+        projectName: '',
+        projectId: '',
+        receiveAddress: '',
+        remark: '',
+        saleType: '',
+        saleTypeName: '',
+        totalAmount: 0,
+        settlementMode: '4',
+        settlementModeName: '分期付款',
+        partaUnifiedSocialCreditCode: '',
+        partbUnifiedSocialCreditCode: '',
+        productionRequirements: '',
+        partaAddress: '',
+        partaEmail: '',
+        partaFax: '',
+        partaId: '',
+        partaLinkId: '',
+        partaLinkName: '',
+        partaName: '',
+        partaTel: '',
+        partbAddress: '',
+        partbEmail: '',
+        partbFax: '',
+        partbId: '',
+        partbLinkId: '',
+        partbLinkName: '',
+        partbName: '',
+        partbTel: '',
+        needProduce: 1,
+        planNumUnit: '立方',
+        receivePerson: '',
+        relationType: '',
+        relationName: '',
+        relationCode: '',
+        relationId: '',
+        createDeptName: '',
+        salesmanId: ''
+      };
+
+      return {
+        returnOrderDialogFlag: false,
+        customerMark: '',
+        opportunityDialogFlag: false,
+        projectData: {}, //项目数据
+        clearing: false, //是否清除合同
+        processSubmitDialogFlag: false,
+        fullscreen: false, //全屏
+        linkNameOptions: [],
+        cacheKeyUrl: 'eos-saleManage-saleOrder-inventoryTable',
+        visible: false,
+        title: '',
+        formDef,
+        form: copyObj(formDef),
+        tableLinkData: [],
+        // 组织机构树形结构数据
+        groupTreeData: [],
+        groupData: [],
+        tableList: [],
+        // rules: {
+        //   settlementMode: [
+        //     { required: true, message: '请选择结算方式', trigger: 'change' }
+        //   ],
+
+        //   saleType: [
+        //     { required: true, message: '请选择销售类型', trigger: 'change' }
+        //   ],
+
+        //   partaName: [
+        //     { required: true, message: '请选择客户名称', trigger: 'change' }
+        //   ],
+        //   partaLinkName: [
+        //     { required: true, message: '请选择客户联系人', trigger: 'change' }
+        //   ],
+        //   acceptUnpack: [
+        //     { required: true, message: '请选择是否接受', trigger: 'change' }
+        //   ],
+        //   partaTel: [
+        //     {
+        //       required: true,
+        //       pattern: telReg,
+        //       message: '请输入客户联系电话',
+        //       trigger: 'blur'
+        //     }
+        //   ],
+
+        //   partbName: [
+        //     { required: true, message: '请输入售出方名称', trigger: 'change' }
+        //   ],
+        //   partbLinkName: [
+        //     { required: true, message: '请输入售出方联系人', trigger: 'change' }
+        //   ],
+        //   partbTel: [
+        //     {
+        //       required: true,
+        //       pattern: telReg,
+        //       message: '请输入售出方联系电话',
+        //       trigger: 'blur'
+        //     }
+        //   ],
+        //   partaEmail: [
+        //     { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
+        //   ],
+        //   payAmount: [{ required: true, message: '请输入', trigger: 'blur' }]
+        // },
+        // 提交状态
+        loading: false,
+        // 是否是修改
+        isUpdate: false,
+        enterprisePage: [],
+        businessId: '',
+        isBatchNo: 0,
+        isTaxRate: 0,
+        isSinglePrice: 0,
+        isDeptAndPerson: 0
+      };
+    },
+    computed: {
+      ...mapGetters(['user']),
+      rules() {
+        let isRequired = this.isRequired;
+        return {
+          settlementMode: [
+            {
+              required: this.getSaleTypeName(this.form.saleType) ? false : true,
+              message: '请选择结算方式',
+              trigger: 'change'
+            }
+          ],
+
+          saleType: [
+            { required: true, message: '请选择销售类型', trigger: 'change' }
+          ],
+          projectName: [
+            {
+              required: this.clientEnvironmentId == 4 ? true : false,
+              message: '请选择项目',
+              trigger: 'change'
+            }
+          ],
+
+          partaName: [
+            { required: true, message: '请选择客户名称', trigger: 'change' }
+          ],
+          partaLinkName: [
+            {
+              required: isRequired,
+              message: '请选择客户联系人',
+              trigger: 'change'
+            }
+          ],
+          acceptUnpack: [
+            { required: true, message: '请选择是否接受', trigger: 'change' }
+          ],
+          partaTel: [
+            {
+              required: isRequired,
+              pattern: telReg,
+              message: '请输入客户联系电话',
+              trigger: 'blur'
+            }
+          ],
+
+          partbName: [
+            { required: true, message: '请输入售出方名称', trigger: 'change' }
+          ],
+          partbLinkName: [
+            {
+              required: isRequired,
+              message: '请输入售出方联系人',
+              trigger: 'change'
+            }
+          ],
+          partbTel: [
+            {
+              required: isRequired,
+              pattern: telReg,
+              message: '请输入售出方联系电话',
+              trigger: 'blur'
+            }
+          ],
+          partaEmail: [
+            { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
+          ],
+          payAmount: [{ required: true, message: '请输入', trigger: 'blur' }],
+          salesmanId: [{ required: this.isDeptAndPerson == 1 ? true : false, message: '请选择业务员', trigger: 'change' }],
+          salesDeptId: [{ required: this.isDeptAndPerson == 1 ? true : false, message: '请选择销售部门', trigger: 'change' }],
+        };
+      }
+    },
+    created() {
+      console.log('user', this.user.info);
+      this.changePersonel();
+      this.getGroupAll();
+      this.getEnterprisePage();
+      //批次号是否必填//0否 1是
+      parameterGetByCode({
+        code: 'eom_saleOrder_entrusted_batchNo'
+      }).then((res) => {
+        this.isBatchNo = res.value;
+      });
+
+      // 销售部门是否必填//0否 1是
+      parameterGetByCode({
+        code: 'eom_saleOrder_Dept_and_person'
+      }).then((res) => {
+        this.isDeptAndPerson = res.value;
+        console.log('isDeptAndPerson', this.isDeptAndPerson);
+      });
+
+      // 税率是否必填//0否 1是
+      parameterGetByCode({
+        code: 'eom_saleOrder_order-taxRate'
+      }).then((res) => {
+        this.isTaxRate = res.value;
+      });
+
+      // 单价是否必填//0否 1是
+      parameterGetByCode({
+        code: 'eom_saleOrder_single_price'
+      }).then((res) => {
+        this.isSinglePrice = res.value;
+        console.log('isSinglePrice', this.isSinglePrice);
+      });
+    },
+    methods: {
+      setCountAmount(allPrice) {
+        this.form.totalAmount = allPrice;
+        this.form.payAmount = allPrice;
+      },
+      setTotalPlanNum(totalPlanNum) {
+        this.$set(this.form, 'totalPlanNum', totalPlanNum);
+      },
+      discountInput() {
+        this.$refs.inventoryTable.discountInputByOrder(this.form.payAmount);
+      },
+      // 选择负责人部门
+      change_principalDep(id) {
+        const info = this.groupData.find((e) => e.id == id);
+        this.form.salesDeptName = info?.name;
+        this.form.salesmanId = '';
+        this.form.salesmanName = '';
+        // 根据部门获取人员
+        this.$nextTick(() => {});
+        this.getSalesmanUser(id);
+
+      },
+      getSalesmanUser(groupId) {
+        if (groupId) {
+          this.$refs.salseManDirectorRef.getList({ groupId });
+        }
+      },
+
+      salesmanChange(val, info) {
+        this.$set(this.form, 'salesmanId', val);
+        this.$set(this.form, 'salesmanName', info.name);
+      },
+      // 获取公司数据
+      getGroupAll() {
+        listOrganizations().then((list) => {
+          this.groupData = list;
+          this.groupTreeData = this.$util.toTreeData({
+            data: list,
+            idField: 'id',
+            parentIdField: 'parentId'
+          });
+        });
+      },
+
+      //选择商机
+      handOpportunity(e) {
+        this.opportunityDialogFlag = true;
+        this.$nextTick(() => {
+          let item = {
+            id: this.form.sourceId
+          };
+          this.$refs.opportunityDialogRef.init(item);
+        });
+      },
+      //获取商机信息
+      async getOpportunityDetail(row) {
+        this.$set(this.form, 'relationName', row.name);
+        this.$set(this.form, 'relationId', row.id);
+        this.$set(this.form, 'relationCode', row.code);
+
+        let cusInfo = await contactDetail(row.contactId);
+        let info = await getOpportunityInfo(row?.id ?? '');
+        await this.getLinkInfo(cusInfo.base.id);
+        let totalPrice = info.productList.reduce((num, cur) => {
+          return num + Number(cur.totalPrice);
+        }, 0);
+        info.productList.forEach((item) => {
+          item.discountSinglePrice =
+            item.discountSinglePrice || item.singlePrice;
+          item.discountTotalPrice = item.discountTotalPrice || item.totalPrice;
+        });
+        let discountTotalPrice = info.productList.reduce((num, cur) => {
+          return num + Number(cur.discountTotalPrice);
+        }, 0);
+
+        this.form = Object.assign({}, this.form, {
+          partaName: cusInfo.base.name,
+          partaId: cusInfo.base.id,
+          partaUnifiedSocialCreditCode: cusInfo.base.unifiedSocialCreditCode,
+          partaAddress: cusInfo.base.addressName + cusInfo.base.address,
+          partaLinkName: cusInfo.linkList[0]?.linkName,
+          partaLinkId: cusInfo.linkList[0]?.id,
+          partaTel: cusInfo.linkList[0]?.mobilePhone,
+          totalPrice: totalPrice,
+          discountTotalPrice: discountTotalPrice
+        });
+
+        if (this.enterprisePage.length === 1) {
+          this.form.partbName = this.enterprisePage[0].name;
+          this.form.partbId = this.enterprisePage[0].id;
+          this.getEnterprise();
+        }
+
+        this.$nextTick(() => {
+          this.$refs.inventoryTable &&
+            this.$refs.inventoryTable.putTableValue(info);
+        });
+        // let form = {
+        //   contractVO: {
+
+        //   },
+        //   productList: info.productList || []
+        // };
+      },
+
+      //选择报价单
+      handQuotation(e) {
+        this.$refs.quotationListRef.open();
+      },
+
+      //报价单
+      async changeQuotationList({ data, sourceCode, sourceId }) {
+        this.form = Object.assign({}, this.form, {
+          relationCode: sourceCode,
+          relationId: sourceId
+        });
+        this.getDetailData('', data);
+      },
+
+      //选择退货单
+      handleReturnBtn(e) {
+        // this.$refs.returnListRef.open();
+        if (e.target.nodeName == 'I') {
+          this.$set(this.form, 'relationCode', '');
+          this.$set(this.form, 'relationId', '');
+          return;
+        }
+        this.returnOrderDialogFlag = true;
+      },
+
+      //退货单
+      async changeReturn(row) {
+        console.log('data~~~', row);
+        this.form = Object.assign({}, this.form, {
+          relationCode: row.returnNo,
+          relationId: row.id
+        });
+        this.getReturnOrderDetail(row);
+      },
+
+      async getReturnOrderDetail(row) {
+        console.log('row', row.orderNo);
+        // let data = null;
+        // if (row) {
+        //   data = row;
+        // } else {
+        //   data = await getSaleOrderDetail(id);
+        // }
+        const id = row.orderIds.split(',')[0];
+        const res = await getSaleOrderDetail(id);
+        console.log('res~~~~', res);
+        // this.form = Object.assign({}, this.form, res);
+        if (row.partaId) {
+          await this.changeParent({ id: row.partaId }, true);
+        }
+        if (res) {
+          let {
+            partaAddress,
+            partaEmail,
+            partaFax,
+            partaId,
+            partaLinkId,
+            partaLinkName,
+            partaName,
+            partaTel,
+            partbAddress,
+            partbEmail,
+            partbFax,
+            partbId,
+            partbLinkId,
+            partbLinkName,
+            partbName,
+            partbTel,
+            totalPrice,
+            discountTotalPrice,
+            partaUnifiedSocialCreditCode,
+            partbUnifiedSocialCreditCode,
+            settlementMode,
+            settlementModeName,
+            pricingWay,
+            productList,
+            typedetailList,
+            totalAmount,
+            payAmount
+          } = res;
+          this.form = Object.assign({}, this.form, {
+            partaAddress,
+            partaEmail,
+            partaFax,
+            partaId,
+            partaLinkId,
+            partaLinkName,
+            partaName,
+            partaTel,
+            partbAddress,
+            partbEmail,
+            partbFax,
+            partbId,
+            partbLinkId,
+            partbLinkName,
+            partbName,
+            partbTel,
+            totalPrice,
+            discountTotalPrice,
+            partaUnifiedSocialCreditCode,
+            partbUnifiedSocialCreditCode,
+            settlementMode,
+            settlementModeName,
+            pricingWay,
+            productList,
+            typedetailList,
+            totalAmount,
+            payAmount
+          });
+          this.$nextTick(() => {
+            this.$refs.inventoryTable &&
+              this.$refs.inventoryTable.putTableValue(res);
+            this.$refs.typeListRef &&
+              this.$refs.typeListRef.putTableValue(res.typedetailList);
+
+            this.getLinkInfo(row.partaId);
+            // this.$store.commit('order/setContractId', row.partaId);
+          });
+        }
+      },
+
+      //选择合同获取合同的详情
+      async getDetailData(id, row) {
+        this.loading = true;
+        let data = null;
+        if (row) {
+          data = row;
+        } else {
+          data = await getDetail(id);
+        }
+        this.loading = false;
+        if (data) {
+          await this.changeParent({ id: data.contractVO?.partaId }, true);
+          let { contractVO } = data;
+          
+          this.$nextTick(() => {
+            let {
+              partaAddress,
+              partaEmail,
+              partaFax,
+              partaId,
+              partaLinkId,
+              partaLinkName,
+              partaName,
+              partaTel,
+              partbAddress,
+              partbEmail,
+              partbFax,
+              partbId,
+              partbLinkId,
+              partbLinkName,
+              partbName,
+              partbTel,
+              totalPrice,
+              discountTotalPrice,
+              partaUnifiedSocialCreditCode,
+              partbUnifiedSocialCreditCode,
+              settlementMode,
+              settlementModeName,
+              pricingWay,
+              contractNo,
+              contractNumber,
+              contractName,
+              businessDeptId,
+              businessDeptName,
+              businessUserId,
+              businessUserName,
+            } = contractVO;
+            if(businessDeptId){
+              this.getSalesmanUser(businessDeptId);
+            }
+            this.form = Object.assign(
+              {},
+              this.form,
+              {
+                partaAddress,
+                partaEmail,
+                partaFax,
+                partaId,
+                partaLinkId,
+                partaLinkName,
+                partaName,
+                partaTel,
+                partbAddress,
+                partbEmail,
+                partbFax,
+                partbId,
+                partbLinkId,
+                partbLinkName,
+                partbName,
+                partbTel,
+                pricingWay,
+                totalPrice,
+                discountTotalPrice,
+                partaUnifiedSocialCreditCode,
+                partbUnifiedSocialCreditCode,
+                totalAmount: totalPrice,
+                payAmount: discountTotalPrice || totalPrice,
+                receiveAddress: this.clientEnvironmentId == 5 ? '' : partaAddress,
+                settlementMode,
+                settlementModeName,
+                contractNo,
+                contractNumber,
+
+                salesDeptId: businessDeptId,
+                salesDeptName: businessDeptName,
+                salesmanId: businessUserId,
+                salesmanName: businessUserName,
+              },
+              !row
+                ? {
+                    relationName: contractName,
+                    relationCode: contractNumber,
+                    relationId: id
+                  }
+                : {}
+            );
+            data.productList = data.productList.map((item) => {
+              item['saleCount'] = item.contractCount || item.saleCount;
+              item['saleUnit'] = item.contractUnit || item.saleUnit;
+              item['saleUnitId'] = item.contractUnitId || item.saleUnitId;
+              return item;
+            });
+
+            this.getLinkInfo(partaId);
+            this.$refs.inventoryTable &&
+              this.$refs.inventoryTable.putTableValue(data);
+          });
+        }
+      },
+
+      //获取订单详情
+      async getSaleOrderDetail(id) {
+        this.businessId = id;
+        this.loading = true;
+        const data = await getSaleOrderDetail(id);
+        this.loading = false;
+        this.form = data;
+        if (data.partaId) {
+          await this.changeParent({ id: data.partaId }, true);
+        }
+
+        if (data) {
+          data.saleType = +data.saleType;
+          this.$nextTick(() => {
+            if(data.salesDeptId) {
+              this.getSalesmanUser(data.salesDeptId);
+            }
+            this.$refs.inventoryTable &&
+              this.$refs.inventoryTable.putTableValue(data);
+            this.$refs.typeListRef &&
+              this.$refs.typeListRef.putTableValue(data.typedetailList);
+
+            this.getLinkInfo(data.partaId);
+            this.$store.commit('order/setContractId', data.partaId);
+          });
+        }
+      },
+
+      //更新联系人数据
+      async getLinkInfo(contactId) {
+        const data = await getcontactlink({ contactId });
+        if (data && data?.length) {
+          this.linkNameOptions = data;
+        }
+      },
+
+      //选择下拉框
+      onchangeLink(selectedOptions) {
+        const option = this.linkNameOptions.find(
+          (opt) => opt.id === selectedOptions
+        );
+        this.form = Object.assign({}, this.form, {
+          partaEmail: option?.email,
+          partaLinkName: option?.linkName || '',
+          partaTel: option?.mobilePhone || option?.phone || '',
+          partaLinkId: option?.id
+        });
+      },
+
+      handHead() {
+        let item = {
+          id: this.form.partbLinkId
+        };
+        this.$refs.headRef.open(item);
+      },
+      orderListShow() {
+        this.$refs.saleOrderListDialogRef.open();
+      },
+      async saleOrderListDialogChange(row) {
+        let data = await getSaleOrderDetail(row.id);
+        [
+          'id',
+          'orderId',
+          'createTime',
+          'createUserId',
+          'createUserName',
+          'createDept',
+          'orderNo',
+          'orderStatus',
+          'outboundStatus',
+          'payStatus',
+          'preOrderNo',
+          'progress',
+          'processInstanceId',
+          'orderBomList'
+        ].forEach((key) => {
+          delete data[key];
+          data.productList.forEach((item) => {
+            if (['id', 'createTime', 'createUserId', 'orderId'].includes(key)) {
+              delete item[key];
+            }
+          });
+          data.typedetailList.forEach((item) => {
+            if (['id', 'createTime', 'createUserId', 'orderId'].includes(key)) {
+              delete item[key];
+            }
+          });
+        });
+
+        this.form = data;
+        if (data) {
+          data.saleType = +data.saleType;
+          this.$nextTick(() => {
+            this.$refs.inventoryTable &&
+              this.$refs.inventoryTable.putTableValue(data);
+            this.$refs.typeListRef &&
+              this.$refs.typeListRef.putTableValue(data.typedetailList);
+
+            this.getLinkInfo(data.partaId);
+            this.$store.commit('order/setContractId', data.partaId);
+          });
+        }
+      },
+      //选择售出方人回调
+      changePersonel(obj) {
+        if (!obj) {
+          obj = this.$store.getters.user.info;
+          obj.id = obj.userId;
+        }
+        this.$set(this.form, 'partbLinkId', obj.id);
+        this.$set(this.form, 'partbLinkName', obj.name);
+        this.$set(this.form, 'partbTel', obj.phone);
+        this.$set(this.form, 'partbEmail', obj.email);
+      },
+      //选择客户回调
+      async changeParent(obj, isCustomerMark) {
+        const { base, other, linkList } = await contactDetail(obj.id);
+        const userInfo = base?.salesmanId
+          ? await getUserDetail(base?.salesmanId)
+          : {};
+
+        this.customerMark = base?.serialNo;
+        // 新增时带出默认收货人
+        const defaultReceived = linkList.find((item) => item.isDefault === 1);
+        this.form.receivePerson = defaultReceived?.linkName;
+
+        if (isCustomerMark) {
+          return;
+        }
+
+        this.form = Object.assign({}, this.form, {
+          partaId: base?.id,
+          partaName: base?.name,
+          partaAddress: other?.addressName + other?.address,
+          partaLinkId: '',
+          partaLinkName: '',
+          partaEmail: '',
+          partaTel: '',
+          partaUnifiedSocialCreditCode: base?.unifiedSocialCreditCode,
+          customerMark: base?.serialNo,
+          receiveAddress: this.clientEnvironmentId == 5 ? '' :  other?.addressName + other?.address,
+          receivePerson: defaultReceived?.linkName
+        });
+        this.changePersonel(userInfo?.id ? userInfo : '');
+
+        await this.getLinkInfo(obj.id);
+        this.$nextTick(() => {
+          let firstLink =
+            this.linkNameOptions.find((item) => item.ifChief == 1) || {};
+          this.form = Object.assign({}, this.form, {
+            partaLinkId: firstLink.id || this.linkNameOptions[0]?.id,
+            partaLinkName:
+              firstLink.linkName || this.linkNameOptions[0]?.linkName,
+            partaTel:
+              firstLink.mobilePhone || this.linkNameOptions[0]?.mobilePhone
+          });
+          this.setProductInfo();
+        });
+      },
+      setProductInfo() {
+        if (this.$refs.inventoryTable && this.$refs.inventoryTable.form) {
+          this.$refs.inventoryTable?.form?.datasource.forEach((item, index) => {
+            this.$set(
+              this.$refs.inventoryTable?.form?.datasource[index],
+              'customerMark',
+              this.customerMark
+            );
+          });
+        }
+      },
+
+      saleTypeChange() {
+        if (this.getSaleTypeName()) {
+          this.$set(this.form, 'settlementMode', '');
+        }
+      },
+      getSaleTypeName() {
+        let saleTypeName =
+          this.getDictValue('销售类型', this.form.saleType) || '';
+        this.form.saleTypeName = saleTypeName;
+        if (
+          saleTypeName.indexOf('技改') != '-1' ||
+          saleTypeName.indexOf('三包') != '-1' ||
+          saleTypeName.indexOf('补发') != '-1'
+        ) {
+          return true;
+        } else {
+          return false;
+        }
+      },
+
+      //选择合同回调
+      changeContract(obj) {
+        this.form = Object.assign({}, this.form, {
+          contractId: obj.id,
+          contractName: obj.contractName,
+          relationType: 3,
+          productionRequirements: obj.productionRequirements
+        });
+        this.getDetailData(obj.id);
+        this.$store.commit('order/setContractId', obj.id);
+      },
+
+      //选择合同弹框
+      handleContractBtn() {
+        if (this.clearing) return;
+        let item = {
+          id: this.form.contractId
+        };
+        this.$refs.selectContractRef.open(item);
+      },
+      //选择项目回调
+      async changeProject(obj) {
+        this.projectData = obj;
+        this.form = Object.assign({}, this.form, {
+          projectName: obj.name,
+          projectId: obj.id,
+          projectCode: obj.code,
+          relationName: obj.name,
+          relationId: obj.id,
+          relationCode: obj.code
+        });
+
+        if (obj.contractId) {
+          this.changeContract({
+            id: obj.contractId,
+            contractName: obj.contractName
+          });
+        } else if (obj.contactId) {
+          this.changeParent({ id: obj.contactId });
+        }
+      },
+      //选择项目弹框
+      handleProjectBtn() {
+        if (this.clearing) return;
+        let item = {
+          id: this.form.projectId
+        };
+        this.$refs.selectProjectRef.open(item);
+      },
+
+      //清除合同
+      clearContrcat(type) {
+        if (type == 'project' && !this.form.projectId) {
+          return;
+        }
+        this.clearing = true;
+        let { id, saleType, saleTypeName, orderFiles, remark, relationType } =
+          this.form;
+        this.form = Object.assign({}, copyObj(this.formDef), {
+          id,
+          saleType,
+          saleTypeName,
+          relationType,
+          orderFiles,
+          remark,
+          createDeptName: this.user.info.groupName
+        });
+        this.projectData = {};
+
+        this.$store.commit('order/setContractId', '');
+        this.$refs.inventoryTable &&
+          this.$refs.inventoryTable.putTableValue([]);
+
+        setTimeout(() => {
+          this.clearing = false;
+        }, 500);
+      },
+
+      handParent() {
+        if (this.form.contractId) {
+          return this.$message.error('选择了合同不能更改客户名称');
+        }
+        let item = {
+          id: this.form.contactId
+        };
+        this.$refs.parentRef.open(item);
+      },
+      listFormatte(data) {
+        return data.filter((item) => item.dictCode !== 0);
+      },
+
+      //打开新增编辑弹框
+      async open(type, row, contactCategoryId) {
+        this.businessId = '';
+        this.title = type === 'add' ? '新增' : '修改';
+        this.clientEnvironmentId =
+          this.$store.state.user.info.clientEnvironmentId;
+        this.row = row;
+        if (this.enterprisePage.length == 0) {
+          await this.getEnterprisePage();
+        }
+        this.visible = true;
+
+        if (type == 'add') {
+          this.isUpdate = false;
+          if (this.enterprisePage.length > 0) {
+            this.form.partbName = this.enterprisePage[0].name;
+            this.form.partbId = this.enterprisePage[0].id;
+            this.form.partbUnifiedSocialCreditCode =
+              this.enterprisePage[0].unifiedSocialCreditCode;
+            this.form.partbFax = this.enterprisePage[0].fax;
+            this.form.partbAddress = this.enterprisePage[0].address;
+          }
+          if (this.contactData.id) {
+            this.changeParent({ id: this.contactData.id });
+          }
+          this.form.createDeptName = this.user.info.groupName;
+          this.form.saleType = 1;
+          // this.form.progress = 700;
+          //嘉实默认值
+          if (this.clientEnvironmentId == 5) {
+            this.form.saleType = 2;
+            this.form.needProduce = 0;
+            this.form.progress = 700;
+            this.form.settlementMode = '6';
+          }
+          //宝悦默认值
+          if (this.clientEnvironmentId == 4) {
+            this.form.needProduce = 4;
+            this.form.relationType = 4;
+          }
+        } else {
+          this.isUpdate = true;
+          this.getSaleOrderDetail(row.id);
+        }
+      },
+      needProduceChange() {
+        this.$nextTick(() => {
+          this.form.totalAmount = 0;
+          this.form.payAmount = 0;
+          this.form.progress = this.form.needProduce == 0 ? 700 : 0;
+          this.$refs.inventoryTable &&
+            this.$refs.inventoryTable.putTableValue({});
+          this.$refs.typeListRef && this.$refs.typeListRef.putTableValue([]);
+        });
+      },
+
+      //从合同页面新增订单
+      async contractOpen(row) {
+        this.title = '新增';
+        this.visible = true;
+        this.isUpdate = false;
+        if (this.enterprisePage.length == 0) {
+          await this.getEnterprisePage();
+        }
+        if (this.enterprisePage.length > 0) {
+          this.form.partbName = this.enterprisePage[0].name;
+          this.form.partbId = this.enterprisePage[0].id;
+          this.form.partbUnifiedSocialCreditCode =
+            this.enterprisePage[0].unifiedSocialCreditCode;
+          this.form.partbFax = this.enterprisePage[0].fax;
+          this.form.partbAddress = this.enterprisePage[0].address;
+        }
+        await this.changeContract(row);
+      },
+      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.partbName
+        );
+        this.form.partbName = data.name;
+        this.form.partbId = data.id;
+        this.form.partbUnifiedSocialCreditCode = data.unifiedSocialCreditCode;
+        this.form.partbFax = data.fax;
+        this.form.partbAddress = data.address;
+      },
+
+      settlementModeChange(info) {
+        this.form.settlementModeName = info.dictValue;
+      },
+      ifChiefChange(value, idx) {
+        if (value === 1) {
+          this.tableLinkData.forEach((e) => (e.ifChief = 0));
+          this.tableLinkData[idx].ifChief = 1;
+        }
+      },
+
+      getValidate() {
+        console.log(this.form);
+        let arr = [
+          new Promise((resolve, reject) => {
+            this.$refs.form.validate((valid) => {
+              if (!valid) {
+                reject(false);
+              } else {
+                resolve(true);
+              }
+            });
+          })
+        ];
+        if (this.form.needProduce != 4) {
+          arr.push(
+            new Promise((resolve, reject) => {
+              this.$refs.inventoryTable.validateForm((valid) => {
+                if (!valid) {
+                  reject(false);
+                } else {
+                  resolve(true);
+                }
+              });
+            })
+          );
+        }
+
+        if (this.form.needProduce == 4) {
+          arr.push(
+            new Promise((resolve, reject) => {
+              this.$refs.typeListRef.validateForm((valid) => {
+                if (!valid) {
+                  reject(false);
+                } else {
+                  resolve(true);
+                }
+              });
+            })
+          );
+        }
+
+        return Promise.all(arr);
+      },
+      async save(type) {
+        try {
+          await this.getValidate();
+          // 表单验证通过,执行保存操作
+          this.loading = true;
+          let isTemporary = [];
+
+          if (!this.isUpdate) {
+            delete this.form.id;
+          }
+
+          let commitData = Object.assign({}, this.form, {
+            productList: this.$refs?.inventoryTable?.getTableValue() || [],
+            typedetailList: this.$refs?.typeListRef?.getTableValue() || [],
+            saleTypeName: this.getDictValue('销售类型', this.form.saleType)
+            // progress: this.form.needProduce == 0 ? 700 : 0
+          });
+
+          if(commitData.isSuspend == 1 && commitData.productList?.length > 1){
+            this.$message.error('挂起订单只能选择一个产品');
+            return;
+          }
+          if (isTemporary.length > 0) {
+            this.$message.error(
+              isTemporary.toString() +
+                '是临时产品,无法创建订单,请先去主数据维护!'
+            );
+
+            return;
+          }
+          this.interfaceCall(commitData, type);
+        } catch (error) {
+          console.log(error);
+          // 表单验证未通过,不执行保存操作
+        }
+      },
+
+      interfaceCall(commitData, type) {
+        let API = this.isUpdate ? UpdateInformation : addInformation;
+        API(commitData)
+          .then((res) => {
+            this.loading = false;
+            if(this.form.partaId) {
+              updateRelationStatus([this.form.partaId]);
+            }
+            if (this.form.contractId) {
+              updateContractStatus([this.form.contractId]);
+            }
+            if (type === 'sub') {
+              this.saleOrderSubmitOrGenerate(res, commitData);
+              return;
+            } else {
+              this.$message.success('操作成功');
+            }
+            this.cancel();
+            this.$emit('done');
+          })
+          .catch((e) => {
+            //this.loading = false;
+          });
+      },
+
+      async callBack() {
+        if (!this.current.generatePurchase && !this.current.generateProduce) {
+          return 0;
+        }
+        const code = saveOrderBomList({
+          categoryDTOList: this.tableList || [],
+          orderId: this.current.id
+        });
+        return code;
+      },
+
+      async saleOrderSubmitOrGenerate(id) {
+        this.tableList = [];
+        this.current = await getSaleOrderDetail(this.businessId || id);
+        if (!this.current.generatePurchase && !this.current.generateProduce) {
+          this.saleOrderSubmit(this.current.id);
+        } else {
+          const data = await getByRepeatBomAttribute(this.current.id);
+          if (data && data.length) {
+            this.$refs.bomDialogRef.open(data);
+            return;
+          }
+          this.saleOrderSubmit(this.current.id);
+        }
+      },
+      bomDialogSuccess(tableList) {
+        this.tableList = tableList;
+
+        this.saleOrderSubmit(this.current.id);
+      },
+
+      async saleOrderSubmit(res) {
+        const data = await getSaleOrderDetail(this.businessId || res);
+        this.processSubmitDialogFlag = true;
+        let businessType =
+          data.needProduce == 1
+            ? '有客户生产性订单'
+            : data.needProduce == 2
+            ? '无客户生产性订单'
+            : data.needProduce == 4
+            ? '不定向订单'
+            : '库存式订单';
+        this.$nextTick(() => {
+          let params = {
+            businessId: data.id,
+            businessKey: 'sales_order_approve',
+            formCreateUserId: data.createUserId,
+            variables: {
+              businessCode: data.orderNo,
+              businessName: data.partaName,
+              businessType: businessType
+            }
+          };
+          this.$refs.processSubmitDialogRef.init(params);
+        });
+      },
+      reload() {
+        this.cancel();
+        this.$emit('done');
+      },
+      cancel() {
+        this.$nextTick(() => {
+          // 关闭后,销毁所有的表单数据
+          this.$refs['otherForm'] && this.$refs['otherForm'].resetFields();
+          this.$refs['formRef'] && this.$refs['formRef'].resetFields();
+          this.$store.commit('order/clearUserData');
+          this.form = copyObj(this.formDef);
+          this.visible = false;
+          this.projectData = {};
+        });
+      },
+      //查找合同分类对应name
+      findNameById(tree, targetId) {
+        for (let i = 0; i < tree.length; i++) {
+          const node = tree[i];
+          if (node.id === targetId) {
+            return node.name;
+          }
+          if (node.children && node.children.length > 0) {
+            const name = this.findNameById(node.children, targetId);
+            if (name) {
+              return name;
+            }
+          }
+        }
+        return null;
+      }
+    }
+  };
+</script>
+<style scoped lang="scss">
+  .TotalAmount {
+    font-size: 16px;
+    padding-right: 30px;
+  }
+  .totalPlanNum {
+    :deep(.el-input-group__append) {
+      width: 160px;
+    }
+  }
+</style>