Browse Source

code sync

Tony Kang 1 year ago
parent
commit
f7275cebe2

+ 205 - 5
app/controller/report_controller.js

@@ -311,6 +311,7 @@ module.exports = app => {
                     viewPmData: PermissionCheck.viewPmData(this.ctx.session.sessionUser.permission),
                     auditType: auditConst.auditType,
                     source_type: 1,
+                    changes: 'null',
                 };
                 await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
                 // await this.layout('report/index.ejs', renderData);
@@ -337,9 +338,9 @@ module.exports = app => {
             try {
                 await this._getStageAuditViewData(ctx);
                 const pageShow = ctx.session.sessionProject.page_show;
-                pageShow.showArchive = 1;
-                // pageShow.closeWatermark = 1;
+                // pageShow.showArchive = 1;
                 pageShow.showArchive = 0;
+                // pageShow.closeWatermark = 1;
                 const tenderId = ctx.params.id;
                 const paymentDetail_id = ctx.params.did;
                 // 支付审批: ctx.params.did 是 zh_payment_detail表的id, 通过这个did在 zh_payment_detail_audit表里找审核信息(td_id = ctx.params.did)
@@ -416,7 +417,6 @@ module.exports = app => {
                 for (const prjAcc of prjAccList) {
                     prjAcc.account_group = accountGroup[prjAcc.account_group];
                 }
-                // const rpt_tpl_items = '{ customize: [], common: [] }';
                 const cust_select_keys = JSON.stringify(['common_safe', 'customize_safe']); // 因其他地方也有可能保存用户报表的显示选择项,因当初设计问题,不好改数据库结构了,但可以调节内部json来满足需求,安全生产费没有这个,就过了
                 const rpt_tpl_items = { customize: [], common: [] };
                 commonArrs.forEach(item => {
@@ -450,7 +450,6 @@ module.exports = app => {
                     tender: null,
                     tenderInfo: null,
                     rpt_tpl_data: JSON.stringify(treeNodes),
-                    // cust_tpl_data: rpt_tpl_items,
                     cust_tpl_data: JSON.stringify(rpt_tpl_items),
                     cust_select_keys,
                     cust_cfg: JSON.stringify(custCfg),
@@ -493,6 +492,7 @@ module.exports = app => {
                     OSS_PATH: ctx.app.config.fujianOssPath,
                     viewPmData: PermissionCheck.viewPmData(this.ctx.session.sessionUser.permission),
                     source_type: 101,
+                    changes: 'null',
                 };
                 /*
                 //*/
@@ -622,7 +622,6 @@ module.exports = app => {
                     tender: null,
                     tenderInfo: null,
                     rpt_tpl_data: JSON.stringify(treeNodes),
-                    // cust_tpl_data: rpt_tpl_items,
                     cust_tpl_data: JSON.stringify(rpt_tpl_items),
                     cust_select_keys,
                     cust_cfg: JSON.stringify(custCfg),
@@ -665,6 +664,7 @@ module.exports = app => {
                     OSS_PATH: ctx.app.config.fujianOssPath,
                     viewPmData: PermissionCheck.viewPmData(this.ctx.session.sessionUser.permission),
                     source_type: 200,
+                    changes: 'null',
                 };
                 await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
 
@@ -673,6 +673,206 @@ module.exports = app => {
             }
         }
 
+        async _createNodes(ctx, source_type, pid) {
+            const treeNodes = await ctx.service.rptTreeNode.getNodesBySourceType([pid], source_type); // 这个查定制的
+            const commonTreeNodes = await ctx.service.rptTreeNode.getNodesByProjectId([-1]); // 这个查通用的
+            const nodeItems = JSON.parse(commonTreeNodes[0].items);
+            const commonArrs = [];
+            nodeItems.forEach(nodeItem => {
+                if (nodeItem.source_type === source_type) {
+                    commonArrs.push(nodeItem);
+                }
+            });
+            // 加一个dummy的通用报表
+            const dummyCommonRptNode = { id: 1, name: '通用报表', pid: -1, rpt_type: 0, items: JSON.stringify(commonArrs) };
+            treeNodes.push(dummyCommonRptNode);
+            const custCfg = await ctx.service.rptCustomizeCfg.getCustomizeCfgByUserId('Administrator');
+            return { treeNodes, commonArrs, custCfg };
+        }
+
+        async _indexForBGL(ctx, source_type) {
+            // 变更令、变更方案、变更立项、变更申请 报表入口
+            try {
+                await this._getStageAuditViewData(ctx);
+                const pageShow = ctx.session.sessionProject.page_show;
+                // pageShow.closeWatermark = 1;
+                pageShow.showArchive = 1;
+                pageShow.closeShowAllCustomized = 0;
+                const tenderId = ctx.params.id;
+                const paymentDetail_id = -1;
+                const pid = ctx.session.sessionProject.id;
+                const budget_id = -1;
+                const sp_id = -1;
+                const { treeNodes, commonArrs, custCfg } = await this._createNodes(ctx, source_type, tenderId);
+                const sorts = ctx.query.sort ? ctx.query.sort : 0;
+                const orders = ctx.query.order ? ctx.query.order : 0;
+                const state = ctx.session.sessionProject.page_show.openChangeState && ctx.query.state ? parseInt(ctx.query.state) : 0;
+                const changes = await ctx.service.change.getListByStatus(tenderId, 0, 1, sorts, orders, state);
+                // console.log(changes);
+                // 加一个dummy的通用报表
+                // const dummyCommonRptNode = { id: 1, name: '通用报表', pid: -1, rpt_type: 0, items: JSON.stringify(commonArrs) };
+                // treeNodes.push(dummyCommonRptNode);
+                // const custTreeNodes = await ctx.service.rptTreeNodeCust.getCustFoldersByUserId(this.ctx.session.sessionUser.accountId);
+                // const custCfg = await ctx.service.rptCustomizeCfg.getCustomizeCfgByUserId('Administrator');
+                const stageList = [];
+                const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid } }); // 找公司章用的
+                const isAdmin = ctx.session.sessionUser.is_admin;
+                const lastAuditor = null;
+                const archiveList = [];
+                let prjAccList = await ctx.service.projectAccount.getAllAccountByProjectId(pid);
+                const roleList = [];
+                const usedList = [];
+                // 根据需求,如果开启了‘开启个人「签字」’功能,则只能是本身用户签名,管理员例外
+                if (!ctx.session.sessionUser.is_admin && pageShow.individualSign === 1) {
+                    // 削减其他account
+                    const newAccList = [];
+                    for (const acc of prjAccList) {
+                        if (acc.id === this.ctx.session.sessionUser.accountId) {
+                            newAccList.push(acc);
+                        }
+                    }
+                    prjAccList = newAccList;
+                }
+                // 分类列表
+                const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.session.sessionProject.id);
+                // 获取用户权限
+                const accountInfo = await this.ctx.service.projectAccount.getDataById(this.ctx.session.sessionUser.accountId);
+                const userPermission = accountInfo !== undefined && accountInfo.permission !== '' ? JSON.parse(accountInfo.permission) : null;
+                // 获取用户可查看的标段
+                // ...
+                const tenderList = [];
+                const cid = this.ctx.helper._.map(treeNodes, 'id');
+                const customSelects = null;
+                const dataSelects = {};
+                dataSelects.material_select = await ctx.service.rptCustomDefine.getDataSelectByRpt(cid,
+                    reportConst.rptDataType[JV.NODE_CUS_MATERIAL_SELECT]);
+
+                const materialList = await ctx.service.material.getValidMaterials();
+
+                const stage_id = -300;
+                const stage_order = -1;
+                const sorder = -1;
+                const stage_times = -1;
+                const stage_status = -1;
+
+                for (const prjAcc of prjAccList) {
+                    prjAcc.account_group = accountGroup[prjAcc.account_group];
+                }
+                const cust_select_keys = JSON.stringify(['common_dynamic', 'customize_dynamic']); // 因其他地方也有可能保存用户报表的显示选择项,因当初设计问题,不好改数据库结构了,但可以调节内部json来满足需求
+                const rpt_tpl_items = { customize: [], common: [] };
+                const custTreeNodes = await ctx.service.rptTreeNodeCust.getCustFoldersByUserId(this.ctx.session.sessionUser.accountId);
+                if (custTreeNodes.length > 0) {
+                    const cust_select_item = JSON.parse(custTreeNodes[0].rpt_tpl_items);
+                    if (cust_select_item.common_dynamic) rpt_tpl_items.common = cust_select_item.common_dynamic;
+                    if (cust_select_item.customize_dynamic) rpt_tpl_items.customize = cust_select_item.customize_dynamic;
+                    if (!cust_select_item.hasOwnProperty('common_dynamic') && !cust_select_item.hasOwnProperty('customize_dynamic')) {
+                        commonArrs.forEach(item => {
+                            rpt_tpl_items.common.push(item.name);
+                        });
+                    }
+                } else {
+                    commonArrs.forEach(item => {
+                        rpt_tpl_items.common.push(item.name);
+                    });
+                }
+
+                // 获取所有项目参与者
+                const accountList = await ctx.service.projectAccount.getAllDataByCondition({
+                    where: { project_id: ctx.session.sessionProject.id, enable: 1 },
+                    columns: ['id', 'name', 'company', 'role', 'enable', 'is_admin', 'account_group', 'mobile'],
+                });
+                const newAccountGroup = accountGroup.map((item, idx) => {
+                    const groupList = accountList.filter(item => item.account_group === idx);
+                    return { groupName: item, groupList };
+                });
+                const where = { tid: tenderId };
+                const advance = await ctx.service.advance.getAllDataByCondition({
+                    columns: ['id', 'order', 'status', 'selected', 'type'],
+                    where,
+                    orders: [['type', 'asc'], ['create_time', 'desc']],
+                });
+                advance.forEach(x => {
+                    x.statusStr = auditConst.advance.statusString[x.status];
+                    x.typeStr = advanceConst.typeColMap[x.type].text;
+                });
+
+                const renderData = {
+                    accountGroup: newAccountGroup,
+                    accountList,
+                    unitList: JSON.stringify(unitList),
+                    tender: null,
+                    tenderInfo: null,
+                    rpt_tpl_data: JSON.stringify(treeNodes),
+                    cust_tpl_data: JSON.stringify(rpt_tpl_items),
+                    cust_select_keys,
+                    cust_cfg: JSON.stringify(custCfg),
+                    project_id: pid,
+                    tender_id: tenderId,
+                    budget_id,
+                    sp_id,
+                    tender_name: '',
+                    detail_id: paymentDetail_id,
+                    stg_id: stage_id,
+                    stg_order: stage_order,
+                    cur_order: sorder,
+                    stg_times: stage_times,
+                    stg_status: stage_status,
+                    stage_list: JSON.stringify(stageList),
+                    prj_account_list: JSON.stringify(prjAccList),
+                    role_list: JSON.stringify(roleList),
+                    used_list: JSON.stringify(usedList),
+                    tenderMenu,
+                    preUrl: '/tender/' + tenderId + '/measure/stage/' + ctx.params.order,
+                    measureType,
+                    categoryData,
+                    tenderList,
+                    auditConst: auditConst.stage,
+                    ledgerAuditConst: auditConst.ledger,
+                    jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.report.main),
+                    customSelects,
+                    rptCustomType: reportConst.rptCustomType,
+                    materialList,
+                    stages: stageList,
+                    dataSelects,
+                    pageShow,
+                    authMobile: accountInfo.auth_mobile,
+                    shenpiConst,
+                    archiveList,
+                    lastAuditor,
+                    rpt_id: ctx.query.rpt_id,
+                    isAdmin,
+                    prePay: JSON.stringify(advance),
+                    OSS_PATH: ctx.app.config.fujianOssPath,
+                    viewPmData: PermissionCheck.viewPmData(this.ctx.session.sessionUser.permission),
+                    source_type,
+                    changes: JSON.stringify(changes),
+                };
+                await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
+            } catch (err) {
+                this.log(err);
+            }
+        }
+
+        async indexForChange(ctx) {
+            // 变更令报表入口
+            await this._indexForBGL(ctx, 20);
+        }
+
+        async indexForChangePlan(ctx) {
+            // 变更方案报表入口
+            await this._indexForBGL(ctx, 21);
+        }
+
+        async indexForChangeProject(ctx) {
+            // 变更立项报表入口
+            await this._indexForBGL(ctx, 22);
+        }
+
+        async indexForChangeApply(ctx) {
+            // 变更申请报表入口
+            await this._indexForBGL(ctx, 23);
+        }
+
         /**
          * 报表打印页面
          *

+ 86 - 0
app/public/report/js/rpt_change.js

@@ -0,0 +1,86 @@
+/**
+ * Created by Tony on 2024/02/07.
+ * 这个跟 rpt_change_rela不同,那个不是我写的,不去干扰
+ * 本文件处理跟变更令报表相关的操作
+ */
+'use strict'
+
+const rptChangeObj = {
+    initBglList: function() {
+        // 初始化变更令ID值 ALL_CHANGES bglKeyVals
+        if (ALL_CHANGES) {
+            const $bglDivDom = $('#bglKeyVals');
+            $bglDivDom.empty();
+            let content = [];
+            ALL_CHANGES.forEach((change, index) => {
+                content.push(`<a class="dropdown-item" href="javascript: void(0)" onclick="rptChangeObj.changeBglId('${index}');">${change.name}</a>`);
+            });
+            $bglDivDom.append(content);
+        }
+    },
+    changeBglId: function(index) {
+        const change = ALL_CHANGES[index];
+        alert(change.cid);
+        if (zTreeOprObj.currentRptPageRst && zTreeOprObj.currentRptPageRst.splitArcPagesInfo && zTreeOprObj.currentRptPageRst.splitArcPages) {
+            let pgAccAmt = 0;
+            for (let idx = 0; idx < zTreeOprObj.currentRptPageRst.splitArcPages.length; idx++) {
+                const pgArcVal = zTreeOprObj.currentRptPageRst.splitArcPages[idx];
+                const pgInfoVals = zTreeOprObj.currentRptPageRst.splitArcPagesInfo[idx];
+                // 根据3种数据(id、code、name)来判断输出哪个页面
+                if (pgInfoVals[0] === change.cid || pgInfoVals[0] === change.code || pgInfoVals[0] === change.name) {
+                    // 这里判断3种值(考虑到这3种值的差别极大,应该不会有重合的情况)
+                    const firstPage = pgArcVal;
+                    let lastPage = zTreeOprObj.currentRptPageRst.items.length;
+                    if (idx < zTreeOprObj.currentRptPageRst.splitArcPages.length - 1) {
+                        lastPage = zTreeOprObj.currentRptPageRst.splitArcPages[idx + 1];
+                    }
+                    this.sliceRptData(zTreeOprObj.currentRptPageRst, firstPage, lastPage);
+                    this.refreshPage(zTreeOprObj.currentRptPageRst);
+                    break;
+                } else {
+                    pgAccAmt = pgArcVal;
+                }
+            }
+        }
+    },
+    refreshPage: function(pageData) {
+        // 刷新页面(重新调整页码数量)
+        zTreeOprObj.maxPages = zTreeOprObj.currentRptPageRst.items.length;
+        zTreeOprObj.currentPage = 1;
+        zTreeOprObj.displayPageValue();
+        zTreeOprObj.showPage(1, zTreeOprObj.canvas);
+    },
+    prepareRawData: function(pageDatas) {
+        const _prepareRawData = function(pageData) {
+            if (!pageData.bk_items) pageData.bk_items = pageData.items;
+        };
+        // 这里pageDatas可以是勾选多个的也可以是单个选择
+        if (pageDatas instanceof Array) {
+            _prepareRawData(pageDatas);
+        } else {
+            pageDatas.forEach(pageData => {
+                _prepareRawData(pageData);
+            });
+        }
+    },
+    restoreRawData: function(pageDatas) {
+        const _restoreRawData = function(pageData) {
+            if (!pageData.bk_items) pageData.items = pageData.bk_items;
+        };
+        // 这里pageDatas可以是勾选多个的也可以是单个选择
+        if (pageDatas instanceof Array) {
+            _restoreRawData(pageDatas);
+        } else {
+            pageDatas.forEach(pageData => {
+                _restoreRawData(pageData);
+            });
+        }
+    },
+    sliceRptData: function(pageData, firstPage, lastPage) {
+        if (pageData.bk_items && firstPage > 0 && lastPage <= pageData.bk_items.length) {
+            pageData.items = pageData.bk_items.slice(firstPage - 1, lastPage);
+            return true;
+        }
+        return false;
+    }
+};

+ 4 - 4
app/reports/rpt_component/helper/jpc_helper_band.js

@@ -4,12 +4,12 @@ const JV = require('../jpc_value_define');
 const JpcCommonHelper = require('./jpc_helper_common');
 
 const JpcBandHelper = {
-    getBandTypeValByString: function(bandType) {
+    getBandTypeValByString(bandType) {
         let rst = JV.PAGE_STATUS.indexOf(bandType);
         if (rst < 0) rst = JV.STATUS_NORMAL;
         return rst;
     },
-    setBandArea: function(bands, rptTpl, pageStatus, isOnlyNormalStatus, isOnlyExStatus) {
+    setBandArea(bands, rptTpl, pageStatus, isOnlyNormalStatus, isOnlyExStatus) {
         const me = this;
         if (rptTpl[JV.NODE_BAND_COLLECTION]) {
             isOnlyNormalStatus = isOnlyNormalStatus || false;
@@ -22,7 +22,7 @@ const JpcBandHelper = {
             }
         }
     },
-    setBandPos: function(bands, bandNode, orgArea, unitFactor, pageStatus, isOnlyNormalStatus, isOnlyExStatus) {
+    setBandPos(bands, bandNode, orgArea, unitFactor, pageStatus, isOnlyNormalStatus, isOnlyExStatus) {
         const me = this;
         const band = bands[bandNode[JV.BAND_PROP_NAME]];
         // 0. for multi flow purpose
@@ -88,7 +88,7 @@ const JpcBandHelper = {
             }
         }
     },
-    resetBandPos: function(bandCollection, bands, contentBand, offsetX, offsetY) {
+    resetBandPos(bandCollection, bands, contentBand, offsetX, offsetY) {
         const orgX = contentBand.Right;
         const orgY = contentBand.Bottom;
         function chkAndResetPos(targetBand) {

+ 4 - 0
app/router.js

@@ -450,6 +450,10 @@ module.exports = app => {
 
     // 报表
     app.get('/tender/:id/report', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportController.index');
+    app.get('/tender/:id/change/report', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportController.indexForChange');
+    app.get('/tender/:id/change/plan/report', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportController.indexForChangePlan');
+    app.get('/tender/:id/change/project/report', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportController.indexForChangeProject');
+    app.get('/tender/:id/change/apply/report', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportController.indexForChangeApply');
     app.get('/tender/:id/measure/stage/:order/report', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'reportController.index');
     app.get('/payment/:id/safe/:did/report', sessionAuth, paymentTenderCheck, paymentDetailCheck, 'reportController.indexForPaymentSafe');
     app.get('/budget/:id/report', sessionAuth, budgetCheck, 'reportController.indexForDynamicGrandTotal');

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

@@ -4,6 +4,8 @@
     <% include ../payment_safe/sub_menu.ejs %>
 <% } else if (stg_id === -200) { %>
     <% include ../budget/sub_menu.ejs %>
+<% } else if (stg_id === -300) { %>
+    <% include ../tender/tender_sub_menu.ejs %>
 <% } else { %>
     <% include ../stage/stage_sub_menu.ejs %>
 <% } %>
@@ -12,7 +14,7 @@
         <div class="title-main d-flex">
             <% if(stg_id === -1) { %>
                 <% include ../tender/tender_sub_mini_menu.ejs %>
-            <% } else if (stg_id === -100 || stg_id === -200) { %>
+            <% } else if (stg_id === -100 || stg_id === -200 || stg_id === -300) { %>
             <% } else { %>
                 <% include ../stage/stage_sub_mini_menu.ejs %>
             <% } %>
@@ -35,6 +37,14 @@
                     </ul>
                 </div>
                 <% } %>
+                <% if (stg_id === -300) { %>
+                <div class="d-inline-block">
+                    <div class="dropdown">
+                        <button class="btn btn-sm btn-light dropdown-toggle text-primary" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">变更令</button>
+                        <div class="dropdown-menu" aria-labelledby="dropdownMenuButton" id="bglKeyVals"></div>
+                    </div>
+                </div>
+                <% } %>
                 <% if (false || (stg_id !== -100 && stg_id !== -200 && stg_id !== -300)) { %>
                 <% if (ctx.session.sessionProject.page_show.isPreset) { %>
                 <div class="d-inline-block">
@@ -361,6 +371,7 @@
 <script type="text/javascript" src="/public/report/js/rpt_jsexcel.js?20231217"></script>
 <script type="text/javascript" src="/public/report/js/rpt_indexDb.js?20231217"></script>
 <script type="text/javascript" src="/public/report/js/rpt_move_signature.js"></script>
+<script type="text/javascript" src="/public/report/js/rpt_change.js"></script>
 <!--
 <script type="text/javascript" src="/public/report/js/rpt_custom.js"></script>
 -->
@@ -372,6 +383,7 @@
     const BUDGET_ID = <%- budget_id %>;
     const SP_ID = '<%- sp_id %>';
     const SOURCE_TYPE = <%- source_type %>;
+    const ALL_CHANGES = <%- changes %>;
     const PAGE_SHOW = {closeWatermark: 0, closeExportPdf: 0, closeExportExcel: 0, showArchive: 0, closeShowAllCustomized: 0, isTextSignature: 0, closeArchiveSignature: 0};
     <% if (pageShow !== null) { %>
         <% if (parseInt(pageShow.closeWatermark) === 1) { %>
@@ -387,10 +399,10 @@
             PAGE_SHOW['showArchive'] = 1;
         <% } %>
         <% if (parseInt(pageShow.closeShowAllCustomized) === 1) { %>
-        PAGE_SHOW['closeShowAllCustomized'] = 1;
+            PAGE_SHOW['closeShowAllCustomized'] = 1;
         <% } %>
         <% if (parseInt(pageShow.isTextSignature) === 1) { %>
-        PAGE_SHOW['isTextSignature'] = 1;
+            PAGE_SHOW['isTextSignature'] = 1;
         <% } %>
         <% if (parseInt(pageShow.closeArchiveSignature) === 1) { %>
             PAGE_SHOW['closeArchiveSignature'] = 1;
@@ -684,6 +696,7 @@
 
         zTreeOprObj.treeObj.selectNode(node);
         zTreeOprObj.onClick(null, null, node);
+        rptChangeObj.initBglList();
     });
 </script>