Jelajahi Sumber

配料计划

quwangxin 3 tahun lalu
induk
melakukan
9fc6f7b9cc

+ 22 - 1
src/api/materialPlan/index.js

@@ -34,7 +34,28 @@ export async function update (data) {
  * 修改
  */
 export async function del (data) {
-  const res = await request.delete('/aps/batchingplan/delete', data);
+  const res = await request.delete('/aps/batchingplan/delete', { data });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 发布信息返显
+ */
+export async function getById (id) {
+  const res = await request.get(`/aps/batchingplan/getById/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 发布信息返显
+ */
+export async function getReleaseInfoById (id) {
+  const res = await request.get(`/aps/productionplan/getReleaseInfoById/${id}`);
   if (res.data.code == 0) {
     return res.data.data;
   }

+ 25 - 0
src/api/materialPlan/order.js

@@ -0,0 +1,25 @@
+import request from '@/utils/request';
+
+/**
+ * 工单发布
+ */
+export async function release (data) {
+  const res = await request.post('/aps/batchingworkorder/release', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 工单发布
+ */
+export async function getDeviceList ({ productionId }) {
+  const res = await request.get(
+    `/aps/batchingworkorder/getDeviceList/${productionId}`
+  );
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 16 - 14
src/views/productionPlan/components/equipment-dailog.vue → src/components/CreatePlan/equipment-dailog.vue

@@ -8,7 +8,6 @@
     <div class="search-box">
       设备名称
       <el-input placeholder="请输入" v-model="name"></el-input>
-      <el-button type="primary" @click="handleSearch">搜索</el-button>
     </div>
     <!-- 数据表格 -->
     <ele-pro-table
@@ -19,7 +18,7 @@
       :needPage="false"
       :initLoad="false"
       :selection.sync="selectionList"
-      :datasource="datasource"
+      :datasource="datasourceShow"
       :current.sync="current"
       :highlight-current-row="isSingle"
       height="45vh"
@@ -42,8 +41,8 @@
         current: null,
         name: '',
         selectionList: [],
-        tableList: [],
         memoList: [],
+        datasource: [],
         isSingle: false,
         callback: null
       };
@@ -91,6 +90,15 @@
           });
         }
         return list;
+      },
+      datasourceShow () {
+        return this.datasource.filter((item) => {
+          if (this.name) {
+            return item.name.includes(this.name);
+          }
+
+          return true;
+        });
       }
     },
     methods: {
@@ -98,18 +106,14 @@
         this.memoList = list;
         this.isSingle = false;
         this.visible = true;
-        this.$nextTick(() => {
-          this.$refs.table.reload();
-        });
+        this._getList();
       },
       openSingle (list = [], callback) {
         this.memoList = list;
         this.callback = callback;
         this.isSingle = true;
         this.visible = true;
-        this.$nextTick(() => {
-          this.$refs.table.reload();
-        });
+        this._getList();
       },
       handleDone ({ data }) {
         if (this.memoList.length) {
@@ -127,14 +131,12 @@
           });
         }
       },
-      datasource () {
-        return getDeviceList({
+      async _getList () {
+        const data = await getDeviceList({
           name: this.name,
           productionId: this.produceVersionId
         });
-      },
-      handleSearch () {
-        this.$refs.table.reload();
+        this.datasource = data;
       },
       confirm () {
         if (this.isSingle) {

+ 11 - 0
src/views/materialPlan/components/materialPlan-search.vue

@@ -133,6 +133,17 @@
         return this.$store.state.theme.styleResponsive;
       }
     },
+    watch: {
+      activeName: {
+        handler () {
+          if (this.activeName) {
+            this.where.status = this.statusOpt[this.activeName][0].value;
+            this.search();
+          }
+        },
+        immediate: true
+      }
+    },
     created () {},
     methods: {
       /* 搜索 */

+ 6 - 2
src/views/materialPlan/components/plan-edit-dialog.vue

@@ -154,13 +154,17 @@
       handleChooseMaterial (row) {
         this.formData.materialName = row.name;
         this.formData.categoryId = row.id;
-        this.formData.materialCode = row.materialCode;
+        this.formData.materialCode = row.code;
         this.formData.brandNo = row.brandNum;
         this.formData.unit = row.measuringUnit;
       },
       async confirm () {
         const request = this.type == 'add' ? save : update;
-        console.log(this.formData, 'this.formData');
+
+        if (this.type == 'add') {
+          this.formData.produceVersionId = '1684162877351866369';
+          this.formData.produceVersionName = '挤压合金生产';
+        }
         await request(this.formData);
         this.$message.success('保存成功!');
         this.$emit('success');

+ 318 - 51
src/views/materialPlan/components/plan-view.vue

@@ -1,95 +1,200 @@
 <template>
-  <div>
+  <div class="plan-view">
     <div class="description">
-      <div class="label">方案说明</div>
+      <div class="label"></div>
+      <!-- <div class="label">方案说明</div>
       <div class="content">
-        <template v-for="(item, index) in rules">
+        <template v-for="(item, index) in rulesList">
           <template v-for="(itm, idx) in item.list">
             <template v-if="!itm.lastDisabled">
               <div class="tag" :key="index + '' + idx">{{ itm.label }}</div>
             </template>
           </template>
         </template>
-      </div>
+      </div> -->
       <div class="operate">
-        <el-button type="primary" plain>发布当前方案</el-button>
-        <el-button type="primary">保存</el-button>
+        <el-button type="primary" plain @click="handleRelease"
+          >发布当前方案</el-button
+        >
+        <!-- <el-button type="primary">保存</el-button> -->
       </div>
     </div>
 
     <div class="display-box">
-      <el-button type="primary" plain size="small">添加工单</el-button>
-      <el-button type="primary" plain size="small">删除</el-button>
+      <el-button type="primary" plain size="small" @click="addOrder"
+        >添加工单</el-button
+      >
+      <!-- <el-button type="primary" plain size="small">删除</el-button> -->
       <div class="items">
         <span class="label">累计工单条数</span>
-        14条
+        {{ tableData.length }}条
       </div>
       <div class="items">
         <span class="label">累计成型数量</span>
-        14pcs
+        {{ sumData.formingNum }}pcs
       </div>
       <div class="items">
         <span class="label">累计成型重量</span>
-        14kg
+        {{ sumData.formingWeight }}{{ infoData.productUnitWeight }}
       </div>
       <div class="items">
         <span class="label">设备数量</span>
-        14条
+        {{ sumData.equipment }}条
       </div>
-      <div class="items">
+      <!-- <div class="items">
         <span class="label">成型剂需求</span>
         14条
       </div>
       <div class="items">
         <span class="label">混合料需求</span>
         14条
-      </div>
+      </div> -->
     </div>
-
-    <el-table :data="tableData">
-      <el-table-column type="index" label="序号"></el-table-column>
-      <el-table-column label="工单号" prop=""></el-table-column>
-      <el-table-column label="成型数量" prop="">
-        <template v-slot="{ row }">
-          <el-input type="number" v-model.number="row.num"></el-input>
-        </template>
-      </el-table-column>
-      <el-table-column label="成型重量" prop="">
-        <template v-slot="{ row }">
-          <el-input type="number" v-model.number="row.num"></el-input>
-        </template>
-      </el-table-column>
-      <el-table-column label="开始日期" prop="">
-        <template v-slot="{ row }">
-          <el-input type="number" v-model.number="row.num"></el-input>
-        </template>
-      </el-table-column>
-      <el-table-column label="班次" prop="">
-        <template v-slot="{ row }">
-          <el-select v-model="row.ba">
-            <el-option></el-option>
-          </el-select>
-        </template>
-      </el-table-column>
-      <el-table-column label="设备编码" prop=""></el-table-column>
-      <el-table-column label="设备名称" prop=""></el-table-column>
-      <el-table-column label="可执行人" prop=""></el-table-column>
-      <el-table-column label="操作" prop="">
-        <template v-slot="{ row }">
-          <el-link type="danger">删除</el-link>
-        </template>
-      </el-table-column>
-      <el-table-column type="selection"></el-table-column>
-    </el-table>
+    <el-form :model="{ tableData }" label-width="0" ref="formRef">
+      <el-table :data="tableData">
+        <el-table-column type="index" label="序号"></el-table-column>
+        <el-table-column label="工单号" prop="code"></el-table-column>
+        <el-table-column label="成型数量" prop="">
+          <template v-slot="{ row, $index }">
+            <el-form-item
+              :prop="`tableData.${$index}.formingNum`"
+              :rules="rule.formingNum"
+            >
+              <el-input
+                type="number"
+                v-model.number="row.formingNum"
+              ></el-input>
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column label="成型重量" prop="">
+          <template v-slot="{ row, $index }">
+            <el-form-item
+              :prop="`tableData.${$index}.formingWeight`"
+              :rules="rule.formingWeight"
+            >
+              <el-input
+                type="number"
+                v-model.number="row.formingWeight"
+              ></el-input>
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column label="开始日期" prop="">
+          <template v-slot="{ row, $index }">
+            <el-form-item
+              :prop="`tableData.${$index}.planStartTime`"
+              :rules="rule.planStartTime"
+            >
+              <el-date-picker
+                class="w100"
+                :clearable="false"
+                v-model="row.planStartTime"
+                :disabledDate="() => time.getTime() >= row.planCompleteDate"
+                type="date"
+                placeholder="选择日期"
+                value-format="yyyy-MM-dd HH:mm:ss"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column label="班次" prop="">
+          <template v-slot="{ row, $index }">
+            <el-form-item
+              :prop="`tableData.${$index}.classeId`"
+              :rules="rule.classeId"
+            >
+              <classesSelect
+                ref="classesSelectRef"
+                :init="false"
+                v-model="row.classeId"
+                @selfChange="(val) => handleClasseChange(val, row)"
+              />
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column label="设备编码" prop="deviceCode"></el-table-column>
+        <el-table-column label="设备名称" prop="deviceName">
+          <template v-slot="{ row, $index }">
+            <el-input
+              :value="row.deviceName"
+              @click.native="editOrder(row)"
+            ></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="可执行人"
+          prop="executorName"
+          min-width="220px"
+          show-overflow-tooltip
+        >
+          <template v-slot="{ row, $index }">
+            <template v-if="row.executorName.length">
+              <el-tag
+                type="success"
+                v-for="(item, index) in row.executorName.split(',')"
+                :key="index"
+                >{{ item }}</el-tag
+              >
+            </template>
+          </template></el-table-column
+        >
+        <el-table-column label="操作" prop="">
+          <template v-slot="{ $index }">
+            <el-link type="danger" @click="handleDelete($index)">删除</el-link>
+          </template>
+        </el-table-column>
+        <el-table-column type="selection"></el-table-column>
+      </el-table>
+    </el-form>
+    <equipmentDailog
+      ref="equipmentDailogRef"
+      @success="equipmentSelect"
+      :produceVersionId="infoData.produceVersionId"
+    />
   </div>
 </template>
 
 <script>
+  import equipmentDailog from '@/components/CreatePlan/equipment-dailog.vue';
+  import classesSelect from '@/components/CommomSelect/classes-select';
+  import { getExector } from '@/api/workforceManagement/classes';
+
+  import { release } from '@/api/materialPlan/order.js';
+  import { getCode } from '@/api/codeManagement';
+  import { deepClone } from '@/utils';
   export default {
+    components: { equipmentDailog, classesSelect },
+    props: {
+      infoData: {
+        type: Object,
+        default: () => ({})
+      },
+      orderList: {
+        type: Array,
+        default: () => []
+      }
+    },
     data () {
       return {
+        deleteList: [], //已保存删除项
         tableData: [],
-        rules: [
+        rule: {
+          formingNum: [
+            { required: true, message: '请输入成型数量', trigger: 'blur' }
+          ],
+          formingWeight: [
+            { required: true, message: '请输入成型重量', trigger: 'blur' }
+          ],
+          planStartTime: [
+            { required: true, message: '请选择开始日期', trigger: 'blur' }
+          ],
+          classeId: [
+            { required: true, message: '请选择班次', trigger: 'change' }
+          ]
+        },
+        rulesList: [
           {
             type: 'radio',
             value: '',
@@ -124,11 +229,173 @@
           }
         ]
       };
+    },
+    computed: {
+      sumData () {
+        let formingNum = 0;
+        let formingWeight = 0;
+        let equi = new Set();
+        this.tableData.forEach((ele) => {
+          formingNum += +ele.formingNum || 0;
+          formingWeight += +ele.formingWeight || 0;
+
+          equi.add(ele.deviceId);
+        });
+
+        return {
+          formingNum,
+          formingWeight: formingWeight.toFixed(2),
+          equipment: equi.size
+        };
+      }
+    },
+    watch: {
+      tableData: {
+        immediate: true,
+        handler () {
+          this.$nextTick(() => {
+            this.$refs.classesSelectRef &&
+              this.$refs.classesSelectRef.getList();
+          });
+        }
+      },
+      orderList: {
+        immediate: true,
+        handler () {
+          if (this.orderList?.length) {
+            this.tableData = deepClone(this.orderList);
+          }
+        }
+      }
+    },
+    methods: {
+      // 发布
+      handleRelease () {
+        this.$refs.formRef.validate((value) => {
+          if (value) {
+            this.$confirm('发布工单后不可撤回,确定发布吗?', '发布确认').then(
+              async () => {
+                const loading = this.$loading({
+                  lock: true,
+                  fullscreen: true,
+                  text: '工单发布中...'
+                });
+                try {
+                  // 反显对象会报错 status
+                  const data = await release([
+                    ...this.tableData.map((i) =>
+                      Object.assign({}, i, {
+                        status: 4,
+                        model: this.infoData.model,
+                        brandNo: this.infoData.brandNo
+                      })
+                    ),
+                    ...this.deleteList
+                  ]);
+                  if (data) {
+                    this.$message.success('发布成功!');
+                  } else {
+                    this.$message.error('发布失败,请重新发布!');
+                  }
+                  this.$router.go(-1);
+                } catch (error) {
+                  console.error(error);
+                }
+                loading.close();
+              }
+            );
+          }
+        });
+      },
+      // 班次改变选择执行人
+      async handleClasseChange (val, row) {
+        if (!val) {
+          row.executorId = '';
+          row.executorName = '';
+        }
+        const res = await getExector(val);
+
+        let executorId = '';
+        let executorName = '';
+        res.forEach((item) => {
+          executorId += ',' + item.userVOList.map((itm) => itm.id).join(',');
+          executorName +=
+            ',' + item.userVOList.map((itm) => itm.name).join(',');
+        });
+
+        row.executorId = executorId.substring(1);
+        row.executorName = executorName.substring(1);
+      },
+      addOrder () {
+        this.$refs.equipmentDailogRef.open();
+      },
+      editOrder (row) {
+        this.$refs.equipmentDailogRef.openSingle([row], (current) => {
+          row.deviceCode = current.code;
+          row.deviceId = current.id;
+          row.deviceName = current.name;
+          row.planStartTime = current.planCompleteDate;
+          row.planCompleteDate = current.planCompleteDate;
+        });
+      },
+      async equipmentSelect (list) {
+        for (const pre of list) {
+          const code = await getCode('product_order_code');
+          // classeId	班次id		false
+          // classeName	班次名称		false
+          // code	工单号		false
+          // deviceCode	设备编码		false
+          // deviceId	设备id		false
+          // deviceName	设备名称		false
+          // executorId	执行人id		false
+          // executorName	执行人名称		false
+          // formingNum	成型数量		false
+          // generativeRules	生成规则		false
+          // planCompleteTime	计划完成时间		false
+          // planStartTime	计划开始时间		false
+          // productionPlanCode	生产计划号		false
+          // productionPlanId	生产计划id		false
+          // workOrderType	工单类型
+          this.tableData.push({
+            classeId: pre.classeId,
+            code: code,
+            deviceCode: pre.code,
+            deviceId: pre.id,
+            deviceName: pre.name,
+            executorId: '',
+            executorName: '',
+            planCompleteTime: '', //当班下班时间,
+            planStartTime: pre.planCompleteDate,
+            planCompleteDate: pre.planCompleteDate,
+            formingNum: pre.formingNum,
+            formingWeight: '',
+            productionPlanId: this.infoData.id,
+            productionPlanCode: this.infoData.code,
+            produceVersionId: this.infoData.produceVersionId
+          });
+        }
+      },
+      handleDelete (index) {
+        this.$confirm('确定删除当前数据?', '提示').then(() => {
+          const [item] = this.tableData.splice(index, 1);
+
+          if (this.orderList.find((i) => i.id == item.id)) {
+            item.deleted = 1;
+            this.deleteList.push(item);
+          }
+        });
+      }
     }
   };
 </script>
 
 <style lang="scss" scoped>
+  .plan-view {
+    ::v-deep(.el-form-item) {
+      margin-top: 16px;
+      margin-bottom: 16px;
+    }
+  }
   .description {
     display: flex;
     justify-content: space-between;

+ 17 - 6
src/views/materialPlan/index.vue

@@ -4,7 +4,6 @@
       <materialPlan-search
         @search="reload"
         :statusOpt="statusOpt"
-        :planType="planType"
         :activeName="activeName"
         ref="searchRef"
       >
@@ -23,6 +22,7 @@
       <ele-pro-table
         ref="table"
         :key="activeName"
+        :initLoad="false"
         :columns="columns"
         :datasource="datasource"
         :cache-key="`${activeName}materialPlanTable`"
@@ -38,11 +38,18 @@
             type="primary"
             :underline="false"
             icon="el-icon-truck"
-            @click="handleOrderPublish(row)"
+            v-if="row.status == 2"
+            @click="handleOrderPublish(1, row)"
           >
             发布工单
           </el-link>
-          <el-link type="primary" :underline="false" icon="el-icon-truck">
+          <el-link
+            type="primary"
+            v-if="row.status == 3"
+            :underline="false"
+            icon="el-icon-truck"
+            @click="handleOrderPublish(2, row)"
+          >
             重新发布
           </el-link>
           <el-link
@@ -94,7 +101,7 @@
             { label: '发布失败', value: '3' }
           ],
           second: [
-            { label: '所有状态', value: '7,3,4,5,6' },
+            { label: '所有状态', value: '7,4,5,6' },
             { label: '待生产', value: '4' },
             { label: '生产中', value: '5' },
             { label: '已完成', value: '6' },
@@ -274,9 +281,13 @@
         });
       },
       // 发布工单
-      handleOrderPublish (row) {
+      handleOrderPublish (type, row) {
         this.$router.push({
-          path: '/materialPlan/workOrderPublish'
+          path: '/materialPlan/workOrderPublish',
+          query: {
+            type,
+            id: row.id
+          }
         });
       },
       handleTabChange () {

+ 89 - 25
src/views/materialPlan/workOrderPublish.vue

@@ -2,30 +2,51 @@
   <div class="ele-body">
     <el-card shadow="never">
       <div class="page-title">
-        <el-page-header @back="$router.go(-1)" content="发布工单">
-        </el-page-header>
+        <el-page-header @back="back" content="发布工单"> </el-page-header>
       </div>
 
-      <el-descriptions title="" :column="6" border>
-        <el-descriptions-item label="计划编号"
-          >kooriookami</el-descriptions-item
+      <el-descriptions title="" :column="6" border class="mb-20">
+        <el-descriptions-item label="计划编号">{{
+          infoData.code
+        }}</el-descriptions-item>
+        <el-descriptions-item label="计划类型">{{
+          planType[infoData.planType]
+        }}</el-descriptions-item>
+        <el-descriptions-item label="产品编码">{{
+          infoData.productCode
+        }}</el-descriptions-item>
+        <el-descriptions-item label="牌号">{{
+          infoData.brandNo
+        }}</el-descriptions-item>
+        <el-descriptions-item label="型号">{{
+          infoData.model
+        }}</el-descriptions-item>
+        <el-descriptions-item label="生产版本">{{
+          infoData.produceVersionName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="工艺路线名称">{{
+          infoData.routingName
+        }}</el-descriptions-item>
+        <el-descriptions-item label="工艺路线版本">{{
+          infoData.routingVersion
+        }}</el-descriptions-item>
+        <el-descriptions-item label="产品数量"
+          >{{ infoData.productNum }}PCS</el-descriptions-item
         >
-        <el-descriptions-item label="计划类型"
-          >18100000000</el-descriptions-item
+        <el-descriptions-item label="产品重量"
+          >{{ infoData.productWeight
+          }}{{ infoData.productUnitWeight }}</el-descriptions-item
+        >
+        <el-descriptions-item label="要求成型数量"
+          >{{ infoData.requiredFormingNum }}PCS</el-descriptions-item
+        >
+        <el-descriptions-item label="要求成型重量"
+          >{{ infoData.requiredFormingWeight
+          }}{{ infoData.productUnitWeight }}</el-descriptions-item
         >
-        <el-descriptions-item label="产品编码">苏州市</el-descriptions-item>
-        <el-descriptions-item label="牌号">苏州市</el-descriptions-item>
-        <el-descriptions-item label="型号">苏州市</el-descriptions-item>
-        <el-descriptions-item label="生产版本">苏州市</el-descriptions-item>
-        <el-descriptions-item label="工艺路线名称">苏州市</el-descriptions-item>
-        <el-descriptions-item label="工艺路线版本">苏州市</el-descriptions-item>
-        <el-descriptions-item label="产品数量">苏州市</el-descriptions-item>
-        <el-descriptions-item label="产品重量">苏州市</el-descriptions-item>
-        <el-descriptions-item label="要求成型数量">苏州市</el-descriptions-item>
-        <el-descriptions-item label="要求成型重量">苏州市</el-descriptions-item>
       </el-descriptions>
 
-      <div class="rules-box">
+      <!-- <div class="rules-box">
         <div class="rule-label">工单生成规则</div>
         <div class="rule-wrapper">
           <div class="content">
@@ -64,25 +85,26 @@
             <el-button type="primary" plain>一键生成方案</el-button>
           </div>
         </div>
-      </div>
-
-      <el-tabs v-model="activeName" type="card">
+      </div> -->
+      <planView key="first" :infoData="infoData" :orderList="orderList" />
+      <!-- <el-tabs v-model="activeName" type="card">
         <el-tab-pane label="默认" name="first"
-          ><planView key="first"
+          ><planView key="first" :infoData="infoData"
         /></el-tab-pane>
         <el-tab-pane
           v-for="(item, index) in planList"
           :label="item.label"
           :name="index"
-          ><planView :key="index"
+          ><planView :key="index" :infoData="infoData"
         /></el-tab-pane>
-      </el-tabs>
+      </el-tabs> -->
     </el-card>
   </div>
 </template>
 
 <script>
   import planView from './components/plan-view';
+  import { getById, getReleaseInfoById } from '@/api/materialPlan/index';
   export default {
     components: { planView },
     data () {
@@ -122,8 +144,46 @@
             value: '',
             list: [{ label: '末单均衡', value: 0 }]
           }
-        ]
+        ],
+        infoData: {},
+        orderList: [],
+        planType: ['内销计划', '外销计划'],
+        id: null
       };
+    },
+    methods: {
+      back () {
+        if (this.type == 2) {
+          this.$router.go(-1);
+          return;
+        }
+        this.$confirm('返回后将清空所有方案,是否要继续?', '提示').then(() => {
+          this.$router.go(-1);
+        });
+      },
+      async getInfo () {
+        const data = await getById(this.id);
+
+        this.infoData = data;
+      },
+      async getReleaseInfoById () {
+        const data = await getReleaseInfoById(this.id);
+
+        this.infoData = data.productionPlan;
+
+        this.orderList = data.workOrderList;
+      }
+    },
+    created () {
+      const { query = {} } = this.$route;
+
+      this.type = query.type;
+      this.id = query.id;
+      if (query.type == 2) {
+        this.getReleaseInfoById();
+      } else {
+        this.getInfo();
+      }
     }
   };
 </script>
@@ -163,4 +223,8 @@
       }
     }
   }
+
+  .mb-20 {
+    margin-bottom: 20px;
+  }
 </style>

+ 23 - 10
src/views/productionPlan/components/plan-view.vue

@@ -39,7 +39,7 @@
       </div>
       <div class="items">
         <span class="label">设备数量</span>
-        14条
+        {{ sumData.equipment }}条
       </div>
       <!-- <div class="items">
         <span class="label">成型剂需求</span>
@@ -157,13 +157,13 @@
 </template>
 
 <script>
-  import equipmentDailog from './equipment-dailog.vue';
+  import equipmentDailog from '@/components/CreatePlan/equipment-dailog.vue';
   import classesSelect from '@/components/CommomSelect/classes-select';
   import { getExector } from '@/api/workforceManagement/classes';
 
   import { release } from '@/api/productionPlan/order.js';
   import { getCode } from '@/api/codeManagement';
-  import { data } from 'ele-admin/lib/ele-pro-table';
+  import { deepClone } from '@/utils';
   export default {
     components: { equipmentDailog, classesSelect },
     props: {
@@ -178,6 +178,7 @@
     },
     data () {
       return {
+        deleteList: [], //已保存删除项
         tableData: [],
         rule: {
           formingNum: [
@@ -233,14 +234,18 @@
       sumData () {
         let formingNum = 0;
         let formingWeight = 0;
+        let equi = new Set();
         this.tableData.forEach((ele) => {
           formingNum += +ele.formingNum || 0;
           formingWeight += +ele.formingWeight || 0;
+
+          equi.add(ele.deviceId);
         });
 
         return {
           formingNum,
-          formingWeight: formingWeight.toFixed(2)
+          formingWeight: formingWeight.toFixed(2),
+          equipment: equi.size
         };
       }
     },
@@ -258,7 +263,7 @@
         immediate: true,
         handler () {
           if (this.orderList?.length) {
-            this.tableData = this.orderList;
+            this.tableData = deepClone(this.orderList);
           }
         }
       }
@@ -277,15 +282,16 @@
                 });
                 try {
                   // 反显对象会报错 status
-                  const data = await release(
-                    this.tableData.map((i) =>
+                  const data = await release([
+                    ...this.tableData.map((i) =>
                       Object.assign({}, i, {
                         status: 4,
                         model: this.infoData.model,
                         brandNo: this.infoData.brandNo
                       })
-                    )
-                  );
+                    ),
+                    ...this.deleteList
+                  ]);
                   if (data) {
                     this.$message.success('发布成功!');
                   } else {
@@ -370,7 +376,14 @@
         }
       },
       handleDelete (index) {
-        this.tableData.splice(index, 1);
+        this.$confirm('确定删除当前数据?', '提示').then(() => {
+          const [item] = this.tableData.splice(index, 1);
+
+          if (this.orderList.find((i) => i.id == item.id)) {
+            item.deleted = 1;
+            this.deleteList.push(item);
+          }
+        });
       }
     }
   };

+ 12 - 9
src/views/productionPlan/components/productionPlan-search.vue

@@ -65,7 +65,10 @@
           </el-select>
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 9, md: 12 } : { span: 9 }">
+      <el-col
+        v-bind="styleResponsive ? { lg: 9, md: 12 } : { span: 9 }"
+        v-if="activeName == 'second'"
+      >
         <el-form-item label-width="150px">
           <template slot="label">
             <el-select
@@ -101,16 +104,13 @@
               v-model="shapeVal"
               @change="
                 () => {
-                  where.requiredFormingTime = [];
+                  where.reqMoldTime = [];
                   where.planFormingTime = [];
                   where.formingTime = [];
                 }
               "
             >
-              <el-option
-                label="要求成型日期"
-                value="requiredFormingTime"
-              ></el-option>
+              <el-option label="要求成型日期" value="reqMoldTime"></el-option>
               <el-option
                 label="预测成型日期"
                 value="planFormingTime"
@@ -131,7 +131,10 @@
           </el-date-picker>
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 9, md: 12 } : { span: 9 }">
+      <el-col
+        v-bind="styleResponsive ? { lg: 9, md: 12 } : { span: 9 }"
+        v-if="activeName == 'second'"
+      >
         <el-form-item label="工单发布时间:" label-width="150px">
           <el-date-picker
             class="w100"
@@ -180,14 +183,14 @@
         releaseTime: [],
         deliveryTime: [],
         formingTime: [],
-        requiredFormingTime: [],
+        reqMoldTime: [],
         planFormingTime: [],
         executeUserName: ''
       };
       return {
         // 表单数据
         deliveryVal: 'deliveryTime',
-        shapeVal: 'requiredFormingTime',
+        shapeVal: 'reqMoldTime',
         where: { ...defaultWhere },
         treeData: []
       };

+ 31 - 29
src/views/productionPlan/index.vue

@@ -92,7 +92,7 @@
             { label: '发布失败', value: '3' }
           ],
           second: [
-            { label: '所有状态', value: '7,3,4,5,6' },
+            { label: '所有状态', value: '7,4,5,6' },
             { label: '待生产', value: '4' },
             { label: '生产中', value: '5' },
             { label: '已完成', value: '6' },
@@ -101,8 +101,9 @@
         },
         planType: [
           { label: '所有计划类型', value: null },
-          { label: '内销计划', value: '0' },
-          { label: '外销计划', value: '1' }
+          { label: '内销计划', value: '1' },
+          { label: '外销计划', value: '2' },
+          { label: '预制计划', value: '3' }
         ]
       };
     },
@@ -111,13 +112,13 @@
       columns () {
         const opt = {
           first: [
-            {
-              prop: 'deliveryTime',
-              label: '预测交货日期',
-              align: 'center',
-              showOverflowTooltip: true,
-              minWidth: 110
-            }
+            // {
+            //   prop: 'deliveryTime',
+            //   label: '预测交货日期',
+            //   align: 'center',
+            //   showOverflowTooltip: true,
+            //   minWidth: 110
+            // }
           ],
           second: [
             // {
@@ -134,6 +135,13 @@
               showOverflowTooltip: true,
               minWidth: 110
             },
+            {
+              prop: 'planFormingTime',
+              label: '预测成型日期',
+              align: 'center',
+              showOverflowTooltip: true,
+              minWidth: 110
+            },
             {
               prop: 'deliveryTime',
               label: '预测交货日期',
@@ -214,19 +222,13 @@
           //   minWidth: 110
           // },
           {
-            prop: 'requiredFormingTime',
+            prop: 'reqMoldTime',
             label: '要求成型日期',
             align: 'center',
             showOverflowTooltip: true,
             minWidth: 110
           },
-          {
-            prop: 'planFormingTime',
-            label: '预测成型日期',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110
-          },
+
           ...opt[this.activeName],
 
           {
@@ -258,17 +260,17 @@
               return obj && obj.label;
             }
           },
-          ...(this.activeName === 'second'
-            ? [
-                {
-                  prop: 'releaseTime',
-                  label: '发布时间',
-                  align: 'center',
-                  showOverflowTooltip: true,
-                  minWidth: 110
-                }
-              ]
-            : []),
+          // ...(this.activeName === 'second'
+          //   ? [
+          //       {
+          //         prop: 'releaseTime',
+          //         label: '发布时间',
+          //         align: 'center',
+          //         showOverflowTooltip: true,
+          //         minWidth: 110
+          //       }
+          //     ]
+          //   : []),
           ...(this.activeName === 'first'
             ? [
                 {

+ 4 - 0
src/views/productionPlan/workOrderPublish.vue

@@ -153,6 +153,10 @@
     },
     methods: {
       back () {
+        if (this.type == 2) {
+          this.$router.go(-1);
+          return;
+        }
         this.$confirm('返回后将清空所有方案,是否要继续?', '提示').then(() => {
           this.$router.go(-1);
         });

+ 278 - 266
src/views/saleOrder/components/create-order.vue

@@ -1,129 +1,129 @@
 <template>
-  <ele-modal
-    :visible.sync="visible"
-    :title="title"
-    width="80vw"
-    append-to-body
-  >
+  <ele-modal :visible.sync="visible" :title="title" width="80vw" append-to-body>
     <el-form ref="form" :model="form" :rules="rules" label-width="90px">
-		<el-row :gutter="15">
-			<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-			  <el-form-item label="销售订单号:">
-			     <el-input clearable :maxlength="20" v-model="form.code" disabled/>
-			  </el-form-item>
-			</el-col>
-			<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-			  <el-form-item label="交付要求:">
-			     <DictSelection dictName="紧急程度" clearable v-model="form.deliveryRequirements">
-			     </DictSelection>
-			  </el-form-item>
-			</el-col>
-			<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-			  <el-form-item label="订单类型:">
-				  <el-select v-model="form.orderType" placeholder="请选择">
-						<el-option
-						  v-for="item in typeList"
-						  :key="item.id"
-						  :label="item.label"
-						  :value="item.id">
-						</el-option>
-				  </el-select>
-			  </el-form-item>
-			</el-col>
-			<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-			  <el-form-item label="按单按库:">
-			  	<DictSelection dictName="按单按库" clearable v-model="form.orderLibraryType">
-			  	</DictSelection>
-			  </el-form-item>
-			</el-col>
-			<el-col v-bind="styleResponsive ? { lg: 12, md: 12 } : { span: 12 }">
-			  <el-form-item label="客户名称:">
-			     <el-input clearable v-model="form.customerName"/>
-			  </el-form-item>
-			</el-col>
-			<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-			  <el-form-item label="业务员:">
-			     <el-input clearable v-model="form.salesman"/>
-			  </el-form-item>
-			</el-col>
-			<el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-			  <el-form-item label="交付日期:" prop="deliveryTime">
-			    <el-date-picker
-				   style="width: 100%;"
-				   v-model="form.deliveryTime"
-				   type="date"
-				   placeholder="选择日期"
-				   value-format="yyyy-MM-dd">
-				 </el-date-picker>
-			  </el-form-item>
-			</el-col>
-			<el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }">
-			  <el-form-item label="备注:">
-			     <el-input clearable v-model="form.notes"/>
-			  </el-form-item>
-			</el-col>
-		</el-row>
-		<el-table
-		  :data="form.productInfoList"
-		  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="lineNumber">
-		  </el-table-column>
-		  <el-table-column label="产品名称" align="center" prop="productName">
-		  </el-table-column>
-		  <el-table-column label="产品编号" align="center" prop="productCode">
-		  </el-table-column>
-		  <el-table-column label="牌号" align="center" prop="brandNo">
-		  </el-table-column>
-		  <el-table-column label="型号" align="center" prop="model">
-		  </el-table-column>
-		  <el-table-column label="单重" align="center" prop="productUnitWeight">
-		  </el-table-column>
-		  <el-table-column label="交付数量" align="center" prop="contractNum">
-		    <template slot-scope="scope">
-		      <el-form-item
-		          label-width="0px"
-		         :prop="'productInfoList.'+ scope.$index + '.contractNum'"
-		         :rules="{
-		           required: true,
-		           message: '请输入交付数量',
-		           trigger: 'blur'
-		         }"
-		       >
-		         <el-input
-		            v-model.number="scope.row.contractNum"
-		            size="small"
-		            oninput="value=value.replace(/[^\d]/g,'')"
-		            style="width: 100%"
-		            placeholder="输入数量"
-					@input="inputNumber(scope.row,scope.$index)"
-		          ></el-input>
-		      </el-form-item>
-		    </template>
-		  </el-table-column>
-		  <el-table-column label="交付重量" align="center" prop="deliveryWeight">
-			  <template slot-scope="{row}">
-			    <span>{{ row.deliveryWeight?row.deliveryWeight:'-' }}</span>
-			  </template>
-		  </el-table-column>
-		  <el-table-column label="操作" align="center" width="70">
-		    <template slot-scope="scope">
-		      <el-button
-		        type="text"
-		        @click="handleDeleteItem(scope.$index)"
-		        >删除</el-button
-		      >
-		    </template>
-		  </el-table-column>
-		</el-table>
-		<div class="add-product" @click='addEquipment'>
-			<i class="el-icon-circle-plus-outline"></i>
-		</div>
+      <el-row :gutter="15">
+        <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+          <el-form-item label="销售订单号:">
+            <el-input clearable :maxlength="20" v-model="form.code" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+          <el-form-item label="交付要求:">
+            <DictSelection
+              dictName="紧急程度"
+              clearable
+              v-model="form.deliveryRequirements"
+            >
+            </DictSelection>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+          <el-form-item label="订单类型:">
+            <el-select v-model="form.orderType" placeholder="请选择">
+              <el-option
+                v-for="item in typeList"
+                :key="item.id"
+                :label="item.label"
+                :value="item.id"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+          <el-form-item label="按单按库:">
+            <DictSelection
+              dictName="按单按库"
+              clearable
+              v-model="form.orderLibraryType"
+            >
+            </DictSelection>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 12, md: 12 } : { span: 12 }">
+          <el-form-item label="客户名称:">
+            <el-input clearable v-model="form.customerName" />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+          <el-form-item label="业务员:">
+            <el-input clearable v-model="form.salesman" />
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+          <el-form-item label="交付日期:" prop="deliveryTime">
+            <el-date-picker
+              style="width: 100%"
+              v-model="form.deliveryTime"
+              type="date"
+              placeholder="选择日期"
+              value-format="yyyy-MM-dd"
+            >
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col v-bind="styleResponsive ? { lg: 24, md: 24 } : { span: 24 }">
+          <el-form-item label="备注:">
+            <el-input clearable v-model="form.notes" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-table :data="form.productInfoList" 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="lineNumber">
+        </el-table-column>
+        <el-table-column label="产品名称" align="center" prop="productName">
+        </el-table-column>
+        <el-table-column label="产品编号" align="center" prop="productCode">
+        </el-table-column>
+        <el-table-column label="牌号" align="center" prop="brandNo">
+        </el-table-column>
+        <el-table-column label="型号" align="center" prop="model">
+        </el-table-column>
+        <el-table-column label="单重" align="center" prop="productUnitWeight">
+        </el-table-column>
+        <el-table-column label="交付数量" align="center" prop="contractNum">
+          <template slot-scope="scope">
+            <el-form-item
+              label-width="0px"
+              :prop="'productInfoList.' + scope.$index + '.contractNum'"
+              :rules="{
+                required: true,
+                message: '请输入交付数量',
+                trigger: 'blur'
+              }"
+            >
+              <el-input
+                v-model.number="scope.row.contractNum"
+                size="small"
+                oninput="value=value.replace(/[^\d]/g,'')"
+                style="width: 100%"
+                placeholder="输入数量"
+                @input="inputNumber(scope.row, scope.$index)"
+              ></el-input>
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column label="交付重量" align="center" prop="productWeight">
+          <template slot-scope="{ row }">
+            <span>{{ row.productWeight ? row.productWeight : '-' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="70">
+          <template slot-scope="scope">
+            <el-button type="text" @click="handleDeleteItem(scope.$index)"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="add-product" @click="addEquipment">
+        <i class="el-icon-circle-plus-outline"></i>
+      </div>
     </el-form>
     <template v-slot:footer>
       <el-button @click="cancel">取消</el-button>
@@ -131,168 +131,180 @@
         确定
       </el-button>
     </template>
-	
-	<!-- 选择产品 -->
-	<EquipmentDialog ref="equipmentRefs" @choose="confirmChoose" :selectList="form.productInfoList"> </EquipmentDialog>
+
+    <!-- 选择产品 -->
+    <EquipmentDialog
+      ref="equipmentRefs"
+      @choose="confirmChoose"
+      :selectList="form.productInfoList"
+    >
+    </EquipmentDialog>
   </ele-modal>
 </template>
 
 <script>
-	import { getCode } from '@/api/codeManagement';
-	import EquipmentDialog from '../components/EquipmentDialog.vue';
-	import { createOrUpdate , getOrderDetail  } from '@/api/saleOrder';
-	export default {
-		components: {
-		  EquipmentDialog
-		},
-    data() {
+  import { getCode } from '@/api/codeManagement';
+  import EquipmentDialog from '../components/EquipmentDialog.vue';
+  import { createOrUpdate, getOrderDetail } from '@/api/saleOrder';
+  export default {
+    components: {
+      EquipmentDialog
+    },
+    data () {
       return {
         visible: false,
-		loading:false,
-		form:{
-			productInfoList:[]
-		},
-	// 表单验证规则
-		rules: {
-			deliveryTime: [{required: true,message: '请选择交付日期',trigger: 'change'}]
-		},
-		typeList:[
-			{id:1,label:'内销订单'},
-			{id:2,label:'外销订单'},
-			{id:3,label:'预制订单'}
-		],
-		title:'创建订单'
+        loading: false,
+        form: {
+          productInfoList: []
+        },
+        // 表单验证规则
+        rules: {
+          deliveryTime: [
+            { required: true, message: '请选择交付日期', trigger: 'change' }
+          ]
+        },
+        typeList: [
+          { id: 1, label: '内销订单' },
+          { id: 2, label: '外销订单' },
+          { id: 3, label: '预制订单' }
+        ],
+        title: '创建订单'
       };
     },
     computed: {
       // 是否开启响应式布局
-      styleResponsive() {
+      styleResponsive () {
         return this.$store.state.theme.styleResponsive;
       }
     },
-    created(){
-    },
+    created () {},
     methods: {
-	  open (row) {
-	    this.visible = true;
-		if(row){
-			this.title = '修改订单'
-			this.getDetail(row.code)
-		}else{
-			this.title = '创建订单'
-			this.getSaleCode()
-		}
-	  },
-	  getDetail(code){
-		  getOrderDetail(code).then(res=>{
-			  console.log('返回',res)
-			  this.form = res
-		  })
-	  },
+      open (row) {
+        this.visible = true;
+        if (row) {
+          this.title = '修改订单';
+          this.getDetail(row.code);
+        } else {
+          this.title = '创建订单';
+          this.getSaleCode();
+        }
+      },
+      getDetail (code) {
+        getOrderDetail(code).then((res) => {
+          console.log('返回', res);
+          this.form = res;
+        });
+      },
       cancel () {
-		this.form = {
-			productInfoList:[]
-		}
-		this.$refs.form.clearValidate();
+        this.form = {
+          productInfoList: []
+        };
+        this.$refs.form.clearValidate();
         this.visible = false;
       },
-	  // 删除产品
-	  handleDeleteItem (index) {
-	    this.form.productInfoList.splice(index, 1)
-		this.changeLineNumber()
-	  },
-	  addEquipment(){
-		  this.$refs.equipmentRefs.open()
-	  }, 
-	  /* 保存编辑 */
-	  save() {
-	    this.$refs.form.validate((valid) => {
-	      if (!valid) {
-	        return false;
-	      }
-		  if(!this.form.productInfoList.length){
-			  return this.$message.warning('产品列表不能为空!')
-		  }
-		  this.loading = true;
-		  createOrUpdate(this.form)
-		    .then((res) => {
-				this.loading = false;
-		        this.$message.success('成功')
-				this.cancel()
-				this.$emit('refresh')
-		    })
-		    .catch((e) => {
-		      this.loading = false;
-		    });
-	    });
-	  },
-	  
-		async getSaleCode(){
-		    const res = await getCode('sale_order')
-			if(res){
-				this.$set(this.form,'code',res)
-			}
-		},
-		// 确定选择
-		confirmChoose(list){
-			list = list.map(
-			  (item,index) => {
-			    return {
-			      productCode: item.code,
-			      productName: item.name,
-			      productUnitWeight: item.netWeight,
-				  model:item.modelType,
-				  brandNo:item.brandNum
-			    };
-			  }
-			);
-			// 取出在弹窗中选中并且不在表格中的数据
-			 const result = list.filter(
-			   i => this.form.productInfoList.findIndex(p => p.productCode === i.productCode) === -1
-			 )
-			 // 取出在表格中并且不在弹窗中选中的数据 即取消选中的数据
-			 const del = this.form.productInfoList.filter(
-			   i => list.findIndex(p => p.productCode === i.productCode) === -1
-			 )
-			for(let i= this.form.productInfoList.length-1;i>=0;i--){
-			  for(let j in del){
-				  if(this.form.productInfoList[i].productCode === del[j].productCode){
-					  this.form.productInfoList.splice(i,1);
-				  }
-			  }
-			}
-			this.form.productInfoList = this.form.productInfoList.concat(result)
-			this.changeLineNumber()
-		},
-		
-		changeLineNumber(){
-			this.form.productInfoList.map((item,index)=>{
-				item.lineNumber = 10*(index+1)
-			})
-		},
-		
-		inputNumber(row,index){
-			const pos = this.form.productInfoList
-			if(pos[index].productUnitWeight){
-				this.$set(pos[index],'deliveryWeight', row.contractNum * row.productUnitWeight)
-			}
-		}
-	  
+      // 删除产品
+      handleDeleteItem (index) {
+        this.form.productInfoList.splice(index, 1);
+        this.changeLineNumber();
+      },
+      addEquipment () {
+        this.$refs.equipmentRefs.open();
+      },
+      /* 保存编辑 */
+      save () {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            return false;
+          }
+          if (!this.form.productInfoList.length) {
+            return this.$message.warning('产品列表不能为空!');
+          }
+          this.loading = true;
+          createOrUpdate(this.form)
+            .then((res) => {
+              this.loading = false;
+              this.$message.success('成功');
+              this.cancel();
+              this.$emit('refresh');
+            })
+            .catch((e) => {
+              this.loading = false;
+            });
+        });
+      },
+
+      async getSaleCode () {
+        const res = await getCode('sale_order');
+        if (res) {
+          this.$set(this.form, 'code', res);
+        }
+      },
+      // 确定选择
+      confirmChoose (list) {
+        list = list.map((item, index) => {
+          return {
+            productCode: item.code,
+            productName: item.name,
+            productUnitWeight: item.netWeight,
+            model: item.modelType,
+            brandNo: item.brandNum
+          };
+        });
+        // 取出在弹窗中选中并且不在表格中的数据
+        const result = list.filter(
+          (i) =>
+            this.form.productInfoList.findIndex(
+              (p) => p.productCode === i.productCode
+            ) === -1
+        );
+        // 取出在表格中并且不在弹窗中选中的数据 即取消选中的数据
+        const del = this.form.productInfoList.filter(
+          (i) => list.findIndex((p) => p.productCode === i.productCode) === -1
+        );
+        for (let i = this.form.productInfoList.length - 1; i >= 0; i--) {
+          for (let j in del) {
+            if (
+              this.form.productInfoList[i].productCode === del[j].productCode
+            ) {
+              this.form.productInfoList.splice(i, 1);
+            }
+          }
+        }
+        this.form.productInfoList = this.form.productInfoList.concat(result);
+        this.changeLineNumber();
+      },
+
+      changeLineNumber () {
+        this.form.productInfoList.map((item, index) => {
+          item.lineNumber = 10 * (index + 1);
+        });
+      },
+
+      inputNumber (row, index) {
+        const pos = this.form.productInfoList;
+        if (pos[index].productUnitWeight) {
+          this.$set(
+            pos[index],
+            'productWeight',
+            row.contractNum * row.productUnitWeight
+          );
+        }
+      }
     }
   };
 </script>
 <style lang="scss" scoped>
-  .basic-details-title{
-	  margin:10px 0
+  .basic-details-title {
+    margin: 10px 0;
   }
-  .add-product{
-	  width:100%;
-	  display:flex;
-	  align-items:center;
-	  justify-content:flex-end;
-	  font-size:30px;
-	  color:#1890ff;
-	  margin:10px 0;
-	  cursor: pointer;
+  .add-product {
+    width: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+    font-size: 30px;
+    color: #1890ff;
+    margin: 10px 0;
+    cursor: pointer;
   }
-</style>
+</style>

+ 6 - 0
src/views/saleOrder/salesToProduction.vue

@@ -378,12 +378,18 @@
       mapList () {
         var requiredFormingWeight = 0;
         var requiredFormingNum = 0;
+        var productNum = 0;
         this.form.salesOrders.map((item, index) => {
           requiredFormingWeight =
             requiredFormingWeight +
             Number(item.productUnitWeight) * Number(item.requiredFormingNum);
           requiredFormingNum = requiredFormingNum + item.requiredFormingNum;
+
+          productNum += Number(item.planProductNum);
         });
+        this.form.productNum = productNum;
+        this.form.productUnitWeight =
+          this.form.salesOrders[0]?.productUnitWeight;
         this.form.requiredFormingWeight = requiredFormingWeight.toFixed(2);
         this.form.requiredFormingNum = requiredFormingNum;
         const collection = deepClone(this.form.salesOrders);