Procházet zdrojové kódy

承包人材料相关功能

zhangweicheng před 6 roky
rodič
revize
88bc3e18ba

+ 1 - 0
modules/all_models/config_material_list.js

@@ -66,6 +66,7 @@ let contractorSchema = {
     market_price:String,
     quantity:String,
     remark:String,
+    supply: {type: Number, default: 0},
     originPlace:String,//产地
     vender:String //厂家
 };

+ 3 - 2
modules/all_models/project_glj.js

@@ -118,12 +118,13 @@ let modelSchema = {
         type: Number,
         default: 0
     },
-    is_info_adjust:{type: Number, default: 0},//是否造价信息差额调整
+    is_contractor_material:{type: Number, default: 0},//承包人主要材料设备
+  /*  is_info_adjust:{type: Number, default: 0},//是否造价信息差额调整
     is_coe_adjust:{type: Number, default: 0},//是否价格指数调整
     riskCoe:String,//风险系数
     standardPrice:String,//standardPrice
     FO:String,//基本价格指数
-    FI:String,//现行价格指数
+    FI:String,//现行价格指数*/
     ratio_data: Schema.Types.Mixed,
     remark:String,
     originPlace:String,//产地

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

@@ -12,6 +12,7 @@ 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 contractorListModel = mongoose.model("contractor_list");
 let projectGLJModel = mongoose.model("glj_list");
 let unitFileMode = mongoose.model("unit_price");
 
