Przeglądaj źródła

评标材料相关

zhangweicheng 6 lat temu
rodzic
commit
c0f2bfc92e

+ 0 - 1
modules/all_models/evaluate_list.js

@@ -20,7 +20,6 @@ let evaluateSchema = {
     type:Number,
     market_price:String,
     quantity:String,
-    base_price:String,
     locked:{type: Number, default: 0},//锁定,1锁,0不锁
     remark:String,
     originPlace:String,//产地

+ 3 - 1
modules/glj/facade/glj_facade.js

@@ -11,6 +11,7 @@ const ProjectModel = require('../../pm/models/project_model').project;
 import UnitPriceFileModel from "../models/unit_price_file_model";
 import UnitPriceModel from "../models/unit_price_model";
 let evaluateListModel = mongoose.model("evaluate_list");
+let bidEvaluationMode = mongoose.model("bid_evaluation_list");
 let projectGLJModel = mongoose.model("glj_list");
 let unitFileMode = mongoose.model("unit_price");
 
@@ -89,7 +90,8 @@ async function updateEvaluateMaterial(data) {
     let modelMap = {
         "glj_list":projectGLJModel,
         "evaluate_list":evaluateListModel,
-        "unit_price":unitFileMode
+        "unit_price":unitFileMode,
+        "bid_evaluation_list":bidEvaluationMode
     };
     for(let t of data.tasks){
         let model = modelMap[t.type];

+ 24 - 0
modules/main/facade/bid_facade.js

@@ -0,0 +1,24 @@
+/**
+ * Created by zhang on 2019/9/11.
+ */
+
+
+module.exports={
+    getData:getData
+};
+
+const mongoose = require('mongoose');
+let bidEvaluationListModel = mongoose.model("bid_evaluation_list");
+let consts = require('../../main/models/project_consts');
+
+
+
+function getData(projectID, callback) {
+    bidEvaluationListModel.find({'projectID': projectID}).lean().exec((err, datas) => {
+        if (err) {
+            callback(1, '', null);
+        } else {
+            callback(0, consts.projectConst.BID_EVALUATION_LIST, datas);
+        }
+    })
+}

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

@@ -18,6 +18,7 @@ var calc_program_facade = require('../facade/calc_program_facade');
 import GLJController from "../../glj/controllers/glj_controller";
 let installation_facade = require('../facade/installation_facade');
 let evaluate_facade = require('../facade/evaluate_facade');
+let bid_facade = require('../facade/bid_facade');
 let pmController = require('../../pm/controllers/pm_controller');
 
 
@@ -47,6 +48,7 @@ moduleMap[projectConsts.INSTALLATION_FEE] = installation_facade;
 moduleMap[projectConsts.RATION_TEMPLATE] = ration_template;
 moduleMap[projectConsts.PROJECT_INFO] = pmController;
 moduleMap[projectConsts.EVALUATE_LIST] = evaluate_facade;
+moduleMap[projectConsts.BID_EVALUATION_LIST] = bid_facade;
 
 var Project = function (){};
 

+ 2 - 1
modules/main/models/project_consts.js

@@ -22,7 +22,8 @@ let projectConst = {
     CALC_PROGRAM:'calc_program',
     INSTALLATION_FEE:'installation_fee',
     PROJECT_INFO: 'project_info',
-    EVALUATE_LIST:'evaluate_list'
+    EVALUATE_LIST:'evaluate_list',
+    BID_EVALUATION_LIST:'bid_evaluation_list'
 };
 
 let projectConstList = [

+ 7 - 2
modules/pm/facade/pm_facade.js

@@ -73,6 +73,7 @@ let stdRationItemModel = mongoose.model('std_ration_lib_ration_items');
 let stdGljItemModel = mongoose.model('std_glj_lib_gljList');
 import BillsTemplateModel from "../models/templates/bills_template_model";
 let evaluateListModel = mongoose.model("evaluate_list");
+let bidListModel = mongoose.model("bid_evaluation_list");
 let featureLibModel =  mongoose.model("std_project_feature_lib");
 let scMathUtil = require('../../../public/scMathUtil').getUtil();
 let counter = require('../../../public/counter/counter');
@@ -244,7 +245,8 @@ async function copyProject(userID, compilationID,data,newProjectID = null) {
         copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,quantityDetailModel),
         copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationInstallationModel),
         copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationTemplateModel),
-        copyMaterialList(originalID,newProjectID,projectGLJMap.IDMap,evaluateListModel)
+        copyMaterialList(originalID,newProjectID,projectGLJMap.IDMap,evaluateListModel),
+        copyMaterialList(originalID,newProjectID,projectGLJMap.IDMap,bidListModel),
     ];
     if(originalProperty.calcProgramFile){
         copyTasks.push(commonCopy(newProjectID,originalProperty.calcProgramFile.ID,calcProgramFileID,calcProgramsModel));
@@ -1704,6 +1706,7 @@ async function exportTenderData(data){
     result.calcProgramsFile = await calcProgramsModel.findOne({projectID:data.projectID});
     result.labourCoes = await labourCoesModel.findOne({projectID:data.projectID});
     result.evaluateList = await evaluateListModel.find({projectID:data.projectID}, '-_id').lean();
+    result.bidList = await bidListModel.find({projectID:data.projectID}, '-_id').lean();
 
     return cipher.aesEncrypt(JSON.stringify(result));
 }
@@ -1735,7 +1738,7 @@ async function importProjects(data,req,fields) {
 
 
 async function handleEachProject(data,projectIDMap,labourCoeFileIDMap,calcProgramFileIDMap){
-    let bills = [],rations = [],projectGLJs = [],rationGLJs=[],rationCoes=[],quantityDetails=[],rationInstallations=[],rationTemplates=[],evaluateList=[];
+    let bills = [],rations = [],projectGLJs = [],rationGLJs=[],rationCoes=[],quantityDetails=[],rationInstallations=[],rationTemplates=[],evaluateList=[],bidList=[];
     let newProjectSetting =null,newCalcProgramsFile = null,newLabourCoe = null;
     let billsIDMap = {},projectGLJIDMap={},rationIDMap = {};
     let newProjectID = projectIDMap[data.projSetting.projectID];
@@ -1784,6 +1787,7 @@ async function handleEachProject(data,projectIDMap,labourCoeFileIDMap,calcProgra
     if(data.rationInstallations && data.rationInstallations.length > 0) rationInstallations = setRationSubList(data.rationInstallations,newProjectID,billsIDMap,rationIDMap,projectGLJIDMap);
     if(data.rationTemplates && data.rationTemplates.length > 0) rationTemplates = setRationSubList(data.rationTemplates,newProjectID,billsIDMap,rationIDMap,projectGLJIDMap);
     if(data.evaluateList && data.evaluateList.length > 0) evaluateList = setMaterialList(data.evaluateList,newProjectID,projectGLJIDMap);
+    if(data.bidList && data.bidList.length > 0) bidList = setMaterialList(data.bidList,newProjectID,projectGLJIDMap);
 
     //生成projectSetting 文件
     if(data.projSetting){
@@ -1817,6 +1821,7 @@ async function handleEachProject(data,projectIDMap,labourCoeFileIDMap,calcProgra
     if(rationInstallations.length > 0) await insertMany(rationInstallations,rationInstallationModel);
     if(rationTemplates.length > 0) await insertMany(rationTemplates,rationTemplateModel);
     if(evaluateList.length > 0) await insertMany(evaluateList,evaluateListModel);
+    if(bidList.length > 0) await insertMany(bidList,bidListModel);
     if(newCalcProgramsFile) await calcProgramsModel.create(newCalcProgramsFile);
     if(newLabourCoe) await labourCoesModel.create(newLabourCoe);
 

+ 1 - 0
web/building_saas/glj/html/project_glj.html

@@ -32,6 +32,7 @@
                 <li class="nav-item"><a class="nav-link" href="javascript:void(0)" id="SCHZ">三材汇总</a></li>
                 <li class="nav-item"><a class="nav-link" href="javascript:void(0)" id="ZYCL">主要材料</a></li>
                 <li class="nav-item"><a class="nav-link" href="javascript:void(0)" id="AMAE">承包人主要材料设备</a></li>
+                <li class="nav-item"><a class="nav-link" href="javascript:void(0)" id="PBCL">评标材料</a></li>
             </ul>
         </div>
         <div class="main-content col p-0" id="material_adjust" style="overflow: hidden; display: none">

+ 6 - 3
web/building_saas/main/js/models/fee_rate.js

@@ -199,9 +199,12 @@ var FeeRate = {
                     calcProgramObj.refreshCalcProgram(node, 3);
                 }
             }
-            project.calcProgram.calcAllNodesAndSave(calcAllType.catAll);
-            project.markUpdateProject({projectID:project.ID(),feeRateID:this.getActivateFeeRateFileID()},"feeRate",function () {
-                socket.emit('feeRateChangeNotify', {projectID:project.ID(),feeRateID:me.getActivateFeeRateFileID(),userID:userID});
+            project.calcProgram.calcAllNodesAndSave(calcAllType.catAll,function () {
+                $.bootstrapLoading.start();
+                project.markUpdateProject({projectID:project.ID(),feeRateID:me.getActivateFeeRateFileID()},"feeRate",function () {
+                    $.bootstrapLoading.end();
+                    socket.emit('feeRateChangeNotify', {projectID:project.ID(),feeRateID:me.getActivateFeeRateFileID(),userID:userID});
+                });
             });
         };
 

+ 4 - 2
web/building_saas/main/js/models/main_consts.js

@@ -18,7 +18,8 @@ const ModuleNames = {
     calc_program: 'calc_program',
     installation_fee:'installation_fee',
     projectInfo: 'project_info',
-    evaluate_list:'evaluate_list'
+    evaluate_list:'evaluate_list',
+    bid_evaluation_list:'bid_evaluation_list'
 };
 
 let gljType = gljUtil.gljType;
@@ -402,7 +403,8 @@ const filterType = {
     ZGCL:'9',
     SCHZ:'10',
     ZYCL:'11',
-    AMAE:'12'
+    AMAE:'12',
+    PBCL:'13'
 };
 // 文件类型
 const _fileKind = {

+ 6 - 1
web/building_saas/main/js/models/project.js

@@ -103,6 +103,7 @@ var PROJECT = {
             this.labourCoe = new LabourCoe(this);
             this.calcProgram = new CalcProgram(this);
             this.evaluate_list = new EvaluateList(this);
+            this.bid_evaluation_list = new BidEvaluationList(this);
             this.calcBase = calcBase;
 
             // this.masterField = {ration: 'billsItemID', volumePrice: 'billsItemID'};
@@ -336,7 +337,11 @@ var PROJECT = {
             }
         };
         project.prototype.markUpdateProject = function (data,type,callback) {
-            CommonAjax.post("/project/markUpdateProject",{updateInfo:data,type:type},callback);
+            $.bootstrapLoading.start()
+            CommonAjax.post("/project/markUpdateProject",{updateInfo:data,type:type},function(){
+                if(callback) callback();
+                $.bootstrapLoading.end()
+            });
         };
 
         project.prototype.saveProperty = function (propertyName, propertyValue) {

+ 11 - 0
web/building_saas/main/js/models/project_glj.js

@@ -911,4 +911,15 @@ class EvaluateList {
     loadData (datas) {
         this.datas = datas;
     };
+}
+
+class BidEvaluationList {
+    constructor (project) {
+        this.project = project;
+        this.datas = [];
+        project.registerModule(ModuleNames.bid_evaluation_list, this);
+    };
+    loadData (datas) {
+        this.datas = datas;
+    };
 }

+ 1 - 0
web/building_saas/main/js/views/calc_program_view.js

@@ -52,6 +52,7 @@ let calcProgramObj = {
                 break;
             case 2:
                 projectObj.project.calcProgram.innerCalc(treeNode, []);
+                projectObj.project.calcProgram.rationMap = null;
                 delete treeNode.changed;
                 break;
             case 3:

+ 249 - 70
web/building_saas/main/js/views/config_material_view.js

@@ -7,11 +7,12 @@ let configMaterialObj = {
     configSpread:null,
     relatedSpread:null,
     evaluateMaterialDatas:[],
+    bidMaterialDatas:[],
     evaluateMaterialSetting:{
         header: [
             {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
-            {headerName: "编号", headerWidth: 80, dataCode: "code", dataType: "String"},
-            {headerName: "序号", headerWidth: 80, dataCode: "seq", dataType: "String"},
+            {headerName: "编号", headerWidth: 80, dataCode: "code", dataType: "String",formatter: "@"},
+            {headerName: "序号", headerWidth: 80, dataCode: "seq", dataType: "String",formatter: "@"},
             {headerName: "材料名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
             {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
@@ -25,6 +26,24 @@ let configMaterialObj = {
         ],
         view:{ lockColumns: ["is_related","unit","totalPrice","originPlace","vender"]}
     },
+    bidMaterialSetting:{
+        header: [
+            {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
+            {headerName: "序号", headerWidth: 80, dataCode: "seq", dataType: "String",formatter: "@"},
+            {headerName: "关联材料号", headerWidth: 80, dataCode: "code", dataType: "String",formatter: "@"},
+            {headerName: "材料名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
+            {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
+            {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
+            {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",validator:"number"},//decimalField:'glj.quantity'
+            {headerName: "单价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",validator:"number"},
+            {headerName: "合价", headerWidth: 90, dataCode: "totalPrice", hAlign: "right", dataType: "Number",validator:"number",decimalField:'bills.totalPrice'},
+            {headerName: "产地", headerWidth: 80, dataCode: "originPlace", hAlign: "left", dataType: "String",visible:false},
+            {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String",visible:false},
+            {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
+        ],
+        view:{ lockColumns: ["is_related","unit","totalPrice","originPlace","vender"]}
+    },
+
     evaluateRelateSetting:{
         header: [
             {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
@@ -52,6 +71,7 @@ let configMaterialObj = {
             sheetCommonObj.spreadDefaultStyle(this.relatedSpread);
         }
         this.initEvaluateMaterialSheet();
+        this.initbidMaterialSheet();
         this.initEvaluateRelateSheet();
         //打开别人分享的项目,只读
         if(projectReadOnly){
@@ -71,6 +91,16 @@ let configMaterialObj = {
         this.evaluateMaterialSheet.name('evaluateMaterialSheet');
         this.evaluateMaterialSheet.setRowHeight(0, 36, 1);
     },
+    initbidMaterialSheet:function(){
+        this.bidMaterialSheet = this.configSpread.getSheet(1);
+        sheetCommonObj.initSheet(this.bidMaterialSheet,this.bidMaterialSetting,30);
+        this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onBidEvaluateMaterialValueChange);
+        this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onEvaluateMaterialSelectionChange);
+        //this.bidMaterialSheet.bind(GC.Spread.Sheets.Events.EditStarting,this.onEvaluateMaterialEditStarting);
+        //this.evaluateMaterialSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
+        this.bidMaterialSheet.name('bidMaterialSheet');
+        this.bidMaterialSheet.setRowHeight(0, 36, 1);
+    },
     initEvaluateRelateSheet:function () {
         this.evaluateRelateSheet = this.relatedSpread.getSheet(0);
         sheetCommonObj.initSheet(this.evaluateRelateSheet,this.evaluateRelateSetting,30);
@@ -87,6 +117,12 @@ let configMaterialObj = {
         sheetCommonObj.showData(this.evaluateMaterialSheet, this.evaluateMaterialSetting,this.evaluateMaterialDatas);
         this.evaluateMaterialSheet.setRowCount(this.evaluateMaterialDatas.length);
     },
+    showBidMaterialDatas:function () {
+        this.configSpread.setActiveSheetIndex(1);
+        this.bidMaterialDatas = this.getBidMaterialDatas();
+        sheetCommonObj.showData(this.bidMaterialSheet, this.bidMaterialSetting,this.bidMaterialDatas);
+        this.bidMaterialSheet.setRowCount(this.bidMaterialDatas.length);
+    },
     showEvaluateRelateDatas:function () {
         this.relatedSpread.setActiveSheetIndex(0);
         this.evaluateRelateDatas = this.getEvaluateRelateDatas();
@@ -95,32 +131,49 @@ let configMaterialObj = {
     },
 
     refreshSheetDatas:function () {
-        this.showEvaluateMaterialDatas();
+        if(projectGljObject.displayType == filterType.ZGCL){
+            this.showEvaluateMaterialDatas();
+        }else if(projectGljObject.displayType == filterType.PBCL){
+            this.showBidMaterialDatas();
+        }
         this.showEvaluateRelateDatas();
+
     },
     getEvaluateRelateDatas:function () {
         //$('filterGljName')
-        let name = '';
-        let datas = [];
-        let sel = this.evaluateMaterialSheet.getSelections()[0];
+        let name = '',datas = [],sheet=null,field='',rdata=[];
+        switch (projectGljObject.displayType){
+            case filterType.ZGCL:
+                sheet = this.evaluateMaterialSheet;
+                datas = this.evaluateMaterialDatas;
+                field = "is_evaluate";
+                break;
+            case filterType.PBCL:
+                sheet = this.bidMaterialSheet;
+                datas = this.bidMaterialDatas;
+                field = "is_eval_material";
+                break;
+        }
+
+        let sel = sheet.getSelections()[0];
         let srow = sel.row == -1||sel.row == ""?0:sel.row;
-        if(this.evaluateMaterialDatas.length>srow){
-             name = this.relateFilterAgain== true? $('#filterGljName').val(): this.evaluateMaterialDatas[srow].name;
-            datas = this.filterEvaluateRelate(name,this.evaluateMaterialDatas[srow].projectGLJID);
+        if(gljUtil.isDef(srow) && datas.length>srow){
+             name = this.relateFilterAgain== true? $('#filterGljName').val(): datas[srow].name;
+             rdata = this.filterEvaluateRelate(name,datas[srow].projectGLJID,field);
         }
         if(this.relateFilterAgain== false) $('#filterGljName').val(name);
-        return datas;
+        return rdata;
     },
-    filterEvaluateRelate:function (name,projectGLJID) {
+    filterEvaluateRelate:function (name,projectGLJID,relateField) {
         let datas = [];
         let projectGLJ =  projectObj.project.projectGLJ;
         let materialIdList = projectGLJ.datas.constData.materialIdList;
         for(let d of projectGLJ.datas.gljList){
-            if (materialIdList.indexOf(d.type) >= 0){//材料类型
-                if(d.is_evaluate == 1 && d.id != projectGLJID) continue;//排除其它已被关联的工料机
+            if (materialIdList.indexOf(d.type) >= 0 && parseFloat(d.quantity) > 0 ){//材料类型
+                if(d[relateField] == 1 && d.id != projectGLJID) continue;//排除其它已被关联的工料机
                 if(name != ''){//name为''时不做过滤
                     if(d.name.indexOf(name)==-1){
-                        if(!(d.is_evaluate == 1 && d.id == projectGLJID)) continue;//虽然不匹配,但是是关联的暂估材料,这时应该显示
+                        if(!(d[relateField] == 1 && d.id == projectGLJID)) continue;//虽然不匹配,但是是关联的暂估材料,这时应该显示
                     }
                 }
                 let t = {
@@ -138,7 +191,7 @@ let configMaterialObj = {
                     remark:d.remark,
                     from:d
                 };
-                t.is_related = d.is_evaluate;
+                t.is_related = d[relateField];
                 gljOprObj.setGLJPrice(t,d);
                 t.totalPrice = scMathUtil.roundForObj(t.quantity * t.marketPrice,getDecimal('bills.totalPrice'));
                 datas.push(t);
@@ -182,6 +235,37 @@ let configMaterialObj = {
         return _.sortByAll(datas,'code');
     },
 
+    getBidMaterialDatas:function () {
+        let datas = [];
+        let gljMap = _.indexBy(projectObj.project.projectGLJ.datas.gljList,'id');
+        for(let e of projectObj.project.bid_evaluation_list.datas){
+            let t = {
+                ID:e.ID,
+                projectID: e.projectID,
+                is_related:e.is_related,//关联,1关,0不关
+                projectGLJID:e.projectGLJID,//关联工料机ID
+                seq:e.seq,//序号
+                code:e.code,
+                name:e.name,
+                specs:e.specs,
+                unit:e.unit,
+                type:e.type,
+                marketPrice:e.market_price,
+                quantity:e.quantity,
+                remark:e.remark,
+                originPlace:e.originPlace,//产地
+                vender:e.vender //厂家
+            };
+            let pglj = gljMap[e.projectGLJID];
+            if(e.is_related && pglj){
+                t.quantity = pglj.quantity;
+            }
+            t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice) ,getDecimal('bills.totalPrice'));
+            datas.push(t);
+        }
+        return _.sortByAll(datas,'code');
+    },
+
     updateConfigMaterial:function (dataCode,value,recode) {
         let task = [];
         for(let t of projectObj.project.projectGLJ.datas.gljList){
@@ -194,11 +278,8 @@ let configMaterialObj = {
         pdata.doc[dataCode] = value;
         pdata['id'] = glj.id;
         task.push(pdata);
-        if(dataCode == "is_evaluate"){
-            this.getEvaluateUpdateTasks(value,glj,task);
-            this.updateEvaluateMaterial(task);
-        }
-
+        this.getEvaluateUpdateTasks(value,glj,dataCode,task);
+        this.updateEvaluateMaterial(task,dataCode == "is_evaluate");
     },
 
     updateEvaluateMaterial :async function(data,refreshEvaluate=true){
@@ -236,7 +317,14 @@ let configMaterialObj = {
                 }
                 if(t.action == "add") projectObj.project.evaluate_list.datas.push(t.doc);
                 if(t.action == "delete") _.remove(projectObj.project.evaluate_list.datas,{'ID':t.ID});
-            }else {
+            }else if(t.type == "bid_evaluation_list"){
+                if(t.action == "update"){
+                    let e = _.find(projectObj.project.bid_evaluation_list.datas,{'ID':t.ID});
+                    if(e) updateProperty(e,t.doc);
+                }
+                if(t.action == "add") projectObj.project.bid_evaluation_list.datas.push(t.doc);
+                if(t.action == "delete") _.remove(projectObj.project.bid_evaluation_list.datas,{'ID':t.ID});
+            } else {
                 if(_.isEmpty(this.GLJIDMap)) this.GLJIDMap = _.indexBy(projectObj.project.projectGLJ.datas.gljList,'id');
                 //剩下两个类型只有更新操作
                 if(t.type == "unit_price"){
@@ -268,11 +356,19 @@ let configMaterialObj = {
             return updatePrice;
         }
     },
-    getEvaluateUpdateTasks:function (value,glj,task) {
+    getEvaluateUpdateTasks:function (value,glj,dataCode,task) {
+        let dataList = [],modelType='evaluate_list';
+        if(dataCode == 'is_evaluate'){
+            dataList = projectObj.project.evaluate_list.datas;
+            modelType = 'evaluate_list';
+        }else if(dataCode == 'is_eval_material'){
+            dataList = projectObj.project.bid_evaluation_list.datas;
+            modelType = 'bid_evaluation_list';
+        }
         if(value == 1){ //勾选暂估选项,查看已有的暂估材料列表中是否有名称,编号等完全相同的记录,有则直接关联,无则添加
             let evaluate = null;
             let pindex = gljUtil.getIndex(glj);
-            for(let e of projectObj.project.evaluate_list.datas){
+            for(let e of dataList){
                 let eIndex = gljUtil.getIndex(e);
                 if(pindex == eIndex){
                     evaluate = e;
@@ -280,19 +376,21 @@ let configMaterialObj = {
                 }
             }
             if(evaluate){//有找到则更新,没有则添加
-                let edata = {type:'evaluate_list',doc:{},action:"update",ID:evaluate.ID};
+                let edata = {type:modelType,doc:{},action:"update",ID:evaluate.ID};
                 edata.doc = {projectGLJID:glj.id,is_related:1};
                 task.push(edata);
-                let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:glj.id,id : glj.unit_price.id};
-                //if(evaluate.base_price != glj.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
-                if(evaluate.market_price != glj.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
-                if(!_.isEmpty(udata.doc)) task.push(udata);
+                if(dataCode == 'is_evaluate'){
+                    let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:glj.id,id : glj.unit_price.id};
+                    //if(evaluate.base_price != glj.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
+                    if(evaluate.market_price != glj.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
+                    if(!_.isEmpty(udata.doc)) task.push(udata);
+                }
             }else {
-                let ndata = {type:'evaluate_list',doc:{},action:"add"};
+                let ndata = {type:modelType,doc:{},action:"add"};
                 ndata.doc['ID'] = uuid.v1();
                 ndata.doc['projectGLJID'] = glj.id;
                 ndata.doc['is_related'] = 1;
-                ndata.doc['locked'] = 0;
+                if(dataCode == 'is_evaluate') ndata.doc['locked'] = 0;
                 ndata.doc['seq'] = glj.code;
                 ndata.doc['projectID'] = glj.project_id;
                 ndata.doc['code'] = glj.code;
@@ -302,7 +400,6 @@ let configMaterialObj = {
                 ndata.doc['quantity'] = glj.quantity;
                 ndata.doc['type'] = glj.type;
                 ndata.doc['market_price'] = glj.unit_price.market_price;
-               // ndata.doc['base_price'] = glj.unit_price.base_price;
                 ndata.doc['originPlace'] = glj.originPlace;
                 ndata.doc['vender'] = glj.vender;
                 ndata.doc['remark'] = glj.remark;
@@ -310,14 +407,14 @@ let configMaterialObj = {
             }
         }else if(value == 0){
             let t_evaluate = null;
-            for(let e of projectObj.project.evaluate_list.datas){
+            for(let e of dataList){
                 if(e.projectGLJID == glj.id && e.is_related == 1){
                     t_evaluate = e;
                     break;
                 }
             }
             if(t_evaluate){
-                let tdata = {type:'evaluate_list',doc:{is_related:0,quantity:'0'},action:"update",ID:t_evaluate.ID};
+                let tdata = {type:modelType,doc:{is_related:0,quantity:'0'},action:"update",ID:t_evaluate.ID};
                 task.push(tdata);
             }
         }
@@ -331,6 +428,32 @@ let configMaterialObj = {
             me.relateFilterAgain = false;
         }
     },
+    onBidEvaluateMaterialValueChange:function (e,info) {
+        let me = configMaterialObj,row = info.row, col = info.col;
+        let dataCode = me.bidMaterialSetting.header[col].dataCode;
+        let value = info.newValue;
+        let bid = me.bidMaterialDatas[row];
+
+        if (value&&! sheetCommonObj.checkData(col,me.bidMaterialSetting,value)) {
+            alert('输入的数据类型不对,请重新输入!');
+            return me.showBidMaterialDatas();
+        }
+
+        if(dataCode == 'marketPrice'){
+            dataCode = 'market_price';
+            value =  scMathUtil.roundToString(value,getDecimal('glj.unitPrice'));
+        }
+        if(dataCode === 'quantity'){//修改数量需做4舍5入
+            value =  scMathUtil.roundToString(value,getDecimal('glj.quantity'));
+        }
+
+        let edata = {type:'bid_evaluation_list',doc:{},action:"update",ID:bid.ID};
+        if(bid[dataCode] == value) return me.showBidMaterialDatas();
+        edata.doc[dataCode] = value;
+        me.updateEvaluateMaterial([edata],false);
+    },
+
+
     onEvaluateMaterialValueChange:function (e,info) {
         let me = configMaterialObj,row = info.row, col = info.col;
         let dataCode = me.evaluateMaterialSetting.header[col].dataCode;
@@ -361,16 +484,33 @@ let configMaterialObj = {
     onEvaluateRelateValueChange:function (e,info){
         let me = configMaterialObj,row = info.row, col = info.col;
         let value = info.newValue;
-        let sel = me.evaluateMaterialSheet.getSelections()[0];
+        let sheet = null,datas = [],field = "",type="";
+        switch (projectGljObject.displayType){
+            case filterType.ZGCL:
+                sheet = me.evaluateMaterialSheet;
+                datas = me.evaluateMaterialDatas;
+                field = "is_evaluate";
+                type="evaluate_list";
+                break;
+            case filterType.PBCL:
+                sheet = me.bidMaterialSheet;
+                datas = me.bidMaterialDatas;
+                field = "is_eval_material";
+                type="bid_evaluation_list";
+                break;
+        }
+
+        let sel = sheet.getSelections()[0];
         let srow = sel.row == -1||sel.row == ""?0:sel.row;
         let task = [];
         value = value == true?1:0;
-        if(me.evaluateMaterialDatas.length>srow){
-            let evaluate = me.evaluateMaterialDatas[srow];
+        if(datas.length>srow){
+            let evaluate = datas[srow];
             let relate = me.evaluateRelateDatas[row];
-            let pdata = {id:relate.id,doc:{is_evaluate:value},action:'update',type:"glj_list"};
+            let pdata = {id:relate.id,doc:{},action:'update',type:"glj_list"};
+            pdata.doc[field] = value;
             task.push(pdata);
-            let tdata = {type:'evaluate_list',doc:{},action:"update",ID:evaluate.ID};
+            let tdata = {type:type,doc:{},action:"update",ID:evaluate.ID};
             if(value == 0){//如果是0的话
                 tdata.doc = {is_related:0,quantity:'0'};
             }else {
@@ -379,26 +519,46 @@ let configMaterialObj = {
                     return me.showEvaluateRelateDatas();
                 }
                 //如果已经关联了其它项目工料机,要把那个项目工料机的是否暂估标记为否
-                if(evaluate.is_related == 1)  task.push({id:evaluate.projectGLJID,doc:{is_evaluate:0},action:'update',type:"glj_list"});
+                if(evaluate.is_related == 1){
+                    let tdoc = {};
+                    tdoc[field] = 0;
+                    task.push({id:evaluate.projectGLJID,doc:tdoc,action:'update',type:"glj_list"});
+                }
                 //更新暂估材料的工料机ID,和关联标记
                 tdata.doc = {projectGLJID:relate.id,is_related:1};
-                //更新新关联工料机的市场价格
-                let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:relate.from.id,id : relate.from.unit_price.id};
-                //if(evaluate.base_price != relate.from.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
-                if(evaluate.marketPrice != relate.from.unit_price.market_price) udata.doc['market_price'] = evaluate.marketPrice;
-                if(!_.isEmpty(udata.doc)) task.push(udata);
+                if(projectGljObject.displayType == filterType.ZGCL){
+                    //更新新关联工料机的市场价格
+                    let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:relate.from.id,id : relate.from.unit_price.id};
+                    //if(evaluate.base_price != relate.from.unit_price.base_price) udata.doc['base_price'] = evaluate.base_price;
+                    if(evaluate.marketPrice != relate.from.unit_price.market_price) udata.doc['market_price'] = evaluate.marketPrice;
+                    if(!_.isEmpty(udata.doc)) task.push(udata);
+                }
             }
             task.push(tdata);
             me.updateEvaluateMaterial(task);
         }
     },
-    deleteEvaluateMaterial:function (row) {
+    deleteMaterial:function (row) {
         let me = configMaterialObj;
-        let evaluate = me.evaluateMaterialDatas[row],task=[];
+        let evaluate = {},task=[],type='',field='';
+        switch (projectGljObject.displayType){
+            case filterType.ZGCL:
+                evaluate = me.evaluateMaterialDatas[row];
+                field = "is_evaluate";
+                type="evaluate_list";
+                break;
+            case filterType.PBCL:
+                evaluate = me.bidMaterialDatas[row];
+                field = "is_eval_material";
+                type="bid_evaluation_list";
+                break;
+        }
         if(evaluate){
-            task.push({type:'evaluate_list',action:"delete",ID:evaluate.ID});
+            task.push({type:type,action:"delete",ID:evaluate.ID});
             if(evaluate.is_related == 1){//如果关联了工料机,则要把工料机标记为不是暂估
-                task.push({id:evaluate.projectGLJID,doc:{is_evaluate:0},action:'update',type:"glj_list"})
+                let tdoc = {};
+                tdoc[field] = 0;
+                task.push({id:evaluate.projectGLJID,doc:tdoc,action:'update',type:"glj_list"})
             }
             me.updateEvaluateMaterial(task);
         }
@@ -447,7 +607,7 @@ let configMaterialObj = {
                     },
                     callback: function (key, opt) {
                         let row = me.rightClickTarget.row;
-                        me.deleteEvaluateMaterial(row);
+                        me.deleteMaterial(row);
                     }
                 }
             }
@@ -540,11 +700,13 @@ let pgljSelObj={
         let projectGLJ = projectObj.project.projectGLJ;
         let materialIdList = projectGLJ.datas.constData.materialIdList;
         let data = materialAdjustObj.getCommonObject(glj);
-        data.select = glj.is_evaluate;
+        console.log(projectGljObject.displayType);
+        data.select = projectGljObject.displayType == filterType.ZGCL?glj.is_evaluate:glj.is_eval_material;
         data.from = glj;
         data.short_name = projectGLJ.getShortNameByID(glj.type);
         // 只有材料才显示是否暂估
        // if (materialIdList.indexOf(glj.type) >= 0) data.is_evaluate = glj.is_evaluate;
+        data.is_eval_material = glj.is_eval_material;
         data.is_evaluate = glj.is_evaluate;
         return data;
     },
@@ -562,7 +724,7 @@ let pgljSelObj={
                     if(d.type == 5) d.select = 1;
                     break;
                 case "取消":
-                    d.select = d.is_evaluate;
+                    d.select = projectGljObject.displayType == filterType.ZGCL?d.is_evaluate:d.is_eval_material;
                     break;
             }
         }
@@ -570,57 +732,76 @@ let pgljSelObj={
     },
     confirmSelect:function () {
         let tasks = [];
-        let evaluateMap = _.indexBy(projectObj.project.evaluate_list.datas,"projectGLJID");
+        let datas = [],modelType= '',field= '';
+        switch (projectGljObject.displayType){
+            case filterType.ZGCL:
+                datas = projectObj.project.evaluate_list.datas;
+                field = "is_evaluate";
+                modelType="evaluate_list";
+                break;
+            case filterType.PBCL:
+                datas =projectObj.project.bid_evaluation_list.datas;
+                field = "is_eval_material";
+                modelType="bid_evaluation_list";
+                break;
+        }
+
+        let evaluateMap = _.indexBy(datas,"projectGLJID");
         let evaluateKeyMap = {};//关键字映射表
-        for(let e of projectObj.project.evaluate_list.datas){
+        for(let e of datas){
             let eIndex = gljUtil.getIndex(e);
             evaluateKeyMap[eIndex] = e;
         }
         for(let d of this.datas){
             if(d.select == 1){//如果是选中状态
-                if(d.is_evaluate == 1) {//如果是暂估,查看是否已经存在关联的暂估材料
+                if(d[field] == 1) {//如果已经标记为暂估或评标材料,查看是否已经存在关联的材料
                     let evl = evaluateMap[d.id];
                     if(evl){
                         //这里应该是错误检查的保证,按正常是不应该出现这种情况的
-                        if(evl.is_related !=1) tasks.push({type:'evaluate_list',doc:{projectGLJID:d.id,is_related:1},action:"update",ID:evl.ID});
+                        if(evl.is_related !=1) tasks.push({type:modelType,doc:{projectGLJID:d.id,is_related:1},action:"update",ID:evl.ID});
                     }else {
-                        tasks.push(getNewEval(d))
+                        tasks.push(getNewEval(d,modelType))
                     }
                 }else {//如果不是暂估,要改成暂估
-                    let pdata = {id:d.id,doc:{is_evaluate:1},action:'update',type:"glj_list"};
+                    let pdata = {id:d.id,doc:{},action:'update',type:"glj_list"};
+                    pdata.doc[field] = 1;
                     tasks.push(pdata);
                     let evaluate = evaluateKeyMap[gljUtil.getIndex(d)];
                     if(evaluate) {//如果已经存在5个关键字相同的暂估材料,则自动关联起来
-                        let edata = {type:'evaluate_list',doc:{projectGLJID:d.id,is_related:1},action:"update",ID:evaluate.ID};
+                        let edata = {type:modelType,doc:{projectGLJID:d.id,is_related:1},action:"update",ID:evaluate.ID};
                         tasks.push(edata);
-                        let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:d.id,id : d.from.unit_price.id};
-                        if(evaluate.market_price != d.from.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
-                        if(!_.isEmpty(udata.doc)) tasks.push(udata);
+                        if(modelType == 'evaluate_list'){
+                            let udata = {type:'unit_price',doc:{},action:"update",projectGLJID:d.id,id : d.from.unit_price.id};
+                            if(evaluate.market_price != d.from.unit_price.market_price) udata.doc['market_price'] = evaluate.market_price;
+                            if(!_.isEmpty(udata.doc)) tasks.push(udata);
+                        }
                     }else {//如果不存在,则生成一条新的
-                        tasks.push(getNewEval(d));
+                        tasks.push(getNewEval(d,modelType));
                     }
                 }
             }else {//未选中状态的,检查一下是否存在关联的情况,取消关联
-                if(d.is_evaluate == 1)  tasks.push({id:d.id,doc:{is_evaluate:0},action:'update',type:"glj_list"});
+                let tdoc = {};
+                tdoc[field] = 0;
+                if(d[field] == 1)  tasks.push({id:d.id,doc:tdoc,action:'update',type:"glj_list"});
                 let evl = evaluateMap[d.id];
                 if(evl){
-                    if(evl.is_related ==1) tasks.push({type:'evaluate_list',doc:{is_related:0},action:"update",ID:evl.ID});
+                    if(evl.is_related ==1) tasks.push({type:modelType,doc:{is_related:0},action:"update",ID:evl.ID});
                 }
                 let evaluate = evaluateKeyMap[gljUtil.getIndex(d)];
                 if(evaluate) {
-                    if(evaluate.is_related ==1) tasks.push({type:'evaluate_list',doc:{is_related:0},action:"update",ID:evaluate.ID});
+                    if(evaluate.is_related ==1) tasks.push({type:modelType,doc:{is_related:0},action:"update",ID:evaluate.ID});
                 }
             }
         }
         if(tasks.length > 0) configMaterialObj.updateEvaluateMaterial(tasks);
 
 
-        function getNewEval(d) {
-            let ndata = {type:'evaluate_list',doc:{},action:"add"};
+        function getNewEval(d,m_t) {
+            let ndata = {type:m_t,doc:{},action:"add"};
             ndata.doc['ID'] = uuid.v1();
             ndata.doc['projectGLJID'] = d.id;
             ndata.doc['is_related'] = 1;
-            ndata.doc['locked'] = 0;
+            if(m_t == "evaluate_list")ndata.doc['locked'] = 0;
             ndata.doc['seq'] = d.code;
             ndata.doc['projectID'] = d.from.project_id;
             ndata.doc['code'] = d.code;
@@ -635,8 +816,6 @@ let pgljSelObj={
             ndata.doc['remark'] = d.remark;
             return ndata;
         }
-        
-        
     }
 };
 

+ 6 - 2
web/building_saas/main/js/views/fee_rate_view.js

@@ -539,6 +539,7 @@ var feeRateObject={
         this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onMainFeeRateRangeChanged);
         this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.EditStarting, function (e,args) {
             let me =feeRateObject;
+            if($.bootstrapLoading.isLoading()) args.cancel = true;
             if(!me.mainFeeRateEditChecking(args.row,args.col)){
                 args.cancel = true;
             }
@@ -637,8 +638,11 @@ var feeRateObject={
                         feerateInfo.push({rateID:r.rateID,value:r.value});
                     }
                 }
-                feerateInfo.length > 0 ?feeRate.onFeeRatesChange(feerateInfo):'';
-                $.bootstrapLoading.end();
+                if(feerateInfo.length > 0){
+                    feeRate.onFeeRatesChange(feerateInfo);
+                }else {
+                    $.bootstrapLoading.end();
+                }
             })
         }
     },

+ 4 - 4
web/building_saas/main/js/views/project_glj_view.js

@@ -1,7 +1,7 @@
 /**
  * Created by zhang on 2018/3/13.
  */
-projectGljObject={
+let projectGljObject={
     showTag:'ration',//mixRatio/machine
     showMixRatioMark:'',
     displayType:filterType.ALL,
@@ -528,7 +528,7 @@ projectGljObject={
             $('#adjustType').val(adjustType);
             $('#project-glj-main').hide();
             $('#config_material').hide();
-        }else if(me.displayType == filterType.ZGCL){
+        }else if(me.displayType == filterType.ZGCL || me.displayType == filterType.PBCL){
             $('#material_adjust').hide();
             $('#adjustType').hide();
             $('#project-glj-main').hide();
@@ -543,7 +543,7 @@ projectGljObject={
     refreshViewsData:function(){
         let me = projectGljObject;
         if(me.displayType == filterType.AMAE) return materialAdjustObj.refreshSheetDatas();
-        if(me.displayType == filterType.ZGCL) return configMaterialObj.refreshSheetDatas();
+        if(me.displayType == filterType.ZGCL || me.displayType == filterType.PBCL) return configMaterialObj.refreshSheetDatas();
         me.refreshDataSheet();
     },
     refreshDataSheet:function () {
@@ -938,7 +938,7 @@ projectGljObject={
             }
             if(dataCode === 'is_evaluate'||dataCode === 'is_adjust_price'||dataCode === 'is_main_material'||dataCode === 'no_tax_eqp'||dataCode == 'is_eval_material'){
                 value = value == true?1:0;
-                if(dataCode === 'is_evaluate'){
+                if(dataCode === 'is_evaluate'|| dataCode == 'is_eval_material'){
                     configMaterialObj.updateConfigMaterial(dataCode,value,recode);//暂估材料,主要材料等新需求
                     return
                 }