Browse Source

Merge branch 'master' of http://192.168.1.12:3000/SmartCost/ConstructionCost

TonyKang 7 years ago
parent
commit
afc215db0e

+ 0 - 22
modules/all_models/bills_template.js

@@ -1,22 +0,0 @@
-/**
- * Created by zhang on 2018/3/22.
- */
-
-var mongoose = require('mongoose');
-var Schema = mongoose.Schema;
-var deleteSchema = require('../all_schemas/delete_schema');
-var BillsTemplateSchema = new Schema({
-    ID: Number,
-    ParentID: Number,
-    NextSiblingID: Number,
-    code: String,
-    name: String,
-    unit: String,
-    deleteInfo: deleteSchema,
-    tempType: Number,
-    //计算基数
-    calcBase: String,
-    //费率ID
-    feeRateID:Number
-});
-//mongoose.model('temp_bills', BillsTemplateSchema);  之后删除

+ 41 - 0
modules/all_models/bills_template_items.js

@@ -0,0 +1,41 @@
+/**
+ * Created by zhang on 2018/7/13.
+ */
+import mongoose from "mongoose";
+let Schema = mongoose.Schema;
+
+let collectionName = 'std_bills_template_items';
+
+// 标记字段
+let flagsSchema = new Schema({
+    fieldName: String,
+    flag: Number
+});
+let BillsTemplateSchema = {
+    // 树结构所需ID
+    ID: Number,
+    ParentID: Number,
+    NextSiblingID: Number,
+    // 编号
+    code: String,
+    // 名称
+    name: String,
+    // 单位
+    unit: String,
+    // 类别
+    type: Number,
+    // 标记
+    flags:{
+        type: [flagsSchema],
+        default: []
+    },
+    // 所属模板库ID
+    libID: {type:String,index:true},
+    //计算基数
+    calcBase: String,
+    //费率ID
+    feeRateID:Number
+};
+
+mongoose.model(collectionName, new Schema(BillsTemplateSchema, {versionKey: false, collection: collectionName}));
+

+ 2 - 22
modules/all_models/compilation.js

@@ -9,23 +9,14 @@ import mongoose from "mongoose";
 
 let Schema = mongoose.Schema;
 let collectionName = 'compilation';
-let engineeringListSchema = new Schema({
-    // 工程专业id
-    engineering: {
-        type: Number
-    },
-    engineering_id: {
-        type: Schema.Types.Mixed,
-        default: []
-    }
-}, {_id: false});
+
 let childrenSchema = new Schema({
     id:String,
     // 计价名称
     name: String,
     // 工程专业列表
     engineering_list: {
-        type: [engineeringListSchema],
+        type: Schema.Types.Mixed,
         default: []
     },
     // 是否启用
@@ -36,17 +27,6 @@ let childrenSchema = new Schema({
     // 类型
     type: {
         type: Number
-    },
-    // 列设置
-    main_tree_col: {
-        type: Schema.Types.Mixed,
-        default: {
-            "emptyRows":3,
-            "headRows":0,
-            "treeCol": 0,
-            "headRowHeight":[],
-            "cols":[]
-        }
     }
 },{_id: false});
 let modelSchema = {

+ 30 - 10
modules/all_models/engineering_lib.js

@@ -9,6 +9,13 @@ import mongoose from "mongoose";
 
 let Schema = mongoose.Schema;
 let collectionName = 'engineering_lib';
+let taxGroupSchema = new  Schema({
+    taxType: String,//计税方式
+    program_lib: { type: Schema.Types.Mixed,default:{}},// 计算程序标准库
+    template_lib:{ type: Schema.Types.Mixed,default:{}},//清单模板库
+    col_lib:{ type: Schema.Types.Mixed,default:{}}
+},{_id: false});
+
 let modelSchema = {
     // 标准清单
     bill_lib: {
@@ -25,26 +32,39 @@ let modelSchema = {
         type: Schema.Types.Mixed,
         default: []
     },
-    // 列设置
-    main_tree_col: {
+    //清单指引库
+    billsGuidance_lib: {
         type: Schema.Types.Mixed,
-        default: {
-            "emptyRows":3,
-            "headRows":0,
-            "treeCol": 0,
-            "headRowHeight":[],
-            "cols":[]
-        }
+        default: []
+    },
+    tax_group :{
+        type: [taxGroupSchema],
+        default: []
     },
     // 费率标准库
     fee_lib: {
         type: Schema.Types.Mixed,
         default: []
     },
+    // 人工系数标准库
+    artificial_lib: {
+        type: Schema.Types.Mixed,
+        default: []
+    },
     //设置人材机显示列
     glj_col:{
         showAdjustPrice:Boolean//是否显示调整价列
-    }
+    },
+    //清单或定额计价规则ID
+    valuationID:{type:String,index: true},
+    //工程专业名称
+    name:String,
+    //前端是否显示
+    visible:{
+        type: Boolean,
+        default: false
+    },
+    engineering:Number
 };
 mongoose.model(collectionName, new Schema(modelSchema, {versionKey: false, collection: collectionName}));
 

+ 31 - 0
modules/all_models/main_col_lib.js

@@ -0,0 +1,31 @@
+/**
+ * Created by zhang on 2018/7/14.
+ */
+
+//列设置库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const main_col_lib = new Schema({
+        ID:{type:String,index:true},
+            main_tree_col: {
+                type: Schema.Types.Mixed,
+                default: {
+                    emptyRows: 3,
+                    headRows: 0,
+                    treeCol: 0,
+                    headRowHeight: [],
+                    cols:[]
+                }
+            },
+        creator: String,
+        createDate: Number,
+        recentOpr: [oprSchema],
+        name: String,
+        compilationId: String,
+        compilationName: String,
+        deleted: Boolean
+    }, {versionKey: false}
+);
+
+mongoose.model("std_main_col_lib", main_col_lib,"std_main_col_lib");

+ 5 - 5
modules/pm/controllers/new_proj_controller.js

@@ -7,6 +7,8 @@ let projCounter = require('../../main/models/proj_counter_model');
 let projSetting = require('../../main/models/proj_setting_model');
 let async = require('async');
 const uuidV1 = require('uuid/v1');
+const mongoose = require('mongoose');
+let mainColLibModel = mongoose.model('std_main_col_lib');
 
 import BillsTemplateModel from "../models/templates/bills_template_model";
 import EngineeringLibModel from "../../users/models/engineering_lib_model";
@@ -17,7 +19,7 @@ module.exports = {
             async function (cb) {
                 // 获取清单模板数据
                 let billsTemplateModel = new BillsTemplateModel();
-                let templateData = JSON.stringify(await billsTemplateModel.getTemplateDataForNewProj(property.valuation, property.engineering));
+                let templateData = JSON.stringify(await billsTemplateModel.getTemplateDataForNewProj(property.templateLibID));
                 let billsDatas = JSON.parse(templateData);
                 let uuidMaping = Object.create(null);
                 uuidMaping['-1'] = -1;
@@ -33,13 +35,11 @@ module.exports = {
                 });
                 billsData.insertData(billsDatas, callback);
             },
-           /* function (cb) {//这个计数器换了
-                projCounter.insertData({"projectID": newProjID}, cb);//这个计数器没什么用了
-            },*/
             async function (cb) {
                 let engineeringModel = new EngineeringLibModel();
                 let engineering = await engineeringModel.getEngineering(property.engineering_id);
-                projSetting.insertData({"projectID": newProjID, main_tree_col: engineering.main_tree_col,glj_col:engineering.glj_col}, cb);
+                let mainTreeCol = await mainColLibModel.findOne({'ID':property.colLibID});
+                projSetting.insertData({"projectID": newProjID, main_tree_col: mainTreeCol.main_tree_col,glj_col:engineering.glj_col}, cb);
             }
         ], (err) => callback(err));
     }

