Jelajahi Sumber

部位台账,优化

MaiXinRong 5 bulan lalu
induk
melakukan
13de486214

+ 2 - 0
app/controller/ledger_controller.js

@@ -728,7 +728,9 @@ module.exports = app => {
                     ? await ctx.service.pos.getPosData({ tid: ctx.tender.id }) : [];
                 const convert = new billsPosConvert(ctx);
                 convert.loadData(ledgerData, posData, []);
+                console.time('convert-all');
                 const result = await convert.convert();
+                console.timeEnd('convert-all');
                 // const wbsCodeHis = await ctx.service.externalData.getExValue(ctx.tender.id, -1,
                 //     externalDataConst.FuLong.exType, externalDataConst.FuLong.exFields.wbsCode) || [];
                 // const [result, needUpdate] = convert.convertByWbsCode(wbsCodeHis);

+ 75 - 8
app/lib/bills_pos_convert.js

@@ -170,9 +170,12 @@ class BillsPosConvert {
         const pos = this.bpcPos.getLedgerPos(node.id);
         if (pos && pos.length > 0) {
             for (const p of pos) {
-                const posUnit = xmj.unitTree.addNode({pos_name: p.name,
-                    b_code: null, name: '', unit: null, unit_price: null,
-                    gxby_status: p.gxby_status, dagl_status: p.dagl_status, gxby_url: p.gxby_url, dagl_url: p.dagl_url});
+                let posUnit = xmj.unitTree.children.find(x => { return x.pos_name === p.name; });
+                if (!posUnit) {
+                    posUnit = xmj.unitTree.addNode({pos_name: p.name,
+                        b_code: null, name: '', unit: null, unit_price: null,
+                        gxby_status: p.gxby_status, dagl_status: p.dagl_status, gxby_url: p.gxby_url, dagl_url: p.dagl_url}, null, false);
+                }
                 if (p.drawing_code && posUnit.drawing_code.indexOf(p.drawing_code) < 0)
                     posUnit.drawing_code.push(p.drawing_code);
                 if (p.memo) posUnit.memo.push(p.memo);
@@ -205,7 +208,7 @@ class BillsPosConvert {
             const unit = xmj.unitTree.addNode({
                 pos_name: '',
                 b_code: node.b_code, name: node.name, unit: node.unit, unit_price: node.unit_price, org_price: node.org_price,
-            });
+            }, null);
             if (node.drawing_code && unit.drawing_code.indexOf(node.drawing_code) < 0)
                 unit.drawing_code.push(node.drawing_code);
             if (node.memo) unit.memo.push(node.memo);
@@ -372,12 +375,56 @@ class BillsPosConvert {
             }
         }
     }
+    _mapTreeNode(tree) {
+        const setting = tree.setting;
+        let map = {}, maxLevel = 0;
+        for (const node of tree.nodes) {
+            let levelArr = map[node[setting.level]];
+            if (!levelArr) {
+                levelArr = [];
+                map[node[setting.level]] = levelArr;
+            }
+            if (node[setting.level] > maxLevel) {
+                maxLevel = node[setting.level];
+            }
+            levelArr.push(node);
+        }
+        return [maxLevel, map];
+    }
+    _calculateAndSortNodes() {
+        const self = this;
+        const [maxLevel, levelMap] = this._mapTreeNode(this.resultTree);
+        for (let i = maxLevel; i >= 0; i--) {
+            const levelNodes = levelMap[i];
+            if (!levelNodes || levelNodes.length === 0) continue;
+
+            for (const node of levelNodes) {
+                if (node.unitTree) {
+                    node.unitTree.sortTreeNodeCustom(function (a, b) {
+                        if (a.b_code && a.b_code !== '') {
+                            return b.b_code && b.b_code !== '' ? self.ctx.helper.compareCode(a.b_code, b.b_code) : 1;
+                        } else {
+                            return b.b_code && b.b_code !== '' ? -1 : a.order - b.order;
+                        }
+                    });
+                    this._calculateNode(node, node.unitTree.children, this.tpFields);
+                } else if (node.children && node.children.length > 0) {
+                    this._calculateNode(node, node.children, this.tpFields);
+                } else {
+                    this._calculateChild(node);
+                }
+            }
+        }
+    }
     _calculateAndSortResult() {
         this.resultTree.sortTreeNode();
-        this._recursiveCalculateAndSort(this.resultTree.children);
+        console.time('recurCalc');
+        // this._recursiveCalculateAndSort(this.resultTree.children);
+        this._calculateAndSortNodes();
+        console.timeEnd('recurCalc');
     }
 
-    _generateCodeByWbsCode(wbsCode) {
+    _generateCodeByWbsCodeWithHis(wbsCode) {
         let needUpdate = false;
         for (const node of this.resultTree.nodes) {
             if (!node.unitTree) continue;
@@ -406,6 +453,22 @@ class BillsPosConvert {
         return needUpdate;
     }
 
+    _generateCodeByWbsCode() {
+        let needUpdate = false;
+        for (const node of this.resultTree.nodes) {
+            if (!node.unitTree) continue;
+
+            let index = 1;
+            for (const unit of node.unitTree.nodes) {
+                if (!unit.pos_name || unit.pos_name === '') continue;
+
+                unit.code = node.code + splitChar + index;
+                index ++;
+            }
+        }
+        return needUpdate;
+    }
+
     _getResultData(filterFun) {
         const result = this.resultTree.getDefaultDatas(filterFun);
         for (const r of result) {
@@ -418,9 +481,13 @@ class BillsPosConvert {
     }
     // 转换数据
     convert(filter) {
+        console.time('convert');
         this._recursiveConvertNode(this.bpcTree.children);
+        console.timeEnd('convert');
+        console.time('calc');
         this._calculateAndSortResult();
-        this._generateCodeByWbsCode([]);
+        console.timeEnd('calc');
+        this._generateCodeByWbsCode();
         switch (filter) {
             case 'cur':
                 return this._getResultData(function (node) {
@@ -454,7 +521,7 @@ class BillsPosConvert {
     convertByWbsCode(wbsCodeHis) {
         this._recursiveConvertNode(this.bpcTree.children);
         this._calculateAndSortResult();
-        const needUpdate = this._generateCodeByWbsCode(wbsCodeHis);
+        const needUpdate = this._generateCodeByWbsCodeWithHis(wbsCodeHis);
         return [this._getResultData(), needUpdate];
     }
 }

+ 2 - 2
app/lib/ledger.js

@@ -479,9 +479,9 @@ class filterGatherTree extends baseTree {
         return this._maxId;
     }
 
-    addNode(data, parent) {
+    addNode(data, parent, checkSame = true) {
         data[this.setting.pid] = parent ? parent[this.setting.id] : this.setting.rootId;
-        let item = this.ctx.helper._.find(this.items, data);
+        let item = checkSame ? this.ctx.helper._.find(parent ? parent.children : this.children, data) : null;
         if (item) return item;
 
         item = data;

+ 0 - 1
app/service/stage_stash.js

@@ -280,7 +280,6 @@ module.exports = app => {
             return data.bills;
         }
 
-
         async reCalcStashData(stage, data) {
             const correct = this.ctx.subProject.page_show.correctCalcContractTp;
             const calcContractTp = function(helper, info, stageBills, bills) {