浏览代码

表格合并搞定了,先提交一次,避免AI乱搞

wukai 1 月之前
父节点
当前提交
3c822b3352
共有 1 个文件被更改,包括 123 次插入10 次删除
  1. 123 10
      src/pages/bpb/index.vue

+ 123 - 10
src/pages/bpb/index.vue

@@ -243,7 +243,7 @@
       </el-tab-pane>
       <el-tab-pane label="机台工艺调整推荐" name="t2">
         <el-table :data="order_result_alldata" :style="{'height': result_table_height+'px'}"
-                  :cell-style="getTable2CellStyle">
+                  :cell-style="getTable2CellStyle" :span-method="mergeCells">
           <el-table-column label="机台号" align="center" prop="device" fixed="left" width="120px"/>
 
           <el-table-column label="库存(T)" align="center" prop="kcl" fixed="left" width="75px">
@@ -258,13 +258,13 @@
           </el-table-column>
           <el-table-column label="预测(T)" align="center" prop="ycl" fixed="left" width="75px">
             <template #default="scope">
-              <span>{{ scope.row.ycl.toFixed(1) }}</span>
+              <span>{{ scope.row.yclSum !== undefined ? scope.row.yclSum.toFixed(1) : scope.row.ycl.toFixed(1) }}</span>
             </template>
           </el-table-column>
 
           <el-table-column label="超额(T)" align="center" prop="sy" fixed="left" width="75px">
             <template #default="scope">
-              <span>{{ scope.row.sy.toFixed(1) }}</span>
+              <span>{{ scope.row.sy !== undefined ? scope.row.sy.toFixed(1) : (scope.row.kcl - scope.row.xql + scope.row.ycl).toFixed(1) }}</span>
             </template>
           </el-table-column>
           <el-table-column label="纱线规格D" align="center">
@@ -381,6 +381,46 @@ export default {
       return {};
     }
 