+ 20 - 5
modules/pm/models/project_model.js

@@ -26,6 +26,7 @@ let calcProgramFacade = require('../../main/facade/calc_program_facade');
 let installationFacade = require('../../main/facade/installation_facade');
 let logger = require("../../../logs/log_helper").logger;
 let BillsModel = require("../../main/models/bills").model;
+let _ = require('lodash');
 
 let Projects = mongoose.model('projects');
 let projectType = {
@@ -160,6 +161,7 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                     //工料机单价调整系数
                     data.updateData.property.tenderSetting = tenderSetting;
                 }
+
                 newProject = new Projects(data.updateData);
                 // 查找同级是否存在同名数据
                 let exist = await this.isExist(userId, compilationId, data.updateData.name, data.updateData.ParentID);
@@ -236,7 +238,24 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                         }
                     }
                     else if (data.updateData.projType === projectType.tender) {//fake
-                        await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
+                        let delTender = await Projects.findOne({userID: userId, ID: data.updateData.ID});
+                        //如果这个单位工程用到的费率文件、单价文件,没有被其他的单位工程使用,则应该一起跟随删除
+                        if(delTender){
+                            let unitPriceFile = delTender.property.unitPriceFile;
+                            let feeRateFile = delTender.property.feeFile;
+                            let usedUFTenders = await Projects.find(
+                                {userID: userId, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'property.unitPriceFile.id': unitPriceFile.id});
+                            if(usedUFTenders.length === 1){
+                                await UnitPriceFiles.update({id: unitPriceFile.id}, {$set: {deleteInfo: deleteInfo}});
+                            }
+                            let usedFRTenders = await Projects.find(
+                                {userID: userId, $or: [{deleteInfo: null}, {'deleteInfo.deleted': false}], 'property.feeFile.id': feeRateFile.id});
+                            if(usedFRTenders.length === 1){
+                                await FeeRateFiles.update({ID: feeRateFile.id}, {$set: {deleteInfo: deleteInfo}});
+                            }
+                            await Projects.update({userID: userId, ID: data.updateData.ID}, data.updateData, updateAll);
+                        }
+
                     }
                     else if (data.updateData.projType === projectType.folder) {//true
                         await Projects.remove({userID: userId, ID: data.updateData.ID}, updateAll);
@@ -281,10 +300,6 @@ ProjectsDAO.prototype.udpateUserFiles = async function (userId, datas, callback)
             else if (data.updateType === updateType.delete && data.fileType === fileType.unitPriceFile) {
                 data.updateData.deleteInfo = deleteInfo;
                 await UnitPriceFiles.update({user_id: userId, id: parseInt(data.updateData.id)}, data.updateData);
-                await Projects.update({
-                    userID: userId,
-                    'property.feeFile.id': data.updateData.id
-                }, {$set: {'property.feeFile.name': data.updateData.name}});
             }
             else if (data.updateType === updateType.delete && data.fileType === fileType.feeRateFile) {
                 data.updateData.deleteInfo = deleteInfo;

+ 7 - 8
modules/pm/models/templates/bills_template_model.js

@@ -4,7 +4,7 @@
  */
 import BaseModel from "../../../common/base/base_model";
 const mongoose = require('mongoose');
-const BillsTemplateSchema = mongoose.model('temp_bills');
+const BillsTemplateSchema = mongoose.model('std_bills_template_items');
 
 class BillsTemplateModel extends BaseModel {
     /**
@@ -19,12 +19,11 @@ class BillsTemplateModel extends BaseModel {
     }
 
     /**
-     * 获取计价类别对应的清单模板
-     * @param valuationId
-     * @param engineering
+     * 获取模板库对应的清单模板
+     * @param libID
      * @returns {*}
      */
-    async getTemplateData (valuationId, engineering) {
+    async getTemplateData (libID) {
         // 筛选字段
         let field = {_id: 1, valuationId: 1, ID: 1, ParentID: 1, NextSiblingID: 1, code: 1, name: 1, unit: 1, flags: 1, calcBase: 1};
         let data = await this.findDataByCondition({valuationId: valuationId, engineering: engineering}, field, false);
@@ -33,15 +32,15 @@ class BillsTemplateModel extends BaseModel {
     }
 
     /**
-     * 新建项目时,获取计价类别对应的清单模板
+     * 新建项目时,获取模板库对应的清单模板
      * @param valuationId
      * @param engineering
      * @returns {*}
      */
-    async getTemplateDataForNewProj (valuationId, engineering) {
+    async getTemplateDataForNewProj (libID) {
         // 筛选字段
         let field = {_id: 0, ID: 1, ParentID: 1, NextSiblingID: 1, code: 1, name: 1, unit: 1, flags: 1,type:1, calcBase: 1,feeRateID:1};
-        let data = await this.findDataByCondition({valuationId: valuationId, engineering: engineering}, field, false);
+        let data = await this.findDataByCondition({libID: libID}, field, false);
 
         return data === null ? [] : data;
     }

+ 1 - 1
modules/users/models/compilation_model.js

@@ -43,7 +43,7 @@ class CompilationModel extends BaseModel {
     async getCompilationById(id) {
         let condition = {_id: id, is_release: true};
         let compilationData = await this.findDataByCondition(condition);
-        if (compilationData.bill_valuation === undefined) {
+        if (!compilationData  || compilationData.bill_valuation === undefined) {
             return compilationData;
         }
 

+ 19 - 36
modules/users/models/engineering_lib_model.js

@@ -30,44 +30,33 @@ class EngineeringLibModel extends BaseModel {
         if (data.length <= 0) {
             return data;
         }
-
-        let engineeringTemp = {};
-        let engineeringLibIdList = [];
+        let valuationIDs = [];
         // 整理出数据库需要查找的id,一次查找
         for(let valuation of data) {
             if (valuation === null) {
                 continue;
             }
-            for(let engineering of valuation.engineering_list) {
-                if (engineeringTemp[valuation.id] === undefined) {
-                    engineeringTemp[valuation.id] = [engineering.engineering_id];
-                }else {
-                    engineeringTemp[valuation.id].push(engineering.engineering_id);
-                }
-                engineeringLibIdList.push(engineering.engineering_id);
+            if(valuation.id){
+                valuationIDs.push(valuation.id);
             }
         }
 
-
         // 查找对应的id数据
-        let condition = {_id: {"$in": engineeringLibIdList}};
-        let engineeringLibList = await this.findDataByCondition(condition, null, false, '_id');
-
+        let condition = {visible:true,valuationID: {"$in": valuationIDs}};
+        let engineeringLibList = await this.findDataByCondition(condition,null,false);
+        engineeringLibList = JSON.parse(JSON.stringify(engineeringLibList));
         // 组合计价规则id对应专业工程标准库数据
         let engineeringLib = {};
-        for(let index in engineeringTemp) {
-            if (engineeringTemp[index].length <= 0) {
-                continue;
-            }
-            for(let libId of engineeringTemp[index]) {
-                if (engineeringLibList[libId] === undefined) {
-                    continue;
-                }
-                if (engineeringLib[index] === undefined) {
-                    engineeringLib[index] = [engineeringLibList[libId] ];
-                }else {
-                    engineeringLib[index].push(engineeringLibList[libId] );
-                }
+        for(let engineering of engineeringLibList){
+            let tem = {//做一下转换,和原来的结构一致
+                engineering_id:engineering._id.toString(),
+                engineering:engineering.engineering,
+                lib:engineering
+            };
+            if(engineeringLib[engineering.valuationID] === undefined){
+                engineeringLib[engineering.valuationID] = [tem];
+            }else {
+                engineeringLib[engineering.valuationID].push(tem);
             }
         }
 
@@ -78,15 +67,9 @@ class EngineeringLibModel extends BaseModel {
             if (valuation === null) {
                 continue;
             }
-            for(let engineering of valuation.engineering_list) {
-                if (engineering === null || engineeringLib[valuation.id] === undefined) {
-                    continue;
-                }
-                for (let tmp of engineeringLib[valuation.id]) {
-                    if (tmp._id.toString() === engineering.engineering_id.toString()) {
-                        engineering.lib = tmp;
-                    }
-                }
+            valuation.engineering_list = [];
+            if(engineeringLib[valuation.id]){
+                valuation.engineering_list = engineeringLib[valuation.id]
             }
         }
         return valuationData;

+ 4 - 0
public/web/sheet/sheet_data_helper.js

@@ -148,6 +148,9 @@ var SheetDataHelper = {
             if(tag !== undefined && tag){
                 text = tag;
             }
+            if(sheet && sheet.getParent().qo){
+                setting.pos = SheetDataHelper.getObjPos(sheet.getParent().qo);
+            }
             if (setting.pos && text && text !== '') {
                 if (!this._toolTipElement) {
                     let div = $('#autoTip')[0];
@@ -177,6 +180,7 @@ var SheetDataHelper = {
             }
         };
         TipCellType.prototype.processMouseLeave = function (hininfo) {
+            TREE_SHEET_HELPER.tipDiv = 'hide';
             if (this._toolTipElement) {
                 $(this._toolTipElement).hide();
                 this._toolTipElement = null;

+ 20 - 1
public/web/tree_sheet/tree_sheet_helper.js

@@ -20,6 +20,9 @@ var TREE_SHEET_HELPER = {
      * @param obj
      * @param setting
      */
+    /*initSetting: function (obj, setting) {
+        setting.pos = this.getObjPos(obj);
+    },*/
     initSetting: function (obj, setting) {
         setting.pos = this.getObjPos(obj);
     },
@@ -404,7 +407,23 @@ var TREE_SHEET_HELPER = {
                         document.body.insertBefore(div, null);
                     }
                     this._toolTipElement = div;
-                    $(this._toolTipElement).text(text).css("top", setting.pos.y + hitinfo.y + 15).css("left", setting.pos.x + hitinfo.x + 15);
+                    //实时读取位置信息
+                    if(sheet && sheet.getParent().qo){
+                        setting.pos = SheetDataHelper.getObjPos(sheet.getParent().qo);
+                    }
+                    $(this._toolTipElement).text(text);
+                    //清单指引、清单库做特殊处理
+                    if($(sheet.getParent().qo).attr('id') === 'stdBillsSpread' || $(sheet.getParent().qo).attr('id') === 'billsGuidance_bills'){
+                        $(this._toolTipElement).css('top', '').css('left', '').css('width', '');
+                        let marginLeftMouse;
+                        if($(this._toolTipElement).width() < hitinfo.x){
+                            marginLeftMouse = hitinfo.x - $(this._toolTipElement).width();
+                        }
+                       $(this._toolTipElement).css("top", setting.pos.y + hitinfo.y + 15).css("left", marginLeftMouse ? setting.pos.x + marginLeftMouse : setting.pos.x);
+                    }
+                    else {
+                        $(this._toolTipElement).css("top", setting.pos.y + hitinfo.y + 15).css("left", setting.pos.x + hitinfo.x + 15);
+                    }
                     $(this._toolTipElement).show("fast");
                     TREE_SHEET_HELPER.tipDiv = 'show';//做个标记
                 }

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

@@ -63,7 +63,7 @@
                     <!--<a href="javascript:void(0)" class="btn btn-sm" title="复制" ><i class="fa fa-files-o" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" title="剪切"><i class="fa fa-scissors" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" title="粘贴"><i class="fa fa-clipboard" aria-hidden="true"></i></a>-->
-                 <!--   <a href="javascript:void(0)" class="btn btn-sm" id="insert" title="插入"><i class="fa fa-sign-in" aria-hidden="true"></i></a>-->
+                    <a href="javascript:void(0)" class="btn btn-sm" id="insertRation" title="插入定额"><i class="fa fa-sign-in" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="delete" title="删除"><i class="fa fa-remove" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="upLevel" title="升级"><i class="fa fa-arrow-left" aria-hidden="true"></i></a>
                     <a href="javascript:void(0)" class="btn btn-sm" id="downLevel" title="降级"><i class="fa fa-arrow-right" aria-hidden="true"></i></a>

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

@@ -361,6 +361,7 @@ var PROJECT = {
         };
         //清单是否属于锁定范围(分部分项、措施项目)
         project.prototype.withinBillsLocked = function (node) {
+            console.log(node);
             const lockedFixFlag = [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE];
             while(node){
                 if(!node.parent){

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

@@ -606,10 +606,10 @@ let characterOprObj = {
     },
     updateCharacter: function (item, character, value) {
         let me = characterOprObj;
-        if(character !== null){
+        if(character !== undefined && character !== null){
             item.character = character;
         }
-        if(value !== null){
+        if(value !== undefined && value !== null){
             if(value !== ''){
                 let isExist = false;
                 for(let i = 0, len = item.eigenvalue.length; i < len; i++){
@@ -695,10 +695,6 @@ let characterOprObj = {
             if(me.currentCache.length > rowIdx){
                me.updateCharacter(me.currentCache[rowIdx], items[i].character, items[i].eigenvalue);
             }
-           /* //新增
-            else{
-                me.insertCharacter(items[i].character, items[i].eigenvalue);
-            }*/
         }
     },
     onRangeChanged: function (sender, args) {

+ 28 - 0
web/building_saas/main/js/views/fee_rate_view.js

@@ -188,6 +188,33 @@ var feeRateObject={
         sheet.resumeEvent();
         sheet.resumePaint(false);
     },
+    locate: function(){   // CSL,2018.07.18
+        let sheet = feeRateObject.feeRateSpreads.getSheet(0);
+        let fID = calcProgramManage.getSelectionInfo().calcItem.feeRateID;
+        let rates = projectObj.project.FeeRate.getActivateFeeRate().rates;
+        let rowIdx = 0, pID = 0;
+
+        if (fID){
+            for (let i in rates) {
+                if (rates[i].ID == fID){
+                    rowIdx = parseFloat(i);
+                    pID = rates[i].ParentID;
+                    break;
+                };
+            }
+        };
+
+        for (let i in rates){
+            if (!rates[i].ParentID){
+                sheet.rowOutlines.setCollapsed(parseFloat(i), true);
+                if (rates[i].ID == pID)
+                    sheet.rowOutlines.setCollapsed(parseFloat(i), false);
+            };
+        };
+
+        sheet.setSelection(rowIdx, -1, 1, -1);
+        sheet.showRow(rowIdx, GC.Spread.Sheets.VerticalPosition.center);
+    },
     getTreeNodeCellType:function () {
         var ns = GC.Spread.Sheets;
         function TreeNodeCellType() {
@@ -1016,6 +1043,7 @@ $(function(){
         }
         feeRateObject.feeRateSelection=null;
         feeRateObject.showSelectTree(feeRateObject.feeRateSheet,feeRateObject.sheetSetting,projectObj.project.FeeRate.getActivateFeeRate().rates);
+        feeRateObject.locate();
     });
 
     $('#fee_rate_tree').on('hidden.bs.modal', function (e) {

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

@@ -16,7 +16,7 @@ let gljCol = {
             {headerName: "定额价", headerWidth: 80, dataCode: "basePrice", dataType: "Number", hAlign: "right", decimalField: "glj.unitPrice"},
             {headerName: "调整价", headerWidth: 80, dataCode: "adjustPrice", dataType: "Number", hAlign: "right", decimalField: "glj.unitPrice"},
             {headerName: "市场价", headerWidth: 80, dataCode: "marketPrice", dataType: "Number", hAlign: "right", decimalField: "glj.unitPrice"},
-            {headerName: "是否暂估", headerWidth: 65, dataCode: "isEstimate", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox"
+            {headerName: "暂估", headerWidth: 65, dataCode: "isEstimate", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox"
             }
         ],
         view: {
@@ -32,12 +32,12 @@ let gljCol = {
             {headerName: "规格型号", headerWidth: 120, dataCode: "specs", hAlign: "left", dataType: "String"},
             {headerName: "单位", headerWidth: 45, dataCode: "unit", hAlign: "center", dataType: "String"},
             {headerName: "类型", headerWidth: 45, dataCode: "short_name", hAlign: "center", dataType: "String"},
-            {headerName: "总消耗量", headerWidth: 130, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
+            {headerName: "总消耗量", headerWidth: 90, dataCode: "quantity", hAlign: "right", dataType: "Number",decimalField:'glj.quantity'},
             {headerName: "定额价", headerWidth: 70, dataCode: "basePrice", hAlign: "right", dataType: "Number",decimalField:'glj.unitPrice',validator:"number"},
             {headerName: "调整价", headerWidth: 70, dataCode: "adjustPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice"},
             {headerName: "市场价", headerWidth: 70, dataCode: "marketPrice", hAlign: "right", dataType: "Number",decimalField:"glj.unitPrice",validator:"number"},
-            {headerName: "是否暂估", headerWidth: 60, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
-            {headerName: "主要材料", headerWidth: 60, dataCode: "is_main_material", hAlign: "center", dataType: "String",cellType:'checkBox'},
+            {headerName: "暂估", headerWidth: 60, dataCode: "is_evaluate", hAlign: "center", dataType: "String",cellType:'checkBox'},
+            {headerName: "主要\n材料", headerWidth: 60, dataCode: "is_main_material", hAlign: "center", dataType: "String",cellType:'checkBox'},
             {headerName: "供货方式", headerWidth: 80, dataCode: "supply", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:supplyComboMap},
             {headerName: "甲供数量", headerWidth: 100, dataCode: "supply_quantity", hAlign: "right", dataType: "Number",validator:"number",decimalField:'glj.quantity'},
             {headerName: "三材类别", headerWidth: 80, dataCode: "materialType", hAlign: "center", dataType: "String",cellType:'comboBox',editorValueType:true,options:materialComboMap},

+ 8 - 0
web/building_saas/main/js/views/glj_view.js

@@ -1276,6 +1276,14 @@ $(function () {
             }
         }
         gljOprObj.showLibGLJSheetData();
+        //替换,焦点定位至当前选中人材机
+        if($('#actionType').val() =='m_replace' || $('#actionType').val() == 'replace'){
+            let selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
+            let index = _.findIndex(gljOprObj.gljLibSheetData, {code: selected.code});
+            gljOprObj.gljLibSheet.showRow(index, GC.Spread.Sheets.VerticalPosition.center);
+            gljOprObj.gljLibSheet.setActiveCell(index, 0);
+            gljOprObj.gljLibSpresd.focus(true);
+        }
     });
 
     $('#glj_tree_div').on('hidden.bs.modal', function () {

+ 18 - 18
web/building_saas/main/js/views/glj_view_contextMenu.js

@@ -11,35 +11,31 @@ var gljContextMenu = {
             selector: '#subSpread',
             build: this.onbuild,
             items: {
-                "delete_glj": {
-                    name: '删除人材机',
-                    icon: 'fa-remove',
+                "replace_glj": {
+                    name: '替换',
+                    icon: 'fa-sign-in',
                     disabled: function () {
                         var sheetData = gljOprObj.sheetData;
                         if(gljOprObj.isInstallationNode(projectObj.project.mainTree.selected)){
                             return true;
                         }
                         if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
-                            if( sheetData[gljContextMenu.selectedRow].isMixRatio==true){
+                            if(sheetData[gljContextMenu.selectedRow].isMixRatio==true){
                                 return true;
                             }
                             return false;
-                        }else {
-                            return true;
                         }
-
+                        return true;
                     },
                     callback: function () {
-                        var sheetData = gljOprObj.sheetData;
-                        var deleteRow = sheetData[gljContextMenu.selectedRow];
-                        projectObj.project.ration_glj.updataOrdelete(deleteRow);
+                        getGLJData('replace');
                     },
                     visible: function(key, opt){
                         return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "add_glj": {
-                    name: '添加人材机',
+                    name: '添加',
                     icon: 'fa-sign-in',
                     disabled: function () {
                         var selected = projectObj.project.mainTree.selected;
@@ -65,31 +61,35 @@ var gljContextMenu = {
                         return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
-                "replace_glj": {
-                    name: '替换人材机',
-                    icon: 'fa-sign-in',
+                "delete_glj": {
+                    name: '删除',
+                    icon: 'fa-remove',
                     disabled: function () {
                         var sheetData = gljOprObj.sheetData;
                         if(gljOprObj.isInstallationNode(projectObj.project.mainTree.selected)){
                             return true;
                         }
                         if(subSpread.getActiveSheetIndex()==0&&sheetData!=null&&sheetData.length>0&&gljContextMenu.selectedRow<sheetData.length){
-                            if(sheetData[gljContextMenu.selectedRow].isMixRatio==true){
+                            if( sheetData[gljContextMenu.selectedRow].isMixRatio==true){
                                 return true;
                             }
                             return false;
+                        }else {
+                            return true;
                         }
-                        return true;
+
                     },
                     callback: function () {
-                        getGLJData('replace');
+                        var sheetData = gljOprObj.sheetData;
+                        var deleteRow = sheetData[gljContextMenu.selectedRow];
+                        projectObj.project.ration_glj.updataOrdelete(deleteRow);
                     },
                     visible: function(key, opt){
                         return subSpread.getActiveSheet().name()=='ration_glj';
                     }
                 },
                 "m_replace_glj": {
-                    name: '批量替换人材机',
+                    name: '批量替换',
                     icon: 'fa-sign-in',
                     disabled: function () {
                         let sheetData = gljOprObj.sheetData;

+ 39 - 12
web/building_saas/main/js/views/project_view.js

@@ -155,7 +155,8 @@ var projectObj = {
             }
             return false
         };
-        
+
+        setButtonValid(canInsertRationNode(selected), $('#insertRation'));
         setButtonValid(ifCanDelete(), $('#delete'));
         setButtonValid(canUpLevel(selected), $('#upLevel'));
         setButtonValid(canDownLevel(selected), $('#downLevel'));
@@ -423,7 +424,7 @@ var projectObj = {
         }  else if(calcTools.isGljRation(node)){
             gljOprObj.updateRationTypeGLJ(value,node,fieldName,editingText);
         } else if (value !== calcFees.getFee(node.data, fieldName)||fieldName == 'quantity') {//工程量需要进行转换,所以做特殊处理
-            if (fieldName === 'code' && !calcTools.isVolumePrice(node)) {
+            if (fieldName === 'code' && value != '' && !calcTools.isVolumePrice(node)) {
                 projectObj.updateCode(node, value);
             }
             else if(fieldName ==='feeRate'){
@@ -520,11 +521,14 @@ var projectObj = {
         let newV;
         if(node && node.sourceType === projectObj.project.Ration.getSourceType() && node.data.type === rationType.ration
             && isDef(node.data.code) && isDef(node.data.prefix) && node.data.prefix !== rationPrefix.none && fieldName === 'code'){
-            if(node.data.prefix === rationPrefix.complementary){
-                newV = orgV.replace(new RegExp('补'), '');
+/*            if(node.data.prefix === rationPrefix.complementary){
+                newV = orgV.replace(new RegExp(rationPrefix.complementary), '');
             }
             if(node.data.prefix === rationPrefix.borrow){
-                newV = orgV.replace(new RegExp('借'), '');
+                newV = orgV.replace(new RegExp(rationPrefix.borrow), '');
+            }*/
+            if(node.data.prefix){
+                newV = orgV.replace(new RegExp(node.data.prefix), '');
             }
             info.sheet.setValue(info.row, info.col, newV);
         }
@@ -541,6 +545,12 @@ var projectObj = {
         }
 
     },
+    onColumnWidthChanged: function (sender, info) {
+        projectObj.mainSpread.getActiveSheet().setColumnVisible(4, false);
+        projectObj.mainSpread.getActiveSheet().setColumnVisible(4, true);
+        projectObj.mainSpread.refresh();
+        projectObj.mainSpread.repaint();
+    },
     mainSpreadEditEnded: function (sender, info) {
         let project = projectObj.project;
         let node = project.mainTree.items[info.row];
@@ -577,7 +587,7 @@ var projectObj = {
                 let node = project.mainTree.items[changedCell.row];
                 let colSetting = setting.cols[changedCell.col];
                 let value = projectObj.checkSpreadEditingText(changedCell.text, colSetting)
-                if(colSetting.data.field=='code'&& node.sourceType == project.Ration.getSourceType()&&node.data.type==rationType.ration){//如果是更新定额的编码
+                if(colSetting.data.field=='code' && value != '' && node.sourceType == project.Ration.getSourceType()&&node.data.type==rationType.ration){//如果是更新定额的编码
                     updateRationCodes.push({'node':node,value:value});
                 }else {
                     projectObj.updateCellValue(node, value, colSetting,changedCell.text);
@@ -701,6 +711,7 @@ var projectObj = {
                 that.mainSpread.bind(GC.Spread.Sheets.Events.ClipboardChanged, that.msClipboardChanged);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.ButtonClicked, that.onButtonClick);
                 that.mainSpread.bind(GC.Spread.Sheets.Events.CellDoubleClick, that.onCellDoubleClick);
+                that.mainSpread.bind(GC.Spread.Sheets.Events.ColumnWidthChanged, that.onColumnWidthChanged);
 
                 //let loadOtherStartTime = +new Date();
                 if(!projectReadOnly){
@@ -861,10 +872,7 @@ var projectObj = {
                     },
                     visible: function(key, opt){
                         var selected = project.mainTree.selected;
-                        if(selected){
-                          return canInsertRationNode(selected);
-                        }
-                       return false;
+                        return canInsertRationNode(selected);
                     }
                 },
                 "insertLJ": {
@@ -1967,14 +1975,33 @@ function ifCanDelete() {
 }
 
 function canInsertRationNode(selected) {//判断是否能插入定额、量价、定额类型工料机, false 不能,true能
+    if(!selected)
+        return false;
     let project = projectObj.project;
-    if(selected.sourceType == ModuleNames.bills&&selected.data.type == billType.DXFY){
+    if(selected.sourceType == ModuleNames.bills && selected.data.type == billType.DXFY){
         return false
     }else if(!(project.Bills.isMeasure(selected)||project.Bills.isFBFX(selected))){
         return false
-    }else {
+    }else if(selected.sourceType == ModuleNames.bills && selected.source.children.length > 0){
+        return false
+    }
+    else {
         return true
     }
+
+/*    if (selected) {// Vincent, 2018-01-02
+        if(selected.sourceType === project.Ration.getSourceType()){ // 焦点行是定额/量价/工料机,有效显示。
+            return false;
+        }else if(selected.sourceType === project.Bills.getSourceType()){
+            if(selected.data.type == billType.FX || selected.data.type == billType.BX){//焦点行是分项,有效显示。
+                return false
+            }
+            if(selected.data.type == billType.BILL && selected.source.children.length === 0){//焦点行是清单,且没有子项,有效显示。
+                return false
+            }
+        }
+    }
+    return true;*/
 }
 
 //导入类型(09表、广联达)

+ 23 - 6
web/building_saas/main/js/views/std_billsGuidance_lib.js

@@ -65,6 +65,7 @@ const billsGuidance = (function () {
                {
                 width: 45,
                 readOnly: true,
+                showHint: true,
                  head: {
                      titleNames: ["计量单位"],
                      spanCols: [1],
@@ -300,6 +301,8 @@ const billsGuidance = (function () {
                 module.workBook.focus();
                 sheet.options.isProtected = true;
                 sheet.name('stdBillsGuidance_bills');
+                //设置悬浮提示
+                TREE_SHEET_HELPER.initSetting(bills.dom[0], bills.treeSetting);
             }
             if(module === guideItem){
                 sheet.options.isProtected = true;
@@ -416,6 +419,15 @@ const billsGuidance = (function () {
             bills.tree.setRootExpanded(bills.tree.roots, false);
         }
     }
+    //设置tag以悬浮提示
+    function setTagForHint(nodes){
+        let sheet = bills.workBook.getActiveSheet();
+        renderSheetFunc(sheet, function () {
+            for(let node of nodes){
+                sheet.setTag(node.serialNo(), 2, node.data.ruleText ? node.data.ruleText : '');
+            }
+        });
+    }
     //初始选择清单指引库
     //@param {Number}libID @return {void}
     function libInitSel(libID){
@@ -428,6 +440,7 @@ const billsGuidance = (function () {
             for(let node of bills.tree.items){
                 node.guidance = {tree: null, controller: null};
             }
+            setTagForHint(bills.tree.items);
             //默认初始节点
             billsInitSel(0);
         });
@@ -604,13 +617,17 @@ const billsGuidance = (function () {
                 sessionStorage.setItem('stdBillsGuidanceExpState', bills.tree.getExpState(bills.tree.items));
 
                 let sel = billsSheet.getSelections();
-                bills.controller.setTreeSelected(result[0]);
-                billsSheet.setSelection(result[0].serialNo(), sel[0].col, 1, 1);
-                billsInitSel(result[0].serialNo());
+                renderSheetFunc(billsSheet, function () {
+                    bills.controller.setTreeSelected(result[0]);
+                    billsSheet.setSelection(result[0].serialNo(), sel[0].col, 1, 1);
+                    billsInitSel(result[0].serialNo());
 
-                for (let node of result) {
-                    billsSheet.getRange(node.serialNo(), -1, 1, -1).backColor('lemonChiffon');
-                }
+                    for (let node of result) {
+                        billsSheet.getRange(node.serialNo(), -1, 1, -1).backColor('lemonChiffon');
+                    }
+                });
+                //搜索初始定位
+                billsSheet.showRow(result[0].serialNo(), GC.Spread.Sheets.VerticalPosition.bottom);
 
                 $('#nextBillsGuidance').show();
                 $('#nextBillsGuidance').unbind('click');

+ 10 - 10
web/building_saas/main/js/views/std_bills_lib.js

@@ -122,7 +122,7 @@ var billsLibObj = {
         return features;
     },
     insertBills: function (stdBillsJobData, stdBillsFeatureData, node) {
-        if(projectInfoObj.projectInfo.property.lockBills == true && projectObj.project.withinBillsLocked(node)){
+        if(projectInfoObj.projectInfo.property.lockBills == true && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
             return false;
         }
         $.bootstrapLoading.start();
@@ -152,7 +152,6 @@ var billsLibObj = {
         } else {
             let canAdd = ProjectController.addBills(projectObj.project, projectObj.mainController, node.data);
             if(canAdd === false && $.bootstrapLoading.isLoading()){
-                console.log('enter');
                 $.bootstrapLoading.end();
             }
         }
@@ -272,15 +271,16 @@ var billsLibObj = {
                 billsLibObj.expandSearchNodes(result);
                 //设置记住展开
                 sessionStorage.setItem('stdBillsLibExpState', that.stdBillsTree.getExpState(that.stdBillsTree.items));
+                TREE_SHEET_HELPER.massOperationSheet(billsLibObj.stdBillsSpread.getActiveSheet(), function () {
+                    var sel = billsLibObj.stdBillsSpread.getActiveSheet().getSelections();
+                    stdBillsTreeController.setTreeSelected(result[0]);
+                    billsLibObj.stdBillsSpread.getActiveSheet().setSelection(result[0].serialNo(), sel[0].col, 1, 1);
 
-                var sel = billsLibObj.stdBillsSpread.getActiveSheet().getSelections();
-                stdBillsTreeController.setTreeSelected(result[0]);
-                billsLibObj.stdBillsSpread.getActiveSheet().setSelection(result[0].serialNo(), sel[0].col, 1, 1);
-
-                for (let node of result) {
-                    billsLibObj.stdBillsSpread.getActiveSheet().getRange(node.serialNo(), -1, 1, -1).backColor('lemonChiffon');
-                }
-
+                    for (let node of result) {
+                        billsLibObj.stdBillsSpread.getActiveSheet().getRange(node.serialNo(), -1, 1, -1).backColor('lemonChiffon');
+                    }
+                });
+                billsLibObj.stdBillsSpread.getActiveSheet().showRow(result[0].serialNo(), GC.Spread.Sheets.VerticalPosition.bottom);
                 $('#nextStdBills').show();
                 $('#nextStdBills').unbind('click');
                 $('#nextStdBills').bind('click', function () {

+ 8 - 0
web/building_saas/pm/html/project-management.html

@@ -326,10 +326,18 @@
                         <select style="margin-left: 5px; border-radius: .25rem;" class="form-control" id="tender-engineering"><option value="">请选择工程专业</option></select>
                     </div>
                     <span class="form-text text-danger" id="engineering-info" style="display: none;">请选择工程专业</span>
+                    <div style="margin-top: 15px;" class="input-group" id="taxType_div">
+                        <label style="margin-top: 8px;">计税方式</label>
+                        <select style="margin-left: 5px; border-radius: .25rem;" class="form-control" id="taxType">
+                            <!--<option value="1">一般计税</option>
+                            <option value="2">简易计税</option>-->
+                        </select>
+                    </div>
                     <div style="margin-top: 15px;" class="input-group">
                         <label style="margin-top: 8px;">计算程序</label>
                         <select style="margin-left: 5px; border-radius: .25rem;" class="form-control" id="tender-calcProgram"><option value="">请选择计算程序</option></select>
                     </div>
+
                     <span class="form-text text-danger" id="calcProgram-info" style="display: none;">请选择计算程序</span>
                 </form>
             </div>

+ 133 - 55
web/building_saas/pm/js/pm_newMain.js

@@ -24,6 +24,10 @@ let fileType = {
     feeRateFile: 'FeeRateFile'
 };
 
+let taxTypeMap = {
+    1:"一般计税",
+    2:"简易计税"
+};
 
 const projTreeObj = {
     tree: null,
@@ -1084,6 +1088,13 @@ $(document).ready(function() {
         changeEngineering();
     });
 
+    //选择计税方式
+    $("#taxType").change(function () {
+        $('#valuation-info').hide();
+        getStdCalcProgramFiles();
+    });
+
+
     // 新增单项项目点击
    /* $("#add-engineering-btn").click(function() {
         let selectedItem = projTreeObj.tree.selected;
@@ -1113,7 +1124,7 @@ $(document).ready(function() {
     });*/
 
     //新建单位工程-建设项目提示
-    $('#poj-name').change(function () {
+    $('#poj-name').keyup(function () {
         let pojName = $('#poj-name').val().trim();
         let nameList = getNameList($('#poj-name-list').children());
         let isExist = hasListName(nameList, pojName);
@@ -1122,25 +1133,40 @@ $(document).ready(function() {
                 replaceClass($('#poj-name-info'), 'text-danger', 'text-info');
                 setDangerInfo($('#poj-name-info'), `新建“${pojName}”`);
             }
+            else {
+                $('#poj-name-info').hide();
+            }
             //清空单项工程下拉和文件下拉
             setEngOptions(null);
             setFileOptions(null);
         }
         else {
+            //触发选项
+            let curName = $(this).val().trim();
+            function getProjOpt(opts){
+                for(let opt of opts){
+                    if($(opt).text().trim() === curName){
+                        return $(opt);
+                    }
+                }
+                return null;
+            }
+            let matchOpt = getProjOpt($('#poj-name-list').find('button'));
+            if(matchOpt){
+                matchOpt.click();
+            }
             $('#poj-name-info').hide();
         }
     });
 
     //新建单位工程-单项工程提示
-    $('#eng-name').change(function () {
+    $('#eng-name').keyup(function () {
         let engName = $('#eng-name').val().trim();
         let nameList = getNameList($('#eng-name-list').children());
         let isExist = hasListName(nameList, engName);
-        if(!isExist){
-            if(engName !== ''){
-                replaceClass($('#eng-name-info'), 'text-danger', 'text-info');
-                setDangerInfo($('#eng-name-info'), `新建“${engName}”`);
-            }
+        if(!isExist && engName !== ''){
+            replaceClass($('#eng-name-info'), 'text-danger', 'text-info');
+            setDangerInfo($('#eng-name-info'), `新建“${engName}”`);
         }
         else {
             $('#eng-name-info').hide();
@@ -1148,7 +1174,7 @@ $(document).ready(function() {
     });
 
     //新建单位工程-单位工程提示
-    $('#tender-name').change(function () {
+    $('#tender-name').keyup(function () {
         let selected = projTreeObj.tree.selected;
         let pojName = $('#poj-name').val().trim();
         let engName = $('#eng-name').val().trim();
@@ -1394,46 +1420,71 @@ $(document).ready(function() {
     function changeEngineering(){
         $('#engineering-info').hide();
         let engineeringList = getEngineeringList();
-        if(engineeringList.length === 0){
-            return false;
-        }
-        let selectedEngineering = $("#tender-engineering").val();
-        selectedEngineering = parseInt(selectedEngineering);
-        let currentLib = {};
-        for(let engineering of engineeringList) {
-            if (engineering.engineering === selectedEngineering) {
-                currentLib = engineering.lib;
+        if(engineeringList.length > 0){
+            let selectedEngineering = $("#tender-engineering").val();
+            let currentLib = {};
+            for(let engineering of engineeringList) {
+                if (engineering.engineering_id === selectedEngineering) {
+                    currentLib = engineering.lib;
+                }
+            }
+
+            if (Object.keys(currentLib).length > 0) {
+                // 输出数据到页面
+                if (currentLib.fee_lib !== undefined && currentLib.fee_lib.length > 0) {
+                    $("#tender-fee-rate").children("option").first().val("newFeeRate-"+currentLib.fee_lib[0].id);
+                }
+                $("#tender-engineering").parent().siblings('.hidden-area').slideDown('fast');
             }
         }
+        setTaxGroupHtml();
+        getStdCalcProgramFiles();
+    }
 
-        if (Object.keys(currentLib).length <= 0) {
-            return false;
+
+    function setTaxGroupHtml() {
+        let groups = getTaxGroupList();
+        let taxTypeArray = [];
+        let htmlString = "";
+        if(groups && groups.length > 0){
+            taxTypeArray = _.uniq(_.map(groups,'taxType'));
         }
-        // 输出数据到页面
-        if (currentLib.fee_lib !== undefined && currentLib.fee_lib.length > 0) {
-            $("#tender-fee-rate").children("option").first().val("newFeeRate-"+currentLib.fee_lib[0].id);
+        for(let t of taxTypeArray){
+             htmlString += "<option value='"+t+"'>"+taxTypeMap[t]+"</option>"
         }
-        $("#tender-engineering").parent().siblings('.hidden-area').slideDown('fast');
-
-        function getStdCalcProgramFiles(){
-            function getStdCPFilesHtml(stdCPLibs) {
-                let result = '<option value="">请选择计算程序</option>';
-                if (stdCPLibs.length <= 0) {
-                    return result;
-                };
+        $('#taxType').html(htmlString);
+        if(taxTypeArray.length <2){
+            $('#taxType_div').hide();
+        }else {
+            $('#taxType_div').show();
+        }
+        console.log(taxTypeArray);
+    }
 
-                for (let lib of stdCPLibs){
-                    result += '<option value='+ lib.id +'>'+ lib.name +'</option>';
-                };
+    function getStdCalcProgramFiles(){
+        function getStdCPFilesHtml(taxGroups) {
+            let result = '<option value="">请选择计算程序</option>';
+            if (taxGroups.length <= 0) {
                 return result;
             };
-            let stdCPHtml = getStdCPFilesHtml(getcalcProgramList());
-            $("#tender-calcProgram").html(stdCPHtml);
-            if ($("#tender-calcProgram")[0].options.length > 1)
-                $("#tender-calcProgram")[0].selectedIndex = 1;
+
+            for (let group of taxGroups){
+                let groupString = ""; //把计算程序、清单模板、列设置的ID生成一个组合的值
+                let p_id = group.program_lib?group.program_lib.id:"";
+                let t_id = group.template_lib?group.template_lib.id:"";
+                let c_id = group.col_lib?group.col_lib.id:"";
+                groupString = p_id + "|-|" +t_id+"|-|"+c_id;
+                result += '<option value='+ groupString +'>'+ group.program_lib.name +'</option>';
+            };
+            return result;
         };
-        getStdCalcProgramFiles();
+        let taxType = $("#taxType").val();
+        let stdCPHtml = getStdCPFilesHtml(getTaxGroupList(taxType));
+        $("#tender-calcProgram").html(stdCPHtml);
+        if ($("#tender-calcProgram")[0].options.length > 1)
+            $("#tender-calcProgram")[0].selectedIndex = 1;
     }
+
     // 选择工程专业后动态更改费率文件等数据
     $("#tender-engineering").change(function() {
         changeEngineering()
@@ -1810,17 +1861,26 @@ function getEngineeringList(){
     return engineeringList;
 }
 
-function getcalcProgramList(){
+
+
+function getTaxGroupList(type){//getcalcProgramList
     let egrs = getEngineeringList();
-    let calcProgramList = [];
+    let groupList = [];
     let egrID = $("#tender-engineering").val();
     for(let egr of egrs) {
-        if (egr.engineering == egrID) {
-            calcProgramList = egr.lib.program_lib;
-            break;
+        if (egr.engineering_id == egrID && egr.lib) {
+            if(type){//是否要过滤,如果这个参数不传,则返回整个数组;
+                for(let group of egr.lib.tax_group){
+                    if(group.taxType == type && group.program_lib){
+                        groupList.push(group);
+                    }
+                }
+            }else {
+                groupList = egr.lib.tax_group;
+            }
         }
     }
-    return calcProgramList;
+    return groupList;
 }
 
 function getNodeByName(name, nodes){
@@ -2100,22 +2160,36 @@ function AddTender() {
             return false;
         }
 
-        let engineering = $("#tender-engineering").val();
-        if (engineering === '') {
+        let engineering_id = $("#tender-engineering").val();
+        if (engineering_id === '') {
             setDangerInfo($('#engineering-info'), '请选择工程专业');
             return false;
         }
 
-        let calcProgram = $("#tender-calcProgram").val();
-        if (calcProgram === '') {
+        let taxType = $("#taxType").val();
+        if(taxType ===""){
+            return false;
+        }
+
+        let IDGroup = $("#tender-calcProgram").val();
+        if (IDGroup === '') {
             setDangerInfo($('#calcProgram-info'), '请选择计算程序');
             return false;
         }
+        IDGroup = IDGroup.split("|-|");
+
+        let calcProgram = isNaN(parseInt(IDGroup[0]))?IDGroup[0]:parseInt(IDGroup[0]);//转换成整数
+        let templateLibID = IDGroup[1];
+        let colLibID = IDGroup[2];
+        if(templateLibID == ''|| colLibID ==''){
+            alert("工程专业配置有误!");
+            return false;
+        }
 
         let valuationName = $("#valuation").children("option:selected").text();
         let valuationType = $("input[name='valuation_type']:checked").val();
 
-        let engineering_id = undefined;
+        let engineering = undefined;
         let valuationData = valuationType === 'bill' ? JSON.parse(billValuation) : JSON.parse(rationValuation);
         let engineeringList = [];
         for(let tmp of valuationData) {
@@ -2126,15 +2200,15 @@ function AddTender() {
         }
         let libs = null;
         for(let tmp of engineeringList) {
-            if (tmp.engineering == engineering) {
-                engineering_id = tmp.engineering_id;
+            if (tmp.engineering_id == engineering_id) {
+                engineering = tmp.engineering;
                 libs = tmp.lib;
                 break;
             }
         }
         // 一个项目里面,这两个文件必须得有,而界面又没有像费率、单价文件那样给出可选项。所以这里给出提示。
         if (!libs.artificial_lib)  throw '编办没有绑定人工系数标准文件';
-        if (!libs.program_lib)  throw '编办没有绑定计算程序标准文件';
+        //if (!libs.program_lib)  throw '编办没有绑定计算程序标准文件';
 
         let engineeringName = $('#tender-engineering').children("option:selected").text();
         let calcProgramName = $('#tender-calcProgram').children("option:selected").text();
@@ -2162,7 +2236,10 @@ function AddTender() {
             engineeringName: engineeringName,
             unitPriceFile: {name: unitPriceFileObj.name, id: unitPriceFileObj.id},
             feeFile: {name: feeFileObj.name, id: feeFileObj.id},
-            calcProgram: {name: calcProgramName, id: calcProgram}
+            calcProgram: {name: calcProgramName, id: calcProgram},
+            taxType:taxType,
+            templateLibID:templateLibID,
+            colLibID:colLibID
         };
         AddTenderItems(selectedItem, projName, engName, tenderName, tenderInfo, callback);
 
@@ -2495,9 +2572,10 @@ function getEngineeringHtml(engineeringList) {
 
     for(let i = 0; i < engineeringList.length; i++){
         let tmp = engineeringList[i];
-        if (engineeringObject[tmp.engineering] !== undefined) {
+        result += `<option ${i === 0 ? 'selected' : ''} value="${tmp.engineering_id}">${tmp.lib.name}</option>`;
+        /*if (engineeringObject[tmp.engineering] !== undefined) {
             result += `<option ${i === 0 ? 'selected' : ''} value="${tmp.engineering}">${engineeringObject[tmp.engineering]}</option>`;
-        }
+        }*/
     }
 
     /*for(let tmp of engineeringList) {