Ver código fonte

报表,用户交互,审批人选择

MaiXinRong 5 anos atrás
pai
commit
3c8ebe710c

+ 95 - 23
app/controller/report_controller.js

@@ -156,6 +156,39 @@ module.exports = app => {
             }
         }
 
+        async _getReport(ctx, params) {
+            // console.log('in getReport');
+            // console.log(params);
+            let rptTpl = await ctx.service.rptTpl.getTplById(params.rpt_tpl_id);
+            if (!rptTpl || rptTpl.length !== 1) {
+                throw '获取模板失败';
+            }
+            rptTpl = JSON.parse(rptTpl[0].rpt_content);
+            // console.log('get the template!');
+            const pageRst = await getAllPagesCommon(ctx, rptTpl, params, JV.PAGING_OPTION_NORMAL, JV.OUTPUT_TYPE_NORMAL, this.app.baseDir);
+            // console.log(pageRst);
+            // const roleRel = (params.stage_status === 3) ? (await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id)) : [];
+            const roleRel = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id); // 新需求中,允许在非审核状态下设置签名
+            const stgAudit = await ctx.service.stageAudit.getStageAudit(params.stage_id, params.stage_times);
+            // console.log('after role stage!');
+            // console.log(roleRel);
+            await encodeSignatureDataUri(roleRel, this.app.baseDir);
+            await encodeDummySignatureDataUri(pageRst, this.app.baseDir);
+            const stageFlow = await ctx.service.stageAudit.getAuditGroupByListWithOwner(params.stage_id, params.stage_times);
+            const customSelect = await ctx.service.rptCustomDefine.getCustomDefine(params.tender_id, params.stage_id, params.rpt_tpl_id);
+
+            // console.log('encodeSignatureDataUri!');
+            return {
+                data: pageRst,
+                signatureRelInfo: roleRel,
+                stageAudit: stgAudit,
+                debugInfo: ctx.app.config.is_debug ? ctx.debugInfo : null,
+                customDefine: rptTpl[JV.NODE_CUSTOM_DEFINE],
+                stageFlow,
+                customSelect,
+            };
+        }
+
         /**
          * 获取报表数据
          *
@@ -166,25 +199,37 @@ module.exports = app => {
             try {
                 // console.log('in getReport');
                 const params = JSON.parse(ctx.request.body.params);
-                // console.log(params);
-                let rptTpl = await ctx.service.rptTpl.getTplById(params.rpt_tpl_id);
-                if (!rptTpl || rptTpl.length !== 1) {
-                    throw '获取模板失败';
-                }
-                rptTpl = JSON.parse(rptTpl[0].rpt_content);
-                // console.log('get the template!');
-                const pageRst = await getAllPagesCommon(ctx, rptTpl, params, JV.PAGING_OPTION_NORMAL, JV.OUTPUT_TYPE_NORMAL, this.app.baseDir);
-                // console.log(pageRst);
-                // const roleRel = (params.stage_status === 3) ? (await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id)) : [];
-                const roleRel = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id); // 新需求中,允许在非审核状态下设置签名
-                const stgAudit = await ctx.service.stageAudit.getStageAudit(params.stage_id, params.stage_times);
-                // console.log('after role stage!');
-                // console.log(roleRel);
-                await encodeSignatureDataUri(roleRel, this.app.baseDir);
-                await encodeDummySignatureDataUri(pageRst, this.app.baseDir);
-                // console.log('encodeSignatureDataUri!');
-                ctx.body = { data: pageRst, signatureRelInfo: roleRel, stageAudit: stgAudit, debugInfo: ctx.app.config.is_debug ? ctx.debugInfo : null };
-                // ctx.body = { data: { msg: 'test the network' } };
+                ctx.body = await this._getReport(ctx, params);
+                // // console.log(params);
+                // let rptTpl = await ctx.service.rptTpl.getTplById(params.rpt_tpl_id);
+                // if (!rptTpl || rptTpl.length !== 1) {
+                //     throw '获取模板失败';
+                // }
+                // rptTpl = JSON.parse(rptTpl[0].rpt_content);
+                // // console.log('get the template!');
+                // const pageRst = await getAllPagesCommon(ctx, rptTpl, params, JV.PAGING_OPTION_NORMAL, JV.OUTPUT_TYPE_NORMAL, this.app.baseDir);
+                // // console.log(pageRst);
+                // // const roleRel = (params.stage_status === 3) ? (await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id)) : [];
+                // const roleRel = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id); // 新需求中,允许在非审核状态下设置签名
+                // const stgAudit = await ctx.service.stageAudit.getStageAudit(params.stage_id, params.stage_times);
+                // // console.log('after role stage!');
+                // // console.log(roleRel);
+                // await encodeSignatureDataUri(roleRel, this.app.baseDir);
+                // await encodeDummySignatureDataUri(pageRst, this.app.baseDir);
+                // const stageFlow = await ctx.service.stageAudit.getAuditGroupByListWithOwner(params.stage_id, params.stage_times);
+                // const customSelect = await ctx.service.rptCustomDefine.getCustomDefine(params.tender_id, params.stage_id, params.rpt_tpl_id);
+                //
+                // // console.log('encodeSignatureDataUri!');
+                // ctx.body = {
+                //     data: pageRst,
+                //     signatureRelInfo: roleRel,
+                //     stageAudit: stgAudit,
+                //     debugInfo: ctx.app.config.is_debug ? ctx.debugInfo : null,
+                //     customDefine: rptTpl[JV.NODE_CUSTOM_DEFINE],
+                //     stageFlow,
+                //     customSelect,
+                // };
+                // // ctx.body = { data: { msg: 'test the network' } };
                 ctx.status = 201;
             } catch (ex) {
                 console.log(ex);
@@ -341,6 +386,30 @@ module.exports = app => {
                 console.log(e);
             }
         }
+
+        async setCustomDefine(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                console.log(data);
+                const filter = {tid: data.tender_id, sid: data.stage_id, rid: data.rpt_tpl_id};
+                const count = await ctx.service.rptCustomDefine.count(filter);
+                const updateData = {};
+                if (data.audit_select) updateData.audit_select = JSON.stringify(data.audit_select);
+                if (count > 0) {
+                    await ctx.service.rptCustomDefine.update(updateData, filter);
+                } else {
+                    updateData.tid = data.tender_id;
+                    updateData.sid = data.stage_id;
+                    updateData.rid = data.rpt_tpl_id;
+                    await ctx.service.rptCustomDefine.db.insert(ctx.service.rptCustomDefine.tableName, updateData);
+                }
+                const result = await this._getReport(ctx, data);
+                ctx.body = {err: 0, msg: '', data: result};
+            } catch (err) {
+                ctx.helper.log(err);
+                ctx.body = this.ajaxErrorBody(err, '保存数据出错');
+            }
+        }
     }
     return ReportController;
 };
@@ -485,13 +554,14 @@ async function getAllPagesCommon(ctx, rptTpl, params, option, outputType, baseDi
         }
         const dftOption = params.option || JV.PAGING_OPTION_NORMAL;
         printCom.initialize(rptTpl);
+        const customDefine = await ctx.service.rptCustomDefine.getCustomDefine(params.tender_id, params.stage_id, params.rpt_tpl_id);
         // ctx.helper
-        printCom.analyzeData(ctx.helper, rptTpl, tplData, defProperties, dftOption, outputType);
+        printCom.analyzeData(ctx.helper, rptTpl, tplData, defProperties, dftOption, outputType, customDefine);
         // console.log(JSON.stringify(rptTpl));
         const maxPages = printCom.totalPages;
         let pageRst = null;
         if (maxPages > 0) {
-            pageRst = printCom.outputAsSimpleJSONPageArray(ctx.helper, rptTpl, tplData, 1, maxPages, defProperties, params.custCfg);
+            pageRst = printCom.outputAsSimpleJSONPageArray(ctx.helper, rptTpl, tplData, 1, maxPages, defProperties, params.custCfg, customDefine);
         } else {
             pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
         }
@@ -575,13 +645,15 @@ async function getMultiRptsCommon(ctx, params, outputType, baseDir) {
             const dftOption = params.option || JV.PAGING_OPTION_NORMAL;
 
             printCom.initialize(rptTpl);
+            const customDefine = await ctx.service.rptCustomDefine.getCustomDefine(params.tender_id, params.stage_id, params.rpt_tpl_id);
             // console.log(rptTpl);
-            printCom.analyzeData(ctx.helper, rptTpl, tplData, defProperties, dftOption, outputType);
+            printCom.analyzeData(ctx.helper, rptTpl, tplData, defProperties, dftOption, outputType, customDefine);
             const maxPages = printCom.totalPages;
             let pageRst = null;
             // console.log(maxPages);
+            const customDefine = await ctx.service.rptCustomDefine.getCustomDefine(params.tender_id, params.stage_id, params.rpt_tpl_id);
             if (maxPages > 0) {
-                pageRst = printCom.outputAsSimpleJSONPageArray(ctx.helper, rptTpl, tplData, 1, maxPages, defProperties, params.custCfg);
+                pageRst = printCom.outputAsSimpleJSONPageArray(ctx.helper, rptTpl, tplData, 1, maxPages, defProperties, params.custCfg, customDefine);
             } else {
                 pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
             }

+ 130 - 0
app/public/report/js/rpt_custom.js

@@ -0,0 +1,130 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const rptCustomObj = (function () {
+
+    const sAuditSelect = 'audit_select';
+    let stageFlow = [];
+
+    const getStageFlowSelectHtml = function (select) {
+        const html = [];
+        html.push('<select style="width: 80%">');
+        for (const sf of stageFlow) {
+            html.push('<option' + (sf.order === select.order ? ' selected' : '') + '>' + sf.name + '-' + sf.role +'</option>');
+        }
+        html.push('</select>');
+        return html.join('');
+    };
+
+    const initAuditSelect = function (asSetting, asSelect) {
+        const setting = JSON.parse(asSetting), select = JSON.parse(asSelect);
+        $('#audit-select-title').html(setting.title);
+        const html = [];
+        for (const [i, s] of setting.select.entries()) {
+            html.push('<tr>');
+            html.push('<td>', s.title, '</td>');
+            html.push('<td>', getStageFlowSelectHtml(select[i]), '</td>');
+            html.push('</tr>');
+        }
+        $('#audit-select-list').html(html.join(''));
+    };
+
+    const init = function (cDefine, sfData, cSelect) {
+        stageFlow = sfData;
+        if (cDefine && cDefine[sAuditSelect]) {
+            $('#pnl_audit_select').show();
+            initAuditSelect(cDefine[sAuditSelect].setting, cSelect.audit_select);
+        } else {
+            $('#pnl_audit_select').hide();
+        }
+    };
+
+    const reloadReportData = function (result) {
+        // hintBox.unWaitBox();
+        let pageRst = result.data;
+        if (result.signatureRelInfo && result.signatureRelInfo.length > 0) {
+            CURRENT_ROLE_REL_ID = result.signatureRelInfo[0].id;
+            ROLE_REL_LIST = zTreeOprObj._parseRoleRelList(result.signatureRelInfo[0].rel_content);
+            STAGE_AUDIT = result.stageAudit;
+            rptSignatureHelper.originalRoleRelList = zTreeOprObj._parseRoleRelList(result.signatureRelInfo[0].rel_content);
+            if (current_stage_status === 3) {
+                rptSignatureHelper.mergeSignDate(pageRst);
+                rptSignatureHelper.mergeSignature(pageRst);
+            }
+        } else {
+            CURRENT_ROLE_REL_ID = -1;
+            ROLE_REL_LIST = [];
+        }
+        // if (ROLE_REL_LIST)
+        let canvas = zTreeOprObj.canvas;
+        if (pageRst && pageRst.items && pageRst.items.length > 0) {
+            zTreeOprObj.resetAfter(pageRst);
+            zTreeOprObj.currentRptPageRst = pageRst;
+            zTreeOprObj.maxPages = pageRst.items.length;
+            zTreeOprObj.currentPage = 1;
+            zTreeOprObj.displayPageValue();
+            let size = JpcCanvasOutput.getReportSizeInPixel(zTreeOprObj.currentRptPageRst, getScreenDPI());
+            canvas.width = size[0] + 20;
+            if (size[1] > size[0]) {
+                canvas.height = size[1] + 100;
+            } else {
+                canvas.height = size[1] + 50;
+            }
+            // zTreeOprObj.resetESignature(zTreeOprObj.currentRptPageRst);
+            rptSignatureHelper.buildSelectableAccount();
+            rptSignatureHelper.buildSelectableAccountUsed();
+            rptSignatureHelper.buildRoleDom(ROLE_LIST);
+            zTreeOprObj.showPage(1, canvas);
+        } else {
+            //返回了无数据表
+            JpcCanvasOutput.cleanCanvas(canvas);
+            JpcCanvasOutput.drawPageBorder(zTreeOprObj.currentRptPageRst, canvas, getScreenDPI());
+        }
+        rptCustomObj.init(result.customDefine, result.stageFlow, result.customSelect);
+        try {
+            if (is_debug && result.debugInfo) {
+                console.log('含有key的debug信息:');
+                for (const k in result.debugInfo.key) {
+                    console.log(k + ':', ...result.debugInfo.key[k]);
+                }
+                //console.log(result.debugInfo.key);
+                console.log('其他debug信息:');
+                for (const di of result.debugInfo.other) {
+                    console.log(...di);
+                }
+            }
+        } catch(err) {
+        }
+    };
+
+    const resetAuditSelect = function () {
+        const selObj = $('select', '#audit-select-list');
+        const data = { audit_select: [] };
+        data.pageSize = rptControlObj.getCurrentPageSize();
+        data.orientation = rptControlObj.getCurrentOrientation();
+        data.rpt_tpl_id = zTreeOprObj.currentNode.refId;
+        data.custCfg = CUST_CFG;
+        data.project_id = PROJECT_ID;
+        data.tender_id = TENDER_ID;
+        data.stage_id = getStageId();
+        data.stage_status = getStageStatus();
+        data.stage_order = getStageOrder();
+        data.stage_times = getStageTimes();
+        for (const s of selObj) {
+            data.audit_select.push(stageFlow[s.selectedIndex]);
+        }
+        postData('/report/cDefine', data, function (result) {
+            reloadReportData(result);
+            $('#audit-select').modal('hide');
+        });
+    };
+
+    return {init, resetAuditSelect};
+})();

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

@@ -328,6 +328,7 @@ let zTreeOprObj = {
                     JpcCanvasOutput.cleanCanvas(canvas);
                     JpcCanvasOutput.drawPageBorder(me.currentRptPageRst, canvas, getScreenDPI());
                 }
+                rptCustomObj.init(result.customDefine, result.stageFlow, result.customSelect);
                 try {
                     if (is_debug && result.debugInfo) {
                         console.log('含有key的debug信息:');

+ 7 - 7
app/reports/rpt_component/jpc_ex.js

@@ -166,16 +166,16 @@ JpcExSrv.prototype.createNew = function() {
         me.events = JpcEvent.createNew(rptTpl);
     };
 
-    JpcResult.analyzeData = function($CTX_HELPER, rptTpl, dataObj, defProperties, option, outputType) {
+    JpcResult.analyzeData = function($CTX_HELPER, rptTpl, dataObj, defProperties, option, outputType, $CUSTOM_DEFINE) {
         const me = this;
         const dftPagingOption = option || JV.PAGING_OPTION_NORMAL;
         // 1. data object
         let dataHelper = JpcData.createNew();
         // console.log(JSON.stringify(rptTpl));
-        me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_ANALYZING, rptTpl, dataObj, me); // 在分析前运行,主要是增加灵活性,比如:重新编排数据的主从关系
+        me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_ANALYZING, rptTpl, dataObj, me, $CUSTOM_DEFINE); // 在分析前运行,主要是增加灵活性,比如:重新编排数据的主从关系
         // console.log(JSON.stringify(rptTpl));
         if (me.crossTab) {
-            me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_PAGING, rptTpl, dataObj, me);
+            me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_PAGING, rptTpl, dataObj, me, $CUSTOM_DEFINE);
             dataHelper.analyzeData(rptTpl, dataObj);
             me.crossTab.sorting(rptTpl, dataObj, dataHelper.dataSeq.slice(0), me);
         } else {
@@ -195,7 +195,7 @@ JpcExSrv.prototype.createNew = function() {
             // let dt2 = new Date();
             // alert(dt2 - dt1);
             // 3. formulas
-            me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_PAGING, rptTpl, dataObj, me);
+            me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_PAGING, rptTpl, dataObj, me, $CUSTOM_DEFINE);
         }
         // 4. paging
         me.paging(rptTpl, dataObj, defProperties, dftPagingOption, outputType);
@@ -224,7 +224,7 @@ JpcExSrv.prototype.createNew = function() {
             me.totalPages = me.billTab.paging(rptTpl, dataObj);
         }
     };
-    JpcResult.executeFormulas = function($CTX_HELPER, runType, $CURRENT_TEMPLATE, $CURRENT_DATA, $CURRENT_RPT) {
+    JpcResult.executeFormulas = function($CTX_HELPER, runType, $CURRENT_TEMPLATE, $CURRENT_DATA, $CURRENT_RPT, $CUSTOM_DEFINE) {
         const execFmlMe = this;
         for (let execFmlIdx = 0; execFmlIdx < execFmlMe.formulas.length; execFmlIdx++) {
             // remark: 搞这么复杂的变量名是为了防止与表达式起冲突(如循环变量i,j,k,容易造成变量冲突且不容易看出问题)
@@ -305,7 +305,7 @@ JpcExSrv.prototype.createNew = function() {
         }
         return rst;
     };
-    JpcResult.outputAsSimpleJSONPageArray = function($CTX_HELPER, rptTpl, dataObj, startPage, endPage, defProperties, customizeCfg) {
+    JpcResult.outputAsSimpleJSONPageArray = function($CTX_HELPER, rptTpl, dataObj, startPage, endPage, defProperties, customizeCfg, $CUSTOM_DEFINE) {
         const me = this;
         const rst = {};
         if ((startPage > 0) && (startPage <= endPage) && (endPage <= me.totalPages)) {
@@ -323,7 +323,7 @@ JpcExSrv.prototype.createNew = function() {
             try {
                 for (let page = startPage; page <= endPage; page++) {
                     me.runTimePageData.currentPage = page;
-                    me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_OUTPUT, rptTpl, dataObj, me);
+                    me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_OUTPUT, rptTpl, dataObj, me, $CUSTOM_DEFINE);
                     rst.items.push(me.outputAsSimpleJSONPage(rptTpl, dataObj, bands, page, rst[JV.NODE_CONTROL_COLLECTION], customizeCfg));
                 }
                 if (bands[JV.BAND_PROP_MERGE_BAND]) {

+ 3 - 0
app/reports/rpt_component/jpc_value_define.js

@@ -48,6 +48,9 @@ module.exports = {
     NODE_BIZ_TYPE_SUM: '汇总类型',
     NODE_BIZ_TYPE_DETAIL: '明细类型',
 
+    NODE_CUSTOM_DEFINE: '用户交互',
+    NODE_CUS_AUDIT_SELECT: 'audit_select',
+
     NODE_MAP_DATA_HANDLE_INFO: '映射数据预处理',
     PROP_DATA_KEY: '映射数据对象',
     PROP_PARENT_DATA_KEY: '父映射数据对象',

+ 1 - 0
app/reports/util/rpt_calculation_data_util.js

@@ -549,6 +549,7 @@ function preDefineProcess(ctx, tpl, preDefineCfg, rawDataObj, $CURRENT_RPT) {
             try {
                 // 在预定义方式中,小麦处理原始数据,不需要
                 let preSetup = preDefineCfg[JV.PROP_HANDLE_SELF_SETUP];
+                console.log(preSetup);
                 try {
                     if (preSetup) {
                         preSetup = JSON.parse(preSetup);

+ 2 - 0
app/router.js

@@ -221,6 +221,8 @@ module.exports = app => {
     app.post('/tender/report_api/updateSignatureUsed', sessionAuth, datetimeFill, 'signatureController.updateSignatureUsed');
     app.post('/tender/report_api/updateRoleRelationship', sessionAuth, 'signatureController.updateRoleRel');
     app.post('/tender/report_api/createRoleRelationship', sessionAuth, 'signatureController.createRoleRel');
+    app.post('/report/cDefine', sessionAuth, 'reportController.setCustomDefine');
+
     // 变更管理
     app.get('/tender/:id/change', sessionAuth, tenderCheck, 'changeController.index');
     app.get('/tender/:id/change/status/:status', sessionAuth, tenderCheck, 'changeController.status');

+ 33 - 0
app/service/rpt_custom_define.js

@@ -0,0 +1,33 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+module.exports = app => {
+    class RptCustomDefine extends app.BaseService {
+        /**
+         * 构造函数
+         *
+         * @param {Object} ctx - egg全局变量
+         * @return {void}
+         */
+        constructor(ctx) {
+            super(ctx);
+            this.tableName = 'rpt_custom_define';
+        }
+
+        async getCustomDefine(tid, sid, rid) {
+            const data = await this.getDataByCondition({ tid: tid, sid: sid, rid: rid });
+            if (data && data.audit_select) {
+                data.audit_select = JSON.parse(data.audit_select);
+            }
+        }
+    }
+
+    return RptCustomDefine;
+};

