Ver código fonte

Merge branch '1.0.0_online' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost into 1.0.0_online

zhongzewei 7 anos atrás
pai
commit
61ffbb5cbc

+ 21 - 12
modules/reports/rpt_component/jpc_cross_tab.js

@@ -109,7 +109,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
             let sIDX = 0;
             //1. prepare and sort by tab-field
             let fields = [];
-            JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.TAB_CROSS_FIELDS], fields, rstFieldsIdx);
+            JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.PROP_CROSS_FIELDS], fields, rstFieldsIdx);
             let data_details = dataObj[JV.DATA_DETAIL_DATA];
             JpcCrossTabHelper.sortTabFields(fields, rstFieldsIdx, data_details, dataSeq);
             //2. distinguish sort tab fields value
@@ -148,7 +148,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let result = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
         if (tab) {
-            JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.TAB_CROSS_FIELDS], null, rstFieldsIdx);
+            JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, tab[JV.PROP_CROSS_FIELDS], null, rstFieldsIdx);
         }
         for (let i = 0; i < rowSeq.length; i++) {
             let rl = rowSeq[i], cl = colSeq[i];
@@ -201,7 +201,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         me.sortedRowSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW, me.row_fields_idx);
         me.sortedColSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_COL, me.col_fields_idx);
         me.sortedContentSequence = private_SortForDisplayContent(rptTpl, me.sortedRowSequence, me.sortedColSequence, me.content_fields_idx);
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.TAB_CROSS_FIELDS], null, me.col_sum_fields_idx);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.PROP_CROSS_FIELDS], null, me.col_sum_fields_idx);
         //pre-sum the data(for col sum display)
         let data_details = dataObj[JV.DATA_DETAIL_DATA],
             data_fields = [];
