Browse Source

报表细化控制(定制报表)

TonyKang 5 years ago
parent
commit
1d3b260c30
3 changed files with 79 additions and 36 deletions
  1. 1 1
      app/controller/report_controller.js
  2. 9 5
      app/view/report/index.ejs
  3. 69 30
      app/view/report/rpt_all_popup.ejs

+ 1 - 1
app/controller/report_controller.js

@@ -133,7 +133,7 @@ module.exports = app => {
                 for (const prjAcc of prjAccList) {
                     prjAcc.account_group = accountGroup[prjAcc.account_group];
                 }
-                let rpt_tpl_items = '{ customize: { "isDftAll": true }, common: [] }';
+                let rpt_tpl_items = '{ customize: [], common: [] }';
                 if (custTreeNodes.length > 0) {
                     rpt_tpl_items = custTreeNodes[0].rpt_tpl_items;
                 }

+ 9 - 5
app/view/report/index.ejs

@@ -21,8 +21,8 @@
                 <div class="d-inline-block">
                     <ul class="nav nav-pills m-0">
                         <li class="nav-item mr-1"><a href="#man-c" data-toggle="modal" data-target="#man-c" class=" btn btn-outline-primary btn-sm"><i class="fa fa-cog"></i> 通用报表</a></li>
+                        <li class="nav-item"><a href="#man-i" data-toggle="modal" data-target="#man-i" class=" btn btn-outline-primary btn-sm"><i class="fa fa-plus"></i> 定制报表</a></li>
                         <!--
-                        <li class="nav-item"><a href="#add-c" data-toggle="modal" data-target="#add-c" class=" btn btn-outline-primary btn-sm"><i class="fa fa-plus"></i> 定制报表</a></li>
                         -->
                     </ul>
                 </div>
@@ -264,6 +264,9 @@
 <script type="text/javascript">
     let TOP_TREE_NODES = <%- rpt_tpl_data %>;
     const CUST_TREE_NODES = <%- cust_tpl_data %>;
+    if (!(CUST_TREE_NODES.customize instanceof Array)) {
+        CUST_TREE_NODES.customize = [];
+    }
     const ORG_CUST_TREE_NODES = JSON.parse(JSON.stringify(CUST_TREE_NODES));
     let CUST_CFG = <%- cust_cfg %>;
     CUST_CFG = JSON.parse(CUST_CFG[0].cfg_content);
@@ -355,16 +358,16 @@
         return SCREEN_DPI;
     }
 
