|
@@ -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 = {
|