chencc 1 год назад
Родитель
Сommit
e6e7c4b9ff

+ 5 - 2
src/views/productionPlan/components/factoryAdd/index.vue

@@ -338,8 +338,6 @@ export default {
     },
 
     confirmChoose(list) {
-
-      console.log(list, '6666666666666666');
       if (this.clientEnvironmentId == 4) {
         let data = {};
         if (list[0].name.includes('板材')) {
@@ -369,10 +367,15 @@ export default {
       this.$set(this.form, 'modelType', list[0].modelType);
       this.$set(this.form, 'measuringUnit', list[0].measuringUnit);
 
+      //重置
+      this.$set(this.form, 'produceType', '');
+      this.$set(this.form, 'bomCategoryId', '');
+      this.$set(this.form, 'produceRoutingId', '');
 
 
 
       this.bomListVersion();
+
     },
 
     handleDeleteItem(index) {

+ 7 - 1
src/views/productionPlan/index.vue

@@ -366,7 +366,11 @@
           { label: '所有计划类型', value: null },
           { label: '内销计划', value: '1' },
           { label: '外销计划', value: '2' },
-          { label: '预制计划', value: '3' }
+          { label: '预制计划', value: '3' },
+          { label: '改型计划', value: '4' },
+          { label: '返工返修计划', value: '5' },
+
+
         ],
         newColumns: [],
 
@@ -801,6 +805,7 @@
       },
       // 修改计划
       planEdit(row) {
+
         if (row.timeDimensionPlanType == 3) {
           this.factoryObj = row;
           // this.factoryType = ;
@@ -845,6 +850,7 @@
 
           this.newColumns = [...this.columns, ...newRes, ...privateColumn];
 
+
           this.$forceUpdate();
         });
       },

+ 0 - 1616
src/views/saleOrder/salesToProduction copy.vue

@@ -1,1616 +0,0 @@
-<template>
-  <div class="ele-body">
-    <el-card shadow="never">
-      <div class="body-title">
-        <div class="title-left">{{
-          type == 'edit' ? '计划修改' : '销售订单转生产计划'
-        }}</div>
-        <div class="title-right">
-          <el-button @click="cancel">取消</el-button>
-          <el-button type="primary" @click="handleProductionPlan">
-            生成生产计划
-          </el-button>
-        </div>
-      </div>
-      <el-form
-        ref="form"
-        :model="form"
-        :rules="rules"
-        label-width="100px"
-        class="formbox"
-      >
-        <el-row :gutter="24">
-          <el-col v-bind="styleResponsive ? { lg: 4, md: 8 } : { span: 4 }">
-            <el-form-item label="计划类型:">
-              <DictSelection
-                dictName="订单计划类型"
-                clearable
-                v-model="form.planType"
-                disabled
-              >
-              </DictSelection>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col v-bind="styleResponsive ? { lg: 4, md: 8 } : { span: 4 }">
-            <el-form-item label="加工方式:" prop="produceType">
-              <el-select
-                v-model="form.produceType"
-                style="width: 100%"
-                @change="changeProduceType"
-              >
-                <el-option
-                  v-for="item of producedList"
-                  :key="item.code"
-                  :label="item.name"
-                  :value="item.code"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <el-col
-            v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }"
-            v-if="clientEnvironmentId != 4"
-          >
-            <el-form-item label="BOM版本:" prop="bomCategoryId">
-              <el-select
-                v-model="form.bomCategoryId"
-                style="width: 100%"
-                @change="changeBomId"
-              >
-                <el-option
-                  v-for="item of bomVersionList"
-                  :key="item.id"
-                  :label="item.name + '(V' + item.versions + '.0)'"
-                  :value="item.id"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col> -->
-          <el-col v-bind="styleResponsive ? { lg: 4, md: 8 } : { span: 4 }">
-            <el-form-item label="余量系数:" prop="marginCoefficient">
-              <el-select
-                v-model="form.marginCoefficient"
-                filterable
-                allow-create
-                @change="itemChange"
-              >
-                <el-option
-                  v-for="(item, index) in marginList"
-                  :key="index"
-                  :label="item.name"
-                  :value="item.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { lg: 4, md: 8 } : { span: 4 }">
-            <el-form-item label="批次号:" prop="batchNo">
-              <el-input
-                placeholder="请输入批次号"
-                v-model="form.batchNo"
-              ></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { lg: 4, md: 10 } : { span: 4 }">
-            <el-form-item label="所属工厂:" prop="factoriesId">
-              <el-select v-model="form.factoriesId" style="width: 100%">
-                <el-option
-                  v-for="item of factoryList"
-                  :key="item.id"
-                  :label="item.name"
-                  :value="item.id"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <!-- <el-col
-            v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }"
-            v-if="clientEnvironmentId != 4"
-          >
-            <el-form-item label="工艺路线:" prop="produceRoutingId">
-              <el-select
-                v-model="form.produceRoutingId"
-                style="width: 100%"
-                @change="changeRoute"
-              >
-                <el-option
-                  v-for="item of routingList"
-                  :key="item.id"
-                  :label="item.name"
-                  :value="item.id"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col> -->
-
-          <el-col
-            v-bind="styleResponsive ? { lg: 4, md: 10 } : { span: 4 }"
-            v-if="clientEnvironmentId == 4"
-          >
-            <el-form-item label="工艺路线:" prop="produceRoutingId">
-              <el-input
-                v-model="form.produceRoutingName"
-                style="width: 100%"
-                readonly
-              ></el-input>
-            </el-form-item>
-          </el-col>
-
-          <!-- <el-col v-bind="styleResponsive ? { lg: 3, md: 6 } : { span: 3 }">
-            <el-form-item label="使用改型:" prop="modification">
-              <el-checkbox
-                v-model="form.modification"
-                :true-label="1"
-                :false-label="0"
-              ></el-checkbox>
-            </el-form-item>
-          </el-col> -->
-        </el-row>
-        <!-- 
-          <el-col v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }">
-            <el-form-item label="计划开始日期:" prop="startTime">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.startTime"
-                :pickerOptions="{
-                  disabledDate: (time) =>
-                    time.getTime() <
-                    new Date(new Date().setHours(0, 0, 0, 0)).getTime()
-                }"
-                type="date"
-                placeholder="选择日期"
-                value-format="yyyy-MM-dd"
-              >
-              </el-date-picker>
-            </el-form-item>
-          </el-col> -->
-
-        <!-- <el-col v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }">
-            <el-form-item label="计划结束日期:" prop="endTime">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.endTime"
-                :pickerOptions="{
-                  disabledDate: (time) =>
-                    time.getTime() <
-                    new Date(new Date().setHours(0, 0, 0, 0)).getTime()
-                }"
-                type="date"
-                placeholder="选择日期"
-                value-format="yyyy-MM-dd"
-              >
-              </el-date-picker>
-            </el-form-item>
-          </el-col> -->
-
-        <el-row :gutter="24" class="row-intro">
-          <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
-            <el-form-item label="销售单数量:">{{ form.codeNum }}</el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
-            <el-form-item label="订单总数量:">{{
-              form.contractNum
-            }}</el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 4 }">
-            <el-form-item label="订单总重量:">{{
-              form.sumOrderWeight
-            }}</el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
-            <el-form-item label="产品编码:">{{
-              form.productCode
-            }}</el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
-            <el-form-item label="牌号:">{{ form.brandNo }}</el-form-item>
-          </el-col>
-          <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 5 }">
-            <el-form-item label="型号:">{{ form.model }}</el-form-item>
-          </el-col>
-
-          <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 3 }">
-            <el-form-item label="规格:">{{ form.specification }}</el-form-item>
-          </el-col>
-          <!--
-          <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
-            <el-form-item label="库存数量:">{{
-              form.stockCountBase
-            }}</el-form-item>
-          </el-col> -->
-        </el-row>
-
-        <div class="add-product" @click="addEquipment" v-if="type != 'edit'">
-          <i class="el-icon-circle-plus-outline"></i>
-        </div>
-        <el-table :data="form.salesOrders" border>
-          <el-table-column label="序号" align="center" width="60">
-            <template slot-scope="scope">
-              <span>{{ scope.$index + 1 }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="销售订单号"
-            align="center"
-            prop="code"
-            width="120"
-            sortable
-          >
-          </el-table-column>
-
-          <el-table-column
-            label="产品名称"
-            align="center"
-            prop="productName"
-            width="120"
-          >
-          </el-table-column>
-
-          <el-table-column label="行号" align="center" prop="lineNumber">
-          </el-table-column>
-          <el-table-column
-            :label="'订单数量' + (clientEnvironmentId == '4' ? '(方)' : '')"
-            align="center"
-            prop="contractNum"
-            width="120"
-          >
-            <template slot-scope="scope">
-              {{ scope.row.contractNum }} {{ scope.row.measuringUnit }}
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="订单重量"
-            align="center"
-            prop="productSumWeight"
-            width="120"
-          >
-            <template slot-scope="scope">
-              {{ scope.row.productSumWeight }} {{ form.weightUnit }}
-            </template>
-          </el-table-column>
-          <el-table-column label="规格" align="center" prop="specification">
-          </el-table-column>
-          <el-table-column
-            :label="'欠交数量' + (clientEnvironmentId == '4' ? '(方)' : '')"
-            align="center"
-            prop="lackNum"
-          >
-          </el-table-column>
-          <el-table-column
-            :label="'计划生产数量' + (clientEnvironmentId == '4' ? '(方)' : '')"
-            align="center"
-            prop="planProductNum"
-            width="140"
-          >
-            <template slot-scope="scope">
-              <el-form-item
-                label-width="0px"
-                :prop="'salesOrders.' + scope.$index + '.planProductNum'"
-                :rules="{
-                  required: true,
-                  message: '请输入计划生产数量',
-                  trigger: 'blur'
-                }"
-                class="table-item"
-              >
-                <el-input
-                  v-model.number="scope.row.planProductNum"
-                  size="small"
-                  type="number"
-                  style="width: 100%"
-                  @input="
-                    tableHandleKeyUp(scope.row, scope.$index, $event, 'sum')
-                  "
-                  placeholder="输入数量"
-                ></el-input>
-              </el-form-item>
-            </template>
-          </el-table-column>
-          <el-table-column
-            :label="'要求生产数量' + (clientEnvironmentId == '4' ? '(方)' : '')"
-            align="center"
-            prop="requiredFormingNum"
-            width="120"
-          >
-            <template slot-scope="scope">
-              <el-form-item
-                label-width="0px"
-                :prop="'salesOrders.' + scope.$index + '.requiredFormingNum'"
-                :rules="{
-                  required: true,
-                  message: '请输入要求生产数量',
-                  trigger: 'blur'
-                }"
-                class="table-item"
-              >
-                <el-input
-                  v-model.number="scope.row.requiredFormingNum"
-                  size="small"
-                  disabled
-                  oninput="value=value.replace(/[^\d]/g,'')"
-                  style="width: 100%"
-                  placeholder="输入数量"
-                ></el-input>
-              </el-form-item>
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="模数"
-            align="center"
-            width="100"
-            v-if="clientEnvironmentId == '4'"
-          >
-            <template slot-scope="scope">
-              <div>
-                <el-input
-                  style="width: 100%"
-                  size="small"
-                  v-model="scope.row.moCount"
-                  oninput="value=value.replace(/[^0-9.]/g,'')"
-                  @input="
-                    tableHandleKeyUp(scope.row, scope.$index, $event, 'moCount')
-                  "
-                  placeholder="请输入"
-                >
-                </el-input>
-              </div>
-            </template>
-          </el-table-column>
-
-          <el-table-column
-            align="center"
-            width="100"
-            v-if="clientEnvironmentId == '4'"
-          >
-            <template slot="header">
-              <span style="color: red">*</span>
-              <span>块数</span>
-            </template>
-            <template slot-scope="scope">
-              <div>
-                <el-input
-                  size="small"
-                  style="width: 100%"
-                  oninput="value=value.replace(/[^0-9.]/g,'')"
-                  @input="
-                    tableHandleKeyUp(
-                      scope.row,
-                      scope.$index,
-                      $event,
-                      'blockCount'
-                    )
-                  "
-                  v-model="scope.row.blockCount"
-                  placeholder="请输入"
-                ></el-input>
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="权重等级"
-            align="center"
-            width="120"
-            v-if="clientEnvironmentId == '4'"
-          >
-            <template slot-scope="scope">
-              <div>
-                <el-select v-model="scope.row.weight" style="width: 100%">
-                  <el-option
-                    v-for="item of weightList"
-                    :key="item.code"
-                    :label="item.name"
-                    :value="item.code"
-                  ></el-option>
-                </el-select>
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column
-            align="center"
-            width="120"
-            label="是否开槽"
-            v-if="clientEnvironmentId == '4'"
-          >
-            <template slot-scope="scope">
-              <div>
-                <el-select
-                  style="width: 100%"
-                  v-model="scope.row.isSlotting"
-                  placeholder="请选择"
-                >
-                  <el-option
-                    v-for="item of isSlotting"
-                    :key="item.code"
-                    :label="item.name"
-                    :value="item.code"
-                  />
-                </el-select>
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column
-            align="center"
-            width="120"
-            label="开槽类型"
-            v-if="clientEnvironmentId == '4'"
-          >
-            <template slot-scope="scope">
-              <DictSelection
-                dictName="开槽类型"
-                v-model="scope.row.slottingType"
-                v-if="scope.row.isSlotting == 1"
-              >
-              </DictSelection>
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="按单按库"
-            align="center"
-            prop="orderLibraryType"
-          >
-            <template slot-scope="{ row }">
-              {{ getDictValue('按单按库', row.orderLibraryType) }}
-            </template>
-          </el-table-column>
-          <el-table-column label="订单类型" align="center" prop="orderType">
-            <template slot-scope="{ row }">
-              {{ getDictValue('订单类型', row.orderType) }}
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="交付日期"
-            align="center"
-            prop="deliveryTime"
-            width="160"
-          >
-          </el-table-column>
-          <el-table-column
-            label="要求完成日期"
-            align="center"
-            prop="reqMoldTime"
-            width="180"
-          >
-            <template slot-scope="scope">
-              <el-form-item
-                label-width="0px"
-                :prop="'salesOrders.' + scope.$index + '.reqMoldTime'"
-                :rules="{
-                  required: true,
-                  message: '请选择要求完成日期',
-                  trigger: 'blur'
-                }"
-                class="table-item"
-              >
-                <el-date-picker
-                  style="width: 100%"
-                  v-model="scope.row.reqMoldTime"
-                  :pickerOptions="{
-                    disabledDate: (time) =>
-                      time.getTime() <
-                      new Date(new Date().setHours(0, 0, 0, 0)).getTime()
-                  }"
-                  type="date"
-                  placeholder="选择日期"
-                  value-format="yyyy-MM-dd"
-                >
-                </el-date-picker>
-              </el-form-item>
-            </template>
-          </el-table-column>
-
-          <el-table-column label="客户名称" align="center" prop="customerName">
-          </el-table-column>
-          <el-table-column label="业务员" align="center" prop="salesman">
-          </el-table-column>
-          <el-table-column
-            label="交付要求"
-            align="center"
-            prop="deliveryRequirements"
-          >
-            <template slot-scope="{ row }">
-              {{ getDictValue('交付要求', row.deliveryRequirements) }}
-            </template>
-          </el-table-column>
-          <el-table-column
-            prop="priority"
-            label="优先级"
-            width="100"
-            align="center"
-          >
-            <template slot-scope="{ row, $index }">
-              <div style="display: flex">
-                <el-input
-                  v-if="$index == 0"
-                  v-model="row.priority"
-                  type="number"
-                  size="mini"
-                  :min="0"
-                  :max="10"
-                  @change="priorityChange(row)"
-                  style="width: 80px"
-                ></el-input>
-                <el-popover
-                  v-if="$index == 0"
-                  placement="right"
-                  width="200"
-                  trigger="hover"
-                  content="数值越大优先级越高(0-3普通, 4-6优先, 7-10紧急)"
-                >
-                  <div class="sort-wrap" slot="reference">
-                    <i class="el-icon-caret-top" @click="sortTop(row)"></i>
-                    <i
-                      class="el-icon-caret-bottom"
-                      @click="sortBottom(row)"
-                    ></i>
-                  </div>
-                </el-popover>
-              </div>
-            </template>
-          </el-table-column>
-
-          <el-table-column label="操作" align="center" width="70" fixed="right">
-            <template slot-scope="scope">
-              <el-button
-                type="text"
-                @click="handleDeleteItem(scope.$index)"
-                v-if="type != 'edit'"
-                >删除</el-button
-              >
-            </template>
-          </el-table-column>
-        </el-table>
-
-        <el-row style="margin-top: 24px">
-          <el-table :data="form.productPlanList" border>
-            <el-table-column label="序号" align="center" width="60">
-              <template slot-scope="scope">
-                <span>{{ scope.$index + 1 }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column
-              label="销售订单号"
-              align="center"
-              prop="code"
-              width="120"
-              sortable
-            >
-            </el-table-column>
-            <el-table-column
-              label="产品名称"
-              align="center"
-              prop="productName"
-              width="120"
-            >
-            </el-table-column>
-            <!-- <el-table-column
-              :label="'订单数量' + (clientEnvironmentId == '4' ? '(方)' : '')"
-              align="center"
-              prop="contractNum"
-              width="120"
-            >
-              <template slot-scope="scope">
-                {{ scope.row.contractNum }} {{ scope.row.measuringUnit }}
-              </template>
-            </el-table-column> -->
-            <el-table-column
-              label="订单重量"
-              align="center"
-              prop="productWeight"
-              width="120"
-            >
-              <template slot-scope="scope">
-                {{ scope.row.productWeight }} {{ form.weightUnit }}
-              </template>
-            </el-table-column>
-            <el-table-column label="规格" align="center" prop="specification">
-            </el-table-column>
-            <!-- <el-table-column
-              :label="'欠交数量' + (clientEnvironmentId == '4' ? '(方)' : '')"
-              align="center"
-              prop="lackNum"
-            >
-            </el-table-column> -->
-            <!-- <el-table-column
-              :label="
-                '计划生产数量' + (clientEnvironmentId == '4' ? '(方)' : '')
-              "
-              align="center"
-              prop="planProductNum"
-              width="140"
-            >
-              <template slot-scope="scope">
-                <el-form-item
-                  label-width="0px"
-                  :prop="'productPlanList.' + scope.$index + '.planProductNum'"
-                  :rules="{
-                    required: true,
-                    message: '请输入计划生产数量',
-                    trigger: 'blur'
-                  }"
-                  class="table-item"
-                >
-                  <el-input
-                    v-model.number="scope.row.planProductNum"
-                    size="small"
-                    type="number"
-                    style="width: 100%"
-                    @input="
-                      tableHandleKeyUp(scope.row, scope.$index, $event, 'sum')
-                    "
-                    placeholder="输入数量"
-                  ></el-input>
-                </el-form-item>
-              </template>
-            </el-table-column> -->
-            <el-table-column
-              :label="
-                '要求生产数量' + (clientEnvironmentId == '4' ? '(方)' : '')
-              "
-              align="center"
-              prop="requiredFormingNum"
-              width="120"
-            >
-              <!-- <template slot-scope="scope">
-                <el-form-item
-                  label-width="0px"
-                  :prop="
-                    'productPlanList.' + scope.$index + '.requiredFormingNum'
-                  "
-                  :rules="{
-                    required: true,
-                    message: '请输入要求生产数量',
-                    trigger: 'blur'
-                  }"
-                  class="table-item"
-                >
-                  <el-input
-                    v-model.number="scope.row.requiredFormingNum"
-                    size="small"
-                    disabled
-                    oninput="value=value.replace(/[^\d]/g,'')"
-                    style="width: 100%"
-                    placeholder="输入数量"
-                  ></el-input>
-                </el-form-item>
-              </template> -->
-            </el-table-column>
-            <el-table-column
-              label="模数"
-              align="center"
-              width="100"
-              v-if="clientEnvironmentId == '4'"
-            >
-              <template slot-scope="scope">
-                <div>
-                  <el-input
-                    style="width: 100%"
-                    size="small"
-                    v-model="scope.row.moCount"
-                    oninput="value=value.replace(/[^0-9.]/g,'')"
-                    @input="
-                      tableHandleKeyUp(
-                        scope.row,
-                        scope.$index,
-                        $event,
-                        'moCount'
-                      )
-                    "
-                    placeholder="请输入"
-                  >
-                  </el-input>
-                </div>
-              </template>
-            </el-table-column>
-
-            <el-table-column
-              align="center"
-              width="100"
-              v-if="clientEnvironmentId == '4'"
-            >
-              <template slot="header">
-                <span style="color: red">*</span>
-                <span>块数</span>
-              </template>
-              <template slot-scope="scope">
-                <div>
-                  <el-input
-                    size="small"
-                    style="width: 100%"
-                    oninput="value=value.replace(/[^0-9.]/g,'')"
-                    @input="
-                      tableHandleKeyUp(
-                        scope.row,
-                        scope.$index,
-                        $event,
-                        'blockCount'
-                      )
-                    "
-                    v-model="scope.row.blockCount"
-                    placeholder="请输入"
-                  ></el-input>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column
-              label="权重等级"
-              align="center"
-              width="120"
-              v-if="clientEnvironmentId == '4'"
-            >
-              <template slot-scope="scope">
-                <div>
-                  <el-select v-model="scope.row.weight" style="width: 100%">
-                    <el-option
-                      v-for="item of weightList"
-                      :key="item.code"
-                      :label="item.name"
-                      :value="item.code"
-                    ></el-option>
-                  </el-select>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column
-              align="center"
-              width="120"
-              label="是否开槽"
-              v-if="clientEnvironmentId == '4'"
-            >
-              <template slot-scope="scope">
-                <div>
-                  <el-select
-                    style="width: 100%"
-                    v-model="scope.row.isSlotting"
-                    placeholder="请选择"
-                  >
-                    <el-option
-                      v-for="item of isSlotting"
-                      :key="item.code"
-                      :label="item.name"
-                      :value="item.code"
-                    />
-                  </el-select>
-                </div>
-              </template>
-            </el-table-column>
-            <el-table-column
-              align="center"
-              width="120"
-              label="开槽类型"
-              v-if="clientEnvironmentId == '4'"
-            >
-              <template slot-scope="scope">
-                <DictSelection
-                  dictName="开槽类型"
-                  v-model="scope.row.slottingType"
-                  v-if="scope.row.isSlotting == 1"
-                >
-                </DictSelection>
-              </template>
-            </el-table-column>
-            <!-- <el-table-column
-              label="按单按库"
-              align="center"
-              prop="orderLibraryType"
-            >
-              <template slot-scope="{ row }">
-                {{ getDictValue('按单按库', row.orderLibraryType) }}
-              </template>
-            </el-table-column> -->
-            <!-- <el-table-column label="订单类型" align="center" prop="orderType">
-              <template slot-scope="{ row }">
-                {{ getDictValue('订单类型', row.orderType) }}
-              </template>
-            </el-table-column> -->
-            <el-table-column
-              label="交付日期"
-              align="center"
-              prop="deliveryTime"
-              width="160"
-            >
-            </el-table-column>
-            <el-table-column
-              label="要求完成日期"
-              align="center"
-              prop="reqMoldTime"
-              width="180"
-            >
-              <template slot-scope="scope">
-                <el-form-item
-                  label-width="0px"
-                  :prop="'productPlanList.' + scope.$index + '.reqMoldTime'"
-                  :rules="{
-                    required: true,
-                    message: '请选择要求完成日期',
-                    trigger: 'blur'
-                  }"
-                  class="table-item"
-                >
-                  <el-date-picker
-                    style="width: 100%"
-                    v-model="scope.row.reqMoldTime"
-                    :pickerOptions="{
-                      disabledDate: (time) =>
-                        time.getTime() <
-                        new Date(new Date().setHours(0, 0, 0, 0)).getTime()
-                    }"
-                    type="date"
-                    placeholder="选择日期"
-                    value-format="yyyy-MM-dd"
-                  >
-                  </el-date-picker>
-                </el-form-item>
-              </template>
-            </el-table-column>
-            <!-- <el-table-column
-              label="客户名称"
-              align="center"
-              prop="customerName"
-            >
-            </el-table-column> -->
-            <!-- <el-table-column label="业务员" align="center" prop="salesman">
-            </el-table-column> -->
-            <!-- <el-table-column
-              label="交付要求"
-              align="center"
-              prop="deliveryRequirements"
-            >
-              <template slot-scope="{ row }">
-                {{ getDictValue('交付要求', row.deliveryRequirements) }}
-              </template>
-            </el-table-column> -->
-            <el-table-column
-              prop="priority"
-              label="优先级"
-              width="100"
-              align="center"
-            >
-              <template slot-scope="{ row, $index }">
-                <div style="display: flex">
-                  <el-input
-                    v-if="$index == 0"
-                    v-model="row.priority"
-                    type="number"
-                    size="mini"
-                    :min="0"
-                    :max="10"
-                    @change="priorityChange(row)"
-                    style="width: 80px"
-                  ></el-input>
-                  <el-popover
-                    v-if="$index == 0"
-                    placement="right"
-                    width="200"
-                    trigger="hover"
-                    content="数值越大优先级越高(0-3普通, 4-6优先, 7-10紧急)"
-                  >
-                    <div class="sort-wrap" slot="reference">
-                      <i class="el-icon-caret-top" @click="sortTop(row)"></i>
-                      <i
-                        class="el-icon-caret-bottom"
-                        @click="sortBottom(row)"
-                      ></i>
-                    </div>
-                  </el-popover>
-                </div>
-              </template>
-            </el-table-column>
-          </el-table>
-        </el-row>
-        <el-row :gutter="24" style="margin-top: 24px">
-          <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }">
-            <el-form-item label="计划备注:">
-              <el-input
-                type="textarea"
-                :rows="4"
-                v-model="form.notes"
-                resize="none"
-              ></el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="24" style="text-align: right">
-          <el-button type="primary" @click="toSubmit" :loading="loading">
-            提交生产计划
-          </el-button>
-        </el-row>
-      </el-form>
-      <AdditionalOrder
-        ref="additionalRefs"
-        :productCode="form.productCode"
-        :selectList="form.salesOrders"
-        @choose="confirmChoose"
-      ></AdditionalOrder>
-      <ProductionVersion
-        ref="versionRefs"
-        @changeProduct="changeProduct"
-      ></ProductionVersion>
-      <PlanSubmit
-        ref="submitRefs"
-        :type="$route.query.type"
-        :info="form"
-        @publish="publishData"
-      ></PlanSubmit>
-    </el-card>
-  </div>
-</template>
-<script>
-  import AdditionalOrder from './components/AdditionalOrder.vue';
-  import PlanSubmit from './components/plan-submit.vue';
-  import ProductionVersion from '@/components/CreatePlan/ProductionVersion2.vue';
-  import {
-    productionToPlan,
-    saveSaleToPlan,
-    updateSaleToPlan,
-    releaseSave,
-    getInventory,
-    getUpdateInfoById,
-    // bomRoutingList,
-    bomListByPlan,
-    getFactoryList,
-    getGeneratePlan
-  } from '@/api/saleOrder';
-
-  import { getByCode } from '@/api/system/dictionary-data';
-
-  import dictMixins from '@/mixins/dictMixins';
-  import { deepClone } from '@/utils/index';
-  import { getRouteTabKey, removePageTab } from '@/utils/page-tab-util';
-  import { getCode } from '@/api/codeManagement';
-  import dayjs from 'dayjs';
-  import { debounce } from 'lodash';
-  export default {
-    mixins: [dictMixins],
-    components: {
-      AdditionalOrder,
-      ProductionVersion,
-      PlanSubmit
-    },
-    data() {
-      return {
-        type: this.$route.query.type,
-        weightList: [
-          { code: 1, name: 'A' },
-          { code: 2, name: 'B' },
-          { code: 3, name: 'C' }
-        ],
-        isSlotting: [
-          { code: 1, name: '是' },
-          { code: 2, name: '否' }
-        ], //是否开槽
-
-        producedList: [
-          { code: 1, name: 'PBOM()' },
-          { code: 2, name: '加工(MBOM)' },
-          { code: 3, name: '装配(ABOM)' }
-        ],
-
-        form: {
-          planType: 1,
-          produceRoutingId: '',
-
-          stockCountBase: '',
-          salesOrders: [],
-          produceRoutingName: '',
-          marginCoefficient: '1.0',
-          batchNo: null,
-          produceType: 1,
-          bomCategoryId: '',
-          factoriesId: '',
-          productPlanList: []
-        },
-
-        marginList: [],
-
-        bomVersionList: [],
-        routingList: [],
-        factoryList: [],
-
-        // 表单验证规则
-        rules: {
-          produceRoutingId: [
-            { required: true, message: '请选择工艺路线', trigger: 'blur' }
-          ],
-
-          factoriesId: [
-            { required: true, message: '请选择所属工厂', trigger: 'blur' }
-          ]
-        },
-        // selection: [],
-        loading: false
-      };
-    },
-    computed: {
-      clientEnvironmentId() {
-        return this.$store.state.user.info.clientEnvironmentId;
-      },
-      // 是否开启响应式布局
-      styleResponsive() {
-        return this.$store.state.theme.styleResponsive;
-      }
-    },
-    created() {
-      this.requestDict('按单按库');
-      this.requestDict('订单类型');
-      this.requestDict('交付要求');
-      this.getByCodeFn();
-      this.getFactoryList();
-      if (this.type == 'edit') {
-        this.getPlanInfo(this.$route.query.id);
-      } else {
-        this.getSaleInfo();
-      }
-      this.bomListVersion();
-    },
-    methods: {
-      async getFactoryList() {
-        this.factoryList = await getFactoryList();
-      },
-      async getPlanInfo(id) {
-        const data = await getUpdateInfoById(id);
-        this.form = data;
-
-        if (this.clientEnvironmentId != 4) {
-          this.getPlanRouting();
-        }
-      },
-      async _getInventory() {
-        const res = await getInventory(
-          this.form.productCode,
-          this.form.planType
-        );
-
-        this.form.stockCountBase = res;
-      },
-
-      getByCodeFn() {
-        getByCode('margin_code').then((res) => {
-          let _arr = [];
-          res.data.map((item) => {
-            const key = Object.keys(item)[0];
-            const value = item[key];
-
-            _arr.push({ name: key, value: value });
-          });
-          this.marginList = _arr;
-        });
-      },
-
-      getPlanRouting() {
-        // bomRoutingList(this.form.bomCategoryId).then((res) => {
-        //   this.routingList = res || [];
-        // });
-      },
-
-      bomListVersion() {
-        let param = {
-          bomType: this.form.produceType,
-          categoryId: this.form.salesOrders[0]?.categoryId
-        };
-        bomListByPlan(param).then((res) => {
-          this.bomVersionList = res || [];
-        });
-      },
-
-      changeProduceType() {
-        if (this.clientEnvironmentId == 4) {
-          return false;
-        }
-        this.form.bomCategoryId = '';
-        this.form['bomCategoryName'] = '';
-        this.form['bomCategoryVersions'] = '';
-
-        this.bomVersionList = [];
-
-        this.routingList = [];
-        this.form.produceRoutingId = '';
-        this.form.produceRoutingName = '';
-        this.form.produceVersionName = '';
-        this.bomListVersion();
-      },
-
-      changeBomId() {
-        this.routingList = [];
-        this.form.produceRoutingId = '';
-        this.form.produceRoutingName = '';
-        this.form.produceVersionName = '';
-
-        this.bomVersionList.forEach((f) => {
-          if (f.id == this.form.bomCategoryId) {
-            this.$set(this.form, 'bomCategoryName', f.name);
-            this.$set(this.form, 'bomCategoryVersions', f.versions);
-          }
-        });
-
-        this.getPlanRouting();
-      },
-
-      // changeRoute() {
-      //   this.routingList.forEach((f) => {
-      //     if (f.id == this.form.produceRoutingId) {
-      //       this.$set(this.form, 'produceRoutingName', f.name);
-      //       this.$set(this.form, 'produceVersionName', f.version);
-      //     }
-      //   });
-      // },
-
-      getSaleInfo() {
-        let params = JSON.parse(this.$route.query.selection);
-        productionToPlan(params).then((res) => {
-          res.productPlanList = res.productPlanList || [];
-          this.form = deepClone(res);
-          if (!this.form.produceType) {
-            this.form.produceType = 1;
-            this.bomListVersion();
-          }
-          this.form.produceRoutingName =
-            res.produceRoutingName || this.$route.query.produceRoutingName;
-          this.form.produceRoutingId =
-            res.produceRoutingId || this.$route.query.produceRoutingId;
-          this.form.factoriesId =
-            res.factoriesId || this.$route.query.factoriesId;
-          console.log(this.form.factoriesId);
-          if (this.clientEnvironmentId == '4') {
-            if (this.form.salesOrders[0].productName.includes('板材')) {
-              this.changeProduct({
-                id: '1856970794952372226',
-                name: '板材',
-                produceVersionName: '板材'
-              });
-            } else {
-              this.changeProduct({
-                id: '1857313733642596353',
-                name: '砌块',
-                produceVersionName: '砌块'
-              });
-            }
-          }
-          this.form.salesOrders.map((item, index) => {
-            if (this.clientEnvironmentId == '4') {
-              this.tableHandleKeyUp(item, '', item.lackNum, 'sum');
-            } else {
-              item.planProductNum = item.lackNum;
-              item.requiredFormingNum = item.lackNum;
-            }
-            item.slottingType = item.slottingType && item.slottingType + '';
-            item.priority = index + 1;
-
-            item.reqMoldTime = dayjs(
-              new Date(item.deliveryTime).getTime() - 3600 * 1000 * 24 * 10
-            ).format('YYYY-MM-DD');
-          });
-          if (this.form.salesOrders.every((itm) => itm.orderType == 2)) {
-            this.form.planType = 2;
-          } else if (this.form.salesOrders.every((itm) => itm.orderType == 1)) {
-            this.form.planType = 1;
-          } else {
-            this.form.planType = 3;
-          }
-          this._getInventory();
-        });
-        this.$forceUpdate();
-      },
-
-      itemChange() {
-        this.form.salesOrders.map((item, index) => {
-          this.$set(
-            item,
-            'requiredFormingNum',
-            item.planProductNum * (this.form.marginCoefficient || 1)
-          );
-        });
-      },
-
-      toInt(planProductNum) {
-        return planProductNum * (this.form.marginCoefficient || 1);
-      },
-
-      cancel() {
-        const key = getRouteTabKey();
-        this.$router.go(-1);
-        removePageTab({ key });
-      },
-      toSubmit() {
-        this.$refs.form.validate((valid) => {
-          if (valid) {
-            this.mapList();
-            this.$refs.submitRefs.open();
-          }
-        });
-      },
-      // 对比日期,计算要求生产重量
-      mapList() {
-        var _sumOrderWeight = 0;
-        var requiredFormingNum = 0;
-        var productNum = 0;
-        this.form.salesOrders.map((item, index) => {
-          requiredFormingNum =
-            Number(requiredFormingNum) + Number(item.requiredFormingNum);
-
-          if (
-            this.form.weightUnit == 'G' ||
-            this.form.weightUnit == 'g' ||
-            this.form.weightUnit == '克'
-          ) {
-            this.form.newWeightUnit = 'kg';
-            _sumOrderWeight =
-              (this.form.sumOrderWeight *
-                Number(this.form.marginCoefficient || 1)) /
-              1000;
-          } else {
-            this.form.newWeightUnit = this.form.weightUnit;
-            _sumOrderWeight =
-              this.form.sumOrderWeight *
-              Number(this.form.marginCoefficient || 1);
-          }
-
-          productNum += Number(item.planProductNum);
-        });
-        this.form.productNum = productNum;
-        this.form.productUnitWeight =
-          this.form.salesOrders[0]?.productUnitWeight;
-        this.form.newSumOrderWeight = _sumOrderWeight.toFixed(2);
-        this.form.requiredFormingNum = requiredFormingNum;
-        const collection = deepClone(this.form.salesOrders);
-        const sortedCollection = collection.sort(
-          (a, b) => new Date(b.reqMoldTime) - new Date(a.reqMoldTime)
-        );
-        let latestData = {};
-        for (let i = 0; i < sortedCollection.length; i++) {
-          const data = sortedCollection[i];
-          if (
-            !latestData.reqMoldTime ||
-            new Date(data.reqMoldTime) >= new Date(latestData.reqMoldTime)
-          ) {
-            latestData = data;
-          }
-        }
-        this.form.reqMoldTime = latestData.reqMoldTime;
-      },
-
-      sortTop(row) {
-        row.priority = Number(row.priority) + 1;
-        this.priorityChange(row);
-      },
-      sortBottom(row) {
-        if (row.priority <= 1) {
-          return;
-        }
-        row.priority = Number(row.priority) - 1;
-        this.priorityChange(row);
-      },
-
-      priorityChange(row) {
-        if (row.priority > 10) {
-          row.priority = 10; // 如果大于 10,则设置为 10
-        } else if (row.priority < 0) {
-          row.priority = 0; // 如果小于 0,则设置为 0
-        }
-
-        this.priorityFn(row);
-      },
-
-      priorityFn: debounce(function (row) {}, 800),
-
-      // 删除产品
-      handleDeleteItem(index) {
-        this.form.salesOrders.splice(index, 1);
-      },
-      addEquipment() {
-        this.$refs.additionalRefs.open(this.form.planType);
-      },
-      openVersion() {
-        this.$refs.versionRefs.open();
-      },
-      changeProduct(data) {
-        this.$set(this.form, 'produceRoutingName', data.name);
-        this.$set(this.form, 'produceRoutingId', data.id);
-        this.$set(this.form, 'produceVersionName', data.produceVersionName);
-      },
-      // 表格:模数、数量(方)、块数输入框 输入事件
-      tableHandleKeyUp(row, index, e, name) {
-        if (row.specification && this.clientEnvironmentId == '4') {
-          let modelArr = row.specification.split('*');
-          let modelLong = modelArr[0]; // model规格长度
-          let modeWide = modelArr[1]; // model规格宽度
-          let modeHight = modelArr[2].substr(0, modelArr[2].indexOf('cm')); // model规格高度
-          modeHight = Number(modeHight);
-          if (name === 'moCount') {
-            // 模数
-            row.moCount = e;
-            // 计算块数的公式:
-            // (一模6米长度 / model规格长度) * (一模1.2米宽度 / model规格宽度) = 每一模的块数
-            // 每一模的块数*模数moCount = 总块数
-            if (row.productName.includes('板材')) {
-              row.blockCount =
-                Math.floor(600 / modelLong) *
-                Math.floor(120 / modeHight) *
-                Math.floor(60 / modeWide) *
-                row.moCount;
-            } else if (row.productName.includes('砌块')) {
-              let modelLongFixed = (600 / modelLong).toFixed(2);
-              modelLongFixed = modelLongFixed.substring(
-                0,
-                modelLongFixed.length - 1
-              );
-              let modeWideFixed = (120 / modeWide).toFixed(2);
-              modeWideFixed = modeWideFixed.substring(
-                0,
-                modeWideFixed.length - 1
-              );
-              let modeHightFixed = (60 / modeHight).toFixed(2);
-              modeHightFixed = modeHightFixed.substring(
-                0,
-                modeHightFixed.length - 1
-              );
-              row.blockCount =
-                Math.floor(modelLongFixed * modeWideFixed * modeHightFixed) *
-                row.moCount;
-            }
-
-            row.planProductNum =
-              Nu((modelLong * modeWide * modeHight) / 1000000).toFixed(5) *
-              row.blockCount;
-          } else if (name === 'sum') {
-            //方数
-            row.planProductNum = e;
-
-            row.blockCount = Math.floor(
-              e / ((modelLong * modeWide * modeHight) / 1000000)
-            );
-            if (row.productName.includes('板材')) {
-              row.moCount = Math.ceil(
-                row.blockCount /
-                  (Math.floor(600 / modelLong) *
-                    Math.floor(120 / modeHight) *
-                    Math.floor(60 / modeWide))
-              );
-            } else if (row.productName.includes('砌块')) {
-              row.moCount = Math.ceil(
-                row.blockCount /
-                  Math.floor(
-                    (600 / modelLong) * (120 / modeHight) * (60 / modeWide)
-                  )
-              );
-            }
-          } else if (name === 'blockCount') {
-            //块数
-            row.blockCount = e;
-
-            if (row.productName.includes('板材')) {
-              row.moCount = Math.ceil(
-                row.blockCount /
-                  (Math.floor(600 / modelLong) *
-                    Math.floor(120 / modeHight) *
-                    Math.floor(60 / modeWide))
-              );
-            } else if (row.productName.includes('砌块')) {
-              row.moCount = Math.ceil(
-                row.blockCount /
-                  Math.floor(
-                    (600 / modelLong) * (120 / modeHight) * (60 / modeWide)
-                  )
-              );
-            }
-
-            row.planProductNum =
-              (Number(e) * modelLong * modeWide * modeHight) / 1000000;
-          }
-        }
-
-        row.requiredFormingNum = Number(
-          row.planProductNum * (this.form.marginCoefficient || 1)
-        ).toFixed(5);
-      },
-      confirmChoose(list) {
-        // 取出在弹窗中选中并且不在表格中的数据
-        const result = list.filter(
-          (i) => this.form.salesOrders.findIndex((p) => p.id === i.id) === -1
-        );
-        // 取出在表格中并且不在弹窗中选中的数据 即取消选中的数据
-        const del = this.form.salesOrders.filter(
-          (i) => list.findIndex((p) => p.id === i.id) === -1
-        );
-        for (let i = this.form.salesOrders.length - 1; i >= 0; i--) {
-          for (let j in del) {
-            if (this.form.salesOrders[i].id === del[j].id) {
-              this.form.salesOrders.splice(i, 1);
-            }
-          }
-        }
-        let priority =
-          this.form.salesOrders[this.form.salesOrders.length - 1]?.priority ||
-          0;
-        this.form.salesOrders = this.form.salesOrders.concat(
-          result.map((item, index) => {
-            item.priority = ++priority;
-
-            item.planProductNum = item.lackNum;
-            item.requiredFormingNum = item.lackNum;
-            item.reqMoldTime = dayjs(
-              new Date(item.deliveryTime).getTime() - 3600 * 1000 * 24 * 10
-            ).format('YYYY-MM-DD');
-            return item;
-          })
-        );
-        this.changeData();
-      },
-      changeData() {
-        var planProductNum = 0;
-        var productWeight = 0;
-
-        this.form.salesOrders.map((item, index) => {
-          item.priority = index + 1;
-          planProductNum = planProductNum + item.requiredFormingNum;
-          productWeight = productWeight + Number(item.productSumWeight);
-        });
-        this.$set(this.form, 'codeNum', this.form.salesOrders.length);
-        this.$set(this.form, 'contractNum', planProductNum);
-        this.$set(this.form, 'sumOrderWeight', productWeight.toFixed(2));
-      },
-
-      async publishData(type) {
-        const key = getRouteTabKey();
-        let params = deepClone(this.form);
-        params.categoryId = params.salesOrders[0]?.categoryId;
-        if (this.$route.query.type != 'edit') {
-          delete params.id;
-        }
-
-        if (type === 2) {
-          this.$confirm('发布工单后不可撤回,确定发布吗?', '发布确认').then(
-            async () => {
-              const loading = this.$loading({
-                lock: true,
-                fullscreen: true,
-                text: '工单发布中...'
-              });
-              try {
-                const code = await getCode('product_order_code');
-                const data = {
-                  productionPlan: params,
-                  workOrder: {
-                    productionPlanCode: params.code,
-                    code: code,
-                    // formingNum: params.contractNum,
-                    formingNum: this.form.requiredFormingNum,
-                    formingWeight: params.sumOrderWeight,
-                    produceRoutingId: params.produceRoutingId,
-                    status: 4,
-                    model: params.model,
-                    brandNo: params.brandNo,
-                    categoryId: params.categoryId,
-                    productCode: params.productCode,
-                    productName: params.productName,
-
-                    newWeightUnit: this.form.newWeightUnit,
-                    newSumOrderWeight: this.form.newSumOrderWeight
-                  }
-                };
-                if (this.$route.query.type == 'edit') {
-                  data.workOrder.productionPlanId = params.id;
-                }
-                console.log(data);
-                await releaseSave(data)
-                  .then((res) => {
-                    if (res === 1) {
-                      this.$message.success('工单已发布!');
-                      this.$router.push({
-                        path: '/productionPlan'
-                      });
-                    } else {
-                      this.$confirm(
-                        '生产计划创建成功,但工单发布失败。请前往【生产计划】列表【重新发布】工单',
-                        '提示',
-                        {
-                          confirmButtonText: '返回',
-                          cancelButtonText: '立即前往',
-                          type: 'warning'
-                        }
-                      )
-                        .then(() => {
-                          this.$router.push({
-                            path: '/productionPlan'
-                          });
-                        })
-                        .catch(() => {
-                          this.$router.go(-1);
-                        });
-                    }
-                    removePageTab({ key });
-                  })
-                  .catch(() => {
-                    this.$message.error('发布失败,请重新发布!');
-                  });
-              } catch (error) {}
-
-              loading.close();
-            }
-          );
-        } else {
-          let request =
-            this.$route.query.type == 'edit'
-              ? updateSaleToPlan
-              : saveSaleToPlan;
-
-          request(params)
-            .then(async (res) => {
-              // 提交
-              this.$router.push({
-                path: '/productionPlan'
-              });
-              removePageTab({ key });
-            })
-            .catch(() => {
-              this.$message.error('提交失败,请重新提交!');
-            });
-        }
-      },
-      preparePlanParams() {
-        const params = deepClone(this.form);
-        params.categoryId = params.salesOrders[0]?.categoryId;
-        if (this.$route.query.type != 'edit') {
-          delete params.id;
-        }
-        return params;
-      },
-      //生产生产计划
-      handleProductionPlan() {
-        const params = this.preparePlanParams();
-        getGeneratePlan(params)
-          .then((res) => {
-            this.form.productPlanList = res;
-            console.log(this.form.productPlanList);
-          })
-          .catch((error) => {
-            console.error('生成生产计划失败:', error);
-            this.$message.error('生成失败,请重新生成!');
-          });
-      }
-    }
-  };
-</script>
-<style lang="scss" scoped>
-  .ele-body {
-    background: #fff;
-  }
-
-  .body-title {
-    width: 100%;
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-  }
-
-  .title-left {
-    font-size: 20px;
-    color: #333;
-  }
-
-  .formbox {
-    margin: 20px auto;
-  }
-
-  .row-intro {
-    border-bottom: 1px dashed #ccc;
-    margin-bottom: 20px;
-  }
-
-  .add-product {
-    width: 100%;
-    display: flex;
-    align-items: center;
-    justify-content: flex-end;
-    font-size: 30px;
-    color: #1890ff;
-    margin: 10px 0;
-    cursor: pointer;
-  }
-
-  .table-item {
-    margin-bottom: 0;
-  }
-</style>

