Forráskód Böngészése

Merge branch 'master' of http://192.168.1.41:3000/SmartCost/ConstructionCost

zhangweicheng 4 éve
szülő
commit
8e360f0461

+ 7 - 0
modules/pm/controllers/pm_controller.js

@@ -84,6 +84,13 @@ module.exports = {
             callback(req, res, err, message, data);
         });
     },
+    getAllUnitProjects: async function (req, res) {
+        const rootProjectID = JSON.parse(req.body.data).rootProjectID;
+        await ProjectsData.getAllUnitProjects(req.session.sessionUser.id, req.session.sessionCompilation._id, rootProjectID, function (err, message, data) {
+            console.log(err);
+            callback(req, res, err, message, data);
+        });
+    },
     updateProjects: async function (req, res) {
         let data = JSON.parse(req.body.data);
         try {

+ 44 - 0
modules/pm/models/project_model.js

@@ -54,6 +54,50 @@ let optionModel = mongoose.model('options');
 function ProjectsDAO() {
 }
 
+ProjectsDAO.prototype.getAllUnitProjects = async function (userId, compilation, rootPrjID, callback) {
+    //根据root project id获取所有的非删除单位工程
+    try {//
+        let projects = await Projects.find({
+            '$or': [
+                {
+                'userID': userId,
+                'compilation': compilation,
+                'property.rootProjectID': rootPrjID,
+                'deleteInfo': null
+                }, 
+                {
+                    'userID': userId, 
+                    'compilation': compilation, 
+                    'property.rootProjectID': rootPrjID,
+                    'deleteInfo.deleted': {'$in': [null, false]}
+                }
+            ]
+        }, '-_id', {lean: true});
+        let projIDs= [];
+        const allIDs = [];
+        for(let project of projects){
+            allIDs.push(project.ID);
+            if(project.projType === projectType.project){
+                projIDs.push(project.ID);
+            }
+        }
+        // 设置分享信息 
+        const shareMap = await pmFacade.getShareInfoMap(allIDs);
+        projects.forEach(project => {
+            project.shareInfo = shareMap[project.ID] || [];
+        });
+        // 当前费用定额未读的分享的条目数量
+        
+        // 设置汇总字段
+        let summaryInfo = await pmFacade.getSummaryInfo(projIDs);
+        pmFacade.setupSummaryFields(summaryInfo, projects);
+        callback(0, '', projects);
+    }
+    catch (err) {
+        callback(1, 'Error', null);
+    }
+}
+    
 ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, callback) {
     try {//
         let projects = await Projects.find({

+ 1 - 0
modules/pm/routes/pm_route.js

@@ -29,6 +29,7 @@ module.exports = function (app) {
     pmRouter.post('/prepareInitialData', pmController.prepareInitialData);
 
     pmRouter.post('/getProjects', pmController.getProjects);
+    pmRouter.post('/getAllUnitProjects', pmController.getAllUnitProjects);
     pmRouter.post('/getSummaryInfo', pmController.getSummaryInfo);
 
     /*

+ 18 - 2
modules/reports/controllers/rpt_controller.js

@@ -23,6 +23,7 @@ const rpt_svg_util = require("../util/rpt_svg_util");
 const fs = require("fs");
 const strUtil = require("../../../public/stringUtil");
 const rptDataExtractor = require("../util/rpt_construct_data_util");
+
 //统一回调函数
 let callback = function(req, res, err, data){
     if(err){
@@ -261,8 +262,9 @@ async function getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, ori
                     cb('Exception occurs while on going...', null);
                 }
             };
-        if (flag !== undefined && flag !== null && flag.constructSumType === 'constructSum') {
-                //这个直接取本项目的建设项目下所有的单位工程的数据,然后合并
+        if (flag !== undefined && flag !== null && (flag.constructSumType === 'constructSum' || flag.auditType === 'audit_compare')) {
+                //备注:原先这个功能是为了合并建设项目下所有的单位工程的数据,
+                //     现在发现就是通用型,审核对比也可以用这个逻辑把数据合并在一起再处理(审核对比的处理逻辑放在模板计算式里)
                 try {
                     console.log('准备取建设项目下所有单位工程数据:');
                     const _combineData = function(destData, srcData) {
@@ -283,6 +285,20 @@ async function getAllPagesCommon(user_id, prj_id, prj_ids, rpt_id, pageSize, ori
                             destData[JV.DATA_DETAIL_DATA_EX][idx] = destData[JV.DATA_DETAIL_DATA_EX][idx].concat(srcData[JV.DATA_DETAIL_DATA_EX][idx]);
                         }
                     };
+                    // let multiRawData = rptTplDataFacade.prepareMultiProjectData(user_id, prj_ids, filter);
+                    // //终于出来结果了 !_! (multiRawData是多个单位工程的原始数据!)
+                    // if (multiRawData.length > 0) {
+                    //     //考虑到工料机的数据还需要再计算,所以还不能直接用,需要每个工程都处理一遍后,再合并
+                    //     let tplData = rptDataUtil.assembleData(multiRawData[0]);
+                    //     for (let idx = 1; idx < multiRawData.length; idx++) {
+                    //         let tmpData = rptDataUtil.assembleData(multiRawData[idx]);
+                    //         _combineData(tplData, tmpData);
+                    //     }
+                    //     _createPntPageData(tplData, rptTpl);
+                    // } else {
+                    //     cb('Have errors while on going...', null);
+                    // }
+
                     rptTplDataFacade.prepareMultiProjectData(user_id, prj_ids, filter).then(function(multiRawData) {
                         //终于出来结果了 !_! (multiRawData是多个单位工程的原始数据!)
                         if (multiRawData.length > 0) {

+ 1 - 0
modules/reports/util/rpt_construct_data_util.js

@@ -273,6 +273,7 @@ class Rpt_Data_Extractor {
         let tpl = this.rptTpl;
         this.COMMON.initialize(tpl, rawDataObj);
         $PROJECT.COMMON = this.COMMON;
+        // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/temp/建筑Rawdata.js");
         if (rawDataObj.hasOwnProperty(`prj`)) {
             setupMainFunc($PROJECT, `MAIN`, rawDataObj.prj._doc);
             // $PROJECT.MAIN["myOwnRawDataObj"] = rawDataObj.prj._doc;

+ 22 - 0
web/building_saas/pm/js/pm_ajax.js

@@ -23,6 +23,28 @@ var GetAllProjectData = function (callback) {
         }
     });
 }
+// 获取建设项目下全部单位工程数据
+var GetAllUnitProjectData = function (params, callback) {
+    $.ajax({
+        type:"POST",
+        url: '/pm/api/getAllUnitProjects',
+        data: {'data': params},
+        dataType: 'json',
+        cache: false,
+        timeout: 50000,
+        success: function(result){
+            if (result.error === 0) {
+                callback(result.data);
+                //Tree = $.fn.treeTable.init(table, ProjTreeSetting, result.data);
+            } else {
+                alert('error: ' + result.message);
+            }
+        },
+        error: function(jqXHR, textStatus, errorThrown){
+            alert('error ' + textStatus + " " + errorThrown);
+        }
+    });
+}
 // 更新数据到服务器
 var UpdateProjectData = function (updateData, callback, errCB) {
     const tenderCount = updateData.filter(item => item.updateType === 'new' && item.updateData.projType === projectType.tender).length;

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

@@ -2982,7 +2982,6 @@ function initNodesVisibility(nodes, visible) {
 
 function initProjects(callback, expandCallback) {
     GetAllProjectData(function (datas) {
-        sessionStorage.setItem('projects_tree_data', JSON.stringify(datas)); // 报表用,不要删除
         //设置工程专业
         for (let data of datas) {
             if (data.projType === projectType.tender) {

+ 56 - 38
web/building_saas/report/js/rpt_main.js

@@ -3,6 +3,7 @@
  */
 'use strict'
 
+
 const PRE_PAGE_OFFSET = 150;
 const NEXT_PAGE_OFFSET = 160;
 const FIRST_PAGE_OFFSET = 50;
@@ -28,11 +29,18 @@ let rptTplObj = {
                 JpcJsPDFHelper.initialize('p', 'pt', 'a4');
             }
             //收集本单位工程所属的建设项目下所有单位工程id用
-            me.project_tree = tree_Data_Helper.buildTreeNodeDirectly(JSON.parse(sessionStorage.getItem('projects_tree_data')), false);
-            console.log(me.getAllPrjIds());
-            // projectObj.project.projectInfo.ID
-            // dynamicLoadJs('/lib/jspdf/SmartSimsun-normal.js');
-            // dynamicLoadJs('/lib/jspdf/SmartSimsun-bold.js', me.pdfFontSimsunCallBack);
+            // GetAllProjectData(function (datas) {
+            //     //
+            // }
+            let params = {
+                rootProjectID: projectObj.project.property.rootProjectID,
+                user_id: userID
+            };
+            CommonAjax.post("pm/api/getAllUnitProjects", params, function(result) {
+                // console.log(result);
+                me.project_tree = result;
+                // console.log(me.getAllPrjIds());
+            });
         }
     },
     
@@ -40,32 +48,8 @@ let rptTplObj = {
         let me = this;
         let rst = [];
         if (me.project_tree) {
-            const _chkIfHasCurrentPrjId = function(nodeItem) {
-                let chkRst = (nodeItem.ID === projectObj.project.projectInfo.ID);
-                if (!chkRst && nodeItem.items && nodeItem.items.length > 0) {
-                    for (const subItem of nodeItem.items) {
-                        chkRst = _chkIfHasCurrentPrjId(subItem);
-                        if (chkRst) {
-                            break;
-                        }
-                    }
-                }
-                return chkRst;
-            };
-            const _retrievAllDtlPrjIds = function(parentNode) {
-                if (parentNode.items === null || parentNode.items === undefined || parentNode.items.length === 0) {
-                    rst.push(parentNode.ID);
-                } else {
-                    for (const subNode of parentNode.items) {
-                        _retrievAllDtlPrjIds(subNode);
-                    }
-                }
-            };
-            for (let topNode of me.project_tree) {
-                if (_chkIfHasCurrentPrjId(topNode)) {
-                    _retrievAllDtlPrjIds(topNode);
-                    break;
-                }
+            for (let prj of me.project_tree) {
+                rst.push(prj.ID);
             }
         }
         return rst;
@@ -262,7 +246,7 @@ let zTreeOprObj = {
     onCheck: function(event, treeId, treeNode) {
         zTreeOprObj.countChkedRptTpl();
     },
-    onClick: function(event,treeId,treeNode) {
+    onClick: async function(event,treeId,treeNode) {
         let me = zTreeOprObj;
         if (treeNode.nodeType === TPL_TYPE_TEMPLATE && treeNode.refId > 0) {
             let params = {};
@@ -273,9 +257,19 @@ let zTreeOprObj = {
             params.custCfg = me.reportPageCfg;
             params.flag = null;
             if (treeNode.hasOwnProperty('flags')) {
+                if (treeNode.flags.hasOwnProperty('auditType') && treeNode.flags.auditType === 'audit_compare') {
+                    let pids = await compareObject.getCompareID();
+                    if (pids !== null && pids.length > 0) {
+                        params.prj_ids = pids;
+                    } else {
+                        // params.prj_ids = [25062, 25082]; // hard code 测试项目:酉阳县东部沿海产业转移承接基地建设项目(一期)一标段 + 审定
+                        alert('未设置审核对比项目!');
+                        exit;
+                    }
+                } else {
+                    params.prj_ids = rptTplObj.getAllPrjIds();
+                }
                 params.flag = treeNode.flags;
-                params.prj_ids = rptTplObj.getAllPrjIds();
-                // params.prj_ids = [projectObj.project.projectInfo.ID]; //测试
             }
             me.currentNode = treeNode;
             me.requestReport(params);
@@ -612,10 +606,10 @@ let rptControlObj = {
             me.getPDFEx();
         } else {
             $("#ini_PDF_Btn").trigger("click");
-            dynamicLoadJs('/lib/jspdf/SmartSimsun-normal.js',"normal", me.getPdfFontCallback);
-            dynamicLoadJs('/lib/jspdf/SmartSimsun-bold.js',"bold", me.getPdfFontCallback);
-            // dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-normal.js', 'normal', me.getPdfFontCallback);
-            // dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-bold.js', 'bold', me.getPdfFontCallback);
+            // dynamicLoadJs('/lib/jspdf/SmartSimsun-normal.js',"normal", me.getPdfFontCallback);
+            // dynamicLoadJs('/lib/jspdf/SmartSimsun-bold.js',"bold", me.getPdfFontCallback);
+            dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-normal.js', 'normal', me.getPdfFontCallback);
+            dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-bold.js', 'bold', me.getPdfFontCallback);
         }
     },
     getPDFEx: function () {
@@ -842,4 +836,28 @@ function dynamicLoadCss(url) {
     link.rel = 'stylesheet';
     link.href = url;
     head.appendChild(link);
+}
+
+function _getCommonParams(treeNode) {
+    let rstParmas = {};
+    rstParmas.pageSize = rptControlObj.getCurrentPageSize();
+    rstParmas.rpt_tpl_id = treeNode.refId;
+    if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+        let refRptTplIds = [];
+        for (let node of zTreeOprObj.checkedRptTplNodes) {
+            refRptTplIds.push(node.refId);
+            let flag = null;
+            if (node.hasOwnProperty('flags')) {
+                flag = node.flags;
+                params.prj_ids = rptTplObj.getAllPrjIds();
+            }
+            flags.push(flag);
+        }
+        params.rpt_ids = refRptTplIds;
+    }
+    params.prj_id = projectObj.project.projectInfo.ID;
+
+    rstParmas.prj_id = projectObj.project.projectInfo.ID;
+    // rstParmas.custCfg = me.reportPageCfg;
+    return rstParmas;
 }

+ 33 - 5
web/over_write/js/chongqing_2018_export.js

@@ -1499,11 +1499,38 @@ const XMLStandard = (function () {
             }
             //是否有清单分类,分部分项下,清单分类和清单项目不可同层存在,如果有了清单分类,则提示其他清单项目:
             //清单xx行应是清单分类,其下必须有清单项目
+            function loadSubFBFX(nodes) {
+                const rst = [];
+                nodes.forEach(node => {
+                    if (node.data.type === billType.FB) {
+                        //创建清单分部节点
+                        const fbSource = {
+                            row: detail.mainTree.nodes[detail.mainTree.prefix + node.data.ID].serialNo() + 1,
+                            code: node.data.code,
+                            name: node.data.name,
+                            fees: node.data.fees,
+                            remark: node.data.remark
+                        };
+                        const fb = new FBBills(fbSource);
+                        rst.push(fb);
+                        if (node.children.length) {
+                            fb.children.push(...loadSubFBFX(node.children));
+                        } else {
+                            _failList.push(`第${fbSource.row}行清单分部下至少要有一条清单。`);
+                        }
+                    } else {
+                        const fx = loadBills(node, detail);
+                        rst.push(fx);
+                    }
+                });
+                return rst;
+            }
             let hasBillsClass = subEngNode.children && subEngNode.children.some(node => node.children && node.children.length);
             for (let node of subEngNode.children) {
                 if (node.data.type === billType.FB) {
+                    fbfxBills.children.push(...loadSubFBFX([node]));
                     //创建清单分部节点
-                    let fbSource = {
+                   /*  let fbSource = {
                         row: detail.mainTree.nodes[detail.mainTree.prefix + node.data.ID].serialNo() + 1,
                         code: node.data.code,
                         name: node.data.name,
@@ -1511,7 +1538,7 @@ const XMLStandard = (function () {
                         remark: node.data.remark
                     };
                     if (node.children.length === 0) {
-                        _failList.push(`第${fbSource.row}行清单分部下至少要有一条清单项目。`);
+                        _failList.push(`第${fbSource.row}行清单分部下至少要有一条分部或分项。`);
                     }
                     let fbBills = new FBBills(fbSource);
                     fbfxBills.children.push(fbBills);
@@ -1520,15 +1547,16 @@ const XMLStandard = (function () {
                         //detail.mainTree.nodes[detail.mainTree.prefix + node.data.ID].serialNo() + 1,
                         let fx = loadBills(subNode, detail);
                         fbBills.children.push(fx);
-                    }
+                    } */
                 } else {
                     //第一层有了分部,不能有分项
                     if (hasBillsClass) {
                         let row = detail.mainTree.nodes[detail.mainTree.prefix + node.data.ID].serialNo() + 1;
                         _failList.push(`第${row}行清单应是清单分部,其下必须有清单项目。<span style="color: red">(错误清单结构)</span>`);
                     }
-                    let fxBills = loadBills(node, detail);
-                    fbfxBills.children.push(fxBills);
+                    fbfxBills.children.push(...loadSubFBFX([node]));
+                    /* let fxBills = loadBills(node, detail);
+                    fbfxBills.children.push(fxBills); */
                 }
             }
             return fbfxBills;