|
@@ -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);
|