+    // 合并单元格函数
+    function mergeCells({ row, column, rowIndex, columnIndex }) {
+      // 只对特定列进行合并:库存(kcl)、需求(xql)、预测(ycl)、超额(sy)列
+      // 分别对应列索引:1(库存)、2(需求)、3(预测)、4(超额)
+      if (columnIndex === 1 || columnIndex === 2 || columnIndex === 3 || columnIndex === 4) {
+        // 如果bomCode为空,则不进行合并
+        if (!row.bomCode) {
+          return [1, 1];
+        }
+        
+        // 查找具有相同bomCode的第一行
+        let firstRowIndex = -1;
+        for (let i = 0; i <= rowIndex; i++) {
+          if (order_result_alldata.value[i].bomCode === row.bomCode) {
+            firstRowIndex = i;
+            break;
+          }
+        }
+        
+        // 如果当前行就是第一行,则计算需要合并的行数
+        if (firstRowIndex === rowIndex) {
+          let rowspan = 1;
+          // 计算需要合并的行数
+          for (let i = rowIndex + 1; i < order_result_alldata.value.length; i++) {
+            if (order_result_alldata.value[i].bomCode === row.bomCode) {
+              rowspan++;
+            } else {
+              break;
+            }
+          }
+          return [rowspan, 1];
+        } else {
+          // 如果当前行不是第一行,则返回[0, 0]表示不显示(已被合并)
+          return [0, 0];
+        }
+      }
+      // 机台号和其他列不合并
+      return [1, 1];
+    }
+
     function getOerderList() {
       orderQueryState.value = 1;//开始查询订单
       var v = {
@@ -390,7 +430,64 @@ export default {
       };
       api.GetOrderList(v).then((response) => {
         let res = response.data;
-        order_result_alldata.value = response.list;
+        // 处理order_result_alldata,合并相同bomCode的数据
+        if (response.list) {
+          // 先按bomCode分组,同时保留所有机台号
+          const processedData = [];
+          const bomCodeMap = new Map();
+          
+          // 遍历所有数据
+          response.list.forEach(item => {
+            if (item.bomCode) {
+              if (!bomCodeMap.has(item.bomCode)) {
+                // 第一次出现这个bomCode,创建新的分组
+                const newItem = {
+                  ...item,
+                  originalYcl: item.ycl, // 保存原始预测值
+                  yclSum: item.ycl, // 累加的预测值
+                  sy: item.kcl - item.xql + item.ycl // 计算超额值
+                };
+                bomCodeMap.set(item.bomCode, {
+                  items: [newItem],
+                  yclSum: item.ycl
+                });
+                processedData.push(newItem);
+              } else {
+                // 已经存在这个bomCode,更新累加值
+                const group = bomCodeMap.get(item.bomCode);
+                group.yclSum += item.ycl;
+                
+                // 更新所有已存在的同bomCode项的yclSum和sy值
+                group.items.forEach(existingItem => {
+                  existingItem.yclSum = group.yclSum;
+                  existingItem.sy = existingItem.kcl - existingItem.xql + group.yclSum;
+                });
+                
+                // 添加新项
+                const newItem = {
+                  ...item,
+                  originalYcl: item.ycl,
+                  yclSum: group.yclSum,
+                  sy: item.kcl - item.xql + group.yclSum
+                };
+                group.items.push(newItem);
+                processedData.push(newItem);
+              }
+            } else {
+              // bomCode为空的项直接添加
+              processedData.push({
+                ...item,
+                yclSum: item.ycl,
+                sy: item.kcl - item.xql + item.ycl
+              });
+            }
+          });
+          
+          order_result_alldata.value = processedData;
+        } else {
+          order_result_alldata.value = [];
+        }
+
         if (res == null) {
           return;
         }
@@ -552,8 +649,15 @@ export default {
         for (let index = 0; index < (ele.bomList || ele.bomlist).length; index++) {
           const element = (ele.bomList || ele.bomlist)[index];
           const xql = element.xql;
-          if (boms[element.bomCode] == null) boms[element.bomCode] = {...element};
-          else boms[element.bomCode].xql = boms[element.bomCode].xql + xql;
+          if (boms[element.bomCode] == null) {
+            boms[element.bomCode] = {...element};
+          } else {
+            // 合并相同 bomCode 的需求量
+            boms[element.bomCode].xql = boms[element.bomCode].xql + xql;
+            // 库存取第一个值,不进行累加
+            // 预测值(ycl)累加
+            boms[element.bomCode].ycl = (boms[element.bomCode].ycl || 0) + (element.ycl || 0);
+          }
         }
       }
       //console.log(boms)
@@ -653,8 +757,9 @@ export default {
        }*/
         for (let index = 0; index < bpb_mt_item_data.value.length; index++) {
           const element = {...bpb_mt_item_data.value[index]};
-          var neednum = element.need - element.storage - element.plc * days.value;
-          element['isalarm'] = neednum > 0 ? true : false;
+          // 使用合并后的逻辑计算超额:库存 - 需求 + 预测
+          var neednum = element.storage - element.need + (element.plc * days.value);
+          element['isalarm'] = neednum < 0 ? true : false; // 产能不足时为负数
           element["neednum"] = Math.abs(neednum);
           temp2.push(element);
         }
@@ -764,8 +869,15 @@ export default {
         for (let index = 0; index < ele.bomList.length; index++) {
           const element = ele.bomList[index];
           const xql = element.xql;
-          if (boms[element.bomCode] == null) boms[element.bomCode] = {...element};
-          else boms[element.bomCode].xql = boms[element.bomCode].xql + xql;
+          if (boms[element.bomCode] == null) {
+            boms[element.bomCode] = {...element};
+          } else {
+            // 合并相同 bomCode 的需求量
+            boms[element.bomCode].xql = boms[element.bomCode].xql + xql;
+            // 库存取第一个值,不进行累加
+            // 预测值(ycl)累加
+            boms[element.bomCode].ycl = (boms[element.bomCode].ycl || 0) + (element.ycl || 0);
+          }
         }
       }
       //物料清单信息
@@ -877,6 +989,7 @@ export default {
       result_tab_index,
       order_result_alldata,
       getTable2CellStyle,
+      mergeCells, // 添加合并单元格函数到返回对象中
     }
   }
 }