@@ -240,8 +240,8 @@ JpcCrossTabSrv.prototype.createNew = function(){
             maxRowRec = JpcCrossTabHelper.getMaxRowsPerPage(bands, rptTpl);
             maxColRec = JpcCrossTabHelper.getMaxColsPerPage(bands, rptTpl);
         }
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.TAB_CROSS_FIELDS], null, me.row_extension_fields_idx);
-        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.TAB_CROSS_FIELDS], null, me.row_sum_extension_fields_idx);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.PROP_CROSS_FIELDS], null, me.row_extension_fields_idx);
+        JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.PROP_CROSS_FIELDS], null, me.row_sum_extension_fields_idx);
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             /*
             rst = segCnt;
@@ -323,7 +323,10 @@ JpcCrossTabSrv.prototype.createNew = function(){
     };
     JpcCrossTabResult.outputAsPreviewPage = function (rptTpl, bands, controls, $CURRENT_RPT) {
         let me = this, rst = [];
-        //...
+        let pageStatus = [true, true, true, true, true, true, true, true];
+        me.pageStatusLst.push(pageStatus);
+        // JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, false);
+        JpcBandHelper.setBandArea(bands, rptTpl, pageStatus, true, false);
         return rst;
     };
     JpcCrossTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, $CURRENT_RPT, customizeCfg) {
@@ -384,6 +387,12 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         return rst;
     };
+    JpcCrossTabResult.outputPreviewRowTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg) {
+        //
+    };
+    JpcCrossTabResult.outputPreviewColTab = function(rptTpl, bands, controls, $CURRENT_RPT, customizeCfg) {
+        //
+    };
     JpcCrossTabResult.outputRowTab = function(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
         let me = this, rst = [];
         let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW];
@@ -391,7 +400,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS];
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
                 let serialsIdx = me.dispSerialIdxLst_Row[page - 1];
@@ -431,7 +440,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS];
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 let flexiblePrecisionRefObj = null, flexibleRefField = null, precision_ref_data = null;
@@ -482,7 +491,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS];
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
                 let flexiblePrecisionRefObj = null, flexibleRefField = null, precision_ref_data = null;
@@ -524,7 +533,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS];
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS];
                 for (let i = 0; i < me.dispSumValueLst_Col[page - 1].length; i++) {
                     if (me.dispSumValueLst_Col[page - 1][i] !== null) {
                         for (let j = 0; j < me.dispSumValueLst_Col[page - 1][i].length; j++) {
@@ -562,7 +571,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS],
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS],
                     data_details = dataObj[JV.DATA_DETAIL_DATA],
                     valuesIdx = me.dispValueIdxLst_Col[page - 1];
                 for (let i = 0; i < me.row_extension_fields_idx.length; i++) {
@@ -598,7 +607,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
             if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true && pageStatus[JV.STATUS_CROSS_ROW_END] === true) {
-                let tab_fields = tab[JV.TAB_CROSS_FIELDS],
+                let tab_fields = tab[JV.PROP_CROSS_FIELDS],
                     data_details = dataObj[JV.DATA_DETAIL_DATA],
                     data_fields = [];
                 for (let i = 0; i < me.row_sum_extension_fields_idx.length; i++) {

+ 1 - 1
public/web/rpt_value_define.js

@@ -130,6 +130,7 @@ const JV = {
     PROP_DISCRETE_FIELDS: "discrete_field_s",
     PROP_FLOW_FIELDS: "flow_field_s",
     PROP_BILL_FIELDS: "bill_field_s",
+    PROP_CROSS_FIELDS: "cross_field_s",
     PROP_GROUP_FIELDS: "group_field_s", //用来分组的指标(如按清单、定额etc...)
     PROP_GROUP_LINES: "group_lines",    //显示分组行,因分组的特殊性,分组的数据当成流水数据一样(行高相同),group_lines里的每一条数据占用流水的一整行,里面再细分(指标/text)
     PROP_GROUP_SUM_KEYS: "SumKey_S",
@@ -177,7 +178,6 @@ const JV = {
     PROP_IS_ID: "isID",
     PROP_ID_SEQ: "IDSeq",
 
-    TAB_CROSS_FIELDS: "cross_field_s",
     TAB_FIELD_PROP_SORT: "Sort",
     TAB_FIELD_PROP_SORT_VAL_NOSORT: "no_sort",
     TAB_FIELD_PROP_SORT_VAL_ASC: "ascend",

+ 153 - 2
public/web/sheet/sheet_common.js

@@ -193,6 +193,10 @@ var sheetCommonObj = {
                 this.setReplaceButton(row,col,sheet,setting.header[col]);
             }
 
+            if(setting.header[col].cellType === "cusButton"){
+                this.setCusButton(row,col,sheet,setting);
+            }
+
             if(setting.header[col].cellType === "tipsCell"){
                 this.setTipsCell(row,col,sheet,setting.header[col]);
             }
@@ -468,6 +472,19 @@ var sheetCommonObj = {
         };*/
         sheet.setCellType(row, col,this.getSelectButton(header.headerWidth),GC.Spread.Sheets.SheetArea.viewport);
     },
