Browse Source

报表内存表,提供季华定制报表

MaiXinRong 4 years ago
parent
commit
92bfef1cfe
3 changed files with 213 additions and 15 deletions
  1. 135 14
      app/lib/rptCustomData.js
  2. 4 0
      app/service/report.js
  3. 74 1
      builder_report_index_define.js

+ 135 - 14
app/lib/rptCustomData.js

@@ -8,6 +8,7 @@
  * @version
  */
 const auditConst = require('../const/audit');
+const Ledger = require('./ledger');
 
 /**
  * 季华项目 定制报表
@@ -228,11 +229,11 @@ class jhHelper {
         }
     }
 
-    async _loadStageBillsData(tender, stage, gsDefine, auditors) {
+    async _loadStageBillsData(tender, stage, gsDefine, auditors, filterGcl = true) {
         const helper = this.ctx.helper;
         // 加载截止上期/本期
         let billsData = await this.ctx.service.ledger.getData(tender.id);
-        billsData = billsData.filter(x => { return x.b_code && x.is_leaf });
+        if (filterGcl) billsData = billsData.filter(x => { return x.b_code && x.is_leaf });
         const curStage = await this.ctx.service.stageBills.getLastestStageData(tender.id, stage.id);
         const preStage = stage.order > 1 ? await this.ctx.service.stageBillsFinal.getFinalData(tender, stage.order - 1) : [];
         const loadData = [
@@ -308,27 +309,111 @@ class jhHelper {
         this._loadChangeDetail(billsIndex, finalChangeData, gsDefine, 'pre_');
         this._generateResult(billsData, gsDefine, tender.info.decimal);
     }
+    async _gatherStageBillsData(tender, stage, gsDefine) {
+        if (!stage) return;
+        const helper = this.ctx.helper;
+
+        await this.ctx.service.stage.doCheckStage(stage);
+
+        const auditors = this.getLastestAuditors(stage.auditors);
+        const user = await this.ctx.service.projectAccount.getDataById(stage.user_id);
+        auditors.unshift({
+            aid: user.id, name: user.name, company: user.company, role: user.role,
+            times: stage.curTimes, order: 0
+        });
+        const billsData = await this._loadStageBillsData(tender, stage, gsDefine, auditors, false);
+        const billsTree = new Ledger.billsTree(this.ctx, {
+            id: 'ledger_id',
+            pid: 'ledger_pid',
+            order: 'order',
+            level: 'level',
+            rootId: -1,
+            keys: ['id', 'ledger_id'],
+            stageId: 'id',
+            calcFields: ['deal_tp', 'total_price', 'contract_tp', 'qc_tp', 'gather_tp', 'pre_contract_tp', 'pre_qc_tp', 'pre_gather_tp'],
+            calc: function (node) {
+                if (node.children && node.children.length === 0) {
+                    node.pre_gather_qty = helper.add(node.pre_contract_qty, node.pre_qc_qty);
+                    node.gather_qty = helper.add(node.contract_qty, node.qc_qty);
+                    node.end_contract_qty = helper.add(node.pre_contract_qty, node.contract_qty);
+                    node.end_qc_qty = helper.add(node.pre_qc_qty, node.qc_qty);
+                    node.end_gather_qty = helper.add(node.pre_gather_qty, node.gather_qty);
+                }
+                node.pre_gather_tp = helper.add(node.pre_contract_tp, node.pre_qc_tp);
+                node.gather_tp = helper.add(node.contract_tp, node.qc_tp);
+                node.end_contract_tp = helper.add(node.pre_contract_tp, node.contract_tp);
+                node.end_qc_tp = helper.add(node.pre_qc_tp, node.qc_tp);
+                node.end_gather_tp = helper.add(node.pre_gather_tp, node.gather_tp);
+                for (const dc of gsDefine.defaultCompare) {
+                    const prefix = `r${dc}_`;
+                    node[prefix + 'gather_qty'] = helper.add(node[prefix + 'contract_qty'], node[prefix + 'qc_qty']);
+                    node[prefix + 'gather_tp'] = helper.add(node[prefix + 'contract_tp'], node[prefix + 'qc_tp']);
+                }
+            }
+        });
+        billsTree.loadDatas(billsData);
+        billsTree.calculateAll();
+
+        this.resultTree.loadGatherTree(billsTree, function (gatherNode, sourceNode) {
+            gatherNode.s_qty = helper.add(gatherNode.s_qty, sourceNode.quantity);
+            gatherNode.s_tp = helper.add(gatherNode.s_tp, sourceNode.total_price);
+
+            gatherNode.s_dgn_qty1 = helper.add(gatherNode.s_dgn_qty1, sourceNode.dgn_qty1);
+            gatherNode.s_dgn_qty2 = helper.add(gatherNode.s_dgn_qty2, sourceNode.dgn_qty2);
+
+            gatherNode.s_contract_qty = helper.add(gatherNode.s_contract_qty, sourceNode.contract_qty);
+            gatherNode.s_contract_tp = helper.add(gatherNode.s_contract_tp, sourceNode.contract_tp);
+            gatherNode.s_qc_qty = helper.add(gatherNode.s_qc_qty, sourceNode.qc_qty);
+            gatherNode.s_qc_tp = helper.add(gatherNode.s_qc_tp, sourceNode.qc_tp);
+            gatherNode.s_gather_qty = helper.add(gatherNode.s_gather_qty, sourceNode.gather_qty);
+            gatherNode.s_gather_tp = helper.add(gatherNode.s_gather_tp, sourceNode.gather_tp);
 
-    async _gatherMonthData(tender, month, defaultCompare) {
+            gatherNode.s_pre_contract_qty = helper.add(gatherNode.s_pre_contract_qty, sourceNode.pre_contract_qty);
+            gatherNode.s_pre_contract_tp = helper.add(gatherNode.s_pre_contract_tp, sourceNode.pre_contract_tp);
+            gatherNode.s_pre_qc_qty = helper.add(gatherNode.s_pre_qc_qty, sourceNode.pre_qc_qty);
+            gatherNode.s_pre_qc_tp = helper.add(gatherNode.s_pre_qc_tp, sourceNode.pre_qc_tp);
+            gatherNode.s_pre_gather_qty = helper.add(gatherNode.s_pre_gather_qty, sourceNode.pre_gather_qty);
+            gatherNode.s_pre_gather_tp = helper.add(gatherNode.s_pre_gather_tp, sourceNode.pre_gather_tp);
+
+            gatherNode.s_end_contract_qty = helper.add(gatherNode.s_end_contract_qty, sourceNode.end_contract_qty);
+            gatherNode.s_end_contract_tp = helper.add(gatherNode.s_end_contract_tp, sourceNode.end_contract_tp);
+            gatherNode.s_end_qc_qty = helper.add(gatherNode.s_end_qc_qty, sourceNode.end_qc_qty);
+            gatherNode.s_end_qc_tp = helper.add(gatherNode.s_end_qc_tp, sourceNode.end_qc_tp);
+            gatherNode.s_end_gather_qty = helper.add(gatherNode.s_end_gather_qty, sourceNode.end_gather_qty);
+            gatherNode.s_end_gather_tp = helper.add(gatherNode.s_end_gather_tp, sourceNode.end_gather_tp);
+
+            for (const dc of gsDefine.defaultCompare) {
+                const prefix = `r${dc}_`;
+                gatherNode[prefix + 'contract_qty'] = helper.add(gatherNode[prefix + 'contract_qty'], sourceNode[prefix + 'contract_qty']);
+                gatherNode[prefix + 'contract_tp'] = helper.add(gatherNode[prefix + 'contract_tp'], sourceNode[prefix + 'contract_tp']);
+                gatherNode[prefix + 'qc_qty'] = helper.add(gatherNode[prefix + 'qc_qty'], sourceNode[prefix + 'qc_qty']);
+                gatherNode[prefix + 'qc_tp'] = helper.add(gatherNode[prefix + 'qc_tp'], sourceNode[prefix + 'qc_tp']);
+                gatherNode[prefix + 'gather_qty'] = helper.add(gatherNode[prefix + 'gather_qty'], sourceNode[prefix + 'gather_qty']);
+                gatherNode[prefix + 'gather_tp'] = helper.add(gatherNode[prefix + 'gather_tp'], sourceNode[prefix + 'gather_tp']);
+            }
+        });
+    }
+
+    async _gatherMonthData(tender, month, defaultCompare, fun) {
         const stages = await this._getValidStages(tender.id);
         const stage = this.ctx.helper._.find(stages, {s_time: month});
-        await this._gatherStageData(tender, stage, defaultCompare);
+        await fun.call(this, tender, stage, defaultCompare);
     }
 
-    async _gatherFinalData(tender, defaultCompare) {
+    async _gatherFinalData(tender, defaultCompare, fun) {
         const stages = await this._getValidStages(tender.id);
-        await this._gatherStageData(tender, stages[0], defaultCompare);
+        await fun.call(this, tender, stages[0], defaultCompare);
     }
 
-    async _gatherCheckedFinalData(tender, defaultCompare) {
+    async _gatherCheckedFinalData(tender, defaultCompare, fun) {
         const stages = await this._getCheckedStages(tender.id);
-        await this._gatherStageData(tender, stages[0], defaultCompare);
+        await fun.call(this, tender, stages[0], defaultCompare);
     }
 
-    async _gatherIndexData(tender, index, defaultCompare) {
+    async _gatherIndexData(tender, index, defaultCompare, fun) {
         const stages = await this._getValidStages(tender.id);
         const stage = this.ctx.helper._.find(stages, {order: index});
-        await this._gatherStageData(tender, stage, defaultCompare);
+        await fun.call(this, tender, stage, defaultCompare);
     }
 
     /**
@@ -349,16 +434,16 @@ class jhHelper {
 
             switch (gsSetting.type) {
                 case 'month':
-                    await this._gatherMonthData(tender, gsCustom.month, gsSetting);
+                    await this._gatherMonthData(tender, gsCustom.month, gsSetting, this._gatherStageData);
                     break;
                 case 'final':
-                    await this._gatherFinalData(tender, gsSetting);
+                    await this._gatherFinalData(tender, gsSetting, this._gatherStageData);
                     break;
                 case 'checked-final':
-                    await this._gatherCheckedFinalData(tender, gsSetting);
+                    await this._gatherCheckedFinalData(tender, gsSetting, this._gatherStageData);
                     break;
                 case 'stage':
-                    await this._gatherIndexData(tender, gsCustom.stage, gsSetting);
+                    await this._gatherIndexData(tender, gsCustom.stage, gsSetting, this._gatherStageData);
                     break;
                 default: throw '未知汇总类型';
             }
@@ -381,6 +466,42 @@ class jhHelper {
         this.result.sort((x, y) => { return helper.compareCode(x.b_code, y.b_code); });
         return this.result;
     }
+
+    async gatherBills(memFieldKeys, gsDefine, gsCustom) {
+        if (!gsDefine || !gsDefine.enable) return [];
+        if (!gsCustom || !gsCustom.tenders || gsCustom.tenders.length === 0) return [];
+
+        const gsSetting = JSON.parse(gsDefine.setting);
+        if (!gsSetting.defaultCompare) return [];
+        this.resultTree = new Ledger.gatherTree(this.ctx, {
+            id: 'id',
+            pid: 'pid',
+            order: 'order',
+            level: 'level',
+            rootId: -1
+        });
+        for (const t of gsCustom.tenders) {
+            const tender = await this.ctx.service.tender.getCheckTender(t.tid);
+
+            switch (gsSetting.type) {
+                case 'month':
+                    await this._gatherMonthData(tender, gsCustom.month, gsSetting, this._gatherStageBillsData);
+                    break;
+                case 'final':
+                    await this._gatherFinalData(tender, gsSetting, this._gatherStageBillsData);
+                    break;
+                case 'checked-final':
+                    await this._gatherCheckedFinalData(tender, gsSetting, this._gatherStageBillsData);
+                    break;
+                case 'stage':
+                    await this._gatherIndexData(tender, gsCustom.stage, gsSetting, this._gatherStageBillsData);
+                    break;
+                default: throw '未知汇总类型';
+            }
+        }
+        this.resultTree.generateSortNodes();
+        return this.resultTree.getDefaultDatas();
+    }
 }
 
 module.exports = {

+ 4 - 0
app/service/report.js

@@ -247,6 +247,10 @@ module.exports = app => {
                         const jhHelper2 = new rptCustomData.jhHelper(this.ctx);
                         rst[filter] = await jhHelper2.gather(memFieldKeys[filter], customDefine.gather_select, customSelect ? customSelect.gather_select : null);
                         break;
+                    case 'mem_jh_gather_stage_bills_compare':
+                        const jhHelper3 = new rptCustomData.jhHelper(this.ctx);
+                        rst[filter] = await jhHelper3.gatherBills(memFieldKeys[filter], customDefine.gather_select, customSelect ? customSelect.gather_select : null);
+                        break;
                     // case 'mem_material_bills':
                     //     rst[filter] = await service.rptGatherMemory.getMaterialBills(params.tender_id, params.material_order, memFieldKeys[filter]);
                     //     break;

+ 74 - 1
builder_report_index_define.js

@@ -1692,6 +1692,79 @@ const jh_gather_im_change = {
         { name: '本期-数量变更-金额_4', field: 'r4_qc_tp', type: dataType.currency },
     ],
 };
+const jh_gather_stage_bills_compare = {
+    name: '【定制】季华-期-清单-汇总-多审 数据表(mem_jh_gather_stage_bills_compare)',
+    remark: '',
+    id: 64,
+    key: 'mem_jh_gather_stage_bills_compare',
+    prefix: '【定制】季华-期-清单-汇总-多审',
+    cols: [
+        { name: '项目节编号', field: 'code', type: dataType.str },
+        { name: '清单编号', field: 'b_code', type: dataType.str },
+        { name: '名称', field: 'name', type: dataType.str },
+        { name: '单位', field: 'unit', type: dataType.str },
+        { name: '单价', field: 'unit_price', type: dataType.currency },
+
+        { name: '(合计)台账-数量', field: 's_qty', type: dataType.currency },
+        { name: '(合计)台账-金额', field: 's_tp', type: dataType.currency },
+
+        { name: '(合计)本期-合同-数量', field: 's_contract_qty', type: dataType.currency },
+        { name: '(合计)本期-合同-金额', field: 's_contract_tp', type: dataType.currency },
+        { name: '(合计)本期-变更-数量', field: 's_qc_qty', type: dataType.currency },
+        { name: '(合计)本期-变更-金额', field: 's_qc_tp', type: dataType.currency },
+        { name: '(合计)本期-完成-数量', field: 's_gather_qty', type: dataType.currency },
+        { name: '(合计)本期-完成-金额', field: 's_gather_tp', type: dataType.currency },
+
+        { name: '(合计)截止上期-合同-数量', field: 's_pre_contract_qty', type: dataType.currency },
+        { name: '(合计)截止上期-合同-金额', field: 's_pre_contract_tp', type: dataType.currency },
+        { name: '(合计)截止上期-变更-数量', field: 's_pre_qc_qty', type: dataType.currency },
+        { name: '(合计)截止上期-变更-金额', field: 's_pre_qc_tp', type: dataType.currency },
+        { name: '(合计)截止上期-完成-数量', field: 's_pre_gather_qty', type: dataType.currency },
+        { name: '(合计)截止上期-完成-金额', field: 's_pre_gather_tp', type: dataType.currency },
+
+        { name: '(合计)截止本期-合同-数量', field: 's_end_contract_qty', type: dataType.currency },
+        { name: '(合计)截止本期-合同-金额', field: 's_end_contract_tp', type: dataType.currency },
+        { name: '(合计)截止本期-变更-数量', field: 's_end_qc_qty', type: dataType.currency },
+        { name: '(合计)截止本期-变更-金额', field: 's_end_qc_tp', type: dataType.currency },
+        { name: '(合计)截止本期-完成-数量', field: 's_end_gather_qty', type: dataType.currency },
+        { name: '(合计)截止本期-完成-金额', field: 's_end_gather_tp', type: dataType.currency },
+
+        { name: '(原报)本期-合同-数量', field: 'r0_contract_qty', type: dataType.currency },
+        { name: '(原报)本期-合同-金额', field: 'r0_contract_tp', type: dataType.currency },
+        { name: '(原报)本期-变更-数量', field: 'r0_qc_qty', type: dataType.currency },
+        { name: '(原报)本期-变更-金额', field: 'r0_qc_tp', type: dataType.currency },
+        { name: '(原报)本期-完成-数量', field: 'r0_gather_qty', type: dataType.currency },
+        { name: '(原报)本期-完成-金额', field: 'r0_gather_tp', type: dataType.currency },
+
+        { name: '(1审)本期-合同-数量', field: 'r1_contract_qty', type: dataType.currency },
+        { name: '(1审)本期-合同-金额', field: 'r1_contract_tp', type: dataType.currency },
+        { name: '(1审)本期-变更-数量', field: 'r1_qc_qty', type: dataType.currency },
+        { name: '(1审)本期-变更-金额', field: 'r1_qc_tp', type: dataType.currency },
+        { name: '(1审)本期-完成-数量', field: 'r1_gather_qty', type: dataType.currency },
+        { name: '(1审)本期-完成-金额', field: 'r1_gather_tp', type: dataType.currency },
+
+        { name: '(2审)本期-合同-数量', field: 'r2_contract_qty', type: dataType.currency },
+        { name: '(2审)本期-合同-金额', field: 'r2_contract_tp', type: dataType.currency },
+        { name: '(2审)本期-变更-数量', field: 'r2_qc_qty', type: dataType.currency },
+        { name: '(2审)本期-变更-金额', field: 'r2_qc_tp', type: dataType.currency },
+        { name: '(2审)本期-完成-数量', field: 'r2_gather_qty', type: dataType.currency },
+        { name: '(2审)本期-完成-金额', field: 'r2_gather_tp', type: dataType.currency },
+
+        { name: '(3审)本期-合同-数量', field: 'r3_contract_qty', type: dataType.currency },
+        { name: '(3审)本期-合同-金额', field: 'r3_contract_tp', type: dataType.currency },
+        { name: '(3审)本期-变更-数量', field: 'r3_qc_qty', type: dataType.currency },
+        { name: '(3审)本期-变更-金额', field: 'r3_qc_tp', type: dataType.currency },
+        { name: '(3审)本期-完成-数量', field: 'r3_gather_qty', type: dataType.currency },
+        { name: '(3审)本期-完成-金额', field: 'r3_gather_tp', type: dataType.currency },
+
+        { name: '树结构-id', field: 'id', type: dataType.int },
+        { name: '树结构-父项id', field: 'pid', type: dataType.int },
+        { name: '树结构-层次', field: 'level', type: dataType.int },
+        { name: '树结构-排序', field: 'order', type: dataType.int },
+        { name: '树结构-完整路径', field: 'full_path', type: dataType.str },
+        { name: '树结构-是否子项', field: 'is_leaf', type: dataType.int },
+    ],
+};
 
 const custom_select = {
     name: '【用户交互】用户选择信息 数据表(mem_custom_select)',
@@ -1829,7 +1902,7 @@ const defines = [
     stage_change, stage_change_bills, stage_change_ledger,
     gcl_gather_bills, gcl_gather_xmj,
     ledger_tag, stage_tag, all_tag,
-    jh_im_change, jh_gather_im_change,
+    jh_im_change, jh_gather_im_change, jh_gather_stage_bills_compare,
     custom_select,
 ];
 for (const d of defines) {