瀏覽代碼

Merge branch 'budget' of http://192.168.1.41:3000/SmartCost/ConstructionCost into budget

TonyKang 4 年之前
父節點
當前提交
9cffa617f7

+ 12 - 1
modules/equipment_purchase/facade/equipment_purchase_facade.js

@@ -5,7 +5,8 @@ module.exports={
     deleteEquipment:deleteEquipment,
     updateEquipments:updateEquipments,
     getEquipmentTotalCost:getEquipmentTotalCost,
-    getEquipmentSummary:getEquipmentSummary
+    getEquipmentSummary:getEquipmentSummary,
+    getSortedEquipmentData,
 };
 
 let mongoose = require('mongoose');
@@ -57,6 +58,16 @@ function sortEquipments(equipments) {
     }
 }
 
+// 获取单位工程设备购置数据(按树结构排好序的)
+async function getSortedEquipmentData(unitID) {
+    const equipment = await equipmentPurchaseModel.findOne({ projectID: unitID }).lean();
+    if (!equipment) {
+        return [];
+    }
+    const items = sortEquipments(equipment.equipments || []);
+    items.forEach(item => item.feeType = 'equipment');
+    return items;
+}
 
 async function getEquipmentSummary(user_id, projectIDs) {
      let data = [];

+ 47 - 9
modules/main/facade/bill_facade.js

@@ -19,7 +19,7 @@ let ration_template_Model = mongoose.model('ration_template');
 let bill_Model = require('../models/bills').model;
 let billsLibDao = require("../../bills_lib/models/bills_lib_interfaces");
 const pmFacade = require('../../pm/facade/pm_facade');
-const { getSortedTreeData, getEngineeringFeeType } = require('../../../public/common_util');
+const { getSortedTreeData, getSortedSeqTreeData, getEngineeringFeeType } = require('../../../public/common_util');
 const { billType, constructionFeeNodeID, constructionEquipmentFeeNodeID, BudgetArea, fixedFlag, BudgetType } = require('../../../public/common_constants');
 const scMathUtil = require('../../../public/scMathUtil').getUtil();
 const uuidV1 = require('uuid/v1');
@@ -183,20 +183,58 @@ module.exports={
         });
         return map;
     },
