Prechádzať zdrojové kódy

添加定额性能优化

zhangweicheng 7 rokov pred
rodič
commit
3da946ffbd

+ 3 - 3
modules/glj/controllers/glj_controller.js

@@ -613,13 +613,12 @@ async function getGLJListByProjectID(projectId){
         if (isNaN(projectId) || projectId <= 0) {
             throw '标段id有误';
         }
-
         // 获取标段对应的单价文件id
         let unitPriceFileId = await ProjectModel.getUnitPriceFileId(projectId);
         if (unitPriceFileId <= 0) {
             throw '没有对应的单价文件';
         }
-
+        let getUnitPriceIDTime = +new Date();
         // 获取使用该单价文件的项目数据
         let tenderData = await ProjectModel.getTenderByUnitPriceFileId(unitPriceFileId);
         let usedTenderList = [];
@@ -635,7 +634,8 @@ async function getGLJListByProjectID(projectId){
         // 先获取对应标段的项目工料机数据
         let gljListModel = new GLJListModel();
         let [gljList, mixRatioConnectData,mixRationMap] = await gljListModel.getListByProjectId(projectId, unitPriceFileId);
-
+        let getProjectGLJ = +new Date();
+        console.log("取项目工料机数据-----"+(getProjectGLJ - getUnitPriceIDTime));
         responseData.data.gljList = gljList;
         responseData.data.mixRatioConnectData = mixRatioConnectData;
         responseData.data.mixRatioMap = mixRationMap;

+ 17 - 6
modules/glj/models/glj_list_model.js

@@ -84,11 +84,13 @@ class GLJListModel extends BaseModel {
         let mixRationMap={};
         let keyMap={};
         try {
+            let startTime = +new Date();
             // 首先获取对应标段下所有的项目工料机数据
             let condition = {project_id: projectId};
             let fields = {_id: 0};
             gljData = await this.db.find(condition, fields);
-
+            let getgljDataTime = +new Date();
+            console.log("取工料机列表时间-----"+(getgljDataTime - startTime));
             // 没有数据则直接返回空
             if (gljData.length <= 0) {
                 throw '无数据';
@@ -97,7 +99,8 @@ class GLJListModel extends BaseModel {
             // 获取标段设置的单价文件数据
             let unitPriceModel = new UnitPriceModel();
             let unitPriceList = await unitPriceModel.getDataByFileId(unitPriceFileId);
-
+            let getUnitPriceListTime = +new Date();
+            console.log("获取标段设置的单价文件数据时间-----"+(getUnitPriceListTime - getgljDataTime));
             // 整理获取工料机ID list
             let gljIdList = [];
             for(let tmp of gljData) {
@@ -107,11 +110,15 @@ class GLJListModel extends BaseModel {
             }
             // 从定额工料机库中获取消耗量
             condition = {
-                projectID: projectId,
-                projectGLJIDList: gljIdList
+                projectID: projectId
+               // projectGLJIDList: gljIdList 这里是取所有项目工料机,所以也是取所有定额工料机,不需要根据项目工料机ID再过滤
             };
             let quantityData = await RationGLJFacade.getQuantityByProjectGLJ(condition);
+            let getQuantity = +new Date();
+            console.log("取第一次消耗量时间-----"+(getQuantity - getUnitPriceListTime));
             let rationTypeQuantity = await RationGLJFacade.getRationTypeGLJQuantity(projectId);
+            let getrationTypeQuantity = +new Date();
+            console.log("取第二次消耗量时间-----"+(getrationTypeQuantity - getQuantity));
             let quantityList = {};
             // 整理数据 得到总定额消耗量
             for (let tmp of quantityData) {
@@ -152,6 +159,9 @@ class GLJListModel extends BaseModel {
                 let mixRatioModel = new MixRatioModel();
                 condition = {connect_key: {"$in": connect_keys}, unit_price_file_id: unitPriceFileId};
                 let mixRatioList = await mixRatioModel.findDataByCondition(condition, null, false);
+                let getMixRatio = +new Date();
+                console.log("取组成物数据时间-----"+(getMixRatio - getQuantity));
+
                 for (let tmp of mixRatioList) {
                    let t_index = tmp.connect_key;
                    let consumption=parseFloat(tmp.consumption);
@@ -277,7 +287,7 @@ class GLJListModel extends BaseModel {
      * @param {object} data
      * @return {Promise} 返回插入成功的数据id
      */
-    async addList(data) {
+    async addList(data,unitFileId) {
         let result = null;
         try {
             if (Object.keys(data).length <= 0) {
@@ -305,7 +315,8 @@ class GLJListModel extends BaseModel {
             }
 
             // 获取标段对应的单价文件id
-            let unitPriceFileId = await ProjectModel.getUnitPriceFileId(data.project_id);
+
+            let unitPriceFileId = unitFileId?unitFileId:await ProjectModel.getUnitPriceFileId(data.project_id);
             if (unitPriceFileId <= 0) {
                 throw '没有对应的单价文件';
             }

+ 0 - 1
modules/main/controllers/ration_controller.js

@@ -55,7 +55,6 @@ async function addNewRation(req,res) {
     try {
         let data = req.body.data;
         data = JSON.parse(data);
-        console.log(data);
         result.data = await ration_facade.addNewRation(data);
     }catch (err){
         logger.err(err);

+ 4 - 4
modules/main/facade/decimal_facade.js

@@ -10,18 +10,18 @@ module.exports ={
     getBillsQuantityDecimal:getBillsQuantityDecimal
 }
 
-async function getProjectDecimal(projectID) {
+async function getProjectDecimal(projectID,proj) {
     let decimal = null;
-    let project =await projectsModel.findOne({ID:projectID});
+    let project = proj?proj:await projectsModel.findOne({ID:projectID});
     if(project){
         decimal = project.property.decimal
     }
     return decimal;
 }
 
-async function getBillsQuantityDecimal(projectID,unit) {
+async function getBillsQuantityDecimal(projectID,unit,proj) {
     let decimal = null;
-    let project =await projectsModel.findOne({ID:projectID});
+    let project =proj?proj:await projectsModel.findOne({ID:projectID});
     if(project){
         let billsQuantityDecimal = project.property.billsQuantityDecimal;
         let el = _.find(billsQuantityDecimal,{'unit':unit});

+ 39 - 7
modules/main/facade/ration_facade.js

@@ -17,6 +17,8 @@ const uuidV1 = require('uuid/v1');
 let std_glj_lib_gljList_model = mongoose.model('std_glj_lib_gljList');
 let coeMolde = mongoose.model('std_ration_lib_coe_list');
 let _= require('lodash');
+const projectDao = require('../../pm/models/project_model').project;
+let projectModel = mongoose.model('projects');
 
 module.exports = {
     replaceRations: replaceRations,
@@ -25,15 +27,20 @@ module.exports = {
 async function addNewRation(data) {
     let query = data.itemQuery;
     let stdRation = null;
+    let startTime = +new Date();
     if(query){
         let searchDao = new SearchDao();
         stdRation = await searchDao.getRationItem(query.userID,query.rationRepId,query.code);
         data.newData.code = query.code;
     }
+    let stdRationTime = +new Date();
+    console.log("取std定额时间-------------------------------"+(stdRationTime - startTime));
     if(data.brUpdate.length>0){
         await updateSerialNo(data.brUpdate);
     }
     let newRation =await insertNewRation(data.newData,stdRation,data.calQuantity);
+    let addRationGLJTime = +new Date();
+    console.log("插入新定额时间-------------------------------"+(addRationGLJTime - startTime));
     if(stdRation){
         return await addRationSubList(stdRation,newRation,data.needInstall);
     }else {
@@ -62,6 +69,7 @@ async function  updateSerialNo(serialNoUpdate){
 }
 
 async function insertNewRation(newData,std,calQuantity) {//插入新的定额
+    let startTime = +new Date();
     if(std){
         newData.name = std.name;
         newData.caption = std.caption;
@@ -80,10 +88,10 @@ async function insertNewRation(newData,std,calQuantity) {//插入新的定额
     if(calQuantity){
         await CalculateQuantity(newData,newData.billsItemID,newData.projectID);
     }
-
+    let addRationGLJTime = +new Date();
+    console.log("计算消耗量时间-------------------------------"+(addRationGLJTime - startTime));
     let newRation = await ration_model.model.create(newData);
-     return newRation;
-
+    return newRation;
 }
 
 async function replaceRations(userID,data) {
@@ -112,12 +120,19 @@ async function replaceRation(nodeInfo,stdRation,projectID,calQuantity) {
 }
 
 async function addRationSubList(stdRation,newRation,needInstall) {
+    let startTime = +new Date();
     let ration_gljs = await addRationGLJ(stdRation,newRation);
+    let addRationGLJTime = +new Date();
+    console.log("添加定额工料机时间-----"+(addRationGLJTime - startTime));
     let ration_coes = await addRationCoe(stdRation,newRation);
+    let addRationCoeTime = +new Date();
+    console.log("添加定额coe时间-----"+(addRationCoeTime - addRationGLJTime));
     let ration_installs = [];
     if(needInstall){
         ration_installs =  await addRationInstallFee(stdRation,newRation);
     }
+    let addRationInstallFeeTime = +new Date();
+    console.log("添加定额install时间-----"+(addRationInstallFeeTime - addRationCoeTime));
     return {ration:newRation,ration_gljs:ration_gljs,ration_coes:ration_coes,ration_installs:ration_installs};
 }
 
@@ -212,7 +227,15 @@ function getCustomerCoeData() {
 async function addRationGLJ(std,newRation) {
     let newRationGLJList = [];
     let rationGLJShowList = [];
+    let unitPriceFileId = await projectDao.getUnitPriceFileId(newRation.projectID);
+    let sum=0;
+    let first = +new Date();
     if(std.hasOwnProperty('rationGljList') && std.rationGljList.length > 0){
+       let stdGLJID = _.map(std.rationGljList,'gljId');
+       let stdGLJList = await std_glj_lib_gljList_model.find({'ID':{'$in':stdGLJID}});//速度优化-------先一次性取出所有的工料机列表
+       let stdGLJMap = _.indexBy(stdGLJList, 'ID');
+        let stdGLJMapTime = +new Date();
+        console.log("找到标准工料机映射表时间-------------------------------"+(stdGLJMapTime - first));
         for(let sub of std.rationGljList){
             let newGLJ = {};
             newGLJ.ID = uuidV1();
@@ -223,7 +246,8 @@ async function addRationGLJ(std,newRation) {
             newGLJ.rationItemQuantity = sub.consumeAmt;
             newGLJ.quantity = sub.consumeAmt;
             newGLJ.glj_repository_id = std.rationRepId;
-            let std_glj = await std_glj_lib_gljList_model.findOne({'ID':sub.gljId});
+            let std_glj = stdGLJMap[sub.gljId];
+            let std_gljTime = +new Date();
             if(std_glj){
                 newGLJ.name = std_glj.name;
                 newGLJ.code = std_glj.code;
@@ -235,16 +259,23 @@ async function addRationGLJ(std,newRation) {
                 newGLJ.type = std_glj.gljType;
                 newGLJ.repositoryId = std_glj.repositoryId;
                 newGLJ.adjCoe = std_glj.adjCoe;
-               let info = await  ration_glj_facade.getInfoFromProjectGLJ(newGLJ);
+                let info = await  ration_glj_facade.getInfoFromProjectGLJ(newGLJ,unitPriceFileId);
                 newGLJ = ration_glj_facade.createNewRecord(info);
                 newRationGLJList.push(newGLJ);
                 rationGLJShowList.push(info);
             }
+            let InfoFromProjectGLJ = +new Date();
+            console.log("找到项目工料机时间-------------------------------"+(InfoFromProjectGLJ - std_gljTime));
         }
     }
+    let before = +new Date();
+    console.log("总查询时间为-------------------------------"+(before-first));
     if(newRationGLJList.length>0){
         await ration_glj.insertMany(newRationGLJList);
     }
+    let after = +new Date();
+    console.log("实际插入时间为-------------------------------"+(after-before));
+    console.log("总操作时间为-------------------------------"+(after-first));
     return rationGLJShowList;
 }
 
@@ -304,11 +335,12 @@ function createRationAss(std) {
 
 async function CalculateQuantity (ration,billsItemID,projectID) {
     // calculate ration Quantity
-    let decimalObject =await decimal_facade.getProjectDecimal(projectID);
+    let project = await projectModel.findOne({ID:projectID});
+    let decimalObject =await decimal_facade.getProjectDecimal(projectID,project);
     let quantity_decimal = (decimalObject&&decimalObject.ration&&decimalObject.ration.quantity)?decimalObject.ration.quantity:3;
     let pbill = await bill_model.model.findOne({projectID:projectID,ID:billsItemID});
     let billsQuantity = pbill.quantity ? pbill.quantity : 0;
-    let bill_decimal = await decimal_facade.getBillsQuantityDecimal(projectID,pbill.unit);
+    let bill_decimal = await decimal_facade.getBillsQuantityDecimal(projectID,pbill.unit,project);
     billsQuantity=scMathUtil.roundForObj(billsQuantity,bill_decimal);
     ration.quantityEXP="QDL";
     ration.quantity = scMathUtil.roundForObj(billsQuantity / FilterNumberFromUnit(ration.unit),quantity_decimal);//不管是否打勾都做转换

+ 3 - 0
modules/main/models/project.js

@@ -101,7 +101,10 @@ Project.prototype.getData = function(projectID, callback){
     for (itemName in moduleMap){
         functions.push((function(itemName){
             return function (cb) {
+                let startTime = +new Date();
                 moduleMap[itemName].getData(projectID, function(err, moduleName, data){
+                    let endTime = +new Date();
+                    console.log(moduleName+'---------------'+(endTime - startTime));
                     cb(err, {moduleName: moduleName, data: data})
                 })
             }

+ 6 - 3
modules/pm/models/project_model.js

@@ -609,11 +609,14 @@ ProjectsDAO.prototype.getTenderByUnitPriceFileId = async function (unitPriceFile
  */
 ProjectsDAO.prototype.getUnitPriceFileId = async function (projectId) {
     let result = 0;
-    let projectData = await Projects.findOne({ID: projectId});
+    let startTime = +new Date();
+    let projectData = await Projects.find({ID: projectId},['property.unitPriceFile']);
     if (projectData === null) {
         return result;
     }
-
+    let endTime = +new Date();
+    console.log("取单价文件列表id时间-----"+(endTime - startTime));
+    projectData = projectData[0];
     result = projectData.property.unitPriceFile !== undefined ? projectData.property.unitPriceFile.id : 0;
     return result;
 };
@@ -621,7 +624,7 @@ ProjectsDAO.prototype.getUnitPriceFileId = async function (projectId) {
 /**
  * 获取当前用户的建设项目数据
  *
- * @param {Number} userId
+ * @paraconsolem {Number} userId
  * @return {Promise}
  */
 ProjectsDAO.prototype.getUserProjectData = async function (userId) {

+ 27 - 34
modules/ration_glj/facade/ration_glj_facade.js

@@ -28,7 +28,6 @@ const stdGljModel = mongoose.model('std_glj_lib_gljList');
 const gljClassModel = mongoose.model('std_glj_lib_gljClass');
 import  projCounter from '../../main/models/proj_counter_model';
 
-
 module.exports = {
     save: save,
     getData: getData,
@@ -65,54 +64,48 @@ let updateFunctionMap = {
  */
 async function getQuantityByProjectGLJ(condition) {
     let query = {
-        $and: [
-            {'projectID': condition.projectID},
-            {'projectGLJID': {$in: condition.projectGLJIDList}}
-        ]
+        'projectID': condition.projectID,
+    };
+    if(condition.projectGLJIDList){
+        query['projectGLJID'] = {$in: condition.projectGLJIDList};
     }
-
+    let startTime = +new Date();
     let results = await  ration_glj.find(query, ['projectGLJID', 'quantity', 'rationID'], {sort: {projectGLJID: 1}});
     let rationList = _.uniq(_.map(results, 'rationID'));
-
+    let getQuantity = +new Date();
+    console.log("取工料机消耗量时间-----"+(getQuantity - startTime));
     let rationQuery = {
-        $and: [
-            {'projectID': condition.projectID},
-            {'ID': {$in: rationList}},
-            {'deleteInfo': null}
-        ]
-    }
+        'projectID': condition.projectID,
+        'ID': {$in: rationList},
+        'deleteInfo': null
+    };
+
+   /* $and: [
+        {'projectID': condition.projectID},
+        {'ID': {$in: rationList}},
+        {'deleteInfo': null}
+    ]*/
     let rations = await ration.find(rationQuery, ['ID', 'quantity']);
+    let rationsTime = +new Date();
+    console.log("取定额消耗量时间-----"+(rationsTime - getQuantity));
     return combineQuantity(results, rations);
 }
 
 function combineQuantity(results, rations) {
     let resultList = [];
-    _.forEach(results, function (data) {
+    let rationMap = _.indexBy(rations,'ID');
+    for(let r of results){
         let tmp = {
-            projectGLJID: data.projectGLJID,
-            quantity: Number(data.quantity)
+            projectGLJID: r.projectGLJID,
+            quantity: Number(r.quantity)
         }
-        let ration = _.find(rations, {ID: data.rationID});
+        let ration = rationMap[r.rationID];//_.find(rations, {ID: r.rationID})
         if (ration) {
             tmp.rationID = ration.ID;
             tmp.rationQuantity = ration.quantity ? Number(ration.quantity) : undefined;
         }
         resultList.push(tmp);
-        /*  if(resultMap.hasOwnProperty(data.projectGLJID)){
-         resultMap[data.projectGLJID] += data.quantity;
-         }else {
-         resultMap[data.projectGLJID] = data.quantity;
-         }*/
-    });
-
-    /*   var resultList =[];
-     for(let key in resultMap){
-     let newObject = {
-     'projectGLJID':key,
-     'quantity':resultMap[key]
-     }
-     resultList.push(newObject)
-     }*/
+    }
     return resultList;
 }
 
@@ -176,11 +169,11 @@ function createNewRecord(ration_glj) {
     return newRecoed
 }
 
-async function getInfoFromProjectGLJ(ration_glj) {
+async function getInfoFromProjectGLJ(ration_glj,unitPriceFileId) {
     let data = getGLJSearchInfo(ration_glj);
     try {
         let projectGljModel = new GLJListModel();
-        let result = await projectGljModel.addList(data);
+        let result = await projectGljModel.addList(data,unitPriceFileId);
         let typeString = result.type+"";
         ration_glj.marketPrice = result.unit_price.market_price;
         ration_glj.adjustPrice = result.unit_price.base_price;

+ 2 - 2
web/building_saas/main/js/models/composition.js

@@ -21,7 +21,7 @@ Composition.prototype.loadData = function (callback = null) {
     if (self.isLoading) {
         return false;
     }
-    // 加载组成物数据
+   /* // 加载组成物数据
     $.ajax({
         url: '/glj/get-composition',
         type: 'post',
@@ -48,7 +48,7 @@ Composition.prototype.loadData = function (callback = null) {
             // 存入缓存
             projectObj.project.composition = self;
         }
-    });
+    });*/
 };
 
 /**