Selaa lähdekoodia

report customize config Apr 19

TonyKang 7 vuotta sitten
vanhempi
commit
0e7836e991

+ 33 - 0
modules/all_models/rpt_customize_cfg.js

@@ -0,0 +1,33 @@
+/**
+ * Created by Tony on 2018/4/18.
+ * 用户自定义报表输出格式(如字体,边距,竖线,窄体,小数补0等)
+ */
+import mongoose from "mongoose";
+let Schema = mongoose.Schema;
+let CustomizeCfgSchema = new Schema({
+    userId: String,
+    fonts: [{
+        "ID" : String,
+        "CfgDispName" : String,
+        "Name" : String,
+        "FontHeight" : Number,
+        "FontColor" : String,
+        "FontBold" : String,
+        "FontItalic" : String,
+        "FontUnderline" : String,
+        "FontStrikeOut" : String,
+        "FontAngle" : Number
+        }
+    ],
+    margins: {
+        Left: Number,
+        Right: Number,
+        Top: Number,
+        Bottom: Number
+    },
+    showVerticalLine: Boolean,
+    isNarrow: Boolean,
+    fillZero: Boolean
+});
+
+mongoose.model("rpt_customize_cfg", CustomizeCfgSchema, "rpt_customize_cfg");

+ 17 - 8
modules/reports/controllers/rpt_controller.js

@@ -71,8 +71,10 @@ function getAllPagesCommonOrg(rpt_id, pageSize, option, cb) {
         }
     );
 }