-    // 获取概算汇总单项工程级别数据(拍好序的,报表接口用)
+    // 获取单位工程分部数据(按树结构排好序的)
+    getFBData: async function (unitID) {
+        const bills = await bill_Model.find({ projectID: unitID }).lean();
+        const sortedData = getSortedTreeData('-1', bills);
+        return sortedData.filter(item => item.type === billType.FB);
+    },
+    // 获取概算汇总单项工程级别数据(排好序的,报表接口用)
     getSinglesBudgetSummary: async function (constructionID) {
         const items = await this.getBudgetSummary(constructionID, true);
         // 去除建设项目层级
         items.shift();
-        items.forEach(item => {
+        const [budgetTotalItem] = items.splice(items.length - 1, 1);
+        const budgetTotalFeeItem = budgetTotalItem.fees && budgetTotalItem.fees.find(f => f.fieldName === 'common');
+        const budgetTotalFee = budgetTotalFeeItem ? +budgetTotalFeeItem.totalFee : 0;
+        const rst = [];
+        for (const project of items) {
+            rst.push(project);
             // 方便报表取值处理
-            if (item.projType === 'Engineering') {
-                item.engineeringName = item.name || '';
-            } else if (item.projType === 'Tender') {
-                item.tenderName = item.name || '';
+            if (project.projType === 'Engineering') {
+                project.engineeringName = project.name || '';
+            } else if (project.projType === 'Tender') {
+                project.tenderName = project.name || '';
+                // 追加分部和设备购置数据
+                const feeType = getEngineeringFeeType(project.property && project.property.engineeringName || '');
+                const fbs = await this.getFBData(project.orgProjectID);
+                const equipments = await equipmentFacade.getSortedEquipmentData(project.orgProjectID);
+                const detailData = [...fbs, ...equipments].map(item => {
+                    let totalFee = 0;
+                    if (item.feeType === 'equipment') {
+                        totalFee = item.totalPrice || 0;
+                    } else {
+                        const totalFeeItem = item.fees && item.fees.find(f => f.fieldName === 'common');
+                        totalFee = totalFeeItem ? +totalFeeItem.totalFee : 0;
+                    }
+                    // 计算占总投资比例
+                    const rate = (budgetTotalFee ?  scMathUtil.roundForObj(totalFee / budgetTotalFee, 4) : 0) * 100;
+                    return {
+                        code: item.code || '',
+                        name: item.name || '',
+                        buildingFee: item.feeType !== 'equipment' && feeType === 'building' ? totalFee : 0,
+                        installationFee: item.feeType !== 'equipment' && feeType === 'installation' ? totalFee : 0,
+                        equipmentFee: item.feeType === 'equipment' ? totalFee : 0,
+                        otherFee: 0,
+                        totalFee,
+                        rate,
+                    }
+                });
+                rst.push(...detailData);
+                
             }
-        });
-        return items;
+        }
+        return rst;
     },
 
     // 获取概算汇总数据(拍好序的)

+ 1 - 1
modules/ration_glj/facade/glj_calculate_facade.js

@@ -305,7 +305,7 @@ function generateAdjustState(glj,coeList,adjustState,gljList,quantity) {
         displayQuantity = displayQuantity&&displayQuantity!=""?parseFloat(displayQuantity):0;
         adjustState.push({index:stateSeq.add,content:'添'+glj.code+'量'+ displayQuantity,type:"添"+glj.code});
     }
-    // to do
+  
 
   //标准附注条件调整 + 自定义乘系数
     if(_.last(gljList).ID == glj.ID){//最后一个工料机的时候才生成,生成一次就可以了

+ 25 - 2
public/common_util.js

@@ -72,13 +72,13 @@ function deleteEmptyObject(arr) {
         return sortSameDedth(rootID, items).reverse();
 
         function sortSameDedth(parentID, items) {
-            const sameDepthItems = items.filter(item => item.ParentID === parentID);
+            const sameDepthItems = items.filter(item => item.ParentID == parentID);
             if (!sameDepthItems.length) {
                 return [];
             }
             const NextIDMapping = {};
             sameDepthItems.forEach(item => NextIDMapping[item.NextSiblingID] = item);
-            let curItem = sameDepthItems.length > 1 ? sameDepthItems.find(item => +item.NextSiblingID === -1) : sameDepthItems[0];
+            let curItem = sameDepthItems.length > 1 ? sameDepthItems.find(item => +item.NextSiblingID == -1) : sameDepthItems[0];
             const sorted = [];
             while (curItem) {
                 sorted.push(...sortSameDedth(curItem.ID, items));
@@ -89,6 +89,29 @@ function deleteEmptyObject(arr) {
         }
     }
 
+    function getSortedSeqTreeData(rootID, items) {
+        const parentMap = {};
+        items.forEach(item => {
+            (parentMap[item.ParentID] || (parentMap[item.ParentID] = [])).push(item);
+        });
+        Object.values(parentMap).forEach(data => data.sort((a, b) => a.seq - b.seq));
+        const rst = [];
+        function extractItems(data) {
+            if (data && data.length) {
+                for (const item of data) {
+                    rst.push(item);
+                    const children = parentMap[item.ID];
+                    if (children && children.length) {
+                        extractItems(children);
+                    }
+                }
+            }
+            
+        }
+        extractItems(parentMap[rootID]);
+        return rst;
+    }
+
     // 控制全屏(浏览器有限制)
     // Element.requestFullscreen的全屏和“F11”的全屏是不一样的。前者是将相关Element变成全屏显示。后者是将浏览器导航、标签等隐藏。
     // Fullscreen API对于全屏的判断和监听都是基于Element.requestFullscreen的,比如Document.fullscreenElement。通过F11触发的全屏Document.fullscreenElement返回null,无法正确返回全屏状态。

+ 13 - 10
web/building_saas/main/js/models/ration.js

@@ -407,10 +407,10 @@ var Ration = {
             let selectedLib = (cleanzmhs == true && recodes.length > 0)? recodes[0].node.data.libID : sessionStorage.getItem("stdRationLib");
             selectedLib&&selectedLib!='undefined'?libIDs.unshift(selectedLib):libIDs.unshift(defaultLibID);
             for(let r of recodes){
-                let needInstall = false;
-                if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
+                let needInstall = projectObj.project.isInstall();
+               /*  if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
                     needInstall = project.Bills.isFBFX(r.node);
-                }
+                } */
                 r.value===null||r.value===undefined?"":r.value = r.value.replace(/[\s\r\n]/g, "");//去掉空格回车换行等字符
                 if(cleanzmhs  == true||r.value != r.node.data.code){
                     nodeInfo.push({ID:r.node.data.ID,billsItemID:r.node.data.billsItemID,newCode:r.value,needInstall:needInstall});
@@ -479,10 +479,11 @@ var Ration = {
             };
             if(billItemID){
                 let calQuantity = optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
-                if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
+                needInstall = projectObj.project.isInstall();
+                /* if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
                     let billsNode = project.mainTree.getNodeByID(billItemID);
                     needInstall = project.Bills.isFBFX(billsNode);//在分部分项插入的定额才需要定额安装增加费
-                }
+                } */
                 for(let i = 0; i < items.length; i++){
                     let newData = me.getTempRationData(me.getNewRationID(), billItemID, serialNo, items[i].rationType);
                     serialNo++;
@@ -612,10 +613,11 @@ var Ration = {
                         brUpdate.push({projectID:newData.projectID,ID:br[i].ID,serialNo:br[i].serialNo});
                     }
                 }
-                if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
+                needInstall = projectObj.project.isInstall();
+               /*  if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
                     let billsNode = project.mainTree.getNodeByID(billItemID);
                     needInstall = project.Bills.isFBFX(billsNode);//在分部分项插入的定额才需要定额安装增加费
-                }
+                } */
                 if(ext) gljUtil.setProperty(newData,ext);
                 $.bootstrapLoading.start();
                 CommonAjax.post("/ration/addNewRation",{projectID:me.project.ID(),itemQuery:itemQuery,newData:newData,defaultLibID: rationLibObj.getDefaultStdRationLibID(),calQuantity:calQuantity,brUpdate:brUpdate,needInstall:needInstall},function (data) {
@@ -701,14 +703,15 @@ var Ration = {
                         brUpdate.push({projectID:newData.projectID,ID:br[i].ID,serialNo:br[i].serialNo});
                     }
                 }
-                if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
+                needInstall = projectObj.project.isInstall();
+               /*  if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
                     let billsNode = project.mainTree.getNodeByID(billItemID);
-                }
+                } */
                 $.bootstrapLoading.start();
                 newNode = project.mainTree.insert(billItemID, nextID, newID);
                 newNode.sourceType = project.Ration.getSourceType();
                 newNode.data = newData;
-                CommonAjax.post("/ration/addNewRation",{itemQuery:null,newData:newData,defaultLibID: rationLibObj.getDefaultStdRationLibID(),calQuantity:false,brUpdate:brUpdate,needInstall:false},function (data) {
+                CommonAjax.post("/ration/addNewRation",{itemQuery:null,newData:newData,defaultLibID: rationLibObj.getDefaultStdRationLibID(),calQuantity:false,brUpdate:brUpdate,needInstall:needInstall},function (data) {
                     //更新缓存
                     me.datas.push(data.ration);
                     me.addSubListOfRation(data);

+ 3 - 3
web/building_saas/main/js/views/mbzm_view.js

@@ -437,10 +437,10 @@ let mbzm_obj={
     },
     getDefaultRationCreateData:function(newData,code,libID,isFBFX){
         let itemQuery = {userID: userID, rationRepId: libID, code: code};
-        let needInstall = false;
-        if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
+        let needInstall = projectObj.project.isInstall();
+       /*  if(projectObj.project.isInstall()) {//如果是安装工程,要看需不需要生成安装增加费
             needInstall = isFBFX;//在分部分项插入的定额才需要定额安装增加费
-        }
+        } */
         return{itemQuery:itemQuery,newData:newData,defaultLibID: rationLibObj.getDefaultStdRationLibID(),calQuantity:false,brUpdate:[],needInstall:needInstall}
     },
 /*    getQuantity:function (data) {//取最新的消耗量,需经过转换

+ 1 - 1
web/building_saas/main/js/views/select_FB_view.js

@@ -91,7 +91,7 @@ let selectFBObject = {
         /*1.当前定位在“分项”,则弹出“选择分部”窗口,并且默认定位在:根据分项编号的前9位查找清单规则中的父项。如果查找不到父项,则默认定位在第一行。 */
         let selected = projectObj.project.mainTree.selected;
         if(selected.data.type==billType.FX || selected.data.type==billType.BX){
-            let code = selected.data.code;
+            let code = selected.data.code?selected.data.code:'';
             if(code.length === 12){
                 let matchCode =  code.substring(0,9);
                 for(let i of billsGuidance.bills.tree.items){