Преглед изворни кода

处理多层表勾选 + code sync

TonyKang пре 4 година
родитељ
комит
ea9a88dc73

+ 2 - 0
app/controller/report_controller.js

@@ -68,6 +68,8 @@ module.exports = app => {
             try {
                 await this._getStageAuditViewData(ctx);
                 const pageShow = ctx.session.sessionProject.page_show;
+                // console.log(pageShow);
+                // pageShow.showArchive = 1;
                 const tender = ctx.tender;
                 const stage = ctx.stage;
                 let stage_id = -1;

+ 3 - 0
app/public/report/js/rpt_main.js

@@ -351,6 +351,9 @@ let zTreeOprObj = {
         }
         return rst;
     },
+    _setupArchive: function() {
+        //
+    },
     requestNormalReport: function (params) {
         let me = zTreeOprObj;
         if (COMMON_WATER_MARK_PIC_DATA === null || COMMON_WATER_MARK_PIC_DATA === '') {

+ 134 - 0
app/service/rpt_archive.js

@@ -0,0 +1,134 @@
+/**
+ * Created by Tony on 2021/3/30.
+ */
+
+const BaseService = require('../base/base_service');
+
+module.exports = app => {
+
+    class RptArchive extends BaseService {
+
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'rpt_archive';
+            this.dataId = 'archive_id';
+        }
+
+        async getArchiveById(id) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('archive_id', {
+                value: id,
+                operate: '=',
+            });
+            this.sqlBuilder.columns = ['archive_id', 'prj_id', 'stage_id', 'content'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const list = await this.db.query(sql, sqlParam);
+            return list;
+        }
+
+        async getPrjStgArchive(prjId, stgId) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('prj_id', {
+                value: prjId,
+                operate: '=',
+            });
+            this.sqlBuilder.setAndWhere('stage_id', {
+                value: stgId,
+                operate: '=',
+            });
+            this.sqlBuilder.columns = ['archive_id', 'prj_id', 'stage_id', 'content'];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            const list = await this.db.query(sql, sqlParam);
+            return list;
+        }
+
+        async createArchive(prj_id, stg_id, archiveArr) {
+            let rst = null;
+            this.transaction = await this.db.beginTransaction();
+            try {
+                const data = {
+                    prj_id,
+                    stg_id,
+                    content: JSON.stringify(archiveArr),
+                };
+                // console.log(data);
+                rst = await this.transaction.insert(this.tableName, data);
+                await this.transaction.commit();
+            } catch (ex) {
+                console.log(ex);
+                // 回滚
+                await this.transaction.rollback();
+            }
+            return rst;
+        }
+        //
+        // async addInitialStageData(tender_id, stage, preStage) {
+        //     // 在加stage的时候需要挂上这个,copy之前的签名人
+        //     const rst = [];
+        //     const preRoleRelList = await this.getRoleRptRelByTenderId(tender_id, preStage.id);
+        //     for (const rptRoleRel of preRoleRelList) {
+        //         const relList = JSON.parse(rptRoleRel.rel_content);
+        //         // const newRptRoleRel = {tender_id: tender_id, rpt_id: rptRoleRel.rpt_id, sid: stage.id, rel_content: ''};
+        //         const newRelList = [];
+        //         for (const role of relList) {
+        //             const newRole = {};
+        //             newRelList.push(newRole);
+        //             for (const key in role) {
+        //                 if (key !== 'sign_date') {
+        //                     newRole[key] = role[key];
+        //                 } else {
+        //                     newRole[key] = '';
+        //                 }
+        //             }
+        //         }
+        //         // rst.push(await this.createRoleRelationship(tender_id, rptRoleRel.rpt_id, stage.id, newRelList));
+        //         await this.createRoleRelationship(tender_id, rptRoleRel.rpt_id, stage.id, newRelList); // 暂时用不到,就先不返回结果
+        //     }
+        //     return rst;
+        // }
+
+        // async updateRoleRelationship(id, tender_id, rpt_id, sid, relArr) {
+        //     let rst = null;
+        //     if (id < 0) {
+        //         rst = await this.createRoleRelationship(tender_id, rpt_id, sid, relArr);
+        //     } else {
+        //         this.transaction = await this.db.beginTransaction();
+        //         try {
+        //             const data = { id, tender_id, rpt_id, sid, rel_content: JSON.stringify(relArr) };
+        //             rst = await this.transaction.update(this.tableName, data);
+        //             await this.transaction.commit();
+        //         } catch (ex) {
+        //             console.log(ex);
+        //             // 回滚
+        //             await this.transaction.rollback();
+        //         }
+        //     }
+        //     return rst;
+        // }
+        //
+        // async updateMultiRoleRelationship(orgParams, newRelArr) {
+        //     for (let idx = 0; idx < orgParams.length; idx++) {
+        //         const param = orgParams[idx];
+        //         const data = { tender_id: param[0], sid: param[1], rpt_id: param[2] };
+        //         this.transaction = await this.db.beginTransaction();
+        //         try {
+        //             await this.transaction.delete(this.tableName, data);
+        //             this.transaction.commit();
+        //             await this.createRoleRelationship(param[0], param[2], param[1], newRelArr);
+        //         } catch (ex) {
+        //             console.log(ex.toString());
+        //             // 回滚
+        //             await this.transaction.rollback();
+        //         }
+        //     }
+        //     return true;
+        // }
+    }
+    return RptArchive;
+};

+ 67 - 23
app/view/report/index.ejs

@@ -65,6 +65,25 @@
                                     导出报表
                                 </div>
                             </div>
+                            <div class="panel" <% if (pageShow === null || parseInt(pageShow.showArchive) === 0 || isNaN(parseInt(pageShow.showArchive))) { %> style="display:none" <% } %>>
+                                <div class="panel-body">
+                                    <div class="btn-group" role="group">
+                                        <button type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#guidang"><i class="fa fa-archive"></i> 归档报表</button>
+                                        <div class="btn-group" role="group">
+                                            <button id="btnGroupDrop1" type="button" class="btn btn-success btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                                                已归档
+                                            </button>
+                                            <div class="dropdown-menu" aria-labelledby="btnGroupDrop1" style="min-width:112px">
+                                                <a class="dropdown-item" href="#">#1 2021-03-01</a>
+                                                <a class="dropdown-item" href="#">#2 2021-02-28</a>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+                                <div class="panel-foot text-muted">
+                                    报表归档
+                                </div>
+                            </div>
                             <div class="panel">
                                 <div class="panel-body">
                                     <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
@@ -272,17 +291,20 @@
 
 <script type="text/javascript">
     let TOP_TREE_NODES = <%- rpt_tpl_data %>;
-    const PAGE_SHOW = {closeWatermark: 0, closeExportPdf: 0, closeExportExcel: 0};
+    const PAGE_SHOW = {closeWatermark: 0, closeExportPdf: 0, closeExportExcel: 0, showArchive: 0};
     <% if (pageShow !== null) { %>
-    <% if (parseInt(pageShow.closeWatermark) === 1) { %>
-    PAGE_SHOW['closeWatermark'] = 1;
-    <% } %>
-    <% if (parseInt(pageShow.closeExportPdf) === 1) { %>
-    PAGE_SHOW['closeExportPdf'] = 1;
-    <% } %>
-    <% if (parseInt(pageShow.closeExportExcel) === 1) { %>
-    PAGE_SHOW['closeExportExcel'] = 1;
-    <% } %>
+        <% if (parseInt(pageShow.closeWatermark) === 1) { %>
+            PAGE_SHOW['closeWatermark'] = 1;
+        <% } %>
+        <% if (parseInt(pageShow.closeExportPdf) === 1) { %>
+            PAGE_SHOW['closeExportPdf'] = 1;
+        <% } %>
+        <% if (parseInt(pageShow.closeExportExcel) === 1) { %>
+            PAGE_SHOW['closeExportExcel'] = 1;
+        <% } %>
+        <% if (parseInt(pageShow.showArchive) === 1) { %>
+            PAGE_SHOW['showArchive'] = 1;
+        <% } %>
     <% } %>
 
 //    PAGE_SHOW['closeWatermark'] = 0; //测试用,check in 前要屏蔽
@@ -399,26 +421,48 @@
     }
 
     function filterUnchkTplTreeNode(topNode, srcData) {
-        for (let rIdx = topNode.items.length - 1; rIdx >= 0; rIdx--) {
-            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 (srcData.indexOf(tName) < 0) {
-                            topNode.items[rIdx].items.splice(rIdx2, 1);
+        const _chkAndSpliceItem = function(pNode, pStr) {
+            let rst = false;
+            if (srcData.indexOf(pStr + pNode.name) < 0) {
+                if (pNode.items && pNode.items.length > 0) {
+                    for (let subIdx = pNode.items.length - 1; subIdx >= 0; subIdx--) {
+                        if (!_chkAndSpliceItem(pNode.items[subIdx], pStr + pNode.name + FOLDER_SEPERATER)) {
+                            pNode.items.splice(subIdx, 1);
+                        } else {
+                            rst = true;
                         }
                     }
-                } else {
-                    topNode.items.splice(rIdx, 1);
                 }
+            } else {
+                rst = true;
             }
-            if (!topNode.items[rIdx].hasOwnProperty('items') || topNode.items[rIdx].items.length === 0) {
+            return rst;
+        };
+        for (let rIdx = topNode.items.length - 1; rIdx >= 0; rIdx--) {
+            if (!_chkAndSpliceItem(topNode.items[rIdx], '')) {
                 topNode.items.splice(rIdx, 1);
             }
         }
+//        for (let rIdx = topNode.items.length - 1; rIdx >= 0; rIdx--) {
+//            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 (srcData.indexOf(tName) < 0) {
+//                            topNode.items[rIdx].items.splice(rIdx2, 1);
+//                        }
+//                    }
+//                } else {
+//                    topNode.items.splice(rIdx, 1);
+//                }
+//            }
+//            if (!topNode.items[rIdx].hasOwnProperty('items') || topNode.items[rIdx].items.length === 0) {
+//                topNode.items.splice(rIdx, 1);
+//            }
+//        }
     }
 
     function buildTplTree() {

+ 6 - 4
app/view/report/rpt_all_popup.ejs

@@ -760,7 +760,7 @@
             }
             return rst;
         };
-        let _pushRptLine = function (parentItem, rptItem, level, needChk, parentNodeIdStr, thisItemSeq) {
+        let _pushRptLine = function (parentItem, rptItem, level, needChk, parentNodeIdStr, thisItemSeq, pHiddenVal) {
             if (rptItem.nodeType === 1) {
                 let amt = _countAvailableTpls(rptItem);
                 if (amt > 0) {
@@ -772,7 +772,7 @@
                         padding_leftStr = 'padding-left: ' + rem + 'rem!important'; //不受层数限制
                     }
                     if (needChk) {
-                        let chkName = parentItem.name + FOLDER_SEPERATER + rptItem.name;
+                        let chkName = pHiddenVal + parentItem.name + FOLDER_SEPERATER + rptItem.name;
                         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>');
@@ -782,8 +782,10 @@
                         tbDom.append('<tr><td style="' + padding_leftStr + '">' + rptItem.name + '</td><td>' + amt + '</td><td></td></tr>');
                     }
                     if (rptItem.items && rptItem.items.length > 0) {
+                        let subDtlSeq = 0;
                         for (const subItem of rptItem.items) {
-                            _pushRptLine(rptItem, subItem, level + 1, true, '');
+                            _pushRptLine(rptItem, subItem, level + 1, true, '', subDtlSeq, parentItem.name + FOLDER_SEPERATER);
+                            subDtlSeq++;
                         }
                     }
                 }
@@ -802,7 +804,7 @@
                 if (topItem.items && topItem.items.length > 0) {
                     let subSeq = 0;
                     for (const subItem of topItem.items) {
-                        _pushRptLine(topItem, subItem, 1, true, pIdStr, subSeq);
+                        _pushRptLine(topItem, subItem, 1, true, pIdStr, subSeq, '');
                     }
                     subSeq++;
                 }

+ 14 - 0
sql/update.sql

@@ -98,3 +98,17 @@ CREATE TABLE `zh_schedule_stage` (
   `tp` decimal(30,8) DEFAULT NULL COMMENT '本期计量完成金额',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='计量进度-计划月份,计量期选中表';
+
+
+--
+-- 报表归档表
+--
+
+CREATE TABLE `calculation`.`zh_rpt_archive` (
+  `archive_id` INT NOT NULL,
+  `prj_id` INT NULL,
+  `stage_id` INT NULL,
+  `content` VARCHAR(4000) NULL,
+  PRIMARY KEY (`archive_id`),
+  INDEX `PRJ_STG` (`prj_id` ASC, `stage_id` ASC))
+COMMENT = '报表归档表;\n只考虑项目id及期id,其他信息全部归入content';