Bläddra i källkod

汇总金额接口重构

vian 5 år sedan
förälder
incheckning
3d843b6674

+ 140 - 5
modules/pm/facade/pm_facade.js

@@ -1025,7 +1025,143 @@ async function getTendersFeeInfo(tenders) {
     return IDMapping;
 }
 
-async function getSummaryInfo(projectIDs, feeFields = null, engineeringCostFields = null){
+const defaultSummaryField = {
+    [billsFlags.ENGINEERINGCOST]: {
+        items: [
+            { name: 'engineeringCost', feeName: 'common' },
+            { name: 'estimate', feeName: 'estimate' }
+        ]
+    },
+    [billsFlags.SUB_ENGINERRING]: {
+        items: [{ name: 'subEngineering', feeName: 'common' }]
+    },
+    [billsFlags.MEASURE]: {
+        items: [{ name: 'measure', feeName: 'common' }]
+    },
+    [billsFlags.SAFETY_CONSTRUCTION]: {
+        items: [{ name: 'safetyConstruction', feeName: 'common' }]
+    },
+    [billsFlags.OTHER]: {
+        items: [{ name: 'other', feeName: 'common' }]
+    },
+    [billsFlags.CHARGE]: {
+        items: [{ name: 'charge', feeName: 'common' }]
+    },
+    [billsFlags.TAX]: {
+        items: [{ name: 'tax', feeName: 'common' }]
+    }
+};
+
+async function getSummaryInfo(projectIDs, summaryField = defaultSummaryField){
+    function initFees(target, summaryField) {
+        for (const flag in summaryField) {
+            const summaryItem = summaryField[flag];
+            summaryItem.items.forEach(item => {
+                target[item.name] = 0;
+            });
+        }
+    }
+    //ID与汇总信息映射
+    let IDMapping = {};
+    let projects = await projectModel.find({ID: {$in : projectIDs}, projType: projectType.project, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
+    //设置建设项目的总建筑面积
+    for(let project of projects){
+        let grossArea = '';
+        if(project.property && project.property.basicInformation){
+            for(let basicInfo of project.property.basicInformation){
+                if(basicInfo.key === 'basicInfo'){
+                    for(let k of basicInfo.items){
+                        if(k.key === 'grossArea'){
+                            grossArea = k.value;
+                        }
+                    }
+                }
+            }
+        }
+        IDMapping[project.ID] = {rate: 0, buildingArea: grossArea, perCost: ''};
+        initFees(IDMapping[project.ID], summaryField);
+    }
+
+    //单项工程
+    let engineerings = await projectModel.find({ParentID: {$in : projectIDs}, projType: projectType.engineering, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
+    let tenders = [];
+    let engIDs = [];
+    
+    for(let eng of engineerings){
+        engIDs.push(eng.ID);
+        IDMapping[eng.ID] = {rate: 0, buildingArea: '', perCost: ''};
+        initFees(IDMapping[eng.ID], summaryField);
+    }
+    //单位工程
+    if(engIDs.length > 0){
+        tenders = await projectModel.find({ParentID: {$in : engIDs}, projType: projectType.tender, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]});
+    }
+    let tenderIDs = [];
+    if(tenders.length > 0){
+        for(let tender of tenders){
+            tenderIDs.push(tender.ID);
+            IDMapping[tender.ID] = {rate: 0, buildingArea: '', perCost: '', changeMark:tender.changeMark,property:tender.property};
+            initFees(IDMapping[tender.ID], summaryField);
+            let buildingArea = getBuildingArea(tender.property.projectFeature);
+            if(buildingArea){
+                IDMapping[tender.ID]['buildingArea'] = buildingArea;
+            }
+        }
+        //需要获取的清单固定类别综合合价:工程造价、分部分项、措施项目、安全文明施工专项、规费、其他项目、税金...
+        let needFlags = Object.getOwnPropertyNames(summaryField);
+        //获取单位工程汇总金额需要用到的所有清单
+        let allBills = await billsModel.find({projectID: {$in: tenderIDs}, 'flags.flag': {$in: needFlags}, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}]},
+                                            '-_id projectID fees flags');
+        //进行单位工程级别的汇总
+        for(let bills of allBills){
+            let billsFlag = bills.flags[0]['flag'];
+            // 设置上单位工程需要汇总的字段金额
+            const summaryItem = summaryField[billsFlag];
+            summaryItem.items.forEach(costItem => {
+                IDMapping[bills.projectID][costItem.name] = getTotalFee(bills, costItem.feeName);
+            });
+        }
+        const summaryNames = [];
+        for (const flag in summaryField) {
+            summaryField[flag].items.forEach(item => summaryNames.push(item.name));
+        }
+        //进行单项工程级别的汇总
+        for(let tender of tenders){
+            summarizeToParent(IDMapping[tender.ParentID], IDMapping[tender.ID], summaryNames);
+        }
+        //进行建设项目级别的汇总
+        for(let eng of engineerings){
+            summarizeToParent(IDMapping[eng.ParentID], IDMapping[eng.ID], summaryNames);
+        }
+        //占造价比例、单方造价
+        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];
+            let projInfo = IDMapping[eng.ParentID];
+            engInfo.rate = !isDef(projInfo) || projInfo.engineeringCost == 0 ? 0 : scMathUtil.roundTo(engInfo.engineeringCost * 100 / projInfo.engineeringCost, rateDecimal);
+        }
+        //建设项目占造价比例及单方造价
+        for(let project of projects){
+            let projectInfo = IDMapping[project.ID];
+            projectInfo.rate = 100;
+            projectInfo.perCost = projectInfo.buildingArea.toString().trim() === '' || projectInfo.buildingArea == 0 
+            ? projectInfo.buildingArea.toString().trim() 
+            : scMathUtil.roundTo(projectInfo.engineeringCost / projectInfo.buildingArea, perCostDecimal);
+        }
+    }
+    return IDMapping;
+}
+/* async function getSummaryInfo(projectIDs, feeFields = null, engineeringCostFields = null){
     function initFees(obj, feeFields, engineeringCostFields) {
         for (let data of feeFields) {
             obj[data.v] = 0;
@@ -1154,7 +1290,7 @@ async function getSummaryInfo(projectIDs, feeFields = null, engineeringCostField
         }
     }
     return IDMapping;
-}
+} */
 
 //根据项目ID获取所属建设项目
 //@param {Number}projectID @return {Object}
