Browse Source

费用汇总算法

chenshilong 4 năm trước cách đây
mục cha
commit
ffb2e30bbd

+ 86 - 73
modules/main/facade/calc_program_facade.js

@@ -9,7 +9,7 @@ let stdCalcProgramsModel = mongoose.model('std_calc_programs');
 let projectCalcProgramsModel = mongoose.model('calc_programs');
 let gatherCalcProgramsModel = mongoose.model('gather_calc_programs');
 let EngineeringLibModel = require("../../users/models/engineering_lib_model");
-let _=require("lodash");
+let _ = require("lodash");
 let consts = require('../models/project_consts');
 let projectConsts = consts.projectConst;
 
@@ -39,7 +39,7 @@ async function newProjectCalcProgramFile(data) {
     // 绑定多个计算程序标准文件时,默认取第一个作为标准模板。
     // let stdCP = await getStdCalcProgramFile(valid_CP_libs[0].id);
     let stdCP = await getStdCalcProgramFile(data.property.calcProgram.id);
-    let doc={
+    let doc = {
         ID: uuidV1(),
         projectID: data.ID,
         name: data.name,
@@ -53,13 +53,13 @@ async function newProjectCalcProgramFile(data) {
 };
 
 async function getProjectCalcProgramFile(ID) {
-    let projCP = await projectCalcProgramsModel.findOne({ID:ID});
+    let projCP = await projectCalcProgramsModel.findOne({ID: ID});
     return projCP;
 };
 
 async function getStdCalcProgramFile(libID) {
-  let stdCP  = await stdCalcProgramsModel.findOne({ID:libID});
-  return stdCP;
+    let stdCP = await stdCalcProgramsModel.findOne({ID: libID});
+    return stdCP;
 };
 
 // 统一的 getData() 方法供project调用
@@ -83,38 +83,40 @@ function getData(projectID, callback) {
                 });
             } else {
                 callback(0, projectConsts.CALC_PROGRAM, datas);
-            };
+            }
+            ;
         } else {
             callback(1, projectConsts.CALC_PROGRAM, null);
-        };
+        }
+        ;
     });
 };
 
 // 统一的 save() 方法供project调用
