|
@@ -8,33 +8,48 @@
|
|
|
* @version
|
|
|
*/
|
|
|
|
|
|
-const XML_IMPORT_BASE = (() => {
|
|
|
- // 清单类型
|
|
|
- const BILLS_TYPE ={
|
|
|
- DXFY: 1, //大项费用
|
|
|
- FB: 2, //分部
|
|
|
- FX: 3, //分项
|
|
|
- BILLS: 4, //清单
|
|
|
- BX: 5 //补项
|
|
|
+const importXMLBase = (() => {
|
|
|
+ //人材机调整法
|
|
|
+ const AdjustType = {
|
|
|
+ info: 'priceInfo', //造价信息差额调整法
|
|
|
+ coe: 'priceCoe' //价格指数调整法
|
|
|
};
|
|
|
- // 项目类型
|
|
|
- const PROJECT_TYPE = {
|
|
|
- PROJECT: 'Project',
|
|
|
- ENGINEERING: 'Engineering',
|
|
|
- TENDER: 'Tender'
|
|
|
- };
|
|
|
- // 人材机调整法
|
|
|
- const ADJUST_TYPE = {
|
|
|
- INFO: 'priceInfo', //造价信息差额调整法
|
|
|
- COE: 'priceCoe' //价格指数调整法
|
|
|
- };
|
|
|
-
|
|
|
const CONFIG = Object.freeze({
|
|
|
- BILLS_TYPE,
|
|
|
- PROJECT_TYPE,
|
|
|
- ADJUST_TYPE
|
|
|
+ AdjustType
|
|
|
});
|
|
|
|
|
|
+ // xml字符实体
|
|
|
+ const XMLEntity = {
|
|
|
+ ' ': 'escape{space}',
|
|
|
+ ' ': 'escape{simpleSpace}',
|
|
|
+ '	': 'escape{tab}',
|
|
|
+ '	': 'escape{simpleTab}',
|
|
|
+ '
': 'escape{return}',
|
|
|
+ '
': 'escape{simpleReturn}',
|
|
|
+ '�A;': 'escape{newLine}',
|
|
|
+ '
': 'escape{simpleNewLine}',
|
|
|
+ '<': 'escape{less}',
|
|
|
+ '>': 'escape{greater}',
|
|
|
+ '&': 'escape{and}',
|
|
|
+ '"': 'escape{quot}',
|
|
|
+ ''': 'escape{apos}'
|
|
|
+ };
|
|
|
+
|
|
|
+ // 避免字符实体进行转义。原文本中含有xml字符实体,转换为其他字符。
|
|
|
+ function escapeXMLEntity(str) {
|
|
|
+ for (const [key, value] of Object.entries(XMLEntity)) {
|
|
|
+ str = str.replace(new RegExp(key, 'g'), value);
|
|
|
+ }
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+ // 将文本还原为字符实体
|
|
|
+ function restoreXMLEntity(str) {
|
|
|
+ for (const [key, value] of Object.entries(XMLEntity)) {
|
|
|
+ str = str.replace(new RegExp(value, 'g'), key);
|
|
|
+ }
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* 读取文件转换为utf-8编码的字符串
|
|
|
* @param {Blob}file
|
|
@@ -42,7 +57,7 @@ const XML_IMPORT_BASE = (() => {
|
|
|
* */
|
|
|
function readAsTextSync(file) {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
- let fr = new FileReader();
|
|
|
+ const fr = new FileReader();
|
|
|
fr.readAsText(file); // 默认utf-8,如果出现乱码,得看导入文件是什么编码
|
|
|
fr.onload = function () {
|
|
|
resolve(this.result);
|
|
@@ -62,7 +77,7 @@ const XML_IMPORT_BASE = (() => {
|
|
|
* */
|
|
|
function getValue(source, fields) {
|
|
|
let cur = source;
|
|
|
- for (let field of fields) {
|
|
|
+ for (const field of fields) {
|
|
|
if (!cur[field]) {
|
|
|
return '';
|
|
|
}
|
|
@@ -95,7 +110,7 @@ const XML_IMPORT_BASE = (() => {
|
|
|
if (!Array.isArray(fees) || !fees.length) {
|
|
|
return '0';
|
|
|
}
|
|
|
- let feeData = fees.find(fee => fee.fieldName === fields[0]);
|
|
|
+ const feeData = fees.find(fee => fee.fieldName === fields[0]);
|
|
|
return feeData[fields[1]] || '0';
|
|
|
}
|
|
|
// 获取固定ID
|
|
@@ -110,9 +125,9 @@ const XML_IMPORT_BASE = (() => {
|
|
|
* @return {Array}
|
|
|
* */
|
|
|
function getItemsRecur(src, fields, extractFuc) {
|
|
|
- let itemsSrc = [],
|
|
|
- curField = [''];
|
|
|
- for (let field of fields) {
|
|
|
+ let itemsSrc = [];
|
|
|
+ let curField = [''];
|
|
|
+ for (const field of fields) {
|
|
|
itemsSrc = arrayValue(src, field);
|
|
|
if (itemsSrc.length) {
|
|
|
curField = field;
|
|
@@ -120,7 +135,7 @@ const XML_IMPORT_BASE = (() => {
|
|
|
}
|
|
|
}
|
|
|
return itemsSrc.map(itemSrc => {
|
|
|
- let obj = extractFuc(itemSrc, curField);
|
|
|
+ const obj = extractFuc(itemSrc, curField);
|
|
|
obj.items = getItemsRecur(itemSrc, fields, extractFuc);
|
|
|
return obj;
|
|
|
});
|
|
@@ -194,14 +209,32 @@ const XML_IMPORT_BASE = (() => {
|
|
|
// 获取必要的清单模板
|
|
|
async function getNeedfulTemplate(templateLibID) {
|
|
|
return await ajaxPost('/template/bills/api/getNeedfulTemplate',
|
|
|
- {templateLibID});
|
|
|
+ { templateLibID });
|
|
|
}
|
|
|
|
|
|
|
|
|
const UTIL = Object.freeze({
|
|
|
+ escapeXMLEntity,
|
|
|
+ restoreXMLEntity,
|
|
|
getValue,
|
|
|
arrayValue,
|
|
|
getFee,
|
|
|
- transformCalcBase
|
|
|
+ getFlag,
|
|
|
+ getItemsRecur,
|
|
|
+ readAsTextSync,
|
|
|
});
|
|
|
+
|
|
|
+ // 获取接受上传的文件类型正则表达式
|
|
|
+ function getAcceptReg(accepts) {
|
|
|
+ const acceptsExp = accepts.reduce((acc, cur, index) => {
|
|
|
+ return acc + `${index ? '|' : ''}\\${cur}`;
|
|
|
+ }, '');
|
|
|
+ return new RegExp(`(${acceptsExp})`, 'i');
|
|
|
+ }
|
|
|
+
|
|
|
+ return {
|
|
|
+ CONFIG,
|
|
|
+ UTIL,
|
|
|
+ getAcceptReg,
|
|
|
+ }
|
|
|
})();
|