瀏覽代碼

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/ConstructionOperation

chenshilong 3 年之前
父節點
當前提交
925de6b3a2
共有 1 個文件被更改,包括 107 次插入50 次删除
  1. 107 50
      modules/std_billsGuidance_lib/facade/facades.js

+ 107 - 50
modules/std_billsGuidance_lib/facade/facades.js

@@ -537,12 +537,6 @@ function isOptionNode(node) {
         return list;
     }
 
-    //获取定额数据
-    // requireRationData必套定额对象
-    // optionalRationData 选逃定额对象
-    // classGroups classCode文字和id键值对
-    // classCodeList 各个classCode的pID和ID的关系
-    // prefixID为上一个必填项的选项ID
     function getItemData(nodes, requireRationData={}, optionalRationData={}, classGroups={},  prefixID = '', prefixSonID = '',IDData={}) {
         const processNodes = nodes.filter(node => isProcessNode(node));
         // const classGroups = []; // 同层必填选项的数组(二维数组)
@@ -584,7 +578,7 @@ function isOptionNode(node) {
                                     if (!requireRationData[subOptionNode.parent.data.ID]) requireRationData[subOptionNode.parent.data.ID] = [];
                                     requireRationData[subOptionNode.parent.data.ID].push(getOptionalData(subOptionNode));
                                 } else {
-                                    if (!optionalRationData[subOptionNode.parent.data.ID]) optionalRationData[subOptionNode.data.ID] = [];
+                                    if (!optionalRationData[subOptionNode.parent.data.ID]) optionalRationData[subOptionNode.parent.data.ID] = [];
                                     optionalRationData[subOptionNode.parent.data.ID].push(...getOptionalData(subOptionNode));
                                 }
                             })
@@ -741,56 +735,98 @@ function getOptionalRationIDs(optionalRationData) {
 }
 
 //把classcode和必套选套定额结合在一起
