|
@@ -50,10 +50,13 @@ const importBills = (function(){
|
|
|
|
|
|
//上传类型
|
|
|
const uploadType = {
|
|
|
+ general: 'general',
|
|
|
lj: 'lj',
|
|
|
gld: 'gld',
|
|
|
};
|
|
|
|
|
|
+ let curFileType = uploadType.general;
|
|
|
+
|
|
|
//设置导入表内容(选择导入位置)
|
|
|
//@param {Object}workBook
|
|
|
function setImportSheetsInfo(sheets){
|
|
@@ -131,14 +134,14 @@ const importBills = (function(){
|
|
|
}
|
|
|
|
|
|
//提取excel表头列名与列下标映射
|
|
|
- //@
|
|
|
function getColMapping(dataTable){
|
|
|
//获取表头
|
|
|
function getHeadRow(dataTable){
|
|
|
+ const headTexts = [colText.serialNo[0], ...colText.code];
|
|
|
for(let rowIdx in dataTable ){
|
|
|
for(let colIdx in dataTable[rowIdx]){
|
|
|
let cellData = dataTable[rowIdx][colIdx]['value'];
|
|
|
- if(cellData && _deESC(cellData) === colText.serialNo[0]){
|
|
|
+ if(cellData && headTexts.includes(_deESC(cellData))){
|
|
|
return dataTable[rowIdx];
|
|
|
}
|
|
|
}
|
|
@@ -194,8 +197,16 @@ const importBills = (function(){
|
|
|
return colMapping;
|
|
|
}
|
|
|
|
|
|
+ // 根据列设置判断从excel表上传界面,上传的具体类型是什么:自定义通用表和09表使用了同一个按钮,因此在获取列设置的时候,还要再区分general和lj
|
|
|
+ function getExactlyFileType(colMapping) {
|
|
|
+ // 只需要区分自定义通用表和09表
|
|
|
+ return !_isDef(colMapping.serialNo) && !_isDef(colMapping.money)
|
|
|
+ ? uploadType.general
|
|
|
+ : uploadType.lj;
|
|
|
+ }
|
|
|
+
|
|
|
//是否是有效的表头列格式,只要含有各表需要的列就行,不严格控制多少列
|
|
|
- function isValidSheet(colMapping, fileType){
|
|
|
+ function isValidSheet(colMapping){
|
|
|
function hasField(field, all){
|
|
|
for(let i of all){
|
|
|
if(field === i){
|
|
@@ -205,11 +216,13 @@ const importBills = (function(){
|
|
|
return false;
|
|
|
}
|
|
|
let needFields;
|
|
|
- if(fileType === uploadType.lj){
|
|
|
+ if (curFileType === uploadType.general) {
|
|
|
+ // 自定义通用表:项目编码 项目名称 项目特征 计量单位 工程量
|
|
|
+ needFields = ['code', 'name', 'itemCharacterText', 'unit', 'quantity'];
|
|
|
+ } else if(curFileType === uploadType.lj){
|
|
|
//09表:序号、项目编码、项目名称、项目特征、计量单位、工程量、金额
|
|
|
needFields = ['serialNo', 'code', 'name', 'money'];
|
|
|
- }
|
|
|
- else {
|
|
|
+ } else {
|
|
|
//广联达表:序号、项目编码、项目名称、项目特征、计量单位、工程量、工程量明细、费用明细
|
|
|
needFields = ['serialNo', 'code', 'name', 'itemCharacterText', 'unit', 'quantity', 'quantityDetail', 'feeDetail'];
|
|
|
}
|
|
@@ -225,8 +238,9 @@ const importBills = (function(){
|
|
|
//获取要无效和有效导入表
|
|
|
//@param {Array}importSheetInfo 勾选要导入的表
|
|
|
function getImportSheets(sheets, sheetsInfo, fileType){
|
|
|
+ curFileType = fileType; // 自定义通用表和09表使用了同一个按钮,因此在获取列设置的时候,还要再区分general和lj
|
|
|
+ let isGetType = false;
|
|
|
let rst = {invalidSheets: [], validSheets: {fbfx: [], jscsxm: [], zzcsxm: []}};
|
|
|
-
|
|
|
for(let sheetInfo of sheetsInfo){
|
|
|
let sheet = getSheetByIndex(sheets, sheetInfo.index);
|
|
|
if(!sheet){
|
|
@@ -237,12 +251,17 @@ const importBills = (function(){
|
|
|
rst.invalidSheets.push(sheet.name);
|
|
|
continue;
|
|
|
}
|
|
|
- //获取表的列设置确定导入的格式是否合法(09、广联达)
|
|
|
+ //获取表的列设置确定导入的格式是否合法(通用excel、09、广联达)
|
|
|
let colMapping = getColMapping(sheet.data.dataTable);
|
|
|
- if(!isValidSheet(colMapping, fileType)){
|
|
|
+ // 以第一个有效的sheet作为类型基准
|
|
|
+ if (!isGetType && fileType === uploadType.lj) {
|
|
|
+ curFileType = getExactlyFileType(colMapping);
|
|
|
+ }
|
|
|
+ if(!isValidSheet(colMapping)){
|
|
|
rst.invalidSheets.push(sheet.name);
|
|
|
continue;
|
|
|
}
|
|
|
+ isGetType = true;
|
|
|
//合法的表
|
|
|
sheet.colMapping = colMapping;
|
|
|
//将合法的表按导入位置分类当做一个表来处理
|
|
@@ -269,7 +288,9 @@ const importBills = (function(){
|
|
|
let withingD = false;
|
|
|
let validData = [];
|
|
|
function isHead(rData){
|
|
|
- return rData[colMapping.serialNo] && _deESC(rData[colMapping.serialNo]['value']) === colText.serialNo[0];
|
|
|
+ return curFileType === uploadType.general
|
|
|
+ ? rData[colMapping.code] && colText.code.includes(_deESC(rData[colMapping.code]['value']))
|
|
|
+ : rData[colMapping.serialNo] && _deESC(rData[colMapping.serialNo]['value']) === colText.serialNo[0];
|
|
|
}
|
|
|
function isTail(rowData){
|
|
|
for(let colIdx in rowData){
|
|
@@ -306,6 +327,147 @@ const importBills = (function(){
|
|
|
let preRootID = -1,
|
|
|
preLeafID = -1,
|
|
|
preID = -1;
|
|
|
+ //父节点
|
|
|
+ function isRoot(rData){
|
|
|
+ //序号和编码去除转义字符(有的表格单元格看起来是没数据,实际含有\r,\n等数据)
|
|
|
+ const code = rData[colMapping.code] ? _deESC(rData[colMapping.code]['value']) : '';
|
|
|
+ const unit = rData[colMapping.unit] ? _deESC(rData[colMapping.unit]['value']) : '';
|
|
|
+ if (curFileType === uploadType.general) {
|
|
|
+ // 通用表:项目编码非12位或者无单位的
|
|
|
+ return _isDef(code) && !/\w{12}/.test(code) || !_isDef(unit);
|
|
|
+ } else {
|
|
|
+ // 09、广联达表:1.无序号 2有编码
|
|
|
+ const serialNo = rData[colMapping.serialNo] ? _deESC(rData[colMapping.serialNo]['value']) : '';
|
|
|
+ return !_isDef(serialNo) && _isDef(code);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //子节点
|
|
|
+ function isLeaf(rData){
|
|
|
+ if (curFileType === uploadType.general) {
|
|
|
+ // 通用表:项目编码12位且有单位的
|
|
|
+ const code = rData[colMapping.code] ? _deESC(rData[colMapping.code]['value']) : '';
|
|
|
+ const unit = rData[colMapping.unit] ? _deESC(rData[colMapping.unit]['value']) : '';
|
|
|
+ return _isDef(code) && /\w{12}/.test(code) && _isDef(unit);
|
|
|
+ } else {
|
|
|
+ // 09、广联达表:有序号
|
|
|
+ const serialNo = rData[colMapping.serialNo] ? _deESC(rData[colMapping.serialNo]['value']) : '';
|
|
|
+ return _isDef(serialNo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //续数据:1. 前数据有效 2.无序号 3.无编码 4.有名称或特征
|
|
|
+ function isExtend(preData, rData){
|
|
|
+ if (curFileType === uploadType.general) {
|
|
|
+ // 通用表:1. 前数据有效 2.无编码 3.无单位 4.有名称或特征
|
|
|
+ let code = rData[colMapping.code] ? _deESC(rData[colMapping.code]['value']) : '';
|
|
|
+ let unit = rData[colMapping.unit] ? _deESC(rData[colMapping.unit]['value']) : '';
|
|
|
+ let name = rData[colMapping.name] ? _deESC(rData[colMapping.name]['value']) : '';
|
|
|
+ let itemCharacterText = rData[colMapping.itemCharacterText] ? _deESC(rData[colMapping.itemCharacterText]['value']) : '';
|
|
|
+ return _isDef(preData) && (isRoot(preData) || isLeaf(preData)) && !_isDef(unit) && !_isDef(code) && (_isDef(name) || _isDef(itemCharacterText));
|
|
|
+ } else {
|
|
|
+ // 09、广联达表:1. 前数据有效 2.无序号 3.无编码 4.有名称或特征
|
|
|
+ let serialNo = rData[colMapping.serialNo] ? _deESC(rData[colMapping.serialNo]['value']) : '';
|
|
|
+ let code = rData[colMapping.code] ? _deESC(rData[colMapping.code]['value']) : '';
|
|
|
+ let name = rData[colMapping.name] ? _deESC(rData[colMapping.name]['value']) : '';
|
|
|
+ let itemCharacterText = rData[colMapping.itemCharacterText] ? _deESC(rData[colMapping.itemCharacterText]['value']) : '';
|
|
|
+ return _isDef(preData) && (isRoot(preData) || isLeaf(preData)) && !_isDef(serialNo) && !_isDef(code) && (_isDef(name) || _isDef(itemCharacterText));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ function getBillType(rData, flag){
|
|
|
+ if(flag === fixedFlag.CONSTRUCTION_TECH || flag === fixedFlag.CONSTRUCTION_ORGANIZATION){
|
|
|
+ return billType.BILL;
|
|
|
+ }
|
|
|
+ else if(flag === fixedFlag.SUB_ENGINERRING){
|
|
|
+ return isLeaf(rData) ? billType.FX : billType.FB;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ let preData = null;
|
|
|
+ for(let r = 0; r < validData.length; r++){
|
|
|
+ let rData = validData[r];
|
|
|
+ if(flag == fixedFlag.CONSTRUCTION_TECH && rData[colMapping.name] && rData[colMapping.name]['value'] === '施工技术措施项目'
|
|
|
+ || flag == fixedFlag.CONSTRUCTION_ORGANIZATION && rData[colMapping.name] && rData[colMapping.name]['value'] === '施工组织措施项目'){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //过滤无效数据
|
|
|
+ if(!isRoot(rData) && !isLeaf(rData) && !isExtend(preData, rData)){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(isExtend(preData, rData)){
|
|
|
+ let preBill = billIdx[preID];
|
|
|
+ if(preBill){
|
|
|
+ //合并续数据
|
|
|
+ preBill.code += rData[colMapping.code] && rData[colMapping.code]['value'] && _isDef(_deESC(rData[colMapping.code]['value'])) ? rData[colMapping.code]['value'] : '';
|
|
|
+ preBill.name += rData[colMapping.name] && rData[colMapping.name]['value'] && _isDef(_deESC(rData[colMapping.name]['value'])) ? rData[colMapping.name]['value'] : '';
|
|
|
+ preBill.itemCharacterText += rData[colMapping.itemCharacterText] && rData[colMapping.itemCharacterText]['value'] && _isDef(_deESC(rData[colMapping.itemCharacterText]['value']))
|
|
|
+ ? '\n' + _deNR(rData[colMapping.itemCharacterText]['value']) : '';
|
|
|
+ preBill.unit += rData[colMapping.unit] && rData[colMapping.unit]['value'] && _isDef(_deESC(rData[colMapping.unit]['value'])) ? rData[colMapping.unit]['value'] : '';
|
|
|
+ preBill.quantity += rData[colMapping.quantity] && rData[colMapping.quantity]['value'] && _isDef(_deESC(rData[colMapping.quantity]['value'])) ? rData[colMapping.quantity]['value'] : '';
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ let newID = uuid.v1();
|
|
|
+ let pID = -1;
|
|
|
+ let preBill = null;
|
|
|
+ let preRoot = null,
|
|
|
+ preLeaf = null;
|
|
|
+ let nodeType = 'root';//后端以此标记来设置ParentID
|
|
|
+ let preSerialBill = billIdx[preID];
|
|
|
+ if(isRoot(rData)){
|
|
|
+ //pID = 'fixedBillID';
|
|
|
+ preBill = billIdx[preRootID];
|
|
|
+ preRoot = billIdx[preRootID];
|
|
|
+ } else if(isLeaf(rData)){
|
|
|
+ nodeType = 'leaf';
|
|
|
+ //pID = preRootID !== -1 ? preRootID : fixedBill.ID;
|
|
|
+ preBill = billIdx[preLeafID];
|
|
|
+ preLeaf = billIdx[preLeafID];
|
|
|
+ }
|
|
|
+ //set bill data
|
|
|
+ billIdx[newID] = {
|
|
|
+ nodeType: nodeType,
|
|
|
+ ID: newID, ParentID: pID, NextSiblingID: -1,
|
|
|
+ code: rData[colMapping.code] && rData[colMapping.code]['value'] ? _deESC(rData[colMapping.code]['value']) : '',
|
|
|
+ name: rData[colMapping.name] && rData[colMapping.name]['value'] ? _deESC(rData[colMapping.name]['value']) : '',
|
|
|
+ itemCharacterText: rData[colMapping.itemCharacterText] && rData[colMapping.itemCharacterText]['value'] ? _deNR(rData[colMapping.itemCharacterText]['value']) : '',
|
|
|
+ itemCharacter: [],
|
|
|
+ jobContentText: '',
|
|
|
+ jobContent: [],
|
|
|
+ programID: null,
|
|
|
+ unit: rData[colMapping.unit] && rData[colMapping.unit]['value'] ? _deESC(rData[colMapping.unit]['value']) : '',
|
|
|
+ quantity: rData[colMapping.quantity] && rData[colMapping.quantity]['value'] ? _deESC(rData[colMapping.quantity]['value']) : '',
|
|
|
+ quantityEXP: rData[colMapping.quantity] && rData[colMapping.quantity]['value'] ? _deESC(rData[colMapping.quantity]['value']) : '',
|
|
|
+ //安全文明
|
|
|
+ flags: flag === fixedFlag.CONSTRUCTION_ORGANIZATION && (rData[colMapping.name] && (rData[colMapping.name]['value'] === '安全文明施工专项费用' || rData[colMapping.name]['value'] === '安全文明施工费')) ?
|
|
|
+ [{fieldName: 'fixed', flag: fixedFlag.SAFETY_CONSTRUCTION}] : [],
|
|
|
+ fees: [],
|
|
|
+ projectID: projectID,
|
|
|
+ type: getBillType(rData, flag)};
|
|
|
+ //update preBill NextSibling
|
|
|
+ if(nodeType === 'root' && preRoot){
|
|
|
+ preRoot.NextSiblingID = newID;
|
|
|
+ } else if(nodeType === 'leaf' && preLeaf && preSerialBill && preSerialBill.nodeType === preLeaf.nodeType){
|
|
|
+ preLeaf.NextSiblingID = newID;
|
|
|
+ }
|
|
|
+ /* if(preBill){
|
|
|
+ preBill.NextSiblingID = newID;
|
|
|
+ }*/
|
|
|
+ //set new preID
|
|
|
+ preID = newID;
|
|
|
+ preRootID = isRoot(rData) ? newID : preRootID;
|
|
|
+ preLeafID = isLeaf(rData) ? newID : preLeafID;
|
|
|
+ }
|
|
|
+ preData = rData;
|
|
|
+ }
|
|
|
+ for(let i in billIdx){
|
|
|
+ rst.push(billIdx[i]);
|
|
|
+ }
|
|
|
+ return rst;
|
|
|
+ }
|
|
|
+ /* function parseToBillData(validData, colMapping, flag, projectID){
|
|
|
+ let rst = [];
|
|
|
+ let billIdx = {};
|
|
|
+ let preRootID = -1,
|
|
|
+ preLeafID = -1,
|
|
|
+ preID = -1;
|
|
|
//父节点:1.无序号 2有编码
|
|
|
function isRoot(rData){
|
|
|
//序号和编码去除转义字符(有的表格单元格看起来是没数据,实际含有\r,\n等数据)
|
|
@@ -404,9 +566,6 @@ const importBills = (function(){
|
|
|
else if(nodeType === 'leaf' && preLeaf && preSerialBill && preSerialBill.nodeType === preLeaf.nodeType){
|
|
|
preLeaf.NextSiblingID = newID;
|
|
|
}
|
|
|
- /* if(preBill){
|
|
|
- preBill.NextSiblingID = newID;
|
|
|
- }*/
|
|
|
//set new preID
|
|
|
preID = newID;
|
|
|
preRootID = isRoot(rData) ? newID : preRootID;
|
|
@@ -418,7 +577,7 @@ const importBills = (function(){
|
|
|
rst.push(billIdx[i]);
|
|
|
}
|
|
|
return rst;
|
|
|
- }
|
|
|
+ } */
|
|
|
|
|
|
function getImportData(validSheets, projectID){
|
|
|
let rst = {fbfx: [], jscsxm: [], zzcsxm: []};
|