Jelajahi Sumber

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

zeweizhong 6 tahun lalu
induk
melakukan
f4ac498831

+ 2 - 2
modules/all_models/project_glj.js

@@ -25,12 +25,12 @@ let modelSchema = {
     // 编码
     code: {
         type: String,
-        index: false
+        index: true
     },
     //原始的编码
     original_code: {
         type: String,
-        index: false
+        index: true
     },
     // 名称
     name: {

+ 2 - 1
modules/common/base/base_model.js

@@ -131,7 +131,8 @@ class BaseModel {
 
         return result.ok !== undefined && result.ok === 1;
     }
-    getIndex(obj,pops){
+    getIndex(obj,tpops){
+        let pops = tpops?tpops:['code','name','specs','unit','type'];
         let t_index = '';
         let k_arr=[];
         for(let p of pops){

+ 139 - 81
modules/glj/models/glj_list_model.js

@@ -20,6 +20,7 @@ const scMathUtil = require('../../../public/scMathUtil').getUtil();
 import decimal_facade from "../../main/facade/decimal_facade";
 let gljCollectionName = 'glj_list';
 let GLJSchemas = mongoose.model(gljCollectionName);
+let _ = require("lodash");
 
 class GLJListModel extends BaseModel {
 
@@ -556,44 +557,37 @@ class GLJListModel extends BaseModel {
             throw '参数错误';
         }
         let fromTable = data.from === undefined ? 'std' : data.from;
+        var connect_key =this.getIndex(data,['code','name','specs','unit','type']);
+        let e_mList = await this.getCompositionGLJListFromMixRatio(projectId,unitPriceFileId,connect_key,fromTable);
+        //如果组成物数据已经存在,则以单价文件中组成物的数据为准,不用再往下做判断了(项目工料机中需要插入的已经在上一步中生成插入)
+        if(e_mList.length > 0) return;
+
         // 查找对应组成物的项目工料机数据
         let indexs=['code','name','specs','unit','type'];
         let [projectGljList, compositionGljList] = await this.getCompositionGLJList(gljId, projectId, indexs, fromTable);
-        // 整理配合比待插入数据
+        // 整理配合比待插入数据,单价文件中配合比没有数据,则以库中的组成物信息为准
         let mixRatioInsertData = [];
-        var connect_key =this.getIndex(data,['code','name','specs','unit','type']);
-        //先查找是否已存在配合比数据,在共用单价文件的情况下,有可能配合比数据存在,项目工料机数据不存在
-        let e_mList = await mixRatioModel.findDataByCondition({unit_price_file_id: unitPriceFileId,connect_key: connect_key},null,false);
-        if(e_mList.length <= 0){
-            for (let tmp of compositionGljList) {
-                let consumpiton = tmp.consumption;
-                //只有标准的工料机的组成物才会有多单价、多组成物消耗量的情况 fromTable
-                if(fromTable == 'std' && ext && ext.quantityField &&( tmp.consumption[ext.quantityField]!= undefined && tmp.consumption[ext.quantityField]!=null)){
-                    consumpiton = tmp.consumption[ext.quantityField];
-                }
-                // 配合比数据插入
-                let mixRatioData = {
-                    consumption: consumpiton,
-                    glj_id: tmp.ID,
-                    unit_price_file_id: unitPriceFileId,
-                    connect_key: connect_key,
-                    type: tmp.gljType,
-                    code: tmp.code,
-                    specs:tmp.specs,
-                    name:tmp.name,
-                    unit:tmp.unit
-                };
-                mixRatioInsertData.push(mixRatioData);
-            }
-        }
-        // 插入配合比表
-        // 因为有可能项目工料机与单价数据已存在,但配合比数据不存在,所以先插入配合比,后续判断如果存在项目工料机则可以省下数据库操作
-        if(mixRatioInsertData.length>0){
-            let addMixRatioResult = await mixRatioModel.add(mixRatioInsertData);
-            if (!addMixRatioResult) {
-                throw '组成物插入单价数据失败!';
+        for (let tmp of compositionGljList) {
+            let consumpiton = tmp.consumption;
+            //只有标准的工料机的组成物才会有多单价、多组成物消耗量的情况 fromTable
+            if(fromTable == 'std' && ext && ext.quantityField &&( tmp.consumption[ext.quantityField]!= undefined && tmp.consumption[ext.quantityField]!=null)){
+                consumpiton = tmp.consumption[ext.quantityField];
             }
+            // 配合比数据插入
+            let mixRatioData = {
+                consumption: consumpiton,
+                glj_id: tmp.ID,
+                unit_price_file_id: unitPriceFileId,
+                connect_key: connect_key,
+                type: tmp.gljType,
+                code: tmp.code,
+                specs:tmp.specs,
+                name:tmp.name,
+                unit:tmp.unit
+            };
+            mixRatioInsertData.push(mixRatioData);
         }
+
         let unitPriceModel = new UnitPriceModel();
         let unitPriceList = await unitPriceModel.model.find({unit_price_file_id:unitPriceFileId});//查找按文件id查找单价文件数据,用来判断单价文件信息是否已存在
 
@@ -604,22 +598,7 @@ class GLJListModel extends BaseModel {
             let key = this.getIndex(tmp,['code','name','specs','unit','gljType']);
             if (projectGljList[key] === undefined) {
                 // 项目工料机插入的数据
-                let gljData = {
-                    glj_id: tmp.ID,
-                    project_id: projectId,
-                    code: tmp.code,
-                    name: tmp.name,
-                    specs: tmp.specs,
-                    unit: tmp.unit === undefined ? '' : tmp.unit,
-                    type: tmp.gljType,
-                    adjCoe:tmp.adjCoe,
-                    original_code:tmp.code,
-                    materialType: tmp.materialType,   //三材类别
-                    materialCoe: tmp.materialCoe,
-                    materialIndexType: tmp.materialIndexType,
-                    materialIndexUnit: tmp.materialIndexUnit,
-                    materialIndexCoe: tmp.materialIndexCoe
-                };
+                let gljData = this.getProjectGLJNewData(tmp,projectId);
                 gljInsertData.push(gljData);
             }
             let basePrice = tmp.basePrice;
@@ -655,11 +634,96 @@ class GLJListModel extends BaseModel {
 
         // 插入单价数据表
         if(unitPriceInsertData.length >0) await unitPriceModel.add(unitPriceInsertData);
+
+        // 插入配合比表
+        // 因为有可能项目工料机与单价数据已存在,但配合比数据不存在,所以先插入配合比,后续判断如果存在项目工料机则可以省下数据库操作
+        if(mixRatioInsertData.length>0){
+            let addMixRatioResult = await mixRatioModel.add(mixRatioInsertData);
+            if (!addMixRatioResult) {
+                throw '组成物插入单价数据失败!';
+            }
+        }
        //插入项目工料机
         if(gljInsertData.length > 0) await this.add(gljInsertData);
         return
     }
 
+    getProjectGLJNewData(tmp,projectId){
+        let gljData = {
+            glj_id: tmp.ID,
+            project_id: projectId,
+            code: tmp.code,
+            name: tmp.name,
+            specs: tmp.specs,
+            unit: tmp.unit === undefined ? '' : tmp.unit,
+            type: tmp.gljType,
+            adjCoe:tmp.adjCoe,
+            original_code:tmp.code,
+            materialType: tmp.materialType,   //三材类别
+            materialCoe: tmp.materialCoe,
+            materialIndexType: tmp.materialIndexType,
+            materialIndexUnit: tmp.materialIndexUnit,
+            materialIndexCoe: tmp.materialIndexCoe
+        };
+        return gljData;
+    }
+
+    //从配合比表中取组成物的信息以及对应的项目工料机信息,再从配合比数据中反查工料机库中的信息
+    async getCompositionGLJListFromMixRatio (projectId,unitPriceFileId,connect_key,fromTable = 'std'){
+        let mixRatioModel = new MixRatioModel();
+        let e_mList = await mixRatioModel.model.find({unit_price_file_id: unitPriceFileId,connect_key: connect_key}).lean();
+        if (e_mList.length <= 0) return [];
+        let codeList = [];
+        let ratioMap = {};
+        for(let tmp of e_mList) {
+            codeList.push(tmp.code);
+            let ckey = this.getIndex(tmp);
+            ratioMap[ckey] = tmp
+        }
+        // 查找对应的项目工料机数据
+        let condition = {project_id: projectId,code: {"$in": codeList} };
+        let gljData = await this.model.find(condition, {_id: 0}).lean();
+        let matchGljs = {};
+        for(let g of gljData){
+            let gkey = this.getIndex(g);
+            if(ratioMap[gkey]) matchGljs[gkey] = g;
+        }
+
+        //如果有组成物信息存在,但项目工料机信息不全的情况,应从数据库中查存询原始信息
+        // (只有在父工料机是来自标准的情况下做这个操作,因为组成物表中没有存具体的工料机是来自补充的还是标准库,而父工料机是补充库的,组成物有可能来自两个库,而父来自标准,子只会来自标准)
+        let lessIDList = [],lessMix=[];//lessMix只有在父工料机是来自补充工料机的时候才要用到
+        let componentGljData = [];
+        let gljInsertData = [];
+        for(let mk in ratioMap){//找出缺少的工料机
+            if(!matchGljs[mk]){
+                lessMix.push(ratioMap[mk]);
+                lessIDList.push(ratioMap[mk].glj_id);
+            }
+        }
+        if(lessIDList.length > 0){
+            if(fromTable == "std"){
+                let gljListModel = new STDGLJLibGLJListModel();
+                let condition = {ID: {$in: lessIDList}};
+                componentGljData = await gljListModel.model.find(condition).lean();
+                for(let tmp of componentGljData){
+                    let newProjctData = this.getProjectGLJNewData(tmp,projectId);
+                    gljInsertData.push(newProjctData)
+                }
+            }else {
+                for(let m of lessMix){
+                    m.from = 'cpt';
+                    let newProjctData =  this.getProjectGLJNewData(m,projectId);
+                    gljInsertData.push(newProjctData);
+                }
+            }
+
+        }
+
+        //这边只插入项目工料机数据,对于组成物文件中有的数据,理论上单价文件也是应该要有的,如果没有,那只能是mongodb数据库不支持事务的情况的问题
+        if(gljInsertData.length > 0)  await this.add(gljInsertData);
+        return e_mList;
+    }
+
     /**
      * 获取组成物具体数据
      *
@@ -718,24 +782,23 @@ class GLJListModel extends BaseModel {
             return [{},[]];
         }
 
+        //2019-11-15 优化,用5个属性条件去查意义不大,用编号就能过滤得差不多了,最后再用5个属性去匹配。 同时可以提高查询效率
         let codeList = [];
-        let nameList = [];
-        let specsList= [];
-        let typeList = [];
-        let unitList = [];
+        let componentMap = {};
         for(let tmp of componentGljList) {
             codeList.push(tmp.code);
-            nameList.push(tmp.name);
-            specsList.push(tmp.specs);
-            typeList.push(tmp.gljType);
-            unitList.push(tmp.unit);
+            let ckey = this.getIndex(tmp,['code','name','specs','unit','gljType']);
+            componentMap[ckey] = tmp
         }
-
         // 查找对应的项目工料机数据
-        let condition = {project_id: projectId,code: {"$in": codeList}, name: {"$in": nameList},specs:{"$in": specsList},type:{"$in": typeList},unit:{"$in": unitList} };
-        let gljData = await this.findDataByCondition(condition, {_id: 0}, false, indexBy);
-
-        return [gljData, componentGljList];
+        let condition = {project_id: projectId,code: {"$in": codeList} };
+        let gljData = await this.model.find(condition, {_id: 0}).lean();
+        let matchGljs = {};
+        for(let g of gljData){
+            let gkey = this.getIndex(g);
+            if(componentMap[gkey]) matchGljs[gkey] = g;
+        }
+        return [matchGljs, componentGljList];
     }
 
     async getCompositionGLJByData(glj,unitPriceFileId){
@@ -763,46 +826,41 @@ class GLJListModel extends BaseModel {
         // 查找对应的配合比数据
         let mixRatioModel = new MixRatioModel();
         let condition = {connect_key: t_index, unit_price_file_id: unitPriceFileId};
-        let mixRatios = await mixRatioModel.findDataByCondition(condition, {_id: 0}, false);
+        let mixRatios = await mixRatioModel.model.find(condition, {_id: 0}).lean();
+        //2019-11-15 优化,用5个属性条件去查意义不大,用编号就能过滤得差不多了,最后再用5个属性去匹配。 同时可以提高查询效率
         let codeList = [];
-        let nameList = [];
-        let specsList= [];
-        let typeList = [];
-        let unitList = [];
         if(mixRatios.length<=0){
             return [[],[],[]];
         }
         let mixRatioData={};
         for(let tmp of mixRatios) {
             codeList.push(tmp.code);
-            nameList.push(tmp.name);
-            specsList.push(tmp.specs);
-            typeList.push(tmp.type);
-            unitList.push(tmp.unit);
             let m_index = this.getIndex(tmp,['code','name','specs','unit','type']);
             mixRatioData[m_index]=tmp;
         }
+        //数组去重
+        codeList = _.uniq(codeList);
         // 查找对应的项目工料机数据
-        //let gcondition = {project_id: glj.project_id,code: {"$in": codeList}, name: {"$in": nameList},specs:{"$in": specsList},type:{"$in": typeList},unit:{"$in": unitList} };
-        let gcondition = {project_id: glj.project_id,code: {"$in": codeList}, name: {"$in": nameList},type:{"$in": typeList},unit:{"$in": unitList} };
-        let gljData = await this.findDataByCondition(gcondition, {_id: 0}, false);
-
+        let gcondition = {project_id: glj.project_id?glj.project_id:glj.projectID,code: {"$in": codeList}};
+        let gljData = await this.model.find(gcondition, {_id: 0}).lean();
         // 查找对应的单价数据
         let unitPriceModel = new UnitPriceModel();
-        //let ucondition = { unit_price_file_id: unitPriceFileId,code: {"$in": codeList}, name: {"$in": nameList},specs:{"$in": specsList},type:{"$in": typeList},unit:{"$in": unitList}};
-        let ucondition = { unit_price_file_id: unitPriceFileId,code: {"$in": codeList}, name: {"$in": nameList},type:{"$in": typeList},unit:{"$in": unitList}};
-        let unitPriceList = await unitPriceModel.findDataByCondition(ucondition, {_id: 0}, false);
+        let ucondition = { unit_price_file_id: unitPriceFileId,code: {"$in": codeList}};
+        let unitPriceList = await unitPriceModel.model.find(ucondition, {_id: 0}).lean();
 
 
         // 整理数据
         let unitPriceData = {};
         for(let tmp of unitPriceList) {
             let u_index = this.getIndex(tmp,['code','name','specs','unit','type']);
-            if (mixRatioData[u_index]) {
-                unitPriceData[u_index] = tmp;
-            }
+            if(mixRatioData[u_index]) unitPriceData[u_index] = tmp;//过滤掉不完全匹配的工料机单价
+        }
+        let c_gljData = [];
+        for(let g of gljData){//过滤掉不是组成物的工料机
+            let g_index =  this.getIndex(g,['code','name','specs','unit','type']);
+            if(mixRatioData[g_index]) c_gljData.push(g);
         }
-        return [gljData,mixRatioData,unitPriceData];
+        return [c_gljData,mixRatioData,unitPriceData];
 
     }
 

+ 0 - 1
modules/glj/models/mix_ratio_model.js

@@ -57,7 +57,6 @@ class MixRatioModel extends BaseModel {
             data.id = await counterModel.getId(collectionName);
         }
 
-        this.setScene('add');
         return this.db.model.create(data);
     }
 

+ 2 - 2
modules/users/models/user_model.js

@@ -322,14 +322,14 @@ class UserModel extends BaseModel {
      * @return {version}
      */
     async getVersionFromUpgrade(ssoId, compilationId){
-        let version = '大司空云计价(免费云版)';
+        let version = '大司空云计价';
         let userData = await this.findDataBySsoId(ssoId);
         if (userData.upgrade_list !== undefined) {
             let compilationInfo = userData.upgrade_list.find(function (item) {
                 return item.compilationID === compilationId;
             });
             if (compilationInfo !== undefined && compilationInfo.isUpgrade === true) {
-                version = '大司空云计价(专业云版)';
+                version = '大司空云计价';
             }
         }
         return version;

+ 1 - 1
web/building_saas/main/html/main.html

@@ -76,7 +76,7 @@
                 <li class="nav-item"><a data-toggle="tab" href="#fee_rates" id="tab_fee_rate" role="tab" >费率</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#calc_program_manage" id="tab_calc_program_manage" role="tab" style="display:none">总计算程序</a></li>
                 <!--<li class="nav-item"><a data-toggle="tab" href="#tender_price" id="tab_tender_price" role="tab" style="display:none">调价</a></li>-->
-                <li class="nav-item"><a data-toggle="tab" href="#tender_price" id="tab_tender_price" role="tab">调价</a></li>
+              <!--  <li class="nav-item"><a data-toggle="tab" href="#tender_price" id="tab_tender_price" role="tab">调价</a></li>-->
                 <li class="nav-item"><a data-toggle="tab" href="#reports" role="tab" id="tab_report" onclick="rptTplObj.iniPage();">报表</a></li>
                 <li class="nav-item"><a data-toggle="tab" href="#index" id="tab_index" role="tab" style="display:none">指标信息</a></li>
             </ul>

+ 7 - 2
web/building_saas/main/js/views/glj_view.js

@@ -249,6 +249,7 @@ var gljOprObj = {
     startEditChecking:function (sender,args) {
         let me = gljOprObj;
         let selected = projectObj.project.mainTree.selected;
+        if($.bootstrapLoading.isLoading())  args.cancel = true;
         if(selected){
             if(me.isInstallationNode(selected)==true){
                 args.cancel = true;
@@ -772,6 +773,8 @@ var gljOprObj = {
                         ration_gljs[i].subList = mixRatios;
                     }
                     if(ration) gljOprObj.getTotalQuantity(ration_gljs[i], ration);
+                }else {
+                    console.log("没有找到工料机:"+ration_gljs[i].name)
                 }
             }
         }
@@ -841,7 +844,7 @@ var gljOprObj = {
                 return gljOprObj.getIndex(item,gljKeyArray) == mIndex
             });//改关联关系
             if(pg){
-                var tem = {
+                let tem = {
                     projectGLJID: pg.id,
                     code: pg.code,
                     name: pg.name,
@@ -864,8 +867,10 @@ var gljOprObj = {
                     tem.isEstimate =  pg.is_evaluate;
                 }
                 this.setGLJPrice(tem,pg);
+                temRationGLJs.push(tem);
+            }else {
+                console.log("没有找到工料机:"+mIndex)
             }
-            temRationGLJs.push(tem);
         }
         temRationGLJs = gljUtil.sortRationGLJ(temRationGLJs);
         return temRationGLJs;

+ 1 - 1
web/users/html/login.html

@@ -18,7 +18,7 @@
     <div class="container login-panel">
         <form class="form-signin" method="post" onsubmit="return false">
             <h1 class="d-flex justify-content-center mb-5">
-                <img src="/web/building_saas/img/building2.png" width="40" height="40" class="mr-3" style="margin-top: 5px">
+                <img src="/web/building_saas/img/building.png" width="40" height="40" class="mr-3" style="margin-top: 5px">
                 大司空云计价
             </h1>
             <p class="change-login-p">账号登录</p>