@@ -91,7 +92,8 @@ async function updateEvaluateMaterial(data) {
         "glj_list":projectGLJModel,
         "evaluate_list":evaluateListModel,
         "unit_price":unitFileMode,
-        "bid_evaluation_list":bidEvaluationMode
+        "bid_evaluation_list":bidEvaluationMode,
+        "contractor_list":contractorListModel
     };
     for(let t of data.tasks){
         let model = modelMap[t.type];

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

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

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

@@ -19,6 +19,7 @@ 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 contractor_facade = require('../facade/contractor_facade');
 let pmController = require('../../pm/controllers/pm_controller');
 
 
@@ -49,6 +50,7 @@ moduleMap[projectConsts.RATION_TEMPLATE] = ration_template;
 moduleMap[projectConsts.PROJECT_INFO] = pmController;
 moduleMap[projectConsts.EVALUATE_LIST] = evaluate_facade;
 moduleMap[projectConsts.BID_EVALUATION_LIST] = bid_facade;
+moduleMap[projectConsts.contractor_list] = contractor_facade;
 
 var Project = function (){};
 

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

@@ -23,6 +23,7 @@ let projectConst = {
     INSTALLATION_FEE:'installation_fee',
     PROJECT_INFO: 'project_info',
     EVALUATE_LIST:'evaluate_list',
+    CONTRACTOR_LIST:'contractor_list',
     BID_EVALUATION_LIST:'bid_evaluation_list'
 };
 

+ 6 - 1
modules/pm/facade/pm_facade.js

@@ -74,6 +74,7 @@ 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 contractorListModel = mongoose.model("contractor_list");
 let featureLibModel =  mongoose.model("std_project_feature_lib");
 let scMathUtil = require('../../../public/scMathUtil').getUtil();
 let counter = require('../../../public/counter/counter');
@@ -247,6 +248,7 @@ async function copyProject(userID, compilationID,data,newProjectID = null) {
         copyRationSubList(originalID,newProjectID,billMap.uuidMaping,rationMap.uuidMaping,projectGLJMap.IDMap,rationTemplateModel),
         copyMaterialList(originalID,newProjectID,projectGLJMap.IDMap,evaluateListModel),
         copyMaterialList(originalID,newProjectID,projectGLJMap.IDMap,bidListModel),
+        copyMaterialList(originalID,newProjectID,projectGLJMap.IDMap,contractorListModel),
     ];
     if(originalProperty.calcProgramFile){
         copyTasks.push(commonCopy(newProjectID,originalProperty.calcProgramFile.ID,calcProgramFileID,calcProgramsModel));
@@ -1707,6 +1709,7 @@ async function exportTenderData(data){
     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();
+    result.contractorList = await contractorListModel.find({projectID:data.projectID}, '-_id').lean();
 
     return cipher.aesEncrypt(JSON.stringify(result));
 }
@@ -1738,7 +1741,7 @@ async function importProjects(data,req,fields) {
 
 
 async function handleEachProject(data,projectIDMap,labourCoeFileIDMap,calcProgramFileIDMap){
-    let bills = [],rations = [],projectGLJs = [],rationGLJs=[],rationCoes=[],quantityDetails=[],rationInstallations=[],rationTemplates=[],evaluateList=[],bidList=[];
+    let bills = [],rations = [],projectGLJs = [],rationGLJs=[],rationCoes=[],quantityDetails=[],rationInstallations=[],rationTemplates=[],evaluateList=[],bidList=[],contractorList=[];
     let newProjectSetting =null,newCalcProgramsFile = null,newLabourCoe = null;
     let billsIDMap = {},projectGLJIDMap={},rationIDMap = {};
     let newProjectID = projectIDMap[data.projSetting.projectID];
@@ -1788,6 +1791,7 @@ async function handleEachProject(data,projectIDMap,labourCoeFileIDMap,calcProgra
     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);
+    if(data.contractorList && data.contractorList.length > 0) contractorList = setMaterialList(data.contractorList,newProjectID,projectGLJIDMap);
 
     //生成projectSetting 文件
     if(data.projSetting){
@@ -1822,6 +1826,7 @@ async function handleEachProject(data,projectIDMap,labourCoeFileIDMap,calcProgra
     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(contractorList.length > 0) await insertMany(contractorList,contractorListModel);
     if(newCalcProgramsFile) await calcProgramsModel.create(newCalcProgramsFile);
     if(newLabourCoe) await labourCoesModel.create(newLabourCoe);
 

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

@@ -1142,7 +1142,7 @@ const XMLStandard = (function () {
                 if (exportKind === _config.EXPORT_KIND.Tender) {
                     let adjustType = tenderData.property.gljAdjustType || _config.ADJUST_TYPE.info;
                     //承包人材料差额法表
-                    let diffGljs = materialAdjustObj.getPirceInfoDatas(tenderDetail.projectGLJ.datas.gljList);
+                    let diffGljs = materialAdjustObj.getPirceInfoDatas(tenderDetail.projectGLJ.datas.gljList,tenderDetail.contractor_list.datas);
                     if (diffGljs.length) {
                         let diffP = new DifferentiaGlj();
                         diffGljs.forEach(data => diffP.children.push(new DifferentiaGljDetail(adjustType, data)));
@@ -1152,7 +1152,7 @@ const XMLStandard = (function () {
                     let engineeringCostNode = tenderDetail.Bills.tree.roots.find(node => node.getFlag() === fixedFlag.ENGINEERINGCOST);
                     if (engineeringCostNode) {
                         let ecTotalFee = _util.getFee(engineeringCostNode.data.fees, 'common.totalFee');
-                        let exponentialGljs = materialAdjustObj.getPriceCoeDatas(tenderDetail.projectGLJ.datas.gljList, ecTotalFee);
+                        let exponentialGljs = materialAdjustObj.getPriceCoeDatas(tenderDetail.projectGLJ.datas.gljList,tenderDetail.contractor_list.datas,ecTotalFee);
                         if (exponentialGljs.length) {
                             // 变值权重B累加
                             let totalVarWeight = exponentialGljs.reduce((acc, cur) => acc += cur.varWeight || 0, 0);

+ 1 - 0
web/building_saas/main/js/models/main_consts.js

@@ -19,6 +19,7 @@ const ModuleNames = {
     installation_fee:'installation_fee',
     projectInfo: 'project_info',
     evaluate_list:'evaluate_list',
+    contractor_list:'contractor_list',
     bid_evaluation_list:'bid_evaluation_list'
 };
 

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

@@ -104,6 +104,7 @@ var PROJECT = {
             this.calcProgram = new CalcProgram(this);
             this.evaluate_list = new EvaluateList(this);
             this.bid_evaluation_list = new BidEvaluationList(this);
+            this.contractor_list = new ContractorList(this);
             this.calcBase = calcBase;
 
             // this.masterField = {ration: 'billsItemID', volumePrice: 'billsItemID'};

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

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

+ 58 - 19
web/building_saas/main/js/views/config_material_view.js

@@ -24,7 +24,7 @@ let configMaterialObj = {
             {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"]}
+        view:{ lockColumns: ["is_related","unit","totalPrice","originPlace","vender","quantity"]}
     },
     bidMaterialSetting:{
         header: [
@@ -41,7 +41,7 @@ let configMaterialObj = {
             {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"]}
+        view:{ lockColumns: ["is_related","unit","totalPrice","originPlace","vender","quantity"]}
     },
 
     evaluateRelateSetting:{
@@ -65,14 +65,16 @@ let configMaterialObj = {
     },
     initSpread:function(){
         if(!this.configSpread){
-            this.configSpread = SheetDataHelper.createNewSpread($("#config_material_sheet")[0],2);
+            this.configSpread = SheetDataHelper.createNewSpread($("#config_material_sheet")[0],4);
             sheetCommonObj.spreadDefaultStyle(this.configSpread);
-            this.relatedSpread = SheetDataHelper.createNewSpread($("#related_sheet")[0],2);
+            this.relatedSpread = SheetDataHelper.createNewSpread($("#related_sheet")[0],4);
             sheetCommonObj.spreadDefaultStyle(this.relatedSpread);
         }
         this.initEvaluateMaterialSheet();
         this.initbidMaterialSheet();
         this.initEvaluateRelateSheet();
+        materialAdjustObj.initPriceInfoSheet();
+        materialAdjustObj.initPriceCoeSheet();
         //打开别人分享的项目,只读
         if(projectReadOnly){
             disableSpread(this.configSpread);
@@ -148,6 +150,9 @@ let configMaterialObj = {
             case filterType.PBCL:
                 text = "关联评标材料";
                 break;
+            case filterType.AMAE:
+                text = "关联材料";
+                break;
         }
         $("#related_link").text(text);
     },
@@ -165,6 +170,10 @@ let configMaterialObj = {
                 datas = this.bidMaterialDatas;
                 field = "is_eval_material";
                 break;
+            case filterType.AMAE:
+                sheet = materialAdjustObj.getSheet();
+                datas = materialAdjustObj.getSheetDatas();
+                field = "is_contractor_material";
         }
 
         let sel = sheet.getSelections()[0];
@@ -181,7 +190,10 @@ let configMaterialObj = {
         let projectGLJ =  projectObj.project.projectGLJ;
         let materialIdList = projectGLJ.datas.constData.materialIdList;
         for(let d of projectGLJ.datas.gljList){
-            if (materialIdList.indexOf(d.type) >= 0 && parseFloat(d.quantity) > 0 ){//材料类型
+            if (parseFloat(d.quantity) > 0 ){//材料类型//materialIdList.indexOf(d.type) >= 0 &&
+                if(projectGljObject.displayType != filterType.AMAE){
+                    if(materialIdList.indexOf(d.type) ==-1) continue;
+                }
                 if(d[relateField] == 1 && d.id != projectGLJID) continue;//排除其它已被关联的工料机
                 if(name != ''){//name为''时不做过滤
                     if(d.name.indexOf(name)==-1){
@@ -203,7 +215,7 @@ let configMaterialObj = {
                     remark:d.remark,
                     from:d
                 };
-                t.is_related = d[relateField];
+                t.is_related = d[relateField]?1:0;
                 gljOprObj.setGLJPrice(t,d);
                 t.totalPrice = scMathUtil.roundForObj(t.quantity * t.marketPrice,getDecimal('bills.totalPrice'));
                 datas.push(t);
@@ -266,11 +278,14 @@ let configMaterialObj = {
                 quantity:e.quantity,
                 remark:e.remark,
                 originPlace:e.originPlace,//产地
+                is_evaluate:0,
                 vender:e.vender //厂家
             };
             let pglj = gljMap[e.projectGLJID];
             if(e.is_related && pglj){
+                gljOprObj.setGLJPrice(t,pglj);
                 t.quantity = pglj.quantity;
+                t.is_evaluate = pglj.is_evaluate;
             }
             t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice) ,getDecimal('bills.totalPrice'));
             datas.push(t);
@@ -323,19 +338,11 @@ let configMaterialObj = {
         let sendPriceChange = false;
         for(let t of tasks){
             if(t.type == "evaluate_list"){
-                if(t.action == "update"){
-                    let e = _.find(projectObj.project.evaluate_list.datas,{'ID':t.ID});
-                    if(e) updateProperty(e,t.doc);
-                }
-                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});
+                refreshDatas(projectObj.project.evaluate_list.datas,t);
             }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});
+                refreshDatas(projectObj.project.bid_evaluation_list.datas,t);
+            }else if(t.type == "contractor_list"){
+                refreshDatas(projectObj.project.contractor_list.datas,t);
             } else {
                 if(_.isEmpty(this.GLJIDMap)) this.GLJIDMap = _.indexBy(projectObj.project.projectGLJ.datas.gljList,'id');
                 //剩下两个类型只有更新操作
@@ -359,6 +366,17 @@ let configMaterialObj = {
         }
         this.GLJIDMap = {};
         return [gljs,sendPriceChange];
+
+        function refreshDatas(datas,t_t) {
+            if(t_t.action == "update"){
+                let e = _.find(datas,{'ID':t_t.ID});
+                if(e) updateProperty(e,t_t.doc);
+            }
+            if(t_t.action == "add") datas.push(t_t.doc);
+            if(t_t.action == "delete") _.remove(datas,{'ID':t_t.ID});
+        }
+
+
         function updateProperty(obj,doc) {
             let updatePrice = false;
             for(let k in doc){
@@ -453,6 +471,13 @@ let configMaterialObj = {
 
         if(dataCode == 'marketPrice'){
             dataCode = 'market_price';
+            if(bid.is_related){//关联的情况下,直接修改工料机价格
+                if(bid.is_evaluate == 1){
+                    alert("当前材料市场价已被锁定,修改请先返回人材机汇总界面解除锁定。");
+                    return me.showBidMaterialDatas();
+                }
+                return projectObj.project.projectGLJ.updatePrice(bid,dataCode,value,'rg', projectGljObject.refreshViewsData);
+            }
             value =  scMathUtil.roundToString(value,getDecimal('glj.unitPrice'));
         }
         if(dataCode === 'quantity'){//修改数量需做4舍5入
@@ -510,6 +535,11 @@ let configMaterialObj = {
                 field = "is_eval_material";
                 type="bid_evaluation_list";
                 break;
+            case filterType.AMAE:
+                sheet = materialAdjustObj.getSheet();
+                datas = materialAdjustObj.getSheetDatas();
+                field = "is_contractor_material";
+                type = "contractor_list";
         }
 
         let sel = sheet.getSelections()[0];
@@ -564,6 +594,11 @@ let configMaterialObj = {
                 field = "is_eval_material";
                 type="bid_evaluation_list";
                 break;
+            case  filterType.AMAE:
+                let t_datas = materialAdjustObj.getSheetDatas();
+                evaluate = t_datas[row];
+                field = "is_contractor_material";
+                type="contractor_list";
         }
         if(evaluate){
             task.push({type:type,action:"delete",ID:evaluate.ID});
@@ -618,7 +653,11 @@ let configMaterialObj = {
                         return false;
                     },
                     callback: function (key, opt) {
-                        $("#selectPGLJ").modal('show');
+                        if(projectGljObject.displayType == filterType.AMAE){
+                            $("#selectFromGLJ").modal('show');
+                        }else {
+                            $("#selectPGLJ").modal('show');
+                        }
                     }
                 },
                 "deleteAdjust": {

+ 189 - 136
web/building_saas/main/js/views/material_adjust_view.js

@@ -9,24 +9,24 @@ let materialAdjustObj = {
     priceCoeDatas:[],
     priceInfoSetting:{
         header: [
+            {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
             {headerName: "编号", headerWidth: 80, dataCode: "code", dataType: "String"},
             {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",decimalField:'glj.quantity'},
-            {headerName: "风险系数%", headerWidth: 60, dataCode: "riskCoe", hAlign: "right", dataType: "Number",validator:"number"},
+            {headerName: "风险系数%", headerWidth: 80, dataCode: "riskCoe", hAlign: "right", dataType: "Number",validator:"number"},
             {headerName: "基准单价", headerWidth: 70, dataCode: "standardPrice", hAlign: "right", dataType: "Number",validator:"number"},
             {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"},
-            {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"},
             {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
             {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
         ],
-        view:{ lockColumns: ["code","name","specs","unit","quantity","totalPrice","originPlace","vender","supply","remark"]}
+        view:{ lockColumns: ["is_related","quantity","totalPrice","originPlace","vender","supply"]}
     },
     priceCoeSetting:{
         header: [
+            {headerName: "关联", headerWidth: 80, dataCode: "is_related", dataType: "String",cellType:'checkBox'},
             {headerName: "编号", headerWidth: 80, dataCode: "code", dataType: "String"},
             {headerName: "材料名称", headerWidth: 160, dataCode: "name", dataType: "String",cellType:'tipsCell'},
             {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String",cellType:'tipsCell'},
@@ -37,12 +37,10 @@ let materialAdjustObj = {
             {headerName: "数量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "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"},
-            {headerName: "厂家", headerWidth: 80, dataCode: "vender", hAlign: "left", dataType: "String"},
             {headerName: "供货方式", headerWidth: 70, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
             {headerName: "备注", headerWidth: 100, dataCode: "remark", hAlign: "left", dataType: "String"}
         ],
-        view:{ lockColumns: ["code","name","specs","unit","quantity","totalPrice","originPlace","varWeight","vender","supply","remark"]}
+        view:{ lockColumns: ["is_related","quantity","totalPrice","originPlace","varWeight","vender","supply"]}
     },
     refreshSheetDatas:function () {
         //读项目属性的值,若没有则默认为造价信息差额调整法
@@ -52,39 +50,42 @@ let materialAdjustObj = {
         } else {
             materialAdjustObj.showPriceCoeDatas();
         }
-        //let sheetIndex = $("#adjustType").val()
+        configMaterialObj.showEvaluateRelateDatas();
     },
-    initSpread:function () {
-        if(!this.spread){
-            this.spread = SheetDataHelper.createNewSpread($("#material_adjust_sheet")[0],2);
-            sheetCommonObj.spreadDefaultStyle(this.spread);
-        }
-        this.initPriceInfoSheet();
-        this.initPriceCoeSheet();
-        //disableRightMenu("project_glj_sheet",this.projectGljSpread,this.rightClickCallback);
-        //打开别人分享的项目,只读
-        if(projectReadOnly){
-            disableSpread(this.spread);
-        }else {
-            this.initRightClick();
-        }
+    getSheetDatas:function () {
+        let adjustType = $('#adjustType').val();
+        return adjustType === 'priceInfo' ? this.priceInfoDatas : this.priceCoeDatas;
+    },
+    getSheet:function () {
+        let adjustType = $('#adjustType').val();
+        return adjustType === 'priceInfo' ? this.priceInfoSheet : this.priceCoeSheet;
     },
     initPriceInfoSheet:function () {
-        this.priceInfoSheet = this.spread.getSheet(0);
+        this.priceInfoSheet = configMaterialObj.configSpread.getSheet(2);
         sheetCommonObj.initSheet(this.priceInfoSheet,this.priceInfoSetting,30);
         this.priceInfoSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
-        this.priceInfoSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
+        this.priceInfoSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onSelectionChange);
+       // this.priceInfoSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
         this.priceInfoSheet.name('priceInfoSheet');
         this.priceInfoSheet.setRowHeight(0, 36, 1);
     },
     initPriceCoeSheet:function () {
-        this.priceCoeSheet = this.spread.getSheet(1);
+        this.priceCoeSheet = configMaterialObj.configSpread.getSheet(3);
         sheetCommonObj.initSheet(this.priceCoeSheet,this.priceCoeSetting,30);
         this.priceCoeSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSheetValueChange);
-        this.priceCoeSheet.bind(GC.Spread.Sheets.Events.RangeChanged, this.onSheetRangeChange);
+        this.priceCoeSheet.bind(GC.Spread.Sheets.Events.SelectionChanged,this.onSelectionChange);
         this.priceCoeSheet.name('priceCoeSheet');
         this.priceCoeSheet.setRowHeight(0, 36, 1);
     },
+    onSelectionChange:function (sender, args) {
+        let me = configMaterialObj;
+        let newSel = args.newSelections[0];
+        let oldSel = args.oldSelections?args.oldSelections[0]:{};
+        if(newSel.row != oldSel.row){
+            me.showEvaluateRelateDatas();
+            me.relateFilterAgain = false;
+        }
+    },
     onSheetRangeChange:function (a,args) {
         let me = materialAdjustObj,updateMap = {};
         let projectGLJ = projectObj.project.projectGLJ;
@@ -119,33 +120,30 @@ let materialAdjustObj = {
 
     onSheetValueChange:function (a,args) {
         let me = materialAdjustObj,row = args.row, col = args.col;
-        let projectGLJ = projectObj.project.projectGLJ;
         let setting = $("#adjustType").val() == "priceInfo"?me.priceInfoSetting:me.priceCoeSetting;
         let datas = $("#adjustType").val() == "priceInfo"?me.priceInfoDatas:me.priceCoeDatas;
         let dataCode = setting.header[col].dataCode;
-        let recode = datas[row];
+        let evaluate = datas[row];
         let value = args.newValue;
-        if(value === undefined ){
-            me.refreshSheetDatas();
-            return;
-        }
-        if (value&&!projectGljObject.checkData(col,setting,value)) {
+
+        if (value&&! sheetCommonObj.checkData(col,setting,value)) {
             alert('输入的数据类型不对,请重新输入!');
-            me.refreshSheetDatas();
-            return ;
+            return me.refreshSheetDatas();
         }
-        if(recode[dataCode] == value) return;
-
-        if(dataCode=='marketPrice'){//修改市场价和修改定额价时需要重新记算很多受影响的树节点,现在改成与定字额工料机那里调相同的方法。
-            let editField ="market_price";
-            projectGLJ.updatePrice(recode,editField,value,'pg',me.refreshSheetDatas);
-            return;
+        if(dataCode == 'marketPrice'){
+            dataCode = 'market_price';
+            if(evaluate.is_evaluate == 1){
+                alert("当前材料市场价已被锁定,修改请先返回人材机汇总界面解除锁定。");
+                return me.refreshSheetDatas();
+            }
+            if(evaluate.is_related){//关联的情况下,直接修改工料机价格
+                return projectObj.project.projectGLJ.updatePrice(evaluate,dataCode,value,'rg', projectGljObject.refreshViewsData);
+            }
         }
-        if(value) value = scMathUtil.roundForObj(value,getDecimal("process"));
-        if(value == null) value="";
-        let updateData = {id: recode.id, field: dataCode, value: value+""};
-        projectGLJ.pGljUpdate(updateData,me.refreshSheetDatas);
-
+        let edata = {type:'contractor_list',doc:{},action:"update",ID:evaluate.ID};
+        if(evaluate[dataCode] == value) return me.refreshSheetDatas();
+        edata.doc[dataCode] = value;
+        configMaterialObj.updateEvaluateMaterial([edata],false);
     },
     deleteAdjust:function () {
         let me = this,updateMap={};
@@ -163,96 +161,97 @@ let materialAdjustObj = {
 
     },
     showPriceInfoDatas:function () {
-        this.spread.setActiveSheetIndex(0);
+        configMaterialObj.configSpread.setActiveSheetIndex(2);
         this.priceInfoDatas = this.getPirceInfoDatas();
         sheetCommonObj.showData(this.priceInfoSheet, this.priceInfoSetting,this.priceInfoDatas);
         this.priceInfoSheet.setRowCount(this.priceInfoDatas.length);
     },
     showPriceCoeDatas:function () {
-        this.spread.setActiveSheetIndex(1);
+        configMaterialObj.configSpread.setActiveSheetIndex(3);
         this.priceCoeDatas = this.getPriceCoeDatas();
         sheetCommonObj.showData(this.priceCoeSheet, this.priceCoeSetting,this.priceCoeDatas);
         this.priceCoeSheet.setRowCount(this.priceCoeDatas.length);
     },
-    getPirceInfoDatas:function(projectGLJList){
+    getPirceInfoDatas:function(projectGLJList,contractor_list){
         let datas = [];
-        let gljList = this.filterAdjustGlj(projectGLJList, 'is_info_adjust');
-        gljList = sortProjectGLJ(gljList);
-        for(let glj of gljList){
-            datas.push(getInfoObject(glj));
-        }
-        return datas;
-        function getInfoObject(glj) {
-            let data = materialAdjustObj.getCommonObject(glj);
-            data.riskCoe = glj.riskCoe;
-            data.standardPrice = glj.standardPrice;
-            data.totalPrice = materialAdjustObj.getTotalPrice(data);
-            return data;
+        let pgljList =   projectGLJList?projectGLJList:projectObj.project.projectGLJ.datas.gljList;
+        let contractorList = contractor_list?contractor_list:projectObj.project.contractor_list.datas;
+        let gljMap = _.indexBy(pgljList,'id');
+        for(let e of contractorList){
+            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,
+                supply:e.supply,
+                riskCoe : e.riskCoe,
+                is_evaluate:0,
+                standardPrice : e.standardPrice
+            };
+            let pglj = gljMap[e.projectGLJID];
+            if(e.is_related && pglj){
+                gljOprObj.setGLJPrice(t,pglj);
+                t.vender = pglj.vender;
+                t.supply = pglj.supply;
+                t.is_evaluate = pglj.is_evaluate;
+                t.quantity = pglj.quantity;
+            }
+            t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice) ,getDecimal('bills.totalPrice'));
+            datas.push(t);
         }
+        return _.sortByAll(datas,'code');
     },
-    filterAdjustGlj:function (projectGLJList, field) {
-        let gljList = projectGLJList?projectGLJList:projectObj.project.projectGLJ.datas.gljList;
-        return _.filter(gljList,function (item) {
-            return item.quantity !== 0 && item.quantity !== '0' && item[field] ===1
-        });
-    },
-    getPriceCoeDatas:function (projectGLJList,totalFee) {
+    getPriceCoeDatas:function (projectGLJList,contractor_list,totalFee) {
         let datas = [];
+        let pgljList =   projectGLJList?projectGLJList:projectObj.project.projectGLJ.datas.gljList;
+        let contractorList = contractor_list?contractor_list:projectObj.project.contractor_list.datas;
+        let gljMap = _.indexBy(pgljList,'id');
         if(!gljUtil.isDef(totalFee)){
             let node =  projectObj.project.Bills.getEngineeringCostNode(projectObj.mainController);
             totalFee = node && node.data.feesIndex && node.data.feesIndex.common?node.data.feesIndex.common.totalFee:0;
         }
-        let gljList = this.filterAdjustGlj(projectGLJList, 'is_coe_adjust');
-         gljList = sortProjectGLJ(gljList);
-        for(let glj of gljList){
-            datas.push(getCoeObject(glj,totalFee));
-        }
-        return datas;
-        function getCoeObject(glj,totalFee) {
-            let data = materialAdjustObj.getCommonObject(glj);
-            data.FO = glj.FO;
-            data.FI = glj.FI;
-            data.totalPrice = materialAdjustObj.getTotalPrice(data);
-            if(totalFee !==0) data.varWeight = scMathUtil.roundForObj(data.totalPrice/totalFee,2);
-            return data;
-        }
-    },
-    getTotalPrice:function (data) {
-        return scMathUtil.roundForObj(data.quantity * data.marketPrice,getDecimal("bills.totalPrice"))
-    },
-    initRightClick : function() {
-        let me = this;
-        $.contextMenu({
-            selector: '#material_adjust_sheet',
-            build: function ($trigger, e) {
-                me.rightClickTarget = SheetDataHelper.safeRightClickSelection($trigger, e, me.spread);
-                return me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.viewport ||
-                    me.rightClickTarget.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
-            },
-            items: {
-                "addFromGLJ":{
-                    name: '从人材机汇总中选择',
-                    icon: 'fa-sign-in',
-                    disabled: function () {
-                        return false;
-                    },
-                    callback: function (key, opt) {
-                        $("#selectFromGLJ").modal('show');
-                    }
-                },
-                "deleteAdjust": {
-                    name: "删除",
-                    icon: 'fa-trash-o',
-                    disabled: function () {
-                        return me.rightClickTarget.row === undefined;
-                    },
-                    callback: function (key, opt) {
-                        let row = me.rightClickTarget.row;
-                        me.deleteAdjust();
-                    }
-                }
+        for(let e of contractorList){
+            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,
+                supply:e.supply,
+                is_evaluate:0,
+                FO : e.FO,
+                FI : e.FI
+            };
+            let pglj = gljMap[e.projectGLJID];
+            if(e.is_related && pglj){
+                gljOprObj.setGLJPrice(t,pglj);
+                t.vender = pglj.vender;
+                t.supply = pglj.supply;
+                t.quantity = pglj.quantity;
+                t.is_evaluate = pglj.is_evaluate;
             }
-        });
+            t.totalPrice = scMathUtil.roundForObj(parseFloat(t.quantity) * parseFloat(t.marketPrice) ,getDecimal('bills.totalPrice'));
+            if(totalFee !==0) t.varWeight = scMathUtil.roundForObj(t.totalPrice/totalFee,2);
+            datas.push(t);
+        }
+        return _.sortByAll(datas,'code');
     },
     getCommonObject:function (glj) {
         let data ={
@@ -336,14 +335,13 @@ let gljFromObj={
         this.refreshDatas();
     },
     filterGLJ:function (gljList) {
-        let field =  $("#adjustType").val() == "priceInfo"?"is_info_adjust":"is_coe_adjust";
         let typeMap = {};
         for(let ch of $(".glj_sel_input:checked")){
             typeMap[$(ch).val()] = true;
         }
         let inputV = $("#glj_sel_input").val();
         return _.filter(gljList,function (item) {
-            if(item.quantity === 0 || item.quantity === '0' || item[field] ===1) return false;
+            if(item.quantity === 0 || item.quantity === '0') return false;
             if(!typeMap[0]){//如果没有勾选所有,下面再细分
                 let firstS = (item.type+"").substring(0,1);
                 if(!typeMap[firstS]) return false
@@ -367,6 +365,8 @@ let gljFromObj={
         data.short_name = projectGLJ.getShortNameByID(glj.type);
         // 只有材料才显示是否暂估
         if (materialIdList.indexOf(glj.type) >= 0) data.is_evaluate = glj.is_evaluate;
+        data.from = glj;
+        data.is_contractor_material = glj.is_contractor_material;
         return data;
     },
     checkByType:function (type) {
@@ -383,30 +383,83 @@ let gljFromObj={
                     if(d.type == 5) d.select = 1;
                     break;
                 case "取消":
-                    d.select = 0;
+                    d.select = d.is_contractor_material?1:0;
                     break;
             }
         }
-        //this.refreshDatas();
     },
     confirmSelect:function () {
-        let updateMap = {};
-        let adjustType =  $("#adjustType").val()
+        let tasks = [];
+        let datas = projectObj.project.contractor_list.datas,modelType= 'contractor_list',field= 'is_contractor_material';
+        let evaluateMap = _.indexBy(datas,"projectGLJID");
+        let evaluateKeyMap = {};//关键字映射表
+        for(let e of datas){
+            let eIndex = gljUtil.getIndex(e);
+            evaluateKeyMap[eIndex] = e;
+        }
         for(let d of this.datas){
-            if(d.select == 1){
-                let tem = {is_info_adjust:1,riskCoe:"",standardPrice:d.marketPrice+"",is_coe_adjust:1,FI:"",FO:""};//现在改成添加的话,两个页面都添加,删除两个页面都删除
-             /*   if(adjustType== "priceInfo"){
-                    tem = {is_info_adjust:1,riskCoe:"",standardPrice:d.marketPrice+""};
-                }else {
-                    tem = {is_coe_adjust:1,FI:"",FO:""};
-                }*/
-                updateMap[d.id] = tem;
+            if(d.select == 1){//如果是选中状态
+                if(d[field] == 1) {//如果已经标记为承包人材料
+                    let evl = evaluateMap[d.id];
+                    if(evl){
+                        //这里应该是错误检查的保证,按正常是不应该出现这种情况的
+                        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,modelType))
+                    }
+                }else {//如果不是暂估,要改成暂估
+                    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:modelType,doc:{projectGLJID:d.id,is_related:1},action:"update",ID:evaluate.ID};
+                        tasks.push(edata);
+                    }else {//如果不存在,则生成一条新的
+                        tasks.push(getNewEval(d,modelType));
+                    }
+                }
+            }else {//未选中状态的,检查一下是否存在关联的情况,取消关联
+                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: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:modelType,doc:{is_related:0},action:"update",ID:evaluate.ID});
+                }
             }
         }
-        if( _.isEmpty(updateMap)) return;
-        projectObj.project.projectGLJ.batchUpdateGLJProperty(updateMap,function () {
-            materialAdjustObj.refreshSheetDatas();
-        });
+        if(tasks.length > 0) configMaterialObj.updateEvaluateMaterial(tasks);
+
+
+        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['seq'] = d.code;
+            ndata.doc['projectID'] = d.from.project_id;
+            ndata.doc['code'] = d.code;
+            ndata.doc['name'] = d.name;
+            ndata.doc['specs'] = d.specs;
+            ndata.doc['unit'] = d.unit;
+            ndata.doc['quantity'] = d.quantity;
+            ndata.doc['type'] = d.type;
+            ndata.doc['market_price'] = d.from.unit_price.market_price;
+            ndata.doc['originPlace'] = d.originPlace;
+            ndata.doc['vender'] = d.vender;
+            ndata.doc['remark'] = d.remark;
+            ndata.doc['supply'] = d.supply;
+            ndata.doc['riskCoe'] = "";
+            ndata.doc['standardPrice'] = "";
+            ndata.doc['FO'] = "";
+            ndata.doc['FI'] = "";
+            return ndata;
+        }
     }
 };
 

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

@@ -52,7 +52,7 @@ let projectGljObject={
     ],
     initSpreads:function(){
         if(this.projectGljSpread==null) this.initProjectGljSpread();
-        if(materialAdjustObj.spread == null) materialAdjustObj.initSpread();
+        //if(materialAdjustObj.spread == null) materialAdjustObj.initSpread();
         if(configMaterialObj.configSpread == null) configMaterialObj.initSpread();
     },
     initProjectGljSpread:function () {
@@ -521,17 +521,23 @@ let projectGljObject={
     },
     initSheetViews:function(){
         let me = projectGljObject;
-        if(me.displayType == filterType.AMAE){
+      /*  if(me.displayType == filterType.AMAE){
             $('#material_adjust').show();
             $('#adjustType').show();
             let adjustType = projectObj.project.projectInfo.property.gljAdjustType || 'priceInfo';
             $('#adjustType').val(adjustType);
             $('#project-glj-main').hide();
             $('#config_material').hide();
-        }else if(me.displayType == filterType.ZGCL || me.displayType == filterType.PBCL){
+        }else*/
+      if(me.displayType == filterType.AMAE || me.displayType == filterType.ZGCL || me.displayType == filterType.PBCL){
+            $('#adjustType').hide();
+            if(me.displayType == filterType.AMAE){
+                let adjustType = projectObj.project.projectInfo.property.gljAdjustType || 'priceInfo';
+                $('#adjustType').val(adjustType);
+                $('#adjustType').show();
+            }
             configMaterialObj.setNavLinkText(me.displayType);
             $('#material_adjust').hide();
-            $('#adjustType').hide();
             $('#project-glj-main').hide();
             $('#config_material').show();
         } else {