+
+    setCusButton:function (row,col,sheet,setting) {
+        let functionName = setting.header[col].callback;
+        let readOnly = setting.disable[setting.header[col].disable];
+        if(typeof(readOnly) == 'function' ){
+            readOnly = readOnly(row,col);
+        }
+        if(functionName){
+            sheet.setCellType(row, col,this.getCusButtonCellType(setting.callback[functionName],readOnly));
+        }
+        //sheet.setCellType(row, col,this.getSelectButton(header.headerWidth),GC.Spread.Sheets.SheetArea.viewport);
+    },
+
     getCusButtonCellType:function (callback,readOnly=false) {
         var ns = GC.Spread.Sheets;
         function CusButtonCellType() {
@@ -482,8 +499,10 @@ var sheetCommonObj = {
                     var imageWidth = 25;
                     var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
                     ctx.save();
-                    ctx.fillStyle = style.backColor;
-                    ctx.fillRect(x,y,w,h);
+                    if(style.backColor){
+                        ctx.fillStyle = style.backColor;
+                        ctx.fillRect(x,y,w,h);
+                    }
                     ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
                     ctx.beginPath();
                     ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false);
@@ -752,7 +771,139 @@ var sheetCommonObj = {
         }
         return new getTipsCombo();
     },
+    getTreeNodeCellType:function (datas,row,parentMap) {// 2018-09-26  不用spreadjs默认的树结构,自定义控件
+        var ns = GC.Spread.Sheets;
+        let rectW = 10;
+        let rectH = 10;
+        let margin = 3;
+
+        function TreeNodeCellType() {
+            this.collapsed = gljUtil.isDef(datas[row].collapsed)?datas[row].collapsed: true; //默认是折叠的
+            this. treeNodeType = true;
+            this.rectInfo = {};
+        }
+        TreeNodeCellType.prototype = new ns.CellTypes.Text();
+        TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
+            let offset = 0;
+            let step = 7;
+            let level = getTreeLevel(datas[row],datas);//从0开始,取当前节点是第几级的
+            let tem = offset+margin+ rectW/2+step;//两条线之间的间隔
+            let t_offset = offset;
+            let temParentID = datas[row].ParentID;
+            if(this.treeNodeType == true){
+                for(let i = level;i>0;i--){//这里是画子节点前面的竖线,从第二级开始
+                    let temParent = getParent(temParentID,datas);
+                    if(temParent){//父节点有下一个兄弟节点才需要画
+                        if(hasNextBrother(parentMap,temParent)) sheetCommonObj.drawLine(ctx,x+t_offset+tem*i,y,x+t_offset+tem*i,y+h);
+                        temParentID = temParent.ParentID;
+                    }
+                    offset +=tem;
+                }
+            }
+            offset+=step; //这个没法移动,所以要两个判断
+            if(this.treeNodeType == true){
+                if(hasChildern(datas[row].ID,datas)){//如果是有子节点
+                    //第一条 或者没有父节点(如费率子表综合里程项)不用画方框头上那条竖线其它都要
+                    if(row !=0 && gljUtil.isDef(datas[row].ParentID)) sheetCommonObj.drawLine(ctx,x+offset+ rectW/2+margin,y,x+offset+ rectW/2+margin,y + Math.round(h / 2) - rectH / 2);
+                    //画方框下面的那条竖线,如果没有下一个兄弟节点,则不用画
+                    if(hasNextBrother(parentMap,datas[row])) sheetCommonObj.drawLine(ctx,x+offset+ rectW/2+margin,y + Math.round(h / 2) + rectH / 2,x+offset+ rectW/2+margin,y + h);
+                    sheetCommonObj.drowRect(ctx, x+offset, y, w, h,rectW,rectH,margin);
+                    sheetCommonObj.drowSymbol(ctx, x+offset, y, w, h,rectW,rectH,margin, this.collapsed);
+                    this.rectInfo = {x:x+offset+margin,rectW:rectW}//计录一下可点击位置
+                }else {
+                    let hasNext = datas[row+1]?datas[row+1].ParentID == datas[row].ParentID:false;
+                    sheetCommonObj.drowSubItem(ctx, x, y, w, h, offset,hasNext,margin+ rectW/2);
+                }
+            }
+            offset += step;
+            offset += rectW;
+            x = x + offset;//设置偏移
+            w = w - offset;
+            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
+        };
+        // override getHitInfo to allow cell type get mouse messages
+        TreeNodeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
+            return {
+                x: x,
+                y: y,
+                row: context.row,
+                col: context.col,
+                cellStyle: cellStyle,
+                cellRect: cellRect,
+                sheetArea: context.sheetArea
+            };
+        }
+        TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
+            ////方框外1像素内都有效
+            if (!_.isEmpty(this.rectInfo)&&Math.floor(hitinfo.x) <= this.rectInfo.x+this.rectInfo.rectW+2 && Math.floor(hitinfo.x) >= this.rectInfo.x-2) {
+                this.collapsed = !this.collapsed;
+                datas[row].collapsed = this.collapsed;
+                this.refreshChildrenVisible(hitinfo.sheet);
+                hitinfo.sheet.invalidateLayout();
+                hitinfo.sheet.repaint();
+            }
+        };
+        TreeNodeCellType.prototype.refreshChildrenVisible = function (sheet) {
+            sheet.suspendPaint();
+            sheet.suspendEvent();
+            refreshVisible(datas[row]);
+            sheet.resumeEvent();
+            sheet.resumePaint();
+            function refreshVisible(item){
+                if(parentMap[item.ID]){
+                    for(let sub of parentMap[item.ID]){
+                        refreshVisible(sub)
+                    }
+                }
+                let visible = getVisible(item);
+                let trow = datas.indexOf(item);
+                sheet.getRange(trow , -1, 1, -1).visible(visible);
+            }
 
+            function getVisible(item) {
+                if(item.ParentID){
+                    let parent = getParent(item.ParentID,datas);
+                    if(!parent) return true;
+                    let p_row= datas.indexOf(parent);
+                    let visible = !sheet.getCellType(p_row,0).collapsed;
+                    if(visible == true){ //如果是显示的,则要再往父节点的父节点检查,只要有一个节点是隐藏的,则都是隐藏
+                        return getVisible(parent);
+                    }else {
+                        return visible
+                    }
+                }else {//如果parentID 为空则是最根节点
+                    return true;
+                }
+            }
+
+
+        };
+        return new TreeNodeCellType()
+
+        function getTreeLevel(item,data) {
+            if(item.ParentID){
+                let pitem =  _.find(data,{'ID':item.ParentID});
+                return  getTreeLevel(pitem,data) + 1;
+            }else {
+                return 0
+            }
+        }
+        function hasChildern(ID,data) {//返回是否有子项
+            let p = _.find(data,{'ParentID':ID});
+            if(p) return true;
+            return false
+        }
+        function getParent(ParentID,data) {
+            let p = _.find(data,{'ID':ParentID});
+            return p;
+        }
+        function hasNextBrother(parentMap,item){
+            let children =parentMap[item.ParentID];
+            if(!gljUtil.isDef(children)|| children.indexOf(item) == children.length -1) return false;
+            return true
+        }
+
+    },
     setDynamicCombo: function (sheet, beginRow, col, rowCount, items, itemsHeight, itemsType) {
         let me = this;
         sheet.suspendPaint();

+ 6 - 0
web/building_saas/main/js/models/fee_rate.js

@@ -316,6 +316,12 @@ var FeeRate = {
                     me.datas.libID=data.libID;
                     me.datas.libName=data.libName;
                     me.datas.feeRateID=data.feeRateID;
+                    if(newVal==feeRate.libID){//如果是本身,则是恢复标准值,设置回旧的树节点折叠属性
+                        let oldRates =  me.datas.rates;
+                        for(let i =0;i< oldRates.length;i++){
+                            data.rates[i].collapsed = oldRates[i].collapsed;
+                        }
+                    }
                     me.datas.rates=data.rates;
                     projectObj.project.markUpdateProject({projectID:projectObj.project.ID(),feeRateID:me.getActivateFeeRateFileID()},'feeRate');
                     me.onFeeRateFileChange();

+ 12 - 85
web/building_saas/main/js/views/calc_base_view.js

@@ -140,8 +140,7 @@ let calcBaseView = {
     ifEdit: function (type, row) {
         if (type == 'ration'){
             return true;
-        }
-        else{
+        } else{
             let selected = projectObj.project.mainTree.items[row];
             return selected && MainTreeCol.readOnly.forCalcBase(selected)?false:true;
         }
@@ -347,90 +346,18 @@ let calcBaseView = {
             }
         });
     },
-
-    getCalcBaseCellType:function (type) {
-        var ns = GC.Spread.Sheets;
-        function CalcBaseCellType() {
-            var init=false;
+    onCalcBaseButtonClick:function (hitinfo,type='bills') {
+        let me = calcBaseView;
+        hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
+        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
+            let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
+            projectObj.mainController.setTreeSelected(node);
         }
-        CalcBaseCellType.prototype = new ns.CellTypes.Text();
-        CalcBaseCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-            if(!projectReadOnly && calcBaseView.ifEdit(type, options.row)){
-                if(options.sheet.getActiveRowIndex()==options.row&&options.sheet.getActiveColumnIndex()==options.col){
-                    var image = document.getElementById('f_btn'),imageMagin = 3;
-                    var imageHeight = 15;
-                    var imageWidth = 25;
-                    var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
-                    ctx.save();
-                    ctx.fillStyle = style.backColor;
-                    ctx.fillRect(x,y,w,h);
-                    ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
-                    ctx.beginPath();
-                    ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false);
-                    ctx.arc(imageX+imageWidth/2-4,imageY+imageHeight/2,1,0,360,false);
-                    ctx.arc(imageX+imageWidth/2+4,imageY+imageHeight/2,1,0,360,false);
-                    ctx.fillStyle="black";//填充颜色,默认是黑色
-                    ctx.fill();//画实心圆
-                    ctx.closePath();
-                    ctx.restore();
-                    w = w - imageWidth - imageMagin;
-                }
-            }
-            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
-        };
-        CalcBaseCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
-            return {
-                x: x,
-                y: y,
-                row: context.row,
-                col: context.col,
-                cellStyle: cellStyle,
-                cellRect: cellRect,
-                sheetArea: context.sheetArea
-            };
-        };
-        CalcBaseCellType.prototype.processMouseDown = function (hitinfo) {
-            let me = calcBaseView;
-            if(hitinfo.sheet.getActiveRowIndex()==hitinfo.row&&hitinfo.sheet.getActiveColumnIndex()==hitinfo.col){
-                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
-                var imageWidth = 25;
-                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
-                        let node = projectObj.project.mainTree.items[hitinfo.row] ? projectObj.project.mainTree.items[hitinfo.row] : null;
-                        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
-                            projectObj.mainController.setTreeSelected(node);
-                        }
-                        hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
-                        calcBaseView.confirmBtn.attr('toggle', 'calcBase');
-                        changeCalcBaseFeeRate('calcBase');
-                        $('#tabCalcBase').tab('show');
-                        calcBaseView.initCalctor(type);
-                    }
-                }
-            }
-        };
-        CalcBaseCellType.prototype.processMouseDown = function (hitinfo) {
-            let me = calcBaseView;
-            if(hitinfo.sheet.getActiveRowIndex()==hitinfo.row&&hitinfo.sheet.getActiveColumnIndex()==hitinfo.col){
-                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
-                var imageWidth = 25;
-                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
-                        hitinfo.sheet.setActiveCell(hitinfo.row, hitinfo.col);
-                        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
-                            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');
-                        $('#tabCalcBase').tab('show');
-                        calcBaseView.initCalctor(type);
-                    }
-                }
-            }
-        };
-        return new CalcBaseCellType();
-    },
+        calcBaseView.confirmBtn.attr('toggle', 'calcBase');
+        changeCalcBaseFeeRate('calcBase');
+        $('#tabCalcBase').tab('show');
+        calcBaseView.initCalctor(type);
+    }
 };
 
 $(document).ready(function () {

+ 12 - 2
web/building_saas/main/js/views/calc_program_manage.js

@@ -25,7 +25,7 @@ let calcProgramManage = {
             // {headerName:"ID",headerWidth:80,dataCode:"ID", hAlign: "center"},
             {headerName:"费用代号",headerWidth:CP_Col_Width.code, dataCode:"code", dataType: "String"},
             {headerName:"费用名称",headerWidth:CP_Col_Width.name, dataCode:"name", dataType: "String"},
-            {headerName:"计算基数",headerWidth:CP_Col_Width.dispExprUser, dataCode:"dispExprUser", dataType: "String"},
+            {headerName:"计算基数",headerWidth:CP_Col_Width.dispExprUser, dataCode:"dispExprUser", dataType: "String",cellType:'cusButton',callback:'calcBase',disable:'calcBase'},
             {headerName:"费率",headerWidth:CP_Col_Width.feeRate, dataCode:"feeRate", dataType: "Number",hAlign: "right",decimalField:"feeRate"},
             {headerName:"费用类别",headerWidth:CP_Col_Width.displayFieldName, dataCode:"displayFieldName", dataType: "String", hAlign: "center"},
             {headerName:"基数说明",headerWidth:CP_Col_Width.statement, dataCode:"statement", dataType: "String"},
@@ -36,6 +36,17 @@ let calcProgramManage = {
             lockColumns:[2,5],
             colHeaderHeight: CP_Col_Width.colHeader,
             rowHeaderWidth: CP_Col_Width.rowHeader
+        },
+        //callback 和disable都是和 cusButton配套使用的
+        callback:{
+            calcBase:function (hitinfo) {
+                calcBaseView.onCalcBaseButtonClick(hitinfo,'ration');
+            }
+        },
+        disable:{
+            calcBase:function (row,col) {
+                return projectReadOnly || !calcBaseView.ifEdit('ration', row)
+            }
         }
     },
 
@@ -71,7 +82,6 @@ let calcProgramManage = {
 
         me.detailSheet.name('calc_detail');
         feeRateObject.setFeeRateCellCol(me.detailSheet, _.findIndex(me.detailSetting.header,{'dataCode':'feeRate'}));
-        me.detailSheet.getRange(-1, _.findIndex(me.detailSetting.header, {'dataCode': 'dispExprUser'}), -1, 1).cellType(calcBaseView.getCalcBaseCellType('ration'));
         sheetCommonObj.showData(me.detailSheet, me.detailSetting, me.datas[0].calcItems);
         me.getfeeRateColor(me.datas[0].calcItems);
         customRowHeader(me.detailSheet, me.datas[0].calcItems.length);

+ 16 - 3
web/building_saas/main/js/views/fee_rate_view.js

@@ -170,16 +170,27 @@ var feeRateObject={
                 }
                 sheet.setValue(row, col, val, ch);
                 if(col==0){
-                    let treeType = feeRateObject.getTreeNodeCellType(data,row,parentMap);
+                    let treeType = sheetCommonObj.getTreeNodeCellType(data,row,parentMap);
                     sheet.getCell(row, 0).cellType(treeType);
                     visibleMap[data[row].ID] = treeType.collapsed;
-                    if(visibleMap[data[row].ParentID] ) sheet.getRange(row , -1, 1, -1).visible(false);//显示或隐藏
+                    feeRateObject.setRowVisible(data,row,visibleMap,sheet);
                 }
             }
         }
         sheet.resumeEvent();
         sheet.resumePaint();
     },
