Browse Source

转生产计划bug修复

jingshuyong 11 tháng trước cách đây
mục cha
commit
8a2e58dbdb

+ 54 - 46
src/views/saleOrder/salesToProduction.vue

@@ -127,7 +127,7 @@
         id: this.id,
         type: this.type
       };
-
+      console.log(this.type,'type')
       if (this.type == 'edit') {
         this.getPlanInfo(this.$route.query.id);
       } else {
@@ -270,56 +270,64 @@
 
       getSaleInfo() {
         let params = JSON.parse(this.$route.query.selection);
-        productionToPlan(params).then((res) => {
-          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;
-          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.startRequest = false;
+        productionToPlan(params)
+          .then((res) => {
+            this.startRequest = true;
+            this.form = deepClone(res);
+            if (!this.form.produceType) {
+              this.form.produceType = 2;
+              this.bomListVersion();
             }
-          }
-          this.form.salesOrders.map((item, index) => {
+            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;
             if (this.clientEnvironmentId == '4') {
-              this.tableHandleKeyUp(item, '', item.lackNum, 'sum');
+              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 {
-              item.planProductNum = item.lackNum;
-              item.requiredFormingNum = item.lackNum;
+              this.form.planType = 3;
             }
-            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');
+            this._getInventory();
+          })
+          .catch((err) => {
+            this.startRequest = true;
           });
-          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();
       },
 

+ 174 - 43
src/views/workOrder/components/releaseDialog.vue

@@ -247,6 +247,13 @@
                     >
                   </el-radio-group>
                 </div>
+
+                <div
+                  style="margin-left: 50px; display: inline-block"
+                  v-if="timeSlot(item)"
+                >
+                  时间段: {{ item.startDate }} ----- {{ item.endDate }}
+                </div>
               </template>
               <template v-slot:quantity="{ row }">
                 <el-input
@@ -271,7 +278,7 @@
                   :disabled="permissions(row)"
                   v-model="row.teamTimeDetailId"
                   placeholder="班次"
-                  @change="(e) => shiftSelection(e, row)"
+                  @change="(e) => shiftSelection(e, row, item)"
                 >
                   <el-option
                     v-for="item in shiftList"
@@ -290,7 +297,7 @@
                   type="datetime"
                   value-format="yyyy-MM-dd HH:mm:ss"
                   placeholder="开始时间"
-                  @change="handleStartTimeChange(row)"
+                  @change="handleStartTimeChange(row, item)"
                   :picker-options="{
                     disabledDate: (time) => {
                       const end = row.endTime;
@@ -312,7 +319,7 @@
                   v-model="row.endTime"
                   type="datetime"
                   value-format="yyyy-MM-dd HH:mm:ss"
-                  @change="handleEndTimeChange(row)"
+                  @change="handleEndTimeChange(row, item)"
                   placeholder="完成时间"
                   :picker-options="{
                     disabledDate: (time) => {
@@ -402,7 +409,6 @@
 </template>
 
 <script>
-
   import {
     listByFirstTaskId,
     listUserByIds,
@@ -522,6 +528,15 @@
           if (row.status.code == 1) return true;
         };
       },
+      // 时间段显示
+      timeSlot() {
+        return (item) => {
+          if (!item.startDate || !item.endDate) {
+            return false;
+          }
+          return true;
+        };
+      },
       columns() {
         return [
           {
@@ -625,14 +640,6 @@
           this.shiftList = res;
         });
       },
-      // 选中班次
-      shiftSelection(e, row) {
-        let data = this.shiftList.find((item) => item.id == e);
-        let startTime = `${this.dateValue} ${data.startTime}`;
-        let endTime = `${this.dateValue} ${data.endTime}`;
-        this.$set(row, 'startTime', startTime);
-        this.$set(row, 'endTime', endTime);
-      },
       // 查询是否派单
       queryCheckExists() {
         let params = {
@@ -663,7 +670,6 @@
               this.orderDis = false;
               this.procTaskDis = false;
             }
-            console.log(res, '是否派单');
           })
           .catch((err) => {
             this.$message.error(err.message);
@@ -732,13 +738,14 @@
                 selection: [], // 当前工序下面的指派 选中的数据
                 code: item.code, // 工序 编码
                 index: index, // 当前工序数据的下标
-
                 radioBun: {
                   // 指派按钮的操作状态 绑定 默认false(可操作)
-                  stationDis: false,
-                  staffDis: false,
-                  lineDis: false
-                }
+                  stationDis: false, // 工位按钮
+                  staffDis: false, // 人员按钮
+                  lineDis: false // 产线按钮
+                },
+                startDate: '', // 开始日期 (当前工序中最早的计划开始时间)
+                endDate: '' // 结束日期 (当前工序中最晚的计划结束时间)
               };
               list.push(obj);
             });
@@ -753,6 +760,7 @@
               this.procTaskDis = true;
               this.$message.warning('当前任务没有首工序报工');
             }
+            console.log(this.processList, '工序的数据 1234');
           })
           .catch((err) => {
             this.processList = [];
@@ -786,7 +794,15 @@
         this.form.teamName = data.name;
         try {
           const res = await listUserByIds([e]);
-          this.crewList = res || [];
+          this.crewList =
+            res &&
+            res.map((el) => {
+              return {
+                code: el.code,
+                name: el.name,
+                id: el.id
+              };
+            });
           // 查看当前的工序数据是不是 选择的人员 是的话同步更改
           if (!this.processId || this.processId == 0) {
             return;
@@ -803,14 +819,31 @@
       // 获取产线数据
       async getProductionData() {
         const res = await lineByCurrentUser(this.form.workCenterId);
-        this.productionList = res || [];
+        this.productionList =
+          res &&
+          res.map((el) => {
+            return {
+              name: el.name,
+              code: el.code,
+              id: el.id
+            };
+          });
       },
       // 查询工位数据
       FirstTaskIdFn() {
         // listByFirstTaskId(this.current.firstTaskId)
         listByFirstTaskId(this.current.firstTaskId)
           .then((res) => {
+            console.log(res, 'res -----');
             this.stationList = res;
+            // res &&
+            // res.map((el) => {
+            //   return {
+            //     name: el.name,
+            //     code: el.code,
+            //     id: el.id
+            //   };
+            // });
             this.changeDispatch();
           })
           .catch((err) => {
@@ -869,22 +902,12 @@
         let assignees = [];
         let changeIds = [];
         let flag = true; // 是否填写 校验
-        // let digit = true; // 数字校验
         row.selection.forEach((item) => {
           if (!item.quantity || !item.startTime || !item.endTime) {
             flag = false;
             return;
           }
-          // if (item.quantity == 0) {
-          //   this.$message.warning('请检查所选数据的数量不能为0');
-          //   digit = false;
-          //   return;
-          // }
-          // if (item.weight == 0) {
-          //   this.$message.warning('请检查所选数据的重量不能为0');
-          //   digit = false;
-          //   return;
-          // }
+
           let Aobj = {
             assigneeId: item.id,
             quantity: item.quantity,
@@ -901,9 +924,6 @@
           changeIds.push(item.changeId);
         });
         // 校验没过 就不往下进行
-        // if (!digit) {
-        //   return;
-        // }
         if (!flag) {
           this.$message.warning(
             '请将所选数据的 数量,开始时间,完成时间 填写完毕'
@@ -1101,7 +1121,7 @@
             this.$message.error(err.message);
           });
       },
-      // 工序选择 有问题
+      // 工序选择
       handleClick(tab) {
         let id = tab.name;
         this.processId = id;
@@ -1154,6 +1174,7 @@
           // 对有操作过的数据进行赋值
           this.operationalData(index, res, list);
         } catch (err) {
+          console.log(err, 'errerrerrerrerr');
           this.tabLoading = false;
           this.$message.warning(err.message);
         }
@@ -1218,9 +1239,15 @@
         let listMap = {};
         listArr.map((el, index) => (listMap[el.id] = index));
         let arrList = codeT ? arrMap[codeT].arr : res[0].assignees;
+        dataRow.startDate = ''; // 每次计算的时候清空之前的
+        dataRow.endDate = '';
         arrList.map((item) => {
           if (item.assigneeType.code == dataRow.assignType) {
+            console.log(item, 'itemitemitemitemitemitemitemitemitemitem');
             let idx = listMap[item.assigneeId];
+            if (!idx && idx !== 0) {
+              return;
+            }
             listArr[idx].status = item.status;
             listArr[idx].startTime = item.startTime;
             listArr[idx].endTime = item.endTime;
@@ -1228,11 +1255,53 @@
             listArr[idx].weight = item.weight;
             listArr[idx].changeId = item.id;
             listArr[idx].teamTimeDetailId = item.teamTimeDetailId;
+            // this.compareAndSetTime(listArr[idx], dataRow);
+            // this.compareEndSetTime(listArr[idx], dataRow);
           }
         });
+        console.log(arrList, 'arrList arrList');
+        // 这里重新调用一个方法 计算出 startDate endDate
+        console.log(dataRow, 'dataRow +++++');
         this.$set(dataRow, 'list', listArr);
         this.$set(dataRow, 'radioBun', radioBun);
       },
+
+      // 时间比较与赋值方法 开始时间
+      compareAndSetTime(data, dataRow) {
+        // 如果startDate为空,直接赋值为startTime
+        if (!dataRow.startDate) {
+          dataRow.startDate = data['startTime'];
+          return;
+        }
+
+        // 转换为Date对象进行比较
+        const startTimeDate = new Date(data['startTime']);
+        const startDateDate = new Date(dataRow.startDate);
+
+        // 比较时间(getTime()获取时间戳)
+        if (startTimeDate.getTime() < startDateDate.getTime()) {
+          dataRow.startDate = data['startTime'];
+        }
+      },
+
+      // 时间比较与赋值方法 结束时间时间
+      compareEndSetTime(data, dataRow) {
+        // 如果startDate为空,直接赋值为endTime
+        if (!dataRow.endDate) {
+          dataRow.endDate = data['endTime'];
+          return;
+        }
+
+        // 转换为Date对象进行比较
+        const endTimeDate = new Date(data['endTime']);
+        const endDateDate = new Date(dataRow.endDate);
+
+        // 比较时间(getTime()获取时间戳)
+        if (endTimeDate.getTime() > endDateDate.getTime()) {
+          dataRow.endDate = data['endTime'];
+        }
+      },
+
       assignRadio(e) {},
       // 数量正则 quantity
       handleQuantityInput(e, row, item) {
@@ -1311,22 +1380,84 @@
         row.weight = value;
         this.calculateWeight(row, item);
       },
-
+      // 选中班次
+      shiftSelection(e, row, item) {
+        let data = this.shiftList.find((item) => item.id == e);
+        let startTime = `${this.dateValue} ${data.startTime}`;
+        let endTime = `${this.dateValue} ${data.endTime}`;
+        this.$set(row, 'startTime', startTime);
+        this.$set(row, 'endTime', endTime);
+        this.handleStartTimeChange(row, item);
+        this.handleEndTimeChange(row, item);
+      },
       // 【开始时间变化时】触发
-      handleStartTimeChange(row) {
+      handleStartTimeChange(row, item) {
+        // 后一道工序的开始时间 不能小于前一道工序的结束时间
+        // if (item.index !== 0) {
+        //   let frontIdx = item.index - 1;
+        //   let frontName = this.processList[frontIdx].name;
+        //   let time = this.processList[frontIdx].endDate;
+        //   const frontTime = new Date(time); // 上一道工序的结束时间
+        //   const startTime = new Date(row.startTime); // 开始时间
+        //   const endTime = item.endTime ? new Date(item.endTime) : null; // 结束时间
+        //   console.log(startTime,'startTime 开始的')
+        //   if (endTime && endTime < frontTime) {
+        //     row.endTime = '';
+        //   }
+        //   if (startTime < frontTime) {
+        //     this.$message.info(
+        //       `开始时间不能小于上一道工序${frontName}的结束时间${time}`
+        //     );
+        //     row.startTime = time;
+        //     return;
+        //   }
+        // }
+        // 校验 是否 大于结束时间  wda
         this.checkEndTimeValid(row);
+        // 更新当前结束时间段  每次计算的时候清空之前的
+        // item.startDate = '';
+        // item.list.forEach((el) => {
+        //   this.compareAndSetTime(el, item);
+        // });
       },
 
       // 【结束时间变化时】触发
-      handleEndTimeChange(row) {
-        this.checkEndTimeValid(row);
+      handleEndTimeChange(row, item) {
+        // 当前工序的结束时间 不能大于后一道工序的开始时间
+        // if (item.index !== this.processList.length - 1) {
+        //   let latterIdx = item.index + 1;
+        //   let latterName = this.processList[latterIdx].name;
+        //   let time = this.processList[latterIdx].startDate;
+        //   const latterTime = new Date(time); // 下一道工序的开始时间
+        //   const endTime = new Date(row.endTime); // 结束时间
+        //   const startTime = item.startTime ? new Date(item.startTime) : null; // 开始时间
+        //   console.log(startTime,'startTime')
+        //   console.log(latterTime,'latterTime')
+        //   if (startTime && startTime > latterTime) {
+        //     row.startTime = '';
+        //   }
+        //   if (endTime > latterTime) {
+        //     this.$message.info(
+        //       `结束时间不能大于下一道工序${latterName}的开始时间${time}`
+        //     );
+        //     row.endTime = time;
+        //     return;
+        //   }
+        // }
+        this.checkEndTimeValid(row, item);
+        // 更新当前结束时间段 每次计算的时候清空之前的
+        // item.endDate = '';
+        // item.list.forEach((el) => {
+        //   this.compareEndSetTime(el, item);
+        // });
+        console.log(item, 'item,结束');
       },
-
+      // 时间校验
       checkEndTimeValid(row) {
         const { startTime: start, endTime: end } = row;
-        if (!start || !end) return; // 开始/结束时间未填,跳过
-        const startTime = new Date(start);
-        const endTime = new Date(end);
+        // if (!start || !end) return; // 开始/结束时间未填,跳过
+        const startTime = new Date(start); // 开始时间
+        const endTime = new Date(end); // 结束时间
         if (endTime < startTime) {
           row.endTime = new Date(startTime); // 修正为开始时间
           this.$message.info('结束时间不能早于开始时间,已自动设为开始时间');

+ 50 - 14
src/views/workOrder/index.vue

@@ -32,11 +32,24 @@
         :parse-data="parseData"
         :cache-key="cacheKeyUrl"
         @columns-change="handleColumnChange"
+        :selection.sync="selection"
       >
         <!-- :key="activeName" -->
         <!-- :selection.sync="selection" -->
         <!-- @update:selection="handleSelectionChange" -->
-
+        <!-- <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-truck"
+            class="ele-btn-icon"
+            @click="batchDispatch"
+            >批量派单</el-button
+          >
+        </template> -->
+        <template v-slot:selection="{ row }">
+          <el-checkbox v-model="row.checked"></el-checkbox>
+        </template>
         <template v-slot:code="{ row }">
           {{ row.code }}
         </template>
@@ -279,7 +292,6 @@
       return {
         visible: false,
         loading: false,
-
         form: {
           assignType: 1,
           crewIds: '',
@@ -287,7 +299,6 @@
           teamId: '',
           singleReport: ''
         },
-
         rules: {
           singleReport: [
             {
@@ -311,26 +322,22 @@
             }
           ]
         },
-
         teamList: [],
-
         statusOpt: [
           { label: '待生产', value: 4 },
           { label: '生产中', value: 5 },
           { label: '待下达', value: 8 }
         ],
-
         newColumns: [],
-
         stationList: [],
         teamsList: [],
         crewList: [],
-
         current: null,
         cacheKeyUrl: '3cbbdff9-aps-workOrder',
         columnsVersion: 1,
         dispatchRow: {},
-        dispatchVisible: false
+        dispatchVisible: false,
+        selection: []
       };
     },
     computed: {
@@ -357,8 +364,21 @@
       },
       // 表格列配置
       columns() {
-        const num = this.columnsVersion;
+        // const num = this.columnsVersion;
         return [
+          // {
+          //   width: 45,
+          //   type: 'selection',
+          //   columnKey: 'selection',
+          //   align: 'center',
+          //   slot: 'selection',
+          //   fixed: 'left',
+          //   selectable: (row, index) => {
+          //     if (row.children) {
+          //     }
+          //     return this.dispatchPermission(row);
+          //   }
+          // },
           {
             columnKey: 'index',
             slot: 'index',
@@ -527,15 +547,30 @@
     },
 
     methods: {
+      // 批量派单
+      batchDispatch() {
+        if (this.selection.length === 0) {
+          return this.$message.warning('请至少选择一条数据');
+        }
+        let firstTaskId = this.selection[0].firstTaskId;
+        for (let i = 0; i < this.selection.length; i++) {
+          let item = this.selection[i];
+          // if(this.dispatchPermission(item) == false){
+          //   return this.$message.warning('请选择有派单按钮的进行批量派单');
+          // }
+          if (item.firstTaskId != firstTaskId) {
+            return this.$message.warning('请选择首工序一致的数据进行批量派单');
+          }
+        }
+        console.log(this.selection, '选择');
+      },
       assignTypeFn(e) {},
-
       statusFormatter(status) {
         const obj = this.statusOpt.find((i) => i.value == status);
         return obj && obj.label;
       },
       /* 表格数据源 */
       datasource({ page, limit, where }) {
-        console.log('数据')
         if (where.status) {
           where.statusList = [];
           where.statusList.push(where.status);
@@ -550,7 +585,7 @@
 
       /* 数据转为树形结构 */
       parseData(data) {
-        return {
+        const obj = {
           ...data,
           list: this.$util.toTreeData({
             data: data.list,
@@ -560,6 +595,8 @@
             parentIdField: 'originalCode'
           })
         };
+        console.log(obj, 'obj ------');
+        return obj;
       },
 
       getFieldModel() {
@@ -700,7 +737,6 @@
       //派单
       toReleaseOpen(row) {
         this.dispatchRow = { ...row };
-        console.log(row,'row ----')
         this.dispatchRow.initialWeight = row.formingWeight
           ? row.formingWeight + row.newWeightUnit
           : '';