-
-function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, option, cb) {
+function setupCustomizeCfg(customizeCfg, rptTpl) {
+    //
+}
+function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, option, cb) {
     let rptTpl = null;
     rptTplFacade.getRptTemplate(rpt_id).then(function(rst) {
         rptTpl = rst;
@@ -84,7 +86,9 @@ function getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, option, cb) {
                 if (!err) {
                     let tplData = rptDataUtil.assembleData(rawDataObj);
                     let printCom = JpcEx.createNew();
-                    rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+                    if (pageSize) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pageSize;
+                    if (orientation) rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION] = orientation;
+                    if (customizeCfg) setupCustomizeCfg(customizeCfg, rptTpl);
                     let defProperties = rptUtil.getReportDefaultCache();
                     let dftOption = option||JV.PAGING_OPTION_NORMAL;
                     printCom.initialize(rptTpl);
@@ -113,10 +117,13 @@ module.exports = {
         let params = JSON.parse(req.body.params),
             rpt_id = params.rpt_tpl_id,
             prj_id = params.prj_id,
-            user_id = params.user_id,
-            pageSize = params.pageSize;
+            pageSize = params.pageSize,
+            orientation = params.orientation,
+            customizeCfg = params.custCfg
+        ;
         // req.session.sessionUser.ssoId
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, null, function (err, pageRst) {
+        let user_id = req.session.sessionUser.id;
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, customizeCfg, null, function (err, pageRst) {
             callback(req, res, err, pageRst);
         });
     },
@@ -133,12 +140,13 @@ module.exports = {
         let prj_id = req.params.prj_id,
             rpt_id = req.params.rpt_id,
             pageSize = req.params.size,
+            orientation = req.params.orientation,
             rptName = req.params.rptName,
             isOneSheet = req.params.isOneSheet,
             option = req.params.option;
         let user_id = req.session.sessionUser.id;
         let dftOption = option||JV.PAGING_OPTION_NORMAL;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, dftOption, function(err, pageRst){
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, dftOption, function(err, pageRst){
             try {
                 rpt_xl_util.exportExcel(pageRst, pageSize, rptName, isOneSheet, null, function(newName){
                     res.setHeader('Content-Type', 'application/vnd.openxmlformats');
@@ -226,10 +234,11 @@ module.exports = {
         let prj_id = req.params.prj_id,
             rpt_id = req.params.rpt_id,
             pageSize = req.params.size,
+            orientation = req.params.orientation,
             rptName = req.params.rptName
         ;
         let user_id = req.session.sessionUser.id;
-        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
+        getAllPagesCommon(user_id, prj_id, rpt_id, pageSize, orientation, null, JV.PAGING_OPTION_NORMAL, function(err, pageRst){
             rpt_pdf_util.export_pdf_file(pageRst, pageSize, rptName,function (newName) {
                 res.setHeader('Content-Type', 'application/vnd.openxmlformats');
                 res.setHeader("Content-Disposition", "attachment; filename=" + strUtil.getPinYinCamelChars(rptName) + ".pdf");

+ 49 - 34
modules/reports/controllers/rpt_tpl_controller.js

@@ -10,22 +10,48 @@ import counter from "../../../public/counter/counter";
 let RptTplModel = mongoose.model('rpt_templates');
 let TreeNodeModel = mongoose.model('rpt_tpl_tree');
 
-import rpttplDefObj from "../../../public/rpt_tpl_def";
-let rptTplDef = rpttplDefObj.getUtil();
+let rptCustCfgFacade = require("../facade/rpt_cust_cfg_facade");
 
-//import stringUtil from "../../../public/stringUtil";
 import JV from "../rpt_component/jpc_value_define";
 import rttFacade from "../facade/rpt_tpl_tree_node_facade";
 import CompilationModel from "../../users/models/compilation_model";
 
-//import test_glj_type_util from "../../../public/cache/std_glj_type_util");
-
 //统一回调函数
 let callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
 };
 
 let mExport = {
+    getCustomerCfg(req, res) {
+        let params = JSON.parse(req.body.params)
+            // userId = params.userId
+        ;
+        let userId = req.session.sessionUser.id;
+        let userIds = [];
+        userIds.push(userId);
+        if (userId !== "-100") {
+            userIds.push("-100");
+        }
+        rptCustCfgFacade.getCustomizeCfg(userIds).then(function (custCfg) {
+            if (custCfg) {
+                //success
+                let rst = null;
+                if (custCfg.length > 0) {
+                    for (let itemCfg of custCfg) {
+                        rst = itemCfg;
+                        let doc = (itemCfg._doc)?itemCfg._doc:itemCfg;
+                        if (doc.userId !== "-100") {
+                            break;
+                        }
+                    }
+                }
+                callback(req,res, false, "", rst);
+            } else {
+                //failed
+                callback(req,res, true, "失败!", null);
+            }
+        })
+    },
     getDftTemplates(req, res) {
         let filter = {"userId": "-100", "$or": [{"isDeleted": null}, {"isDeleted": false} ]};
         TreeNodeModel.find(filter, '-_id', function(err, data){
@@ -50,12 +76,18 @@ let mExport = {
     getRptTplTree: function(req, res) {
         let params = JSON.parse(req.body.params),
             compilationId = params.compilationId,
-            userId = params.userId,
+            // userId = params.userId,
             engineerId = params.engineerId;
+        let userId = req.session.sessionUser.id;
+        let userIds = [];
+        userIds.push(userId);
+        if (userId != "-100") {
+            userIds.push("-100");
+        }
         if (!compilationId) {
             compilationId = req.session.sessionCompilation._id;
         }
-        rttFacade.findTplTree(compilationId, engineerId, userId).then(function(result) {
+        rttFacade.findTplTree(compilationId, engineerId, userIds).then(function(result) {
             if (result) {
                 callback(req,res,false,"", result);
             } else {
@@ -63,29 +95,6 @@ let mExport = {
             }
         });
     },
-    // getRptTplTree_org: function(req, res) {
-    //     let params = JSON.parse(req.body.params),
-    //         grpType = params.grpType,
-    //         userId = params.userId,
-    //         tplType = params.tplType;
-    //     let filter = {"grpType": grpType, "$or": [{"isDeleted": null}, {"isDeleted": false} ]};
-    //     if (userId) {
-    //         filter.userId = userId;
-    //     }
-    //     if ((tplType && tplType !== rptTplDef.TplType.ALL)) {
-    //         filter.tplType = tplType;
-    //     }
-    //     TreeNodeModel.find(filter, '-_id', function(err, data){
-    //         if (err) {
-    //             callback(req,res, true,"", null);
-    //         } else {
-    //             callback(req,res,false,"", data);
-    //         }
-    //     });
-    //     // let obj = test_glj_type_util.getStdGljTypeCacheObj();
-    //     // console.log(obj.toArray());
-    //     // console.log(obj.getItemById(1));
-    // },
     updateTreeNodes: function(req, res) {
         let params = JSON.parse(req.body.params),
             nodes = params.nodes;
@@ -153,9 +162,11 @@ let mExport = {
     },
     updateTopNodeName: function (req, res) {
         let params = JSON.parse(req.body.params),
-            compilationId = params.compilationId, engineerId = params.engineerId, userId = params.userId,
+            compilationId = params.compilationId, engineerId = params.engineerId,
+            // userId = params.userId,
             nodeName = params.nodeName
         ;
+        let userId = req.session.sessionUser.id;
         let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
         let updateStatement = {"$set": {"name": nodeName}};
         rttFacade.updateTreeInDetail(filter, updateStatement).then(function (rst) {
@@ -170,9 +181,11 @@ let mExport = {
     },
     updateSubLevelOneNode: function (req, res) {
         let params = JSON.parse(req.body.params),
-            compilationId = params.compilationId, engineerId = params.engineerId, userId = params.userId,
+            compilationId = params.compilationId, engineerId = params.engineerId,
+            // userId = params.userId,
             subNode = params.subNode
         ;
+        let userId = req.session.sessionUser.id;
         let filter = {"compilationId": compilationId, "engineerId": engineerId, "userId": userId, "items.ID": subNode.ID, "$or": [{"isDeleted": null}, {"isDeleted": false}]};
         let updateStatement = {$set: {"items.$": subNode}};
         rttFacade.updateTreeInDetail(filter, updateStatement).then(function (rst) {
@@ -190,9 +203,10 @@ let mExport = {
         let params = JSON.parse(req.body.params),
             compilationId = params.compilationId,
             engineerId = params.engineerId,
-            userId = params.userId,
+            // userId = params.userId,
             isPhysically = params.isPhysically
             ;
+        let userId = req.session.sessionUser.id;
         if (isPhysically) {
             rttFacade.removeTreePhycically(compilationId, engineerId, userId).then(function (rst) {
                 if (rst) {
@@ -254,9 +268,10 @@ let mExport = {
             grpKey = params.grpKey,
             compilationId = params.compilationId,
             engineerId = params.engineerId,
-            userId = params.userId,
+            // userId = params.userId,
             subNode = params.subNode
         ;
+        let userId = req.session.sessionUser.id;
         let filter = {"ID": rptDftTplId};
         RptTplModel.findOne(filter, '-_id').exec().then(function(dftTplRst) {
             if (dftTplRst) {

+ 18 - 0
modules/reports/facade/rpt_cust_cfg_facade.js

@@ -0,0 +1,18 @@
+/**
+ * Created by Tony on 2018/4/18.
+ */
+
+import mongoose from "mongoose";
+let rpt_customize_cfg_mdl = mongoose.model("rpt_customize_cfg");
+
+module.exports = {
+    getCustomizeCfg: getCustomizeCfg
+};
+
+async function getCustomizeCfg(userIds) {
+    let filter = {"userId": userIds};
+    if (userIds instanceof Array) {
+        filter.userId = {$in: userIds};
+    }
+    return await rpt_customize_cfg_mdl.find(filter, '-_id');
+}

+ 2 - 2
modules/reports/routes/report_router.js

@@ -25,8 +25,8 @@ module.exports =function (app) {
     rptRouter.get('/getTestPDF/:id/:size/:rptName', reportController.getTestPDF);
     //now is the real:
     rptRouter.post('/getReport', reportController.getReportAllPages);
-    rptRouter.get('/getExcel/:prj_id/:rpt_id/:size/:rptName/:isOneSheet/:option', reportController.getExcel);
-    rptRouter.get('/getPDF/:prj_id/:rpt_id/:size/:rptName', reportController.getPDF);
+    rptRouter.get('/getExcel/:prj_id/:rpt_id/:size/:orientation/:rptName/:isOneSheet/:option', reportController.getExcel);
+    rptRouter.get('/getPDF/:prj_id/:rpt_id/:size/:orientation/:rptName', reportController.getPDF);
     // rptRouter.get('/getExcelInOneBook/:ids/:size/:rptName/:option', reportController.getExcelInOneBook);
 
     app.use("/report_api", rptRouter);

+ 1 - 0
modules/reports/routes/rpt_tpl_router.js

@@ -28,6 +28,7 @@ module.exports = function (app) {
     rptTplRouter.post('/getRefRptTpl', reportTplController.getRefRptTpl);
     rptTplRouter.post('/updateRptTpl', reportTplController.updateRptTpl);
     rptTplRouter.post('/getCompilationList', reportTplController.getCompilationList);
+    rptTplRouter.post('/getCustomizeCfg', reportTplController.getCustomerCfg);
 
     rptTplRouter.post('/getUserRptCfg', reportCfgController.getReportUserCfg);
     rptTplRouter.post('/getMappingFields', reportCfgController.getAllMappingFields);

+ 2 - 2
public/web/rpt_value_define.js

@@ -235,8 +235,8 @@ const JV = {
 
     ORIENTATION_PORTRAIT: "PORTRAIT",
     ORIENTATION_LANDSCAPE: "LANDSCAPE",
-    ORIENTATION_PORTRAIT_CHN: "纵",
-    ORIENTATION_LANDSCAPE_CHN: "横",
+    ORIENTATION_PORTRAIT_CHN: "纵",
+    ORIENTATION_LANDSCAPE_CHN: "横",
     SIZE_A3: [11.69, 16.54],
     SIZE_A4: [8.27, 11.69],
     SIZE_A5: [5.83, 8.27],

+ 1 - 1
test/unit/reports/rpt_cfg.js

@@ -73,7 +73,7 @@ module.exports = {
             "FontAngle" : "0"
         },
         {
-            "ID" : "GramdTotal",
+            "ID" : "GrandTotal",
             "CfgDispName" : "总合计",
             "Name" : "smartSimSun",
             "FontHeight" : "12",

+ 76 - 0
test/unit/reports/test_rpt_cust_cfg.js

@@ -0,0 +1,76 @@
+/**
+ * Created by Tony on 2018/4/19.
+ */
+
+let test = require('tape');
+
+let config = require("../../../config/config.js");
+config.setupDb(process.env.NODE_ENV);
+let mongoose = require("mongoose");
+let fileUtils = require("../../../modules/common/fileUtils");
+let path = require('path');
+let dbm = require("../../../config/db/db_manager");
+let rpt_cfg = require('./rpt_cfg');
+dbm.connect(process.env.NODE_ENV);
+
+//统一引用models
+fileUtils.getGlobbedFiles('../../../modules/all_models/*.js').forEach(function(modelPath) {
+    require(path.resolve(modelPath));
+});
+
+let cfgCacheUtil = require("../../../config/cacheCfg");
+cfgCacheUtil.setupDftCache();
+
+let fsUtil = require("../../../public/fsUtil");
+
+//*/
+let userId_Leng = "59cdf14a0034a1000ba52b97"; //小冷User Id 换成_id了
+let userId_Dft = userId_Leng;
+/*/
+ let userId_Dft = "595328da1934dc327cad08eb";
+ //*/
+
+let rptCustCfgFacade = require("../../../modules/reports/facade/rpt_cust_cfg_facade");
+
+let fs = require('fs');
+//设置Date Format函数
+fs.readFile(__dirname.slice(0, __dirname.length - 18) + '/public/web/date_util.js', 'utf8', 'r', function (err, data) {
+    eval(data);
+});
+
+//*
+test('测试 - 用户自定义报表配置: ', function (t) {
+    let userIds = [];
+    userIds.push(userId_Leng);
+    userIds.push('-100');
+    rptCustCfgFacade.getCustomizeCfg(userIds).then(function(custCfg) {
+        // console.log(custCfg);
+        if (custCfg.length > 1) {
+            // let rst = null;
+            for (let itemCfg of custCfg) {
+                let doc = (itemCfg._doc)?itemCfg._doc:itemCfg;
+                if (doc.userId === userId_Leng) {
+                    // rst = doc;
+                    console.log(doc);
+                    break;
+                }
+            }
+        }
+        // console.log(err);
+        // console.log(msg);
+        t.pass('pass succeeded!');
+        t.end();
+    });
+});
+//*/
+
+test('close the connection', function (t) {
+    setTimeout(function () {
+        mongoose.disconnect();
+        t.pass('closing db connection');
+        t.end();
+    }, 500);
+    // mongoose.disconnect();
+    // t.pass('closing db connection');
+    // t.end();
+});

+ 193 - 0
web/building_saas/report/html/rpt_content_format.html

@@ -0,0 +1,193 @@
+<div class="modal fade" id="content_format" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">格式</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="row mb-1">
+                    <div class="col-3">
+                        表标题
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>宋体</option></select>
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>20</option></select>
+                    </div>
+                    <div class="col-3">
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="加粗"><i class="fa fa-bold"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="斜体"><i class="fa fa-italic"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="下划线"><i class="fa fa-underline"></i></a>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                        表栏头
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>宋体</option></select>
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>20</option></select>
+                    </div>
+                    <div class="col-3">
+                        <a href="" class="btn btn-sm btn-outline-secondary active" title="加粗"><i class="fa fa-bold"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="斜体"><i class="fa fa-italic"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="下划线"><i class="fa fa-underline"></i></a>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                        表正文
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>宋体</option></select>
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>20</option></select>
+                    </div>
+                    <div class="col-3">
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="加粗"><i class="fa fa-bold"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary active" title="斜体"><i class="fa fa-italic"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="下划线"><i class="fa fa-underline"></i></a>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                        表合计
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>宋体</option></select>
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>20</option></select>
+                    </div>
+                    <div class="col-3">
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="加粗"><i class="fa fa-bold"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="斜体"><i class="fa fa-italic"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary active" title="下划线"><i class="fa fa-underline"></i></a>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                        表眉表脚
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>宋体</option></select>
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>20</option></select>
+                    </div>
+                    <div class="col-3">
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="加粗"><i class="fa fa-bold"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="斜体"><i class="fa fa-italic"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="下划线"><i class="fa fa-underline"></i></a>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                        页眉页脚
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>宋体</option></select>
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>20</option></select>
+                    </div>
+                    <div class="col-3">
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="加粗"><i class="fa fa-bold"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="斜体"><i class="fa fa-italic"></i></a>
+                        <a href="" class="btn btn-sm btn-outline-secondary" title="下划线"><i class="fa fa-underline"></i></a>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                        表格线粗
+                    </div>
+                    <div class="col-4">
+                        <select class="form-control form-control-sm"><option>1</option></select>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                        边框线粗
+                    </div>
+                    <div class="col-4">
+                        <select class="form-control form-control-sm"><option>1</option></select>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-4">
+                        <div class="form-check">
+                            <label class="form-check-label">
+                                <input type="checkbox" class="form-check-input">
+                                报表边框横线
+                            </label>
+                        </div>
+                    </div>
+                    <div class="col-4">
+                        <div class="form-check">
+                            <label class="form-check-label">
+                                <input type="checkbox" class="form-check-input">
+                                报表边框竖线
+                            </label>
+                        </div>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-4">
+                        <div class="form-check">
+                            <label class="form-check-label">
+                                <input type="checkbox" class="form-check-input">
+                                报表表格横线
+                            </label>
+                        </div>
+                    </div>
+                    <div class="col-4">
+                        <div class="form-check">
+                            <label class="form-check-label">
+                                <input type="checkbox" class="form-check-input">
+                                报表表格竖线
+                            </label>
+                        </div>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-4">
+                        <div class="form-check">
+                            <label class="form-check-label">
+                                <input type="checkbox" class="form-check-input">
+                                自动换行打印
+                            </label>
+                        </div>
+                    </div>
+                    <div class="col-4">
+                        <div class="form-check">
+                            <label class="form-check-label">
+                                <input type="checkbox" class="form-check-input">
+                                内容窄体输出
+                            </label>
+                        </div>
+                    </div>
+                    <div class="col-4">
+                        <div class="form-check">
+                            <label class="form-check-label">
+                                <input type="checkbox" class="form-check-input">
+                                小数补0
+                            </label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-link float-left" data-dismiss="modal">恢复默认值</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="" class="btn btn-primary">确定</a>
+            </div>
+        </div>
+    </div>
+</div>

+ 38 - 0
web/building_saas/report/html/rpt_export.html

@@ -0,0 +1,38 @@
+<div class="modal fade" id="export" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">选择导出格式</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="row">
+                    <div class="col-6">
+                        <a class="btn btn-block btn-outline-secondary" id="PDF_TYPE" onclick="rptControlObj.changeType('PDF')">
+                            <!-- <i class="fa fa-check-square pull-right"></i> -->
+                            <div class="card-body text-center">
+                                <h1 class="display-3"><i class="fa fa-file-pdf-o"></i></h1>
+                                <h1>PDF</h1>
+                            </div>
+                        </a>
+                    </div>
+                    <div class="col-6">
+                        <a class="btn btn-block btn-primary" id="EXCEL_TYPE" onclick="rptControlObj.changeType('Excel')">
+                            <!-- <i class="fa fa-check-square pull-right"></i> -->
+                            <div class="card-body text-center">
+                                <h1 class="display-3"><i class="fa fa-file-excel-o"></i></h1>
+                                <h1>Excel</h1>
+                            </div>
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a onclick="rptControlObj.outputRpt();" class="btn btn-primary">确定</a>
+            </div>
+        </div>
+    </div>
+</div>

+ 11 - 105
web/building_saas/report/html/rpt_main.html

@@ -28,19 +28,15 @@
                         <div class="panel-body">
                             <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
                                 <div class="btn-group" role="group">
-                                    <button id="btnGroupDrop1" type="button" class="btn btn-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                        纵向
-                                    </button>
+                                    <button id="btnRptOrientation" type="button" class="btn btn-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">纵向</button>
                                     <div class="dropdown-menu" aria-labelledby="btnGroupDrop1">
-                                        <a class="dropdown-item" href="#">横向</a>
+                                        <a class="dropdown-item" id="hrefRptOrientation" onclick="zTreeOprObj.changeOrientation(this)">横向</a>
                                     </div>
                                 </div>
                                 <div class="btn-group" role="group">
-                                    <button id="btnGroupDrop2" type="button" class="btn btn-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                                        A4
-                                    </button>
+                                    <button id="btnRptPageSize" type="button" class="btn btn-secondary btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">A4</button>
                                     <div class="dropdown-menu" aria-labelledby="btnGroupDrop2">
-                                        <a class="dropdown-item" href="#">A3</a>
+                                        <a class="dropdown-item" id="hrefRptPageSize" onclick="zTreeOprObj.changePageSize(this)">A3</a>
                                     </div>
                                 </div>
                             </div>
@@ -52,8 +48,8 @@
                     <div class="panel">
                         <div class="panel-body">
                             <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
-                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#paper"><i class="fa fa-file-o"></i> 页边距</button>
-                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#content"><i class="fa fa-file-text-o"></i> 页面</button>
+                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#paper_margins"><i class="fa fa-file-o"></i> 页边距</button>
+                                <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#content_format"><i class="fa fa-file-text-o"></i> 页面</button>
                                 <!--
                                 <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#format"><i class="fa fa-bold"></i> 格式</button>
                                 -->
@@ -90,102 +86,12 @@
     </div>
 </div>
 <!--报表的弹窗-->
-<!--1弹出纸张-->
-<div class="modal fade" id="paper" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">纸张</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="" class="btn btn-primary">确定</a>
-            </div>
-        </div>
-    </div>
-</div>
-<!--2弹出页面-->
-<div class="modal fade" id="format" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">格式</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="" class="btn btn-primary">确定</a>
-            </div>
-        </div>
-    </div>
-</div>
-<!--3弹出格式-->
-<div class="modal fade" id="content" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">内容</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="" class="btn btn-primary">确定</a>
-            </div>
-        </div>
-    </div>
-</div>
+<!--1弹出纸张页边距-->
+<%include ./rpt_margins.html %>
+<!--2弹出页面格式-->
+<%include ./rpt_content_format.html %>
 <!--弹出导出-->
-<div class="modal fade" id="export" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">选择导出格式</h5>
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                    <span aria-hidden="true">&times;</span>
-                </button>
-            </div>
-            <div class="modal-body">
-                <div class="row">
-                    <div class="col-6">
-                        <a class="btn btn-block btn-outline-secondary" id="PDF_TYPE" onclick="rptControlObj.changeType('PDF')">
-                            <!-- <i class="fa fa-check-square pull-right"></i> -->
-                            <div class="card-body text-center">
-                                <h1 class="display-3"><i class="fa fa-file-pdf-o"></i></h1>
-                                <h1>PDF</h1>
-                            </div>
-                        </a>
-                    </div>
-                    <div class="col-6">
-                        <a class="btn btn-block btn-primary" id="EXCEL_TYPE" onclick="rptControlObj.changeType('Excel')">
-                            <!-- <i class="fa fa-check-square pull-right"></i> -->
-                            <div class="card-body text-center">
-                                <h1 class="display-3"><i class="fa fa-file-excel-o"></i></h1>
-                                <h1>Excel</h1>
-                            </div>
-                        </a>
-                    </div>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a onclick="rptControlObj.outputRpt();" class="btn btn-primary">确定</a>
-            </div>
-        </div>
-    </div>
-</div>
+<%include ./rpt_export.html %>
 <script>
     const SCREEN_DPI = [];
     function getScreenDPI() {

+ 66 - 0
web/building_saas/report/html/rpt_margins.html

@@ -0,0 +1,66 @@
+<div class="modal fade" id="paper_margins" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">纸张</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="row mb-1">
+                    <div class="col-3">
+                        纸张大小
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>A4</option><option>A3</option></select>
+                    </div>
+                    <div class="col-3">
+                        纸张方向
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>纵向</option><option>横向</option></select>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                        缩放比例
+                    </div>
+                    <div class="col-3">
+                        <select class="form-control form-control-sm"><option>100%</option></select>
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                        页边距
+                    </div>
+                    <div class="input-group input-group-sm col-md-4">
+                        <label class="input-group-addon">上</label>
+                        <input type="number" class="form-control" value="12">
+                    </div>
+                    <div class="input-group input-group-sm col-md-4">
+                        <label class="input-group-addon">下</label>
+                        <input type="number" class="form-control" value="12">
+                    </div>
+                </div>
+                <div class="row mb-1">
+                    <div class="col-3">
+                    </div>
+                    <div class="input-group input-group-sm col-md-4">
+                        <label class="input-group-addon">左</label>
+                        <input type="number" class="form-control" value="12">
+                    </div>
+                    <div class="input-group input-group-sm col-md-4">
+                        <label class="input-group-addon">右</label>
+                        <input type="number" class="form-control" value="12">
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-link float-left" data-dismiss="modal">恢复默认值</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="" class="btn btn-primary">确定</a>
+            </div>
+        </div>
+    </div>
+</div>

+ 87 - 39
web/building_saas/report/js/rpt_main.js

@@ -13,10 +13,11 @@ let rptTplObj = {
     iniPage: function() {
         let me = this;
         if (!me.hasInitialized) {
-            zTreeOprObj.getReportTemplateTree(userID);
+            zTreeOprObj.getCustomerCfg();
+            zTreeOprObj.getReportTemplateTree();
             me.hasInitialized = true;
             let canvas = document.getElementById("rptCanvas");
-            canvas.onclick = canvasOprObj.cavansOnClick;
+            canvas.onclick = canvasOprObj.canvasOnClick;
             canvas.onmousemove = canvasOprObj.canvasOnMouseMove;
         }
     }
@@ -26,18 +27,11 @@ let zTreeOprObj = {
     treeObj: null,
     currentNode: null,
     currentRptPageRst: null,
+    reportPageCfg: null,
     currentPage: 1,
     maxPages: 0,
-    getReportTemplateTree: function(userId) {
+    getReportTemplateTree: function() {
         let me = zTreeOprObj, params = {};
-        params.userId = [];
-        params.userId.push(userId);
-        params.userId.push(-100);
-        // let allEngIds = [];
-        // for (let item of engineeringList) {
-        //     allEngIds.push(item.value);
-        // }
-        // params.engineerId = allEngIds;
         params.engineerId = projectInfoObj.projectInfo.property.engineering;
         CommonAjax.postEx("report_tpl_api/getRptTplTree", params, 20000, true, function(result){
                 zTreeHelper.createTreeDirectly(result, rpt_tpl_setting, "rptTplTree", me);
@@ -45,6 +39,18 @@ let zTreeOprObj = {
             }, null, null
         );
     },
+    getCustomerCfg: function() {
+        let me = zTreeOprObj, params = {};
+        params.engineerId = projectInfoObj.projectInfo.property.engineering;
+        CommonAjax.postEx("report_tpl_api/getCustomizeCfg", params, 20000, true, function(result){
+                if (result) {
+                    me.reportPageCfg = result;
+                } else {
+                    me.reportPageCfg = null;
+                }
+            }, null, null
+        );
+    },
     refreshNodes: function() {
         let me = this;
         let private_setupIsParent = function(node){
@@ -69,36 +75,77 @@ let zTreeOprObj = {
     },
     onClick: function(event,treeId,treeNode) {
         let me = zTreeOprObj;
-        let canvas = document.getElementById("rptCanvas");
         if (treeNode.nodeType === TPL_TYPE_TEMPLATE && treeNode.refId > 0) {
             let params = {};
             let pageSize = rptControlObj.getCurrentPageSize();
-            params.user_id = userID;
             params.pageSize = pageSize;
             params.rpt_tpl_id = treeNode.refId;
             params.prj_id = projectInfoObj.projectInfo.ID;
             me.currentNode = treeNode;
-            CommonAjax.postEx("report_api/getReport", params, 5000, true,
-                function(result){
-                    let pageRst = result;
-                    if (pageRst) {
-                        me.currentRptPageRst = pageRst;
-                        me.maxPages = pageRst.items.length;
-                        me.currentPage = 1;
-                        me.displayPageValue();
-                        let size = JpcCanvasOutput.getReportSizeInPixel(me.currentRptPageRst, getScreenDPI());
-                        canvas.width = size[0] + 20;
-                        if (size[1] > size[0]) {
-                            canvas.height = size[1] + 100;
-                        } else {
-                            canvas.height = size[1] + 50;
-                        }
-                        me.showPage(1, canvas);
-                    }
-                }, null, null
-            );
+            me.requestReport(params);
+        }
+    },
+    changePageSize: function(dom) {
+        let me = zTreeOprObj,
+            targetDom = document.getElementById("btnRptPageSize");
+        let tmpStr = targetDom.innerHTML.trim();
+        targetDom.innerHTML = dom.innerHTML.trim();
+        dom.innerHTML = tmpStr;
+        me.changeCfg();
+
+    },
+    changeOrientation: function(dom) {
+        let me = zTreeOprObj,
+            targetDom = document.getElementById("btnRptOrientation");
+        let tmpStr = targetDom.innerHTML.trim();
+        targetDom.innerHTML = dom.innerHTML.trim();
+        dom.innerHTML = tmpStr;
+        me.changeCfg();
+    },
+    changeCfg: function() {
+        let me = zTreeOprObj;
+        let params = {};
+        params.pageSize = rptControlObj.getCurrentPageSize();
+        params.orientation = rptControlObj.getCurrentOrientation();
+        params.rpt_tpl_id = me.currentNode.refId;
+        params.prj_id = projectInfoObj.projectInfo.ID;
+        params.custCfg = me.reportPageCfg;
+        me.requestReport(params);
+    },
+    resetAfter: function (pageRst) {
+        let size = pageRst[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE].slice(0);
+        if (size[0] > size[1]) {
+            document.getElementById("btnRptOrientation").innerHTML = "横向";
+            document.getElementById("hrefRptOrientation").innerHTML = "纵向";
+        } else {
+            document.getElementById("btnRptOrientation").innerHTML = "纵向";
+            document.getElementById("hrefRptOrientation").innerHTML = "横向";
         }
     },
+    requestReport: function (params) {
+        let me = zTreeOprObj;
+        CommonAjax.postEx("report_api/getReport", params, 5000, true,
+            function(result){
+                let pageRst = result;
+                if (pageRst) {
+                    me.resetAfter(pageRst);
+                    let canvas = document.getElementById("rptCanvas");
+                    me.currentRptPageRst = pageRst;
+                    me.maxPages = pageRst.items.length;
+                    me.currentPage = 1;
+                    me.displayPageValue();
+                    let size = JpcCanvasOutput.getReportSizeInPixel(me.currentRptPageRst, getScreenDPI());
+                    canvas.width = size[0] + 20;
+                    if (size[1] > size[0]) {
+                        canvas.height = size[1] + 100;
+                    } else {
+                        canvas.height = size[1] + 50;
+                    }
+                    me.showPage(1, canvas);
+                }
+            }, null, null
+        );
+    },
     showPage: function (pageNum, canvas) {
         let me = zTreeOprObj;
         if (pageNum >= 1 && pageNum <= me.maxPages) {
@@ -133,7 +180,7 @@ let canvasOprObj = {
             }
         }
     },
-    cavansOnClick: function(event){
+    canvasOnClick: function(event){
         if (zTreeOprObj.currentNode) {
             let x = event.offsetX - JpcCanvasOutput.offsetX, canvas = event.originalTarget;
             if (!(canvas)) canvas = event.target; //chrome浏览器不认event.originalTarget,只认event.target或event.currentTarget
@@ -153,13 +200,14 @@ let canvasOprObj = {
 let rptControlObj = {
     currentOutputType: "Excel",
     getCurrentPageSize: function() {
-        let rst = "A4";
-        //
+        // let rst = "A4";
+        let rst = document.getElementById("btnRptPageSize").innerHTML.trim();
+        //btnRptPageSize
         return rst;
     },
     getCurrentOrientation: function() {
-        let rst = "横向";
-        //
+        // let rst = "横向";
+        let rst = document.getElementById("btnRptOrientation").innerHTML.trim();
         return rst;
     },
     getCurrentReportOption: function() {
@@ -199,7 +247,7 @@ let rptControlObj = {
             let orgRptName = zTreeOprObj.currentNode.name;
             orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_').replace(' ','');
             let url =  "/report_api/getExcel/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +
-                me.getCurrentPageSize() + "/" + orgRptName + "/" + false + "/" + 'normal';
+                me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName + "/" + false + "/" + 'normal';
             window.location = url;//这里不能使用get方法跳转,否则下载不成功
         }
     },
@@ -211,7 +259,7 @@ let rptControlObj = {
             let orgRptName = zTreeOprObj.currentNode.name;
             orgRptName = orgRptName.replace('【', '').replace('】','').replace('-','_');
             let url =  "/report_api/getPDF/" + projectInfoObj.projectInfo.ID + "/" + zTreeOprObj.currentNode.refId + "/" +
-                me.getCurrentPageSize() + "/" + orgRptName;
+                me.getCurrentPageSize() + "/" + me.getCurrentOrientation() + "/" + orgRptName;
             window.location = url;//这里不能使用get方法跳转,否则下载不成功
         }
     },