Tony Kang 11 months ago
parent
commit
8fc3f50b13

+ 8 - 0
app/controller/report_controller.js

@@ -19,6 +19,7 @@ const rptCronJob = require('../reports/util/rpt_tmp_file_sweep');
 const RPT_DEF_PROPERTIES = require('../const/report_defined_properties');
 const reportConst = require('../const/report');
 const advanceConst = require('../const/advance');
+const typeConsts = require('../const/advance');
 // const stringUtil = require('../public/js/string_util_light');
 const needCustomTables = [
     'mem_custom_select',
@@ -128,6 +129,11 @@ module.exports = app => {
                 const custTreeNodes = await ctx.service.rptTreeNodeCust.getCustFoldersByUserId(this.ctx.session.sessionUser.accountId);
                 const stageList = await ctx.service.stage.getValidStagesShort(tender.id);
                 const unitList = await ctx.service.constructionUnit.getAllDataByCondition({ where: { pid: tender.data.project_id } }); // 找公司章用的
+                // 以后还有预付款、材差
+                // const advanceType = typeConsts.typeCol.find(item => item.key === 'start');
+                // const advanceList = await ctx.service.advance.getAdvanceListDirectly(tender.id, advanceType.type);
+                const advanceList = await ctx.service.advance.getAdvanceListDirectly(tender.id);
+                // const materialList = await ctx.service.advance.getValidMaterials(tender.id);
                 const isAdmin = ctx.session.sessionUser.is_admin;
                 // console.log('this.ctx.session.sessionUser.accountId: ' + this.ctx.session.sessionUser.accountId);
                 if (stage && stage.status === auditConst.stage.status.uncheck) {
@@ -308,6 +314,8 @@ module.exports = app => {
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.report.main),
                     customSelects,
                     rptCustomType: reportConst.rptCustomType,
+                    advanceList: JSON.stringify(advanceList),
+                    materialAdjList: JSON.stringify(materialList),
                     materialList,
                     stages: stageList,
                     dataSelects,

+ 34 - 76
app/public/report/js/rpt_main.js

@@ -309,32 +309,8 @@ let zTreeOprObj = {
             window.history.pushState({},0, window.location.pathname + `?rpt_id=${treeNode.refId}`);
             me.currentNode = treeNode;
             let params = {};
-            let pageSize = rptControlObj.getCurrentPageSize();
-            params.pageSize = pageSize;
+            rptControlObj.getRptRequestCommonParam(params);
             params.rpt_tpl_id = treeNode.refId;
-            params.project_id = PROJECT_ID;
-            params.tender_id = TENDER_ID;
-            params.budget_id = BUDGET_ID;
-            params.sp_id = SP_ID;
-            params.source_type = SOURCE_TYPE;
-            params.stage_id = getStageId();
-            params.stage_status = getStageStatus();
-            params.stage_order = getStageOrder();
-            params.stage_times = getStageTimes();
-            params.material_order = getMaterialOrder();
-            params.closeWatermark = getCloseWatermark();
-            params.isTextSignature = getTxtSignature();
-            params.custCfg = CUST_CFG;
-            params.detail_id = DETAIL_ID;
-            params.change_id = CHANGE_ID;
-            params.business_id = BUSINESS_ID;
-            params.change_plan_id = CHNAGE_PLAN_ID;
-            params.change_project_id = CHNAGE_PROJECT_ID;
-            params.change_apply_id = CHNAGE_APPLY_ID;
-            params.change_times = CHANGE_TIMES;
-            params.change_plan_times = CHNAGE_PLAN_TIMES;
-            params.change_project_times = CHNAGE_PROJECT_TIMES;
-            params.change_apply_times = CHNAGE_APPLY_TIMES;
             _getSplitAmendmentParam(params, treeNode);
 
             rptArchiveObj.toggleBtn(false);
@@ -403,32 +379,8 @@ let zTreeOprObj = {
         if (me.currentNode) {
             CUST_CFG_ORG = JSON.parse(JSON.stringify(CUST_CFG));
             let params = {};
-            params.pageSize = rptControlObj.getCurrentPageSize();
-            params.orientation = rptControlObj.getCurrentOrientation();
-            params.custCfg = CUST_CFG;
+            rptControlObj.getRptRequestCommonParam(params);
             params.rpt_tpl_id = me.currentNode.refId;
-            params.project_id = PROJECT_ID;
-            params.tender_id = TENDER_ID;
-            params.budget_id = BUDGET_ID;
-            params.sp_id = SP_ID;
-            params.source_type = SOURCE_TYPE;
-            params.stage_id = getStageId();
-            params.stage_status = getStageStatus();
-            params.stage_order = getStageOrder();
-            params.stage_times = getStageTimes();
-            params.material_order = getMaterialOrder();
-            params.closeWatermark = getCloseWatermark();
-            params.isTextSignature = getTxtSignature();
-            params.detail_id = DETAIL_ID;
-            params.change_id = CHANGE_ID;
-            params.business_id = BUSINESS_ID;
-            params.change_plan_id = CHNAGE_PLAN_ID;
-            params.change_project_id = CHNAGE_PROJECT_ID;
-            params.change_apply_id = CHNAGE_APPLY_ID;
-            params.change_times = CHANGE_TIMES;
-            params.change_plan_times = CHNAGE_PLAN_TIMES;
-            params.change_project_times = CHNAGE_PROJECT_TIMES;
-            params.change_apply_times = CHNAGE_APPLY_TIMES;
 
             _getSplitAmendmentParam(params, me.currentNode);
             localStorage[CUST_NAME + '_custCfg'] = JSON.stringify(CUST_CFG);
@@ -769,37 +721,43 @@ let rptControlObj = {
             }
         }
     },
+    getRptRequestCommonParam: function(params) {
+        if (params) {
+            params.pageSize = rptControlObj.getCurrentPageSize();
+            params.orientation = rptControlObj.getCurrentOrientation();
+            params.custCfg = CUST_CFG;
+            params.project_id = PROJECT_ID;
+            params.tender_id = TENDER_ID;
+            params.budget_id = BUDGET_ID;
+            params.sp_id = SP_ID;
+            params.source_type = SOURCE_TYPE;
+            params.stage_id = getStageId();
+            params.stage_status = getStageStatus();
+            params.stage_order = getStageOrder();
+            params.stage_times = getStageTimes();
+            params.material_order = getMaterialOrder();
+            params.closeWatermark = getCloseWatermark();
+            params.isTextSignature = getTxtSignature();
+            params.detail_id = DETAIL_ID;
+            params.change_id = CHANGE_ID;
+            params.business_id = BUSINESS_ID;
+            params.change_plan_id = CHNAGE_PLAN_ID;
+            params.change_project_id = CHNAGE_PROJECT_ID;
+            params.change_apply_id = CHNAGE_APPLY_ID;
+            params.change_times = CHANGE_TIMES;
+            params.change_plan_times = CHNAGE_PLAN_TIMES;
+            params.change_project_times = CHNAGE_PROJECT_TIMES;
+            params.change_apply_times = CHNAGE_APPLY_TIMES;
+            params.advance_id = current_advance_id;
+            params.material_id = current_material_id;
+        }
+    },
     creatCommonExportParam: function (refRptTplIds) {
         let rst = {};
+        rptControlObj.getRptRequestCommonParam(rst);
         rst.rpt_ids = refRptTplIds;
-        rst.pageSize = rptControlObj.getCurrentPageSize();
         rst.orientation = ((zTreeOprObj.checkedRptTplNodes.length > 1)?null:rptControlObj.getCurrentOrientation());
-        rst.project_id = PROJECT_ID;
-        rst.tender_id = TENDER_ID;
-        rst.budget_id = BUDGET_ID;
-        rst.sp_id = SP_ID;
-        rst.source_type = SOURCE_TYPE;
-        rst.stage_id = getStageId();
-        rst.stage_status = getStageStatus();
-        rst.stage_order = getStageOrder();
-        rst.stage_times = getStageTimes();
-        rst.material_order = getMaterialOrder();
-        rst.custCfg = CUST_CFG;
-        rst.closeWatermark = getCloseWatermark();
-        rst.isTextSignature = getTxtSignature();
         rst.closeArchiveSignature = getCloseArchiveSignature();
-        rst.detail_id = DETAIL_ID;
-        rst.change_id = CHANGE_ID;
-        rst.business_id = BUSINESS_ID;
-        rst.change_plan_id = CHNAGE_PLAN_ID;
-        rst.change_project_id = CHNAGE_PROJECT_ID;
-        rst.change_apply_id = CHNAGE_APPLY_ID;
-        rst.change_times = CHANGE_TIMES;
-        rst.change_plan_times = CHNAGE_PLAN_TIMES;
-        rst.change_project_times = CHNAGE_PROJECT_TIMES;
-        rst.change_apply_times = CHNAGE_APPLY_TIMES;
-
-    // rst.amendmentType =
         return rst;
     },
     getAllInOneBook: async function () {

+ 27 - 0
app/service/advance.js

@@ -66,6 +66,33 @@ module.exports = app => {
             return advance;
         }
 
+        // 获取预付款列表(直接获取,报表用)
+        async getAdvanceListDirectly(tid, type = null) {
+            this.initSqlBuilder();
+            this.sqlBuilder.setAndWhere('tid', {
+                value: tid,
+                operate: '=',
+            });
+            if (type) {
+                this.sqlBuilder.setAndWhere('type', {
+                    value: type,
+                    operate: '=',
+                });
+            }
+            if (this.ctx.session.sessionUser.accountId !== this.ctx.tender.data.user_id && !this.ctx.tender.isTourist) {
+                this.sqlBuilder.setAndWhere('status', {
+                    value: auditConst.status.uncheck,
+                    operate: '!=',
+                });
+            }
+            this.sqlBuilder.orderBy = [['order', 'desc']];
+            const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
+            // console.log(sql);
+            // console.log(sqlParam);
+            const advance = await this.db.query(sql, sqlParam);
+            return advance;
+        }
+
         /**
          * 获取预付款最新一期
          * @param {Number} tid 标段id

+ 92 - 21
app/view/report/index.ejs

@@ -19,7 +19,7 @@
                 <% include ../stage/stage_sub_mini_menu.ejs %>
             <% } %>
             <div>
-                <!-- <div class="d-inline-block">
+                <div class="d-inline-block">
                     <div class="dropdown">
                         <button class="btn btn-sm btn-light dropdown-toggle text-primary" type="button" id="allBizDropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                             计量期
@@ -34,17 +34,16 @@
                 <div class="d-inline-block">
                     <div class="dropdown" style="display: none" id="biz-prepay-item">
                         <button class="btn btn-sm btn-light dropdown-toggle text-primary" type="button" id="allPrepayButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-                            所有预付款
+                            开工预付款
                         </button>
                         <div class="dropdown-menu" aria-labelledby="allPrepayButton" id="prepay-select-item">
-                            <a class="dropdown-item" href="javascript:void(0);" data-type="prepay_all" >所有预付款</a>
-                            <a class="dropdown-item" href="javascript:void(0);" data-type="prepay_start">开工预付款</a>
-                            <a class="dropdown-item" href="javascript:void(0);" data-type="prepay_material">材料预付款</a>
-                            <a class="dropdown-item" href="javascript:void(0);" data-type="prepay_safe">安全生产费预付款</a>
-                            <a class="dropdown-item" href="javascript:void(0);" data-type="prepay_dust">扬尘污染预付款</a>
+                            <a class="dropdown-item" href="javascript:void(0);" data-type="start" style="display: none">开工预付款</a>
+                            <a class="dropdown-item" href="javascript:void(0);" data-type="material">材料预付款</a>
+                            <a class="dropdown-item" href="javascript:void(0);" data-type="safe">安全生产费预付款</a>
+                            <a class="dropdown-item" href="javascript:void(0);" data-type="dust">扬尘污染预付款</a>
                         </div>
                     </div>
-                </div> -->
+                </div>
                 <% if (false || ![-100, -200, -300, -301, -302, -303].includes(stg_id)) { %>
                 <div class="d-inline-block" id="divSelectableBizs_up">
                     <div class="dropdown" id="divSelectableStages">
@@ -366,20 +365,24 @@
         }
     });
     let CURRENT_SELECTED_BIZ_TYPE = 'stage';
-    $('#prepay-select-item a').on('click', function () {
+    function advancePayClick(ele = null) {
         $('#prepay-select-item a').show();
-        $(this).hide();
-        $('#prepay-select-item').siblings('button').text($(this).text());
-        const type = $(this).data('type');
-        if (type === 'prepay_start') {
-            //
-        } else if (type === 'prepay_material') {
-            //
-        } if (type === 'prepay_safe') {
-            //
-        } if (type === 'prepay_dust') {
-            //
-        }
+        const thisEle = ele === null ? this : ele;
+        $(thisEle).hide();
+        $('#prepay-select-item').siblings('button').text($(thisEle).text());
+        const type = $(thisEle).data('type');
+        const typeStr = ['start', 'material', 'safe', 'dust'];
+        const tIdx = typeStr.indexOf(type)
+        const adList = [];
+        ADVANCE_LIST.forEach(advance => {
+            if (advance.type === tIdx) {
+                adList.push(advance);
+            }
+        });
+        buildAdvancePaySelection(adList);
+    }
+    $('#prepay-select-item a').on('click', function (){
+        advancePayClick(this);
     });
 
     $('#biz-select-item a').on('click', function () {
@@ -406,6 +409,10 @@
             $('#biz-prepay-item').show();
             $('#report_selects_ul').hide();
             $('#divPresets').hide();
+            // 要触发一下
+            if (current_advance_id === -1) {
+                advancePayClick( $('#prepay-select-item a')[0]);
+            }
         } else if (type === 'change_material_adjustment') {
             // 材料调差
             $('#divSelectableStages').hide();
@@ -414,6 +421,10 @@
             $('#biz-prepay-item').hide();
             $('#report_selects_ul').hide();
             $('#divPresets').hide();
+            // 要触发一下
+            if (current_material_id === -1) {
+                buildMaterialSelection();
+            }
         }
         filterReportsByType();
     });
@@ -489,6 +500,8 @@
     const SOURCE_TYPE = <%- source_type %>;
     const ALL_CHANGES = <%- changes %>;
     const BGL_OBJ = <%- bglObj %>;
+    const ADVANCE_LIST = <%- advanceList %>;
+    const MATERIAL_LIST = <%- materialAdjList %>;
     const CHANGE_ID = BGL_OBJ?.change?.cid || '-1';
     const CHANGE_TIMES = BGL_OBJ?.change?.times || 1;
     const BUSINESS_ID = BGL_OBJ?.BUSINESS_ID || '-1';
@@ -571,6 +584,8 @@
     let ROLE_REL_LIST = [];
     let CURRENT_ROLE_REL_ID = -1;
     let current_stage_order = -1;
+    let current_advance_id = -1;  // 预付款期id
+    let current_material_id = -1; // 材差期id
     let current_stage_id = STAGE_ID;
     let current_stage_times = -1;
     let current_stage_status = -1;
@@ -747,6 +762,62 @@
         }
     }
 
+    function buildAdvancePaySelection(adList) {
+        $("#optionSelectableAdvancePays").empty();
+        $("#btnCurrentAdvancePay")[0].innerText = '';
+        let hasMatch = false;
+        if (current_advance_id !== -1) {}
+        for (const advance of adList) {
+            if (current_advance_id === advance.id) {
+                hasMatch = true; // 预付款有好几种类型,需要考虑不同类型的转换检测
+                break;
+            }
+        }
+        adList.forEach((advance, adIndex) => {
+            let dispStr = '';
+            if (!hasMatch && adIndex === 0 || current_advance_id === advance.id) {
+                current_advance_id = advance.id;
+                $("#btnCurrentAdvancePay")[0].innerText = `第${adIndex + 1}期`;
+                dispStr = ';display:none';
+            }
+            const str = `<a class="dropdown-item" style="cursor:pointer${dispStr}" onclick="changeCurrentAdvance(this)" advance_id = "${advance.id}">第${adIndex + 1}期</a>`;
+            $("#optionSelectableAdvancePays").append(str);
+        });
+    }
+
+    function buildMaterialSelection() {
+        $("#optionSelectableMaterials").empty();
+        $("#btnCurrentMaterial")[0].innerText = '';
+        MATERIAL_LIST.forEach((materialAdj, maIndex) => {
+            let dispStr = '';
+            if (current_material_id === -1 && maIndex === 0 || current_material_id === materialAdj.id) {
+                current_material_id = materialAdj.id;
+                $("#btnCurrentMaterial")[0].innerText = `第${maIndex + 1}期`;
+                dispStr = ';display:none';
+            }
+            const str = `<a class="dropdown-item" style="cursor:pointer${dispStr}" onclick="changeCurrentMaterial(this)" material_id = "${materialAdj.id}">第${maIndex + 1}期</a>`;
+            $("#optionSelectableMaterials").append(str);
+        });
+    }
+
+    function changeCurrentMaterial(ele) {
+        // 此方法与changeCurrentStage不同,不需要与后台交互,只需要调整 params: material_id (约定的参数),然后触发一下报表
+        $('#optionSelectableMaterials a').show();
+        $(ele).hide();
+        current_material_id = +ele.attributes[3].value;
+        $('#optionSelectableMaterials').siblings('button').text($(ele).text());
+        // 刷新报表模板
+    }
+
+    function changeCurrentAdvance(ele) {
+        // 此方法与changeCurrentStage不同,不需要与后台交互,只需要调整 params: advance_id (约定的参数),然后触发一下报表
+        $('#optionSelectableAdvancePays a').show();
+        $(ele).hide();
+        current_advance_id = +ele.attributes[3].value;
+        $('#optionSelectableAdvancePays').siblings('button').text($(ele).text());
+        // 刷新报表模板
+    }
+
     function changeCurrentStage(ele) {
         // alert('you are selecting: ' + ele.innerText);
         current_stage_order = parseInt(ele.attributes.stg_order.value);