zhongzewei пре 7 година
родитељ
комит
279885893f

+ 32 - 0
modules/all_models/std_progressive_lib.js

@@ -0,0 +1,32 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Zhong
+ * @date 2019/1/25
+ * @version
+ */
+
+/*
+* 累进区间库
+* 设置清单基数中金额区间与费率的对应关系,清单基数累进算法使用
+* */
+
+const mongoose = require('mongoose');
+const Schema = mongoose.Schema;
+const oprSchema = require('../all_schemas/opr_schema');
+
+const progressiveInterval = new Schema({
+    ID: String,
+    name: String,
+    creator: String,
+    createDate: Date,
+    recentOpr: [oprSchema],
+    data: {
+        type: [Schema.Types.Mixed],
+        default: []
+    },
+}, {versionKey: false});
+
+mongoose.model('std_progressive_lib', progressiveInterval, 'std_progressive_lib');

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

@@ -18,6 +18,7 @@ module.exports={
     getConstructionProject: getConstructionProject,
     getFullPath: getFullPath,
     getProjectFeature:getProjectFeature,
+    getProgressiveInterval: getProgressiveInterval,
     projectType: projectType,
     getPosterityProjects: getPosterityProjects,
     isShare: isShare,
@@ -57,6 +58,7 @@ let rationTemplateModel = mongoose.model('ration_template');
 let userModel = mongoose.model('user');
 let compleGljSectionModel = mongoose.model('complementary_glj_section');
 let compleGljSectionTModel = mongoose.model('complementary_glj_section_templates');
+let progressiveModel = mongoose.model('std_progressive_lib');
 
 let featureLibModel =  mongoose.model("std_project_feature_lib");
 let scMathUtil = require('../../../public/scMathUtil').getUtil();
@@ -793,6 +795,12 @@ async function getProjectFeature(libID,feeStandardName){
     }
 }
 
+//获取累进区间数据
+async function getProgressiveInterval(libID) {
+    let lib = await progressiveModel.findOne({ID: libID});
+    return lib ? lib.data : [];
+}
+
 //获取projectIDs文件下所有子项目(不包括projectIDs本身)
 async function getPosterityProjects(projectIDs) {
     let rst = [];

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

@@ -95,6 +95,7 @@ ProjectsDAO.prototype.getUserProject = function (userId, ProjId, callback) {
             if(template && userId !== template.userID){
                 template._doc.readOnly = true;
             }
+
             callback(0, '', template);
         }
     });
@@ -169,7 +170,10 @@ ProjectsDAO.prototype.updateUserProjects = async function (userId, compilationId
                     }
                     /*projectFeature[0]['value'] = data.updateData.property.engineeringName || '';
                     data.updateData.property.projectFeature = projectFeature;*/
-
+                    //累进区间
+                    if (data.updateData.property.progressiveLibID) {
+                        data.updateData.property.progressiveInterval = await pmFacade.getProgressiveInterval(data.updateData.property.progressiveLibID);
+                    }
                     //呈现选项
                     data.updateData.property.displaySetting = displaySetting;
                     let defaultCalcMode = (data.updateData.property.valuationType == 'bill') ? 2 : 1;

+ 10 - 0
web/building_saas/main/html/main.html

@@ -855,6 +855,16 @@
                                                 </label>
                                             </div>
                                         </fieldset>
+                                        <fieldset class="form-group" id="jcybf" style="display: none;">
+                                            <h5>价差预备费</h5>
+                                            <div class="mt-1">
+                                                年造价增涨率<input id="costGrowthRate" class="form-control form-control-sm"  value="0" type="teext" style="display: inline-block; width: 90px;">%
+                                            </div>
+                                            <div class="mt-1">
+                                                增涨计费年限<input id="growthPeriod" class="form-control form-control-sm"  value="0" type="teext" style="display: inline-block; width: 90px;">
+                                            </div>
+
+                                        </fieldset>
                                     </div>
                                 </div>
                                 <!--清单工程精度-->

Разлика између датотеке није приказан због своје велике величине
+ 283 - 956
web/building_saas/main/js/models/calc_base.js


+ 3 - 3
web/building_saas/main/js/models/calc_program.js

@@ -2015,9 +2015,8 @@ class CalcProgram {
     };
 
     // 排除指定项的综合合价计算(用于带循环计算的情况。这里的汇总只到清单级别即可:清单单价取费时,汇总到清单和汇总到定额两个值不一样)
