'use strict'; /** * * * @author Zhong * @date 2019/11/1 * @version */ ((factory) => { if (typeof module !== 'undefined') { module.exports = factory(); } else { window.BILLS_UTIL = factory(); } })(() => { // 清单模板各清单重设ID时,重新转换清单基数的ID引用(清单模板基数中使用@x标识行号) function parseCalcBase(calcBase, uuidMapping) { const orgIDRefs = [...new Set(calcBase.match(/@\d+/g))]; orgIDRefs.forEach(orgRef => { const orgID = orgRef.match(/\d+/)[0]; const newID = uuidMapping[orgID] || null; // ID匹配不上则不转换这个引用 if (!newID) { return; } const replaceStr = `@${newID}`; calcBase = calcBase.replace(new RegExp(`${orgRef}\\b`, 'g'), replaceStr); }); return calcBase; } // 重新转换清单基数的ID引用(@xxx标识的是ID) function parseIDRefCalcBase(calcBase, uuidMapping) { let rst = calcBase; Object .entries(uuidMapping) .forEach(([orgID, newID]) => { rst = rst.replace(orgID, newID); }); return rst; } /* * @param {Array}billsList (完整的清单树结构数据) * @param {Function}idFactory 生成ID的方法 * @param {boolean}isIDRef 清单的计算基数,是否可能使用了ID引用(区分模板清单的行引用) * @return {void} * */ function resetTreeData(billsList, idFactory, isIDRef = false) { const idMapping = {}; idMapping['-1'] = -1; // 建立新ID-旧ID映射 billsList.forEach(bills => idMapping[bills.ID] = idFactory()); const reg = /@\d+/; billsList.forEach(function (bills) { bills.ID = idMapping[bills.ID] ? idMapping[bills.ID] : -1; bills.ParentID = idMapping[bills.ParentID] ? idMapping[bills.ParentID] : -1; bills.NextSiblingID = idMapping[bills.NextSiblingID] ? idMapping[bills.NextSiblingID] : -1; if (isIDRef) { const IDRefReg = /@/; if (bills.calcBase && IDRefReg.test(bills.calcBase)) { bills.calcBase = parseIDRefCalcBase(bills.calcBase, idMapping); } } else { const needToParseCalcBase = bills.calcBase && reg.test(bills.calcBase); if (needToParseCalcBase) { bills.calcBase = parseCalcBase(bills.calcBase, idMapping); } } }); } return { parseCalcBase, resetTreeData }; });