Forráskód Böngészése

1. zTree样式调整
2. 安全生产费,附件,全选
3. 报表,多期汇总,计量单元数据bug

MaiXinRong 2 éve
szülő
commit
e3688ce640

+ 30 - 6
app/lib/rm/base.js

@@ -2,12 +2,20 @@
 
 /**
  *
+ * 报表数据获取分为三类:
+ * 1. 普通:获取的数据没有顺序、关系
+ * 2. 流式:获取的数据有先后顺序关系,例如中间计量台账式表,在获取中间计量时,中间计量清单也被计算好了,所以获取中间计量清单时,直接读取缓存数据
+ * 3. 绑定:获取数据有关系,例如材差的工程量清单数据,不管获取清单、项目节、工料任意几份数据,都将返回全部三份数据
+ * PS:3一定程度和2相同,只是2不一定返回全部数据,3的代码写起来更方便,但是会返回更多的数据给报表分析整理
+ * **2类数据仅做兼容,不再新增更多的2类数据
  *
  * @author Mai
  * @date
  * @version
  */
 
+
+
 class rptMemBase {
     constructor(ctx, bindData) {
         this.ctx = ctx;
@@ -54,7 +62,18 @@ class rptMemBase {
      * @param fields 数据列名
      * @returns {Promise<void>}
      */
-    getCommonData(params, tableName, fields) {
+    getCommonData(params, tableName, fields, customDefine, customSelect) {
+        throw '基础报表数据不可使用';
+    }
+
+    /**
+     * 获取流式数据(请在子类重构)
+     * @param params 报表基础传参
+     * @param key
+     * @param fields 数据列名
+     * @returns {Promise<void>}
+     */
+    async getFlowData(params, key, fields, customDefine, customSelect) {
         throw '基础报表数据不可使用';
     }
 
@@ -65,7 +84,7 @@ class rptMemBase {
      * @param fields 数据列名
      * @returns {Promise<void>}
      */
-    async getBindData(params, key, fields) {
+    async getBindData(params, key, fields, customDefine, customSelect) {
         throw '基础报表数据不可使用';
     }
 
@@ -84,7 +103,7 @@ class rptMemBase {
      * @param memFieldKeys 数据表-数据列
      * @returns {Promise<void>}
      */
-    async getReportData(params, sourceFilters, memFieldKeys) {
+    async getReportData(params, sourceFilters, memFieldKeys, customDefine, customSelect) {
         // 预加载部分(tenderCheck,stageCheck,paymentSafeCheck...)
         await this.doBeforeLoadReport(params);
 
@@ -95,17 +114,22 @@ class rptMemBase {
         const runnableRst = [];
         const runnableKey = []; // 这个配合runnableRst用,未来考虑并行查询优化
         for (const filter of filters) {
-            if (runnableKey.indexOf(filter) >= 0) return;
+            if (runnableKey.indexOf(filter) >= 0) continue;
             runnableKey.push(filter);
-            runnableRst.push(this.getCommonData(params, filter, memFieldKeys[filter]));
+            runnableRst.push(this.getCommonData(params, filter, memFieldKeys[filter], customDefine, customSelect));
         }
         const queryRst = await Promise.all(runnableRst);
         for (let idx = 0; idx < runnableKey.length; idx++) {
             rst[runnableKey[idx]] = queryRst[idx];
         }
+        // 加载流式数据
+        for (const filter of filters) {
+            if (runnableKey.indexOf(filter) >= 0) continue;
+            rst[filter] = await this.getFlowData(params, filter, memFieldKeys[filter], customDefine, customSelect);
+        }
         // 加载绑定表数据局
         for (const bindFilter of bindFilters) {
-            const resultData = await this.getBindData(params, this.getFieldKeys(memFieldKeys, this.bindData[bindFilter]));
+            const resultData = await this.getBindData(params, bindFilter, this.getFieldKeys(memFieldKeys, this.bindData[bindFilter]), customDefine, customSelect);
             for (const d in resultData) {
                 rst[d] = resultData[d];
             }

+ 1 - 1
app/lib/rm/payment.js

@@ -31,7 +31,7 @@ class rptMemPaymentSafe extends RptMemBase {
         await this.doCheckDetail(params.detail_id);
     }
 
-    getCommonData(params, tableName, fields) {
+    getCommonData(params, tableName, fields, customDefine, customSelect) {
         switch (tableName) {
             case 'mem_payment_tender':
                 return this.ctx.paymentTender;

+ 1 - 1
app/lib/rm/payment_safe.js

@@ -107,7 +107,7 @@ class rptMemPaymentSafe extends RptMemBase {
         return compareTree.getDefaultDatas();
     }
 
-    getCommonData(params, tableName, fields) {
+    getCommonData(params, tableName, fields, customDefine, customSelect) {
         switch (tableName) {
             case 'mem_payment_tender':
                 return this.ctx.paymentTender;

+ 283 - 0
app/lib/rm/tender.js

@@ -0,0 +1,283 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+
+const RptMemBase = require('./base');
+const bindData = {
+    materialGather: ['mem_material_gather_bills', 'mem_material_gather_xmj', 'mem_material_gather_gl'],
+    gatherChange: ['mem_gather_change', 'mem_gather_change_bills'],
+    fjChange: ['mem_fj_change_progress', 'mem_fj_change_sum'],
+};
+const BudgetSource = require('./budget');
+const MaterialSource = require('./material');
+const rptCustomData = require('../rptCustomData');
+
+class rptMemPaymentSafe extends RptMemBase {
+    constructor(ctx) {
+        super(ctx, bindData);
+    }
+
+    async checkStg(ctx, params) {
+        if (ctx.stage === null || ctx.stage === undefined || parseInt(ctx.stage.id) !== parseInt(params.stage_id)) {
+            await ctx.service.stage.checkStage(params.stage_id);
+            if (ctx.stage) {
+                params.stage_order = ctx.stage.curOrder;
+            }
+        }
+    }
+
+    async doBeforeLoadReport(params) {
+        await this.ctx.service.tender.checkTender(params.tender_id);
+        await this.checkStg(this.ctx, params);
+    }
+
+    getCommonData(params, tableName, fields, customDefine, customSelect) {
+        const service = this.ctx.service;
+        const budgetSource = new BudgetSource(this.ctx);
+        switch (tableName) {
+            case 'project' :
+                return service.project.getProjectById(params.project_id);
+            case 'tender_info' :
+                return service.tenderInfo.getTenderInfoEx(params.tender_id);
+            case 'advance_pay':
+                return service.advance.getAllDataByCondition({ where: { tid: params.tender_id } });
+            case 'deal_bills' :
+                return service.dealBills.getDataByTenderId(params.tender_id);
+            case 'ledger' :
+                return service.ledger.getData(params.tender_id, 0);
+            case 'stage_bills':
+                return service.stageBills.getLastestStageData2(params.tender_id, params.stage_id);
+            case 'stage_bills_final':
+                return service.stageBillsFinal.getFinalDataEx(params.tender_id, params.stage_order);
+            case 'stage':
+                return service.stage.getStageById(params.stage_id);
+            case 'stage_pay':
+                return service.stagePay.getAuditorStageData(params.stage_id, params.stage_times, params.stage_order);
+            case 'mem_stage_im_zl':
+                return service.reportMemory.getStageImZlData(params.tender_id, params.stage_id, fields);
+            case 'mem_month_progress':
+                return service.reportMemory.getMonthProgress(params.tender_id, fields);
+            case 'stage_audit':
+                return service.reportMemory.getStageAuditors(params.tender_id, params.stage_id);
+            case 'mem_stage_audit_ass':
+                return service.reportMemory.getStageAuditAss(params.tender_id, params.stage_id);
+            case 'mem_stage_bills':
+                return service.reportMemory.getStageBillsData(params.tender_id, params.stage_id, fields);
+            case 'mem_stage_bills_filter':
+                return service.reportMemory.getStageBillsData(params.tender_id, params.stage_id, fields, true);
+            case 'mem_stage_pos':
+                return service.reportMemory.getStagePosData(params.tender_id, params.stage_id, fields);
+            case 'mem_stage_pos_compare':
+                return service.reportMemory.getStagePosCompareData(params.tender_id, params.stage_id, fields);
+            case 'mem_stage_bills_compare':
+                return service.reportMemory.getStageBillsCompareData(params.tender_id, params.stage_id, fields);
+            case 'mem_stage_bills_compare_filter':
+                return service.reportMemory.getStageBillsCompareData(params.tender_id, params.stage_id, fields, true);
+            case 'mem_stage_pay':
+                return service.reportMemory.getStagePayData(params.tender_id, params.stage_id, fields);
+            case 'change':
+                return service.change.getListByStatus(params.tender_id, 3); // 获取所有审核通过的变更主信息
+            case 'change_audit_list':
+                return service.changeAuditList.getChangeAuditBills(params.tender_id); // 获取所有审核通过的变更清单
+            case 'mem_stage_jgcl':
+                return service.reportMemory.getStageJgcl(params.tender_id, params.stage_id, fields);
+            case 'mem_stage_bonus':
+                return service.reportMemory.getStageBonus(params.tender_id, params.stage_id, fields);
+            case 'mem_stage_other':
+                return service.reportMemory.getStageOther(params.tender_id, params.stage_id, fields);
+            case 'mem_stage_safe_prod':
+                return service.reportMemory.getStageSafeProd(params.tender_id, params.stage_id, fields);
+            case 'mem_stage_temp_land':
+                return service.reportMemory.getStageTempLand(params.tender_id, params.stage_id, fields);
+            case 'mem_gather_tender_info':
+                return service.rptGatherMemory.getGatherTenderInfo(fields,
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_gather_stage_pay':
+                return service.rptGatherMemory.getGatherStagePay(fields,
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_gather_deal_bills':
+                return service.rptGatherMemory.getGatherDealBills(fields,
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_gather_stage_jgcl':
+                return service.rptGatherMemory.getGatherStageJgcl(fields,
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_gather_stage_bonus':
+                return service.rptGatherMemory.getGatherStageBonus(fields,
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_gather_stage_other':
+                return service.rptGatherMemory.getGatherStageOther(fields,
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_gather_stage_safe_prod':
+                return service.rptGatherMemory.getGatherStageSafeProd(fields,
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_gather_stage_temp_land':
+                return service.rptGatherMemory.getGatherStageTempLand(fields,
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_select_material':
+                return service.material.getSelectMaterial(params.tender_id, params.material_order);
+            case 'mem_select_material_audit':
+                return materialSource.getSelectMaterialAuditors(params.tender_id, params.material_order);
+            case 'mem_material':
+                return materialSource.getMaterial(params.tender_id, params.material_order, fields);
+            case 'mem_material_gl':
+                return materialSource.getMaterialGl(params.tender_id, params.material_order, fields);
+            case 'mem_material_gl_detail':
+                return materialSource.getMaterialGlDetail(params.tender_id, params.material_order, fields);
+            case 'mem_material_bills':
+                return materialSource.getMaterialBills(params.tender_id, params.material_order, fields);
+            case 'mem_material_bills_filter':
+                return materialSource.getMaterialBills(params.tender_id, params.material_order, fields, true);
+            case 'mem_material_pos':
+                return materialSource.getMaterialPos(params.tender_id, params.material_order, fields);
+            case 'mem_material_stage':
+                return materialSource.getMaterialStage(params.tender_id, params.material_order, fields);
+            case 'mem_stage_sum_bills':
+                return service.rptStageSumMemory.getStageSumBills(params.tender_id, fields,
+                    customDefine.stage_select, customSelect ? customSelect.stage_select : null);
+            case 'mem_stage_sum_bills_filter':
+                return service.rptStageSumMemory.getStageSumBills(params.tender_id, fields,
+                    customDefine.stage_select, customSelect ? customSelect.stage_select : null, true);
+            case 'mem_stage_sum_pos':
+                return service.rptStageSumMemory.getStageSumPos(params.tender_id, fields,
+                    customDefine.stage_select, customSelect ? customSelect.stage_select : null);
+            case 'mem_stage_sum_pay':
+                return service.rptStageSumMemory.getStageSumPay(params.tender_id, fields,
+                    customDefine.stage_select, customSelect ? customSelect.stage_select : null);
+            case 'mem_material_sum_gl':
+                return service.rptStageSumMemory.getMaterialSumGl(params.tender_id, fields,
+                    customDefine.material_sum_select, customSelect ? customSelect.material_sum_select : null);
+            case 'ledger_cooperation':
+                return service.ledgerCooperation.getValidData(params.tender_id);
+            case 'mem_sign_select':
+                return service.reportMemory.getSignSelect(params.tender_id, params.stage_id, customSelect);
+            case 'mem_stage_change':
+                return service.stageChange.getAllDataByCondition({ where: { tid: params.tender_id, sid: params.stage_id } });
+            case 'mem_stage_change_bills':
+                return service.stageChangeFinal.getFinalData(params.tender_id);
+            case 'mem_stage_import_change':
+                return service.stageImportChange.getFinalData(params.tender_id);
+            case 'mem_ledger_tag':
+                return service.ledgerTag.getDatas(params.tender_id);
+            case 'mem_stage_tag':
+                return service.ledgerTag.getDatas(params.tender_id, params.stage_id);
+            case 'mem_all_tag':
+                return service.ledgerTag.getAllDataByCondition({ where: { tid: params.tender_id } });
+            case 'mem_change_info':
+                return service.reportMemory.getChangeInfo(params.tender_id, params.stage_id);
+            case 'mem_change_info_bills':
+                return service.reportMemory.getChangeInfoBills(params.tender_id, params.stage_id);
+            case 'mem_stage_rela_im':
+                return service.stageRelaIm.getAllDataByCondition({ where: { tid: params.tender_id, sid: params.stage_id } });
+            case 'mem_stage_rela_im_bills':
+                return service.stageRelaImBills.getAllDataByCondition({ where: { tid: params.tender_id, sid: params.stage_id } });
+            case 'mem_budget_gu':
+                return params.budget_id ? budgetSource.budgetGu(params.budget_id) : budgetSource.tenderGu(params.tender_id);
+            case 'mem_budget_gai':
+                return params.budget_id ? budgetSource.budgetGai(params.budget_id) : budgetSource.tenderGai(params.tender_id);
+            case 'mem_budget_yu':
+                return params.budget_id ? budgetSource.budgetYu(params.budget_id) : budgetSource.tenderYu(params.tender_id);
+            case 'mem_budget_final':
+                return params.budget_id ? budgetSource.budgetFinal(params.budget_id) : budgetSource.tenderFinal(params.tender_id);
+            case 'mem_budget_gu_filter':
+                return params.budget_id ? budgetSource.budgetGu(params.budget_id, true) : budgetSource.tenderGu(params.tender_id, true);
+            case 'mem_budget_gai_filter':
+                return params.budget_id ? budgetSource.budgetGai(params.budget_id, true) : budgetSource.tenderGai(params.tender_id, true);
+            case 'mem_budget_yu_filter':
+                return params.budget_id ? budgetSource.budgetYu(params.budget_id, true) : budgetSource.tenderYu(params.tender_id, true);
+            case 'mem_budget_final_filter':
+                return params.budget_id ? budgetSource.budgetFinal(params.budget_id, true) : budgetSource.tenderFinal(params.tender_id, true);
+            case 'mem_pm_deal_pay':
+                return service.reportMemory.getPmDeal();
+            default:
+                break;
+        }
+    }
+
+    async getFlowData(params, key, fields, customDefine, customSelect) {
+        const service = this.ctx.service;
+        switch (filter) {
+            case 'mem_custom_select':
+                return customSelect;
+            case 'mem_stage_im_tz':
+                return await service.reportMemory.getStageImTzData(params.tender_id, params.stage_id, memFieldKeys[filter]);
+            case 'mem_stage_im_tz_bills':
+                return await service.reportMemory.getStageImTzBillsData(params.tender_id, params.stage_id, memFieldKeys[filter]);
+            case 'mem_union_data':
+                return [];
+            case 'mem_import_change':
+                return await service.reportMemory.getImportChangeData(params.tender_id, params.stage_id, memFieldKeys[filter]);
+            case 'mem_import_change_bills':
+                return await service.reportMemory.getImportChangeBillsData(params.tender_id, params.stage_id, memFieldKeys[filter]);
+            case 'mem_change':
+                return await service.reportMemory.getChangeData(params.tender_id, params.stage_id, memFieldKeys[filter]);
+            case 'mem_change_bills':
+                return await service.reportMemory.getChangeBillsData(params.tender_id, params.stage_id, memFieldKeys[filter]);
+            case 'mem_change_audit':
+                return await service.reportMemory.getChangeAuditData(params.tender_id, params.stage_id, memFieldKeys[filter]);
+            case 'mem_change_apply':
+                return await service.reportMemory.getChangeApplyData(params.tender_id);
+            case 'mem_change_apply_bills':
+                return await service.reportMemory.getChangeApplyBillsData(params.tender_id);
+            case 'mem_change_apply_audit':
+                return await service.reportMemory.getChangeApplyAuditData(params.tender_id);
+            case 'mem_change_plan':
+                return await service.reportMemory.getChangePlanData(params.tender_id);
+            case 'mem_change_plan_bills':
+                return await service.reportMemory.getChangePlanBillsData(params.tender_id);
+            case 'mem_change_plan_audit':
+                return await service.reportMemory.getChangePlanAuditData(params.tender_id);
+            case 'mem_change_project':
+                return await service.reportMemory.getChangeProjectData(params.tender_id);
+            case 'mem_change_project_audit':
+                return await service.reportMemory.getChangeProjectAuditData(params.tender_id);
+            case 'mem_jh_im_change':
+                const jhHelper1 = new rptCustomData.jhHelper(this.ctx);
+                return await jhHelper1.convert(params.tender_id, params.stage_id, memFieldKeys[filter], customDefine.option);
+            case 'mem_jh_gather_im_change':
+                const jhHelper2 = new rptCustomData.jhHelper(this.ctx);
+                return await jhHelper2.gather(memFieldKeys[filter], customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_jh_gather_stage_bills_compare':
+                const jhHelper3 = new rptCustomData.jhHelper(this.ctx);
+                return await jhHelper3.gatherBills(memFieldKeys[filter], customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_gather_stage_bills':
+                return await service.rptGatherMemory.getGatherStageBills(memFieldKeys[filter],
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'mem_gather_stage_bills_filter':
+                return await service.rptGatherMemory.getGatherStageBills(memFieldKeys[filter],
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null, true);
+            case 'mem_gather_stage_pos':
+                return await service.rptGatherMemory.getGatherStagePos(memFieldKeys[filter],
+                    customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            // case 'mem_material_bills':
+            //     return await service.rptGatherMemory.getMaterialBills(params.tender_id, params.material_order, memFieldKeys[filter]);
+            // case 'mem_material_bills_gl':
+            //     return await service.rptGatherMemory.getMaterialBillsGl(params.tender_id, params.material_order, memFieldKeys[filter]);
+            default:
+                return [];
+        }
+    }
+
+    async getBindData(params, key, fields, customDefine, customSelect) {
+        const service = this.ctx.service;
+        switch (key) {
+            case 'materialGather':
+                const materialSource = new MaterialSource(this.ctx);
+                return await materialSource.getMaterialGatherBills(params.tender_id, params.material_order);
+            case 'gatherChange':
+                return await service.rptGatherMemory.getGatherChange(fields, customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+            case 'fjChange':
+                const fjHelper = new rptCustomData.fjHelper(this.ctx);
+                return await fjHelper.getChangeProgressData(params.tender_id, params.stage_id);
+            default:
+                return {};
+        }
+    }
+}
+
+module.exports = rptMemPaymentSafe;

BIN
app/public/css/ztree/img/zTreeStandard.gif


BIN
app/public/css/ztree/img/zTreeStandard.png


+ 22 - 22
app/public/css/ztree/zTreeStyle.css

@@ -14,18 +14,18 @@ website:	http://code.google.com/p/jquerytree/
 .ztree li ul{ margin:0; padding:0 0 0 18px}
 .ztree li ul.line{ background:url(./img/line_conn.gif) 0 0 repeat-y;}
 
-.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent;
+.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:24px; color:#333; background-color: transparent;
 	text-decoration:none; vertical-align:top; display: inline-block}
 .ztree li a:hover {text-decoration:underline}
-.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
-.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
-.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid;
+.ztree li a.curSelectedNode {padding-top:0px; background-color:#cce5ff; color:black; height:24px; border:1px #b8daff solid; opacity:1;}
+.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#cce5ff; color:black; height:24px; border:1px #b8daff solid; opacity:1;}
+.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:24px; border:1px #316AC5 solid;
 	opacity:0.8; filter:alpha(opacity=80)}
 .ztree li a.tmpTargetNode_prev {}
 .ztree li a.tmpTargetNode_next {}
-.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
-	font-size:12px; border:1px #7EC4CC solid; *border:0px}
-.ztree li span {line-height:16px; margin-right:2px}
+.ztree li a input.rename {height:22px; width:160px; padding:0; margin:0;
+	font-size:12px; border:1px #7EC4CC solid; *border:0px;vertical-align:top;}
+.ztree li span {line-height:24px; margin-right:2px}
 .ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle;
 	border:0 none; cursor: pointer;outline:none;
 	background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
@@ -53,30 +53,30 @@ website:	http://code.google.com/p/jquerytree/
 .ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px}
 .ztree li span.button.chk.radio_true_disable {background-position:-42px -56px}
 
-.ztree li span.button.switch {width:18px; height:18px}
+.ztree li span.button.switch {width:18px; height:24px}
 .ztree li span.button.root_open{background-position:-92px -54px}
 .ztree li span.button.root_close{background-position:-74px -54px}
 .ztree li span.button.roots_open{background-position:-92px 0}
 .ztree li span.button.roots_close{background-position:-74px 0}
-.ztree li span.button.center_open{background-position:-92px -18px}
-.ztree li span.button.center_close{background-position:-74px -18px}
-.ztree li span.button.bottom_open{background-position:-92px -36px}
-.ztree li span.button.bottom_close{background-position:-74px -36px}
-.ztree li span.button.noline_open{background-position:-92px -72px}
-.ztree li span.button.noline_close{background-position:-74px -72px}
+.ztree li span.button.center_open{background-position:-92px -24px}
+.ztree li span.button.center_close{background-position:-74px -24px}
+.ztree li span.button.bottom_open{background-position:-92px -48px}
+.ztree li span.button.bottom_close{background-position:-74px -48px}
+.ztree li span.button.noline_open{background-position:-92px -96px}
+.ztree li span.button.noline_close{background-position:-74px -96px}
 .ztree li span.button.root_docu{ background:none;}
 .ztree li span.button.roots_docu{background-position:-56px 0}
-.ztree li span.button.center_docu{background-position:-56px -18px}
-.ztree li span.button.bottom_docu{background-position:-56px -36px}
+.ztree li span.button.center_docu{background-position:-56px -24px}
+.ztree li span.button.bottom_docu{background-position:-56px -48px}
 .ztree li span.button.noline_docu{ background:none;}
 
-.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle}
-.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle}
-.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle}
-.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle}
-.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_open{margin-right:2px; margin-top:3px;background-position:-110px -16px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_close{margin-right:2px; margin-top:3px;background-position:-110px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_docu{margin-right:2px; margin-top:3px;background-position:-110px -32px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit {margin-right:2px; margin-top:3px;background-position:-110px -48px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.remove {margin-right:2px; margin-top:3px;background-position:-110px -64px; vertical-align:top; *vertical-align:middle}
 
-.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_loading{margin-right:2px; margin-top:3px;background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
 
 ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
 

+ 24 - 1
app/public/js/payment_safe.js

@@ -695,6 +695,11 @@ $(document).ready(function() {
         }
         batchDownload() {
             const checkes = $('[name=check-att]:checked');
+            if (checkes.length === 0) {
+                toastr.warning('请选择需要批量下载的文件');
+                return;
+            }
+
             const files = [], fileIds = [];
             for (const c of checkes) {
                 const file = this.atts.find(x => { return x.id === parseInt(c.getAttribute('file_id'))});
@@ -703,7 +708,17 @@ $(document).ready(function() {
                     files.push({ filename: file.filename, fileext: file.fileext, filepath: c.viewpath || file.filepath});
                 }
             }
-            AliOss.zipFiles(files, '安全生产费-附件.zip');
+            AliOss.zipFiles(files, '安全生产费-附件.zip', (fails) => {
+                $(self).removeAttr('disabled');
+                if (fails.length === 0) {
+                    toastr.success('下载成功');
+                } else {
+                    toastr.warning(`下载成功(${fails.length}个文件下载失败)`);
+                }
+            }, () => {
+                $(self).removeAttr('disabled');
+                toastr.error('批量下载失败');
+            });
         }
         uploadAtt(files, callback) {
             const curNode = SpreadJsObj.getSelectObject(billsObj.sheet);
@@ -783,6 +798,14 @@ $(document).ready(function() {
         const content = this.getAttribute('fujian-content');
         attObj.setTab(content.replace('-att', ''));
     });
+    $('.check-all-file').change(function() {
+        const checked = this.checked;
+        const table = $(this).parent().parent().parent().parent();
+        const checkes = $('[name=check-att]', table);
+        checkes.each(function(){
+            this.checked = checked;
+        })
+    });
 
     // 加载安全生产费数据
     postData('load', { filter: 'bills;att' }, function(result) {

+ 4 - 4
app/service/report.js

@@ -498,18 +498,18 @@ module.exports = app => {
             return rst;
         }
 
-        async payment_safe(params, sourceFilters, memFieldKeys) {
+        async payment_safe(params, sourceFilters, memFieldKeys, customDefine, customSelect) {
             const RptPaymentSafe = require('../lib/rm/payment_safe');
             const rptPaymentSafe = new RptPaymentSafe(this.ctx);
 
-            return rptPaymentSafe.getReportData(params, sourceFilters, memFieldKeys);
+            return rptPaymentSafe.getReportData(params, sourceFilters, memFieldKeys, customDefine, customSelect);
         }
 
-        async payment(params, sourceFilters, memFieldKeys) {
+        async payment(params, sourceFilters, memFieldKeys, customDefine, customSelect) {
             const RptPayment = require('../lib/rm/payment');
             const rptPayment = new RptPayment(this.ctx);
 
-            return rptPayment.getReportData(params, sourceFilters, memFieldKeys);
+            return rptPayment.getReportData(params, sourceFilters, memFieldKeys, customDefine, customSelect);
         }
 
         async getReportData(source_type, params, sourceFilters, memFieldKeys, customDefine, customSelect) {

+ 3 - 3
app/service/rpt_stage_sum_memory.js

@@ -82,13 +82,13 @@ module.exports = app => {
         }
 
 
-        async getStageSumBills(tid, memFieldKeys, gsDefine, gsCustom) {
+        async getStageSumPos(tid, memFieldKeys, gsDefine, gsCustom) {
             const self = this;
             if (!gsDefine || !gsDefine.enable) return [];
             if (!gsCustom || !gsCustom.stages || gsCustom.stages.length === 0) return [];
 
             await this.ctx.service.tender.checkTender(tid);
-            const posData = await this.ctx.service.pos.getAllDataByCondition({ where: { tid: tender.id} });
+            const posData = await this.ctx.service.pos.getAllDataByCondition({ where: { tid: this.ctx.tender.id} });
             const calcPrefix = [];
             for (const s of gsCustom.stages) {
                 const stage = await this.db.get(this.ctx.service.stage.tableName, { tid: this.ctx.tender.id, order: s });
@@ -109,7 +109,7 @@ module.exports = app => {
             }
             posData.forEach(x => {
                 for (const cp of calcPrefix) {
-                    x[cp + 'gather_qty'] = self.helper.add(x[cp + 'contract_qty'], x[cp + 'qc_qty']);
+                    x[cp + 'gather_qty'] = self.ctx.helper.add(x[cp + 'contract_qty'], x[cp + 'qc_qty']);
                 }
             });