ソースを参照

refactor: 抽取区域选择公共逻辑为 areaMixin

xieyong 6 日 前
親
コミット
71ccb1d5c2
1 ファイル変更、55 行追加、0 行削除
  1. 55 0
      src/mixins/areaMixin.js

+ 55 - 0
src/mixins/areaMixin.js

@@ -0,0 +1,55 @@
+import { basicAreaPageAPI } from '@/api/factoryModel';
+
+/**
+ * 区域(作业地点)公共逻辑
+ * - 提供区域树数据
+ * - 维护「区域全路径 -> 区域id」映射,便于编辑时把区域名称反查成区域id回显
+ */
+export default {
+  data() {
+    return {
+      areaTreeList: [],
+      // 区域全路径 -> 区域id
+      areaPathMap: {}
+    };
+  },
+  created() {
+    this.getAreaTree();
+  },
+  methods: {
+    // 获取区域树
+    async getAreaTree() {
+      try {
+        const list = await basicAreaPageAPI({
+          pageNum: 1,
+          size: 9999
+        });
+        this.areaTreeList = this.$util.toTreeData({
+          data: list || [],
+          idField: 'id',
+          parentIdField: 'parentId'
+        });
+        this.areaPathMap = this.buildAreaPathMap(this.areaTreeList, []);
+      } catch (e) {
+        console.error('获取区域数据失败', e);
+      }
+    },
+    // 生成「区域全路径 -> 区域id」映射
+    buildAreaPathMap(nodes, parents) {
+      const map = {};
+      (nodes || []).forEach((node) => {
+        const path = [...parents, node.name].join('/');
+        map[path] = node.id;
+        Object.assign(
+          map,
+          this.buildAreaPathMap(node.children, [...parents, node.name])
+        );
+      });
+      return map;
+    },
+    // 根据区域全路径名称反查区域id
+    getAreaIdByName(name) {
+      return (name && this.areaPathMap[name]) || '';
+    }
+  }
+};