-    function filterUnchkTplTreeNode(topNode) {
+    function filterUnchkTplTreeNode(topNode, srcData) {
         for (let rIdx = topNode.items.length - 1; rIdx >= 0; rIdx--) {
-            if (CUST_TREE_NODES.common.indexOf(topNode.items[rIdx].name) < 0) {
+            if (srcData.indexOf(topNode.items[rIdx].name) < 0) {
                 //topNode.items.splice(rIdx, 1);
                 //支持第二层判断
                 //备注:如果选择了父项,那不用再去判断子项
                 if (topNode.items[rIdx].items && topNode.items[rIdx].items.length > 0) {
                     for (let rIdx2 = topNode.items[rIdx].items.length - 1; rIdx2 >= 0; rIdx2--) {
                         let tName = topNode.items[rIdx].name + FOLDER_SEPERATER + topNode.items[rIdx].items[rIdx2].name;
-                        if (CUST_TREE_NODES.common.indexOf(tName) < 0) {
+                        if (srcData.indexOf(tName) < 0) {
                             topNode.items[rIdx].items.splice(rIdx2, 1);
                         }
                     }
@@ -391,8 +394,9 @@
                 }
             }
             // 1.1 移除未被选择的模板
-            filterUnchkTplTreeNode(TOP_TREE_NODES[0]);
+            filterUnchkTplTreeNode(TOP_TREE_NODES[0], CUST_TREE_NODES.common);
             TOP_TREE_NODES.unshift(individualNode); //定制在前
+            filterUnchkTplTreeNode(TOP_TREE_NODES[0], CUST_TREE_NODES.customize);
             //2. 原始的模板树(恢复用)
             const individualNodeOrg = {id: 99999, name: '定制报表', pid: -1, rpt_type: 0, items: [], isParent: true};
             for (let tnIdx = ORG_TOP_TREE_NODES.length - 1; tnIdx >= 0; tnIdx--) {

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

@@ -360,7 +360,28 @@
                 </div>
             </div>
             <div class="modal-footer">
-                <button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="revertCustRptCfg();">关闭</button>
+                <button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="revertCommonCustRptCfg();">关闭</button>
+                <!--有结果出现添加-->
+                <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="updateCustRptCfg()">确认</button>
+            </div>
+        </div>
+    </div>
+</div>
+<!--管理定制报表-->
+<div class="modal fade" id="man-i" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">管理定制报表</h5>
+            </div>
+            <div class="modal-body">
+                <div class="modal-height-500" style="overflow: auto;">
+                    <table class="table table-sm table-bordered" id="report_cust_group_individual">
+                    </table>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal" onclick="revertIndividualCustRptCfg();">关闭</button>
                 <!--有结果出现添加-->
                 <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="updateCustRptCfg()">确认</button>
             </div>
@@ -371,7 +392,8 @@
 <script>
     zTreeOprObj.getCustomerCfg();
     zTreeOprObj.iniFontCfgDom(CUST_CFG);
-    buildCommonCustRpt();
+    buildCustRptCommon('report_cust_group_common', ORG_TOP_TREE_NODES[1], CUST_TREE_NODES.common, 'true');
+    buildCustRptCommon('report_cust_group_individual', ORG_TOP_TREE_NODES[0], CUST_TREE_NODES.customize, 'false');
 
     function searchAccount() {
         if (event.keyCode == 13) {
@@ -379,9 +401,8 @@
         }
     }
 
-    function buildCommonCustRpt() {
-        //CUST_TREE_NODES
-        let tbDom = $("#report_cust_group_common");
+    function buildCustRptCommon(tbDomId, topTreeNode, checkingArr, isCommonStr) {
+        let tbDom = $("#" + tbDomId);
         tbDom.empty();
         tbDom.append('<tr><th>类别</th><th>包含报表</th><th>显示</th></tr>');
         let _countAvailableTpls = function (tItem) {
@@ -397,7 +418,7 @@
             }
             return rst;
         };
-        let _pushRptLine = function (parentItem, rptItem, level, needChk) {
+        let _pushRptLine = function (parentItem, rptItem, level, needChk, parentNodeIdStr, thisItemSeq) {
             if (rptItem.nodeType === 1) {
                 let amt = _countAvailableTpls(rptItem);
                 let classStr = '';
@@ -406,30 +427,35 @@
                 }
                 if (needChk) {
                     let chkName = parentItem.name + FOLDER_SEPERATER + rptItem.name;
-                    let checkedStr = (CUST_TREE_NODES.common.indexOf(chkName) >= 0) ? ' checked' : '';
-                    tbDom.append('<tr><td class="' + classStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td><input onchange="changeFolder(this, true)" hiddenval="' + chkName + '" type="checkbox"' + checkedStr + '></td></tr>');
+                    let checkedStr = (checkingArr.indexOf(chkName) >= 0) ? ' checked' : '';
+                    let sIdStr = parentNodeIdStr + '_sub_' + thisItemSeq;
+                    tbDom.append('<tr><td class="' + classStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td><input id="' + sIdStr + '" onchange="changeFolder(this, ' + isCommonStr + ', "' + parentNodeIdStr + '")" hiddenval="' + chkName + '" type="checkbox"' + checkedStr + '></td></tr>');
                 } else {
                     tbDom.append('<tr><td class="' + classStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td></td></tr>');
                 }
-                //tbDom.append('<tr><td class="' + classStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td></td></tr>');
                 if (rptItem.items && rptItem.items.length > 0) {
                     for (const subItem of rptItem.items) {
-                        _pushRptLine(rptItem, subItem, level + 1, false);
+                        _pushRptLine(rptItem, subItem, level + 1, false, '');
                     }
                 }
             }
         }
         let TplAmts = [];
-        for (const topItem of ORG_TOP_TREE_NODES[1].items) {
+        let parentIdx = 0;
+        let subCnt = topTreeNode.items.length;
+        for (const topItem of topTreeNode.items) {
             TplAmts.push(_countAvailableTpls(topItem));
-            let checkedStr = (CUST_TREE_NODES.common.indexOf(topItem.name) >= 0) ? ' checked' : '';
-            //let checkedStr = (CUST_TREE_NODES.length > 0) ? ' checked' : '';
-            tbDom.append('<tr><td>' + topItem.name + '</td><td>' + TplAmts[TplAmts.length - 1] + '</td><td><input onchange="changeFolder(this, true)" hiddenval="' + topItem.name + '" type="checkbox"' + checkedStr + '></td></tr>');
+            let checkedStr = (checkingArr.indexOf(topItem.name) >= 0) ? ' checked' : '';
+            let pIdStr = tbDomId + '_' + parentIdx + '_' + subCnt;
+            tbDom.append('<tr><td>' + topItem.name + '</td><td>' + TplAmts[TplAmts.length - 1] + '</td><td><input id="' + pIdStr + '" onchange="changeFolder(this, ' + isCommonStr + ', null)" hiddenval="' + topItem.name + '" type="checkbox"' + checkedStr + '></td></tr>');
             if (topItem.items && topItem.items.length > 0) {
+                let subSeq = 0;
                 for (const subItem of topItem.items) {
-                    _pushRptLine(topItem, subItem, 1, true);
+                    _pushRptLine(topItem, subItem, 1, true, pIdStr, subSeq);
                 }
+                subSeq++;
             }
+            parentIdx++;
         }
     }
 
@@ -441,10 +467,12 @@
                 try {
                     // console.log(result);
                     ORG_CUST_TREE_NODES.common = JSON.parse(JSON.stringify(CUST_TREE_NODES.common));
+                    ORG_CUST_TREE_NODES.customize = JSON.parse(JSON.stringify(CUST_TREE_NODES.customize));
                     //刷新报表模板树
                     TOP_TREE_NODES = JSON.parse(JSON.stringify(ORG_TOP_TREE_NODES));
                     // 移除未被选择的模板
-                    filterUnchkTplTreeNode(TOP_TREE_NODES[1]);
+                    filterUnchkTplTreeNode(TOP_TREE_NODES[0], CUST_TREE_NODES.customize);
+                    filterUnchkTplTreeNode(TOP_TREE_NODES[1], CUST_TREE_NODES.common);
                     zTreeOprObj.getReportTemplateTree();
                 } catch(err) {
                 }
@@ -456,28 +484,39 @@
         );
     }
 
-    function revertCustRptCfg(){
+    function revertCommonCustRptCfg(){
         CUST_TREE_NODES.common = JSON.parse(JSON.stringify(ORG_CUST_TREE_NODES.common));
-        buildCommonCustRpt();
+        buildCustRptCommon('report_cust_group_common', ORG_TOP_TREE_NODES[1], CUST_TREE_NODES.common, 'true');
+    }
+
+    function revertIndividualCustRptCfg(){
+        CUST_TREE_NODES.customize = JSON.parse(JSON.stringify(ORG_CUST_TREE_NODES.customize));
+        buildCustRptCommon('report_cust_group_individual', ORG_TOP_TREE_NODES[0], CUST_TREE_NODES.customize, 'false');
     }
 
-    function changeFolder(dom, isCommon) {
-        let idx = CUST_TREE_NODES.common.indexOf(dom.attributes['hiddenval'].value);
+    function changeFolder(dom, isCommon, parentIdStr) {
+        let prop = null;
+        if (isCommon) {
+            prop = CUST_TREE_NODES.common;
+        } else {
+            prop = CUST_TREE_NODES.customize;
+        }
+        let idx = prop.indexOf(dom.attributes['hiddenval'].value);
         if (dom.checked) {
-            if (isCommon) {
-                if (idx < 0) {
-                    CUST_TREE_NODES.common.push(dom.attributes['hiddenval'].value);
+            if (idx < 0) {
+                prop.push(dom.attributes['hiddenval'].value);
+                if (parentIdStr === null) {
+                    //这是父节点,需要把所有子节点都勾上
+                    //后期补上
                 }
-            } else {
-                //保留定制报表分支
             }
         } else {
-            if (isCommon) {
-                if (idx >= 0) {
-                    CUST_TREE_NODES.common.splice(idx, 1);
+            if (idx >= 0) {
+                prop.splice(idx, 1);
+                if (parentIdStr === null) {
+                    //这是父节点,需要把所有子节点都uncheck
+                    //后期补上
                 }
-            } else {
-                //保留定制报表分支
             }
         }
     }