瀏覽代碼

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

chenshilong 7 年之前
父節點
當前提交
22f255f032

+ 2 - 1
modules/all_models/compilation.js

@@ -20,6 +20,7 @@ let engineeringListSchema = new Schema({
     }
 }, {_id: false});
 let childrenSchema = new Schema({
+    id:String,
     // 计价名称
     name: String,
     // 工程专业列表
@@ -47,7 +48,7 @@ let childrenSchema = new Schema({
             "cols":[]
         }
     }
-});
+},{_id: false});
 let modelSchema = {
     // 是否发布
     is_release: {

+ 41 - 0
modules/reports/controllers/rpt_controller.js

@@ -316,6 +316,47 @@ module.exports = {
             }
         })
     },
+    getExcelInOneBook: function (req, res) {
+        let prj_id = req.params.prj_id,
+            rpt_ids = req.params.rpt_ids.split(','),
+            pageSize = req.params.size,
+            rptName = req.params.rptName,
+            option = req.params.option;
+        let user_id = req.session.sessionUser.id;
+        let parallelFucs = [];
+        let dftOption = option||JV.PAGING_OPTION_NORMAL;
+        for (let id of rpt_ids) {
+            parallelFucs.push((function (rpt_id) {
+                return function (cb) {
+                    getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, null, null, dftOption, function (err, pageRst) {
+                        if(err){
+                            cb(err);
+                        }
+                        else{
+                            cb(null, pageRst);
+                        }
+                    })
+                }
+            })(parseInt(id)));
+        }
+        async.parallel(parallelFucs, function (err, pageRstArray) {
+            if (err) {
+                callback(req, res, '数据有误', null);
+            } else {
+                rpt_xl_util.exportExcelInOneBook(pageRstArray, pageSize, rptName, function(tmpFilePath){
+                    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/' + tmpFilePath + '.xlsx');
+                    filestream.on('data', function(chunk) {
+                        res.write(chunk);
+                    });
+                    filestream.on('end', function() {
+                        res.end();
+                    });
+                });
+            }
+        })
+    },
     getTestExcel: function(req, res) {
         let rpt_id = req.params.id,
             pageSize = req.params.size,

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

@@ -26,6 +26,7 @@ module.exports =function (app) {
     //now is the real:
     rptRouter.post('/getReport', reportController.getReportAllPages);
     rptRouter.post('/getReportSvg', reportController.getReportAllPagesSvg);
+    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('/getPDF/:prj_id/:rpt_id/:size/:orientation/:rptName', reportController.getPDF);
     // rptRouter.get('/getExcelInOneBook/:ids/:size/:rptName/:option', reportController.getExcelInOneBook);

+ 5 - 5
modules/users/models/engineering_lib_model.js

@@ -39,10 +39,10 @@ class EngineeringLibModel extends BaseModel {
                 continue;
             }
             for(let engineering of valuation.engineering_list) {
-                if (engineeringTemp[valuation._id] === undefined) {
-                    engineeringTemp[valuation._id] = [engineering.engineering_id];
+                if (engineeringTemp[valuation.id] === undefined) {
+                    engineeringTemp[valuation.id] = [engineering.engineering_id];
                 }else {
-                    engineeringTemp[valuation._id].push(engineering.engineering_id);
+                    engineeringTemp[valuation.id].push(engineering.engineering_id);
                 }
                 engineeringLibIdList.push(engineering.engineering_id);
             }
@@ -79,10 +79,10 @@ class EngineeringLibModel extends BaseModel {
                 continue;
             }
             for(let engineering of valuation.engineering_list) {
-                if (engineering === null || engineeringLib[valuation._id] === undefined) {
+                if (engineering === null || engineeringLib[valuation.id] === undefined) {
                     continue;
                 }
-                for (let tmp of engineeringLib[valuation._id]) {
+                for (let tmp of engineeringLib[valuation.id]) {
                     if (tmp._id.toString() === engineering.engineering_id.toString()) {
                         engineering.lib = tmp;
                     }

二進制
web/building_saas/img/p1.png


二進制
web/building_saas/img/p2.png


文件差異過大導致無法顯示
+ 0 - 26
web/building_saas/main/html/main.html


+ 2 - 1
web/building_saas/pm/html/project-management.html

@@ -546,6 +546,7 @@
     let billValuation = '<%- billValuation %>';
     let rationValuation = '<%- rationValuation %>';
     let engineeringList = '<%- engineeringList %>';
-    let compilationData = JSON.parse('<%- compilationData %>');
+    let compilationData = '<%- compilationData %>';
+    compilationData = JSON.parse(compilationData.replace(/[\s\r\n]/g, ""));//去掉空格字符
 </script>
 </html>

+ 4 - 3
web/building_saas/pm/js/pm_newMain.js

@@ -24,6 +24,7 @@ let fileType = {
     feeRateFile: 'FeeRateFile'
 };
 
+
 const projTreeObj = {
     tree: null,
     workBook: null,
@@ -1064,7 +1065,7 @@ $(document).ready(function() {
             if (valuation === null) {
                 continue;
             }
-            html += `<option ${i === targetData.length -1 ? 'selected' : ''} value="${valuation._id}">${valuation.name}</option>`;
+            html += `<option ${i === targetData.length -1 ? 'selected' : ''} value="${valuation.id}">${valuation.name}</option>`;
         }
         $("#valuation").html(html);
         //$("#tender-engineering").html('<option value="">请选择对应的工程专业</option>');
@@ -1778,7 +1779,7 @@ function getEngineeringList(){
     let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
     let engineeringList = [];
     for(let tmp of valuationData) {
-        if (tmp._id === valuation) {
+        if (tmp.id === valuation) {
             engineeringList = tmp.engineering_list;
             break;
         }
@@ -2076,7 +2077,7 @@ function AddTender() {
         let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
         let engineeringList = [];
         for(let tmp of valuationData) {
-            if (tmp._id === valuation) {
+            if (tmp.id === valuation) {
                 engineeringList = tmp.engineering_list;
                 break;
             }

+ 7 - 7
web/building_saas/report/html/rpt_export_excel.html

@@ -11,11 +11,11 @@
                 <div class="row">
                     <div class="col-6">
                         <div class="card">
-                            <img class="card-img-top" src="img/p2.png">
+                            <img class="card-img-top" src="/web/building_saas/img/p2.png">
                             <div class="card-body px-3">
                                 <div class="form-check">
-                                    <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios1" value="option1" checked>
-                                    <label class="form-check-label" for="exampleRadios1">
+                                    <input class="form-check-input" type="radio" name="excelExportTypeRadio" id="excelExportType_AllInOneBook" value="option1" checked>
+                                    <label class="form-check-label" for="excelExportType_AllInOneBook">
                                         多个表导出一个Excel文件
                                     </label>
                                 </div>
@@ -24,11 +24,11 @@
                     </div>
                     <div class="col-6">
                         <div class="card">
-                            <img class="card-img-top" src="img/p1.png">
+                            <img class="card-img-top" src="/web/building_saas/img/p1.png">
                             <div class="card-body px-3">
                                 <div class="form-check">
-                                    <input class="form-check-input" type="radio" name="exampleRadios" id="exampleRadios2" value="option2" checked>
-                                    <label class="form-check-label" for="exampleRadios2">
+                                    <input class="form-check-input" type="radio" name="excelExportTypeRadio" id="excelExportType_IndividualBook" value="option2" checked>
+                                    <label class="form-check-label" for="excelExportType_IndividualBook">
                                         每个表导出一个Excel文件
                                     </label>
                                 </div>
@@ -39,7 +39,7 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a onclick="rptControlObj.getExcel()" class="btn btn-primary">确定导出</a>
+                <a onclick="rptControlObj.chkAndGetExcel()" class="btn btn-primary">确定导出</a>
             </div>
         </div>
     </div>

+ 3 - 3
web/building_saas/report/html/rpt_main.html

@@ -15,9 +15,9 @@
             <div class="toolsbar">
                 <div class="print-toolsbar">
                     <div class="panel">
-                        <div class="panel-body">
+                        <div class="panel-body" id="print_div">
                             <button class="btn btn-outline-primary btn-sm" type="button" onclick="rptPrintHelper.preview()">
-                                <i class="fa fa-print"></i><br>打印
+                                <i class="fa fa-print"></i><br>打印<span class="badge badge-secondary">0</span>
                             </button>
                             <!--
                             <button class="btn btn-outline-primary btn-sm" type="button"  href="#export" data-toggle="modal" data-target="#export">
@@ -28,7 +28,7 @@
                     </div>
                     <div class="panel">
                         <div class="panel-body">
-                            <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
+                            <div class="btn-group" role="group" aria-label="Button group with nested dropdown" id="export_div">
                                 <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#export_excel"><i class="fa fa-file-excel-o"></i> Excel <span class="badge badge-secondary">0</span></button>
                                 <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.getPDF()"><i class="fa fa-file-pdf-o"></i> PDF <span class="badge badge-secondary">0</span></button>
                             </div>

+ 1 - 1
web/building_saas/report/js/rpt_cfg_const.js

@@ -25,7 +25,7 @@ let rpt_tpl_setting = {
         }
     },
     callback: {
-        //onCheck: zTreeOprObj.onCheck
+        onCheck: zTreeOprObj.onCheck,
         onClick: zTreeOprObj.onClick
     }
 };

+ 63 - 8
web/building_saas/report/js/rpt_main.js

@@ -26,10 +26,36 @@ let rptTplObj = {
 let zTreeOprObj = {
     treeObj: null,
     currentNode: null,
+    checkedRptTplNodes: null,
     currentRptPageRst: null,
     reportPageCfg: null,
     currentPage: 1,
     maxPages: 0,
+    countChkedRptTpl: function () {
+        let me = zTreeOprObj;
+        if (me.treeObj) {
+            me.checkedRptTplNodes = [];
+            let chkNodes = me.treeObj.getCheckedNodes(true), cnt = 0, hasCurrentNode = false;
+            for (let node of chkNodes) {
+                if (node.nodeType === TPL_TYPE_TEMPLATE) {
+                    cnt++;
+                    me.checkedRptTplNodes.push(node);
+                    if (me.currentNode === node) hasCurrentNode = true;
+                }
+            }
+            if (!hasCurrentNode && cnt === 0 && me.currentNode !== null) {
+                //这里根据实际需求再做处理
+                cnt++;
+                me.checkedRptTplNodes.push(me.currentNode);
+            }
+            $("#export_div").find("span").each(function(cIdx,elementSpan){
+                elementSpan.innerText = cnt;
+            });
+            $("#print_div").find("span").each(function(cIdx,elementSpan){
+                elementSpan.innerText = cnt;
+            });
+        }
+    },
     getReportTemplateTree: function() {
         let me = zTreeOprObj, params = {};
         params.engineerId = projectInfoObj.projectInfo.property.engineering;
@@ -114,11 +140,8 @@ let zTreeOprObj = {
         }
         me.treeObj.refresh();
     },
-    onCheck: function() {
-        //count();
-        //if (clearFlag) {
-        //    clearCheckedOldNodes();
-        //}
+    onCheck: function(event, treeId, treeNode) {
+        zTreeOprObj.countChkedRptTpl();
     },
     onClick: function(event,treeId,treeNode) {
         let me = zTreeOprObj;
@@ -131,6 +154,7 @@ let zTreeOprObj = {
             params.custCfg = me.reportPageCfg;
             me.currentNode = treeNode;
             me.requestReport(params);
+            me.countChkedRptTpl();
         }
     },
     changePageSize: function(dom) {
@@ -287,7 +311,7 @@ let rptControlObj = {
             //other types if needed.
         }
     },
-    getExcel: function() {
+    getCurrentExcel: function() {
         let me = rptControlObj;
         //目前只支持当前打开报表
         //zTreeOprObj.currentRptPageRst
@@ -295,15 +319,46 @@ let rptControlObj = {
             let orgRptName = zTreeOprObj.currentNode.name;
             orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_').replace(' ','');
             let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +
-                me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + false + "/" + 'normal';
+                me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + true + "/" + 'normal';
+            window.location = url;//这里不能使用get方法跳转,否则下载不成功
+        }
+    },
+    getAllInOneBook: function () {
+        let me = rptControlObj;
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            let orgRptName = zTreeOprObj.checkedRptTplNodes[0].name;
+            orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_').replace(' ','');
+            let refRptTplIds = [];
+            for (let node of zTreeOprObj.checkedRptTplNodes) {
+                refRptTplIds.push(node.refId);
+            }
+            let url =  "/report_api/getExcelInOneBook/" + projectInfoObj.projectInfo.ID + "/" + refRptTplIds.join(",") + "/" +
+                me.getCurrentPageSize() + "/" + orgRptName + "/" + 'normal';
             window.location = url;//这里不能使用get方法跳转,否则下载不成功
         }
     },
+    chkAndGetExcel: function () {
+        let me = rptControlObj;
+        if ($("#excelExportType_AllInOneBook").get(0).checked) {
+            me.getAllInOneBook();
+        } else if ($("#excelExportType_IndividualBook").get(0).checked) {
+            if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+                for (let tplNode of zTreeOprObj.checkedRptTplNodes) {
+                    let orgRptName = tplNode.name;
+                    orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_').replace(' ','');
+                    let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + tplNode.refId + "/" +
+                        me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + true + "/" + 'normal';
+                    // window.location = url;//这里不能使用get方法跳转,否则下载不成功
+                    window.open(url);
+                }
+            }
+        }
+    },
     getPDF: function() {
         let me = rptControlObj;
         //目前只支持当前打开报表
         //zTreeOprObj.currentRptPageRst
-        if (zTreeOprObj.currentNode && zTreeOprObj.currentNode.refId) {
+        if (zTreeOprObj.checkedRptTplIds && zTreeOprObj.checkedRptTplIds.length > 0) {
             let orgRptName = zTreeOprObj.currentNode.name;
             orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_');
             let url =  "/report_api/getPDF/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +