Browse Source

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

zhongzewei 6 years ago
parent
commit
fb4c866ba8

+ 14 - 15
modules/main/facade/project_facade.js

@@ -285,6 +285,7 @@ async function getBudgetSummayDatas(projectIDs){
     try {
         let projects = [];
         let names = [];
+        let prjTypeNames = [];
         let decimal = null;
         for(let ID of projectIDs){
             projects.push(await getBillsByProjectID(ID)) ;
@@ -294,11 +295,13 @@ async function getBudgetSummayDatas(projectIDs){
         }
         let mp = projects[0];
         names.push(mp.name);
+        prjTypeNames.push(mp.prjTypeName);
         for(let i = 1;i<projects.length;i++){
             names.push(projects[i].name);
+            prjTypeNames.push(projects[i].prjTypeName);
             decimal = await mergeProject(mp.roots,projects[i].roots)
         }
-        let SummaryAuditDetail = getReportData(names,mp.roots,decimal);
+        let SummaryAuditDetail = getReportData(names,mp.roots,prjTypeNames,decimal);
         let parentProject = await projectsModel.findOne({ID:mp.ParentID});
         let result = {
             prj: {},
@@ -317,26 +320,27 @@ async function getBudgetSummayDatas(projectIDs){
 }
 
 
-function getReportData(nameList,items,decimal) {
+function getReportData(nameList,items,prjTypeNames,decimal) {
     let datas = [],totalItem = null;
     setChildrenDatas(items,datas);
     for(let d of datas){
-        if(d.billsTtlPrice){
+        if(d.billsTtlPrice&&totalItem.billsTtlPrice){
             d['各项费用比例'] = scMathUtil.roundForObj(d.billsTtlPrice/totalItem.billsTtlPrice * 100,2)
         }
         d['prjNames'] = nameList;
+        d['prjTypeNames'] = prjTypeNames;
     }
     return datas;
 
 
-    function setChildrenDatas(children,arr) {
+    function setChildrenDatas(children,arr,level = 0) {
         for(let c of children){
-            arr.push(getBillDatas(c));
-            setChildrenDatas(c.children,arr);
+            arr.push(getBillDatas(c,level));
+            setChildrenDatas(c.children,arr,level+1);
         }
     }
 
-    function getBillDatas(bills) {
+    function getBillDatas(bills,level) {
         let tem = {
             billsName:bills.name,
             billsCode:bills.code,
@@ -344,8 +348,8 @@ function getReportData(nameList,items,decimal) {
             billsTtlAmt:bills.quantity,
             billsPrices:[],
             billsAmounts:[],
-            prjTypeNames:[],
             '技术经济指标':[],
+            billsLevel:level,
             billsMemos:bills.remark
         };
         let total = 0;
@@ -363,8 +367,6 @@ function getReportData(nameList,items,decimal) {
                 tem.billsAmounts.push(0);
                 tem['技术经济指标'].push(0);
             }
-            let pt =  bills.prjType[n]?bills.prjType[n]:'';
-            tem.prjTypeNames.push(pt);
         }
         tem.billsTtlPrice = scMathUtil.roundForObj(total,decimal.bills.totalPrice);
         tem['技术经济综合指标'] = tem.billsTtlAmt?scMathUtil.roundForObj(tem.billsTtlPrice/tem.billsTtlAmt,2):0;
@@ -399,7 +401,6 @@ async function mergeItem(a,b,decimal,project) {
     for(let name in b.prices){
         a.prices[name] = b.prices[name];
         a.quantityMap[name] = b.quantityMap[name];
-        a.prjType[name] = b.prjType[name];
     }
     for(let name in a.quantityMap){
         a.quantityMap[name] = a.quantityMap[name]?scMathUtil.roundForObj(a.quantityMap[name],bqDecimal):0;
@@ -498,12 +499,10 @@ async function getBillsByProjectID(projectID){
        let commonFee =_.find(b._doc.fees,{"fieldName":"common"});
        let prices = {};
        let quantityMap={};
-       let prjType = {};
        if(commonFee&&commonFee.totalFee) prices[projectName] =  commonFee.totalFee;
        quantityMap[projectName] = b.quantity;
-       prjType[projectName] = engineering;
        let flagIndex = _.find(b._doc.flags,{'fieldName':'fixed'});
-       let doc = {ID:b.ID,name:b.name,code:b.code,unit:b.unit,projectID:b.projectID, ParentID:b.ParentID,NextSiblingID:b.NextSiblingID,quantity:b.quantity,prices:prices,quantityMap:quantityMap,prjType:prjType,flag:flagIndex?flagIndex.flag:-99,remark:b.remark};//选取有用字段
+       let doc = {ID:b.ID,name:b.name,code:b.code,unit:b.unit,projectID:b.projectID, ParentID:b.ParentID,NextSiblingID:b.NextSiblingID,quantity:b.quantity,prices:prices,quantityMap:quantityMap,flag:flagIndex?flagIndex.flag:-99,remark:b.remark};//选取有用字段
        if(b.ParentID == -1) roots.push(doc);
        parentMap[b.ParentID]?parentMap[b.ParentID].push(doc):parentMap[b.ParentID]=[doc];
    }//设置子节点
@@ -511,7 +510,7 @@ async function getBillsByProjectID(projectID){
         setChildren(r,parentMap,1);
    }
     roots = sortChildren(roots);
-    return {name:projectName,roots:roots,author:author,auditor:auditor,compilationScope:compilationScope,ParentID:project.ParentID}
+    return {name:projectName,roots:roots,author:author,auditor:auditor,compilationScope:compilationScope,ParentID:project.ParentID,prjTypeName:engineering}
 }
 
 function setChildren(bill,parentMap,level) {

+ 53 - 1
modules/reports/controllers/rpt_controller.js

@@ -326,7 +326,7 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, custo
         } else {
             cb('No report template was found!', null);
         }
-    })
+    });
 }
 
 function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, customizeCfg, option, outputType, cb) {
@@ -403,6 +403,44 @@ function getMultiRptsCommon(user_id, prj_id, rpt_ids, pageSize, orientation, cus
     });
 }
 
+function getSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, option, outputType, cb) {
+    let rptTpl = null;
+    rptTplDataFacade.getBudgetSummayDatas(prjIds).then(function(summaryRawDataRst) {
+        rptTplFacade.getRptTemplate(rpt_id).then(function(rptTpl) {
+            let rptDataUtil = new rptDataExtractor();
+            rptDataUtil.initialize((rptTpl._doc)?rptTpl._doc:rptTpl);
+            try {
+                let tplData = rptDataUtil.assembleData(summaryRawDataRst);
+                let printCom = JpcEx.createNew();
+                if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+                //console.log("orientation: " + (orientation === 'null'));
+                if (orientation && (orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
+                let defProperties = rptUtil.getReportDefaultCache();
+                if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
+                let dftOption = option||JV.PAGING_OPTION_NORMAL;
+                printCom.initialize(rptTpl);
+                printCom.analyzeData(rptTpl, tplData, defProperties, dftOption, outputType);
+                let maxPages = printCom.totalPages;
+                let pageRst = null;
+                if (maxPages > 0) {
+                    pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
+                } else {
+                    pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
+                }
+                if (pageRst) {
+                    cb(null, pageRst);
+                } else {
+                    cb('Have errors while on going...', null);
+                }
+            } catch (ex) {
+                console.log("报表数据异常: userId " + user_id + ", project id: " + prj_id);
+                console.log(ex);
+                cb('Exception occurs while on going...', null);
+            }
+        });
+
+    });
+}
 
 module.exports = {
     getReportAllPages: function (req, res) {
@@ -473,6 +511,20 @@ module.exports = {
         });
     },
 
+    getSummaryReportPages: function (req, res) {
+        let params = JSON.parse(req.body.params),
+            rpt_id = params.rpt_tpl_id,
+            prjIds = params.prjIds,
+            pageSize = params.pageSize,
+            orientation = params.orientation,
+            customizeCfg = params.custCfg
+        ;
+        let user_id = req.session.sessionUser.id;
+        getSummaryReportPages(user_id, prjIds, rpt_id, pageSize, orientation, customizeCfg, null, JV.OUTPUT_TYPE_NORMAL, function (err, pageRst) {
+            callback(req, res, err, pageRst);
+        });
+    },
+
     getReportAllPagesSvg: function (req, res) {
         let params = JSON.parse(req.body.params),
             rpt_id = params.rpt_tpl_id,

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

@@ -30,6 +30,7 @@ module.exports =function (app) {
     rptRouter.post('/createExcelFiles', reportController.createExcelFiles);
     rptRouter.post('/createExcelFilesInOneBook', reportController.createExcelFilesInOneBook);
     rptRouter.post('/createPdfFiles', reportController.createPdfFiles);
+    rptRouter.post('/getBillsSummaryReport', reportController.getSummaryReportPages);
 
     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);

+ 8 - 1
modules/reports/rpt_component/jpc_cross_tab.js

@@ -593,8 +593,15 @@ JpcCrossTabSrv.prototype.createNew = function(){
                 let flexiblePrecisionRefObj = null, flexibleRefField = null, precision_ref_data = null;
                 for (let i = 0; i < tab_fields.length; i++) {
                     let tab_field = tab_fields[i];
-                    let data_field = data_details[me.content_fields_idx[i]];
+                    let data_field = null;
                     let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                    if (typeof me.content_fields_idx[i] !== 'object') {
+                        data_field = data_details[me.content_fields_idx[i]];
+                    } else {
+                        if (map_data_field) {
+                            data_field = map_data_field[JV.PROP_AD_HOC_DATA];
+                        }
+                    }
                     if (!(tab_field[JV.PROP_HIDDEN])) {
                         let rows = contentValuesIdx.length;
                         for (let rowIdx = 0; rowIdx < rows; rowIdx++) {

+ 1 - 1
test/unit/reports/test_summary_multi_prjs.js

@@ -14,7 +14,7 @@ let dbm = require("../../../config/db/db_manager");
 let rpt_cfg = require('./rpt_cfg');
 dbm.connect(process.env.NODE_ENV);
 
-let demoPrjs = [442, 472]; //UAT
+let demoPrjs = [618, 635]; //
 let demoRptId = 68; //01-2
 let pagesize = "A4";
 let userId_Leng = "5c3ffa9aa0a92732f41216e0"; //小冷User Id (养护的)

+ 1 - 2
web/building_saas/main/js/models/project_glj.js

@@ -342,7 +342,7 @@ ProjectGLJ.prototype.materialCal = function (id,dataMap) {
     doc['supplyLocation'] = supplyLocation;
     //再计算运费
     let grossWeightCoe_n = doc['grossWeightCoe_n']?doc['grossWeightCoe_n']:glj.unit_price.grossWeightCoe_n;
-    grossWeightCoe_n = scMathUtil.roundForObj(grossWeightCoe_n,unitPirceDecimal);
+    grossWeightCoe_n = scMathUtil.roundForObj(grossWeightCoe_n,process);
     let unitFreight = this.freightCalc(glj,grossWeightCoe_n,dataMap);
     doc['unitFreight'] = unitFreight+'';
     //计算场外运输损耗
@@ -909,7 +909,6 @@ ProjectGLJ.prototype.changeVvTaxFile = async function (newVvTaxFileID,callback)
 
 ProjectGLJ.prototype.addMixRatio = function(selections,callback){
     let gljList = [],allGLJ = gljOprObj.AllRecode;
-    $("#glj_tree_div").modal('hide');
     if(selections.length == 0) {
         return;
     }

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

@@ -8,6 +8,9 @@
                     <button class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#editForm"><i class="fa fa-cog"></i> 管理报表</button>
                     <button class="btn btn-outline-primary btn-sm" onclick="zTreeOprObj.getReportTemplateTree()"><i class="fa fa-cog"></i> 刷新</button>
                 </div>
+                <div class="list-tools d-flex justify-content-center">
+                    <button class="btn btn-outline-primary btn-sm" onclick="zTreeOprObj.getReportTemplateTree()"><i class="fa fa-cog"></i> 刷新</button>
+                </div>
                 -->
                 <div class="form-list">
                     <ul id="rptTplTree" class="ztree"></ul>

+ 1 - 1
web/building_saas/report/html/rpt_select_projects.html

@@ -14,7 +14,7 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="" class="btn btn-primary">确定</a>
+                <a onclick="zTreeOprObj.requestBillsSummaryRpt()" class="btn btn-primary" data-dismiss="modal">确定</a>
             </div>
         </div>
     </div>

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

@@ -217,6 +217,7 @@ let zTreeOprObj = {
         if (treeNode.nodeType === TPL_TYPE_TEMPLATE && treeNode.refId > 0) {
             if (treeNode.hasOwnProperty('flags') && treeNode.flags.hasOwnProperty('reportType')
                 && treeNode['flags']['reportType'] === 'billSummary') {
+                me.currentNode = treeNode;
                 me.requestPrjFolder();
                 me.countChkedRptTpl();
             } else {
@@ -305,7 +306,7 @@ let zTreeOprObj = {
     },
     requestPrjFolder: function () {
         //$("#show_project_folder").trigger("click");
-        let me = zTreeOprObj, params = {};
+        let me = zTreeOprObj;
         hintBox.waitBox();
         $.ajax({
             type:"POST",
@@ -337,17 +338,51 @@ let zTreeOprObj = {
                 alert('error ' + textStatus + " " + errorThrown);
             }
         });
-        // CommonAjax.postEx("/pm/api/getProjects", params, 15000, true,
-        //     function(result){
-        //         hintBox.unWaitBox();
-        //         $("#show_project_folder").trigger("click");
-        //         console.log(result);
-        //     }, function(err){
-        //         hintBox.unWaitBox();
-        //     }, function(ex){
-        //         hintBox.unWaitBox();
-        //     }
-        // );
+    },
+    requestBillsSummaryRpt: function () {
+        let me = zTreeOprObj;
+        let nodes = me.prjFolderTreeObj.getCheckedNodes(true);
+        if (nodes.length > 0) {
+            hintBox.waitBox();
+            let params = {};
+            params.pageSize = rptControlObj.getCurrentPageSize();
+            params.rpt_tpl_id = me.currentNode.refId;
+            params.custCfg = me.reportPageCfg;
+            params.prjIds = [];
+            for (let node of nodes) {
+                params.prjIds.push(node.ID);
+            }
+            CommonAjax.postEx("report_api/getBillsSummaryReport", params, 26000, true,
+                function(result){
+                    hintBox.unWaitBox();
+                    let pageRst = result;
+                    let canvas = document.getElementById("rptCanvas");
+                    if (pageRst && pageRst.items && pageRst.items.length > 0) {
+                        me.resetAfter(pageRst);
+                        me.currentRptPageRst = pageRst;
+                        me.maxPages = pageRst.items.length;
+                        me.currentPage = 1;
+                        me.displayPageValue();
+                        let size = JpcCanvasOutput.getReportSizeInPixel(me.currentRptPageRst, getScreenDPI());
+                        canvas.width = size[0] + 20;
+                        if (size[1] > size[0]) {
+                            canvas.height = size[1] + 100;
+                        } else {
+                            canvas.height = size[1] + 50;
+                        }
+                        me.showPage(1, canvas);
+                    } else {
+                        //返回了无数据表
+                        JpcCanvasOutput.cleanCanvas(canvas);
+                        JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI());
+                    }
+                }, function(err){
+                    hintBox.unWaitBox();
+                }, function(ex){
+                    hintBox.unWaitBox();
+                }
+            );
+        }
     },
     showPage: function (pageNum, canvas) {
         let me = zTreeOprObj;