-function combineData(codeData,requireRationData,classGroups,IDData){
+function combineData(codeData, requireRationData, optionalRationData, classGroups, IDData) {
+    // 这里要记录下已经被绑定的选套定额,因为没有被用的定额需要绑定到各个classcode下
+    const matchRationList = [];
     //这里需要把绑定在子节点的定额更新到必填的白色选项中(classcode的值)
-    const requireCombineData={};
-    Object.keys(IDData).forEach(key=>{
-        if(!requireCombineData[IDData[key]])requireCombineData[IDData[key]]=new Set();
-        if(requireRationData[key]){
-         requireRationData[key].forEach(subData=>{
-             subData.forEach(subItem=>{
-                 requireCombineData[IDData[key]].add(subItem);
-             })
-         })
-        }
-     })
-
-    return  codeData.map(classCodeData=>{
-        const errorRationIDs=[];
-        const optionalRationIDs=[];
-        const requiredRationIDs=[];
-        let name='';
-        const classCodeIDs=classCodeData.ID;
-        if(/@/.test(classCodeIDs)){
-            classCodeIDs.split('@').forEach((classCodeID)=>{
-                if(name){ 
-                    name=name+'@'+classGroups[classCodeID]
-                }else{
-                    name=classGroups[classCodeID]
+    const requireCombineData = {};
+    const optionCombineData = {};
+    Object.keys(IDData).forEach(key => {
+        if (!requireCombineData[IDData[key]]) requireCombineData[IDData[key]] = new Set();
+        if (!optionCombineData[IDData[key]]) optionCombineData[IDData[key]] = new Set();
+        if (requireRationData[key]) {
+            requireRationData[key].forEach(subData => {
+                subData.forEach(subItem => {
+                    requireCombineData[IDData[key]].add(subItem);
+                })
+            })
+        }
+        if (optionalRationData[key]) {
+            optionalRationData[key].forEach(subData => {
+                optionCombineData[IDData[key]].add(subData);
+            })
+        }
+
+    })
+    const finData = codeData.map(classCodeData => {
+        const errorRationIDs = [];
+        const optionalRationIDs = [];
+        const requiredRationIDs = [];
+        let name = '';
+        const classCodeIDs = classCodeData.ID;
+        if (/@/.test(classCodeIDs)) {
+            classCodeIDs.split('@').forEach((classCodeID) => {
+                if (name) {
+                    name = name + '@' + classGroups[classCodeID]
+                } else {
+                    name = classGroups[classCodeID]
                 };
-                const unitRation=[];
-                requireRationData[classCodeID].forEach(subItem=>{
+                // 一组的必套定额,先去重
+                const unitRation = [];
+                requireRationData[classCodeID].forEach(subItem => {
                     unitRation.push(...new Set(subItem));
                 })
-                if(requireRationData[classCodeID]&&requireRationData[classCodeID].length) {
+                // 这里是必填选项下绑定必套定额
+                if (requireRationData[classCodeID] && requireRationData[classCodeID].length) {
                     requiredRationIDs.push(unitRation);
                 }
-                if(requireCombineData[classCodeID]&&requireCombineData[classCodeID].size){
+                //这里是必填选项下绑定在蓝色节点下的必套定额
+                if (requireCombineData[classCodeID] && requireCombineData[classCodeID].size) {
                     requiredRationIDs.push([...requireCombineData[classCodeID]]);
                 }
+
+                // 这里是必填选项下绑定选套定额
+                if (optionalRationData[classCodeID] && optionalRationData[classCodeID].length) {
+                    optionalRationIDs.push(...optionalRationData[classCodeID]);
+                    matchRationList.push(...optionalRationData[classCodeID]);
+                }
+                //这里是必填选项下绑定在蓝色节点下的选套定额,下同
+                if (optionCombineData[classCodeID] && optionCombineData[classCodeID].size) {
+                    optionalRationIDs.push(...optionCombineData[classCodeID]);
+                    matchRationList.push(...optionCombineData[classCodeID]);
+                }
+
             })
-            return {name,requiredRationIDs,optionalRationIDs,errorRationIDs}
-        }else{
-            const unitRation=[];
-            requireRationData[classCodeIDs].forEach(subItem=>{
+            return { name, requiredRationIDs, optionalRationIDs: [...new Set(optionalRationIDs)], errorRationIDs }
+        } else {
+            const unitRation = [];
+            requireRationData[classCodeIDs].forEach(subItem => {
                 unitRation.push(...new Set(subItem));
             })
-            name=classGroups[classCodeIDs];
-            if(requireRationData[classCodeIDs]&&requireRationData[classCodeIDs].length) requiredRationIDs.push(unitRation);
-            if(requireCombineData[classCodeIDs]&&requireCombineData[classCodeIDs].size) requiredRationIDs.push([...requireCombineData[classCodeIDs]]);
-            return {name,requiredRationIDs,optionalRationIDs,errorRationIDs}
+            name = classGroups[classCodeIDs];
+            if (requireRationData[classCodeIDs] && requireRationData[classCodeIDs].length) requiredRationIDs.push(unitRation);
+            if (requireCombineData[classCodeIDs] && requireCombineData[classCodeIDs].size) requiredRationIDs.push([...requireCombineData[classCodeIDs]]);
+
+            if (optionalRationData[classCodeIDs] && optionalRationData[classCodeIDs].length) {
+                optionalRationIDs.push(...optionalRationData[classCodeIDs]);
+                matchRationList.push(...optionalRationData[classCodeIDs]);
+            }
+            if (optionCombineData[classCodeIDs] && optionCombineData[classCodeIDs].size) {
+                optionalRationIDs.push(...optionCombineData[classCodeIDs]);
+                matchRationList.push(...optionalRationData[classCodeIDs]);
+            }
+            return { name, requiredRationIDs, optionalRationIDs: [...new Set(optionalRationIDs)], errorRationIDs }
         }
     })
+    const unMatchRation = [];
+    Object.values(optionalRationData).forEach(data => {
+        data.forEach((rationID) => {
+            if (!matchRationList.includes(rationID)) {
+                unMatchRation.push(rationID);
+            }
+        })
+    })
+    return { itemClassData: finData, unMatchRation };
 }
 
 
@@ -825,16 +861,16 @@ async function generateClassData(libID) {
         //console.log('getItemClassData start',billNode.data.name,billNode.data.code,billNode.data.ID);
         const classCodeData = getItemClassData(guidanceTree.roots); // 必套定额在这个方法内就获取了,避免重复执行递归方法
         const {requireRationData,optionalRationData,classGroups,IDData} = getItemData(guidanceTree.roots);
-        const itemClassData= combineData(classCodeData,requireRationData,classGroups,IDData);
-        //因为所有的选套都是一样的,所以这里就直接赋值了
-        const optionalRationIDs = getOptionalRationIDs(optionalRationData);
+        const {itemClassData,unMatchRation}= combineData(classCodeData,requireRationData,optionalRationData,classGroups,IDData);
+       
         const allRationIDs = guidanceTree.items.filter(node => !!node.data.rationID).map(node => node.data.rationID);
         // 选套定额ID
-        // const optionalRationIDs = getOptionalRationIDs(itemClassData, allRationIDs);
+        const optionalRationIDs = getOptionalRationIDs(itemClassData, allRationIDs);
         //if(itemClassData.length > 1000) console.log('getItemClassData end',billNode.data.name,billNode.data.code,billNode.data.ID,itemClassData.length)
         itemClassData.forEach(item => {
             // 错套定额
-            const errorRationIDs = getErrorRationIDs(item.requiredRationIDs, optionalRationIDs, allRationIDs);
+            item.optionalRationIDs.push(...unMatchRation);
+            const errorRationIDs = getErrorRationIDs(item.requiredRationIDs, item.optionalRationIDs, allRationIDs);
             if(billNode.data.ID == '1d32fa34-0a9b-11ea-a33d-5388f9783b09') console.log(item.name)
             billClassData.push({
                 itemCharacter: item.name,
@@ -844,10 +880,31 @@ async function generateClassData(libID) {
                 name: billNode.data.name,
                 code: billNode.data.code,
                 requiredRationIDs: item.requiredRationIDs || [],
-                optionalRationIDs:optionalRationIDs || [],
+                optionalRationIDs:item.optionalRationIDs || [],
                 errorRationIDs,
             });
         });
+        //新增无必填时的情况
+        if(itemClassData.length===0){
+           Object.keys(requireRationData).forEach((key)=>{
+                 requireRationData[key].forEach(data=>{
+                    if(data.length) optionalRationIDs.push(...data);
+                })
+            })
+            const errorRationIDs = getErrorRationIDs([], optionalRationIDs, allRationIDs);
+            billClassData.push({
+                itemCharacter: '',
+                class: classNum++,
+                classCode: `${billNode.data.code}`,
+                compilationID: lib.compilationId,
+                name: billNode.data.name,
+                code: billNode.data.code,
+                requiredRationIDs: [],
+                optionalRationIDs:optionalRationIDs || [],
+                errorRationIDs,
+            });
+
+        }
     }
     console.log(`billClassData.length`);
     console.log(billClassData.length);