فهرست منبع

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/YangHuCost

zhongzewei 7 سال پیش
والد
کامیت
a8c459f1c0

+ 1 - 1
socketdockerfile

@@ -6,6 +6,6 @@ COPY . /home/ConstructionCost
 
 RUN cnpm install 
 
-EXPOSE 3300
+EXPOSE 5500
 
 ENTRYPOINT babel-node socket.js

+ 2 - 2
web/building_saas/fee_rates/fee_rate.html

@@ -16,9 +16,9 @@
                 <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#set-lv" id="setNewFeeRate"><i class="fa fa-cog"></i> 重选标准</a>
             </div>
         </div>
-        <div class="col-lg-4 p-0">
+        <!--<div class="col-lg-4 p-0">
             <div class="form-inline py-1" style="margin-top: 5px"><input type="checkbox" id="cascadeSet" checked >  <label class="mx-2" >统一设置相同参数</label></div>
-        </div>
+        </div>-->
     </div>
 </div>
 <div class="container-fluid">

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

@@ -254,7 +254,9 @@ const fixedFlag = {
     //施工机械
     CONSTRUCTION_MACHINE:25,
     //暂列金额
-    PROVISIONAL:26
+    PROVISIONAL:26,
+    //安全生产费
+    SAFE_COST:27
 };
 
 const gljKeyArray =['code','name','specs','unit','type'];

+ 92 - 18
web/building_saas/main/js/views/fee_rate_view.js

@@ -543,28 +543,102 @@ var feeRateObject={
             subRateObject.initSubRateSpread(me.mainFeeRateData[row]);
         }
     },