Разница между файлами не показана из-за своего большого размера
+ 105 - 692
src/views/saleOrder/salesToProduction.vue


+ 886 - 0
src/views/saleOrder/salesToProductionNew.vue

@@ -0,0 +1,886 @@
+<template>
+  <div class="ele-body">
+
+    <el-card shadow="never">
+      <div class="body-title">
+        <div class="title-left">{{
+          type == 'edit' ? '计划修改' : '销售订单转生产计划'
+        }}</div>
+        <div class="title-right">
+          <el-button @click="cancel">取消</el-button>
+          <el-button type="primary" @click="toSubmit">
+            保存
+          </el-button>
+        </div>
+      </div>
+
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px" class="formbox">
+        <el-row :gutter="24">
+
+          <el-col :span="6">
+            <el-form-item label="计划类型:">
+              <DictSelection dictName="订单计划类型" clearable v-model="form.planType" disabled>
+              </DictSelection>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="6">
+            <el-form-item label="加工方式:" prop="produceType">
+              <el-select v-model="form.produceType" style="width: 100%" @change="changeProduceType">
+                <el-option v-for="item of producedList" :key="item.code" :label="item.name"
+                  :value="item.code"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="6" v-if="clientEnvironmentId != 4">
+            <el-form-item label="BOM版本:" prop="bomCategoryId">
+              <el-select v-model="form.bomCategoryId" style="width: 100%" @change="changeBomId">
+                <el-option v-for="item of bomVersionList" :key="item.id"
+                  :label="item.name + '(V' + item.versions + '.0)'" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6" v-if="clientEnvironmentId != 4">
+
+            <el-form-item label="工艺路线:" prop="produceRoutingId">
+              <!--  @click.native="openVersion"   -->
+
+              <el-select v-model="form.produceRoutingId" style="width: 100%" @change="changeRoute">
+                <el-option v-for="item of routingList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6" v-if="clientEnvironmentId == 4">
+            <el-form-item label="工艺路线:" prop="produceRoutingId">
+              <el-input v-model="form.produceRoutingName" style="width: 100%" readonly></el-input>
+            </el-form-item>
+          </el-col>
+
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="余量系数:" prop="marginCoefficient">
+              <el-select v-model="form.marginCoefficient" filterable allow-create @change="itemChange">
+                <el-option v-for="(item, index) in marginList" :key="index" :label="item.name" :value="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="批次号:" prop="batchNo">
+              <el-input placeholder="请输入批次号" v-model="form.batchNo"></el-input>
+            </el-form-item>
+          </el-col>
+
+          <!-- <el-col :span="6">
+            <el-form-item label="所属工厂:" prop="factoriesId">
+              <el-select v-model="form.factoriesId" style="width: 100%">
+                <el-option v-for="item of factoryList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col> -->
+          <!-- <el-col :span="6">
+            <el-form-item label="工艺路线:" prop="produceRoutingId">
+              <el-select v-model="form.produceRoutingId" style="width: 100%" @change="changeRoute">
+                <el-option v-for="item of routingList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col> -->
+
+          <!-- <el-col :span="6">
+            <el-form-item label="工艺路线:" prop="produceRoutingId">
+              <el-input v-model="form.produceRoutingName" style="width: 100%" readonly></el-input>
+            </el-form-item>
+          </el-col> -->
+
+
+        </el-row>
+
+
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="计划数量:" prop="batchNo">
+              <el-input placeholder="请输入计划数量" v-model="form.productNum" disabled></el-input>
+            </el-form-item>
+          </el-col>
+
+          <!-- <el-col :span="6">
+            <el-form-item label="计划重量:" prop="">
+              <el-input placeholder="请输入计划重量" v-model="form.productWeight" disabled></el-input>
+            </el-form-item>
+          </el-col> -->
+
+          <el-col :span="6">
+            <el-form-item label="要求生产数量:">
+              <el-input placeholder="请输入要求生产数量" v-model="form.requiredFormingNum" disabled></el-input>
+            </el-form-item>
+          </el-col>
+
+
+          <!-- <el-col :span="6">
+            <el-form-item label="要求生产重量:">
+              <el-input placeholder="请输入要求生产重量" v-model="form.newSumOrderWeight" disabled></el-input>
+            </el-form-item>
+          </el-col> -->
+
+          <el-col :span="6">
+            <el-form-item label="名称:">
+              <el-input placeholder="请输入名称" v-model="form.productName" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="编码:">
+              <el-input placeholder="请输入编码" v-model="form.productCode" disabled></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="计划编号:">
+              <el-input placeholder="请输入计划编号" v-model="form.code" disabled></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+
+
+      </el-form>
+      <AdditionalOrder ref="additionalRefs" :productCode="form.productCode" :selectList="form.salesOrders"
+        @choose="confirmChoose"></AdditionalOrder>
+      <ProductionVersion ref="versionRefs" @changeProduct="changeProduct"></ProductionVersion>
+      <PlanSubmit ref="submitRefs" :type="$route.query.type" :info="form" @publish="publishData"></PlanSubmit>
+    </el-card>
+  </div>
+</template>
+<script>
+import AdditionalOrder from './components/AdditionalOrder.vue';
+import PlanSubmit from './components/plan-submit.vue';
+import ProductionVersion from '@/components/CreatePlan/ProductionVersion2.vue';
+import {
+  productionToPlan,
+  saveSaleToPlan,
+  updateSaleToPlan,
+  releaseSave,
+  getInventory,
+  getUpdateInfoById,
+  bomRoutingList,
+  bomListByPlan,
+  getFactoryList,
+  getGeneratePlan
+} from '@/api/saleOrder';
+
+import { getByCode } from '@/api/system/dictionary-data';
+
+import dictMixins from '@/mixins/dictMixins';
+import { deepClone } from '@/utils/index';
+import { getRouteTabKey, removePageTab } from '@/utils/page-tab-util';
+import { getCode } from '@/api/codeManagement';
+import dayjs from 'dayjs';
+import { debounce } from 'lodash';
+export default {
+  mixins: [dictMixins],
+  components: {
+    AdditionalOrder,
+    ProductionVersion,
+    PlanSubmit
+  },
+  props: {
+    formData: {
+      type: Object,
+      default: {}
+    }
+  },
+  watch: {
+    formData: {
+      handler(val) {
+
+
+        Object.assign(this.form, val);
+        // console.log(this.form,'1111111111122222');
+        this.$nextTick(() => {
+          if (val.produceRoutingId) {
+            this.bomListVersion();
+            this.changeBomId();
+          }
+          this.$set(this.form, 'produceRoutingId', val.produceRoutingId);
+        });
+
+      },
+      deep: true,
+      immediate: true
+    }
+  },
+  data() {
+    return {
+      type: this.$route.query.type,
+      weightList: [
+        { code: 1, name: 'A' },
+        { code: 2, name: 'B' },
+        { code: 3, name: 'C' }
+      ],
+      isSlotting: [
+        { code: 1, name: '是' },
+        { code: 2, name: '否' }
+      ], //是否开槽
+
+      producedList: [
+        { code: 2, name: '加工(MBOM)' },
+        { code: 3, name: '装配(ABOM)' }
+      ],
+
+      form: {
+        planType: 1,
+        produceRoutingId: '',
+
+        stockCountBase: '',
+        salesOrders: [],
+        produceRoutingName: '',
+        marginCoefficient: '1.0',
+        batchNo: null,
+        produceType: 1,
+        bomCategoryId: '',
+        factoriesId: '',
+        productPlanList: []
+      },
+
+      marginList: [],
+
+      bomVersionList: [],
+      routingList: [],
+      factoryList: [],
+
+      // 表单验证规则
+      rules: {
+        produceRoutingId: [
+          { required: true, message: '请选择工艺路线', trigger: 'blur' }
+        ],
+
+        factoriesId: [
+          { required: true, message: '请选择所属工厂', trigger: 'blur' }
+        ]
+      },
+      // selection: [],
+      loading: false
+    };
+  },
+  computed: {
+    clientEnvironmentId() {
+      return this.$store.state.user.info.clientEnvironmentId;
+    },
+    // 是否开启响应式布局
+    styleResponsive() {
+      return this.$store.state.theme.styleResponsive;
+    }
+  },
+  created() {
+    this.requestDict('按单按库');
+    this.requestDict('订单类型');
+    this.requestDict('交付要求');
+    this.getByCodeFn();
+    this.getFactoryList();
+    // if (this.type == 'edit') {
+    //   this.getPlanInfo(this.$route.query.id);
+    // } else {
+    //   this.getSaleInfo();
+    // }
+    this.bomListVersion();
+  },
+  methods: {
+
+    // 验证时间是否超期
+    changeDate(item, i) {
+      console.log(this.isTimeAGreaterThanB(item.deliveryTime, item.reqMoldTime));
+      if (this.isTimeAGreaterThanB(item.deliveryTime, item.reqMoldTime)) {
+        this.$message.error('交付时间大于了要求完成日期')
+      }
+
+    },
+    isTimeAGreaterThanB(timeA, timeB) {
+      return new Date(timeA) > new Date(timeB);
+    },
+
+
+    async getFactoryList() {
+      this.factoryList = await getFactoryList();
+    },
+    async getPlanInfo(id) {
+      const data = await getUpdateInfoById(id);
+      console.log('wwwwwwwwwwww', data);
+
+      this.form = data;
+
+      if (this.clientEnvironmentId != 4) {
+        this.bomListVersion()
+        this.getPlanRouting()
+      }
+
+
+
+    },
+    async _getInventory() {
+      const res = await getInventory(this.form.productCode, this.form.planType);
+
+      this.form.stockCountBase = res;
+    },
+
+    getByCodeFn() {
+      getByCode('margin_code').then((res) => {
+        let _arr = [];
+        res.data.map((item) => {
+          const key = Object.keys(item)[0];
+          const value = item[key];
+
+          _arr.push({ name: key, value: value });
+        });
+        this.marginList = _arr;
+      });
+    },
+
+
+    getPlanRouting() {
+
+      if (this.form.bomCategoryId) {
+        bomRoutingList(this.form.bomCategoryId).then((res) => {
+          this.routingList = res || []
+        })
+      }
+
+    },
+
+    bomListVersion() {
+      console.log(this.form, '1111111111');
+      let categoryId = ''
+
+      if (this.form.salesOrders.length) {
+        categoryId = this.form.salesOrders[0].categoryId;
+      } else if (this.form.categoryId) {
+        categoryId = this.form.categoryId
+      } else {
+        new Error('缺少产品信息')
+      }
+
+
+
+      let param = {
+        bomType: this.form.produceType,
+        categoryId: categoryId
+      }
+      bomListByPlan(param).then(res => {
+        this.bomVersionList = res || []
+      })
+    },
+
+
+    changeProduceType() {
+      if (this.clientEnvironmentId == 4) {
+        return false
+      }
+      this.form.bomCategoryId = '';
+      this.form['bomCategoryName'] = '';
+      this.form['bomCategoryVersions'] = '';
+
+
+      this.bomVersionList = [];
+
+      this.routingList = [];
+      this.form.produceRoutingId = '';
+      this.form.produceRoutingName = '';
+      this.form.produceVersionName = '';
+
+      this.bomListVersion()
+
+    },
+
+    changeBomId() {
+      this.routingList = []
+      this.form.produceRoutingId = ''
+      this.form.produceRoutingName = ''
+      this.form.produceVersionName = ''
+
+      this.bomVersionList.forEach((f) => {
+        if (f.id == this.form.bomCategoryId) {
+          this.$set(this.form, 'bomCategoryName', f.name);
+          this.$set(this.form, 'bomCategoryVersions', f.versions);
+        }
+
+      })
+
+      this.getPlanRouting()
+    },
+
+
+
+    changeRoute() {
+
+      console.log(this.routingList);
+      console.log(this.form.produceRoutingId);
+      this.$forceUpdate();
+      this.routingList.forEach((f) => {
+        if (f.id == this.form.produceRoutingId) {
+          this.$set(this.form, 'produceRoutingName', f.name);
+          this.$set(this.form, 'produceVersionName', f.version);
+        }
+
+      })
+    },
+
+    getSaleInfo() {
+      let params = JSON.parse(this.$route.query.selection);
+      productionToPlan(params).then((res) => {
+        console.log(res, '555555555555555555');
+        this.form = deepClone(res);
+        if (!this.form.produceType) {
+          this.form.produceType = 2;
+          this.bomListVersion()
+        }
+        this.form.produceRoutingName =
+          res.produceRoutingName || this.$route.query.produceRoutingName;
+        this.form.produceRoutingId =
+          res.produceRoutingId || this.$route.query.produceRoutingId;
+        this.form.factoriesId =
+          res.factoriesId || this.$route.query.factoriesId;
+        console.log(this.form.factoriesId, '99999999999999')
+        if (this.clientEnvironmentId == '4') {
+          if (this.form.salesOrders[0].productName.includes('板材')) {
+            this.changeProduct({
+              id: '1856970794952372226',
+              name: '板材',
+              produceVersionName: '板材'
+            });
+          } else {
+            this.changeProduct({
+              id: '1857313733642596353',
+              name: '砌块',
+              produceVersionName: '砌块'
+            });
+          }
+        }
+        this.form.salesOrders.map((item, index) => {
+
+
+          if (this.clientEnvironmentId == '4') {
+            this.tableHandleKeyUp(item, '', item.lackNum, 'sum');
+          } else {
+            item.planProductNum = item.lackNum;
+            item.requiredFormingNum = item.lackNum;
+          }
+          item.slottingType = item.slottingType && item.slottingType + '';
+          item.priority = index + 1;
+
+          item.reqMoldTime = dayjs(
+            new Date(item.deliveryTime).getTime() - 3600 * 1000 * 24 * 10
+          ).format('YYYY-MM-DD');
+        });
+        if (this.form.salesOrders.every((itm) => itm.orderType == 2)) {
+          this.form.planType = 2;
+        } else if (this.form.salesOrders.every((itm) => itm.orderType == 1)) {
+          this.form.planType = 1;
+        } else {
+          this.form.planType = 3;
+        }
+        this._getInventory();
+      });
+      this.$forceUpdate();
+    },
+
+    itemChange() {
+      this.form.salesOrders.map((item, index) => {
+        this.$set(
+          item,
+          'requiredFormingNum',
+          item.planProductNum * (this.form.marginCoefficient || 1)
+        );
+      });
+    },
+
+    factoriesIdFn(e) {
+
+
+
+      this.$forceUpdate()
+    },
+
+    toInt(planProductNum) {
+      return planProductNum * (this.form.marginCoefficient || 1);
+    },
+
+    cancel() {
+      const key = getRouteTabKey();
+      // this.$router.go(-1);
+      removePageTab({ key });
+
+      this.$emit('cancel');
+
+    },
+    toSubmit() {
+      if (!this.form.factoriesId) return this.$message.warning('请选择所属工厂');
+
+      this.$refs.form.validate((valid) => {
+
+        if (valid) {
+          // this.mapList();
+
+          this.$refs.submitRefs.open();
+        }
+      });
+    },
+    // // 对比日期,计算要求生产重量
+    // mapList() {
+    //   var _sumOrderWeight = 0;
+    //   var requiredFormingNum = 0;
+    //   var productNum = 0;
+    //   this.form.salesOrders.map((item, index) => {
+    //     requiredFormingNum = Number(requiredFormingNum) + Number(item.requiredFormingNum);
+
+    //     if (this.form.weightUnit == 'G' || this.form.weightUnit == 'g' || this.form.weightUnit == '克') {
+    //       this.form.newWeightUnit = 'kg';
+    //       _sumOrderWeight = (this.form.salesOrders[0].requiredFormingNum * Number(this.form.salesOrders[0].productUnitWeight || 1)) / 1000;
+    //     } else {
+    //       this.form.newWeightUnit = this.form.weightUnit;
+    //       _sumOrderWeight = (this.form.salesOrders[0].requiredFormingNum * Number(this.form.salesOrders[0].productUnitWeight || 1));
+    //     }
+
+    //     productNum += Number(item.planProductNum);
+    //   });
+    //   this.form.productNum = productNum;
+    //   this.form.productUnitWeight = this.form.salesOrders[0]?.productUnitWeight;
+    //   this.form.newSumOrderWeight = _sumOrderWeight.toFixed(2);
+    //   this.form.requiredFormingNum = requiredFormingNum;
+    //   const collection = deepClone(this.form.salesOrders);
+    //   const sortedCollection = collection.sort(
+    //     (a, b) => new Date(b.reqMoldTime) - new Date(a.reqMoldTime)
+    //   );
+
+    //   let latestData = {};
+    //   for (let i = 0; i < sortedCollection.length; i++) {
+    //     const data = sortedCollection[i];
+    //     if (
+    //       !latestData.reqMoldTime ||
+    //       new Date(data.reqMoldTime) >= new Date(latestData.reqMoldTime)
+    //     ) {
+    //       latestData = data;
+    //     }
+    //   }
+    //   this.form.reqMoldTime = latestData.reqMoldTime;
+
+    //   console.log(this.form, '1111111111111');
+
+    // },
+
+    sortTop(row) {
+      row.priority = Number(row.priority) + 1;
+      this.priorityChange(row);
+    },
+    sortBottom(row) {
+      if (row.priority <= 1) {
+        return;
+      }
+      row.priority = Number(row.priority) - 1;
+      this.priorityChange(row);
+    },
+
+    priorityChange(row) {
+      if (row.priority > 10) {
+        row.priority = 10; // 如果大于 10,则设置为 10
+      } else if (row.priority < 0) {
+        row.priority = 0; // 如果小于 0,则设置为 0
+      }
+
+      this.priorityFn(row);
+    },
+
+    priorityFn: debounce(function (row) { }, 800),
+
+    // 删除产品
+    handleDeleteItem(index) {
+      this.form.salesOrders.splice(index, 1);
+    },
+    addEquipment() {
+      this.$refs.additionalRefs.open(this.form.planType);
+    },
+    openVersion() {
+      this.$refs.versionRefs.open();
+    },
+    changeProduct(data) {
+      this.$set(this.form, 'produceRoutingName', data.name);
+      this.$set(this.form, 'produceRoutingId', data.id);
+      this.$set(this.form, 'produceVersionName', data.produceVersionName);
+    },
+    // 表格:模数、数量(方)、块数输入框 输入事件
+    tableHandleKeyUp(row, index, e, name) {
+      if (row.specification && this.clientEnvironmentId == '4') {
+        let modelArr = row.specification.split('*');
+        let modelLong = modelArr[0]; // model规格长度
+        let modeWide = modelArr[1]; // model规格宽度
+        let modeHight = modelArr[2].substr(0, modelArr[2].indexOf('cm')); // model规格高度
+        modeHight = Number(modeHight);
+        if (name === 'moCount') {
+          // 模数
+          row.moCount = e;
+          // 计算块数的公式:
+          // (一模6米长度 / model规格长度) * (一模1.2米宽度 / model规格宽度) = 每一模的块数
+          // 每一模的块数*模数moCount = 总块数
+          if (row.productName.includes('板材')) {
+            row.blockCount =
+              Math.floor(600 / modelLong) *
+              Math.floor(120 / modeHight) *
+              Math.floor(60 / modeWide) *
+              row.moCount;
+          } else if (row.productName.includes('砌块')) {
+            let modelLongFixed = (600 / modelLong).toFixed(2);
+            modelLongFixed = modelLongFixed.substring(
+              0,
+              modelLongFixed.length - 1
+            );
+            let modeWideFixed = (120 / modeWide).toFixed(2);
+            modeWideFixed = modeWideFixed.substring(
+              0,
+              modeWideFixed.length - 1
+            );
+            let modeHightFixed = (60 / modeHight).toFixed(2);
+            modeHightFixed = modeHightFixed.substring(
+              0,
+              modeHightFixed.length - 1
+            );
+            row.blockCount =
+              Math.floor(modelLongFixed * modeWideFixed * modeHightFixed) *
+              row.moCount;
+          }
+
+          row.planProductNum =
+            Number((modelLong * modeWide * modeHight) / 1000000).toFixed(5) *
+            row.blockCount;
+        } else if (name === 'sum') {
+
+          //方数
+          row.planProductNum = e;
+
+          row.blockCount = Math.floor(
+            e / ((modelLong * modeWide * modeHight) / 1000000)
+          );
+          if (row.productName.includes('板材')) {
+            row.moCount = Math.ceil(
+              row.blockCount /
+              (Math.floor(600 / modelLong) *
+                Math.floor(120 / modeHight) *
+                Math.floor(60 / modeWide))
+            );
+          } else if (row.productName.includes('砌块')) {
+            row.moCount = Math.ceil(
+              row.blockCount /
+              Math.floor(
+                (600 / modelLong) * (120 / modeHight) * (60 / modeWide)
+              )
+            );
+          }
+        } else if (name === 'blockCount') {
+          //块数
+          row.blockCount = e;
+
+          if (row.productName.includes('板材')) {
+            row.moCount = Math.ceil(
+              row.blockCount /
+              (Math.floor(600 / modelLong) *
+                Math.floor(120 / modeHight) *
+                Math.floor(60 / modeWide))
+            );
+          } else if (row.productName.includes('砌块')) {
+            row.moCount = Math.ceil(
+              row.blockCount /
+              Math.floor(
+                (600 / modelLong) * (120 / modeHight) * (60 / modeWide)
+              )
+            );
+          }
+
+          row.planProductNum =
+            (Number(e) * modelLong * modeWide * modeHight) / 1000000;
+        }
+      }
+
+      row.requiredFormingNum = Number(row.planProductNum * (this.form.marginCoefficient || 1)).toFixed(5);
+
+    },
+    confirmChoose(list) {
+      // 取出在弹窗中选中并且不在表格中的数据
+      const result = list.filter(
+        (i) => this.form.salesOrders.findIndex((p) => p.id === i.id) === -1
+      );
+      // 取出在表格中并且不在弹窗中选中的数据 即取消选中的数据
+      const del = this.form.salesOrders.filter(
+        (i) => list.findIndex((p) => p.id === i.id) === -1
+      );
+      for (let i = this.form.salesOrders.length - 1; i >= 0; i--) {
+        for (let j in del) {
+          if (this.form.salesOrders[i].id === del[j].id) {
+            this.form.salesOrders.splice(i, 1);
+          }
+        }
+      }
+      let priority =
+        this.form.salesOrders[this.form.salesOrders.length - 1]?.priority || 0;
+      this.form.salesOrders = this.form.salesOrders.concat(
+        result.map((item, index) => {
+          item.priority = ++priority;
+
+          item.planProductNum = item.lackNum;
+          item.requiredFormingNum = item.lackNum;
+          item.reqMoldTime = dayjs(
+            new Date(item.deliveryTime).getTime() - 3600 * 1000 * 24 * 10
+          ).format('YYYY-MM-DD');
+          return item;
+        })
+      );
+      this.changeData();
+    },
+    changeData() {
+      var planProductNum = 0;
+      var productWeight = 0;
+
+      this.form.salesOrders.map((item, index) => {
+        item.priority = index + 1;
+        planProductNum = planProductNum + item.requiredFormingNum;
+        productWeight = productWeight + Number(item.productSumWeight);
+      });
+      this.$set(this.form, 'codeNum', this.form.salesOrders.length);
+      this.$set(this.form, 'contractNum', planProductNum);
+      this.$set(this.form, 'sumOrderWeight', productWeight.toFixed(2));
+    },
+
+    async publishData(type) {
+      const key = getRouteTabKey();
+      let params = deepClone(this.form);
+      params.categoryId = params.salesOrders[0]?.categoryId;
+      if (this.$route.query.type != 'edit') {
+        delete params.id;
+      }
+
+      if (type === 2) {
+        this.$confirm('发布工单后不可撤回,确定发布吗?', '发布确认').then(
+          async () => {
+            const loading = this.$loading({
+              lock: true,
+              fullscreen: true,
+              text: '工单发布中...'
+            });
+            try {
+              const code = await getCode('product_order_code');
+              const data = {
+                productionPlan: params,
+                workOrder: {
+                  productionPlanCode: params.code,
+                  code: code,
+                  // formingNum: params.contractNum,
+                  formingNum: this.form.requiredFormingNum,
+                  formingWeight: params.sumOrderWeight,
+                  produceRoutingId: params.produceRoutingId,
+                  status: 4,
+                  model: params.model,
+                  brandNo: params.brandNo,
+                  categoryId: params.categoryId,
+                  productCode: params.productCode,
+                  productName: params.productName,
+
+                  newWeightUnit: this.form.newWeightUnit,
+                  newSumOrderWeight: this.form.newSumOrderWeight
+                }
+              };
+              if (this.$route.query.type == 'edit') {
+                data.workOrder.productionPlanId = params.id;
+              }
+              console.log(data);
+              await releaseSave(data)
+                .then((res) => {
+                  if (res === 1) {
+                    this.$message.success('工单已发布!');
+                    this.$router.push({
+                      path: '/productionPlan'
+                    });
+                  } else {
+                    this.$confirm(
+                      '生产计划创建成功,但工单发布失败。请前往【生产计划】列表【重新发布】工单',
+                      '提示',
+                      {
+                        confirmButtonText: '返回',
+                        cancelButtonText: '立即前往',
+                        type: 'warning'
+                      }
+                    )
+                      .then(() => {
+                        this.$router.push({
+                          path: '/productionPlan'
+                        });
+                      })
+                      .catch(() => {
+                        this.$router.go(-1);
+                      });
+                  }
+                  removePageTab({ key });
+                })
+                .catch(() => {
+                  this.$message.error('发布失败,请重新发布!');
+                });
+            } catch (error) { }
+
+            loading.close();
+          }
+        );
+      } else {
+        let request =
+          this.$route.query.type == 'edit' ? updateSaleToPlan : saveSaleToPlan;
+
+        request(params)
+          .then(async (res) => {
+            // 提交
+            this.$router.push({
+              path: '/productionPlan'
+            });
+            removePageTab({ key });
+          })
+          .catch(() => {
+            this.$message.error('提交失败,请重新提交!');
+          });
+      }
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.ele-body {
+  background: #fff;
+}
+
+.body-title {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.title-left {
+  font-size: 20px;
+  color: #333;
+}
+
+.formbox {
+  margin: 20px auto;
+}
+
+.row-intro {
+  border-bottom: 1px dashed #ccc;
+  margin-bottom: 20px;
+}
+
+.add-product {
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  font-size: 30px;
+  color: #1890ff;
+  margin: 10px 0;
+  cursor: pointer;
+}
+
+.table-item {
+  margin-bottom: 0;
+}
+</style>

+ 1139 - 0
src/views/saleOrder/salesToProductionNewTwo.vue

@@ -0,0 +1,1139 @@
+<template>
+    <div class="ele-body">
+        <el-card shadow="never">
+            <div class="body-title">
+                <div class="title-left">{{ type == 'edit' ? '计划修改' : '销售订单转生产计划' }}</div>
+                <div class="title-right">
+                    <el-button @click="cancel">取消</el-button>
+                    <el-button type="primary" @click="toSubmit" :loading="loading">
+                        提交计划
+                    </el-button>
+                </div>
+            </div>
+            <el-form ref="form" :model="form" :rules="rules" label-width="100px" class="formbox">
+                <el-row :gutter="24">
+                    <el-col v-bind="styleResponsive ? { lg: 4, md: 8 } : { span: 4 }">
+                        <el-form-item label="计划类型:">
+                            <DictSelection dictName="订单计划类型" clearable v-model="form.planType" disabled>
+                            </DictSelection>
+                        </el-form-item>
+                    </el-col>
+
+                    <el-col v-bind="styleResponsive ? { lg: 4, md: 8 } : { span: 4 }">
+                        <el-form-item label="加工方式:" prop="produceType">
+                            <el-select v-model="form.produceType" style="width: 100%" @change="changeProduceType">
+                                <el-option v-for="item of producedList" :key="item.code" :label="item.name"
+                                    :value="item.code"></el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+
+                    <el-col v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }" v-if="clientEnvironmentId != 4">
+                        <el-form-item label="BOM版本:" prop="bomCategoryId">
+                            <el-select v-model="form.bomCategoryId" style="width: 100%" @change="changeBomId">
+                                <el-option v-for="item of bomVersionList" :key="item.id"
+                                    :label="item.name + '(V' + item.versions + '.0)'" :value="item.id"></el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+
+                    <el-col v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }" v-if="clientEnvironmentId != 4">
+
+                        <el-form-item label="工艺路线:" prop="">
+                            <!--  @click.native="openVersion"   -->
+
+                            <el-select v-model="form.produceRoutingId" style="width: 100%" @change="changeRoute">
+                                <el-option v-for="item of routingList" :key="item.id" :label="item.name"
+                                    :value="item.id"></el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+
+                    <el-col v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }" v-if="clientEnvironmentId == 4">
+                        <el-form-item label="工艺路线:" prop="produceRoutingId">
+                            <el-input v-model="form.produceRoutingName" style="width: 100%" readonly></el-input>
+                        </el-form-item>
+                    </el-col>
+
+
+                    <!-- <el-col v-bind="styleResponsive ? { lg: 3, md: 6 } : { span: 3 }">
+              <el-form-item label="使用改型:" prop="modification">
+                <el-checkbox
+                  v-model="form.modification"
+                  :true-label="1"
+                  :false-label="0"
+                ></el-checkbox>
+              </el-form-item>
+            </el-col> -->
+
+
+
+
+                </el-row>
+                <el-row :gutter="24">
+
+                    <el-col v-bind="styleResponsive ? { lg: 4, md: 8 } : { span: 4 }">
+                        <el-form-item label="余量系数:" prop="marginCoefficient">
+                            <el-select v-model="form.marginCoefficient" filterable allow-create @change="itemChange">
+                                <el-option v-for="(item, index) in marginList" :key="index" :label="item.name"
+                                    :value="item.value" />
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+
+                    <el-col v-bind="styleResponsive ? { lg: 4, md: 8 } : { span: 4 }">
+                        <el-form-item label="批次号:" prop="batchNo">
+                            <el-input placeholder="请输入批次号" v-model="form.batchNo"></el-input>
+                        </el-form-item>
+                    </el-col>
+
+
+                    <el-col v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }">
+                        <el-form-item label="计划开始日期:" prop="startTime">
+                            <el-date-picker style="width: 100%" v-model="form.startTime" :pickerOptions="{
+                                disabledDate: (time) =>
+                                    time.getTime() <
+                                    new Date(new Date().setHours(0, 0, 0, 0)).getTime()
+                            }" type="date" placeholder="选择日期" value-format="yyyy-MM-dd">
+                            </el-date-picker>
+
+                        </el-form-item>
+                    </el-col>
+
+
+                    <el-col v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }">
+                        <el-form-item label="计划结束日期:" prop="endTime">
+                            <el-date-picker style="width: 100%" v-model="form.endTime" :pickerOptions="{
+                                disabledDate: (time) =>
+                                    time.getTime() <
+                                    new Date(new Date().setHours(0, 0, 0, 0)).getTime()
+                            }" type="date" placeholder="选择日期" value-format="yyyy-MM-dd">
+                            </el-date-picker>
+
+                        </el-form-item>
+                    </el-col>
+
+                    <el-col v-bind="styleResponsive ? { lg: 5, md: 10 } : { span: 5 }">
+                        <!-- prop="factoriesId" -->
+                        <el-form-item label="所属工厂:">
+                            <el-select v-model="form.factoriesId" style="width: 100%" @change="factoriesIdFn">
+                                <el-option v-for="item of factoryList" :key="item.id" :label="item.name"
+                                    :value="item.id"></el-option>
+                            </el-select>
+                        </el-form-item>
+                    </el-col>
+
+                    <!-- <el-form-item label="加工方式:" prop="produceType">
+                <el-select v-model="form.produceType" style="width: 100%"   @change="changeProduceType" >
+                    <el-option
+                      v-for="item of producedList"
+                      :key="item.code"
+                      :label="item.name"
+                      :value="item.code"
+                    ></el-option>
+                  </el-select>
+              </el-form-item> -->
+
+
+
+
+                </el-row>
+
+                <el-row>
+
+                </el-row>
+
+                <el-row :gutter="24" class="row-intro">
+                    <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
+                        <el-form-item label="销售单数量:">{{ form.codeNum }}</el-form-item>
+                    </el-col>
+                    <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
+                        <el-form-item label="订单总数量:">{{
+                            form.contractNum
+                            }}</el-form-item>
+                    </el-col>
+                    <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 4 }">
+                        <el-form-item label="订单总重量:">{{
+                            form.sumOrderWeight
+                            }}</el-form-item>
+                    </el-col>
+                    <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
+                        <el-form-item label="产品编码:">{{
+                            form.productCode
+                            }}</el-form-item>
+                    </el-col>
+                    <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
+                        <el-form-item label="牌号:">{{ form.brandNo }}</el-form-item>
+                    </el-col>
+                    <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 5 }">
+                        <el-form-item label="型号:">{{ form.model }}</el-form-item>
+                    </el-col>
+
+                    <el-col v-bind="styleResponsive ? { lg: 4, md: 12 } : { span: 3 }">
+                        <el-form-item label="规格:">{{ form.specification }}</el-form-item>
+                    </el-col>
+                    <!--
+            <el-col v-bind="styleResponsive ? { lg: 3, md: 12 } : { span: 3 }">
+              <el-form-item label="库存数量:">{{
+                form.stockCountBase
+              }}</el-form-item>
+            </el-col> -->
+                </el-row>
+                <el-table :data="form.salesOrders" border>
+                    <el-table-column label="序号" align="center" width="60">
+                        <template slot-scope="scope">
+                            <span>{{ scope.$index + 1 }}</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="销售订单号" align="center" prop="code" width="120" sortable>
+                    </el-table-column>
+
+                    <el-table-column label="产品名称" align="center" prop="productName" width="120">
+                    </el-table-column>
+
+                    <el-table-column label="行号" align="center" prop="lineNumber">
+                    </el-table-column>
+                    <el-table-column :label="'订单数量' + (clientEnvironmentId == '4' ? '(方)' : '')" align="center"
+                        prop="contractNum" width="120">
+                        <template slot-scope="scope">
+                            {{ scope.row.contractNum }} {{ scope.row.measuringUnit }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="订单重量" align="center" prop="productSumWeight" width="120">
+                        <template slot-scope="scope">
+                            {{ scope.row.productSumWeight }} {{ form.weightUnit }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="规格" align="center" prop="specification">
+                    </el-table-column>
+                    <el-table-column :label="'欠交数量' + (clientEnvironmentId == '4' ? '(方)' : '')" align="center"
+                        prop="lackNum">
+                    </el-table-column>
+
+                    <el-table-column :label="'计划生产数量' + (clientEnvironmentId == '4' ? '(方)' : '')" align="center"
+                        prop="planProductNum" width="140">
+                        <template slot-scope="scope">
+                            <el-form-item label-width="0px" :prop="'salesOrders.' + scope.$index + '.planProductNum'"
+                                :rules="{
+                                    required: true,
+                                    message: '请输入计划生产数量',
+                                    trigger: 'blur'
+                                }" class="table-item">
+                                <el-input v-model.number="scope.row.planProductNum" size="small" type="number"
+                                    style="width: 100%" @input="
+                                        tableHandleKeyUp(scope.row, scope.$index, $event, 'sum')
+                                        " placeholder="输入数量"></el-input>
+                            </el-form-item>
+                        </template>
+                    </el-table-column>
+
+                    <el-table-column :label="'要求生产数量' + (clientEnvironmentId == '4' ? '(方)' : '')" align="center"
+                        prop="requiredFormingNum" width="120">
+                        <template slot-scope="scope">
+                            <el-form-item label-width="0px"
+                                :prop="'salesOrders.' + scope.$index + '.requiredFormingNum'" :rules="{
+                                    required: true,
+                                    message: '请输入要求生产数量',
+                                    trigger: 'blur'
+                                }" class="table-item">
+                                <el-input v-model.number="scope.row.requiredFormingNum" size="small" disabled
+                                    oninput="value=value.replace(/[^\d]/g,'')" style="width: 100%"
+                                    placeholder="输入数量"></el-input>
+                            </el-form-item>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="模数" align="center" width="100" v-if="clientEnvironmentId == '4'">
+                        <template slot-scope="scope">
+                            <div>
+                                <el-input style="width: 100%" size="small" v-model="scope.row.moCount"
+                                    oninput="value=value.replace(/[^0-9.]/g,'')" @input="
+                                        tableHandleKeyUp(scope.row, scope.$index, $event, 'moCount')
+                                        " placeholder="请输入">
+                                </el-input>
+                            </div>
+                        </template>
+                    </el-table-column>
+
+                    <el-table-column align="center" width="100" v-if="clientEnvironmentId == '4'">
+                        <template slot="header">
+                            <span style="color: red">*</span>
+                            <span>块数</span>
+                        </template>
+                        <template slot-scope="scope">
+                            <div>
+                                <el-input size="small" style="width: 100%" oninput="value=value.replace(/[^0-9.]/g,'')"
+                                    @input="
+                                        tableHandleKeyUp(
+                                            scope.row,
+                                            scope.$index,
+                                            $event,
+                                            'blockCount'
+                                        )
+                                        " v-model="scope.row.blockCount" placeholder="请输入"></el-input>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="权重等级" align="center" width="120" v-if="clientEnvironmentId == '4'">
+                        <template slot-scope="scope">
+                            <div>
+                                <el-select v-model="scope.row.weight" style="width: 100%">
+                                    <el-option v-for="item of weightList" :key="item.code" :label="item.name"
+                                        :value="item.code"></el-option>
+                                </el-select>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" width="120" label="是否开槽" v-if="clientEnvironmentId == '4'">
+                        <template slot-scope="scope">
+                            <div>
+                                <el-select style="width: 100%" v-model="scope.row.isSlotting" placeholder="请选择">
+                                    <el-option v-for="item of isSlotting" :key="item.code" :label="item.name"
+                                        :value="item.code" />
+                                </el-select>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column align="center" width="120" label="开槽类型" v-if="clientEnvironmentId == '4'">
+                        <template slot-scope="scope">
+                            <DictSelection dictName="开槽类型" v-model="scope.row.slottingType"
+                                v-if="scope.row.isSlotting == 1">
+                            </DictSelection>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="按单按库" align="center" prop="orderLibraryType">
+                        <template slot-scope="{ row }">
+                            {{ getDictValue('按单按库', row.orderLibraryType) }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="订单类型" align="center" prop="orderType">
+                        <template slot-scope="{ row }">
+                            {{ getDictValue('订单类型', row.orderType) }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="交付日期" align="center" prop="deliveryTime" width="160">
+                        <template slot-scope="scope">
+                            <el-form-item label-width="0px" :prop="'salesOrders.' + scope.$index + '.deliveryTime'"
+                                :rules="{
+                                    required: true,
+                                    message: '请选择交付日期',
+                                    trigger: 'blur'
+                                }" class="table-item">
+                                <el-date-picker style="width: 100%" v-model="scope.row.deliveryTime"
+                                    @change="changeDate(scope.row, scope.$index)" :pickerOptions="{
+                                        disabledDate: (time) =>
+                                            time.getTime() <
+                                            new Date(new Date().setHours(0, 0, 0, 0)).getTime()
+
+                                    }" type="date" placeholder="选择日期" value-format="yyyy-MM-dd">
+                                </el-date-picker>
+
+                            </el-form-item>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="要求完成日期" align="center" prop="reqMoldTime" width="180">
+                        <template slot-scope="scope">
+                            <el-form-item label-width="0px" :prop="'salesOrders.' + scope.$index + '.reqMoldTime'"
+                                :rules="{
+                                    required: true,
+                                    message: '请选择要求完成日期',
+                                    trigger: 'blur'
+                                }" class="table-item">
+                                <el-date-picker style="width: 100%" v-model="scope.row.reqMoldTime" :pickerOptions="{
+                                    disabledDate: (time) =>
+                                        time.getTime() <
+                                        new Date(new Date().setHours(0, 0, 0, 0)).getTime()
+
+                                }" type="date" disabled placeholder="选择日期" value-format="yyyy-MM-dd">
+                                </el-date-picker>
+
+                            </el-form-item>
+                        </template>
+                    </el-table-column>
+
+
+
+
+                    <el-table-column label="客户名称" align="center" prop="customerName">
+                    </el-table-column>
+                    <el-table-column label="业务员" align="center" prop="salesman">
+                    </el-table-column>
+                    <el-table-column label="交付要求" align="center" prop="deliveryRequirements">
+                        <template slot-scope="{ row }">
+                            {{ getDictValue('交付要求', row.deliveryRequirements) }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="priority" label="优先级" width="100" align="center">
+                        <template slot-scope="{ row, $index }">
+                            <div style="display: flex">
+                                <el-input v-if="$index == 0" v-model="row.priority" type="number" size="mini" :min="0"
+                                    :max="10" @change="priorityChange(row)" style="width: 80px"></el-input>
+                                <el-popover v-if="$index == 0" placement="right" width="200" trigger="hover"
+                                    content="数值越大优先级越高(0-3普通, 4-6优先, 7-10紧急)">
+                                    <div class="sort-wrap" slot="reference">
+                                        <i class="el-icon-caret-top" @click="sortTop(row)"></i>
+                                        <i class="el-icon-caret-bottom" @click="sortBottom(row)"></i>
+                                    </div>
+                                </el-popover>
+                            </div>
+                        </template>
+                    </el-table-column>
+
+                    <el-table-column label="操作" align="center" width="70" fixed="right">
+                        <template slot-scope="scope">
+                            <el-button type="text" @click="handleDeleteItem(scope.$index)"
+                                v-if="type != 'edit'">删除</el-button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <div class="add-product" @click="addEquipment" v-if="type != 'edit'">
+                    <i class="el-icon-circle-plus-outline"></i>
+                </div>
+                <el-row :gutter="24">
+                    <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }">
+                        <el-form-item label="计划备注:">
+                            <el-input type="textarea" :rows="4" v-model="form.notes" resize="none"></el-input>
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+            <AdditionalOrder ref="additionalRefs" :productCode="form.productCode" :selectList="form.salesOrders"
+                @choose="confirmChoose"></AdditionalOrder>
+            <ProductionVersion ref="versionRefs" @changeProduct="changeProduct"></ProductionVersion>
+            <PlanSubmit ref="submitRefs" :type="$route.query.type" :info="form" @publish="publishData"></PlanSubmit>
+        </el-card>
+    </div>
+</template>
+<script>
+import AdditionalOrder from './components/AdditionalOrder.vue';
+import PlanSubmit from './components/plan-submit.vue';
+import ProductionVersion from '@/components/CreatePlan/ProductionVersion2.vue';
+import {
+    productionToPlan,
+    saveSaleToPlan,
+    updateSaleToPlan,
+    releaseSave,
+    getInventory,
+    getUpdateInfoById,
+    bomRoutingList,
+    bomListByPlan,
+    getFactoryList,
+} from '@/api/saleOrder';
+
+import { getByCode } from '@/api/system/dictionary-data';
+
+import dictMixins from '@/mixins/dictMixins';
+import { deepClone } from '@/utils/index';
+import { getRouteTabKey, removePageTab } from '@/utils/page-tab-util';
+import { getCode } from '@/api/codeManagement';
+import dayjs from 'dayjs';
+import { debounce } from 'lodash';
+export default {
+    mixins: [dictMixins],
+    components: {
+        AdditionalOrder,
+        ProductionVersion,
+        PlanSubmit
+    },
+    data() {
+        return {
+            type: this.$route.query.type,
+            weightList: [
+                { code: 1, name: 'A' },
+                { code: 2, name: 'B' },
+                { code: 3, name: 'C' }
+            ],
+            isSlotting: [
+                { code: 1, name: '是' },
+                { code: 2, name: '否' }
+            ], //是否开槽
+
+
+            producedList: [
+                { code: 2, name: '加工(MBOM)' }, //2 待确认
+                { code: 3, name: '装配(ABOM)' }
+            ],
+
+
+            form: {
+                planType: 1,
+                produceRoutingId: '',
+                stockCountBase: '',
+                salesOrders: [],
+                produceRoutingName: '',
+                marginCoefficient: '1.0',
+                batchNo: null,
+                produceType: 2,
+                bomCategoryId: '',
+                factoriesId: '',
+            },
+
+            marginList: [],
+
+            bomVersionList: [],
+            routingList: [],
+            factoryList: [],
+
+            // 表单验证规则
+            rules: {
+
+                produceRoutingId: [
+                    { required: true, message: '请选择工艺路线', trigger: 'blur' }
+                ],
+
+                produceType: [
+                    { required: true, message: '请选择加工方式', trigger: 'blur' }
+                ],
+                bomCategoryId: [
+                    { required: true, message: '请选择BOM版本', trigger: 'blur' }
+                ],
+                factoriesId: [
+                    { required: true, message: '请选择所属工厂', trigger: 'change' }
+                ],
+            },
+            // selection: [],
+            loading: false
+        };
+    },
+    props: {
+        objData: {
+            type: Object,
+            default: {}
+        }
+    },
+
+
+    watch: {
+        objData: {
+            handler(val) {
+                this.requestDict('按单按库');
+                this.requestDict('订单类型');
+                this.requestDict('交付要求');
+                this.getByCodeFn();
+                this.getFactoryList();
+                if (val.type == 'edit') {
+
+                    this.getPlanInfo(val.id);
+
+                } else {
+                    this.getSaleInfo();
+
+                }
+
+
+            },
+            deep: true,
+            immediate: true
+        }
+    },
+
+    computed: {
+        clientEnvironmentId() {
+            return this.$store.state.user.info.clientEnvironmentId;
+        },
+        // 是否开启响应式布局
+        styleResponsive() {
+            return this.$store.state.theme.styleResponsive;
+        }
+    },
+
+    methods: {
+
+        // 验证时间是否超期
+        changeDate(item, i) {
+            console.log(this.isTimeAGreaterThanB(item.deliveryTime, item.reqMoldTime));
+            if (this.isTimeAGreaterThanB(item.deliveryTime, item.reqMoldTime)) {
+                this.$message.error('交付时间大于了要求完成日期')
+            }
+
+        },
+        isTimeAGreaterThanB(timeA, timeB) {
+            return new Date(timeA) > new Date(timeB);
+        },
+
+
+        async getFactoryList() {
+            this.factoryList = await getFactoryList();
+        },
+        async getPlanInfo(id) {
+            const data = await getUpdateInfoById(id);
+            console.log('wwwwwwwwwwww', data);
+
+            this.form = data;
+
+            if (this.clientEnvironmentId != 4) {
+                this.bomListVersion()
+                this.getPlanRouting()
+            }
+
+
+
+        },
+        async _getInventory() {
+            const res = await getInventory(this.form.productCode, this.form.planType);
+
+            this.form.stockCountBase = res;
+        },
+
+        getByCodeFn() {
+            getByCode('margin_code').then((res) => {
+                let _arr = [];
+                res.data.map((item) => {
+                    const key = Object.keys(item)[0];
+                    const value = item[key];
+
+                    _arr.push({ name: key, value: value });
+                });
+                this.marginList = _arr;
+            });
+        },
+
+
+        getPlanRouting() {
+
+            if (this.form.bomCategoryId) {
+                bomRoutingList(this.form.bomCategoryId).then((res) => {
+                    this.routingList = res || []
+                })
+            }
+
+        },
+
+        bomListVersion() {
+            console.log(this.form, '1111111111');
+            let categoryId = ''
+
+            if (this.form.salesOrders.length) {
+                categoryId = this.form.salesOrders[0].categoryId;
+            } else if (this.form.categoryId) {
+                categoryId = this.form.categoryId
+            } else {
+                new Error('缺少产品信息')
+            }
+
+
+
+            let param = {
+                bomType: this.form.produceType,
+                categoryId: categoryId
+            }
+            bomListByPlan(param).then(res => {
+                this.bomVersionList = res || []
+            })
+        },
+
+
+        changeProduceType() {
+            if (this.clientEnvironmentId == 4) {
+                return false
+            }
+            this.form.bomCategoryId = '';
+            this.form['bomCategoryName'] = '';
+            this.form['bomCategoryVersions'] = '';
+
+
+            this.bomVersionList = [];
+
+            this.routingList = [];
+            this.form.produceRoutingId = '';
+            this.form.produceRoutingName = '';
+            this.form.produceVersionName = '';
+
+            this.bomListVersion()
+
+        },
+
+        changeBomId() {
+            this.routingList = []
+            this.form.produceRoutingId = ''
+            this.form.produceRoutingName = ''
+            this.form.produceVersionName = ''
+
+            this.bomVersionList.forEach((f) => {
+                if (f.id == this.form.bomCategoryId) {
+                    this.$set(this.form, 'bomCategoryName', f.name);
+                    this.$set(this.form, 'bomCategoryVersions', f.versions);
+                }
+
+            })
+
+            this.getPlanRouting()
+        },
+
+
+
+        changeRoute() {
+
+            console.log(this.routingList);
+            console.log(this.form.produceRoutingId);
+            this.$forceUpdate();
+            this.routingList.forEach((f) => {
+                if (f.id == this.form.produceRoutingId) {
+                    this.$set(this.form, 'produceRoutingName', f.name);
+                    this.$set(this.form, 'produceVersionName', f.version);
+                }
+
+            })
+        },
+
+        getSaleInfo() {
+            let params = JSON.parse(this.$route.query.selection);
+            productionToPlan(params).then((res) => {
+                console.log(res, '555555555555555555');
+                this.form = deepClone(res);
+                if (!this.form.produceType) {
+                    this.form.produceType = 2;
+                    this.bomListVersion()
+                }
+                this.form.produceRoutingName =
+                    res.produceRoutingName || this.$route.query.produceRoutingName;
+                this.form.produceRoutingId =
+                    res.produceRoutingId || this.$route.query.produceRoutingId;
+                this.form.factoriesId =
+                    res.factoriesId || this.$route.query.factoriesId;
+                console.log(this.form.factoriesId, '99999999999999')
+                if (this.clientEnvironmentId == '4') {
+                    if (this.form.salesOrders[0].productName.includes('板材')) {
+                        this.changeProduct({
+                            id: '1856970794952372226',
+                            name: '板材',
+                            produceVersionName: '板材'
+                        });
+                    } else {
+                        this.changeProduct({
+                            id: '1857313733642596353',
+                            name: '砌块',
+                            produceVersionName: '砌块'
+                        });
+                    }
+                }
+                this.form.salesOrders.map((item, index) => {
+
+
+                    if (this.clientEnvironmentId == '4') {
+                        this.tableHandleKeyUp(item, '', item.lackNum, 'sum');
+                    } else {
+                        item.planProductNum = item.lackNum;
+                        item.requiredFormingNum = item.lackNum;
+                    }
+                    item.slottingType = item.slottingType && item.slottingType + '';
+                    item.priority = index + 1;
+
+                    item.reqMoldTime = dayjs(
+                        new Date(item.deliveryTime).getTime() - 3600 * 1000 * 24 * 10
+                    ).format('YYYY-MM-DD');
+                });
+                if (this.form.salesOrders.every((itm) => itm.orderType == 2)) {
+                    this.form.planType = 2;
+                } else if (this.form.salesOrders.every((itm) => itm.orderType == 1)) {
+                    this.form.planType = 1;
+                } else {
+                    this.form.planType = 3;
+                }
+                this._getInventory();
+            });
+            this.$forceUpdate();
+        },
+
+        itemChange() {
+            this.form.salesOrders.map((item, index) => {
+                this.$set(
+                    item,
+                    'requiredFormingNum',
+                    item.planProductNum * (this.form.marginCoefficient || 1)
+                );
+            });
+        },
+
+        factoriesIdFn(e) {
+
+
+
+            this.$forceUpdate()
+        },
+
+        toInt(planProductNum) {
+            return planProductNum * (this.form.marginCoefficient || 1);
+        },
+
+        cancel() {
+            const key = getRouteTabKey();
+            // this.$router.go(-1);
+            removePageTab({ key });
+
+            this.$emit('cancel');
+
+        },
+        toSubmit() {
+            if (!this.form.factoriesId) return this.$message.warning('请选择所属工厂');
+
+            this.$refs.form.validate((valid) => {
+
+                if (valid) {
+                    this.mapList();
+
+                    this.$refs.submitRefs.open();
+                }
+            });
+        },
+        // 对比日期,计算要求生产重量
+        mapList() {
+            var _sumOrderWeight = 0;
+            var requiredFormingNum = 0;
+            var productNum = 0;
+            this.form.salesOrders.map((item, index) => {
+                requiredFormingNum = Number(requiredFormingNum) + Number(item.requiredFormingNum);
+
+                if (this.form.weightUnit == 'G' || this.form.weightUnit == 'g' || this.form.weightUnit == '克') {
+                    this.form.newWeightUnit = 'kg';
+                    _sumOrderWeight = (this.form.salesOrders[0].requiredFormingNum * Number(this.form.salesOrders[0].productUnitWeight || 1)) / 1000;
+                } else {
+                    this.form.newWeightUnit = this.form.weightUnit;
+                    _sumOrderWeight = (this.form.salesOrders[0].requiredFormingNum * Number(this.form.salesOrders[0].productUnitWeight || 1));
+                }
+
+                productNum += Number(item.planProductNum);
+            });
+            this.form.productNum = productNum;
+            this.form.productUnitWeight = this.form.salesOrders[0]?.productUnitWeight;
+            this.form.newSumOrderWeight = _sumOrderWeight.toFixed(2);
+            this.form.requiredFormingNum = requiredFormingNum;
+            const collection = deepClone(this.form.salesOrders);
+            const sortedCollection = collection.sort(
+                (a, b) => new Date(b.reqMoldTime) - new Date(a.reqMoldTime)
+            );
+
+            let latestData = {};
+            for (let i = 0; i < sortedCollection.length; i++) {
+                const data = sortedCollection[i];
+                if (
+                    !latestData.reqMoldTime ||
+                    new Date(data.reqMoldTime) >= new Date(latestData.reqMoldTime)
+                ) {
+                    latestData = data;
+                }
+            }
+            this.form.reqMoldTime = latestData.reqMoldTime;
+
+            console.log(this.form, '1111111111111');
+
+        },
+
+        sortTop(row) {
+            row.priority = Number(row.priority) + 1;
+            this.priorityChange(row);
+        },
+        sortBottom(row) {
+            if (row.priority <= 1) {
+                return;
+            }
+            row.priority = Number(row.priority) - 1;
+            this.priorityChange(row);
+        },
+
+        priorityChange(row) {
+            if (row.priority > 10) {
+                row.priority = 10; // 如果大于 10,则设置为 10
+            } else if (row.priority < 0) {
+                row.priority = 0; // 如果小于 0,则设置为 0
+            }
+
+            this.priorityFn(row);
+        },
+
+        priorityFn: debounce(function (row) { }, 800),
+
+        // 删除产品
+        handleDeleteItem(index) {
+            this.form.salesOrders.splice(index, 1);
+        },
+        addEquipment() {
+            this.$refs.additionalRefs.open(this.form.planType);
+        },
+        openVersion() {
+            this.$refs.versionRefs.open();
+        },
+        changeProduct(data) {
+            this.$set(this.form, 'produceRoutingName', data.name);
+            this.$set(this.form, 'produceRoutingId', data.id);
+            this.$set(this.form, 'produceVersionName', data.produceVersionName);
+        },
+        // 表格:模数、数量(方)、块数输入框 输入事件
+        tableHandleKeyUp(row, index, e, name) {
+            if (row.specification && this.clientEnvironmentId == '4') {
+                let modelArr = row.specification.split('*');
+                let modelLong = modelArr[0]; // model规格长度
+                let modeWide = modelArr[1]; // model规格宽度
+                let modeHight = modelArr[2].substr(0, modelArr[2].indexOf('cm')); // model规格高度
+                modeHight = Number(modeHight);
+                if (name === 'moCount') {
+                    // 模数
+                    row.moCount = e;
+                    // 计算块数的公式:
+                    // (一模6米长度 / model规格长度) * (一模1.2米宽度 / model规格宽度) = 每一模的块数
+                    // 每一模的块数*模数moCount = 总块数
+                    if (row.productName.includes('板材')) {
+                        row.blockCount =
+                            Math.floor(600 / modelLong) *
+                            Math.floor(120 / modeHight) *
+                            Math.floor(60 / modeWide) *
+                            row.moCount;
+                    } else if (row.productName.includes('砌块')) {
+                        let modelLongFixed = (600 / modelLong).toFixed(2);
+                        modelLongFixed = modelLongFixed.substring(
+                            0,
+                            modelLongFixed.length - 1
+                        );
+                        let modeWideFixed = (120 / modeWide).toFixed(2);
+                        modeWideFixed = modeWideFixed.substring(
+                            0,
+                            modeWideFixed.length - 1
+                        );
+                        let modeHightFixed = (60 / modeHight).toFixed(2);
+                        modeHightFixed = modeHightFixed.substring(
+                            0,
+                            modeHightFixed.length - 1
+                        );
+                        row.blockCount =
+                            Math.floor(modelLongFixed * modeWideFixed * modeHightFixed) *
+                            row.moCount;
+                    }
+
+                    row.planProductNum =
+                        Number((modelLong * modeWide * modeHight) / 1000000).toFixed(5) *
+                        row.blockCount;
+                } else if (name === 'sum') {
+
+                    //方数
+                    row.planProductNum = e;
+
+                    row.blockCount = Math.floor(
+                        e / ((modelLong * modeWide * modeHight) / 1000000)
+                    );
+                    if (row.productName.includes('板材')) {
+                        row.moCount = Math.ceil(
+                            row.blockCount /
+                            (Math.floor(600 / modelLong) *
+                                Math.floor(120 / modeHight) *
+                                Math.floor(60 / modeWide))
+                        );
+                    } else if (row.productName.includes('砌块')) {
+                        row.moCount = Math.ceil(
+                            row.blockCount /
+                            Math.floor(
+                                (600 / modelLong) * (120 / modeHight) * (60 / modeWide)
+                            )
+                        );
+                    }
+                } else if (name === 'blockCount') {
+                    //块数
+                    row.blockCount = e;
+
+                    if (row.productName.includes('板材')) {
+                        row.moCount = Math.ceil(
+                            row.blockCount /
+                            (Math.floor(600 / modelLong) *
+                                Math.floor(120 / modeHight) *
+                                Math.floor(60 / modeWide))
+                        );
+                    } else if (row.productName.includes('砌块')) {
+                        row.moCount = Math.ceil(
+                            row.blockCount /
+                            Math.floor(
+                                (600 / modelLong) * (120 / modeHight) * (60 / modeWide)
+                            )
+                        );
+                    }
+
+                    row.planProductNum =
+                        (Number(e) * modelLong * modeWide * modeHight) / 1000000;
+                }
+            }
+
+            row.requiredFormingNum = Number(row.planProductNum * (this.form.marginCoefficient || 1)).toFixed(5);
+
+        },
+        confirmChoose(list) {
+            // 取出在弹窗中选中并且不在表格中的数据
+            const result = list.filter(
+                (i) => this.form.salesOrders.findIndex((p) => p.id === i.id) === -1
+            );
+            // 取出在表格中并且不在弹窗中选中的数据 即取消选中的数据
+            const del = this.form.salesOrders.filter(
+                (i) => list.findIndex((p) => p.id === i.id) === -1
+            );
+            for (let i = this.form.salesOrders.length - 1; i >= 0; i--) {
+                for (let j in del) {
+                    if (this.form.salesOrders[i].id === del[j].id) {
+                        this.form.salesOrders.splice(i, 1);
+                    }
+                }
+            }
+            let priority =
+                this.form.salesOrders[this.form.salesOrders.length - 1]?.priority || 0;
+            this.form.salesOrders = this.form.salesOrders.concat(
+                result.map((item, index) => {
+                    item.priority = ++priority;
+
+                    item.planProductNum = item.lackNum;
+                    item.requiredFormingNum = item.lackNum;
+                    item.reqMoldTime = dayjs(
+                        new Date(item.deliveryTime).getTime() - 3600 * 1000 * 24 * 10
+                    ).format('YYYY-MM-DD');
+                    return item;
+                })
+            );
+            this.changeData();
+        },
+        changeData() {
+            var planProductNum = 0;
+            var productWeight = 0;
+
+            this.form.salesOrders.map((item, index) => {
+                item.priority = index + 1;
+                planProductNum = planProductNum + item.requiredFormingNum;
+                productWeight = productWeight + Number(item.productSumWeight);
+            });
+            this.$set(this.form, 'codeNum', this.form.salesOrders.length);
+            this.$set(this.form, 'contractNum', planProductNum);
+            this.$set(this.form, 'sumOrderWeight', productWeight.toFixed(2));
+        },
+
+        async publishData(type) {
+            const key = getRouteTabKey();
+            let params = deepClone(this.form);
+            params.categoryId = params.salesOrders[0]?.categoryId;
+            if (this.$route.query.type != 'edit') {
+                delete params.id;
+            }
+
+            if (type === 2) {
+                this.$confirm('发布工单后不可撤回,确定发布吗?', '发布确认').then(
+                    async () => {
+                        const loading = this.$loading({
+                            lock: true,
+                            fullscreen: true,
+                            text: '工单发布中...'
+                        });
+                        try {
+                            const code = await getCode('product_order_code');
+                            const data = {
+                                productionPlan: params,
+                                workOrder: {
+                                    productionPlanCode: params.code,
+                                    code: code,
+                                    // formingNum: params.contractNum,
+                                    formingNum: this.form.requiredFormingNum,
+                                    formingWeight: params.sumOrderWeight,
+                                    produceRoutingId: params.produceRoutingId,
+                                    status: 4,
+                                    model: params.model,
+                                    brandNo: params.brandNo,
+                                    categoryId: params.categoryId,
+                                    productCode: params.productCode,
+                                    productName: params.productName,
+
+                                    newWeightUnit: this.form.newWeightUnit,
+                                    newSumOrderWeight: this.form.newSumOrderWeight
+                                }
+                            };
+                            if (this.$route.query.type == 'edit') {
+                                data.workOrder.productionPlanId = params.id;
+                            }
+                            console.log(data);
+                            await releaseSave(data)
+                                .then((res) => {
+                                    if (res === 1) {
+                                        this.$message.success('工单已发布!');
+                                        this.$router.push({
+                                            path: '/productionPlan'
+                                        });
+                                    } else {
+                                        this.$confirm(
+                                            '生产计划创建成功,但工单发布失败。请前往【生产计划】列表【重新发布】工单',
+                                            '提示',
+                                            {
+                                                confirmButtonText: '返回',
+                                                cancelButtonText: '立即前往',
+                                                type: 'warning'
+                                            }
+                                        )
+                                            .then(() => {
+                                                this.$router.push({
+                                                    path: '/productionPlan'
+                                                });
+                                            })
+                                            .catch(() => {
+                                                this.$router.go(-1);
+                                            });
+                                    }
+                                    removePageTab({ key });
+                                })
+                                .catch(() => {
+                                    this.$message.error('发布失败,请重新发布!');
+                                });
+                        } catch (error) { }
+
+                        loading.close();
+                    }
+                );
+            } else {
+                let request =
+                    this.$route.query.type == 'edit' ? updateSaleToPlan : saveSaleToPlan;
+
+                request(params)
+                    .then(async (res) => {
+                        // 提交
+                        this.$router.push({
+                            path: '/productionPlan'
+                        });
+                        removePageTab({ key });
+                    })
+                    .catch(() => {
+                        this.$message.error('提交失败,请重新提交!');
+                    });
+            }
+        }
+    }
+};
+</script>
+<style lang="scss" scoped>
+.ele-body {
+    background: #fff;
+}
+
+.body-title {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+
+.title-left {
+    font-size: 20px;
+    color: #333;
+}
+
+.formbox {
+    margin: 20px auto;
+}
+
+.row-intro {
+    border-bottom: 1px dashed #ccc;
+    margin-bottom: 20px;
+}
+
+.add-product {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+    font-size: 30px;
+    color: #1890ff;
+    margin: 10px 0;
+    cursor: pointer;
+}
+
+.table-item {
+    margin-bottom: 0;
+}
+</style>

+ 3 - 3
vue.config.js

@@ -32,11 +32,11 @@ module.exports = {
       // 当我们的本地的请求 有/api的时候,就会代理我们的请求地址向另外一个服务器发出请求
       '/api': {
         // target: 'http://192.168.1.210:86/',
-        target: 'http://192.168.1.103:18086',
+        // target: 'http://192.168.1.103:18086',
         // target: 'http://192.168.1.158:18086',
         // target: 'http://192.168.158:18086',
-        // target: 'http://192.168.1.125:18086',
-        target: 'http://192.168.1.158:18086',
+        target: 'http://192.168.1.125:18086',
+        // target: 'http://192.168.1.158:18086',
 
         changeOrigin: true, // 只有这个值为true的情况下 才表示开启跨域
         pathRewrite: {

Некоторые файлы не были показаны из-за большого количества измененных файлов