Pārlūkot izejas kodu

报表前端配置

TonyKang 5 gadi atpakaļ
vecāks
revīzija
2afe078c83

+ 13 - 4
app/controller/report_controller.js

@@ -63,7 +63,6 @@ module.exports = app => {
                     measureType,
                     // jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.ledger.explode),
                 };
-                // await this.layout('report/index.ejs', renderData, 'ledger/audit_modal.ejs');
                 await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
                 // await this.layout('report/index.ejs', renderData);
             } catch (err) {
@@ -92,7 +91,6 @@ module.exports = app => {
                     await ctx.render('report/rpt_printA3.ejs', renderData);
                 } else {
                     await ctx.render('report/rpt_print.ejs', renderData);
-                    // await this.layout('report/rpt_test_print.ejs', renderData);
                 }
             } catch (err) {
                 this.log(err);
@@ -441,7 +439,18 @@ function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) {
     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_RIGHT] = customizeCfg.margins[JV.PROP_RIGHT] / 10;
     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_TOP] = customizeCfg.margins[JV.PROP_TOP] / 10;
     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM] = customizeCfg.margins[JV.PROP_BOTTOM] / 10;
-    // 3. 边框竖线
+    // 3. 边框宽度
+    if (customizeCfg.hasOwnProperty('borderThick')) {
+        for (let i = 0; i < defProperties.styles.length; i++) {
+            const style = defProperties.styles[i];
+            if (style.ID === 'BORDER_ALL_AROUND') {
+                for (const border of style.border_style) {
+                    border.LineWeight = customizeCfg.borderThick;
+                }
+            }
+        }
+    }
+    // 4. 边框竖线
     if (!(customizeCfg.showVerticalLine)) {
         const private_copy_border = function(src) {
             const rst = {};
@@ -472,7 +481,7 @@ function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) {
         }
         defProperties.styles = newStyles;
     }
