Просмотр исходного кода

1.导出公共部分优化结构
2.导出元素属性加一层类型默认空值

zhongzewei 6 лет назад
Родитель
Сommit
b81cf12c41

Разница между файлами не показана из-за своего большого размера
+ 1 - 0
lib/js-base64/base64.min.js


+ 1 - 0
web/building_saas/main/html/main.html

@@ -2127,6 +2127,7 @@
     <img src="/web/dest/css/img/tender.png" id="block_pic" style="display: none">
 
         <!-- JS. -->
+    <script src="/lib/js-base64/base64.min.js"></script>
     <script src = "/lib/spreadjs/sheets/gc.spread.sheets.all.11.1.2.min.js"></script>
     <script src="/lib/spreadjs/sheets/interop/gc.spread.excelio.11.1.2.min.js"></script>
     <script>GC.Spread.Sheets.LicenseKey =  '<%- LicenseKey %>';</script>

+ 122 - 92
web/building_saas/main/js/models/exportStandardInterface.js

@@ -32,7 +32,7 @@ const XMLStandard = (function () {
         0: '1800',  //其他未定义的大项费用
     };
     //文件类型
-    const FILE_KIND = {
+    const FILE_KIND_TEXT = {
         '1': '投标',
         '2': '招标',
         '3': '控制价'
@@ -141,17 +141,15 @@ const XMLStandard = (function () {
         _util = _base.UTIL,
         _cache = _base.CACHE;
 
-    return function (userID, granularity, exportKind) {
+    /*
+    * 提取数据入口
+    * @param  {String}userID 用户ID
+    *         {Number}exportKind 导出类型(投标1、招标2、控制价3
+    *         {Object}projectData 项目数据(项目自身的数据、建设、单项、单位的数据(projects表的数据),不包含详细的清单定额等数据)
+    * @return {Array} [{data: Object, exportKind: Number, fileName: String}]
+    * */
+    async function entry(userID, exportKind, projectData) {
         let _failList = _cache.getItem('failList');
-        //默认导出建设项目
-        if (!granularity || ![1, 2, 3].includes(granularity)) {
-            granularity = _config.GRANULARITY.PROJECT;
-        }
-        //默认导出投标文件
-        if (!exportKind || ![1, 2, 3].includes(exportKind)) {
-            exportKind = _config.EXPORT_KIND.Tender;
-        }
-        this.originalDatas = []; //转换后的数据(xml化前的数据结构)
 
         //建设项目定义
         //source:来源数据
@@ -948,49 +946,40 @@ const XMLStandard = (function () {
         let curProjectEle = null,  //建设项目节点
             curTenderEle = null;   //单位工程节点
 
-        //获取需要导出的项目数据
+        // 获取需要导出的项目数据
         //@param {Number}tenderID(当前界面的单位工程ID,后台根据这个单位工程,去找其建设项目下所有数据)
         //@return {Object}(eleObj)
-        async function loadProject(tenderID) {
-            //拉取标段数据:建设项目、单项工程、单位工程数据
-            let projectsData = await _util.getProjectByGranularity(granularity, tenderID, userID);
-            if (!projectsData) {
-                throw '获取项目数据错误';
-            }
-            //单项工程、单位工程按照树结构数据进行排序
-            projectsData.children = _util.sortByNext(projectsData.children);
-            for (let engData of projectsData.children) {
-                engData.children = _util.sortByNext(engData.children);
-            }
+        async function loadProject(projectData) {
+            console.log(projectData);
             //标段
             let project = new Project({
-                basicInformation: projectsData.property.basicInformation,
-                name: projectsData.name,
-                fileKind: FILE_KIND[exportKind],
-                taxType: projectsData.property.taxType ? _config.TAX_TYPE[projectsData.property.taxType] : ''
+                basicInformation: projectData.property.basicInformation,
+                name: projectData.name,
+                fileKind: FILE_KIND_TEXT[exportKind],
+                taxType: projectData.property.taxType ? _config.TAX_TYPE[projectData.property.taxType] : ''
             });
             curProjectEle = project;
             //项目信息
-            let projectInfo = new ProjectInfo({basicInformation: projectsData.property.basicInformation});
+            let projectInfo = new ProjectInfo({basicInformation: projectData.property.basicInformation});
             project.children.push(projectInfo);
             //招标信息
-            let biddingInfo = new BiddingInfo({basicInformation: projectsData.property.basicInformation, summaryInfo: projectsData.summaryInfo[projectsData.ID]});
+            let biddingInfo = new BiddingInfo({basicInformation: projectData.property.basicInformation, summaryInfo: projectData.summaryInfo[projectData.ID]});
             projectInfo.children.push(biddingInfo);
             //投标信息 导出类型为投标时,才导出
             if (exportKind === _config.EXPORT_KIND.Tender) {
-                let bidInfo = new BidInfo({basicInformation: projectsData.property.basicInformation, summaryInfo: projectsData.summaryInfo[projectsData.ID]});
+                let bidInfo = new BidInfo({basicInformation: projectData.property.basicInformation, summaryInfo: projectData.summaryInfo[projectData.ID]});
                 projectInfo.children.push(bidInfo);
             }
             //编制说明
-            let compilationIll = new CompilationIllustration({compilationIllustration: projectsData.property.compilationIllustration});
+            let compilationIll = new CompilationIllustration({compilationIllustration: projectData.property.compilationIllustration});
             project.children.push(compilationIll);
             //系统信息
             let generatedTime = moment(Date.now()).format('YYYY-MM-DDTHH:mm:ss'),
-                sysInfoSource = {softInfo: projectsData.softInfo, generatedTime},
+                sysInfoSource = {softInfo: projectData.softInfo, generatedTime},
                 sysInfo = new SystemInfo(sysInfoSource);
             project.children.push(sysInfo);
             //费用构成
-            let feeForm = new FeeFrom(projectsData.summaryInfo[projectsData.ID]);
+            let feeForm = new FeeFrom(projectData.summaryInfo[projectData.ID]);
             project.children.push(feeForm);
             //主要清单汇总    主要清单明细在loadTender中设置
             let mainBillsSummaryEle = new MainBillsSummary();
@@ -999,13 +988,17 @@ const XMLStandard = (function () {
             let appraisalSummary = new AppraisalSummary();
             project.children.unshift(appraisalSummary);
             //单项工程
-            for (let eng of projectsData.children) {
-                let engElement = await loadEngineering(projectsData.summaryInfo, eng);
+            for (let eng of projectData.children) {
+                let engElement = await loadEngineering(projectData.summaryInfo, eng);
                 project.children.push(engElement);
             }
             //主要清单汇总、评审材料汇总 排在后面
             project.children = [...project.children.slice(2), mainBillsSummaryEle, appraisalSummary];
-            return project;
+            return [{
+                data: project,
+                exportKind: exportKind,
+                fileName: `重庆标准交换数据(${FILE_KIND_TEXT[exportKind]}).QTF`
+            }];
         }
         //单位工程内的人材机ID: 用于代码映射关系 //单位工程级别,C+数组下标 <==> gljID
         let tenderGljs = [];
@@ -1048,10 +1041,10 @@ const XMLStandard = (function () {
             return engineering;
         }
         /*
-        * 加载单位工程数据
-        * @param {Object}summaryInfo(项目汇总信息映射) {Object}tenderData(单位工程数据)
-        * @return {Object}
-        * */
+         * 加载单位工程数据
+         * @param {Object}summaryInfo(项目汇总信息映射) {Object}tenderData(单位工程数据)
+         * @return {Object}
+         * */
         async function loadTender(summaryInfo, tenderData) {
             //获取单位工程详细数据
             let tenderDetail = await _util.getTenderDetail(tenderData.ID, userID);
@@ -1171,10 +1164,10 @@ const XMLStandard = (function () {
             return tender;
         }
         /*
-        * 加载计算程序费用行
-        * @param {Object}detail(单位工程的详细数据,清单定额等等)
-        * @return {Object}
-        * */
+         * 加载计算程序费用行
+         * @param {Object}detail(单位工程的详细数据,清单定额等等)
+         * @return {Object}
+         * */
         function loadDXFY(detail) {
             //单位工程费汇总
             let tenderFeeSummary = new TenderFeeSummary();
@@ -1202,9 +1195,9 @@ const XMLStandard = (function () {
             return tenderFeeSummary;
         }
         /*
-        * 加载清单项目
-        * @param {Object}node(清单树节点) {Object}detail
-        * */
+         * 加载清单项目
+         * @param {Object}node(清单树节点) {Object}detail
+         * */
         function loadBills(node, detail) {// allRation, allRationGlj, decimal,
             let allRation = detail.Ration.datas,
                 allRationGlj = detail.ration_glj.datas,
@@ -1269,8 +1262,8 @@ const XMLStandard = (function () {
                         let source = {name: '', value: ''};
                         let execRst = reg.exec(f);
                         if (execRst) {
-                           source.name = execRst[1].replace(/^\d+\.{1}/, '').trim();  //去除开头(1.)序号,首位空格
-                           source.value = execRst[2].trim();
+                            source.name = execRst[1].replace(/^\d+\.{1}/, '').trim();  //去除开头(1.)序号,首位空格
+                            source.value = execRst[2].trim();
                         }
                         let featureEle = new Feature(source);
                         //let featureEle = new Feature({name: f.trim(), value: ''});
@@ -1395,10 +1388,10 @@ const XMLStandard = (function () {
             return bills;
         }
         /*
-        * 加载分部分项清单
-        *  @param {Object}detail
-        *  @return {Object || NULL}
-        * */
+         * 加载分部分项清单
+         *  @param {Object}detail
+         *  @return {Object || NULL}
+         * */
         function loadFBFX(detail) {
             let fbfxBills = new FBFXBills();
             let subEngNode = detail.Bills.tree.roots.find((node) => node.getFlag() === fixedFlag.SUB_ENGINERRING);
@@ -1443,10 +1436,10 @@ const XMLStandard = (function () {
             return fbfxBills;
         }
         /*
-        * 加载措施项目清单
-        * @param {Object}detail
-        * @return {Object}
-        * */
+         * 加载措施项目清单
+         * @param {Object}detail
+         * @return {Object}
+         * */
         function loadCSXM(detail) {
             let measureNode = detail.Bills.tree.roots.find((node) => node.getFlag() === fixedFlag.MEASURE);
             if (!measureNode) {
@@ -1539,10 +1532,10 @@ const XMLStandard = (function () {
             }
         }
         /*
-        * 加载其他项目清单,要出现此节点,需要遵循标准条件(至少含有一条相关明细)
-        * @param {Object}detail
-        * @return {Object || Null}
-        * */
+         * 加载其他项目清单,要出现此节点,需要遵循标准条件(至少含有一条相关明细)
+         * @param {Object}detail
+         * @return {Object || Null}
+         * */
         function loadOtherBills(detail) {
             //其他项目清单元素
             let otherEle = new OtherBills();
@@ -1563,7 +1556,7 @@ const XMLStandard = (function () {
             //添加计日工元素
             let dayWorkNode = detail.Bills.tree.items.find(node => node.getFlag() === fixedFlag.DAYWORK);
             let dayWorkEle = new DayWork({fees: dayWorkNode.data.fees});
-                if (dayWorkNode && dayWorkNode.children.length > 0) {
+            if (dayWorkNode && dayWorkNode.children.length > 0) {
                 //要显示计日工元素,人工、材料、施工机械,最少有一条含有子项(计日工项目)
                 let filterNodes = dayWorkNode.children.filter(node => [fixedFlag.LABOUR, fixedFlag.MATERIAL, fixedFlag.MACHINE].includes(node.getFlag()));
                 for (let fNode of filterNodes) {
@@ -1786,10 +1779,10 @@ const XMLStandard = (function () {
 
         }
         /*
-        * 加载规费和税金清单,固定显示:规费、规费子项、税金、增值税、附加税、环境保护税这几个清单
-        * @param {Object}detail
-        * @return {Object}
-        * */
+         * 加载规费和税金清单,固定显示:规费、规费子项、税金、增值税、附加税、环境保护税这几个清单
+         * @param {Object}detail
+         * @return {Object}
+         * */
         function loadChargeTax(detail) {
             let chargeTaxEle = new ChargeTaxBills();
             let filterFlags = [
@@ -1832,10 +1825,10 @@ const XMLStandard = (function () {
             return chargeTaxEle;
         }
         /*
-        * 加载主要清单明细
-        * @param {Obejct}parent(设置到的父项:主要清单汇总元素) {Object}detail
-        * @return {void}
-        * */
+         * 加载主要清单明细
+         * @param {Obejct}parent(设置到的父项:主要清单汇总元素) {Object}detail
+         * @return {void}
+         * */
         function loadMainBillsItems(parent, detail) {
             let mainBills = detail.Bills.datas.filter(data => {
                 let billsNode = detail.Bills.tree.nodes[`${detail.Bills.tree.prefix}${data.ID}`];
@@ -1857,10 +1850,10 @@ const XMLStandard = (function () {
             }
         }
         /*
-        * 加载人材机汇总相关:人材机汇总、评标、暂估
-        * @param {Object}appraisalSummary(建设项目下的评审材料汇总) {Object}detail
-        * @return {Object}
-        * */
+         * 加载人材机汇总相关:人材机汇总、评标、暂估
+         * @param {Object}appraisalSummary(建设项目下的评审材料汇总) {Object}detail
+         * @return {Object}
+         * */
         function loadGlj(appraisalSummary, detail) {
             let gljList = detail.projectGLJ.datas.gljList;
             let evalBidSeq = 1,    //评标序号
@@ -1966,8 +1959,8 @@ const XMLStandard = (function () {
             }
         }
         /*
-        * 加载清单综合单价计算程序
-        * */
+         * 加载清单综合单价计算程序
+         * */
         function loadCalcProgram(detail) {
             let calcProgram = detail.calcProgram;
             if (!calcProgram) {
@@ -2008,22 +2001,59 @@ const XMLStandard = (function () {
             }
             return calcProgramEle.children.length > 0 ? calcProgramEle : null;
         }
-        /*
-         * 转换导出数据
-         * @param {Number}tenderID(当前界面的单位工程ID,后台根据这个单位工程,根据导出粒度去找其建设项目下相关数据)
-         * @param {Number}curExportKind(导出的文件类型:1-投标 2-招标 3-控制价)
-         * @return {void}
-         * */
-        this.transformData = async function (tenderID, curExportKind) {
-            if (curExportKind) {
-                exportKind = parseInt(curExportKind);
-            }
-            let eleData = await loadProject(tenderID);
-            if (!eleData) {
-                return;
+
+        // 返回提取的数据
+        return await loadProject(projectData);
+    }
+
+    /*
+    * 重置工程编号,因为每一个费用定额,导出的结构都不相同,重置工程编号的逻辑需要各自定义
+    * @param  {Array}codes 工程编号
+    *         {Array}extractData 提取的数据
+    * @return {void}
+    * */
+    function resetContentCode(codes, extractData) {
+        // 提取到的数据全是以建设项目为根元素的数据,每份数据都要重置编号
+        extractData.forEach(obj => {
+            let idx = 0;
+            // 从建设项目元素中筛选出单项工程元素
+            let engs = _util.getElementFromSrc(obj.data, '单项工程');
+            engs.forEach(eng => {
+                // 从属性中找到编号项
+                let codeItem = eng.attrs.find(attr => attr.name === '编号');
+                codeItem.value = codes[idx++];
+                // 从单项工程元素中筛选出单位工程元素
+                let tenders = _util.getElementFromSrc(eng, '单位工程');
+                tenders.forEach(tender => {
+                    let codeItem = tender.attrs.find(attr => attr.name === '编号');
+                    codeItem.value = codes[idx++];
+                });
+            });
+        });
+    }
+
+    /*
+    * 导出文件的结构逻辑,每个费用定额导出的最终文件结构要求可能不同,需要各自定义
+    * 重庆18费用定额,只有一个文件的时候直接导出qtf文件,文件数大于1时,导出zip压缩包
+    * @param  {Array}fileData 文件数据
+    * @return {void}
+    * */
+    async function saveAsFile(fileData) {
+        if (fileData.length === 1) {
+            saveAs(fileData[0].blob, fileData[0].fileName);
+        } else if (fileData.length > 1) { //导出压缩包
+            let zip = new JSZip();
+            for (let file of fileData) {
+                zip.file(file.fileName, file.blob, {binary: true});
             }
-            console.log(eleData);
-            this.originalDatas.push({data: eleData, fileName: `重庆标准交换数据(${FILE_KIND[exportKind]}).QTF`});
-        };
+            let zipFile = await zip.generateAsync({type: 'blob'});
+            saveAs(zipFile, '重庆标准交换数据.zip');
+        }
     }
+
+    return {
+        entry,
+        resetContentCode,
+        saveAsFile
+    };
 })();

+ 65 - 45
web/building_saas/main/js/models/exportStdInterfaceBase.js

@@ -18,6 +18,13 @@ const XML_EXPORT_BASE = (() => {
         NUM2: 5,        //数值类型2:最多两位小数
         BOOL: 6         //布尔型
     };
+    // 需要特殊处理的属性类型默认空值(当一个值为undefined、null的时候,默认给赋什么值)
+    const DEFAULT_VALUE = {
+        [TYPE.INT]: '0',
+        [TYPE.DECIMAL]: '0',
+        [TYPE.NUM2]: '0',
+        [TYPE.BOOL]: 'false'
+    };
     // 空白字符处理
     const WHITE_SPACE = {
         COLLAPSE: 1 //移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)
@@ -62,7 +69,7 @@ const XML_EXPORT_BASE = (() => {
         // 失败列表
         failList: [],
         // 项目数据(不包含详细数据,项目管理数据)
-        projectsData: {},
+        projectData: {},
         // 当前导出类型,默认投标
         exportKind: EXPORT_KIND.Tender,
         // 记录拉取的单位工程项目详细数据,导出的时候,可能会导出多个文件,只有导出第一个文件的时候需要请求数据
@@ -157,7 +164,11 @@ const XML_EXPORT_BASE = (() => {
         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) {
             // 值统一转换成String
-            data.value = !isDef(data.value) ? '' : String(data.value);
+            data.value = !isDef(data.value)
+                ? DEFAULT_VALUE[data.type]
+                    ? DEFAULT_VALUE[data.type]
+                    : ''
+                : 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();
@@ -368,13 +379,13 @@ const XML_EXPORT_BASE = (() => {
     * @return {Object} 返回的数据结构:{children: [{children: []}]} 最外层为建设项目,中间为单项工程,最底层为单位工程
     * */
     async function getProjectByGranularity(granularity, tenderID, userID) {
-        let projectsData = _cache.projectsData;
+        let projectData = _cache.projectData;
         // 没有数据,需要拉取
-        if (!Object.keys(projectsData).length) {
-            projectsData = await ajaxPost('/pm/api/getProjectByGranularity', {user_id: userID, tenderID: tenderID, granularity: granularity});
-            _cache.projectsData =  projectsData;
+        if (!Object.keys(projectData).length) {
+            projectData = await ajaxPost('/pm/api/getProjectByGranularity', {user_id: userID, tenderID: tenderID, granularity: granularity});
+            _cache.projectData =  projectData;
         }
-        return projectsData;
+        return projectData;
     }
 
     /*
@@ -396,14 +407,14 @@ const XML_EXPORT_BASE = (() => {
 
     /*
      * 提取要导出的数据
-     * @param  {Function}entryFuc 提取数据的入口方法
+     * @param  {Function}entryFunc 提取数据的入口方法
      *         {Number}granularity 导出粒度: 1-建设项目、2-单项工程、3-单位工程
      *         {Number}exportKind 导出的文件类型:1-投标、2-招标、3-控制价
      *         {Number}tenderID 单位工程ID
      *         {String}userID 用户ID
-     * @return {Object} 数据结构为:{name: 'elementName', attrs: [...], children: [...], fail: [...]}
+     * @return {Array} 数据结构为:[{data: Object, exportKind: Number, fileName: String}]
      * */
-    async function extractExportData({entryFuc, granularity, exportKind, tenderID, userID}) {
+    async function extractExportData(entryFunc, granularity, exportKind, tenderID, userID) {
         // 默认导出建设项目
         if (!granularity || ![1, 2, 3].includes(granularity)) {
             granularity = GRANULARITY.PROJECT;
@@ -413,16 +424,17 @@ const XML_EXPORT_BASE = (() => {
             exportKind = EXPORT_KIND.Tender;
         }
         // 拉取标段数据:建设项目、单项工程、单位工程数据
-        let projectsData = await getProjectByGranularity(granularity, tenderID, userID);
-        if (!projectsData) {
+        let projectData = await getProjectByGranularity(granularity, tenderID, userID);
+        if (!projectData) {
             throw '获取项目数据错误';
         }
         // 单项工程、单位工程按照树结构数据进行排序
-        projectsData.children = sortByNext(projectsData.children);
-        for (let engData of projectsData.children) {
+        projectData.children = sortByNext(projectData.children);
+        for (let engData of projectData.children) {
             engData.children = sortByNext(engData.children);
         }
-
+        // 提取相关项目的详细导出数据
+        return await entryFunc(userID, exportKind, projectData);
     }
 
     //转换基数表达式
@@ -488,7 +500,7 @@ const XML_EXPORT_BASE = (() => {
             return matchs || [];
         }
     }
-    //转换基数说明,根据转换后的基数处理
+    // 转换基数说明,根据转换后的基数处理
     //1.行引用转换为对应行的名称
     //2.基数字典转换为中文
     function transformCalcBaseState(tenderDetail, expr, CalcStateMap) {
@@ -535,11 +547,11 @@ const XML_EXPORT_BASE = (() => {
         return newExpr;
     }
     // 获取工程编号表格相关数据(导出需要弹出工程编号让用户选择)
-    function getCodeSheetData(PMData) {
+    function getCodeSheetData(projectData) {
         let curCode = '0';
         let sheetData = [];
-        sheetData.push(getObj(PMData));
-        PMData.children.forEach(eng => {
+        sheetData.push(getObj(projectData));
+        projectData.children.forEach(eng => {
             sheetData.push(getObj(eng));
             eng.children.forEach(tender => {
                 sheetData.push(getObj(tender));
@@ -563,7 +575,7 @@ const XML_EXPORT_BASE = (() => {
         }
     }
     // 从srcEle节点中获取元素名为eleName的元素
-    function _getElementFromSrc(srcEle, eleName) {
+    function getElementFromSrc(srcEle, eleName) {
         if (!srcEle || !srcEle.children || !srcEle.children.length) {
             return [];
         }
@@ -585,10 +597,10 @@ const XML_EXPORT_BASE = (() => {
         // 给导出数据里的单项工程、单位工程填上用户设置的工程编号
         exportData.forEach(orgData => {
             let curIdx = 0;
-            let engs = _getElementFromSrc(orgData.data, EngineeringName);
+            let engs = getElementFromSrc(orgData.data, EngineeringName);
             engs.forEach(eng => {
                 eng.attrs.find(attr => attr.name === codeName).value = parsedCodes[curIdx++];
-                let tenders = _getElementFromSrc(eng, tenderName);
+                let tenders = getElementFromSrc(eng, tenderName);
                 tenders.forEach(tender => {
                     tender.attrs.find(attr => attr.name === codeName).value = parsedCodes[curIdx++];
                 });
@@ -611,6 +623,8 @@ const XML_EXPORT_BASE = (() => {
         transformCalcBase,
         transformCalcBaseState,
         getCodeSheetData,
+        getElementFromSrc,
+        getParsedData,
         setupCode
     });
 
@@ -677,32 +691,37 @@ const XML_EXPORT_BASE = (() => {
         }
     }
 
-
-    // 将数据转换为xml文件并导出
-    async function exportFile(originalDatas) {
-        let fileDatas = [];
-        //源数据转换成blob
-        for (let orgData of originalDatas) {
-            //转换成xml字符串
-            let xmlStr = _toXMLStr([orgData.data]);
-            //加上xml声明
+    /*
+    * 根据各自费用定额的文件结构,导出文件
+    * 每个费用定额可能导出的结果文件都不同
+    * 比如广东18需要将一个建设项目文件,多个单位工程文件打包成一个zip文件。重庆18就没这种要求
+    * @param  {Array}codes 工程编号数据
+    *         {Array}extractData 提取的数据
+    *         {Function}setCodeFunc 各自费用定额的导出前重设用户输入的工程编号方法
+    *         {Function}saveAsFunc 各自费用定额的导出方法
+    * @return {void}
+    * */
+    async function exportFile(codes, extractData, setCodeFunc, saveAsFunc) {
+        // 编号重置后将会被导出,需要将编号进行xml字符实体转换
+        codes = getParsedData(codes);
+        setCodeFunc(codes, extractData);
+        // 获取文件数据
+        let fileData = extractData.map(extractObj => {
+            // 转换成xml字符串
+            let xmlStr = _toXMLStr([extractObj.data]);
+            // 加上xml声明
             xmlStr = `<?xml version="1.0" encoding="utf-8"?>${xmlStr}`;
-            //格式化
+            // 格式化
             xmlStr = _formatXml(xmlStr);
             let blob = new Blob([xmlStr], {type: 'text/plain;charset=utf-8'});
-            fileDatas.push({blob: blob, fileName: orgData.fileName});
-        }
-        //导出文件
-        if (fileDatas.length === 1) {
-            saveAs(fileDatas[0].blob, fileDatas[0].fileName);
-        } else if (fileDatas.length > 1) { //导出压缩包
-            let zip = new JSZip();
-            for (let file of fileDatas) {
-                zip.file(file.fileName, file.blob, {binary: true});
-            }
-            let zipFile = await zip.generateAsync({type: 'blob'});
-            saveAs(zipFile, '重庆标准交换数据.zip');
-        }
+            return {
+                blob: blob,
+                exportKind: extractObj.exportKind,
+                fileName: extractObj.fileName
+            };
+        });
+        // 导出
+        await saveAsFunc(fileData);
     }
     
     return {
@@ -710,6 +729,7 @@ const XML_EXPORT_BASE = (() => {
         CACHE,
         UTIL,
         Element,
+        extractExportData,
         exportFile
     };
 })();

+ 20 - 21
web/building_saas/main/js/views/export_view.js

@@ -11,7 +11,8 @@
 const ExportView = (() => {
     let _base = XML_EXPORT_BASE,
         _cache = _base.CACHE;
-    let xmlObj = null;
+    // 导出数据缓存
+    let _exportCache = [];
     //设置工程编号表格数据设置
     const sheetSetting = {
         header: [
@@ -48,13 +49,13 @@ const ExportView = (() => {
         let rst = [];
         //排除建设项目行
         for (let row = 1; row < sheet.getRowCount(); row++) {
-            rst.push(sheet.getValue(row, codeCol) || '');
+            rst.push(sheet.getText(row, codeCol) || '');
         }
         return rst;
     }
     // 回到初始状态,需要清空cache中的数据
     function resetState() {
-        xmlObj = null;
+        _exportCache = [];
         _cache.clear();
     }
     //事件监听
@@ -72,12 +73,13 @@ const ExportView = (() => {
             STATE.checking = true;
             let pr = new SCComponent.InitProgressBar();
             try {
-                if (!xmlObj || !xmlObj.originalDatas.length) {
+                if (!_exportCache || !_exportCache.length) {
                     pr.start('导出数据接口', '正在自检,请稍候……');
-                    xmlObj = new XMLStandard(userID, 1);
                     for (let checkedData of checkedDatas) {
-                        let fileKind = $(checkedData).val();
-                        await xmlObj.transformData(projectObj.project.ID(), fileKind);
+                        let fileKind = parseInt($(checkedData).val());
+                        let exportData = await _base.extractExportData(XMLStandard.entry, _base.CONFIG.GRANULARITY.PROJECT,
+                                fileKind, projectObj.project.ID(), userID);
+                        _exportCache.push(...exportData);
                     }
                 }
                 //设置提示弹窗
@@ -111,13 +113,14 @@ const ExportView = (() => {
             let pr = new SCComponent.InitProgressBar();
             try {
                 let isPring = false;    //是否调用了进度条(控制工程窗口什么时候显示,优化交互)
-                if (!xmlObj || !xmlObj.originalDatas.length) {
+                if (!_exportCache || !_exportCache.length) {
                     isPring = true;
                     pr.start('导出数据接口', '正在导出文件,请稍候……');
-                    xmlObj = new XMLStandard(userID, 1);
                     for (let checkedData of checkedDatas) {
-                        let fileKind = $(checkedData).val();
-                        await xmlObj.transformData(projectObj.project.ID(), fileKind);
+                        let fileKind = parseInt($(checkedData).val());
+                        let exportData = await _base.extractExportData(XMLStandard.entry, _base.CONFIG.GRANULARITY.PROJECT,
+                            fileKind, projectObj.project.ID(), userID);
+                        _exportCache.push(...exportData);
                     }
                     pr.end();
                 }
@@ -138,6 +141,7 @@ const ExportView = (() => {
                     $('#exportCode').modal('show');
                 }
             } catch (err) {
+                console.log(err);
                 pr.end();
                 alert(err);
             }
@@ -148,17 +152,17 @@ const ExportView = (() => {
         //工程编号设置窗口-----
         //设置工程编号
         $('#exportCode').on('shown.bs.modal', function () {
-            if (!xmlObj) {
+            if (!_exportCache || !_exportCache.length) {
                 alert('数据错误!');
                 $(this).modal('hide');
                 return false;
             }
-            let projectsData = _cache.getItem('projectsData');
-            initSpread(XML_EXPORT_BASE.UTIL.getCodeSheetData(projectsData));
+            let projectData = _cache.getItem('projectData');
+            initSpread(XML_EXPORT_BASE.UTIL.getCodeSheetData(projectData));
         });
         //设置完工程编号后,导出数据。如果选中多个文件,导出压缩包
         $('#exportCode-confirm').click(async function () {
-            if (!spread || !xmlObj) {
+            if (!spread || !_exportCache || !_exportCache.length) {
                 return false;
             }
             if (STATE.confirming) {
@@ -179,15 +183,13 @@ const ExportView = (() => {
                     STATE.confirming = false;
                     return false;
                 }
-                XML_EXPORT_BASE.UTIL.setupCode(xmlObj.originalDatas, codes, '单项工程', '单位工程', '编号');
                 pr.start('导出数据接口', '正在导出文件,请稍候……');
                 // 导出文件
-                await XML_EXPORT_BASE.exportFile(xmlObj.originalDatas);
+                await _base.exportFile(codes, _exportCache, XMLStandard.resetContentCode, XMLStandard.saveAsFile);
             } catch (err) {
                 console.log(err);
                 alert(err);
             }
-            console.log(xmlObj);
             pr.end();
             $('#exportCode').modal('hide');
             $('#export').modal('hide');
@@ -197,9 +199,6 @@ const ExportView = (() => {
 
         });
         //导出窗口--------
-        $('#export').on('show.bs.modal', function () {
-            xmlObj = null;
-        });
         $('#export').on('hide.bs.modal', function() {
             resetState();
             STATE.checking = false;

+ 0 - 34
web/building_saas/pm/js/pm_newMain.js

@@ -1044,15 +1044,6 @@ const projTreeObj = {
             let node = tree.items[hitinfo.row];
             let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
             let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;
-            let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
-            let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
-            let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
-                zoom = hitinfo.sheet.zoom();
-            let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
-            //(图标+名字)区域
-            function withingClickArea(){
-                return hitinfo.x > centerX + halfBoxLength && hitinfo.x < centerX + halfBoxLength + imgWidth + indent/2+3 + textLength;
-            }
             if(hitinfo.sheet.name() === "projectSheet"){//只有项目管理界面才执行
                 if(node.data.projType === projectType.tender){
                     let thisClick = Date.now(),
@@ -1087,25 +1078,9 @@ const projTreeObj = {
                 hitinfo.sheet.repaint();
             }
         };
-        /*TreeNodeCellType.prototype.processMouseMove = function (hitInfo) {
-            let sheet = hitInfo.sheet;
-            let div = sheet.getParent().getHost();
-            let canvasId = div.id + "vp_vp";
-            let canvas = $(`#${canvasId}`)[0];
-            let node = tree.items[hitInfo.row];
-            //改变鼠标图案
-            if (sheet && hitInfo.isReservedLocation) {
-                canvas.style.cursor='pointer';
-                return true;
-            }else{
-                canvas.style.cursor='default';
-            }
-            return false;
-        };*/
         TreeNodeCellType.prototype.processMouseEnter = function (hitinfo) {
             let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
             let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
-            let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
             let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
                 zoom = hitinfo.sheet.zoom();
             let node = me.tree.items[hitinfo.row];
@@ -1117,7 +1092,6 @@ const projTreeObj = {
             }
         };
         TreeNodeCellType.prototype.processMouseLeave = function (hitinfo) {
-            let me = this;
             TREE_SHEET_HELPER.tipDiv = 'hide';
             if (TREE_SHEET_HELPER._toolTipElement) {
                 $(TREE_SHEET_HELPER._toolTipElement).hide();
@@ -1528,7 +1502,6 @@ const projTreeObj = {
             children.push(newNode);
             for(let c of children){
                 sheet.getCell(c.serialNo(), 0).cellType(me.getTreeNodeCell(me.tree));
-                // me.refreshNodeData(c);
             }
             refreshNodes = refreshNodes.concat(children);
             me.refreshNodeData(refreshNodes);
@@ -1676,7 +1649,6 @@ $(document).ready(function() {
     //列宽随着屏幕改变
     $(window).resize(function () {
         sheetCommonObj.setColumnWidthByRate(getWorkBookWidth(), gcTreeObj.workBook, gcTreeObj.setting.header);
-        //sheetCommonObj.setColumnWidthByRate(getWorkBookWidth(), pmShare.spreadObj.workBook, pmShare.headers);
 
     });
 
@@ -1690,12 +1662,6 @@ $(document).ready(function() {
         init();
     });
 
-    // 侧滑数据
-   /* $(".poj-list").on('click', ".open-sidebar", function() {
-        setDataToSideBar();
-        $(".slide-sidebar").animate({width:"800"}).addClass("open");
-    });*/
-
     //单价、费率文件删除确认
     $('#fileDelConfirm').click(function () {
         if(fileDelObj && fileDelObj.id){

+ 0 - 32
web/building_saas/pm/js/pm_share.js

@@ -353,25 +353,8 @@ const pmShare = (function () {
             let node = tree.items[hitinfo.row];
             let centerX = hitinfo.cellRect.x + offset + node.depth() * indent + node.depth() * levelIndent + indent / 2;
             let centerY = (hitinfo.cellRect.y + offset + (hitinfo.cellRect.y + offset + hitinfo.cellRect.height)) / 2;
-            let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
-            let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
-            let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
-                zoom = hitinfo.sheet.zoom();
-            let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
-            //(图标+名字)区域
-            function withingClickArea(){
-                return hitinfo.x > centerX + halfBoxLength && hitinfo.x < centerX + halfBoxLength + imgWidth + indent/2+3 + textLength;
-            }
             //点击单位工程
             if(node.data.projType === projectType.tender){
-                /*let newTab = window.open('about:blank');
-                //打开项目的实际ID
-                BeforeOpenProject(node.data.actualTreeInfo.ID, {'fullFolder': GetFullFolder(node.parent)}, function () {
-                    let mainUrl = `/main?project=${node.data.actualTreeInfo.ID}`;
-                    CommonAjax.get(mainUrl, [], function () {
-                        newTab.location.href = mainUrl;
-                    });
-                });*/
                 let thisClick = Date.now(),
                     open = false;
                 if (this.preNode === node && this.preClick && thisClick - this.preClick <= 300) {
@@ -399,24 +382,9 @@ const pmShare = (function () {
                 hitinfo.sheet.repaint();
             }
         };
-        /*TreeNodeCellType.prototype.processMouseMove = function (hitInfo) {
-            let sheet = hitInfo.sheet;
-            let div = sheet.getParent().getHost();
-            let canvasId = div.id + "vp_vp";
-            let canvas = $(`#${canvasId}`)[0];
-            //改变鼠标图案
-            if (sheet && hitInfo.isReservedLocation) {
-                canvas.style.cursor='pointer';
-                return true;
-            }else{
-                canvas.style.cursor='default';
-            }
-            return false;
-        };*/
         TreeNodeCellType.prototype.processMouseEnter = function (hitinfo) {
             let text = hitinfo.sheet.getText(hitinfo.row, hitinfo.col);
             let value = hitinfo.sheet.getValue(hitinfo.row, hitinfo.col);
-            let tag = hitinfo.sheet.getTag(hitinfo.row, hitinfo.col);
             let acStyle = hitinfo.sheet.getActualStyle(hitinfo.row, hitinfo.col),
                 zoom = hitinfo.sheet.zoom();
             let node = tree.items[hitinfo.row];