Bläddra i källkod

1.导入不再保留字符实体
2.导出处理字符实体
3.规费子项需要导出

zhongzewei 6 år sedan
förälder
incheckning
d09d223649

+ 8 - 3
web/building_saas/main/js/models/exportStandardInterface.js

@@ -1817,7 +1817,7 @@ const XMLStandard = (function () {
 
         }
         /*
-        * 加载规费和税金清单,固定显示:规费、税金、增值税、附加税、环境保护税这几个清单
+        * 加载规费和税金清单,固定显示:规费、规费子项、税金、增值税、附加税、环境保护税这几个清单
         * @param {Object}detail
         * @return {Object}
         * */
@@ -1830,8 +1830,13 @@ const XMLStandard = (function () {
                 fixedFlag.ADDITIONAL_TAX,
                 fixedFlag.ENVIRONMENTAL_PROTECTION_TAX
             ];
-            let fitlerNodes = detail.Bills.tree.items.filter(node => filterFlags.includes(node.getFlag()));
-            for (let node of fitlerNodes) {
+            let filterNodes = detail.Bills.tree.items.filter(node => filterFlags.includes(node.getFlag()));
+            // 规费子项
+            let chargeNode = filterNodes.find(node => node.getFlag() === fixedFlag.CHARGE);
+            if (chargeNode) {
+                filterNodes.splice(filterNodes.indexOf(chargeNode) + 1, 0, ...chargeNode.children);
+            }
+            for (let node of filterNodes) {
                 let mainTreeNode = detail.mainTree.getNodeByID(node.data.ID),
                     serialNo = mainTreeNode ? mainTreeNode.serialNo() + 1 : 1;
                 let source = {

+ 40 - 3
web/building_saas/main/js/models/exportStdInterfaceBase.js

@@ -103,6 +103,7 @@ const XML_EXPORT_BASE = (() => {
      * @return {void}
      * */
     function Element(name, attrs) {
+        handleXMLEntity(attrs);
         this.name = name;
         let checkData = check(name, attrs);
         this.fail = checkData.failHints;
@@ -111,6 +112,40 @@ const XML_EXPORT_BASE = (() => {
         _cache.failList.push(...this.fail);
     }
     /*
+    * xml字符实体的处理,这些特殊字符不处理会导致xml文件格式出错:""、<>、&
+    * 要先处理&amp
+    * */
+    let _xmlEntity = {
+        '&': '&amp;',
+        '\n': '&#xA;',
+        '"': '&quot;',
+        '\'': '&apos;',
+        '<': '&lt;',
+        '>': '&gt;'
+    };
+    // 对每个元素的所有属性值进行特殊字符处理
+    function handleXMLEntity(attrs) {
+        for (let attr of attrs) {
+            // 值统一转换成String
+            attr.value = !isDef(attr.value) ? '' : String(attr.value);
+            if (!attr.value) {
+                continue;
+            }
+            for (let [key, value] of Object.entries(_xmlEntity)) {
+                attr.value = attr.value.replace(new RegExp(key, 'g'), value);
+            }
+        }
+    }
+    // 获取处理实体字符后的数据
+    function getParsedData(arr) {
+        return arr.map(data => {
+            for (let [key, value] of Object.entries(_xmlEntity)) {
+                data = data.replace(new RegExp(key, 'g'), value);
+            }
+            return data;
+        });
+    }
+    /*
      * 检查
      * 创建节点时检查节点的数据
      * 1.长度限制minLen,maxLen
@@ -123,7 +158,7 @@ const XML_EXPORT_BASE = (() => {
         let rst = {failHints: [], filterAttrs: []};
         let dateReg = /([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))/;
         for (let data of datas) {
-            data.value = typeof data.value === 'undefined' || data.value === null ? '' : String(data.value);
+            //data.value = typeof data.value === 'undefined' || data.value === null ? '' : String(data.value);
             if (data.whiteSpace && data.whiteSpace === WHITE_SPACE.COLLAPSE) {  //处理空格相关
                 data.value = data.value.replace(/[\r,\n,\t]/g, ' ');
                 data.value = data.value.trim();
@@ -459,14 +494,16 @@ const XML_EXPORT_BASE = (() => {
     }
     // 设置完工程编号后,更新原始数据的工程编号
     function setupCode(originalDatas, codeDatas, {Tender, Engineering}) {
+        // 转换xml实体字符
+        let parsedCodeDatas = getParsedData(codeDatas);
         originalDatas.forEach(orgData => {
             let curIdx = 0;
             let engs = _getNodeFromSrc(orgData.data, Engineering);
             engs.forEach(eng => {
-                eng.attrs.find(attr => attr.name === '编号').value = codeDatas[curIdx++];
+                eng.attrs.find(attr => attr.name === '编号').value = parsedCodeDatas[curIdx++];
                 let tenders = _getNodeFromSrc(eng, Tender);
                 tenders.forEach(tender => {
-                    tender.attrs.find(attr => attr.name === '编号').value = codeDatas[curIdx++];
+                    tender.attrs.find(attr => attr.name === '编号').value = parsedCodeDatas[curIdx++];
                 });
             });
         });

+ 11 - 11
web/building_saas/main/js/models/importStandardInterface.js

@@ -137,8 +137,8 @@ const ImportXML = (() => {
         info: 'priceInfo',  //造价信息差额调整法
         coe: 'priceCoe'     //价格指数调整法
     };
-    // xml转义字符
-    const XML_CHARS = {
+    // xml字符实体
+    const XML_ENTITY = {
         '&#x0020;': 'escape{space}',
         '&#x20;': 'escape{simpleSpace}',
         '&#x0009;': 'escape{tab}',
@@ -153,16 +153,16 @@ const ImportXML = (() => {
         '&quot;': 'escape{quot}',
         '&apos;': 'escape{apos}'
     };
-    // 避免转义字符进行转义。原文本中含有xml转义字符,转换为其他字符。
-    function escapeXMLChars(str) {
-        for (let [key, value] of Object.entries(XML_CHARS)) {
+    // 避免字符实体进行转义。原文本中含有xml字符实体,转换为其他字符。
+    function escapeXMLEntity(str) {
+        for (let [key, value] of Object.entries(XML_ENTITY)) {
             str = str.replace(new RegExp(key, 'g'), value);
         }
         return str;
     }
-    // 还原避免字符转义字符
-    function restoreXMLChars(str) {
-        for (let [key, value] of Object.entries(XML_CHARS)) {
+    // 将文本还原为字符实体
+    function restoreXMLEntity(str) {
+        for (let [key, value] of Object.entries(XML_ENTITY)) {
             str = str.replace(new RegExp(value, 'g'), key);
         }
         return str;
@@ -1365,16 +1365,16 @@ const ImportXML = (() => {
             }
         }
         //从xml文件中提取数据
-        this.extractData = async (file, escape) => {
+        this.extractData = async (file, escape = false) => {
             //将二进制文件转换成字符串
             let xmlStr = await readAsTextSync(file);
             //将xml格式良好的字符串转换成对象
             let x2js = new X2JS();
             if (escape) {
-                xmlStr = escapeXMLChars(xmlStr);
+                xmlStr = escapeXMLEntity(xmlStr);
             }
             let xmlObj = x2js.xml_str2json(xmlStr);
-            xmlObj = JSON.parse(restoreXMLChars(JSON.stringify(xmlObj)));
+            xmlObj = JSON.parse(restoreXMLEntity(JSON.stringify(xmlObj)));
             if (!xmlObj) {
                 throw '无有效数据。';
             }

+ 1 - 1
web/building_saas/pm/js/pm_import.js

@@ -289,7 +289,7 @@ const importView = (() => {
                 //转换数据
                 importXML = new ImportXML();
                 try {
-                    xmlObj = await importXML.extractData(file, true);
+                    xmlObj = await importXML.extractData(file, false);
                     $('.selFile input:eq(0)').val(xmlObj && xmlObj.name ? xmlObj.name : '');
                     $('.selFile input[name="fileKind-import"]:eq(0)').prop('checked', true);    //文件类型恢复成投标
                     $('#import-taxType').val('1');  //计税方法显示回默认的一般计税法