ソースを参照

feat: 润天排序号规则

wuzh 4 日 前
親
コミット
05e19d622e

+ 63 - 17
src/views/material/BOMmanage/components/detailedList.vue

@@ -76,10 +76,10 @@
         </el-input>
       </template>
 
-      <!-- 序号:前端自己渲染行号 -->
-      <template v-slot:rowIndex="{ $index }">{{
-        (currentPage - 1) * currentLimit + $index + 1
-      }}</template>
+      <!-- 序号:按层级单独计数(同层 1、2、3…,层级变了重新从 1 开始) -->
+      <template v-slot:rowIndex="{ row, $index }">
+        {{ levelSeqMap[row.id] != null ? levelSeqMap[row.id] : levelSeq(row, $index) }}
+      </template>
 
       <!-- 总重:前端按 用量 × 单重 计算(用量/单重改了立即跟着变) -->
       <template v-slot:totalWeight="{ row }">{{ totalWeightOf(row) }}</template>
@@ -300,13 +300,17 @@
 
     data() {
       return {
-        // 当前分页位置:序号跨页连续(第 2 页从 21 开始,不重置)
+        // 当前分页位置
         currentPage: 1,
         currentLimit: 20,
+        // 层级序号:rowId -> 该行在“同层级”里的序号(跨页连续)
+        levelSeqMap: {},
+        levelSeqKey: '',
         produceTypeList,
         clientEnvironmentId: this.$store.state.user.info.clientEnvironmentId,
         // 是否启用新 columns 方案(true=新方案,false=老方案)
-        useNewColumns: false,
+        // 是否启用新 columns 方案(true=新方案,false=老方案);层级序号只在新方案生效
+        useNewColumns: true,
         pagination: {
           tableTotal: 0
         },
@@ -839,6 +843,53 @@
     },
 
     methods: {
+      // 拉整棵树的清单,算出每行在“同层级”里的序号(跨页也连续)
+      async ensureLevelSeqMap(where) {
+        const attr = this.attributeData || {};
+        const key = [attr.id, attr.bomType, JSON.stringify(where || {})].join('|');
+        if (this.levelSeqKey === key) {
+          return;
+        }
+        try {
+          const res = await getBomPageCategoryId({
+            ...(where || {}),
+            pageNum: 1,
+            size: 100000,
+            id: attr.id,
+            bomType: attr.bomType
+          });
+          const map = {};
+          const counters = {};
+          ((res && res.list) || []).forEach((item) => {
+            const level = String(item.level == null ? '' : item.level);
+            counters[level] = (counters[level] || 0) + 1;
+            map[item.id] = counters[level];
+          });
+          this.levelSeqMap = map;
+          this.levelSeqKey = key;
+        } catch (e) {
+          // 取不到就退化成“当前页内按层级计数”
+        }
+      },
+
+      // 兜底:当前页内按层级计数(同层 1、2、3…,层级变了重新从 1 开始)
+      // 例:层级 1、1、2、2 → 序号 1、2、1、2
+      levelSeq(row, index) {
+        const table = this.$refs.table;
+        const rows = (table && typeof table.getData === 'function' && table.getData()) || [];
+        const level = row ? String(row.level == null ? '' : row.level) : '';
+        let seq = 0;
+        const end = Math.min(index, rows.length - 1);
+        for (let i = 0; i <= end; i++) {
+          const current = rows[i];
+          const currentLevel = current ? String(current.level == null ? '' : current.level) : '';
+          if (currentLevel === level) {
+            seq += 1;
+          }
+        }
+        return seq;
+      },
+
       // 总重 = 单台用量 × 单重(前端计算)
       totalWeightOf(row) {
         const toNumber = (v) =>
@@ -902,18 +953,10 @@
       },
 
       // 根据系统参数 is_runtian 判断是否启用新 columns 方案
-      // 兼容常见返回:'1' / 1 / { value: 1 } / { paramValue: '1' } / true
+      // 是否启用新 columns 方案这里固定为 true(层级序号只在新方案生效),
+      // 不再根据系统参数 is_runtian 覆盖。
       async getRuntianConfig() {
-        try {
-          const data = await parameterGetByCode({ code: 'is_runtian' });
-          const val =
-            typeof data === 'object' && data !== null
-              ? data.value ?? data.paramValue ?? data.val
-              : data;
-          this.useNewColumns = val === '1' || val === 1 || val === true;
-        } catch (e) {
-          this.useNewColumns = false;
-        }
+        this.useNewColumns = true;
       },
 
       rootCategoryLevelIdText(v) {
@@ -1050,6 +1093,9 @@
           bomType: this.attributeData.bomType
         });
 
+        // 序号按层级计数且跨页连续:拉一次整棵树的清单算出每行在同层级里的序号
+        await this.ensureLevelSeqMap(where);
+
         if (this.isList) {
           data = this.listTow;
         }

+ 3 - 8
src/views/material/BOMmanage/index.vue

@@ -569,6 +569,8 @@
         radioSubmit: 1,
         currentNodeData: {},
         pageSize: this.$store.state.tablePageSize,
+        // 是否启用新 columns 方案(true=新方案,false=老方案);层级序号只在新方案生效
+        useNewColumns: true,
         // 序号列由 type:index 改成 rowIndex 数据列,换 key 清一次列设置缓存
         // (ele-pro-table 按列 key 从 localStorage 恢复列顺序,新列不在旧缓存里会被排到最前)
         cacheKeyUrl: '68be265a-material-BOMmanage-v3',
@@ -582,13 +584,6 @@
         return this.$store.state.user.info.clientEnvironmentId;
       },
       ...mapGetters(['user']),
-      // 是否启用新 columns 方案:activeName 为 PBOM (1/'1') 且 is_runtian === 1
-      useNewColumns() {
-        const isPBOM = this.activeName == 1 || this.activeName === '1';
-        const val = this.isRuntianValue;
-        const isRuntianOk = val === '1' || val === 1 || val === true;
-        return isPBOM && isRuntianOk;
-      },
       // 新方案默认展示的 prop 集合(自动从 newColumnsConfig 推导,避免漏配导致老列覆盖新列)
       newPropSet() {
         const set = new Set();
@@ -714,7 +709,7 @@
         });
       },
 
-      // 取系统参数 is_runtian 的原始值(由 computed useNewColumns 配合 activeName 共同判断)
+      // 取系统参数 is_runtian 的原始值(新 columns 方案已固定启用,这里仅保留参数读取)
       // 兼容常见返回:'1' / 1 / { value: 1 } / { paramValue: '1' } / true
       async getRuntianConfig() {
         try {