瀏覽代碼

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

chenshilong 7 年之前
父節點
當前提交
cef81fd043

+ 21 - 1
modules/pm/facade/pm_facade.js

@@ -488,6 +488,18 @@ function summarizeToParent(parent, child) {
     parent.tax = scMathUtil.roundTo(parseFloat(parent.tax) + parseFloat(child.tax), decimal);
 }
 
+function getBuildingArea(projFeature){
+    if(!projFeature || projFeature.length === 0){
+        return null;
+    }
+    for(let f of projFeature){
+        if(f.key === 'buildingArea'){
+            return f.value;
+        }
+    }
+    return null;
+}
+
 async function getSummaryInfo(projectIDs){
     //ID与汇总信息映射
     let IDMapping = {};
@@ -521,6 +533,10 @@ async function getSummaryInfo(projectIDs){
         for(let tender of tenders){
             tenderIDs.push(tender.ID);
             IDMapping[tender.ID] = {engineeringCost: 0, subEngineering: 0, measure: 0, safetyConstruction: 0, other: 0, charge: 0, tax: 0, rate: 0, buildingArea: '', perCost: ''};
+            let buildingArea = getBuildingArea(tender.property.projectFeature);
+            if(buildingArea){
+                IDMapping[tender.ID]['buildingArea'] = buildingArea;
+            }
         }
         //需要获取的清单固定类别综合合价:工程造价、分部分项、措施项目、安全文明施工专项、规费、其他项目、税金
         let needFlags = [billsFlags.ENGINEERINGCOST, billsFlags.SUB_ENGINERRING, billsFlags.MEASURE,
@@ -542,12 +558,16 @@ async function getSummaryInfo(projectIDs){
         for(let eng of engineerings){
             summarizeToParent(IDMapping[eng.ParentID], IDMapping[eng.ID]);
         }
-        //占造价比例
+        //占造价比例、单方造价
         const rateDecimal = -2;
+        const perCostDecimal = -2;
         for(let tender of tenders){
             let tenderInfo = IDMapping[tender.ID];
             let engInfo = IDMapping[tender.ParentID];
             tenderInfo.rate = engInfo.engineeringCost == 0 ? 0 : scMathUtil.roundTo(tenderInfo.engineeringCost * 100 / engInfo.engineeringCost, rateDecimal);
+            //单方造价
+            tenderInfo.perCost = tenderInfo.buildingArea.toString().trim() === '' || tenderInfo.buildingArea == 0 ?
+                                 tenderInfo.buildingArea.toString().trim() : scMathUtil.roundTo(tenderInfo.engineeringCost / tenderInfo.buildingArea, perCostDecimal);
         }
         for(let eng of engineerings){
             let engInfo = IDMapping[eng.ID];

+ 155 - 51
modules/reports/controllers/rpt_controller.js

@@ -269,15 +269,17 @@ module.exports = {
         let params = JSON.parse(req.body.params),
             prj_id = params.prj_id,
             rpt_ids = params.rpt_ids.split(','),
+            pageSize = params.pageSize,
+            orientation = params.orientation,
             customizeCfg = params.custCfg,
             option = params.option;
         let user_id = req.session.sessionUser.id;
-        let parallelFucs = [];
+        let parallelFunctions = [];
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
         for (let id of rpt_ids) {
-            parallelFucs.push((function (rpt_id) {
+            parallelFunctions.push((function (rpt_id) {
                 return function (cb) {
-                    getAllPagesCommon(user_id, prj_id, rpt_id, null, null, customizeCfg, dftOption, function (err, pageRst) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
                         if(err){
                             cb(err);
                         }
@@ -288,7 +290,7 @@ module.exports = {
                 }
             })(parseInt(id)));
         }
-        async.parallel(parallelFucs, function (err, pageRstArray) {
+        async.parallel(parallelFunctions, function (err, pageRstArray) {
             if (err) {
                 callback(req, res, '数据有误', null);
             } else {
@@ -312,14 +314,106 @@ module.exports = {
         });
     },
 
-    getTestReportAllPages: function(req, res){
-        let rpt_id = req.body.ID;
-        let pageSize = req.body.pageSize;
-        getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
-            //fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
-            callback(req, res, err, pageRst);
+    createExcelFilesInOneBook: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            prj_id = params.prj_id,
+            rpt_ids = params.rpt_ids,
+            rptName = params.rptName,
+            pageSize = params.pageSize,
+            orientation = params.orientation,
+            customizeCfg = params.custCfg,
+            option = params.option;
+        let user_id = req.session.sessionUser.id;
+        let parallelFunctions = [];
+        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+        for (let idx = 0; idx < rpt_ids.length; idx++) {
+            let r_id = rpt_ids[idx];
+            parallelFunctions.push((function (rpt_id) {
+                return function (cb) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
+                        if(err){
+                            cb(err);
+                        }
+                        else{
+                            cb(err, pageRst);
+                        }
+                    })
+                }
+            })(parseInt(r_id)));
+        }
+        async.parallel(parallelFunctions, function (err, pageRstArray) {
+            if (err) {
+                callback(req, res, '数据有误', null);
+            } else {
+                rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(uuidName){
+                    let fileRst = {uuid: uuidName, reportName: rptName};
+                    callback(req, res, err, fileRst);
+                });
+            }
         })
     },
+
+    createExcelFiles: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            prj_id = params.prj_id,
+            rpt_ids = params.rpt_ids,
+            rpt_names = params.rpt_names,
+            pageSize = params.pageSize,
+            orientation = params.orientation,
+            isOneSheet = params.isOneSheet,
+            customizeCfg = params.custCfg,
+            option = params.option;
+        let user_id = req.session.sessionUser.id;
+        let parallelFunctions = [];
+        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+        for (let idx = 0; idx < rpt_ids.length; idx++) {
+            let r_id = rpt_ids[idx];
+            let r_name = rpt_names[idx];
+            parallelFunctions.push((function (rpt_id, rpt_name) {
+                return function (cb) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
+                        if(err){
+                            cb(err);
+                        }
+                        else{
+                            rpt_xl_util.exportExcel(pageRst, pageSize, rpt_name, isOneSheet, null, null, function(uuidName){
+                                let fileRst = {uuid: uuidName, reportName: rpt_name};
+                                cb(err, fileRst);
+                            })
+                        }
+                    })
+                }
+            })(parseInt(r_id), r_name));
+        }
+        async.parallel(parallelFunctions, function (err, fileRstArray) {
+            if (err) {
+                callback(req, res, '数据有误', null);
+            } else {
+                // console.log(err);
+                callback(req, res, err, fileRstArray);
+            }
+        })
+    },
+    getExcelByUUID: function (req, res) {
+        let uuid = req.params.uuid,
+            rptName = req.params.rptName
+        ;
+        // let user_id = req.session.sessionUser.id; //未来要校验user id
+        try {
+            res.setHeader('Content-Type', 'application/vnd.openxmlformats');
+            let rptNameURI = encodeURI(rptName);
+            res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx' );
+            let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + uuid + '.xlsx');
+            filestream.on('data', function(chunk) {
+                res.write(chunk);
+            });
+            filestream.on('end', function() {
+                res.end();
+            });
+        } catch (e) {
+            console.log(e);
+        }
+    },
     getExcel: function(req, res) {
         let prj_id = req.params.prj_id,
             rpt_id = req.params.rpt_id,
@@ -327,16 +421,18 @@ module.exports = {
             orientation = req.params.orientation,
             rptName = req.params.rptName,
             isOneSheet = req.params.isOneSheet,
-            option = req.params.option;
+            option = req.params.option
+        ;
+        let customizeCfg = null;
         let user_id = req.session.sessionUser.id;
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, dftOption, function(err, pageRst){
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function(err, pageRst){
             try {
-                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(newName){
+                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(uuidName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     let rptNameURI = encodeURI(rptName);
                     res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".xlsx\"; filename*=utf-8''" + rptNameURI + '.xlsx' );
-                    let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
+                    let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + uuidName + '.xlsx');
                     filestream.on('data', function(chunk) {
                         res.write(chunk);
                     });
@@ -356,10 +452,10 @@ module.exports = {
             rptName = req.params.rptName,
             option = req.params.option;
         let user_id = req.session.sessionUser.id;
-        let parallelFucs = [];
+        let parallelFunctions = [];
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
         for (let id of rpt_ids) {
-            parallelFucs.push((function (rpt_id) {
+            parallelFunctions.push((function (rpt_id) {
                 return function (cb) {
                     getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, null, null, dftOption, function (err, pageRst) {
                         if(err){
@@ -372,7 +468,7 @@ module.exports = {
                 }
             })(parseInt(id)));
         }
-        async.parallel(parallelFucs, function (err, pageRstArray) {
+        async.parallel(parallelFunctions, function (err, pageRstArray) {
             if (err) {
                 callback(req, res, '数据有误', null);
             } else {
@@ -391,6 +487,41 @@ module.exports = {
             }
         })
     },
+    getPDF:function (req, res) {
+        let prj_id = req.params.prj_id,
+            rpt_id = req.params.rpt_id,
+            pageSize = req.params.size,
+            orientation = req.params.orientation,
+            rptName = req.params.rptName
+        ;
+        let user_id = req.session.sessionUser.id;
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
+            rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (uuidName) {
+                res.setHeader('Content-Type', 'application/vnd.openxmlformats');
+                // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
+                let rptNameURI = encodeURI(rptName);
+                res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI + ".pdf" );
+
+                let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + uuidName + '.pdf');
+                filestream.on('data', function(chunk) {
+                    res.write(chunk);
+                });
+                filestream.on('end', function() {
+                    res.end();
+                });
+            })
+
+        })
+
+    },
+    getTestReportAllPages: function(req, res){
+        let rpt_id = req.body.ID;
+        let pageSize = req.body.pageSize;
+        getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
+            //fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
+            callback(req, res, err, pageRst);
+        })
+    },
     getTestExcel: function(req, res) {
         let rpt_id = req.params.id,
             pageSize = req.params.size,
@@ -401,10 +532,10 @@ module.exports = {
         getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function(err, pageRst){
             fs.writeFileSync('D:/GitHome/ConstructionOperation/tmp/testRpt.js', JSON.stringify(pageRst));
             try {
-                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(newName){
+                rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, null, function(uuidName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                     res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".xlsx");
-                    let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.xlsx');
+                    let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + uuidName + '.xlsx');
                     filestream.on('data', function(chunk) {
                         res.write(chunk);
                     });
@@ -422,10 +553,10 @@ module.exports = {
             pageSize = req.params.size,
             rptName = req.params.rptName,
             option = req.params.option;
-        let parallelFucs = [];
+        let parallelFunctions = [];
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
         for (let id of rpt_ids) {
-            parallelFucs.push((function (rpt_id) {
+            parallelFunctions.push((function (rpt_id) {
                 return function (cb) {
                     getAllPagesCommonOrg(rpt_id, pageSize, dftOption, function (err, pageRst) {
                         if(err){
@@ -438,7 +569,7 @@ module.exports = {
                 }
             })(parseInt(id)));
         }
-        async.parallel(parallelFucs, function (err, pageRstArray) {
+        async.parallel(parallelFunctions, function (err, pageRstArray) {
             if (err) {
                 callback(req, res, '数据有误', null);
             } else {
@@ -457,46 +588,19 @@ module.exports = {
             }
         })
     },
-    getPDF:function (req, res) {
-        let prj_id = req.params.prj_id,
-            rpt_id = req.params.rpt_id,
-            pageSize = req.params.size,
-            orientation = req.params.orientation,
-            rptName = req.params.rptName
-        ;
-        let user_id = req.session.sessionUser.id;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
-            rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
-                res.setHeader('Content-Type', 'application/vnd.openxmlformats');
-                // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
-                let rptNameURI = encodeURI(rptName);
-                res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI + ".pdf" );
-
-                let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
-                filestream.on('data', function(chunk) {
-                    res.write(chunk);
-                });
-                filestream.on('end', function() {
-                    res.end();
-                });
-            })
-
-        })
-
-    },
     getTestPDF:function (req, res) {
         let rpt_id = req.params.id,
             pageSize = req.params.size,
             rptName = req.params.rptName;
 
         getAllPagesCommonOrg(rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
-            rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
+            rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (uuidName) {
                 res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                 // res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");
                 let rptNameURI = encodeURI(rptName);
                 res.setHeader("Content-Disposition", "attachment; filename=\"" + rptNameURI + ".pdf\"; filename*=utf-8''" + rptNameURI + ".pdf"  );
 
-                let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + newName + '.pdf');
+                let filestream = fs.createReadStream(__dirname.slice(0, __dirname.length - 28) + '/tmp/' + uuidName + '.pdf');
                 filestream.on('data', function(chunk) {
                     res.write(chunk);
                 });

+ 3 - 0
modules/reports/routes/report_router.js

@@ -27,8 +27,11 @@ module.exports =function (app) {
     rptRouter.post('/getReport', reportController.getReportAllPages);
     rptRouter.post('/getReportSvg', reportController.getReportAllPagesSvg);
     rptRouter.post('/getMultiReports', reportController.getMultiReports);
+    rptRouter.post('/createExcelFiles', reportController.createExcelFiles);
+    rptRouter.post('/createExcelFilesInOneBook', reportController.createExcelFilesInOneBook);
     rptRouter.get('/getExcelInOneBook/:prj_id/:rpt_ids/:size/:rptName/:option', reportController.getExcelInOneBook);
     rptRouter.get('/getExcel/:prj_id/:rpt_id/:size/:orientation/:rptName/:isOneSheet/:option', reportController.getExcel);
+    rptRouter.get('/getExcelByUUID/:uuid/:rptName', reportController.getExcelByUUID);
     rptRouter.get('/getPDF/:prj_id/:rpt_id/:size/:orientation/:rptName', reportController.getPDF);
     // rptRouter.get('/getExcelInOneBook/:ids/:size/:rptName/:option', reportController.getExcelInOneBook);
 

+ 11 - 3
modules/reports/util/rpt_excel_util.js

@@ -9,6 +9,7 @@ let jpcCmnHelper = require('../rpt_component/helper/jpc_helper_common');
 let DPI = jpcCmnHelper.getScreenDPI()[0];
 let fsUtil = require('../../../public/fsUtil');
 const dftHeadXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
+const uuidV1 = require('uuid/v1');
 
 function writeContentTypes(sheets, isSinglePage) {
     let rst = [];
@@ -157,6 +158,9 @@ function writeStyles(stylesObj){
         if (strUtil.convertStrToBoolean(font[JV.FONT_PROPS[3]])) {
             rst.push('<b/>');
         }
+        if (strUtil.convertStrToBoolean(font[JV.FONT_PROPS[4]])) {
+            rst.push('<i/>');
+        }
         if (strUtil.convertStrToBoolean(font[JV.FONT_PROPS[5]])) {
             rst.push('<u/>');
         }
@@ -443,7 +447,8 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
             if (sheetFont) {
                 // if (font[JV.FONT_PROPS[0]] === sheetFont[JV.FONT_PROPS[0]] && font.size === Math.round(sheetFont[JV.FONT_PROPS[1]] * 3 / 4)
                 if (font[JV.FONT_PROPS[0]] === sheetFont[JV.FONT_PROPS[0]] && font.size === Math.floor(sheetFont[JV.FONT_PROPS[1]] * 3 / 4)
-                    && font[JV.FONT_PROPS[3]] === sheetFont[JV.FONT_PROPS[3]] && font[JV.FONT_PROPS[5]] === sheetFont[JV.FONT_PROPS[5]]) {
+                    && font[JV.FONT_PROPS[3]] === sheetFont[JV.FONT_PROPS[3]] && font[JV.FONT_PROPS[4]] === sheetFont[JV.FONT_PROPS[4]]
+                    && font[JV.FONT_PROPS[5]] === sheetFont[JV.FONT_PROPS[5]] ) {
                     hasFont = true;
                     rst = i;
                     break;
@@ -460,6 +465,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
             font.charset = 134;
             font.colorIdx = "8";
             font[JV.FONT_PROPS[3]] = sheetFont[JV.FONT_PROPS[3]]; //font bold
+            font[JV.FONT_PROPS[4]] = sheetFont[JV.FONT_PROPS[4]]; //font italic
             font[JV.FONT_PROPS[5]] = sheetFont[JV.FONT_PROPS[5]]; //font underline
             stylesObj.fonts.push(font);
             rst = stylesObj.fonts.length - 1;
@@ -818,7 +824,7 @@ function mergeProperties(orgObj, newObj) {
 module.exports = {
     exportExcel: function (pageData, paperSize, fName, options, custSheetNames, custSheetMergeBands, callback) {
         let rptOptions = ({singlePage: false, fileName: 'report'});
-        if (options === 'true') {
+        if (options === 'true' || options === true) {
             rptOptions.singlePage = true;
         }
         let isSinglePage = rptOptions.singlePage;
@@ -891,7 +897,9 @@ module.exports = {
         zip_xl.file(file, data.join(''), {compression: 'DEFLATE'});
 
         if (fName) {
-            let newName = '' + (new Date()).valueOf();
+            // let newName = '' + (new Date()).valueOf();
+            let newName = uuidV1();
+
             zip.generateNodeStream({type:'nodebuffer',streamFiles:true})
                 .pipe(fs.createWriteStream(__dirname.slice(0, __dirname.length - 21) + '/tmp/' + newName + '.xlsx'))
                 .on('finish', function () {

+ 5 - 4
modules/reports/util/rpt_pdf_util.js

@@ -10,22 +10,23 @@ let fs = require('fs');
 let jpcCmnHelper = require('../rpt_component/helper/jpc_helper_common');
 let DPI = jpcCmnHelper.getScreenDPI()[0];
 let JV = require('../rpt_component/jpc_value_define');
+const uuidV1 = require('uuid/v1');
 
 // hwxsb.ttf: 华文中宋
 // Smart.ttf: 宋体(常规)
 // Smart-italic.ttf: 宋体(斜体)
-//目前不支持下划线
+// 目前不支持下划线
 
-module.exports ={
+module.exports = {
     export_pdf_file:export_pdf_file
 }
 
-
 function export_pdf_file (pageData, paperSize, fName, callback) {
     let offsetX= 10;
     let offsetY=10;
     let doc = new pdf({autoFirstPage: false});
-    let newName = '' + (new Date()).valueOf();
+    // let newName = '' + (new Date()).valueOf();
+    let newName = uuidV1();
     let stream = doc.pipe(fs.createWriteStream(__dirname.slice(0, __dirname.length - 21) + '/tmp/'+newName+'.pdf'));
     let pageObj = pageData;
     // doc.rect(5,5,1190,890).lineWidth(1).strokeColor('black').stroke();//边框

+ 34 - 16
web/building_saas/main/html/main.html

@@ -587,13 +587,17 @@
                                             <div class="row m-0">
                                                 <div class="col-sm-3">
                                                     <div class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">单价</div>
+                                                        <div class="input-group-prepend">
+                                                            <span class="input-group-text">单价</span>
+                                                        </div>
                                                         <input type="number" name="bills-unitPrice" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                 </div>
                                                 <div class="col-sm-3">
                                                     <div class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">合价</div>
+                                                        <div class="input-group-prepend">
+                                                            <span class="input-group-text">合价</span>
+                                                        </div>
                                                         <input type="number" name="bills-totalPrice" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                 </div>
@@ -602,40 +606,52 @@
                                             <div class="row m-0">
                                                 <div class="col-sm-3">
                                                     <div class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">工程量</div>
+                                                        <div class="input-group-prepend">
+                                                            <span class="input-group-text">工程量</span>
+                                                        </div>
                                                         <input type="number" name="ration-quantity" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                 </div>
                                                 <div class="col-sm-3">
                                                     <div class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">单价</div>
+                                                        <div class="input-group-prepend">
+                                                            <span class="input-group-text">单价</span>
+                                                        </div>
                                                         <input type="number" name="ration-unitPrice" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                 </div>
                                                 <div class="col-sm-3">
                                                     <div class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">合价</div>
+                                                        <div class="input-group-prepend">
+                                                            <span class="input-group-text">合价</span>
+                                                        </div>
                                                         <input type="number" name="ration-totalPrice" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                 </div>
                                             </div>
-                                            <h5 class="mt-3">人材机</h5>
+                                            <h5 class="mt-3">工料机</h5>
                                             <div class="row m-0">
-                                                <div style="width: 23.3%;">
-                                                    <div style="width:120px;" class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">消耗量</div>
+                                                <div class="col-sm-3">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-prepend">
+                                                            <span class="input-group-text">消耗量</span>
+                                                        </div>
                                                         <input type="number" name="glj-quantity" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                 </div>
-                                                <div  style="width: 38.3%;">
-                                                    <div style="width:190px;" class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">单价(有组成物)</div>
+                                                <div class="col-sm-4">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-prepend">
+                                                            <span class="input-group-text">单价<small class="text-muted">(有组成物)</small></span>
+                                                        </div>
                                                         <input type="number" name="glj-unitPriceHasMix" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                 </div>
-                                                <div style="width: 38.3%;">
-                                                    <div  style="width:190px;" class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">单价(无组成物)</div>
+                                                <div class="col-sm-4">
+                                                    <div class="input-group input-group-sm mb-2">
+                                                        <div class="input-group-prepend">
+                                                            <span class="input-group-text">单价<small class="text-muted">(无组成物)</small></span>
+                                                        </div>
                                                         <input type="number" name="glj-unitPrice" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                 </div>
@@ -644,7 +660,9 @@
                                             <div class="row m-0">
                                                 <div class="col-sm-3">
                                                     <div class="input-group input-group-sm mb-2">
-                                                        <div class="input-group-addon">费率</div>
+                                                        <div class="input-group-prepend">
+                                                            <span class="input-group-text">费率</span>
+                                                        </div>
                                                         <input type="number" name="feeRate" class="form-control" value="2" step="1" max="6" min="0">
                                                     </div>
                                                 </div>

+ 36 - 0
web/building_saas/main/js/views/sub_view.js

@@ -140,6 +140,40 @@ $("#linkTZJNR").click(function () {
     gljOprObj.activeTab='#linkTZJNR';
 });
 
+//应用到选中清单、应用到所有,添加位置列如果隐藏了,则重新显示
+function colSettingAddPosition(addPosition){
+    let settingMapping = {1: 'itemCharacterText', 2: 'name', 3: 'jobContentText', 4: 'both'};
+    let settingInfo = settingMapping[addPosition];
+    if(!settingInfo){
+        return;
+    }
+    let fields = [];
+    if(settingInfo === 'both'){
+        fields = [settingMapping['1'], settingMapping['3']];
+    }
+    else{
+        fields = [settingInfo];
+    }
+    let needToUpdate = false;
+    let showItemCharacter = false;
+    for(let field of fields){
+        let colVisible = colSettingObj.getVisible(field);
+        if(field === settingMapping['1'] && !colVisible){
+            showItemCharacter = true;
+        }
+        if(!colVisible){
+            colSettingObj.setVisible(field, true);
+            needToUpdate = true;
+        }
+    }
+    if(showItemCharacter){
+        switchTznrHtml(false);
+    }
+    if(needToUpdate){
+       colSettingObj.updateColSetting(true);
+    }
+}
+
 // 应用到选中清单
 let isSaving = false;
 $("#use-to-current").click(function() {
@@ -150,6 +184,7 @@ $("#use-to-current").click(function() {
         return false;
     }
     const setting = getAddRuleSetting();
+    colSettingAddPosition(setting.position);
     isSaving = true;
     const self = $(this);
     self.attr('disabled', 'disabled');
@@ -177,6 +212,7 @@ $("#use-to-all").click(function() {
     }
     let treeNode = projectObj.mainController.tree;
     const setting = getAddRuleSetting();
+    colSettingAddPosition(setting.position);
     if (treeNode.items === undefined || treeNode.items.length <= 0) {
         return false;
     }

+ 6 - 2
web/building_saas/pm/js/pm_newMain.js

@@ -59,7 +59,7 @@ const projTreeObj = {
             {name: '税金', dataCode: 'tax', width: 120, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '占造价比例(%)', dataCode: 'rate', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '建筑面积', dataCode: 'buildingArea', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
-            {name: '单方造价', dataCode: 'perCost', width: 100, vAlign: 'center', hAlign: 'right'},
+            {name: '单方造价', dataCode: 'perCost', width: 100, vAlign: 'center', hAlign: 'right', formatter: '0.00'},
             {name: '单价文件', dataCode: 'unitPriceFile', width: 140, vAlign: 'center', hAlign: 'left'},
             {name: '费率文件', dataCode: 'feeRateFile', width: 140, vAlign: 'center', hAlign: 'left'},
             {name: '创建日期', dataCode: 'createDateTime', width: 100, vAlign: 'center', hAlign: 'center'}
@@ -2349,7 +2349,11 @@ function getAddTenderFile(tenderName, selected, options){
     //选择的是新建单价/费率文件
     if(selValue === ''){
         //若新建的单位工程名称与建设项目下文件重名,则引用该文件
-        for(let option of options){
+        for(let i = 0; i < options.length; i++){
+            if(i === 0){
+                continue;
+            }
+            let option = options[i];
             if($(option).text() === tenderName){
                 rst.id = $(option).val();
                 break;

+ 48 - 12
web/building_saas/report/js/rpt_main.js

@@ -350,28 +350,63 @@ let rptControlObj = {
     },
     getAllInOneBook: function () {
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let me = rptControlObj;
             let orgRptName = projectInfoObj.projectInfo.name;
             let refRptTplIds = [];
             for (let node of zTreeOprObj.checkedRptTplNodes) {
                 refRptTplIds.push(node.refId);
             }
-            window.location = "/report_api/getExcelInOneBook/" + projectInfoObj.projectInfo.ID + "/" + refRptTplIds.join(",") + "/" +
-                rptControlObj.getCurrentPageSize() + "/" + orgRptName + "/" + 'normal';
+            let params = {};
+            params.prj_id = projectInfoObj.projectInfo.ID;
+            params.rpt_ids = refRptTplIds;
+            params.rptName = orgRptName;
+            params.pageSize = me.getCurrentPageSize();
+            params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
+            params.custCfg = zTreeOprObj.reportPageCfg;
+            params.option = "normal";
+            CommonAjax.postEx("report_api/createExcelFilesInOneBook", params, 20000, true, function(result){
+                    if (result) {
+                        let uuIdUrls = [];
+                        let uuIdUrl =  "/report_api/getExcelByUUID/" + result.uuid + "/" + result.reportName;
+                        uuIdUrls.push(uuIdUrl);
+                        downloadReport(uuIdUrls);
+                    } else {
+                        //
+                    }
+                }, null, null
+            );
         }
     },
     getAllIndividualExcelBook: function () {
         let me = rptControlObj;
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
-            let urls = [];
-            let orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
-            if (zTreeOprObj.checkedRptTplNodes.length > 1) orientation = null;
+            let rpt_ids = [], rpt_names = [];
             for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
-                let orgRptName = tplNode.name;
-                let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
-                    me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName + "/" + true + "/" + 'normal';
-                urls.push(url);
+                rpt_ids.push(tplNode.refId);
+                rpt_names.push(tplNode.name)
             }
-            downloadReport(urls);
+            let params = {};
+            params.prj_id = projectInfoObj.projectInfo.ID;
+            params.rpt_ids = rpt_ids;
+            params.rpt_names = rpt_names;
+            params.pageSize = me.getCurrentPageSize();
+            params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:me.getCurrentOrientation());
+            params.isOneSheet = true;
+            params.custCfg = zTreeOprObj.reportPageCfg;
+            params.option = "normal";
+            CommonAjax.postEx("report_api/createExcelFiles", params, 20000, true, function(result){
+                    if (result) {
+                        let uuIdUrls = [];
+                        for (let uuIdObj of result) {
+                            let uuIdUrl =  "/report_api/getExcelByUUID/" + uuIdObj.uuid + "/" + uuIdObj.reportName;
+                            uuIdUrls.push(uuIdUrl);
+                        }
+                        downloadReport(uuIdUrls);
+                    } else {
+                        //
+                    }
+                }, null, null
+            );
         }
     },
     checkAndGetExcel: function () {
@@ -400,7 +435,8 @@ let rptControlObj = {
             for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
                 let orgRptName = tplNode.name;
                 let url =  "/report_api/getPDF/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
-                    me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName;
+                    me.getCurrentPageSize() + "/" + orientation + "/" + orgRptName
+                    // + "/" + encodeURI(JSON.stringify(zTreeOprObj.reportPageCfg));
                 urls.push(url);
             }
             downloadReport(urls);
@@ -527,4 +563,4 @@ function downloadReport(urls) {
         }
     }
     private_download();
-}
+}

+ 2 - 0
web/building_saas/report/js/rpt_print.js

@@ -7,6 +7,8 @@ let rptPrintHelper = {
         if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
             let rptIds = [];
             let params = {};
+            params.pageSize = rptControlObj.getCurrentPageSize();
+            params.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:rptControlObj.getCurrentOrientation());
             params.custCfg = zTreeOprObj.reportPageCfg;
             params.prj_id = projectInfoObj.projectInfo.ID;
             for (let tplNode of zTreeOprObj.checkedRptTplNodes) {