Jelajahi Sumber

农村养护清单库添加逻辑

vian 5 tahun lalu
induk
melakukan
6b2dda4bab

+ 11 - 5
modules/common/const/bills_fixed.js

@@ -47,21 +47,27 @@ const fixedFlag = {
     //计日工 daywork labor
     DAYWORK_LABOR: 22,
     //劳务
-    LABOUR_SERVICE:23,
+    LABOUR_SERVICE: 23,
     //材料
-    MATERIAL:24,
+    MATERIAL: 24,
     //施工机械
-    CONSTRUCTION_MACHINE:25,
+    CONSTRUCTION_MACHINE: 25,
     //暂列金额
-    PROVISIONAL:26,
+    PROVISIONAL: 26,
     //安全生产费
-    SAFE_COST:27,
+    SAFE_COST: 27,
     //100章清单
     ONE_HUNDRED_BILLS: 28,
     // 一二三部分合计
     ONE_TO_THREE_TOTAL: 29,
     // 前期工作费
     PRELIMINARY_WORK: 30,
+    // 小修费
+    MINOR_REPAIR_FEE: 31,
+    // 预防养护费
+    PREVENTIVE_MAINTENANCE_FEE: 32,
+    // 修复养护费
+    REPAIR_MAINTENANCE_FEE: 33,
 };
 
 export default fixedFlag;

+ 30 - 1
public/web/id_tree.js

@@ -406,7 +406,36 @@ var idTree = {
             }
             return success;
         };
-
+        // 节点所属固定ID
+        Node.prototype.getFlag = function () {
+            if (!this.data || !this.data.flags || !this.data.flags[0] || !this.data.flags[0].flag) {
+                return 0;
+            }
+            return this.data.flags[0].flag;
+        };
+        // 节点所属固定ID
+        Node.prototype.belongToFlag = function () {
+            let node = this;
+            while (node) {
+                if (node.data && node.data.flags && node.data.flags[0] && node.data.flags[0].flag) {
+                    return node.data.flags[0].flag;
+                }
+                node = node.parent;
+            }
+            return null;
+        };
+        // 节点是否属于某些固定ID,会一直向上找,直到找到或到达顶层
+        Node.prototype.isBelongToFlags = function (flags) {
+            let node = this;
+            while (node) {
+                const flag = node.getFlag();
+                if (flags.includes(flag)) {
+                    return true;
+                }
+                node = node.parent;
+            }
+            return false;
+        }
         var Tree = function (setting) {
             this.nodes = {};
             this.roots = [];

+ 30 - 1
web/building_saas/main/js/models/cache_tree.js

@@ -302,7 +302,36 @@ var cacheTree = {
             }
             return node;
         };
-
+        // 节点所属固定ID
+        Node.prototype.getFlag = function () {
+            if (!this.data || !this.data.flags || !this.data.flags[0] || !this.data.flags[0].flag) {
+                return 0;
+            }
+            return this.data.flags[0].flag;
+        };
+        // 节点所属固定ID
+        Node.prototype.belongToFlag = function () {
+            let node = this;
+            while (node) {
+                if (node.data && node.data.flags && node.data.flags[0] && node.data.flags[0].flag) {
+                    return node.data.flags[0].flag;
+                }
+                node = node.parent;
+            }
+            return null;
+        };
+        // 节点是否属于某些固定ID,会一直向上找,直到找到或到达顶层
+        Node.prototype.isBelongToFlags = function (flags) {
+            let node = this;
+            while (node) {
+                const flag = node.getFlag();
+                if (flags.includes(flag)) {
+                    return true;
+                }
+                node = node.parent;
+            }
+            return false;
+        }
         var Tree = function (owner) {
             this.owner = owner;
             this.nodes = {};

+ 6 - 0
web/building_saas/main/js/models/main_consts.js

@@ -271,6 +271,12 @@ const fixedFlag = {
     ONE_TO_THREE_TOTAL: 29,
     // 前期工作费
     PRELIMINARY_WORK: 30,
+    // 小修费
+    MINOR_REPAIR_FEE: 31,
+    // 预防养护费
+    PREVENTIVE_MAINTENANCE_FEE: 32,
+    // 修复养护费
+    REPAIR_MAINTENANCE_FEE: 33,
 };
 
 const gljKeyArray =['code','name','specs','unit','type'];

+ 19 - 7
web/building_saas/main/js/views/std_billsGuidance_lib.js

@@ -130,10 +130,22 @@ const billsGuidance = (function () {
             }
         }
     };