-function save (user_id, datas, callback) {
-    let returnData ={
-        moduleName:'calc_program',
-        data:{}
+function save(user_id, datas, callback) {
+    let returnData = {
+        moduleName: 'calc_program',
+        data: {}
     };
-    projectCalcProgramsModel.update({"projectID": 553}, {"libName":"goo—test"}, callback(null, returnData));
+    projectCalcProgramsModel.update({"projectID": 553}, {"libName": "goo—test"}, callback(null, returnData));
 }
 
 // saveCalcItem({projectID: 597, templatesID: 4, calcItem: calcItem})
 function saveCalcItem(dataObj, callback) {
-    dataObj=JSON.parse(dataObj);
+    dataObj = JSON.parse(dataObj);
     projectCalcProgramsModel.findOne({projectID: dataObj.projectID}, function (err, data) {
-        if(!err){
-            for (let i = 0; i < data.templates.length; i++){
-                if (data.templates[i].ID == dataObj.templatesID){
-                    for (let j=0; j < data.templates[i].calcItems.length; j++){
-                        if (data.templates[i].calcItems[j].ID == dataObj.calcItem.ID){
+        if (!err) {
+            for (let i = 0; i < data.templates.length; i++) {
+                if (data.templates[i].ID == dataObj.templatesID) {
+                    for (let j = 0; j < data.templates[i].calcItems.length; j++) {
+                        if (data.templates[i].calcItems[j].ID == dataObj.calcItem.ID) {
                             data.templates[i].calcItems[j] = dataObj.calcItem;
                             break;
-                        };
-                    };
+                        }
+                    }
                     break;
-                };
-            };
+                }
+            }
             data.save(function (err) {
                 if (err) {
                     callback(1, '本条计算规则保存失败');
@@ -133,20 +135,20 @@ function saveCalcItem(dataObj, callback) {
 function saveCalcItems(datas, callback) {
     let datasObj = JSON.parse(datas);
     projectCalcProgramsModel.findOne({projectID: datasObj.projectID}, function (err, data) {
-        if(!err){
-            for (let cI of datasObj.calcItems){
-                for (let i = 0; i < data.templates.length; i++){
-                    if (data.templates[i].ID == cI.templatesID){
-                        for (let j=0; j < data.templates[i].calcItems.length; j++){
-                            if (data.templates[i].calcItems[j].ID == cI.calcItem.ID){
+        if (!err) {
+            for (let cI of datasObj.calcItems) {
+                for (let i = 0; i < data.templates.length; i++) {
+                    if (data.templates[i].ID == cI.templatesID) {
+                        for (let j = 0; j < data.templates[i].calcItems.length; j++) {
+                            if (data.templates[i].calcItems[j].ID == cI.calcItem.ID) {
                                 data.templates[i].calcItems[j] = cI.calcItem;
                                 break;
-                            };
-                        };
+                            }
+                        }
                         break;
-                    };
-                };
-            };
+                    }
+                }
+            }
             data.save(function (err) {
                 if (err) {
                     callback(1, '本条计算规则保存失败');
@@ -165,11 +167,11 @@ function saveCalcItems(datas, callback) {
 // 插入一条计算规则、删除一条计算规则,则整套计算规则整个传入更新,仅calcItems指定值。
 // 修改文件名称,则只传入name。
 function updateTemplate(dataObj, callback) {
-    dataObj=JSON.parse(dataObj);
+    dataObj = JSON.parse(dataObj);
     projectCalcProgramsModel.findOne({projectID: dataObj.projectID}, function (err, data) {
-        if(!err){
-            for (let i = 0; i < data.templates.length; i++){
-                if (data.templates[i].ID == dataObj.ID){
+        if (!err) {
+            for (let i = 0; i < data.templates.length; i++) {
+                if (data.templates[i].ID == dataObj.ID) {
                     if (dataObj.name)
                         data.templates[i].name = dataObj.name;
                     if (dataObj.custom)
@@ -177,8 +179,10 @@ function updateTemplate(dataObj, callback) {
                     if (dataObj.calcItems)
                         data.templates[i].calcItems = dataObj.calcItems;
                     break;
-                };
-            };
+                }
+                ;
+            }
+            ;
             data.save(function (err) {
                 if (err) {
                     callback(1, '计算模板保存失败');
@@ -196,10 +200,10 @@ function updateTemplate(dataObj, callback) {
 // 一次性替换所有模板:用于切换模板文件。(这里实际上只替换了所有模板,基本信息如projectID、name等保留)
 // {projectID: 2706, libID: 2}
 async function updateTemplateFile(dataObj, callback) {
-    dataObj=JSON.parse(dataObj);
+    dataObj = JSON.parse(dataObj);
     let stdCP = await getStdCalcProgramFile(dataObj.libID);
     projectCalcProgramsModel.findOne({projectID: dataObj.projectID}, function (err, data) {
-        if(!err){
+        if (!err) {
             data.templates = stdCP.templates;
             data.save(function (err) {
                 if (err) {
@@ -217,11 +221,11 @@ async function updateTemplateFile(dataObj, callback) {
 
 // {  projectID: 1233, ID: 19, name: '建筑工程2', custom: true, calcItems: [{},{}] }
 function addTemplate(dataObj, callback) {
-    dataObj=JSON.parse(dataObj);
+    dataObj = JSON.parse(dataObj);
     projectCalcProgramsModel.update({projectID: dataObj.projectID},
         {
-            $push:{
-                templates:{
+            $push: {
+                templates: {
                     "ID": dataObj.ID,
                     "name": dataObj.name,
                     "calcItems": dataObj.calcItems,
@@ -242,11 +246,11 @@ function addTemplate(dataObj, callback) {
 
 // {  projectID: 1233, ID: 19}
 function deleteTemplate(dataObj, callback) {
-    dataObj=JSON.parse(dataObj);
+    dataObj = JSON.parse(dataObj);
     projectCalcProgramsModel.update({projectID: dataObj.projectID},
         {
-            $pull:{
-                templates:{
+            $pull: {
+                templates: {
                     "ID": dataObj.ID
                 }
             }
@@ -263,38 +267,47 @@ function deleteTemplate(dataObj, callback) {
 };
 
 async function saveGatherCalcPrograms(dataObj, callback) {
-  dataObj = JSON.parse(dataObj);
-  await gatherCalcProgramsModel.findOne({projectID: dataObj.projectID}, function (err, data) {
-    if(data == null){ // 第一次保存,找不到
-      let doc={
-        projectID: dataObj.projectID,
-        totalFee: dataObj.totalFee,
-        calcPrograms: dataObj.calcPrograms
-      };
-      gatherCalcProgramsModel.create(doc, function (err) {
-        if (err) {
-          callback(1, '汇总计算程序创建失败' + err, null);
-        } else {
-          callback(0, '成功', doc.projectID);
+    dataObj = JSON.parse(dataObj);
+    await gatherCalcProgramsModel.findOne({projectID: dataObj.projectID}, function (err, data) {
+        if (data == null) { // 第一次保存,找不到
+            let doc = {
+                projectID: dataObj.projectID,
+                totalFee: dataObj.totalFee,
+                calcPrograms: dataObj.calcPrograms
+            };
+            gatherCalcProgramsModel.create(doc, function (err) {
+                if (err) {
+                    callback(1, '汇总计算程序创建失败' + err, null);
+                } else {
+                    callback(0, '成功', doc.projectID);
+                }
+            });
         }
-      });
-    }
-    else {
-      data.totalFee = dataObj.totalFee;
-      data.calcPrograms = dataObj.calcPrograms;
-      data.save(function (err) {
-        if (err) {
-          callback(1, '汇总计算程序保存失败' + err, null);
-        } else {
-          callback(0, '成功', data.projectID);
+        else {
+            data.totalFee = dataObj.totalFee;
+            data.calcPrograms = dataObj.calcPrograms;
+            data.save(function (err) {
+                if (err) {
+                    callback(1, '汇总计算程序保存失败' + err, null);
+                } else {
+                    callback(0, '成功', data.projectID);
+                }
+            });
         }
-      });
-    }
-  })
+    })
 };
 
+// 报表用多单位工程的费用汇总数据。
+async function getGatherFees(projectIDsArr) {
+    let rst = await gatherCalcProgramsModel.find({projectID: {"$in": projectIDsArr}}, ["-_id"]).lean();
+    // console.log(rst);
+    return rst;
+}
+
 
 // for test
+// getGatherFees([77218, 5097]);
+// getGatherFees([77297, 79097]);
 // let s = '{"projectID":2164,"ID":23,"name":"建筑工程7","custom":true,"calcItems":[]}';
 // addTemplate(s, function(data){console.log('add successfull!')});
 // let s = '{"projectID":2164,"ID":15}';

+ 10 - 9
modules/pm/models/project_model.js

@@ -67,10 +67,10 @@ ProjectsDAO.prototype.getAllUnitProjects = async function (userId, compilation,
                 'compilation': compilation,
                 'property.rootProjectID': rootPrjID,
                 'deleteInfo': null
-                }, 
+                },
                 {
-                    'userID': userId, 
-                    'compilation': compilation, 
+                    'userID': userId,
+                    'compilation': compilation,
                     'property.rootProjectID': rootPrjID,
                     'deleteInfo.deleted': {'$in': [null, false]}
                 }
@@ -84,13 +84,13 @@ ProjectsDAO.prototype.getAllUnitProjects = async function (userId, compilation,
                 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);
@@ -100,7 +100,7 @@ ProjectsDAO.prototype.getAllUnitProjects = async function (userId, compilation,
         callback(1, 'Error', null);
     }
 }
-    
+
 ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, callback) {
     try {//
         let projects = await Projects.find({
@@ -118,13 +118,13 @@ ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, cal
                 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);
@@ -182,6 +182,7 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                 data.updateData['compilation'] = compilationId;
                 data.updateData['createDateTime'] = new Date();
                 data.updateData['fileVer'] = await index.getVersion();
+                data.updateData['lastFileVer'] = data.updateData['fileVer'];
                 /*if(data.updateData.projType === projectType.project){
                     //设置建设项目基本信息,多个单位工程共用
                     data.updateData.property = {basicInformation: basicInformation};
@@ -275,7 +276,7 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                     let cpFile = await calcProgramFacade.newProjectCalcProgramFile(data.updateData);
                     newProject.property.calcProgramFile = cpFile ? cpFile : null;
                     //新建设备购置计录行
-                    await equipmentPurchaseModel.create({projectID:newProject.ID,total:0,equipments:[]});    
+                    await equipmentPurchaseModel.create({projectID:newProject.ID,total:0,equipments:[]});
                 }
                 newProject.save(async function (err, result) {
                     if (!err && result._doc.projType === projectType.tender) {

+ 22 - 27
web/over_write/js/chongqing_2018.js

@@ -10,8 +10,8 @@ if(typeof projectGljObject !== 'undefined'){
         {ID:'MAIN_MATERIAL',text:'主材'}
     ];
     $('#menu_index_info').show();
-    //2020-11-06 暂时去掉主城区加载通用 
-  projectGljObject.addCommonInfoPriceID = function (condition) { 
+    //2020-11-06 暂时去掉主城区加载通用
+  projectGljObject.addCommonInfoPriceID = function (condition) {
     if(condition.areaID != projectGljObject.commonInfoPriceID) condition.commonInfoPriceID = projectGljObject.commonInfoPriceID;
   }
 }
@@ -218,30 +218,25 @@ function overwriteRationCalcBases (taxType){
 (function overwriteFeeTypes() {
     if (typeof cpFeeTypes == 'undefined') return;
     cpFeeTypes = [
-        {type: 'rationUnitPrice', name: '定额综合单价', code: '1800'},
-        {type: 'labour', name: '人工费', code: '101'},
-        {type: 'material', name: '材料费', code: '201'},
-        {type: 'machine', name: '施工机具使用费', code: '301'},
-        {type: 'mainMaterial', name: '主材费', code: '501'},
-        {type: 'equipment', name: '设备费', code: '502'},
-        {type: 'manage', name: '企业管理费', code: '600'},
-        {type: 'profit', name: '利润', code: '700'},
-        {type: 'risk', name: '一般风险费', code: '1000'},
-        {type: 'labourDiff', name: '人工价差', code: '104'},
-        {type: 'materialDiff', name: '材料价差', code: '203'},
-        {type: 'machineDiff', name: '施工机具使用价差', code: '304'},
-        {type: 'otherRisk', name: '其他风险费', code: '1800'},
-        {type: 'unratedMaterial', name: '未计价材料费', code: '1800'},
-        {type: 'organizeMeasures', name: '组织措施费', code: '1200'},
-        {type: 'safeCivilization', name: '安全文明施工费', code: '1204'},
-        {type: 'document', name: '建设工程竣工档案编制费', code: '10041'},
-        {type: 'acceptance', name: '住宅工程质量分户验收费', code: '1206'},
-        {type: 'forceFee', name: '规费', code: '800'},
-        {type: 'tax', name: '税金', code: '900'},
-        {type: 'VAT', name: '增值税', code: '1800'},
-        {type: 'surtax', name: '附加税', code: '1800'},
-        {type: 'environmentTax', name: '环境保护税', code: '1800'},
-        {type: 'common', name: '工程造价', code: '1'}
+        {type: 'marketLabour', name: '人工费'},
+        {type: 'rationLabour', name: '定额人工费'},
+        {type: 'labourDiff', name: '人工费价差'},
+        {type: 'marketMaterial', name: '材料费'},
+        {type: 'rationMaterial', name: '定额材料费'},
+        {type: 'materialDiff', name: '材料费价差'},
+        {type: 'unratedMaterial', name: '未计价材料费'},
+        {type: 'marketMainMaterial', name: '市场价主材费'},
+        {type: 'marketEquipment', name: '市场价设备费'},
+        {type: 'marketMachine', name: '施工机具使用费'},
+        {type: 'rationMachine', name: '定额施工机具使用费'},
+        {type: 'machineLabourDiff', name: '机上人工费价差'},
+        {type: 'fuelDiff', name: '燃料动力费价差'},
+        {type: 'organizeMeasures', name: '施工组织措施费'},
+        {type: 'manage', name: '企业管理费'},
+        {type: 'profit', name: '利润'},
+        {type: 'forceFee', name: '规费'},
+        {type: 'tax', name: '税金'},
+        {type: 'common', name: '建筑安装工程费'}
     ];
 })();
 
@@ -393,4 +388,4 @@ function getCustomerCoeData() {
         { amount:1, operator:'*', gljCode:null, coeType:'主材'},
         { amount:1, operator:'*', gljCode:null, coeType:'设备'}
     ]
-}
+}