+ 19 - 0
app/service/stage_audit.js

@@ -778,6 +778,25 @@ module.exports = app => {
         }
 
         /**
+         * 获取审核人流程列表
+         *
+         * @param auditorId
+         * @returns {Promise<*>}
+         */
+        async getAuditGroupByListWithOwner(stageId, times) {
+            const result = await this.getAuditGroupByList(stageId, times);
+            const sql = 'SELECT pa.`id` As aid, pa.`name`, pa.`company`, pa.`role`, ? As times, ? As sid, 0 As `order`' +
+                '  FROM ' + this.ctx.service.stage.tableName + ' As s' +
+                '  LEFT JOIN ' + this.ctx.service.projectAccount.tableName + ' As pa' +
+                '  ON s.user_id = pa.id' +
+                '  WHERE s.id = ?';
+            const sqlParam = [times, stageId, stageId];
+            const user = await this.db.queryOne(sql, sqlParam);
+            result.unshift(user);
+            return result;
+        }
+
+        /**
          * 复制上一期的审批人列表给最新一期
          *
          * @param transaction - 新增一期的事务

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

@@ -125,6 +125,14 @@
                                     翻页
                                 </div>
                             </div>
+                            <div class="panel" id="pnl_audit_select" style="display: none;">
+                                <div class="panel-body">
+                                    <button class="btn btn-outline-primary btn-sm" type="button" data-toggle="modal" data-target="#audit-select">
+                                        <i class="fa fa-pencil"></i><br>
+                                        审批人选择
+                                    </button>
+                                </div>
+                            </div>
                         </div>
                     </div>
                     <div class="sjs-height-4">
@@ -191,6 +199,7 @@
 <script type="text/javascript" src="/public/report/js/jpc_output.js"></script>
 <script type="text/javascript" src="/public/report/js/rpt_print.js"></script>
 <script type="text/javascript" src="/public/report/js/rpt_signature.js"></script>
+<script type="text/javascript" src="/public/report/js/rpt_custom.js"></script>
 <script type="text/javascript" src="/public/report/js/rpt_jspdf.js"></script>
 
 <script type="text/javascript">

+ 24 - 0
app/view/report/rpt_all_popup.ejs

@@ -243,6 +243,30 @@
         </div>
     </div>
 </div>
+<!--选择审批人-->
+<div class="modal fade" id="audit-select" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title" id="audit-select-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">
+                <table class="table table-bordered">
+                    <tr><th style="width: 50%">报表数据</th><th>审批人</th></tr>
+                    <tbody id="audit-select-list">
+                    </tbody>
+                </table>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
+                <button id="audit-select-ok" class="btn btn-primary btn-sm" onclick="rptCustomObj.resetAuditSelect(this)">确定</button>
+            </div>
+        </div>
+    </div>
+</div>
 
 <script>
     zTreeOprObj.getCustomerCfg();