瀏覽代碼

导入预制管廊重新计算报错相关

zeweizhong 6 年之前
父節點
當前提交
0176fe9b8d
共有 1 個文件被更改,包括 31 次插入2 次删除
  1. 31 2
      web/building_saas/main/js/models/importStandardInterface.js

+ 31 - 2
web/building_saas/main/js/models/importStandardInterface.js

@@ -1409,10 +1409,33 @@ const ImportXML = (() => {
             SJHJ: '{税金}',
             SQGCZJ: '{税前工程造价}'
         };
+        // 检查固定清单引用的基数造成自身循环,比如分部分项部分引用了FBFXHJ
+        // 有文件的单位工程费汇总中,含有技术措施项目费清单,含有基数,且无子项。
+        function isCalcBaseCycle(bills) {
+            const flag = getFlag(bills);
+            if (!flag) {
+                return false;
+            }
+            // 跟固定清单直接相关联的基数,若相关固定清单引用了其下的基数,则造成自身循环
+            const CycleMap = {
+                [fixedFlag.SUB_ENGINERRING]: ['FBFXHJ', 'RGF', 'CLF', 'JXF', 'ZCF', 'GR'],
+                [fixedFlag.MEASURE]: ['CSXMHJ'],
+                [fixedFlag.CONSTRUCTION_ORGANIZATION]: ['ZZCSF'],
+                [fixedFlag.CONSTRUCTION_TECH]: ['JSCSF', 'JSCS_RGF', 'JSCS_CLF', 'JSCS_JXF', 'JSCS_ZCF', 'JSCS_GR'],
+                [fixedFlag.CHARGE]: ['GF'],
+                [fixedFlag.TAX]: ['SJ', 'SJHJ']
+            };
+            const match = CycleMap[flag];
+            if (!match) {
+                return false;
+            }
+            return match.some(item => bills.calcBase.match(new RegExp(`${item}\\b`)));
+        }
         //转换计算基数
         //1.有子项数据,则清空基数
-        //2.行代号引用转换为ID引用
-        //3.对应字典代号转换,对应字典里找不到则设置成金额
+        //2.引用的基数造成自身循环,比如分部分项部分引用了FBFXHJ
+        //3.行代号引用转换为ID引用
+        //4.对应字典代号转换,对应字典里找不到则设置成金额
         function transformCalcBase(billsData) {
             //行代号 - ID映射
             let rowCodeMap = {};
@@ -1435,6 +1458,12 @@ const ImportXML = (() => {
                 if (typeof bills.calcBase !== 'string') {
                     bills.calcBase = String(bills.calcBase);
                 }
+                // 引用的基数造成自循环,清空基数
+                const isCycle = isCalcBaseCycle(bills);
+                if (isCycle) {
+                    bills.calcBase = '';
+                    continue;
+                }
                 //提取基数
                 bills.calcBase = bills.calcBase.replace(/\s/g, '');
                 let bases = bills.calcBase.split(/[\+\-\*\/]/g);