@@ -1422,7 +1558,7 @@ async function getProjectFeature(valuationID, engineeringName, feeName) {
 
 //根据单位工程,获取建设项目-单项工程-单位工程,不包含无单位工程的单项工程
 //@param {Number}tenderID(单位工程ID) {Number}granularity(颗粒度 1:建设项目 2:单项工程 3:单位工程)
-async function getProjectByGranularity(tenderID, granularity, summaryObj, userID, versionName) {
+async function getProjectByGranularity(tenderID, granularity, summaryField, userID, versionName) {
     const GRANULARITY = {
         PROJECT: 1,
         ENGINEERING: 2,
@@ -1456,8 +1592,7 @@ async function getProjectByGranularity(tenderID, granularity, summaryObj, userID
     }
     constructionProject.children = engineerings;
     //获取汇总信息
-    const { feeFields, engineeringCostFields } = summaryObj;
-    constructionProject.summaryInfo = await getSummaryInfo([constructionProject.ID], feeFields, engineeringCostFields);
+    constructionProject.summaryInfo = await getSummaryInfo([constructionProject.ID], summaryField);
     //获取编制软件信息: 软件公司;软件名;版本号;授权信息; base64
     let product = await productModel.findOne({});
     let company = product.company || '珠海纵横创新软件有限公司',

+ 42 - 16
web/over_write/js/chongqing_2018_export.js

@@ -140,22 +140,48 @@ const XMLStandard = (function () {
 
     // 项目汇总字段
     const summaryObj = {
-        feeFields: [
-            {k: fixedFlag.ENGINEERINGCOST, v: 'engineeringCost'},
-            {k: fixedFlag.SUB_ENGINERRING, v: 'subEngineering'},
-            {k: fixedFlag.MEASURE, v: 'measure'},
-            {k: fixedFlag.SAFETY_CONSTRUCTION, v: 'safetyConstruction'},
-            {k: fixedFlag.OTHER, v: 'other'},
-            {k: fixedFlag.CHARGE, v: 'charge'},
-            {k: fixedFlag.PROVISIONAL, v: 'provisional'},
-            {k: fixedFlag.MATERIAL_PROVISIONAL, v: 'materialProvisional'},
-            {k: fixedFlag.ENGINEERING_ESITIMATE, v: 'engineeringEstimate'},
-            {k: fixedFlag.DAYWORK, v: 'daywork'},
-            {k: fixedFlag.TURN_KEY_CONTRACT, v: 'turnKeyContract'},
-            {k: fixedFlag.CLAIM_VISA, v: 'claimVisa'},
-            {k: fixedFlag.TAX, v: 'tax'}
-        ],
-        engineeringCostFields: null
+        [fixedFlag.SUB_ENGINERRING]: {
+            items: [{ name: 'subEngineering', feeName: 'common' }]
+        },
+        [fixedFlag.MEASURE]: {
+            items: [{ name: 'measure', feeName: 'common' }]
+        },
+        [fixedFlag.SAFETY_CONSTRUCTION]: {
+            items: [{ name: 'safetyConstruction', feeName: 'common' }]
+        },
+        [fixedFlag.OTHER]: {
+            items: [{ name: 'other', feeName: 'common' }]
+        },
+        [fixedFlag.CHARGE]: {
+            items: [{ name: 'charge', feeName: 'common' }]
+        },
+        [fixedFlag.PROVISIONAL]: {
+            items: [{ name: 'provisional', feeName: 'common' }]
+        },
+        [fixedFlag.MATERIAL_PROVISIONAL]: {
+            items: [{ name: 'materialProvisional', feeName: 'common' }]
+        },
+        [fixedFlag.ENGINEERING_ESITIMATE]: {
+            items: [{ name: 'engineeringEstimate', feeName: 'common' }]
+        },
+        [fixedFlag.DAYWORK]: {
+            items: [{ name: 'daywork', feeName: 'common' }]
+        },
+        [fixedFlag.TURN_KEY_CONTRACT]: {
+            items: [{ name: 'turnKeyContract', feeName: 'common' }]
+        },
+        [fixedFlag.CLAIM_VISA]: {
+            items: [{ name: 'claimVisa', feeName: 'common' }]
+        },
+        [fixedFlag.TAX]: {
+            items: [{ name: 'tax', feeName: 'common' }]
+        },
+        [fixedFlag.ENGINEERINGCOST]: {
+            items: [
+                { name: 'engineeringCost', feeName: 'common' },
+                { name: 'estimate', feeName: 'estimate' }
+            ]
+        }
     };
 
     // 通用设置和工具

+ 77 - 35
web/over_write/js/guangdong_2018_export.js

@@ -265,33 +265,66 @@ const XMLStandard = (function () {
 
     // 项目汇总字段
     const summaryObj = {
-        // 取固定清单的综合合价进行汇总
-        feeFields: [
-            { k: fixedFlag.ENGINEERINGCOST, v: 'engineeringCost' },
-            { k: fixedFlag.SUB_ENGINERRING, v: 'subEngineering' },
-            { k: fixedFlag.MEASURE, v: 'measure' },
-            { k: fixedFlag.GREEN_MEASURE_FEE, v: 'greenMeasureFee' },
-            { k: fixedFlag.OTHER_MEASURE_FEE, v: 'otherPreliminaries' },
-            { k: fixedFlag.OTHER, v: 'other' },
-            { k: fixedFlag.PROVISIONAL, v: 'provisional' },
-            { k: fixedFlag.MATERIAL_PROVISIONAL, v: 'materialProvisional' },
-            { k: fixedFlag.ENGINEERING_ESITIMATE, v: 'engineeringEstimate' },
-            { k: fixedFlag.DAYWORK, v: 'daywork' },
-            { k: fixedFlag.TURN_KEY_CONTRACT, v: 'turnKeyContract' },
-            { k: fixedFlag.CLAIM, v: 'claim' },
-            { k: fixedFlag.VISA, v: 'visa' },
-            { k: fixedFlag.TAX, v: 'tax' }
-        ],
-        // 取工程造价的一些费用进行汇总,k为汇总到summaryInfo的字段,v为取的工程造价费用字段
-        engineeringCostFields: [
-            { k: 'labour', v: 'labour' },
-            { k: 'material', v: 'material' },
-            { k: 'equipment', v: 'equipment' },
-            { k: 'mainMaterial', v: 'mainMaterial' },
-            { k: 'machine', v: 'machine' },
-            { k: 'overhead', v: 'manage' },
-            { k: 'profit', v: 'profit' },
-        ]
+        [fixedFlag.SUB_ENGINERRING]: {
+            items: [
+                { name: 'subEngineering', feeName: 'common' },
+                { name: 'subEngineeringLabour', feeName: 'labour' },
+                { name: 'subEngineeringMaterial', feeName: 'material' },
+                { name: 'subEngineeringEquipment', feeName: 'equipment' },
+                { name: 'subEngineeringMainMaterial', feeName: 'mainMaterial' },
+                { name: 'subEngineeringMachine', feeName: 'machine' },
+                { name: 'subEngineeringManage', feeName: 'manage' },
+                { name: 'subEngineeringProfit', feeName: 'profit' }
+            ]
+        },
+        [fixedFlag.MEASURE]: {
+            items: [
+                { name: 'measure', feeName: 'common' },
+                { name: 'measureLabour', feeName: 'labour' },
+                { name: 'measureMaterial', feeName: 'material' },
+                { name: 'measureEquipment', feeName: 'equipment' },
+                { name: 'measureMainMaterial', feeName: 'mainMaterial' },
+                { name: 'measureMachine', feeName: 'machine' },
+                { name: 'measureManage', feeName: 'manage' },
+                { name: 'measureProfit', feeName: 'profit' }
+            ]
+        },
+        [fixedFlag.GREEN_MEASURE_FEE]: {
+            items: [{ name: 'greenMeasureFee', feeName: 'common' }]
+        },
+        [fixedFlag.OTHER_MEASURE_FEE]: {
+            items: [{ name: 'otherPreliminaries', feeName: 'common' }]
+        },
+        [fixedFlag.OTHER]: {
+            items: [{ name: 'other', feeName: 'common' }]
+        },
+        [fixedFlag.PROVISIONAL]: {
+            items: [{ name: 'provisional', feeName: 'common' }]
+        },
+        [fixedFlag.MATERIAL_PROVISIONAL]: {
+            items: [{ name: 'materialProvisional', feeName: 'common' }]
+        },
+        [fixedFlag.ENGINEERING_ESITIMATE]: {
+            items: [{ name: 'engineeringEstimate', feeName: 'common' }]
+        },
+        [fixedFlag.DAYWORK]: {
+            items: [{ name: 'daywork', feeName: 'common' }]
+        },
+        [fixedFlag.TURN_KEY_CONTRACT]: {
+            items: [{ name: 'turnKeyContract', feeName: 'common' }]
+        },
+        [fixedFlag.CLAIM]: {
+            items: [{ name: 'claim', feeName: 'common' }]
+        },
+        [fixedFlag.VISA]: {
+            items: [{ name: 'visa', feeName: 'common' }]
+        },
+        [fixedFlag.TAX]: {
+            items: [{ name: 'tax', feeName: 'common' }]
+        },
+        [fixedFlag.ENGINEERINGCOST]: {
+            items: [{ name: 'engineeringCost', feeName: 'common' }]
+        }
     };
 
     // 获取工程类型:枚举单位工程的工程专业+费用标准,用“;”分隔
@@ -869,6 +902,15 @@ const XMLStandard = (function () {
         }
         // 费用汇总
         function SummaryOfCost(summaryInfo) {
+            // 人工费、材料费、机械费...: 取“分部分项工程”行+“措施项目”行对应的费用值
+            const totalLabour = scMathUtil.roundForObj(summaryInfo.subEngineeringLabour + summaryInfo.measureLabour, Decimal.FEE);
+            const totalMaterial = scMathUtil.roundForObj(summaryInfo.subEngineeringMaterial + summaryInfo.measureMaterial, Decimal.FEE);
+            const totalMachine = scMathUtil.roundForObj(summaryInfo.subEngineeringMachine + summaryInfo.measureMachine, Decimal.FEE);
+            const totalEquipment = scMathUtil.roundForObj(summaryInfo.subEngineeringEquipment + summaryInfo.measureEquipment, Decimal.FEE);
+            const totalMainMaterial = scMathUtil.roundForObj(summaryInfo.subEngineeringMainMaterial + summaryInfo.measureMainMaterial, Decimal.FEE);
+            const totalMainMaterialEquipment = scMathUtil.roundForObj(totalMainMaterial + totalEquipment, Decimal.FEE);
+            const totalManage = scMathUtil.roundForObj(summaryInfo.subEngineeringManage + summaryInfo.measureManage, Decimal.FEE);
+            const totalProfit = scMathUtil.roundForObj(summaryInfo.subEngineeringProfit + summaryInfo.measureProfit, Decimal.FEE);
             const attrs = [
                 // 工程造价(元)
                 {
@@ -948,42 +990,42 @@ const XMLStandard = (function () {
                 // 人工费
                 {
                     name: 'Labor', type: _type.DECIMAL,
-                    value: summaryInfo.labour
+                    value: totalLabour
                 },
                 // 材料费
                 {
                     name: 'Material', type: _type.DECIMAL,
-                    value: summaryInfo.material
+                    value: totalMaterial
                 },
                 // 设备费
                 {
                     name: 'Equipment', type: _type.DECIMAL,
-                    value: summaryInfo.equipment
+                    value: totalEquipment
                 },
                 // 主材设备费
                 {
                     name: 'MainMaterialEquipment', type: _type.DECIMAL,
-                    value: scMathUtil.roundForObj(summaryInfo.mainMaterial + summaryInfo.equipment, Decimal.FEE)
+                    value: totalMainMaterialEquipment
                 },
                 // 主材费
                 {
                     name: 'MainMaterial', type: _type.DECIMAL,
-                    value: summaryInfo.mainMaterial
+                    value: totalMainMaterial
                 },
                 // 机械费
                 {
                     name: 'Machine', type: _type.DECIMAL,
-                    value: summaryInfo.machine
+                    value: totalMachine
                 },
                 // 管理费
                 {
                     name: 'Overhead', type: _type.DECIMAL,
-                    value: summaryInfo.overhead
+                    value: totalManage
                 },
                 // 利润
                 {
                     name: 'Profit', type: _type.DECIMAL,
-                    value: summaryInfo.profit
+                    value: totalProfit
                 },
             ];
             _base.Element.call(this, 'SummaryOfCost', attrs, '费用汇总');