-    updateBySelect:function (rate,selectMap,mapID) {
-        let selected = this.mainFeeRateSheet.getSelections()[0];
-        projectObj.project.FeeRate.backupDatas();
-        let item = this.mainFeeRateData[selected.row];
-        item.rate = rate;
-        for(let key in selectMap){
-            let recode =  item.subFeeRate.recodes[key];
-            let optionList = recode.optionList;
-            for(let o of optionList){
-                if(o.value==selectMap[key]){
-                    o.selected=true;
-                }else {
-                    o.selected = false;
+    setRateFromSub:function (subRate,value,subList) {
+         let me = feeRateObject,feeRate =  projectObj.project.FeeRate;
+         let rates = feeRate.getActivateFeeRate().rates;
+         let updateDatas = [];
+         //对于有子节点的记录和可输入的记录,只支持一个参数(因为还要内插法取费率值),如果要支持两个以上的参数,valueMap要再改下~~~~
+         for(let r of rates){
+             if(gljUtil.isDef(r.subFeeRate)){
+                 let valueArray=[];//用来存参数的值
+                 let temP =null;//这个用来存储需要内插法记算的时候,同时,树节点的子节点改变也计在这里, 这样,改变temP的值,会体现在保存subRecode
+                 let match = false;
+                 let temR = _.cloneDeep(r);//临时存储
+                 for(let p of temR.subFeeRate.recodes){
+                     if(p.name == subRate.name){
+                         temP = p;
+                         match = true;
+                     }
+                     let setValue = false;
+                     for(let o of p.optionList){
+                         if(match == true) {//匹配上了,改对应的selected 为 true
+                             if(o.name == value){
+                                 o.selected = true;
+                                 valueArray.push(value);
+                                 setValue = true;
+                             }else {
+                                 o.selected = false;
+                             }
+                         }else {//没有匹配上的,直接取值就可以
+                             if(o.selected == true)  valueArray.push(o.name);
+                         }
+                     }
+                     if(match==true && setValue ==false) valueArray.push(value);//如果匹配上了,但是setValue为false,说明没有满足和选项,要用内插法或超出倍数算值
+                 }
+                 if(match == true){//说明要改rate的值,先从valueMap中去查
+                     if(subList && temP.subList && temP.subList.length > 0){
+                         temP.subList = subList;// 设置树节点的子节点的值
+                     }
+                     let doc = {"subFeeRate":temR.subFeeRate};
+                     let valueKey = valueArray.join('-');
+                     let valueMaps = r.subFeeRate.valueMaps;
+                     let rate = _.find(valueMaps,{"ID":valueKey});
+                     if(isDef(rate)) {//找到了,直接改费率值
+                         doc.rate = rate.value;
+                     }else {//没找到,用内插法或步长算值
+                         let ltRate = null;//
+                         let gtRate = null;
+                         let lastRate = null;
+                         temP.value = scMathUtil.roundForObj(value,getDecimal("feeRate")) ;
+                         for(let v of valueMaps){
+                            if(parseFloat(v.value)<parseFloat(value)){
+                                ltRate = v;
+                            }else if(parseFloat(v.value)>parseFloat(value)){
+                                gtRate = v;
+                            }
+                            lastRate = v;
+                         }
+                         if(gljUtil.isDef(ltRate)&&gljUtil.isDef(gtRate)){//已经找到前后的值了
+                             let step = scMathUtil.roundForObj(gtRate.value - ltRate.value,getDecimal("process"))
+                             let total =  parseInt(gtRate.ID) - parseInt(ltRate.ID)
+                             doc.rate =getRateByStep(ltRate.value,total,parseFloat(value) - parseInt(ltRate.ID),step);
+                         }else if(gljUtil.isDef(ltRate)&&gtRate == null){//说明是超出了选项的最大值
+                             let share = parseFloat(value) - parseInt(ltRate.ID);//超出了多少
+                             doc.rate = getRateByStep(ltRate.value,temP.step,share,temP.amount)
+                         }
+                     }
+                     if(isDef(doc.rate)){
+                         updateDatas.push({rateID:r.ID,doc:doc});
+                         me.sumParentRate(r.ID,doc.rate,updateDatas);
+                     }
+                 }
+             }
+         }
+         console.log(updateDatas);
+        if(updateDatas.length > 0){
+            $.bootstrapLoading.start();
+            feeRate.updateFeeRatesByIDs(updateDatas,function () {
+                let feerateInfo = [];
+                for(let u of updateDatas){
+                    feerateInfo.push({rateID:u.rateID,value:u.doc["rate"]});
                 }
-            }
+                subRateObject.showSubRateData();
+                me.showMainFeeRateData();
+                feerateInfo.length > 0 ?feeRate.onFeeRatesChange(feerateInfo):'';
+                $.bootstrapLoading.end();
+            })
         }
-        if($('#cascadeSet').prop('checked')){
-            this.cascadeSetRates(item,selected.row,mapID,selectMap);
-        }else {
-            projectObj.project.FeeRate.batchUpdateFeeRate([{rateIndex:selected.row,rate:item}],feeRateObject.activateFeeRate);
+        function getRateByStep(ltValue,total,share,step) {
+            let p = scMathUtil.roundForObj(share/total,getDecimal("process"));
+            let a = scMathUtil.roundForObj(step * p,getDecimal("process")) ;
+            return scMathUtil.roundForObj(ltValue + a,getDecimal("feeRate"))
         }
+
+
+
     },
+
+
     cascadeSetRates:function(selectedItem,sourceRow,mapID,selectMap){
         let items=[];
         items.push({rateIndex:sourceRow,rate:selectedItem});

+ 2 - 2
web/building_saas/main/js/views/quantity_edit_view.js

@@ -102,10 +102,10 @@ let quantityEditObj = {
 
         QuantityEditCellType.prototype.processMouseDown = function (hitinfo) {
             let me=quantityEditObj;
-            if(isDoubleClick(this) == true && !projectReadOnly){//如果是双击,直接显示
+           /* if(isDoubleClick(this) == true && !projectReadOnly){//如果是双击,直接显示 2019-1-17 需求更改,取消双击弹出
                 me.showSelectModal(hitinfo);
                 return ;
-            }
+            }*/
            if(me.editingCell && hitinfo.row==me.editingCell.row){
                if(me.editingCell.isBtn == false){//是第一次点击,刷新显示按钮
                    me.editingCell.isBtn = true;

+ 42 - 79
web/building_saas/main/js/views/sub_fee_rate_views.js

@@ -21,36 +21,14 @@ var subRateObject={
             forOption:function (item,val) {
                 if(item.isSub == true) return item.value;//可编辑子节点
                 let o = _.find(item.optionList,{'selected':true});
-                return o?o.name:'';
+                if(gljUtil.isDef(o)){
+                    return o.name;
+                }else {
+                    if(item.editable==true) return item.value;
+                }
             }
         }
     },
-    columns: [
-        {
-            id: 'name',
-            caption: '参数名称',
-            dataField: 'name',
-            width: 250,
-            allowEditing: false
-        },
-        {
-            id: 'typeName',
-            caption: '参数值',
-            dataField: 'typeName',
-            width: 200,
-            minWidth: 50,
-            allowEditing: true,
-            presenter:'<div><select class="form-control form-control-sm" id="{{=it.ID}}" onchange="subRateObject.subRateChange(this)" style="width: 100%">  </select></div>'
-        },
-        {
-            id: 'ID',
-            caption: 'ID',
-            dataField: 'ID',
-            width: 80,
-            visible: false,
-            allowEditing: false
-        }
-    ],
     options :{
         allowSorting: false,
         showRowHeader: true,
@@ -61,27 +39,6 @@ var subRateObject={
         editUnit: 'cell',
         selectionUnit:(this.canEdit == true) ? "cell" : "row"
     },
-    createSpreadView:function () {
-        if (this.views) {
-            this.views.destroy();
-            this.views = null;
-        }
-        this.views = new GC.Spread.Views.DataView($('#subRate')[0],
-            this.datas, this.columns, new GC.Spread.Views.Plugins.GridLayout(this.options));
-
-        this.views["rowDbClick"].addHandler(function () {
-            console.log('hh')
-        });
-        this.views.invalidate();
-        document.querySelector('#subRate').focus();
-        this.addComboboxOption(this.datas);
-
-    },
-    reFreshRateViews:function(sender,args) {
-        subRateObject.datas = projectObj.project.FeeRate.getSubViewData(args.item);
-        subRateObject.valueMap=projectObj.project.FeeRate.getValueMap(args.item);
-        subRateObject.createSpreadView();
-    },
     initSubRateSpread:function (item) {
         if(this.subRateSpread == null){
             this.subRateSpread = SheetDataHelper.createNewSpread($("#subRate")[0]);
@@ -93,7 +50,6 @@ var subRateObject={
             //this.subRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, me.onSheetValueChange);
             this.subRateSheet.name('subRateSheet');
         }
-        subRateObject.datas = projectObj.project.FeeRate.getAllSubRates();
         //subRateObject.valueMap=projectObj.project.FeeRate.getValueMap(item);
         subRateObject.showSubRateData();
         disableRightMenu("subRate",this.subRateSpread);
@@ -105,6 +61,8 @@ var subRateObject={
         }
     },
     showSubRateData:function () {
+        let preSelections = this.subRateSheet.getSelections();
+        this.datas = projectObj.project.FeeRate.getAllSubRates();
         this.subRateSheet.setRowCount(0);
         sheetCommonObj.showData(this.subRateSheet, this.subRateSetting, this.datas);
         this.subRateSheet.setRowCount(this.datas.length);
@@ -118,6 +76,9 @@ var subRateObject={
         }
         this.subRateSheet.resumeEvent();
         this.subRateSheet.resumePaint();
+        if(preSelections){//定位光标到之前的位置
+            this.subRateSheet.setSelection(preSelections[0].row,preSelections[0].col,preSelections[0].rowCount,preSelections[0].colCount);
+        }
     },
     onSubRateSelectChanged:function (e,info) {
         info.sheet.repaint();
@@ -159,39 +120,41 @@ var subRateObject={
             $('#'+item.ID).val(selectvalue);
         })
     },
-    subRateChange:function(select){
-        let me = subRateObject;
-        let selectValueList=[];
-        let selectMap={};
-        if(me.datas&&me.datas.length>0){
-            $.bootstrapLoading.start();
-            _.forEach(me.datas,function (d,key) {
-                let selectValue = $('#'+d.ID).val();
-                selectValueList.push(selectValue);
-                selectMap[key]=selectValue;
-            })
-            let mapID =selectValueList.join('-');
-            let rate = me.valueMap[mapID];
-            feeRateObject.updateBySelect(rate,selectMap,mapID);
-        }
-    },
     onSubRateValueChange:function (e,info) {
-        console.info(info);
-        let me = subRateObject, selectValueList=[],selectMap={};
-        if(me.datas&&me.datas.length>0){
-            _.forEach(me.datas,function (d,key) {
-                if(info.row == key){
-                    selectMap[key]=info.newValue;
-                }else {
-                    let o = _.find(d.optionList,{'selected':true});
-                    selectMap[key]=o.value;
+        let me = subRateObject, subList=null;
+        let value = info.newValue;
+        let subRate = me.datas[info.row];
+        if(subRate.editable == true || subRate.isSub == true){//是可编辑的,要检查数据类型
+            let checkResult = scMathUtil.isNumOrFormula(value);
+            if(checkResult!=null && !isNaN(checkResult)){
+                value = scMathUtil.roundForObj(checkResult,getDecimal("feeRate"));
+            }else {
+                alert('当前输入的数据类型不正确,请重新输入。');
+                me.showSubRateData();
+                return;
+            }
+        }
+
+        if(subRate.isSub == true){//是树节点的子节点,计算父节点的值
+            let parentRate = _.find(me.datas,{"ID":subRate.ParentID});//找到父节点
+            if(parentRate){
+                let sum = 0;
+                subList = _.cloneDeep(parentRate.subList);
+                for(let s of subList){//按比例计算
+                    if(s.ID == subRate.ID) s.value = value;//当前项要用新输入的值
+                    let v_a = scMathUtil.roundForObj(s.value * s.amount,getDecimal("process"))
+                    sum = scMathUtil.roundForObj(sum + v_a,getDecimal("feeRate"));
                 }
-                selectValueList.push(selectMap[key]);
-            })
-            let mapID =selectValueList.join('-');
-            let rate = me.valueMap[mapID];
-            feeRateObject.updateBySelect(rate,selectMap,mapID);
+                value = sum;
+                subRate = parentRate;//把subRate 指向parentRate
+            }
+        } else if(subRate.subList && subRate.subList.length > 0){//输入树节结的父结点,子结点都等于父节点的值
+            subList = _.cloneDeep(subRate.subList);
+            for(let t of subList){
+                t.value = value
+            }
         }
+        feeRateObject.setRateFromSub(subRate,value,subList);
     },
 
     destorySpreadView:function () {

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

@@ -11,7 +11,7 @@ let zmhs_obj = {
         header: [
             {headerName: "调整", headerWidth: 35, dataCode: "isAdjust", dataType: "String", cellType: "checkBox"},
             {headerName: "条件", headerWidth: 180, dataCode: "name", dataType: "String", cellType: "button",getText:'forName'},
-            {headerName: "内容", headerWidth: 70, dataCode: "content", dataType: "String", hAlign: "left",getText:'forContent'}
+            {headerName: "内容", headerWidth: 70, dataCode: "content", dataType: "String", hAlign: "left",getText:'forContent',cellType:'tipsCell'}
         ],
         view: {
             lockColumns:[0,1,2],
@@ -36,7 +36,7 @@ let zmhs_obj = {
         },
         emptyRowHeader: true,
         autoFit:true,
-        fitRow:['name','content']
+        fitRow:['name']
     },
     cusSpread:null,
     cusSheet:null,
@@ -112,6 +112,7 @@ let zmhs_obj = {
         }
     },
     showCoeData:function (node) {
+        let preSelections = this.coeSheet.getSelections();
         let selected = node?node:projectObj.project.mainTree.selected;
         let ration_coe = projectObj.project.ration_coe;
         let coeList = [];
@@ -141,6 +142,9 @@ let zmhs_obj = {
         if(projectReadOnly){
             disableSpread(zmhs_obj.coeSpread);
         }
+        if(preSelections){//定位光标到之前的位置
+            this.coeSheet.setSelection(preSelections[0].row,preSelections[0].col,preSelections[0].rowCount,preSelections[0].colCount);
+        }
     },
     showCusData:function (node) {
         let selected = node?node:projectObj.project.mainTree.selected;