Browse Source

重构费率页面

zhangweicheng 7 years ago
parent
commit
6d415f429d

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

@@ -104,7 +104,7 @@ body {
     margin-left: 29px;
     background: #fff
 }
-.toolsbar,.toolsbar-f {
+.toolsbar,.toolsbar-f,.toolsbar_feeRate {
     border-bottom: 1px solid #ccc
 }
 .tools-btn {

+ 21 - 13
web/building_saas/fee_rates/fee_rate.html

@@ -1,27 +1,35 @@
 
 
 <div >
-<div class="toolsbar px-1">
+<div class="toolsbar_feeRate px-1 ">
     <div class="form-inline py-1">
         <label class="mx-2" >当前使用:<span id="feeRateFileName">费率1</span>(<a href="#" id="pop-lv"><span id="projectCount">3</span> 单位工程使用</a>)
             <a class="btn btn-sm ml-1" href="#" data-toggle="modal" data-target="#change-lv" id="changFeeRateFile"><i class="fa fa-exchange"></i> 选择其他</a>
             <a class="btn btn-sm ml-1" href="#" data-toggle="modal" id="saveAs" data-target="#copy-lv"><i class="fa fa-files-o"></i> 另存单独用</a></label>
     </div>
 </div>
-<div class="container-fluid">
-        <div class="row">
-            <div class="main-content col-lg-8 p-0">
-                <div class="form-inline py-1">
-                    <label class="mx-2" >基于&nbsp;&nbsp;<span id="feeRateLibName">重庆渝建发[2016]35号</span></label>
-                    <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 class=" grid  main-data-full-fl" id="divFee"></div>
-            </div>
-            <div class="col-lg-4 py-1">
-                <div class="py-1"><input type="checkbox" id="cascadeSet" checked >统一设置相同参数</div>
-                <div class="grid  main-data-full-fl" id="subRate"></div>
+<div class="toolsbar_feeRate px-1">
+    <div class="row" style="margin-left: 0px">
+        <div class="col-lg-8 p-0">
+            <div class="form-inline py-1">
+                <label class="mx-2" >基于&nbsp;&nbsp;<span id="feeRateLibName">重庆渝建发[2016]35号</span></label>
+                <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="form-inline py-1" style="margin-top: 5px"><input type="checkbox" id="cascadeSet" checked >  <label class="mx-2" >统一设置相同参数</label></div>
+        </div>
+    </div>
+</div>
+<div class="container-fluid">
+    <div class="row ">
+        <div class="col-lg-8 p-0 ">
+            <div class="grid main-data-full-feeRate" id="divFee"></div>
+        </div>
+        <div class="col-lg-4 p-0">
+            <div class="grid main-data-full-feeRate" id="subRate"></div>
+        </div>
+    </div>
 </div>
 <!--弹出更换-->
 <div class="modal fade" id="change-lv" data-backdrop="static">

+ 3 - 1
web/building_saas/js/global.js

@@ -3,6 +3,7 @@ function autoFlashHeight(){
     var headerHeight = $(".header").height();
     var toolsbarHeight = $(".toolsbar").height();
     var ftoolsbarHeight = $(".toolsbar-f").height();
+   // var feeRateToolsbarHeight = $(".toolsbar_feeRate").height();
     var bottomContentHeight = $(".bottom-content").height();
     var toolsBarHeightQ = $(".tools-bar-height-q").height();
     var toolsBarHeightD = $(".tools-bar-height-d").height();
@@ -11,6 +12,7 @@ function autoFlashHeight(){
     $(".main-data-top").height($(window).height()-headerHeight-toolsbarHeight-bottomContentHeight-1);
     $(".main-data-full").height($(window).height()-headerHeight-toolsbarHeight-1);
     $(".main-data-full-fl").height($(window).height()-headerHeight-toolsbarHeight-37);
+    $(".main-data-full-feeRate").height($(window).height()-headerHeight-78);
     $(".main-data-not").height($(window).height()-headerHeight-1);
     $(".main-data-side-search").height($(window).height()-headerHeight-toolsbarHeight-64);
     $(".side-content").height($(window).height()-headerHeight );
@@ -19,9 +21,9 @@ function autoFlashHeight(){
     $(".form-list").height($(window).height()-headerHeight-50 );
 
 };
-$(window).resize(autoFlashHeight);
 /*全局自适应高度结束*/
 $(function () {
+    $(window).resize(autoFlashHeight);
     /*侧滑*/
   /*  $(".open-sidebar").click(function () {
         $(".slide-sidebar").animate({width: "800"}).addClass("open");

+ 34 - 22
web/building_saas/main/js/models/fee_rate.js

@@ -144,11 +144,12 @@ var FeeRate = {
             var errCallBack=function () {
                 me.dataRecovery();
                 $.bootstrapLoading.end();
-            }
+            };
+            $.bootstrapLoading.start();
             CommonAjax.post('/feeRates/updateRates', data, function (result) {
                 _.forEach(items,function (t) {
-                     feeRateObject.mainViews.data.updateItem(t.rateIndex,t.rate);
-                 })
+                    feeRateObject.mainFeeRateSheet.setValue(t.rateIndex, 1, t.rate.rate);
+                 });
                  me.onFeeRateFileChange();
                 $.bootstrapLoading.end();
             },errCallBack);
@@ -370,10 +371,7 @@ var FeeRate = {
                         if(data.hasOwnProperty('feeRate')){
                             rate.rate=fee_value;
                             me.onFeeRateChange(rate.ID,fee_value);
-                        }/*else {
-                            bill.feeRate=value;
-                            projectObj.mainController.refreshTreeNode([node])
-                        }*/
+                        }
                     });
                 }else {
                     projectObj.mainController.refreshTreeNode([node]);
@@ -385,7 +383,7 @@ var FeeRate = {
             var value= number_util.checkNumberValue(value,getDecimal("feeRate"));
             if(value){
                 if(editInfo.calcItem.feeRateID){
-                    var rate = projectObj.project.FeeRate.getFeeRateByID(editInfo.calcItem.feeRateID);
+                    var rate = this.getFeeRateByID(editInfo.calcItem.feeRateID);
                     if(rate!=undefined){
                         this.updateFeeRateByCalc(rate,value);
                         return;
@@ -407,20 +405,34 @@ var FeeRate = {
         };
         FeeRate.prototype.updateFeeRateByCalc=function (rate,value) {
             var me=this;
-            var data={
-                query:{
-                    'ID':this.getActivateFeeRateID(),
-                    'rates.ID':rate.ID
-                },
-                doc:{
-                    'rates.$.rate':value
-                }
-            }
-            CommonAjax.post('/feeRates/updateFeeRate', data, function (data) {
-                rate.rate=value;
+            me.updateFeeRateByID(rate.ID,{'rate':value},function () {
                 me.onFeeRateChange(rate.ID,value);
-            });
-        }
+            })
+        };
+
+        FeeRate.prototype.updateFeeRateByID = function (rateID,doc,callback) {
+          let me = this,preKey = 'rates.$.';
+          let data = {
+              query:{
+                  'ID':me.getActivateFeeRateID(),
+                  'rates.ID':rateID
+              },
+              doc:{}
+          };
+          for(let prop in doc){//做了个转换,加上前缀
+            data.doc[preKey+prop] = doc[prop];
+          }
+          CommonAjax.post('/feeRates/updateFeeRate', data, function (data) {
+              //更新缓存
+              let rate = me.getFeeRateByID(rateID);
+              for(let dkey in doc){
+                  rate[dkey] = doc;
+              }
+            if(callback){
+                callback();
+            }
+          });
+        };
 
         FeeRate.prototype.getfbUpdateData=function (rate,bill,value,editText) {
             var data=null;
@@ -486,7 +498,7 @@ var FeeRate = {
                             feeRateID:rate.ID
                         }
                     }
-                }
+                };
             this.setFeeRateToBill(data,callback);
         };
 

+ 107 - 33
web/building_saas/main/js/views/fee_rate_view.js

@@ -5,6 +5,19 @@
 
 
 var feeRateObject={
+    mainFeeRateSpread:null,
+    mainFeeRateSheet:null,
+    mainFeeRateData:null,
+    mainFeeRateSetting:{
+        header: [
+            {headerName: "专业名称", headerWidth: 550, dataCode: "name", dataType: "String"},
+            {headerName: "值%", headerWidth: 250, dataCode: "rate", dataType: "Number",hAlign: "right",decimalField:"feeRate"},
+            {headerName: "备注", dataCode: "memo", dataType: "String"}
+        ],
+        view: {
+            lockColumns: [0]
+        }
+    },
     mainViews:null,
     datas:null,
     datasBackup:null,
@@ -19,7 +32,7 @@ var feeRateObject={
     sheetSetting: {
         header: [
             {headerName: "专业名称", headerWidth: 200, dataCode: "name", dataType: "String"},
-            {headerName: "值%", headerWidth: 150, dataCode: "rate", dataType: "Number",hAlign: "right",decimalField:"feeRate"},
+            {headerName: "值%", headerWidth: 120, dataCode: "rate", dataType: "Number",hAlign: "right",decimalField:"feeRate"},
             {headerName: "备注", dataCode: "memo", dataType: "String"}
         ],
         view: {
@@ -124,10 +137,7 @@ var feeRateObject={
         feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellClick,feeRateObject.onCellClick);
         feeRateObject.feeRateSheet.bind(GC.Spread.Sheets.Events.CellDoubleClick,feeRateObject.onCellDoubleClick);
     },
-    showSelectTree:function () {
-        var sheet= feeRateObject.feeRateSheet;
-        var setting=feeRateObject.sheetSetting;
-        var data = projectObj.project.FeeRate.getActivateFeeRate().rates;
+    showSelectTree:function (sheet,setting,data) {
         var ch = GC.Spread.Sheets.SheetArea.viewport;
         var groups=[];
         sheet.suspendPaint();
@@ -370,38 +380,100 @@ var feeRateObject={
         this.mainViews.invalidate();
         document.querySelector('#divFee').focus();
     },
+    initFeeRateSpread:function (rowCount) {
+        //初始化费用项表格
+        this.mainFeeRateSpread = sheetCommonObj.buildSheet($('#divFee')[0], this.mainFeeRateSetting,rowCount);
+        this.mainFeeRateSpread.options.scrollbarMaxAlign = true;
+        this.mainFeeRateSheet = this.mainFeeRateSpread.getSheet(0);
+        sheetCommonObj.lockCells(this.mainFeeRateSheet , this.mainFeeRateSetting);
+        this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onMainFeeRateSheetValueChange);
+        this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onMainFeeRateSelectChanged);
+        this.mainFeeRateSheet.bind(GC.Spread.Sheets.Events.EditStarting, function (e,args) {
+            let me =feeRateObject, row = args.row;
+            let recode = me.mainFeeRateData[row];
+            let dataCode = me.mainFeeRateSetting.header[args.col].dataCode;
+            if(dataCode=="rate"&&me.getChildrenCount(recode.ID,me.mainFeeRateData)>0){//有子节点时不能编辑费率列
+                args.cancel = true;
+            }
+        });
+        this.mainFeeRateSheet.name('mainFeeRateSheet');
+    },
+    showMainFeeRateData:function () {
+        let me = this;
+        me.activateFeeRate = projectObj.project.FeeRate.getActivateFeeRate();
+        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);
+    },
     reFreshRateViews:function() {
-        feeRateObject.createSpreadView();
+        //feeRateObject.createSpreadView();
+        feeRateObject.loadPageContent();
+        this.showMainFeeRateData();
+        if(subRateObject.subRateSpread){//如果子费率没有初始化过的话,不需要显示。
+            subRateObject.initSubRateSpread(this.mainFeeRateData[0]);
+        }
+    },
+    onMainFeeRateSheetValueChange:function (e,info) {
+        let me = feeRateObject,updateData = {},feeRate = projectObj.project.FeeRate;
+        let recode = me.mainFeeRateData[info.row];
+        let fieldID = me.mainFeeRateSetting.header[info.col].dataCode;
+        let value = info.newValue;
+        if(fieldID == 'rate'&&value != null){
+            if(number_util.isNumber(parseFloat(value))){
+                value = scMathUtil.roundForObj(value,getDecimal("feeRate"));
+            }else {
+                alert('当前输入的数据类型不正确,请重新输入。');
+                me.mainFeeRateSheet.setValue(info.row, info.col, info.oldValue);
+                return;
+            }
+        }
+        if(recode[fieldID] == value){//没有改变
+            return;
+        }
+        updateData[fieldID] = value;
+        $.bootstrapLoading.start();
+         feeRate.updateFeeRateByID(recode.ID,updateData,function () {
+            if(fieldID == 'rate'){
+                feeRate.onFeeRateChange(recode.ID,value);
+            }
+            $.bootstrapLoading.end();
+        })
+    },
+
+    onMainFeeRateSelectChanged:function (e, info) {
+        let me = feeRateObject;
+        let row = info.newSelections[0].row;
+        if(row!=-1){
+            subRateObject.initSubRateSpread(me.mainFeeRateData[row]);
+        }
     },
     updateBySelect:function (rate,selectMap,mapID) {
-       var selected = this.mainViews.getSelections()[0];
+        let selected = this.mainFeeRateSheet.getSelections()[0];
         projectObj.project.FeeRate.backupDatas();
-       var item = this.datas[selected.sourceRow];
+        let item = this.mainFeeRateData[selected.row];
         item.rate = rate;
-        _.forEach(selectMap,function (value,key) {
-            var recode =  item.subFeeRate.recodes[key];
-            var optionList = recode.optionList;
-            _.forEach(optionList,function (o) {
-                if(o.value==value){
+        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;
                 }
-            })
-        })
+            }
+        }
         if($('#cascadeSet').prop('checked')){
-            this.cascadeSetRates(item,selected.sourceRow,mapID,selectMap)
+            this.cascadeSetRates(item,selected.row,mapID,selectMap);
         }else {
-            this.mainViews.data.updateItem(selected.sourceRow,item);
+            projectObj.project.FeeRate.batchUpdateFeeRate([{rateIndex:selected.row,rate:item}],feeRateObject.activateFeeRate);
         }
-        //projectObj.project.FeeRate.synchronizeFeeRate();
-
-        //this.views.data.updateItem()
     },
     cascadeSetRates:function(selectedItem,sourceRow,mapID,selectMap){
         var items=[];
         items.push({rateIndex:sourceRow,rate:selectedItem});
-        _.forEach(this.datas,function (recode,Index) {
+        _.forEach(this.mainFeeRateData,function (recode,Index) {
             if(Index!=sourceRow&&recode.subFeeRate){
                 var valueMaps = recode.subFeeRate.valueMaps;
                 var valueMap = _.find(valueMaps,{ID:mapID});
@@ -415,7 +487,7 @@ var feeRateObject={
                             var optionList = tempRecode.optionList;
                             _.forEach(optionList,function (o) {
                                 if(o.value==value){
-                                    o.selected=true;
+                                    o.selected = true;
                                 }else {
                                     o.selected = false;
                                 }
@@ -493,10 +565,8 @@ var feeRateObject={
     changeFeeRateStandard:function(newVal){
         $.bootstrapLoading.start();
         var callback=function () {
-            feeRateObject.createSpreadView();
-            feeRateObject.loadPageContent();
-            projectObj.project.FeeRate.synchronizeFeeRate();
-            subRateObject.destorySpreadView();
+            feeRateObject.reFreshRateViews();
+            projectObj.project.FeeRate.onFeeRateFileChange();
             $.bootstrapLoading.end();
         };
         projectObj.project.FeeRate.changeFeeRateStandard(newVal,callback);
@@ -595,8 +665,8 @@ var feeRateObject={
             name:name
         }
         var callback=function () {
-            feeRateObject.createSpreadView();
-            feeRateObject.loadPageContent();
+            //feeRateObject.createSpreadView();
+            feeRateObject.reFreshRateViews();
             projectObj.project.FeeRate.onFeeRateFileChange();
             $.bootstrapLoading.end();
         }
@@ -621,8 +691,7 @@ var feeRateObject={
     changeFeeRateFileConfirm:function(feeRateFileID,name){
         $.bootstrapLoading.start();
         var callback=function () {
-            feeRateObject.createSpreadView();
-            feeRateObject.loadPageContent();
+            feeRateObject.reFreshRateViews();
             projectObj.project.FeeRate.onFeeRateFileChange();
             $.bootstrapLoading.end();
         }
@@ -670,6 +739,7 @@ var feeRateObject={
         var data={'projectID': projectObj.project.ID(),'templatesID': calInfo.template.ID,'calcItem': calInfo.calcItem};
         $.bootstrapLoading.start();
         calcProgramManage.saveCalcItem(data,function (result) {
+            $.bootstrapLoading.end();
             calInfo.calcItem.feeRate=rate.rate;
             projectObj.project.calcProgram.compileAllTemps();
             projectObj.project.calcProgram.calcAllNodesAndSave();
@@ -715,9 +785,13 @@ $(function(){
     );
 
     $('#tab_fee_rate').on('shown.bs.tab', function (e) {
+        let me = feeRateObject;
         $(e.relatedTarget.hash).removeClass('active');
-        feeRateObject.reFreshRateViews();
-        feeRateObject.loadPageContent();
+        if(me.mainFeeRateSpread == null){
+            me.initFeeRateSpread(0);
+        }
+        me.showMainFeeRateData();
+        me.loadPageContent();
     });
 
     $('#setNewFeeRate').bind('click', function () {
@@ -844,7 +918,7 @@ $(function(){
             feeRateObject.createSheet();
         }
         feeRateObject.feeRateSelection=null;
-        feeRateObject.showSelectTree();
+        feeRateObject.showSelectTree(feeRateObject.feeRateSheet,feeRateObject.sheetSetting,projectObj.project.FeeRate.getActivateFeeRate().rates);
     });
 
     $('#fee_rate_tree').on('hidden.bs.modal', function (e) {

+ 74 - 1
web/building_saas/main/js/views/sub_fee_rate_views.js

@@ -7,6 +7,23 @@ var subRateObject={
     datas:null,
     valueMap:null,
     canEdit:true,
+    subRateSpread:null,
+    subRateSheet:null,
+    subRateSetting:{
+        header: [
+            {headerName: "参数名称", headerWidth: 250, dataCode: "name", dataType: "String"},
+            {headerName: "参数值", headerWidth: 200, dataCode: "optionValue", dataType: "String",getText:'forOption'}
+        ],
+        view: {
+            lockColumns: [0]
+        },
+        getText:{
+            forOption:function (item,val) {
+                let o = _.find(item.optionList,{'selected':true});
+                return o?o.value:'';
+            }
+        }
+    },
     columns: [
         {
             id: 'name',
@@ -59,11 +76,48 @@ var subRateObject={
         this.addComboboxOption(this.datas);
 
     },
-       reFreshRateViews:function(sender,args) {
+    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]);
+            this.subRateSheet = this.subRateSpread.getSheet(0);
+            sheetCommonObj.initSheet(this.subRateSheet, this.subRateSetting, 30);
+            this.subRateSheet.bind(GC.Spread.Sheets.Events.SelectionChanged, this.onSubRateSelectChanged);
+            this.subRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, this.onSubRateValueChange);
+            //this.subRateSheet.bind(GC.Spread.Sheets.Events.ValueChanged, me.onSheetValueChange);
+            this.subRateSheet.name('subRateSheet');
+        }
+        subRateObject.datas = projectObj.project.FeeRate.getSubViewData(item);
+        subRateObject.valueMap=projectObj.project.FeeRate.getValueMap(item);
+        console.log(subRateObject.datas);
+        console.log(subRateObject.valueMap);
+        subRateObject.showSubRateData();
+    },
+    showSubRateData:function () {
+        this.subRateSheet.setRowCount(0);
+        sheetCommonObj.showData(this.subRateSheet, this.subRateSetting, this.datas);
+        this.subRateSheet.setRowCount(this.datas.length);
+        for(let row =0; row < this.datas.length;row++){
+            this.setComboOptionCell(row,1,this.datas[row],this.subRateSheet);
+        }
+    },
+    onSubRateSelectChanged:function (e,info) {
+        info.sheet.repaint();
+    },
+    setComboOptionCell:function(row,col,subRate,sheet){
+        let options=[];
+        for(let op of subRate.optionList){
+            options.push({text:op.name,value:op.value});
+        }
+        let dynamicCombo = sheetCommonObj.getDynamicCombo();//new GC.Spread.Sheets.CellTypes.ComboBox();
+        dynamicCombo.items(options);
+        dynamicCombo.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
+        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) {
@@ -94,6 +148,25 @@ var subRateObject={
             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;
+                }
+                selectValueList.push(selectMap[key]);
+            })
+            var mapID =selectValueList.join('-');
+            var rate = me.valueMap[mapID];
+            feeRateObject.updateBySelect(rate,selectMap,mapID);
+        }
+    },
+
     destorySpreadView:function () {
         if(this.views){
             this.views.destroy();