Przeglądaj źródła

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

TonyKang 6 lat temu
rodzic
commit
d3961fd1f1

+ 5 - 0
modules/all_models/engineering_lib.js

@@ -52,6 +52,11 @@ let modelSchema = {
         type: Schema.Types.Mixed,
         default: []
     },
+    //工程特征库
+    feature_lib:{
+        type: Schema.Types.Mixed,
+        default: []
+    },
     //设置人材机显示列
     glj_col:{
         showAdjustPrice:Boolean//是否显示调整价列

+ 22 - 0
modules/all_models/project_feature_lib.js

@@ -0,0 +1,22 @@
+/**
+ * Created by zhang on 2018/9/3.
+ */
+
+//工程特征库
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+const project_feature_lib = new Schema({
+        ID:{type:String,index:true},
+        creator: String,
+        createDate: Number,
+        recentOpr: [oprSchema],
+        name: String,
+        feature:{
+            type: [Schema.Types.Mixed],
+            default: []
+        }
+    }, {versionKey: false}
+);
+
+mongoose.model("std_project_feature_lib", project_feature_lib,"std_project_feature_lib");

+ 10 - 11
modules/main/facade/ration_facade.js

@@ -40,7 +40,7 @@ async function addNewRation(data) {
     if(data.brUpdate.length>0){
         await updateSerialNo(data.brUpdate);
     }
-    let newRation =await insertNewRation(data.newData,data.firstLibID,stdRation,data.calQuantity);
+    let newRation =await insertNewRation(data.newData,data.defaultLibID,stdRation,data.calQuantity);
     let addRationGLJTime = +new Date();
     console.log("插入新定额时间-------------------------------"+(addRationGLJTime - stdRationTime));
     if(stdRation){
@@ -79,7 +79,7 @@ async function  updateSerialNo(serialNoUpdate){
 
 }
 
-async function insertNewRation(newData,firstLibID,std,calQuantity) {//插入新的定额
+async function insertNewRation(newData,defaultLibID,std,calQuantity) {//插入新的定额
     let startTime = +new Date();
     if(std){
         newData.code = std.code;
@@ -95,10 +95,10 @@ async function insertNewRation(newData,firstLibID,std,calQuantity) {//插入新
         }
         newData.prefix = '';
         newData.from = std.type === 'complementary' ? 'cpt' : 'std';
-        if(firstLibID !== std.rationRepId){//借
+        if(defaultLibID !== std.rationRepId){//借
             newData.prefix = '借';
         }
-        else if(std.rationRepId === firstLibID && newData.from === 'cpt') {
+        else if(std.rationRepId === defaultLibID && newData.from === 'cpt') {
             newData.prefix = '补';
         }
         if(std.feeType == undefined || std.feeType == null || std.feeType ==''){//定额取费专业为空的情况下,取项目属性中的定额取费专业ID
@@ -114,7 +114,6 @@ async function insertNewRation(newData,firstLibID,std,calQuantity) {//插入新
     }
     let addRationGLJTime = +new Date();
     console.log("计算消耗量时间-------------------------------"+(addRationGLJTime - startTime));
-    console.log(newData);
     let newRation = await ration_model.model.create(newData);
     return newRation;
     /*ration_model.model.create(newData);
@@ -126,7 +125,7 @@ async function replaceRations(userID,data) {
     let recodes = [];
     for(let recode of data.nodeInfo){
         let stdRation = await searchDao.getRationItem(userID,data.libIDs,recode.newCode, null);
-        let newRecode = await replaceRation(recode,stdRation,data.firstLibID,data.projectID,data.calQuantity);
+        let newRecode = await replaceRation(recode,stdRation,data.defaultLibID,data.projectID,data.calQuantity);
         if(newRecode){
             recodes.push(newRecode);
         }else {
@@ -136,13 +135,13 @@ async function replaceRations(userID,data) {
     return recodes;
 }
 
-async function replaceRation(nodeInfo,stdRation,firstLibID,projectID,calQuantity) {
+async function replaceRation(nodeInfo,stdRation,defaultLibID,projectID,calQuantity) {
     if(nodeInfo.newCode == null||nodeInfo.newCode ==""){//说明是删除编号,则要变成一条空定额
         await deleRationSubRecode(projectID,nodeInfo.ID);//删除定额下挂的各种数据,如定额工料机等
         return await setEmptyRation(projectID,nodeInfo.ID);
     }else if(stdRation){
         await deleRationSubRecode(projectID,nodeInfo.ID);//删除定额下挂的各种数据,如定额工料机等
-        let newRation = await updateRation(stdRation,firstLibID,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity);//生成并插入新的定额
+        let newRation = await updateRation(stdRation,defaultLibID,nodeInfo.ID,nodeInfo.billsItemID,projectID,calQuantity);//生成并插入新的定额
         return await addRationSubList(stdRation,newRation,nodeInfo.needInstall);
     }else {
         return null;
@@ -341,7 +340,7 @@ async function deleRationSubRecode(projectID,rationID) {//删除挂在定额下
     await rationInstallationModel.deleteMany(delete_query);//删除安装增加费
 }
 
-async function  updateRation(std,firstLibID,rationID,billsItemID,projectID,calQuantity) {
+async function  updateRation(std,defaultLibID,rationID,billsItemID,projectID,calQuantity) {
     // insertNewRation
     let ration ={};
     ration.code = std.code;
@@ -362,10 +361,10 @@ async function  updateRation(std,firstLibID,rationID,billsItemID,projectID,calQu
     //定额前缀 none:0, complementary:1, borrow: 2
     ration.prefix = '';
     //借用优先级比补充高
-    if(std.rationRepId !== parseInt(firstLibID)){//借用
+    if(std.rationRepId !== parseInt(defaultLibID)){//借用
         ration.prefix = '借';
     }
-    else if(std.rationRepId === firstLibID && ration.from === 'cpt') {
+    else if(std.rationRepId === defaultLibID && ration.from === 'cpt') {
         ration.prefix = '补';
     }
     if(std.feeType == undefined || std.feeType == null || std.feeType ==''){//定额取费专业为空的情况下,取项目属性中的定额取费专业ID

+ 14 - 0
modules/pm/facade/pm_facade.js

@@ -23,6 +23,8 @@ let rationGLJModel = mongoose.model('ration_glj');
 let rationCoeModel = mongoose.model('ration_coe');
 let rationInstallationModel = mongoose.model('ration_installation');
 let quantityDetailModel = mongoose.model('quantity_detail');
+
+let featureLibModel =  mongoose.model("std_project_feature_lib");
 let scMathUtil = require('../../../public/scMathUtil').getUtil();
 import CounterModel from "../../glj/models/counter_model";
 import moment from 'moment';
@@ -43,6 +45,7 @@ module.exports={
     getSummaryInfoByTender: getSummaryInfoByTender,
     getConstructionProject: getConstructionProject,
     getFullPath: getFullPath,
+    getProjectFeature:getProjectFeature,
     projectType: projectType
 };
 
@@ -708,4 +711,15 @@ async function getFullPath(projectID) {
             }
         }
     }
+}
+
+async function getProjectFeature(libID,engineerName){
+    let lib = await featureLibModel.findOne({'ID':libID})
+    if(lib){
+        let eng = _.find(lib.feature,{'key':'engineering'})
+        if(eng) eng.value = engineerName;
+        return lib.feature;
+    }else {
+        return [];
+    }
 }

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

@@ -164,8 +164,11 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                     //basicInformation[0]['items'][1]['value'] = data.updateData.property.engineeringName || '';
                     //data.updateData.property.basicInformation = basicInformation;
                     //工程特征
-                    projectFeature[0]['value'] = data.updateData.property.engineeringName || '';
-                    data.updateData.property.projectFeature = projectFeature;
+                    if(data.updateData.property.featureLibID){
+                        data.updateData.property.projectFeature = await pmFacade.getProjectFeature(data.updateData.property.featureLibID, data.updateData.property.engineeringName);
+                    }
+                    /*projectFeature[0]['value'] = data.updateData.property.engineeringName || '';
+                    data.updateData.property.projectFeature = projectFeature;*/
 
                     //呈现选项
                     data.updateData.property.displaySetting = displaySetting;

+ 6 - 2
public/web/gljUtil.js

@@ -210,8 +210,10 @@ let gljUtil = {
         let price_hasM_decimal = decimalObj.glj.unitPriceHasMix?decimalObj.glj.unitPriceHasMix:decimalObj.glj.unitPrice;
         let quantity_decimal = decimalObj.glj.quantity;
         let process_decimal = decimalObj.process;
+
         if (this.notEditType.indexOf(glj.unit_price.type)!=-1&&glj.ratio_data.length>0) {//对于混凝土、配合比、砂浆、机械台班等有组成物的材料,价格需根据组成物计算得出。
-            let p =0;
+            //2018-09-07 需求修改,定额价不按组成物的量和价实时计算出来,直接取单价文件中的定额价
+       /*     let p =0;
             for(let ratio of glj.ratio_data){
                 let tem =  _.find( projectGLJDatas.gljList,{
                     'code': ratio.code,
@@ -226,7 +228,9 @@ let gljUtil = {
                     p = scMathUtil.roundForObj(temP + p,process_decimal);
                 }
             }
-            return scMathUtil.roundForObj(p,price_hasM_decimal);
+            return scMathUtil.roundForObj(p,price_hasM_decimal);*/
+
+            return scMathUtil.roundForObj(glj.unit_price.base_price,price_hasM_decimal);
         }else {
             let tem_decimal =price_decimal; //isRadio==true?process_decimal:price_decimal;
             return scMathUtil.roundForObj(glj.unit_price.base_price,tem_decimal);

+ 3 - 3
web/building_saas/main/js/controllers/block_controller.js

@@ -498,9 +498,9 @@ let BlockController = {
             tem_ration.ID = uuid.v1();
             billsIDMap[tem_ration.billsItemID]?tem_ration.billsItemID = billsIDMap[tem_ration.billsItemID]:'';
 
-            let firstLibID = rationLibObj.getFirstStdRationLibID();
-            if(firstLibID&&tem_ration.type == rationType.ration){
-                tem_ration.prefix = projectObj.project.Ration.getRationPrefix(firstLibID,tem_ration);
+            let defaultLibID = rationLibObj.getDefaultStdRationLibID();
+            if(defaultLibID&&tem_ration.type == rationType.ration){
+                tem_ration.prefix = projectObj.project.Ration.getRationPrefix(defaultLibID,tem_ration);
             }
             return tem_ration;
 

+ 7 - 1
web/building_saas/main/js/models/calc_base.js

@@ -1238,7 +1238,9 @@ let baseFigureMap = {
     '安全文明施工专项费': {base: 'AQWMSGZXF', fixedFlag: fixedFlag.SAFETY_CONSTRUCTION, class: 'CSXM'},
     //不于清单直接关联==========
     '建筑面积': {base: 'JZMJ', class: 'FBFX'},
-    '税前工程造价': {base: 'SQGCZJ', class: 'SQGCZJ', multiRef: [fixedFlag.SUB_ENGINERRING, fixedFlag.OTHER, fixedFlag.CHARGE]},//安全文明施工专项费用使用
+    '税前工程造价': {base: 'SQGCZJ', class: 'SQGCZJ',//安全文明施工专项费用使用
+        cycleCalcRef: [fixedFlag.SUB_ENGINERRING, fixedFlag.OTHER, fixedFlag.CHARGE], //循环计算相关固定行,由于计算排除了本身,不用判断措施项目
+        multiRef: [fixedFlag.SUB_ENGINERRING, fixedFlag.OTHER, fixedFlag.CHARGE]}, //相关固定行,需要关联措施项目,因为需要提取出多处引用的进行排序
     '人材机价差': {base: 'RCJJC', class: 'RCJ'},
     '人工价差': {base: 'RGJC', class: 'RCJ'},
     '材料价差': {base: 'CLJC', class: 'RCJ'},
@@ -1359,7 +1361,11 @@ let cbAnalyzer = {
                 //重构后:
                 //多重引用基数
                 let figureMultiRef = baseFigures[figure.value]['multiRef'];
+                let cycleCalcRef = baseFigures[figure.value]['cycleCalcRef'];
                 if(cbTools.isDef(figureMultiRef)){
+                    if(cbTools.isDef(cycleCalcRef)){
+                        figureMultiRef = cycleCalcRef;
+                    }
                     for(let flag of figureMultiRef){
                         let bills = cbTools.findBill(flag);
                         if(bills){

+ 7 - 7
web/building_saas/main/js/models/ration.js

@@ -383,7 +383,7 @@ var Ration = {
         ration.prototype.updateRationCodes = function (recodes) {
             let libID =  rationLibObj.getCurrentStdRationLibID();
             let libIDs = rationLibObj.getStdRationLibIDs();
-            let firstLibID = rationLibObj.getFirstStdRationLibID();
+            let defaultLibID = rationLibObj.getDefaultStdRationLibID();
             let engineering = projectInfoObj.projectInfo.property.engineering;
             let projectID = projectInfoObj.projectInfo.ID;
             let project = projectObj.project;
@@ -406,7 +406,7 @@ var Ration = {
             }
             let calQuantity = optionsOprObj.getOption(optionsOprObj.optionsTypes.GENERALOPTS, 'rationQuanACToBillsQuan');
             $.bootstrapLoading.start();
-            CommonAjax.post("/ration/replaceRations",{nodeInfo:nodeInfo,libIDs:libIDs,firstLibID: firstLibID,projectID:projectID,calQuantity:calQuantity},function (data) {
+            CommonAjax.post("/ration/replaceRations",{nodeInfo:nodeInfo,libIDs:libIDs,defaultLibID: defaultLibID,projectID:projectID,calQuantity:calQuantity},function (data) {
                 for(let recode of data){
                    let node =  mainTree.getNodeByID(recode.ration.ID);
                    if(node) {
@@ -486,7 +486,7 @@ var Ration = {
                             brUpdate.push({projectID:newData.projectID,ID:br[i].ID,serialNo:br[i].serialNo});
                         }
                     }
-                    newDatas.push({itemQuery: items[i].itemQuery, newData: newData, firstLibID: rationLibObj.getFirstStdRationLibID(), calQuantity: calQuantity, brUpdate: brUpdate, needInstall: needInstall})
+                    newDatas.push({itemQuery: items[i].itemQuery, newData: newData, defaultLibID: rationLibObj.getDefaultStdRationLibID(), calQuantity: calQuantity, brUpdate: brUpdate, needInstall: needInstall})
                 }
                 let showLoding = true;
                 $.bootstrapLoading.start();
@@ -593,7 +593,7 @@ var Ration = {
                     needInstall = project.Bills.isFBFX(billsNode);//在分部分项插入的定额才需要定额安装增加费
                 }
                 $.bootstrapLoading.start();
-                CommonAjax.post("/ration/addNewRation",{itemQuery:itemQuery,newData:newData,firstLibID: rationLibObj.getFirstStdRationLibID(),calQuantity:calQuantity,brUpdate:brUpdate,needInstall:needInstall},function (data) {
+                CommonAjax.post("/ration/addNewRation",{itemQuery:itemQuery,newData:newData,defaultLibID: rationLibObj.getDefaultStdRationLibID(),calQuantity:calQuantity,brUpdate:brUpdate,needInstall:needInstall},function (data) {
                     //更新缓存
                     me.datas.push(data.ration);
                     project.ration_glj.addDatasToList(data.ration_gljs);
@@ -674,7 +674,7 @@ var Ration = {
                 newNode = project.mainTree.insert(billItemID, nextID, newID);
                 newNode.sourceType = project.Ration.getSourceType();
                 newNode.data = newData;
-                CommonAjax.post("/ration/addNewRation",{itemQuery:null,newData:newData,firstLibID: rationLibObj.getFirstStdRationLibID(),calQuantity:false,brUpdate:brUpdate,needInstall:false},function (data) {
+                CommonAjax.post("/ration/addNewRation",{itemQuery:null,newData:newData,defaultLibID: rationLibObj.getDefaultStdRationLibID(),calQuantity:false,brUpdate:brUpdate,needInstall:false},function (data) {
                     //更新缓存
                     me.datas.push(data.ration);
                     //插入树节点
@@ -827,8 +827,8 @@ var Ration = {
             }
         } ;
         //获取定额前缀
-        ration.prototype.getRationPrefix = function(firstLibID, ration){
-            if(firstLibID !== ration.libID){
+        ration.prototype.getRationPrefix = function(defaultLibID, ration){
+            if(defaultLibID !== ration.libID){
                 return rationPrefix.borrow;
             }
             if(ration.from && ration.from === rationFrom.cpt){

+ 51 - 112
web/building_saas/main/js/views/fee_rate_view.js

@@ -138,15 +138,13 @@ var feeRateObject={
         feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellClick,feeRateObject.onCellClick);
         feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick,feeRateObject.onCellDoubleClick);
     },
-    showSelectTree:function (sheet,setting,data) {
-        var ch = GC.Spread.Sheets.SheetArea.viewport;
-        var groups=[];
+    showFeeRateTree:function (sheet,setting,data) {
+        let ch = GC.Spread.Sheets.SheetArea.viewport;
+        let parentMap=_.indexBy(data, 'ParentID');
         sheet.suspendPaint();
         sheet.suspendEvent();
-        sheet.rowOutlines.direction(GC.Spread.Sheets.Outlines.OutlineDirection.backward);
-        sheet.getRange(-1, 0, -1, 1).cellType(feeRateObject.getTreeNodeCellType());
-        for (var col = 0; col < setting.header.length; col++) {
-            var hAlign = "left", vAlign = "center";
+        for (let col = 0; col < setting.header.length; col++) {
+            let hAlign = "left", vAlign = "center";
             if (setting.header[col].hAlign) {
                 hAlign = setting.header[col].hAlign;
             } else if (setting.header[col].dataType !== "String"){
@@ -157,11 +155,11 @@ var feeRateObject={
             if (setting.header[col].formatter) {
                 sheet.setFormatter(-1, col, setting.header[col].formatter, GC.Spread.Sheets.SheetArea.viewport);
             }
-            for (var row = 0; row < data.length; row++) {
-                var val = data[row][setting.header[col].dataCode];
+            for (let row = 0; row < data.length; row++) {
+                let val = data[row][setting.header[col].dataCode];
                 if(val&&setting.header[col].dataType === "Number"){
                     if(setting.header[col].hasOwnProperty('decimalField')){
-                        var decimal = getDecimal(setting.header[col].decimalField);
+                        let decimal = getDecimal(setting.header[col].decimalField);
                         val =scMathUtil.roundToString(val,decimal);
                         sheet.setFormatter(-1, col,getFormatter(decimal), GC.Spread.Sheets.SheetArea.viewport);
                     }else {
@@ -170,67 +168,58 @@ var feeRateObject={
                 }
                 sheet.setValue(row, col, val, ch);
                 if(col==0){
-                    feeRateObject.setSheetGroup(data[row],data,groups,row+1);
+                    sheet.getCell(row, 0).textIndent(feeRateObject.getFeeRateLevel(data[row],data));//设置层级,0 为第一层
                 }
             }
         }
-        //this.lockCells(sheet,setting);
-        _.forEach(groups,function (g) {
-            for(var k in g){
-                sheet.rowOutlines.group(parseInt(k), g[k]);
+        sheet.outlineColumn.options({columnIndex: 0, maxLevel: 10});//设置树结构显示的列,和最大层级
+        for(let i =0;i<data.length;i++){
+            if(parentMap[data[i].ID]){
+                sheet.rowOutlines.setCollapsed(i, true);
             }
-        })
-     /*   sheet.rowOutlines.group(1, 6);
-        sheet.rowOutlines.group(8, 6);
-        sheet.rowOutlines.group(15, 6);
-        sheet.rowOutlines.group(22, 6);*/
-       // sheet.getRange(-1, 0, -1, 1).width(300);
+        }
         sheet.showRowOutline(false);
-
-        // 默认折叠
-        for (let i in data){
-            if (!data[i].ParentID){
-                sheet.rowOutlines.setCollapsed(parseFloat(i), true);
-            };
-        };
-
+        sheet.outlineColumn.refresh();
         sheet.resumeEvent();
-        sheet.resumePaint(false);
+        sheet.resumePaint();
+    },
+    getFeeRateLevel:function (rate,data) {
+        if(rate.ParentID){
+         let prate =  _.find(data,{'ID':rate.ParentID});
+         return  this.getFeeRateLevel(prate,data) + 1;
+        }else {
+            return 0
+        }
     },
     locate: function(){   // CSL,2018.07.18
         let sheet = feeRateObject.feeRateSpreads.getSheet(0);
-
         let fID = 0;
         if ($("#calc_program_manage").is(":visible"))
-           fID = calcProgramManage.getSelectionInfo().calcItem.feeRateID
+           fID = calcProgramManage.getSelectionInfo().calcItem.feeRateID;
         else if ($("#zaojiashu").is(":visible"))
            fID = projectObj.project.mainTree.selected.data.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 && (rates[i].ID == pID)){
-                sheet.rowOutlines.setCollapsed(parseFloat(i), false);
-                break;
-            };
-        };
+            rowIdx = _.findIndex(rates,{ID:fID});
+            pID = rates[rowIdx].ParentID;
+        }
+        // 费率现有可能有多层节点,所以要递归展开父节点
+        expandParent(pID,rates,sheet);
 
         sheet.setSelection(rowIdx, -1, 1, -1);
         sheet.showRow(rowIdx, GC.Spread.Sheets.VerticalPosition.center);
         feeRateObject.onCellClick({type: 'CellClick'}, {row:rowIdx});
+        
+        function expandParent(ID,datas,sheet) {//递归展开父节点
+            let index = _.findIndex(datas,{'ID':ID});
+            sheet.rowOutlines.setCollapsed(index, false);
+            if(datas[index].ParentID){
+                expandParent(datas[index].ParentID,datas,sheet)
+            }
+        }
     },
-    getTreeNodeCellType:function () {
+    getTreeNodeCellType:function () {//这个方法费率已暂时不用了
         var ns = GC.Spread.Sheets;
         function TreeNodeCellType() {
         }
@@ -266,8 +255,6 @@ var feeRateObject={
                 ctx.restore();
             }
             else {
-               // x--;
-                //y += h / 2 - 3;
                 ctx.save();
                 ctx.restore();
             }
@@ -373,7 +360,6 @@ var feeRateObject={
                     hitinfo.sheet.repaint();
                 }
             }
-
         };
         FeeRateEditCellType.prototype.processMouseLeave = function (hitinfo) {
             hideButton(hitinfo);
@@ -399,16 +385,6 @@ var feeRateObject={
         $("#calcBaseFeeRate").modal({show:true});
         $('#edit_from').val(hitinfo.sheet.name());
     },
-    setSheetGroup:function (rate,data,groups,row) {
-        var me=this;
-        var group={};
-        var count=me.getChildrenCount(rate.ID,data);
-        if(count>0){
-            group[row]=count;
-            groups.push(group);
-        }
-        return groups;
-    },
     getChildrenCount:function (id,data) {
         var me=this;
         var sum=0;
@@ -483,11 +459,10 @@ var feeRateObject={
         me.mainFeeRateData = projectObj.project.FeeRate.getActivateFeeRate().rates;
         me.mainFeeRateSheet.setRowCount(0);
         me.mainFeeRateSheet.setRowCount(me.mainFeeRateData.length);
-        me.showSelectTree(me.mainFeeRateSheet,me.mainFeeRateSetting,me.mainFeeRateData);
+        me.showFeeRateTree(me.mainFeeRateSheet,me.mainFeeRateSetting,me.mainFeeRateData);
         me.mainFeeRateSheet.setSelection(selected.row,selected.col,selected.rowCount,selected.colCount);
     },
     reFreshRateViews:function() {
-        //feeRateObject.createSpreadView();
         feeRateObject.loadPageContent();
         this.showMainFeeRateData();
         if(subRateObject.subRateSpread){//如果子费率没有初始化过的话,不需要显示。
@@ -613,13 +588,9 @@ var feeRateObject={
                         _.forEach(selectMap,function (value,key) {
                             let tempRecode =  recode.subFeeRate.recodes[key];
                             let optionList = tempRecode.optionList;
-                            _.forEach(optionList,function (o) {
-                                if(o.value==value){
-                                    o.selected = true;
-                                }else {
-                                    o.selected = false;
-                                }
-                            })
+                            for(let o of optionList){
+                                o.value===value? o.selected = true:o.selected = false;
+                            }
                         });
                         items.push({rateIndex:Index,rate:recode});
                     }
@@ -628,13 +599,9 @@ var feeRateObject={
                     let selectList = mapID.split('-');
                     let newList=[];
                     _.forEach(recode.subFeeRate.recodes,function (r) {
-                        let oList = r.optionList;
-                        let oldSelectIndex=0;
-                        let hasChange=false;
+                        let oList = r.optionList, oldSelectIndex=0, hasChange=false;
                         _.forEach(oList,function (o,key) {
-                            if(o.selected){
-                                oldSelectIndex = key;
-                            }
+                            if(o.selected)  oldSelectIndex = key;
                             if(_.includes(selectList,o.value)){
                                 needUpdate=true;
                                 o.selected=true;
@@ -653,7 +620,7 @@ var feeRateObject={
                       let newValue =   _.find(valueMaps,{ID:newList.join("-")})//取出费率值并更新
                         if(newValue){
                           if(recode.rate != newValue.value){
-                              recode.rate = newValue.value
+                              recode.rate = newValue.value;
                               items.push({rateIndex:Index,rate:recode});
                           }
                         }
@@ -724,9 +691,9 @@ var feeRateObject={
             $('#nameError').text("请输入文件名称。").show();
             return;
         }
-        var valideName = $('#valid_name').val();
+        let valideName = $('#valid_name').val();
         if(valideName==''||valideName!==newName){
-            var callback=function (data) {
+            let callback=function (data) {
                 if(data){
                     $('#saveAsConfirm').attr("disabled","disabled");
                     $('#nameError').text("已存在同名费率文件。").show();
@@ -756,7 +723,6 @@ var feeRateObject={
         var callback=function (data) {
             me.changeInfo=data;
             me.loadChangePageContent(data);
-            console.log(data);
         };
         projectObj.project.FeeRate.getChangeInfo(callback);
     },
@@ -767,7 +733,6 @@ var feeRateObject={
             var option =  $("<option>").val(s.ID).text(s.name);
             $('#currentOptions').append(option);
         })
-        //$('#currentOptions').val(projectObj.project.FeeRate.getActivateFeeRateFileID());
         $('#otherProject').empty();
         _.forEach(data.others,function (p) {
             var option =  $("<option>").val(p.ID).text(p.name);
@@ -800,7 +765,6 @@ var feeRateObject={
             name:name
         }
         var callback=function () {
-            //feeRateObject.createSpreadView();
             feeRateObject.reFreshRateViews();
             projectObj.project.FeeRate.onFeeRateFileChange();
             $.bootstrapLoading.end();
@@ -862,8 +826,6 @@ var feeRateObject={
             selected.data.feeRate=scMathUtil.roundToString(rate.rate,getDecimal("feeRate"));
             selected.changed = true;
             projectObj.project.calcProgram.calcAndSave(selected);
-            //projectObj.mainController.refreshTreeNode([selected]);
-            //$("#fee_rate_tree").modal('hide');
             $("#calcBaseFeeRate").modal('hide');
             $.bootstrapLoading.end();
         });
@@ -880,7 +842,6 @@ var feeRateObject={
             projectObj.project.calcProgram.compileAllTemps();
             projectObj.project.calcProgram.calcAllNodesAndSave();
             calcProgramManage.refreshDetailSheet();
-            //$("#fee_rate_tree").modal('hide');
             $("#calcBaseFeeRate").modal('hide');
             $.bootstrapLoading.end();
         });
@@ -921,9 +882,7 @@ $(function(){
         sessionStorage.setItem('mainTab', '#tab_fee_rate');
         let me = feeRateObject;
         $(e.relatedTarget.hash).removeClass('active');
-        if(me.mainFeeRateSpread == null){
-            me.initFeeRateSpread(0);
-        }
+        if(me.mainFeeRateSpread == null)  me.initFeeRateSpread(0);
         me.showMainFeeRateData();
         me.loadPageContent();
     });
@@ -951,9 +910,7 @@ $(function(){
     $('#changeConfirm').bind('click', function (){
         var newVal=$('#standardSelect').val();
         var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
-        if(newVal&&newVal!=feeRateFile.libID){
-            feeRateObject.changeFeeRateStandard(newVal);
-        }
+        if(newVal&&newVal!=feeRateFile.libID)  feeRateObject.changeFeeRateStandard(newVal);
     });
 
     $('#saveAs').bind('click', function (){
@@ -1047,21 +1004,13 @@ $(function(){
         socket.emit('changeActivateFeeRate',{oldRoom:oldValue,newRoom:selectID});
     })
 
-   /* $('#fee_rate_tree').on('shown.bs.modal', function (e) {
-        if(feeRateObject.feeRateSpreads==null){
-            feeRateObject.createSheet();
-        }
-        feeRateObject.feeRateSelection=null;
-        feeRateObject.showSelectTree(feeRateObject.feeRateSheet,feeRateObject.sheetSetting,projectObj.project.FeeRate.getActivateFeeRate().rates);
-        feeRateObject.locate();
-    });*/
     $('#calcBaseFeeRate').on('shown.bs.modal', function (e) {
         let toggle = $('#calcBaseFeeRateConf').attr('toggle');
         if(feeRateObject.feeRateSpreads==null){
             feeRateObject.createSheet();
         }
         feeRateObject.feeRateSelection=null;
-        feeRateObject.showSelectTree(feeRateObject.feeRateSheet,feeRateObject.sheetSetting,projectObj.project.FeeRate.getActivateFeeRate().rates);
+        feeRateObject.showFeeRateTree(feeRateObject.feeRateSheet,feeRateObject.sheetSetting,projectObj.project.FeeRate.getActivateFeeRate().rates);
         feeRateObject.locate();
         feeRateObject.feeRateSpreads.refresh();
     });
@@ -1070,15 +1019,6 @@ $(function(){
             feeRateObject.feeRateSpreads.refresh();
         }
     });
-
-    /*$('#fee_rate_tree').on('hidden.bs.modal', function (e) {
-        if(feeRateObject.feeRateSpreads){
-            feeRateObject.feeRateSpreads.destroy();
-            feeRateObject.feeRateSpreads=null;
-            $('#edit_from').val('');
-            $('#edit_row').val('');
-        }
-    });*/
     $('#calcBaseFeeRate').on('hidden.bs.modal', function (e) {
         if(feeRateObject.feeRateSpreads){
             feeRateObject.feeRateSpreads.destroy();
@@ -1096,7 +1036,6 @@ $(function(){
         feeRateObject.submitFeeRateBySelect();
     })
 })
-
 function changeFRadioClick() {
     var radioV= $("input[name='chaneg-lv-Radio']:checked").val();
     if(radioV==='0'){

+ 15 - 18
web/building_saas/main/js/views/project_property_projFeature.js

@@ -20,13 +20,7 @@ let projFeatureView = {
             allowUserDragFill: false,
             scrollbarMaxAlign : true
         },
-        combos: [
-            {row: 2, key: 'projType', items: ['住宅', '公共建筑', '厂房', '办公楼']},
-            {row: 3, key: 'structureType', items: ['排架结构', '框架结构', '现浇、框架结构', '预制、砖混结构', '外砖内模', '内浇外挂', '钢结构']},
-            {row: 4, key: 'baseType', items: ['带基', '框排架柱距6m以内', '框排架柱距6m以外', '满基筏式', '满基板式', '满基箱式', '独立基础']},
-            {row: 5, key: 'buildingFeature', items: ['点式', '凹式', '凸式', 'Y式', '其他']}
-        ],
-        numRows: [6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
+        numRows: [],//6, 7, 8, 9, 10, 11, 12, 13, 14, 15
         dateRows: [],
         locked: {
             rows: [0, 1],
@@ -73,6 +67,9 @@ let projFeatureView = {
             for(let i = 0, len = headers.length; i < len; i++){
                 sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
                 sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader);
+                sheet.getRange(-1, i, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[headers[i]['hAlign']]);
+                sheet.getRange(-1, i, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[headers[i]['vAlign']]);
+
             }
         };
         me.renderSheetFuc(sheet, fuc);
@@ -107,17 +104,17 @@ let projFeatureView = {
             sheet.setRowCount(datas.length);
             me.initTree(sheet, true, datas);
             sheet.setFormatter(-1, 1, '@');
-            //setCombo
-            for(let i = 0, len = me.setting.combos.length; i < len; i++){
-                me.setCombo(sheet, me.setting.combos[i].row, me.setting.combos[i].items);
-            }
-            for(let col = 0, cLen = cols.length; col < cLen; col++){
-                sheet.getRange(-1, col, -1, 1).hAlign(GC.Spread.Sheets.HorizontalAlign[cols[col]['hAlign']]);
-                sheet.getRange(-1, col, -1, 1).vAlign(GC.Spread.Sheets.VerticalAlign[cols[col]['vAlign']]);
-                for(let row = 0, rLen = datas.length; row < rLen; row++){
-                    sheet.setValue(row, col, datas[row][cols[col]['dataCode']]);
-                }
-            }
+           for(let row = 0;row < datas.length ; row ++){
+               if(datas[row].cellType == 'comboBox'){
+                   let options = datas[row].options?datas[row].options.split("@"):[];
+                   me.setCombo(sheet, row, options);
+               }else if(datas[row].cellType == 'number'){
+                   me.setting.numRows.push(row);
+               }
+               for(let col = 0;col < cols.length;col++){
+                   sheet.setValue(row, col, datas[row][cols[col]['dataCode']]);
+               }
+           }
         };
         this.renderSheetFuc(sheet, fuc);
     },

+ 15 - 1
web/building_saas/main/js/views/std_ration_lib.js

@@ -45,7 +45,11 @@ var rationLibObj = {
         ration_lib.forEach(function (data) {
             let option = $('<option>').val(data.id).text(data.name);
             //select.append($('<option>').val(data.id).text(data.name));
-            if(selectedRationLib && data.id == selectedRationLib){
+            if(selectedRationLib){
+                if(data.id == selectedRationLib){
+                    option.attr('selected', 'selected');
+                }
+            }else if(data.isDefault == true){
                 option.attr('selected', 'selected');
             }
             select.append(option);
@@ -386,6 +390,16 @@ var rationLibObj = {
             return null;
         }
         return parseInt(projectInfoObj.projectInfo.engineeringInfo.ration_lib[0].id);
+    },
+    getDefaultStdRationLibID:function(){
+        let ration_lib = projectInfoObj.projectInfo.engineeringInfo.ration_lib;
+        if(ration_lib.length === 0){
+            alert('当前项目无定额库,请添加定额库。');
+            return null;
+        }
+        let defaultLib = _.find(ration_lib,{'isDefault':true});
+        let libID = defaultLib?defaultLib.id:ration_lib[0].id;
+        return parseInt(libID);
     }
 };
 

+ 8 - 9
web/building_saas/main/js/views/sub_fee_rate_views.js

@@ -125,7 +125,6 @@ var subRateObject={
         sheet.setCellType(row, col, dynamicCombo, GC.Spread.Sheets.SheetArea.viewport);
     },
     addComboboxOption:function (datas) {
-        //<option value ="volvo">Volvo</option> <option value ="saab">Saab</option> <option value="opel">Opel</option> <option value="audi">Audi</option>
         _.forEach(datas,function (item) {
             var selectvalue = 0;
             _.forEach(item.optionList,function (o) {
@@ -139,18 +138,18 @@ var subRateObject={
         })
     },
     subRateChange:function(select){
-        var me = subRateObject;
-        var selectValueList=[];
-        var selectMap={};
+        let me = subRateObject;
+        let selectValueList=[];
+        let selectMap={};
         if(me.datas&&me.datas.length>0){
             $.bootstrapLoading.start();
             _.forEach(me.datas,function (d,key) {
-                var selectValue = $('#'+d.ID).val();
+                let selectValue = $('#'+d.ID).val();
                 selectValueList.push(selectValue);
                 selectMap[key]=selectValue;
             })
-            var mapID =selectValueList.join('-');
-           var  rate = me.valueMap[mapID];
+            let mapID =selectValueList.join('-');
+            let rate = me.valueMap[mapID];
             feeRateObject.updateBySelect(rate,selectMap,mapID);
         }
     },
@@ -167,8 +166,8 @@ var subRateObject={
                 }
                 selectValueList.push(selectMap[key]);
             })
-            var mapID =selectValueList.join('-');
-            var rate = me.valueMap[mapID];
+            let mapID =selectValueList.join('-');
+            let rate = me.valueMap[mapID];
             feeRateObject.updateBySelect(rate,selectMap,mapID);
         }
     },

+ 6 - 1
web/building_saas/pm/js/pm_newMain.js

@@ -2384,6 +2384,10 @@ function AddTender() {
         // 一个项目里面,这两个文件必须得有,而界面又没有像费率、单价文件那样给出可选项。所以这里给出提示。
         if (!libs.artificial_lib)  throw '编办没有绑定人工系数标准文件';
 
+        let featureLibID = "";
+        if(libs.feature_lib && libs.feature_lib.length > 0) featureLibID = libs.feature_lib[0].id;
+
+
         let calcProgramName = $('#tender-calcProgram').children("option:selected").text();
 
         let callback = function() {
@@ -2413,7 +2417,8 @@ function AddTender() {
             calcProgram: {name: calcProgramName, id: calcProgram},
             taxType:taxType,
             templateLibID:templateLibID,
-            colLibID:colLibID
+            colLibID:colLibID,
+            featureLibID:featureLibID
         };
         AddTenderItems(selectedItem, projName, engName, tenderName, tenderInfo, callback);
 

+ 4 - 2
web/over_write/js/chongqing_2018.js

@@ -73,7 +73,7 @@ function overwriteRationCalcBases (taxType){
         rationCalcBases['定额施工机具使用费'] = function (node, isTender) {
             return calcTools.rationBaseFee(node, [gljType.GENERAL_MACHINE, gljType.INSTRUMENT], priceTypes.ptBasePrice, isTender);
         };
-        rationCalcBases['主材费(市场价)'] = function (node, isTender) {
+        rationCalcBases['市场价主材费'] = function (node, isTender) {
             return calcTools.rationBaseFee(node, [gljType.MAIN_MATERIAL], priceTypes.ptMarketPrice, isTender);
         };
         rationCalcBases['人工工日'] = function (node, isTender) {
@@ -263,7 +263,9 @@ if(typeof baseFigureMap !== 'undefined'){
         '甲定施工机具使用费': {base: 'JDJXF', class: 'RCJ'},
         '甲定主材费': {base: 'JDZCF', class: 'RCJ'},
         '暂估材料费(从子目汇总)': {base: 'ZGCLFFZM', class: 'RCJ'},
-        '税前工程造价': {base: 'SQGCZJ', class: 'SQGCZJ', multiRef: [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE, fixedFlag.OTHER, fixedFlag.CHARGE]},//安全文明施工专项费用使用
+        '税前工程造价': {base: 'SQGCZJ', class: 'SQGCZJ',
+            cycleCalcRef: [fixedFlag.SUB_ENGINERRING, fixedFlag.OTHER, fixedFlag.CHARGE],   //循环计算相关固定行,由于计算排除了本身,不用判断措施项目
+            multiRef: [fixedFlag.SUB_ENGINERRING, fixedFlag.MEASURE, fixedFlag.OTHER, fixedFlag.CHARGE]},//相关固定行
     };
 }
 if(typeof baseFigureTemplate !== 'undefined'){