-    // 4. 补0
+    // 5. 补0
     const private_Setup_Format = function(tabFields) {
         if (tabFields) {
             for (const tabField of tabFields) {

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 8 - 0
app/public/jspdf/Arial Narrow-bold.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 8 - 0
app/public/jspdf/Arial Narrow-bolditalic.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 8 - 0
app/public/jspdf/Arial Narrow-italic.js


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 8 - 0
app/public/jspdf/Arial Narrow-normal.js


+ 16 - 4
app/public/report/js/rpt_jspdf.js

@@ -126,6 +126,14 @@ let JpcJsPDFHelper = {
             }
         }
 
+        function setupDocFontByCfg(doc, fontName, font) {
+            if (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T') {
+                doc.setFont(fontName, "bold");
+            } else {
+                doc.setFont(fontName, "normal");
+            }
+        }
+
         function private_drawCellText(doc, ctx, cell, fonts, controls) {
             if (cell[JV.PROP_VALUE]) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -136,11 +144,15 @@ let JpcJsPDFHelper = {
                 } else {
                     font = cell[JV.PROP_FONT];
                 }
-                if (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T') {
-                    doc.setFont("SmartSimsun", "bold");
-                    // doc.setFontStyle("bold");
+                if (CUST_CFG.isNarrow) {
+                    // 目前只考虑宋体及窄体
+                    if (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_NAME]] === 'Arial Narrow') {
+                        setupDocFontByCfg(doc, 'Arial Narrow', font);
+                    } else {
+                        setupDocFontByCfg(doc, 'SmartSimsun', font);
+                    }
                 } else {
-                    doc.setFont("SmartSimsun", "normal");
+                    setupDocFontByCfg(doc, 'SmartSimsun', font);
                 }
                 // let control = controls[cell[JV.PROP_CONTROL]];
                 let control = null;

+ 56 - 35
app/public/report/js/rpt_main.js

@@ -18,13 +18,17 @@ let rptTplObj = {
     iniPage: function() {
         let me = this;
         if (!me.hasInitialized) {
-            // zTreeOprObj.getCustomerCfg();
             zTreeOprObj.getReportTemplateTree();
             zTreeOprObj.selectedPrjIDs = [];
             me.hasInitialized = true;
             zTreeOprObj.canvas = document.getElementById("rptCanvas");
             // canvas.onclick = canvasOprObj.canvasOnClick;
             // canvas.onmousemove = canvasOprObj.canvasOnMouseMove;
+            dynamicLoadJs('/public/jspdf/Arial Narrow-normal.js');
+            dynamicLoadJs('/public/jspdf/Arial Narrow-bold.js');
+            dynamicLoadJs('/public/jspdf/Arial Narrow-italic.js');
+            dynamicLoadJs('/public/jspdf/Arial Narrow-bolditalic.js');
+
             dynamicLoadJs('/public/jspdf/SmartSimsun-normal.js');
             dynamicLoadJs('/public/jspdf/SmartSimsun-bold.js', me.pdfFontSimsunCallBack);
         }
@@ -102,6 +106,18 @@ let zTreeOprObj = {
         zTreeHelper.createTreeDirectly(topTreeNodesValue, rpt_tpl_setting, "rptTplTree", me);
         me.refreshNodes();
     },
+    getCustomerCfg: function() {
+        let me = zTreeOprObj;
+        me.defReportPageCfg = {};
+        Object.assign(me.defReportPageCfg, CUST_CFG);
+        me.defReportPageCfg.margins = {};
+        Object.assign(me.defReportPageCfg.margins, CUST_CFG.margins);
+        me.defReportPageCfg.fonts = [];
+        for (let fi = 0; fi < CUST_CFG.fonts.length; fi++) {
+            me.defReportPageCfg.fonts.push({});
+            Object.assign(me.defReportPageCfg.fonts[fi], CUST_CFG.fonts[fi]);
+        }
+    },
     iniFontCfgDom: function (cfg) {
         for (let font of cfg.fonts) {
             let domArrs = [];
@@ -112,7 +128,8 @@ let zTreeOprObj = {
             //2. font name
             domArrs.push("<div class='col-3'>");
             domArrs.push("<select class='form-control input-sm' id='fontName_" + fontPropSuffix + "' onchange='rptControlObj.changeFontMain(\"" + font.CfgDispName + "\", \"Name\", this)'>");
-            domArrs.push("<option>宋体</option><option>楷体</option><option>黑体</option>");
+            domArrs.push("<option>宋体</option>");
+            // <option>楷体</option><option>黑体</option> // 因导出PDF调整到前端输出,字体文件大,支持的字体要谨慎些,不轻易多加字体
             domArrs.push("</select>");
             domArrs.push("</div>");
             //3. font height
@@ -133,11 +150,16 @@ let zTreeOprObj = {
         }
     },
     renderRptCfg: function (cfg) {
-        $("#elementMargin_Left").get(0).value = cfg.margins.Left;
-        $("#elementMargin_Right").get(0).value = cfg.margins.Right;
-        $("#elementMargin_Top").get(0).value = cfg.margins.Top;
-        $("#elementMargin_Bottom").get(0).value = cfg.margins.Bottom;
-
+        this.renderMargin(cfg);
+        this.renderFormat(cfg);
+    },
+    renderMargin: function (cfg) {
+        $("#elementMargin_Left")[0].value = cfg.margins.Left;
+        $("#elementMargin_Right")[0].value = cfg.margins.Right;
+        $("#elementMargin_Top")[0].value = cfg.margins.Top;
+        $("#elementMargin_Bottom")[0].value = cfg.margins.Bottom;
+    },
+    renderFormat: function (cfg) {
         for (let font of cfg.fonts) {
             let fontPropSuffix = fontSuffixMapObj[font.CfgDispName];
             document.getElementById("fontName_" + fontPropSuffix).value = font.Name;
@@ -146,16 +168,16 @@ let zTreeOprObj = {
             document.getElementById("font_italic_" + fontPropSuffix).className = (font.FontItalic === "T")?"btn btn-sm btn-outline-secondary active":"btn btn-sm btn-outline-secondary";
             document.getElementById("font_underline_" + fontPropSuffix).className = (font.FontUnderline === "T")?"btn btn-sm btn-outline-secondary active":"btn btn-sm btn-outline-secondary";
         }
-        document.getElementById("rpt_vertical_line").checked = cfg.showVerticalLine;
-        document.getElementById("rpt_narrow").checked = cfg.isNarrow;
-        // document.getElementById("rpt_narrow").checked = false;
-        document.getElementById("rpt_fill_zero").checked = cfg.fillZero;
+        document.getElementById("cfg_border_thick").value = cfg.borderThick;
+        document.getElementById("cfg_rpt_vertical_line").checked = cfg.showVerticalLine;
+        document.getElementById("cfg_rpt_fill_zero").checked = cfg.fillZero;
+        document.getElementById("cfg_rpt_narrow").checked = cfg.isNarrow;
     },
     extractRptCfg: function (cfg) {
-        cfg.margins.Left = $("#elementMargin_Left").get(0).value;
-        cfg.margins.Right = $("#elementMargin_Right").get(0).value;
-        cfg.margins.Top = $("#elementMargin_Top").get(0).value;
-        cfg.margins.Bottom = $("#elementMargin_Bottom").get(0).value;
+        cfg.margins.Left = $("#elementMargin_Left")[0].value;
+        cfg.margins.Right = $("#elementMargin_Right")[0].value;
+        cfg.margins.Top = $("#elementMargin_Top")[0].value;
+        cfg.margins.Bottom = $("#elementMargin_Bottom")[0].value;
 
         for (let font of cfg.fonts) {
             let fontPropSuffix = fontSuffixMapObj[font.CfgDispName];
@@ -165,9 +187,10 @@ let zTreeOprObj = {
             font.FontItalic = (document.getElementById("font_italic_" + fontPropSuffix).className === "btn btn-sm btn-outline-secondary active")?"T":"F";
             font.FontUnderline = (document.getElementById("font_underline_" + fontPropSuffix).className === "btn btn-sm btn-outline-secondary active")?"T":"F";
         }
-        cfg.showVerticalLine = document.getElementById("rpt_vertical_line").checked;
-        cfg.isNarrow = document.getElementById("rpt_narrow").checked;
-        cfg.fillZero = document.getElementById("rpt_fill_zero").checked;
+        cfg.showVerticalLine = document.getElementById("cfg_rpt_vertical_line").checked;
+        cfg.isNarrow = document.getElementById("cfg_rpt_narrow").checked;
+        cfg.fillZero = document.getElementById("cfg_rpt_fill_zero").checked;
+        cfg.borderThick = document.getElementById("cfg_border_thick").value;
     },
     refreshNodes: function() {
         let me = this;
@@ -337,7 +360,7 @@ let zTreeOprObj = {
     },
     displayPageValue: function() {
         let me = zTreeOprObj;
-        $("#rpt_page_num").get(0).value = me.currentPage + "/" + me.maxPages;
+        $("#rpt_page_num")[0].value = me.currentPage + "/" + me.maxPages;
     }
 };
 
@@ -391,9 +414,6 @@ let rptControlObj = {
         let rst = document.getElementById("btnRptOrientation").innerHTML.trim();
         return rst;
     },
-    getCurrentReportOption: function() {
-        //
-    },
     changeType: function(newType) {
         let me = rptControlObj;
         let excelDom = document.getElementById("EXCEL_TYPE");
@@ -410,16 +430,6 @@ let rptControlObj = {
             //me.currentOutputType = newType;
         }
     },
-    outputRpt: function() {
-        let me = rptControlObj;
-        if (me.currentOutputType === "Excel") {
-            me.getExcel();
-        } else if (me.currentOutputType === "PDF") {
-            me.getPDF();
-        } else {
-            //other types if needed.
-        }
-    },
     getTplIdsCommon: function (refRptTplIds, rpt_names) {
         for (let node of zTreeOprObj.checkedRptTplNodes) {
             if (node.hasOwnProperty('flags') && node.flags.hasOwnProperty('reportType') && node['flags']['reportType'] !== 'NA') {
@@ -525,9 +535,9 @@ let rptControlObj = {
     },
     getExcel: function () {
         let me = rptControlObj;
-        if ($("#excelExportType_AllInOneBook").get(0).checked) {
+        if ($("#excelExportType_AllInOneBook")[0].checked) {
             me.getAllInOneBook();
-        } else if ($("#excelExportType_IndividualBook").get(0).checked) {
+        } else if ($("#excelExportType_IndividualBook")[0].checked) {
             me.getAllIndividualExcelBook();
         }
     },
@@ -609,6 +619,9 @@ let rptControlObj = {
             }
         }
     },
+    changeBorderWeight: function (dom) {
+        CUST_CFG.borderThick = dom.value;
+    },
     changeCfgOption: function (optStr, dom) {
         CUST_CFG[optStr] = dom.checked;
     },
@@ -626,11 +639,19 @@ let rptControlObj = {
             }
         }
     },
+    restoreMargine: function () {
+        zTreeOprObj.renderMargin(zTreeOprObj.defReportPageCfg);
+        zTreeOprObj.extractRptCfg(CUST_CFG);
+    },
+    restoreFormat: function () {
+        zTreeOprObj.renderFormat(zTreeOprObj.defReportPageCfg);
+        zTreeOprObj.extractRptCfg(CUST_CFG);
+    },
     restoreCustCFG: function () {
         let me = this;
         zTreeOprObj.renderRptCfg(zTreeOprObj.defReportPageCfg);
         zTreeOprObj.extractRptCfg(CUST_CFG);
-        me.saveCustCfg();
+        // me.saveCustCfg();
     },
     saveCustCfg: function() {
         let params = {};

+ 3 - 3
app/view/report/index.ejs

@@ -90,8 +90,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-outline-primary btn-sm" data-toggle="modal" data-target="#paper"><i class="fa fa-file-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="#paper" onclick="zTreeOprObj.renderRptCfg(CUST_CFG)"><i class="fa fa-file-o"></i> 纸张</button>
+                                        <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#format" onclick="zTreeOprObj.renderRptCfg(CUST_CFG)"><i class="fa fa-bold"></i> 格式</button>
                                     </div>
                                 </div>
                                 <div class="panel-foot text-muted">
@@ -136,7 +136,7 @@
         </div>
     </div>
 </div>
-<!--1弹出纸张页边距-->
+
 <script src="/public/js/sub_menu.js"></script>
 <script>
     $.subMenu({

+ 30 - 20
app/view/report/rpt_all_popup.ejs

@@ -12,9 +12,9 @@
                     <div class="col-3">
                         <div class="input-group input-group-sm ">
                             <div class="input-group-prepend">
-                                <span class="input-group-text" id="basic-addon1">上</span>
+                                <span class="input-group-text">上</span>
                             </div>
-                            <input type="number" class="form-control" value="12">
+                            <input type="number" class="form-control" id="elementMargin_Top" value="12" onchange="rptControlObj.changeMargin('Top', this)" onkeyup="rptControlObj.changeMargin('Top', this)">
                         </div>
                     </div>
                 </div>
@@ -22,9 +22,9 @@
                     <div class="col-3">
                         <div class="input-group input-group-sm ">
                             <div class="input-group-prepend">
-                                <span class="input-group-text" id="basic-addon2">左</span>
+                                <span class="input-group-text">左</span>
                             </div>
-                            <input type="number" class="form-control" value="12">
+                            <input type="number" class="form-control" id="elementMargin_Left" value="12" onchange="rptControlObj.changeMargin('Left', this)" onkeyup="rptControlObj.changeMargin('Left', this)">
                         </div>
                     </div>
                     <div class="col-6">
@@ -33,9 +33,9 @@
                     <div class="col-3">
                         <div class="input-group input-group-sm ">
                             <div class="input-group-prepend">
-                                <span class="input-group-text" id="basic-addon3">右</span>
+                                <span class="input-group-text">右</span>
                             </div>
-                            <input type="number" class="form-control" value="12">
+                            <input type="number" class="form-control" id="elementMargin_Right" value="12" onchange="rptControlObj.changeMargin('Right', this)" onkeyup="rptControlObj.changeMargin('Right', this)">
                         </div>
                     </div>
                 </div>
@@ -43,17 +43,17 @@
                     <div class="col-3">
                         <div class="input-group input-group-sm ">
                             <div class="input-group-prepend">
-                                <span class="input-group-text" id="basic-addon4">下</span>
+                                <span class="input-group-text">下</span>
                             </div>
-                            <input type="number" class="form-control" value="12">
+                            <input type="number" class="form-control" id="elementMargin_Bottom"value="12" onchange="rptControlObj.changeMargin('Bottom', this)" onkeyup="rptControlObj.changeMargin('Bottom', this)">
                         </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-link float-left" data-dismiss="modal" onclick="rptControlObj.restoreMargine(); zTreeOprObj.changeCfg();">恢复默认值</button>
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-                <a href="" class="btn btn-primary">确定</a>
+                <a href="javascript:void(0)" class="btn btn-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</a>
             </div>
         </div>
     </div>
@@ -62,7 +62,7 @@
     <div class="modal-dialog" role="document">
         <div class="modal-content">
             <div class="modal-header">
-                <h5 class="modal-title">格式</h5><h5 class="modal-title" id="update_msg_response"></h5>
+                <h5 class="modal-title">格式</h5>
                 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                 </button>
@@ -70,26 +70,32 @@
             <div class="modal-body">
                 <div class="row mb-1" id="font_cfg_blank_flag"></div>
                 <div class="row mb-1">
+                    <div class="col-3">边框线粗</div>
+                    <div class="col-4">
+                        <select class="form-control form-control-sm" id="cfg_border_thick" onchange="rptControlObj.changeBorderWeight(this)"><option>1</option><option>2</option></select>
+                    </div>
+                </div>
+                <div class="row mb-1">
                     <div class="col-4">
                         <div class="form-check">
                             <label class="form-check-label">
-                                <input id="rpt_vertical_line" type="checkbox" class="form-check-input" onchange="rptControlObj.changeCfgOption('showVerticalLine', this)">
-                                边框竖线
+                                <input type="checkbox" class="form-check-input" id="cfg_rpt_vertical_line" onchange="rptControlObj.changeCfgOption('showVerticalLine', this)">
+                                报表边框竖线
                             </label>
                         </div>
                     </div>
-                    <div class="col-4" style="display: none">
+                    <div class="col-4">
                         <div class="form-check">
                             <label class="form-check-label">
-                                <input id="rpt_narrow" type="checkbox" class="form-check-input" onchange="rptControlObj.changeCfgOption('isNarrow', this)">
-                                窄体输出
+                                <input type="checkbox" class="form-check-input" id="cfg_rpt_narrow" onchange="rptControlObj.changeCfgOption('isNarrow', this)">
+                                内容窄体输出
                             </label>
                         </div>
                     </div>
                     <div class="col-4">
                         <div class="form-check">
                             <label class="form-check-label">
-                                <input id="rpt_fill_zero" type="checkbox" class="form-check-input" onchange="rptControlObj.changeCfgOption('fillZero', this)">
+                                <input type="checkbox" class="form-check-input" id="cfg_rpt_fill_zero" onchange="rptControlObj.changeCfgOption('fillZero', this)">
                                 小数补0
                             </label>
                         </div>
@@ -97,10 +103,9 @@
                 </div>
             </div>
             <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-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</button>
+                <button type="button" class="btn btn-link float-left" data-dismiss="modal" onclick="rptControlObj.restoreFormat(); zTreeOprObj.changeCfg();">恢复默认值</button>
                 <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="javascript:void(0)" class="btn btn-primary" data-dismiss="modal" onclick="rptControlObj.confirmCfgChange()">确定</a>
             </div>
         </div>
     </div>
@@ -239,3 +244,8 @@
         </div>
     </div>
 </div>
+
+<script>
+    zTreeOprObj.getCustomerCfg();
+    zTreeOprObj.iniFontCfgDom(CUST_CFG);
+</script>

+ 0 - 2
app/view/report/rpt_test_print.ejs

@@ -1,2 +0,0 @@
-<div class="panel-content">
-</div>