+    // 获取对比树片段数据的方法,此方法可能会被覆盖,方法存在一个对象中,使得外部可以覆盖相关方法
+    // 在农村公路2020中,主树对比片段与这里的逻辑是不相同的
+    const overwrite = {
+        getFragment() {
+            return { parent: null, mainTreeFragment: projectObj.project.Bills.tree.roots }
+        }
+    };
     //插入清单
     function insertBills(lowestNodes) {
         let selTree = getSelTree(lowestNodes);
-        let compareData = compareTree(projectObj.project.Bills.tree, selTree);
+        const { errMsg, parent, mainTreeFragment } = overwrite.getFragment();
+        if (errMsg) {
+            alert(errMsg);
+            return;
+        }
+        let compareData = compareTree(parent, mainTreeFragment, selTree.roots);
         let sheet = projectObj.mainSpread.getActiveSheet(),
             row = sheet.getActiveColumnIndex(),
             col = sheet.getActiveColumnIndex();
@@ -260,17 +272,17 @@ const billsGuidance = (function () {
     function getMatchContent(node) {
         return `${node.data.code ? node.data.code : '*'}-${node.data.name ? node.data.name : '*'}-${node.data.unit ? node.data.unit: '*'}`;
     }
-    //**对比清单主树与选中树,获取需要更新和插入的数据**
-    //@param {Object}mainTree {Object}selTree
-    function compareTree(billsTree, selTree) {
+    //**对比清单主树节点片段与选中树节点片段,获取需要更新和插入的数据**
+    //@param {Object}parent - 主树片段的父节点 {Array}mainTreeFragment {Array}stdTreeFragment
+    function compareTree(parent, mainTreeFragment, stdTreeFragment) {
         //需要插入、更新的数据
         let postData = [],
             //跟树结构自动定位至的清单节点(最近匹配到的节点)
             locateNode = null;
-        if (!billsTree || !selTree) {
+        if (!mainTreeFragment || !stdTreeFragment) {
             return postData;
         }
-        comparePeer(null, billsTree.roots, selTree.roots);
+        comparePeer(parent, mainTreeFragment, stdTreeFragment);
         return {postData, locateNode};
         /*
         * 该清单节点是否可以继续往下递归匹配,即该节点是否还可插入子项(在该层匹配到的时候判断)
@@ -1162,7 +1174,7 @@ const billsGuidance = (function () {
         }
     }
 
-    return {initViews, bindBtn, refreshWorkBook, setColumnWidthByRate, locateAtBills, bills, elfItem};
+    return {initViews, bindBtn, refreshWorkBook, setColumnWidthByRate, locateAtBills, bills, elfItem, overwrite};
 })();
 
 $(document).ready(function(){

+ 91 - 0
web/over_write/js/nongcun_2020.js

@@ -0,0 +1,91 @@
+// 农村公路养护2020
+
+// 覆盖标准清单添加逻辑(实质上是覆盖获取对比节点片段方法)
+(() => {
+    const functionMap = {
+        /**
+         * 获取操作<<农村公路养护预算费用库>>时的节点片段
+         * 片段为主树根节点(与其他费用定额的添加逻辑一致)
+         */
+        budeget() {
+            return { parent: null, mainTreeFragment: projectObj.project.Bills.tree.roots };
+        },
+        /**
+         * 获取操作<<农村公路小修工程量清单库>>时的节点片段
+         * 1.主树焦点行必须在固定清单“小修费”的子节点xx项目清单范围内,范围内指清单本身及其所有后代节点
+         *   小修费下某清单为xx项目清单的判定规则:小修费下名称不为“道路”、“桥梁”、“隧道”的清单
+         * 2.若焦点行在无效范围中,插入时弹出提示
+         */
+        minorRepair() {
+            const selected = projectObj.project.mainTree.selected;
+            // 获取焦点所属的小修费下的xx项目(同时不为“道路”、“桥梁”、“隧道”)
+            const targetNode = getTargetNode(selected);
+            if (!targetNode) {
+                return { errMsg: '该焦点行无效,请定位至“小修费”下具体项目清单中。' };
+            }
+            return { parent: targetNode, mainTreeFragment: targetNode.children || [] };
+
+            function getTargetNode(node) {
+                const exclusion = ['道路', '桥梁', '隧道'];
+                while (node) {
+                    const isTheNode = node.parent && node.parent.getFlag() === fixedFlag.MINOR_REPAIR_FEE && !exclusion.includes(node.data.name);
+                    if (isTheNode) {
+                        return node;
+                    }
+                    node = node.parent;
+                }
+                return null;
+            }
+        },
+        /**
+         * 获取操作<<农村公路养护工程工程量清单>>的节点片段
+         * 1.主树焦点行必须在固定清单“预防养护费”或者“修复养护费”下的建筑安装工程费清单范围内(多少层都可以,子代、孙子代...),范围内指清单本身及其所有后代节点
+         * 2.若焦点行在无效范围中,插入时弹出提示
+         */
+        maintain() {
+            const selected = projectObj.project.mainTree.selected;
+            const targetNode = getTargetNode(selected);
+            if (!targetNode) {
+                return { errMsg: '该焦点行无效,请定位至“预防养护费”或“修复养护费”下的“建筑安装工程费”中。' };
+            }
+            return { parent: targetNode, mainTreeFragment: targetNode.children || [] };
+
+            function getTargetNode(node) {
+                const targetName = '建筑安装工程费';
+                while (node) {
+                    const isTheNode = node.data.name === targetName && node.isBelongToFlags([fixedFlag.PREVENTIVE_MAINTENANCE_FEE, REPAIR_MAINTENANCE_FEE]);
+                    if (isTheNode) {
+                        return node;
+                    }
+                    node = node.parent;
+                }
+                return null;
+            }
+        }
+    };
+    // 获取当前操作的清单库的方法
+    function getFragmentFunction() {
+        const selLibText = $('#stdBillsGuidanceLibSelect').text();
+        if (/农村公路养护预算费用/.test(selLibText)) {
+            return functionMap.budeget;
+        } else if (/农村公路小修工程量清单/.test(selLibText)) {
+            return functionMap.minorRepair;
+        } else if (/农村公路养护工程工程量清单/.test(selLibText)) {
+            return functionMap.maintain;
+        } else {
+            return null;
+        }
+    }
+    // 获取对比的主树节点片段
+    function overwrite() {
+        if (typeof billsGuidance !== 'undefined') {
+            // 不同的清单库插入获取片段都不同,先获取是哪个库进行操作
+            const func = getFragmentFunction();
+            if (func) {
+                billsGuidance.overwrite.getFragment = func;
+            }
+        }
+    }
+
+    overwrite();
+})();