+    setRowVisible:function (data,row,visibleMap,sheet) {
+        sheet.getRange(row , -1, 1, -1).visible(getVisible(data[row].ParentID));//显示或隐藏
+        function getVisible(ParentID) {
+            if(visibleMap[ParentID]) return false //如果父节点是缩起的,那就隐藏本身。
+            if(visibleMap[ParentID] == false){//如果父节点不是缩起的,要再往父节点找看
+                let pnode = _.find(data,{'ID':ParentID});
+                if(pnode) return getVisible(pnode.ParentID);//如果有父节点,递归调用
+                return true;//没有,返回显示
+            }
+        }
+    },
     getFeeRateLevel:function (rate,data) {
         if(rate.ParentID){
          let prate =  _.find(data,{'ID':rate.ParentID});
@@ -1023,7 +1034,9 @@ $(function(){
     $('#changeConfirm').bind('click', function (){
         var newVal=$('#standardSelect').val();
         var feeRateFile = projectObj.project.FeeRate.getActivateFeeRate();
-        if(newVal&&newVal!=feeRateFile.libID)  feeRateObject.changeFeeRateStandard(newVal);
+        feeRateObject.changeFeeRateStandard(newVal);
+        //这里改成不判断了,只是点击确定了就重选
+        //if(newVal&&newVal!=feeRateFile.libID)  feeRateObject.changeFeeRateStandard(newVal);
     });
 
     $('#saveAs').bind('click', function (){

+ 5 - 3
web/building_saas/main/js/views/main_tree_col.js

@@ -294,8 +294,9 @@ let MainTreeCol = {
               return  quantityEditObj.getQuantityEditCellType();
             }
         },
-        calcBase: function () {
-            return calcBaseView.getCalcBaseCellType('bills');
+        calcBase: function (node) {
+            let readOnly = projectReadOnly || !calcBaseView.ifEdit('bills', projectObj.project.mainTree.items.indexOf(node));
+            return sheetCommonObj.getCusButtonCellType(calcBaseView.onCalcBaseButtonClick,readOnly)
         },
 
         // CSL, 2017-11-28
@@ -351,7 +352,8 @@ let MainTreeCol = {
 
         },
         commonTotalFee: function () {
-            return projectObj.getCommonTotalFeeCellType();
+            let readOnly = projectReadOnly || !calcBaseView.ifEdit('bills', projectObj.project.mainTree.items.indexOf(node));
+            return sheetCommonObj.getCusButtonCellType(projectObj.onCommonTotalFeeButtonClick,readOnly) //projectObj.getCommonTotalFeeCellType();
         }
     },
     editChecking:function(node){

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

@@ -1931,71 +1931,18 @@ var projectObj = {
         }
         return !this.itemCol.visible;
     },
-    //综合合价cellType
-    getCommonTotalFeeCellType:function () {
-        let type = 'bills';
-        var ns = GC.Spread.Sheets;
-        function CommonTotalFeeCellType() {
-            var init=false;
-        }
-        CommonTotalFeeCellType.prototype = new ns.CellTypes.Text();
-        CommonTotalFeeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
-            if(!projectReadOnly && calcBaseView.ifEdit(type, options.row)){
-                if(options.sheet.getActiveRowIndex()==options.row&&options.sheet.getActiveColumnIndex()==options.col){
-                    var image = document.getElementById('f_btn'),imageMagin = 3;
-                    var imageHeight = 15;
-                    var imageWidth = 25;
-                    var imageX = x + w - imageWidth- imageMagin, imageY = y + h / 2 - imageHeight / 2;
-                    ctx.save();
-                    ctx.fillStyle = style.backColor;
-                    ctx.fillRect(x,y,w,h);
-                    ctx.drawImage(image, imageX, imageY,imageWidth,imageHeight);
-                    ctx.beginPath();
-                    ctx.arc(imageX+imageWidth/2,imageY+imageHeight/2,1,0,360,false);
-                    ctx.arc(imageX+imageWidth/2-4,imageY+imageHeight/2,1,0,360,false);
-                    ctx.arc(imageX+imageWidth/2+4,imageY+imageHeight/2,1,0,360,false);
-                    ctx.fillStyle="black";//填充颜色,默认是黑色
-                    ctx.fill();//画实心圆
-                    ctx.closePath();
-                    ctx.restore();
-                    w = w - imageWidth - imageMagin;
-                }
-            }
-            GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
-        };
-        CommonTotalFeeCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
-            return {
-                x: x,
-                y: y,
-                row: context.row,
-                col: context.col,
-                cellStyle: cellStyle,
-                cellRect: cellRect,
-                sheetArea: context.sheetArea
-            };
-        };
-        CommonTotalFeeCellType.prototype.processMouseDown = function (hitinfo) {
-            let me = calcBaseView;
-            if(hitinfo.sheet.getActiveRowIndex()==hitinfo.row&&hitinfo.sheet.getActiveColumnIndex()==hitinfo.col){
-                var offset=hitinfo.cellRect.x+hitinfo.cellRect.width-6;
-                var imageWidth = 25;
-                if(hitinfo.x<offset&&hitinfo.x>offset-imageWidth){
-                    if(!projectReadOnly && me.ifEdit(type, hitinfo.row)){
-                        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
-                            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);
-                        calcBaseView.confirmBtn.attr('toggle', 'commonTotalFee');
-                        changeCalcBaseFeeRate('commonTotalFee');
-                        $('#tabCalcBase').tab('show');
-                        calcBaseView.initCalctor(type);
-                        feeRateObject.showSelectModal(hitinfo);
-                    }
-                }
-            }
-        };
-        return new CommonTotalFeeCellType();
+    onCommonTotalFeeButtonClick:function(hitinfo) {
+        let me = calcBaseView;
+        if(hitinfo.sheet.getParent() === projectObj.mainSpread){
+            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);
+        calcBaseView.confirmBtn.attr('toggle', 'commonTotalFee');
+        changeCalcBaseFeeRate('commonTotalFee');
+        $('#tabCalcBase').tab('show');
+        calcBaseView.initCalctor('bills');
+        feeRateObject.showSelectModal(hitinfo);
     },
     selectColAndFocus :function (newNode,field = 'code') {//选中单元格并设置焦点
         if(newNode){