Jelajahi Sumber

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

zhongzewei 7 tahun lalu
induk
melakukan
1f40c98472

+ 1 - 0
modules/ration_glj/facade/ration_glj_facade.js

@@ -628,6 +628,7 @@ async function replaceGLJ(data) {
     let result = await projectGljModel.addList(getGLJSearchInfo(data));
     let typeString = result.type+'';
     data.projectGLJID = result.id;
+
     let updateResult = await ration_glj.findOneAndUpdate({ID: data.ID, projectID: data.projectID}, data);//更新定额工料机
     //组装回传数据
     data.marketPrice = result.unit_price.market_price;

+ 2 - 3
modules/reports/controllers/rpt_controller.js

@@ -225,7 +225,7 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, custo
                     let printCom = JpcEx.createNew();
                     if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
                     //console.log("orientation: " + (orientation === 'null'));
-                    if (orientation !== null && orientation !== 'null') rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
+                    if (orientation && (orientation !== 'null')) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
                     let defProperties = rptUtil.getReportDefaultCache();
                     if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl, defProperties);
                     let dftOption = option||JV.PAGING_OPTION_NORMAL;
@@ -374,8 +374,7 @@ module.exports = {
                     getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, dftOption, function (err, pageRst) {
                         if(err){
                             cb(err);
-                        }
-                        else{
+                        } else {
                             rpt_xl_util.exportExcel(pageRst, pageSize, rpt_name, isOneSheet, null, null, function(uuidName){
                                 let fileRst = {uuid: uuidName, reportName: rpt_name};
                                 cb(err, fileRst);

+ 12 - 2
modules/reports/util/rpt_excel_util.js

@@ -346,7 +346,8 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
     return rst;
 }
 function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, appointedMergeBand){
-    let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+    let rst = [], xPos = [], yPos = [], yMultiPos = [], currentMergeBorder = null,
+        headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     let currentPageMergePos = null; //在 JV.PAGING_OPTION_INFINITY 场合应用
     let private_pre_analyze_pos = function(){
         let cell, pos;
@@ -508,7 +509,8 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
     };
     let private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr, needFurtherChk) {
         let rst = 0,
-            mergeBorder = (sheetData)?sheetData[JV.PROP_PAGE_MERGE_BORDER]:pageData[JV.BAND_PROP_MERGE_BAND],
+            // mergeBorder = (sheetData)?sheetData[JV.PROP_PAGE_MERGE_BORDER]:pageData[JV.BAND_PROP_MERGE_BAND],
+            mergeBorder = currentMergeBorder,
             mergeBand = pageData[JV.BAND_PROP_MERGE_BAND]
         ;
         if (appointedMergeBand !== null) {
@@ -758,6 +760,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
         if (sheetData) {
             //current sheet data
             currentPageMergePos = sheetData[JV.PAGE_SPECIAL_MERGE_POS];
+            currentMergeBorder = sheetData[JV.PROP_PAGE_MERGE_BORDER];
             self_setDataEx(sheetData, yPos, 0);
         } else {
             //total data in one sheet
@@ -765,6 +768,7 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
             for (let i = 0; i < pageData.items.length; i++) {
                 let shtItemData = pageData.items[i];
                 currentPageMergePos = shtItemData[JV.PAGE_SPECIAL_MERGE_POS];
+                currentMergeBorder = shtItemData[JV.PROP_PAGE_MERGE_BORDER];
                 let tmpPos = yMultiPos[i];
                 cellIdx = 0;
                 self_setDataEx(shtItemData, tmpPos, cnt);
@@ -939,6 +943,7 @@ module.exports = {
                 let offsetY = 0;
                 let mergeBand = {};
                 custMergeBands.push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND]);
+                //备注:不同的报表有可能有不同的边框,如封面表就是无边框的
                 mergeBand[JV.PROP_LEFT] = [];
                 mergeBand[JV.PROP_RIGHT] = [];
                 mergeBand[JV.PROP_TOP] = [];
@@ -955,6 +960,11 @@ module.exports = {
                         mergeBand[JV.PROP_TOP].push(pos);
                         pos = pageDataArray[i].items[j][JV.PAGE_SPECIAL_MERGE_POS][JV.PROP_BOTTOM][0] + offsetY;
                         mergeBand[JV.PROP_BOTTOM].push(pos);
+                    } else if (pageDataArray[i].items[j][JV.PROP_PAGE_MERGE_BORDER]) {
+                        let pos = pageDataArray[i].items[j][JV.PROP_PAGE_MERGE_BORDER][JV.PROP_TOP] + offsetY;
+                        mergeBand[JV.PROP_TOP].push(pos);
+                        pos = pageDataArray[i].items[j][JV.PROP_PAGE_MERGE_BORDER][JV.PROP_BOTTOM] + offsetY;
+                        mergeBand[JV.PROP_BOTTOM].push(pos);
                     } else {
                         mergeBand[JV.PROP_TOP].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] + offsetY);
                         mergeBand[JV.PROP_BOTTOM].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM] + offsetY);

+ 53 - 0
modules/reports/util/rpt_tmp_file_sweep.js

@@ -0,0 +1,53 @@
+/**
+ * Created by Tony on 2018/7/27.
+ */
+
+let fs = require('fs');
+let cron = require('node-schedule');
+let remove_file_types = [".xlsx", ".pdf", ".jsp"];
+function chkIsRemoveType(file) {
+    let rst = false;
+    for (let fType of remove_file_types) {
+        if (file.indexOf(fType) === (file.length - fType.length)) {
+            rst = true;
+            break;
+        }
+    }
+    return rst;
+}
+let jobObj = {
+    createJob: function (rule, rootPath) {
+        let localRule = rule;
+        if (!localRule) {
+            // setup schedule rule
+            localRule = new cron.RecurrenceRule();
+            // 3:15AM, everyday
+            localRule.dayOfWeek = [1,2,3,4,5,6,0];
+            localRule.hour = 3;
+            localRule.minute = 15;
+        }
+        cron.scheduleJob(localRule, function(){
+            let path = rootPath;
+            fs.exists(path, function (exists) {
+                if (exists) {
+                    fs.readdir(path, function (err, files) {
+                        let currentTime = (new Date()).valueOf();
+                        let timeGap = currentTime - (1000 * 60 * 60 * 24 * 0.5); //half day before
+                        files.forEach(function(file,index){
+                            if (chkIsRemoveType(file)) {
+                                let curPath = path + "/" + file;
+                                fs.stat(curPath,function(err,data){
+                                    if (timeGap > data.mtime) {
+                                        fs.unlink(curPath);
+                                    }
+                                });
+                            }
+                        });
+                    })
+                }
+            })
+        });
+    }
+};
+
+export default jobObj;

+ 5 - 33
server.js

@@ -13,7 +13,7 @@ let DBStore = require('connect-mongo')(session);
 let fs = require('fs');
 
 let URL = require('url');
-let cron = require('node-schedule');
+import rptCronJob from "./modules/reports/util/rpt_tmp_file_sweep";
 
 dbm.connect(process.env.NODE_ENV);
 //这里现在只引入了定额工料机里的models,当其它模块的models修改后使用:./modules/**/models/*.js引入所有的模块
@@ -103,13 +103,9 @@ app.use(function(err, req, res, next) {
     res.status(500).send('500 Error');
 });
 
-//设置Date Format函数
+//设置外增的Date对象Format函数
 fs.readFile(__dirname + '/public/web/date_util.js', 'utf8', 'r', function (err, data) {
     eval(data);
-    // let dt = new Date();
-    // console.log(dt.Format('yyyy-M-dd'));
-    // console.log(dt.Format('yyyy 年 M 月 dd 日'));
-    // console.log(dt.Format('yyyy 年 M 月 20 日'));
 });
 
 app.listen(6060, function(){
@@ -117,30 +113,6 @@ app.listen(6060, function(){
 });
 
 //设置schedule job
-let rule = new cron.RecurrenceRule();
-//1. 每天凌晨3点一刻,删除临时文件
-rule.dayOfWeek = [1,2,3,4,5,6,0];
-rule.hour = 3;
-rule.minute = 15;
-cron.scheduleJob(rule, function(){
-    let path = __dirname + "/tmp";
-    fs.exists(path, function (exists) {
-        if (exists) {
-            fs.readdir(path, function (err, files) {
-                let currentTime = (new Date()).valueOf();
-                let timeGap = currentTime - (1000 * 60 * 60 * 24 * 0.5);
-                files.forEach(function(file,index){
-                    if (file.indexOf(".xlsx") === (file.length - 5) ||
-                        file.indexOf(".pdf") === (file.length - 4)) {
-                        let curPath = path + "/" + file;
-                        fs.stat(curPath,function(err,data){
-                            if (timeGap > data.mtime) {
-                                fs.unlink(curPath);
-                            }
-                        });
-                    }
-                });
-            })
-        }
-    })
-});
+//1. 报表临时文件
+rptCronJob.createJob(null, __dirname + "/tmp");
+//2. 其他(待补充)...

+ 6 - 2
test/unit/reports/test_rpt_test_template.js

@@ -28,10 +28,10 @@ let fsUtil = require("../../../public/fsUtil");
 let demoPrjId = - 1;
 // let demoRptId = 279;
 // let demoRptId = 275; //测试模板-流水式
-// let demoRptId = 337; //19表
+let demoRptId = 337; //19表
 // let demoRptId = 361; //封1
 // let demoRptId = 279; //表04
-let demoRptId = 261; //封3
+// let demoRptId = 261; //封3
 let pagesize = "A4";
 //288: 11-2表(新)
 //279: 04
@@ -51,6 +51,7 @@ let rptTplFacade = require("../../../modules/reports/facade/rpt_template_facade"
 let rptTplDataFacade = require("../../../modules/reports/facade/rpt_tpl_data_facade");
 
 import rptDataExtractor from "../../../modules/reports/util/rpt_construct_data_util";
+import rpt_xl_util from "../../../modules/reports/util/rpt_excel_util";
 
 let fs = require('fs');
 //设置Date Format函数
@@ -83,6 +84,9 @@ test('测试 - 测试模板啦: ', function (t) {
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     if (pageRst) {
                         fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
+                        rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
+                            console.log("excel uuid: " + uuidName);
+                        });
                     } else {
                         console.log("oh! no pages were created!");
                     }

+ 55 - 0
web/building_saas/main/js/models/ration_glj.js

@@ -641,6 +641,61 @@ var ration_glj = {
                 $.bootstrapLoading.end();
             });
         };
+
+        ration_glj.prototype.updateRationGLJByChangeCode = function (recode, updateField, newval) {
+            let me = this;
+            let priceMap = projectObj.project.projectGLJ.datas.unitPriceMap;
+            let priceObj = priceMap[newval];
+            if(priceObj){
+                if (recode.createType===undefined || recode.createType == 'normal') {// createTypel 默认是normal 只有是定额下带的工料机才需把类型改成替换,其它的保持不变
+                    recode.rcode = recode.code;
+                    recode.createType = 'replace';
+                }
+                recode.code = priceObj.code;
+                recode.name = priceObj.name;
+                recode.type = priceObj.type;
+                recode.unit = priceObj.unit;
+                recode.shortName = priceObj.short_name;
+                recode.specs = priceObj.specs;
+                recode.GLJID=priceObj.glj_id;
+                recode.original_code =  priceObj.original_code;
+                recode.basePrice = priceObj.base_price;
+                recode.marketPrice = priceObj.market_price;
+            }
+            $.bootstrapLoading.start();
+            CommonAjax.post("/rationGlj/replaceGLJ", recode, function (result) {
+                if (result) {
+                    //result.adjustState;
+                    var glj_list = me.datas;
+                    var data = result.data;
+                    var list_index = _.findIndex(glj_list, {'ID': data.ID});
+                    let rationNode = projectObj.project.mainTree.findNode(data.rationID);
+                    var nodes =  [rationNode];
+                    glj_list[list_index] = data;
+                    project.projectGLJ.loadData(function () {//加载完项目工料机再计算
+                        gljOprObj.refreshView();
+                        if (project.ration_glj.needShowToTree(data)) {//当替换的是主材或设备时,刷新对应的树节点
+                            var node = project.ration_glj.findGLJNodeByID(data.ID);
+                            if (node) {
+                                project.ration_glj.transferToNodeData(data);
+                                node.source = data;
+                                node.data = data;
+                            }
+                            node ? nodes.push(node) : "";
+                        }
+                        rationNode.data.adjustState = result.adjustState;
+                        projectObj.mainController.refreshTreeNode(nodes);
+                        project.calcProgram.calcAndSave(rationNode);
+                        $.bootstrapLoading.end();
+                    });
+                }
+            }, function () {
+                $.bootstrapLoading.end();
+            });
+
+
+        };
+
         ration_glj.prototype.replaceGLJ = function (selectCode, oldData, callback) {
             var allGLJ = gljOprObj.AllRecode;
             var glj = _.find(allGLJ, function (item) {

+ 1 - 1
web/building_saas/main/js/views/glj_col.js

@@ -18,7 +18,7 @@ let gljCol = {
             {headerName: "暂估", headerWidth: 45, dataCode: "isEstimate", dataType: "String", hAlign: "center", vAlign: "center", cellType: "checkBox"}
         ],
         view: {
-            lockColumns: [0, 5, 7, 9, 10, 11]
+            lockColumns: [ 5, 7, 9, 10, 11]
         },
         // 工料机类型是混凝土、砂浆、配合比、机械台班时,价格不可编辑。
         editedTyep:[GLJTypeConst.MAIN_MATERIAL,GLJTypeConst.EQUIPMENT]//主材设备

+ 86 - 28
web/building_saas/main/js/views/glj_view.js

@@ -114,6 +114,9 @@ var gljOprObj = {
         if(!projectReadOnly){
             gljContextMenu.loadGLJSpreadContextMenu();
         }
+        sheet.bind(GC.Spread.Sheets.Events.SelectionChanged,function (sender,args) {
+            args.sheet.repaint();
+        });
     },
     initDetailSheet: function (sheet) {
         var me = this;
@@ -504,36 +507,49 @@ var gljOprObj = {
         let selected = this.sheet.getSelections();
         this.combineWithProjectGlj(this.sheetData);
         this.sheet.setRowCount(0);
-        //console.log(+new Date())
-        //this.sheet.getRange(0,-1,this.sheet.getRowCount(),-1).visible(true); //这个方法导致加载缓慢
         this.sheetData = sortRationGLJ(this.sheetData);
         this.sumQuantity();//计算总消耗量
         this.addMixRatioToShow();//显示组成物信息
-        this.initRationTree(init);
+        this.initRationTree(init,this.getUnitPriceCodeMap());
         sheetCommonObj.showData(this.sheet, this.setting, this.sheetData);
         if(selected){//定位光标到之前的位置
             this.sheet.setSelection(selected[0].row,selected[0].col,selected[0].rowCount,selected[0].colCount);
         }
     },
-    initRationTree: function (init) {
-        this.sheet.getRange(-1, 0, -1, 1).cellType(this.getTreeNodeCellType(this.sheetData));
+    getUnitPriceCodeMap : function (sheetData) {//取单价文件中,编码前缀一样的映射表
+        let codeMap = {};
+        let priceMap = projectObj.project.projectGLJ.datas.unitPriceMap;
+        if(priceMap){
+            for(let connectKey in priceMap){
+                let code = priceMap[connectKey].code;
+                if(code){
+                   let preCode = code.split("-")[0];
+                   if(codeMap[preCode]) {
+                       codeMap[preCode].push({text:code,value:connectKey});
+                   }else {
+                       codeMap[preCode]=[{text:code,value:connectKey}];
+                   }
+                }
+            }
+        }
+        return codeMap;
+    },
+
+    initRationTree: function (init,codeMap) {
+        this.sheet.suspendPaint();
+        this.sheet.suspendEvent();
+        this.sheet.setRowCount(this.sheetData.length >30?this.sheetData.length:30);
         for (var i = 0; i < this.sheetData.length; i++) {
+            this.sheet.setCellType(i, 0,this.getTreeNodeCellType(this.sheetData,i,codeMap),GC.Spread.Sheets.SheetArea.viewport);
             if (this.sheetData[i].hasOwnProperty('subList')) {
-               /* var collapsed = false;
-                if (init) {
-                    this.sheetData[i].collapsed = true;
-                    collapsed = true;
-                } else {
-                    collapsed = this.sheetData[i].collapsed == undefined ? true : this.sheetData[i].collapsed;
-                }*/
                 var collapsed = this.sheetData[i].collapsed == undefined ? true : this.sheetData[i].collapsed;
                 if (collapsed == true) {
                     this.sheet.getRange(i + 1, -1, this.sheetData[i].subList.length, -1).visible(false);
                 }
-                //this.sheet.getRange(i+1, -1, this.sheetData[i].subList.length, -1).visible(!collapsed);// this.sheet.getRange(i+1, -1, this.sheetData[i].subList.length, -1).locked(true);
-                //这个方法导致加载缓慢
             }
         }
+        this.sheet.resumeEvent();
+        this.sheet.resumePaint();
     },
     filterGljByRation: function (ration, datas) {
         var gljList = [];
@@ -752,6 +768,12 @@ var gljOprObj = {
                     return;
                 }
             }
+            if(updateField == 'code'){
+                if (!gljUtil.isDef(args.editingText)||args.editingText==''||args.editingText.indexOf('|-|') === -1||this.isRationGLJExit(args.editingText)) {//说明是选中自已,或者是已存在的工料机
+                    me.sheet.getCell(args.row, args.col).value(recode[updateField]);
+                    return;
+                }
+            }
             newval = args.editingText == null ? "" : args.editingText;
         }
         if (newval === recode[updateField]) {//如果值完全相等,则不需要更新
@@ -759,10 +781,23 @@ var gljOprObj = {
         }
         if (updateField == 'marketPrice' || updateField == 'basePrice') {
             projectObj.project.projectGLJ.updatePriceFromRG(recode, updateField, newval);
+        }else if(updateField == 'code'){//替换单价文件中已经有的工料机
+            projectObj.project.ration_glj.updateRationGLJByChangeCode(recode, updateField, newval);
         } else {
             projectObj.project.ration_glj.updateRationGLJByEdit(recode, updateField, newval);
         }
     },
+    isRationGLJExit:function (connectKey) {
+        for(let rg of gljOprObj.sheetData){
+            if(rg.isMixRatio == true){
+                continue;
+            }
+            if(gljOprObj.getIndex(rg, gljKeyArray) == connectKey){//存在一样的工料机
+                return true;
+            }
+        }
+       return false;
+    },
     updateRationTypeGLJ: function (value, node, fieldName,editingText) {
         let newval;
         let updatePrice = false;
@@ -965,9 +1000,12 @@ var gljOprObj = {
         var project = projectObj.project;
         gljOprObj.GLJSelection = _.filter(gljOprObj.GLJSelection, function (n) {
             var rg = _.find(gljOprObj.sheetData, function (item) {
+                if(item.isMixRatio == true){
+                    return false;
+                }
                 var i_key = gljOprObj.getIndex(item, gljKeyArray);
                 return n == i_key
-            })
+            });
             return rg ? false : true;
         })
         if (gljOprObj.GLJSelection.length > 0 && selected && selected.sourceType == ModuleNames.ration) {
@@ -1121,7 +1159,7 @@ var gljOprObj = {
         }
         return node;
     },
-    getTreeNodeCellType: function (data) {
+    getTreeNodeCellType: function (data,index,codeMap) {
         var ns = GC.Spread.Sheets;
         var rectW = 10;
         var rectH = 10;
@@ -1183,7 +1221,7 @@ var gljOprObj = {
             return offset;
         }
 
-        TreeNodeCellType.prototype = new ns.CellTypes.Text();
+        TreeNodeCellType.prototype =  data[index]&&data[index].isMixRatio?new ns.CellTypes.Text(): sheetCommonObj.getDynamicCombo();//new ns.CellTypes.Text();
         TreeNodeCellType.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
             if (value != null) {
                 var offset = margin + rectW + 6;
@@ -1203,17 +1241,21 @@ var gljOprObj = {
                 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
-            };
+            if(x < cellRect.x+cellRect.width -15){
+                return {
+                    x: x,
+                    y: y,
+                    row: context.row,
+                    col: context.col,
+                    cellStyle: cellStyle,
+                    cellRect: cellRect,
+                    sheetArea: context.sheetArea
+                };
+            }else {
+                return GC.Spread.Sheets.CellTypes.ComboBox.prototype.getHitInfo.apply(this, arguments);
+            }
+
         };
         TreeNodeCellType.prototype.processMouseDown = function (hitinfo) {
             var recode = data[hitinfo.row];
@@ -1227,10 +1269,26 @@ var gljOprObj = {
                     hitinfo.sheet.getRange(hitinfo.row + 1, -1, recode.subList.length, -1).visible(!collapsed);
                     hitinfo.sheet.invalidateLayout();
                     hitinfo.sheet.repaint();
+                    return;
                 }
             }
+            GC.Spread.Sheets.CellTypes.ComboBox.prototype.processMouseDown.apply(this, arguments);
+           // GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, arguments);
         };
-        return new TreeNodeCellType()
+        let cellType = new TreeNodeCellType();
+        let options = [];
+        if(!(data[index]&&data[index].isMixRatio)){
+            let code = data[index].code;
+            if(code) {
+                let preCode = code.split("-")[0];
+                if( codeMap[preCode]) options = codeMap[preCode];
+                if(options.length>0) _.remove(options,{'value':gljOprObj.getIndex(data[index], gljKeyArray)})//去掉本身
+
+            }
+            cellType.editorValueType(GC.Spread.Sheets.CellTypes.EditorValueType.value);
+            cellType.itemHeight(options.length).items(options);
+        }
+        return cellType;
     },
     marketPriceReadOnly: function (node) {
         let hasCom = false;

+ 1 - 1
web/building_saas/report/html/rpt_content_format.html

@@ -39,8 +39,8 @@
             <div class="modal-footer">
                 <button type="button" class="btn btn-link float-left" onclick="rptControlObj.restoreCustCFG()">恢复默认值</button>
                 <button type="button" class="btn btn-link float-left" onclick="rptControlObj.saveCustCfg()">存为默认值</button>
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
         </div>
     </div>

+ 4 - 10
web/building_saas/report/html/rpt_main.html

@@ -4,7 +4,9 @@
         <div class="col-lg-2 p-0">
             <div class="print-list">
                 <div class="list-tools d-flex justify-content-center">
-                    <button class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#editForm"><i class="fa fa-cog"></i> 管理报表</button>
+                    <!--
+                        <button class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#editForm"><i class="fa fa-cog"></i> 管理报表</button>
+                    -->
                 </div>
                 <div class="form-list">
                     <ul id="rptTplTree" class="ztree"></ul>
@@ -19,11 +21,6 @@
                             <button class="btn btn-outline-primary btn-sm" type="button" onclick="rptPrintHelper.preview()">
                                 <i class="fa fa-print"></i><br>打印<span class="badge badge-secondary">0</span>
                             </button>
-                            <!--
-                            <button class="btn btn-outline-primary btn-sm" type="button"  href="#export" data-toggle="modal" data-target="#export">
-                                <i class="fa fa-share-square-o"></i><br>导出
-                            </button>
-                            -->
                         </div>
                     </div>
                     <div class="panel">
@@ -63,10 +60,7 @@
                         <div class="panel-body">
                             <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
                                 <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#paper_margins"><i class="fa fa-file-o"></i> 页边距</button>
-                                <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#content_format"><i class="fa fa-file-text-o"></i> 页面</button>
-                                <!--
-                                <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#format"><i class="fa fa-bold"></i> 格式</button>
-                                -->
+                                <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#content_format"><i class="fa fa-bold"></i> 页面</button>
                             </div>
                         </div>
                         <div class="panel-foot text-muted">

+ 1 - 1
web/building_saas/report/html/rpt_margins.html

@@ -29,8 +29,8 @@
             </div>
             <div class="modal-footer">
                 <button type="button" class="btn btn-link float-left" data-dismiss="modal" onclick="rptControlObj.saveCustCfg()">存为默认值</button>
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
                 <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
             </div>
         </div>
     </div>