-    getTotalFee(baseNodes, excludeNodes, tender){
+    getTotalFee(baseNodes, excludeNodes, feeField){
         let rst = 0;
-        const totalFeeType = tender ? 'common.tenderTotalFee' : 'common.totalFee';
         function calcNodes(nodes) {
             for (let node of nodes) {
                 if(!node){
@@ -2029,7 +2028,8 @@ class CalcProgram {
                     }
                     else{
                         if (node.sourceType == ModuleNames.bills) {
-                            rst = (rst + calcTools.getFee(node, totalFeeType)).toDecimal(decimalObj.decimal("totalPrice", node));
+                            //这里不四舍五入,保证中间过程不四舍五入
+                            rst += calcTools.getFee(node, feeField);
                         };
                     }
                 }

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

@@ -364,4 +364,4 @@ const materialComboMap = [
     {text:materialType[materialTypeMap.MC],value:materialTypeMap.MC},
     {text:materialType[materialTypeMap.SN],value:materialTypeMap.SN},
     {text:materialType[materialTypeMap.SZ],value:materialTypeMap.SZ}
-];
+];

+ 25 - 66
web/building_saas/main/js/views/calc_base_view.js

@@ -15,7 +15,7 @@ let calcBaseView = {
     workBook: null,
     setting:{
         billsHeader: [
-            {name: '计算基础名称', dataCode: 'base', width: 220, vAlign: 'center', hAlign: 'left'},
+            {name: '计算基础名称', dataCode: 'base', width: 300, vAlign: 'center', hAlign: 'left'},
             {name: '金额', dataCode: 'price', width: 100, vAlign: 'center', hAlign: 'right'}
         ],
         rationHeader: [
@@ -168,7 +168,6 @@ let calcBaseView = {
             rst.push(figureObj);
             //set class datas
             this.billsCBClass.ALL.push(figureObj);
-            this.billsCBClass[obj[figure]['class']].push(figureObj);
         }
         return this.billsCBClass.ALL;
     },
@@ -178,32 +177,30 @@ let calcBaseView = {
         let showDatas;
         me.inputExpr = $('#calcBaseExp');
         me.curType = type;
+        //去除清单基数分类
+        $('#cbClassList').hide();
+        $('#cbRowDiv').removeClass('row');
+        $('#billsBaseSpread').removeClass('col-9');
         if (type === me.type.bills) {
-            //锁定的清单不显示
-            if(projectObj.project.isBillsLocked() && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
-                return;
-            }
-            //显示清单基数分类
-            $('#cbClassList').show();
-            $('#cbRowDiv').addClass('row');
-            $('#billsBaseSpread').addClass('col-9');
-            let row = projectObj.mainSpread.getActiveSheet().getActiveRowIndex();
-            let node = projectObj.project.mainTree.items[row];
-            //输入框显示原本的
-            if (me.isDef(node.data.calcBase)) {
-                me.inputExpr.val(cbParser.toFExpr(node.data.calcBase));
+            try{
+                //锁定的清单不显示
+                if(projectObj.project.isBillsLocked() && projectObj.project.withinBillsLocked(projectObj.project.mainTree.selected)){
+                    return;
+                }
+                let row = projectObj.mainSpread.getActiveSheet().getActiveRowIndex();
+                let node = projectObj.project.mainTree.items[row];
+                //输入框显示原本的
+                if (me.isDef(node.data.calcBase)) {
+                    me.inputExpr.val(cbParser.toFExpr(node.data.calcBase));
+                }
+                let baseObj = projectObj.project.calcBase.getBaseByClass(node);
+                showDatas = me.toViewData(baseObj);
+                $('#cbClassList li .btn ').removeClass('btn btn-outline-secondary btn-sm active');
+                $('#cb_ALL').addClass('btn btn-outline-secondary btn-sm active');
+            } catch (err) {
+                alert(err);
             }
-            let baseObj = projectObj.project.calcBase.getBaseByClass(node);
-            showDatas = me.toViewData(baseObj);
-            $('#cbClassList li .btn ').removeClass('btn btn-outline-secondary btn-sm active');
-            $('#cb_ALL').addClass('btn btn-outline-secondary btn-sm active');
-        }
-        else if (type == me.type.ration) {
-            //去除清单基数分类
-            $('#cbClassList').hide();
-            //$('#qd-jsjs .modal-content').css('width', '');
-            $('#cbRowDiv').removeClass('row');
-            $('#billsBaseSpread').removeClass('col-9');
+        } else if (type == me.type.ration) {
             let calcItem = calcProgramManage.getSelectionInfo().calcItem;
             if (calcItem.dispExprUser) {
                 me.inputExpr.val(calcItem.dispExpr);
@@ -390,45 +387,6 @@ let calcBaseView = {
                 sheetArea: context.sheetArea
             };
         };
-        /*CalcBaseCellType.prototype.processMouseDown = function (hitinfo) {
-            let me=calcBaseView;
-            me.pmLeave = false;
-            if(me.editingCell==null){
-                var showSelectBtn = true;
-                if(hitinfo.sheet.name()!='calc_detail'){
-                    showSelectBtn=me.ifEdit(type, hitinfo.row);
-                }
-                if(showSelectBtn){
-                    me.editingCell={
-                        row:hitinfo.row,
-                        col:hitinfo.col
-                    }
-                    hitinfo.sheet.invalidateLayout();
-                    hitinfo.sheet.repaint();
-                }
-            }else if(hitinfo.row==me.editingCell.row){
-                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
-                var imageMagin=3;
-                var imageHeight = hitinfo.cellRect.height-2*imageMagin;
-                var imageWidth = hitinfo.cellRect.width*2/7;
-                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
-                        calcBaseView.confirmBtn.attr('toggle', 'calcBase');
-                        changeCalcBaseFeeRate('calcBase');
-                        $('#tabCalcBase').tab('show');
-                        calcBaseView.initCalctor(type);
-                    }
-                }
-            }
-        };
-        CalcBaseCellType.prototype.processMouseLeave = function (hitinfo) {
-            if(!calcBaseView.pmLeave){
-                calcBaseView.editingCell=null;
-                hitinfo.sheet.invalidateLayout();
-                hitinfo.sheet.repaint();
-                calcBaseView.pmLeave = true;
-            }
-        };*/
         CalcBaseCellType.prototype.processMouseDown = function (hitinfo) {
             let me = calcBaseView;
             if(me.editingCell && hitinfo.row==me.editingCell.row){
@@ -440,7 +398,8 @@ let calcBaseView = {
                     if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
                         hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
                         if(hitinfo.sheet.getParent() === projectObj.mainSpread){
-                            projectObj.project.mainTree.selected = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
+                            let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
+                            projectObj.mainController.setTreeSelected(node);
                         }
                         calcBaseView.confirmBtn.attr('toggle', 'calcBase');
                         changeCalcBaseFeeRate('calcBase');

+ 55 - 47
web/building_saas/main/js/views/project_view.js

@@ -504,7 +504,7 @@ var projectObj = {
                     if(value === node.data.calcBase){
                         return;
                     }
-                    node.updateData.userCalcBase = value;
+                    node.data.userCalcBase = value;
                     project.calcBase.calculate(node);
                     if(!project.calcBase.success){
                         let activeCell = projectObj.mainSpread.getActiveSheet().getSelections()[0];
@@ -1995,46 +1995,6 @@ var projectObj = {
                 sheetArea: context.sheetArea
             };
         };
-        /*CommonTotalFeeCellType.prototype.processMouseDown = function (hitinfo) {
-            let me=calcBaseView;
-            me.pmLeave = false;
-            if(me.editingCell==null){
-                var showSelectBtn = true;
-                if(hitinfo.sheet.name()!='calc_detail'){
-                    showSelectBtn=me.ifEdit(type, hitinfo.row);
-                }
-                if(showSelectBtn){
-                    me.editingCell={
-                        row:hitinfo.row,
-                        col:hitinfo.col
-                    }
-                    hitinfo.sheet.invalidateLayout();
-                    hitinfo.sheet.repaint();
-                }
-            }else if(hitinfo.row==me.editingCell.row){
-                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
-                var imageMagin=3;
-                var imageHeight = hitinfo.cellRect.height-2*imageMagin;
-                var imageWidth = hitinfo.cellRect.width*2/7;
-                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
-                        calcBaseView.confirmBtn.attr('toggle', 'commonTotalFee');
-                        changeCalcBaseFeeRate('commonTotalFee');
-                        $('#tabCalcBase').tab('show');
-                        calcBaseView.initCalctor(type);
-                        feeRateObject.showSelectModal(hitinfo);
-                    }
-                }
-            }
-        };
-        CommonTotalFeeCellType.prototype.processMouseLeave = function (hitinfo) {
-            if(!calcBaseView.pmLeave){
-                calcBaseView.editingCell=null;
-                hitinfo.sheet.invalidateLayout();
-                hitinfo.sheet.repaint();
-                calcBaseView.pmLeave = true;
-            }
-        };*/
         CommonTotalFeeCellType.prototype.processMouseDown = function (hitinfo) {
             let me = calcBaseView;
             if(me.editingCell && hitinfo.row==me.editingCell.row){
@@ -2045,9 +2005,10 @@ var projectObj = {
                 if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
                     if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
                         if(hitinfo.sheet.getParent() === projectObj.mainSpread){
-                            projectObj.project.mainTree.selected = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
+                            let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
+                            projectObj.mainController.setTreeSelected(node);
                         }
-                        hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
+                        //hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
                         calcBaseView.confirmBtn.attr('toggle', 'commonTotalFee');
                         changeCalcBaseFeeRate('commonTotalFee');
                         $('#tabCalcBase').tab('show');
@@ -2348,7 +2309,7 @@ $('#poj-set').on('show.bs.modal', function () {
         let ft = (projectObj.project.property.billsCalcMode !== undefined && projectObj.project.property.billsCalcMode !== null) ?
             projectObj.project.property.billsCalcMode : defaultCalcMode;
 
-        let zg = projectObj.project.property.zanguCalcMode !== undefined &&``
+        let zg = projectObj.project.property.zanguCalcMode !== undefined &&
                  projectObj.project.property.zanguCalcMode !== null ? projectObj.project.property.zanguCalcMode : zanguCalcType.common;
         setCalcFlag($('#rationContent'), leafBillGetFeeType.rationContent, ft);
         setCalcFlag($('#rationPriceConverse'), leafBillGetFeeType.rationPriceConverse, ft);
@@ -2362,6 +2323,38 @@ $('#poj-set').on('show.bs.modal', function () {
         projDisplayView.init();
         calcOptions.init();
     }
+    let propertyInfo = projectInfoObj.projectInfo.property;
+    //关于计算-价差预备费//预算项目才有
+    if (propertyInfo.valuationType === 'bill') {
+        $('#jcybf').show();
+        //年造价增涨率,单位为%
+        $('#costGrowthRate').val(propertyInfo.costGrowthRate ? propertyInfo.costGrowthRate * 100 : 0);
+        //增涨计费年限
+        $('#growthPeriod').val(propertyInfo.growthPeriod ? propertyInfo.growthPeriod : 0);
+    }
+});
+
+function isKeyNumber(keyCode) {
+    // 数字
+    if (keyCode >= 48 && keyCode <= 57 ) {
+        return true;
+    } else if (keyCode >= 96 && keyCode <= 105) { //小键盘数字
+        return true;
+    } else if (keyCode == 8 || keyCode == 46 || keyCode == 37 || keyCode == 39 || keyCode == 108 || keyCode == 110) {  // Backspace, del, 左右方向键
+        return true;
+    } else if (keyCode >= 112 && keyCode <= 123) { //F1 -F12
+        return true;
+    }
+    return false;
+}
+
+//年造价增涨率
+$('#costGrowthRate').keydown(function (e) {
+    return isKeyNumber(e.keyCode);
+});
+//计费年限
+$("#growthPeriod").keydown(function (e) {
+    return isKeyNumber(e.keyCode);
 });
 
 //恢复默认列设置
@@ -2483,6 +2476,22 @@ $('#property_ok').click(function () {
         reCalcRations = true;
     };
 
+    //价差预备费,预算项目才有
+    if (project.property.valuationType === 'bill') {
+        let costGrowthRateV = $('#costGrowthRate').val(),
+            costGrowthRate = costGrowthRateV ? parseFloat(costGrowthRateV / 100) : 0,
+            growthPeriodV = $('#growthPeriod').val(),
+            growthPeriod = growthPeriodV ? parseFloat(growthPeriodV) : 0;
+        if (project.property.costGrowthRate !== costGrowthRate) {
+            properties['property.costGrowthRate'] = costGrowthRate;
+            reCalcBills = true;
+        }
+        if (project.property.growthPeriod !== growthPeriod) {
+            properties['property.growthPeriod'] = growthPeriod;
+            reCalcBills = true;
+        }
+    }
+
     //基本信息
     if(basicInfoView.toUpdate(basicInfoView.orgDatas, basicInfoView.datas)){
         let saveData = basicInfoView.toSaveDatas(basicInfoView.datas);
@@ -2559,9 +2568,6 @@ $('#property_ok').click(function () {
         };
     };
 
-    // for test.
-/*    console.log(mixDatas);
-    return; */
     function hasMixData() {
         return Object.keys(mixDatas.properties).length > 0 || mixDatas.options.updateData ||
             mixDatas.labourCoes.updateData || mixDatas.rations.length > 0 || mixDatas.bills.length > 0;
@@ -2575,6 +2581,8 @@ $('#property_ok').click(function () {
             if(mixDatas.properties.hasOwnProperty('property.billsCalcMode') ||
                 mixDatas.properties.hasOwnProperty('property.zanguCalcMode') ||
                 mixDatas.properties.hasOwnProperty('property.calcOptions')||
+                mixDatas.properties.hasOwnProperty('property.costGrowthRate')||
+                mixDatas.properties.hasOwnProperty('property.growthPeriod')||
                 mixDatas.properties.hasOwnProperty('property.billsQuantityDecimal')||
                 mixDatas.properties.hasOwnProperty('property.decimal')||
                 mixDatas.properties.hasOwnProperty('property.displaySetting')){