소스 검색

code sync

Tony Kang 1 년 전
부모
커밋
be8d6066c9
4개의 변경된 파일149개의 추가작업 그리고 3개의 파일을 삭제
  1. 146 2
      app/controller/report_controller.js
  2. 1 0
      app/router.js
  3. 1 0
      app/view/budget/sub_menu_list.ejs
  4. 1 1
      app/view/stage/stage_sub_menu.ejs

+ 146 - 2
app/controller/report_controller.js

@@ -473,9 +473,153 @@ module.exports = app => {
         }
 
         async indexForDynamicGrandTotal(ctx) {
-            // 动态决算入口
+            // 动态决算(动态投资)入口 (以独立报表为蓝本(index入口))
             try {
-                //
+                await this._getStageAuditViewData(ctx);
+                const pageShow = ctx.session.sessionProject.page_show;
+                pageShow.showArchive = 1;
+                // pageShow.closeWatermark = 1;
+                pageShow.showArchive = 0;
+                const tenderId = ctx.params.id;
+                // const paymentDetail_id = ctx.params.did;
+                const paymentDetail_id = -1;
+                // 支付审批: ctx.params.did 是 zh_payment_detail表的id, 通过这个did在 zh_payment_detail_audit表里找审核信息(td_id = ctx.params.did)
+                //          没有计量期的概念!!!
+                // const paymentAuditorList = await ctx.service.paymentDetailAudit.getAuditors(paymentDetail_id);
+                const tender = ctx.paymentTender;
+                const pid = -1;
+                // const treeNodes = await ctx.service.rptTreeNode.getNodesByProjectId([-1, tender.pid]);
+                const treeNodes = await ctx.service.rptTreeNode.getNodesBySourceType([tender.pid], 200); //
+                // 加一个dummy的通用报表
+                const dummyCommonRptNode = { id: 1, name: '通用报表', pid: -1, rpt_type: 0, items: '[]', hidden: true };
+                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 = await ctx.service.stage.getValidStagesShort(tender.id);
+                const stageList = [];
+                const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: tender.pid } }); // 找公司章用的
+                const isAdmin = ctx.session.sessionUser.is_admin;
+                const lastAuditor = null;
+                const archiveList = [];
+                let prjAccList = await ctx.service.projectAccount.getAllAccountByProjectId(tender.pid);
+                const roleList = await ctx.service.signatureRole.getSignatureRolesByTenderId(tender.id);
+                const usedList = await ctx.service.signatureUsed.getSignatureUsedByTenderId(tender.id);
+                // 根据需求,如果开启了‘开启个人「签字」’功能,则只能是本身用户签名,管理员例外
+                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 = -100;
+                const stage_order = -1;
+                const sorder = -1;
+                const stage_times = -1;
+                const stage_status = -1;
+
+                // const paymentDetailList = await ctx.service.paymentDetail.getDetail(paymentDetail_id);
+                // if (paymentDetailList && paymentDetailList.length > 0) {
+                //     const payment = paymentDetailList[0];
+                //     stage_status = payment.status;
+                //     stage_order = payment.order;
+                //     sorder = stage_order;
+                //     stage_times = payment.times;
+                //     stageList.push({ id: stage_id, user_id: payment.uid, status: payment.status });
+                // }
+
+                for (const prjAcc of prjAccList) {
+                    prjAcc.account_group = accountGroup[prjAcc.account_group];
+                }
+                const rpt_tpl_items = '{ customize: [], common: [] }';
+
+                // 获取所有项目参与者
+                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: rpt_tpl_items,
+                    cust_cfg: JSON.stringify(custCfg),
+                    project_id: tender.pid,
+                    tender_id: tenderId,
+                    tender_name: 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),
+                };
+                await this.layout('report/index.ejs', renderData, 'report/rpt_all_popup.ejs');
+
             } catch (err) {
                 this.log(err);
             }

+ 1 - 0
app/router.js

@@ -416,6 +416,7 @@ module.exports = app => {
     app.get('/tender/:id/report', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportController.index');
     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');
     app.get('/tender/:id/archiveReport', sessionAuth, tenderCheck, uncheckTenderCheck, 'reportArchiveController.index');
     app.post('/tender/report_api/getReportArchive', sessionAuth, 'reportArchiveController.getReportArchive');
     app.get('/getArchivedFileByUUID/:uuid/:rptName', sessionAuth, 'reportArchiveController.getArchivedFileByUUID');

+ 1 - 0
app/view/budget/sub_menu_list.ejs

@@ -5,6 +5,7 @@
 <nav-menu title="设计概算" url="/budget/<%= ctx.budget.id %>/gai%>" ml="3" active="<%= ctx.url.indexOf('/gai') %>"></nav-menu>
 <nav-menu title="施工图预算" url="/budget/<%= ctx.budget.id %>/yu" ml="3" active="<%= ctx.url.indexOf('/yu') %>"></nav-menu>
 <nav-menu title="招标预算" url="/budget/<%= ctx.budget.id %>/zb" ml="3" active="<%= ctx.url.indexOf('/zb') %>"></nav-menu>
+<nav-menu title="输出报表" url="/budget/<%= ctx.budget.id %>/report" ml="3" active="<%= ctx.url.indexOf('/report') %>"></nav-menu>
 <% if (!ctx.budget.readOnly && ctx.url.indexOf('/compare') === -1 && ctx.url !== '/budget/' + ctx.budget.id) { %>
 <div class="contarl-box"><button class="btn btn-primary btn-sm btn-block" data-toggle="modal" data-target="#budget-set">设置</button></div>
 <% } %>

+ 1 - 1
app/view/stage/stage_sub_menu.ejs

@@ -66,7 +66,7 @@
         <div class="nav-box">
             <ul class="nav-list list-unstyled">
                 <li class="<% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage/' + ctx.stage.order + '/compare') { %>active<% } %>">
-                    <a href="/tender/<%- ctx.tender.id %>/measure/stage/<%- ctx.stage.order %>/compare"><span class="ml-3">审核比较</span></a>
+                    <a href="/tender/<%- ctx.tender.id %>/measure/stage/<%- ctx.stage.order %>/compare"><span class="ml-3"></span></a>
                 </li>
             </ul>
         </div>