|
@@ -9,6 +9,7 @@
|
|
|
*/
|
|
*/
|
|
|
const auditConst = require('../const/audit');
|
|
const auditConst = require('../const/audit');
|
|
|
const Ledger = require('./ledger');
|
|
const Ledger = require('./ledger');
|
|
|
|
|
+const mergeChar = ';';
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 季华项目 定制报表
|
|
* 季华项目 定制报表
|
|
@@ -712,7 +713,263 @@ class fjHelper {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * 华晶项目 定制报表
|
|
|
|
|
+ * 台账复核表:根据【台账顺序】列出所有清单、计量单元及明细、附属工程量及明细
|
|
|
|
|
+ */
|
|
|
|
|
+class huajingHelper {
|
|
|
|
|
+ constructor(ctx) {
|
|
|
|
|
+ this.ctx = ctx;
|
|
|
|
|
+ this.dataType = { jl: '计量', fs: '附属' };
|
|
|
|
|
+ }
|
|
|
|
|
+ async loadLedgerData(tid) {
|
|
|
|
|
+ this.ledger = new Ledger.billsTree(this.ctx, {
|
|
|
|
|
+ id: 'ledger_id',
|
|
|
|
|
+ pid: 'ledger_pid',
|
|
|
|
|
+ order: 'order',
|
|
|
|
|
+ level: 'level',
|
|
|
|
|
+ rootId: -1,
|
|
|
|
|
+ keys: ['id', 'tender_id', 'ledger_id'],
|
|
|
|
|
+ stageId: 'id',
|
|
|
|
|
+ calcFields: [],
|
|
|
|
|
+ calc: function (node, helper, decimal) {},
|
|
|
|
|
+ });
|
|
|
|
|
+ const ledgerData = await this.ctx.service.ledger.getData(tid);
|
|
|
|
|
+ const ledgerExtraData = await this.ctx.service.ledgerExtra.getAllDataByCondition({ where: { tid } });
|
|
|
|
|
+ this.ctx.helper.assignRelaData(ledgerData, [
|
|
|
|
|
+ { data: ledgerExtraData, fields: ['calc_template'], prefix: '', relaId: 'id' },
|
|
|
|
|
+ ]);
|
|
|
|
|
+ this.ledger.loadDatas(ledgerData);
|
|
|
|
|
+
|
|
|
|
|
+ this.pos = new Ledger.pos({ id: 'id', ledgerId: 'lid' });
|
|
|
|
|
+ const posData = await this.ctx.service.pos.getAllDataByCondition({ where: { tid }});
|
|
|
|
|
+ this.pos.loadDatas(posData);
|
|
|
|
|
+
|
|
|
|
|
+ this.posCalcDetail = new Ledger.pos({ id: 'id', ledgerId: 'pid', orderField: 'pcd_order' });
|
|
|
|
|
+ const posCalcDetailData = await this.ctx.service.posCalcDetail.getAllDataByCondition({ where: { tid } });
|
|
|
|
|
+ this.posCalcDetail.loadDatas(posCalcDetailData);
|
|
|
|
|
+
|
|
|
|
|
+ this.ancGcl = new Ledger.pos({ id: 'id', ledgerId: 'pid', orderField: 'g_order' });
|
|
|
|
|
+ const ancGclData = await this.ctx.service.ancillaryGcl.getAllDataByCondition({ where: { tid } });
|
|
|
|
|
+ this.ancGcl.loadDatas(ancGclData);
|
|
|
|
|
+
|
|
|
|
|
+ this.ancGclDetail = new Ledger.pos({ id: 'id', ledgerId: 'ag_id', orderField: 'agd_order' });
|
|
|
|
|
+ const ancGclDetailData = await this.ctx.service.ancillaryGclDetail.getAllDataByCondition({ where: { tid } });
|
|
|
|
|
+ this.ancGclDetail.loadDatas(ancGclDetailData);
|
|
|
|
|
+
|
|
|
|
|
+ this.calcTemplate = await this.ctx.service.calcTmpl.getAllTemplateDetail(this.ctx.session.sessionProject.id, 'posCalc');
|
|
|
|
|
+ }
|
|
|
|
|
+ CheckPeg(text) {
|
|
|
|
|
+ const pegReg = /[a-zA-Z]*[kK][0-9]+[++][0-9]{3}([.][0-9]+)?/;
|
|
|
|
|
+ return pegReg.test(text);
|
|
|
|
|
+ }
|
|
|
|
|
+ getPegNode(node) {
|
|
|
|
|
+ if (node) {
|
|
|
|
|
+ if (this.CheckPeg(node.name)) {
|
|
|
|
|
+ return node;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ const parent = this.ledger.getParent(node);
|
|
|
|
|
+ return parent ? this.getPegNode(parent) : null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ getNodeByLevel(node, level) {
|
|
|
|
|
+ let cur = node;
|
|
|
|
|
+ while (cur && cur.level > level) {
|
|
|
|
|
+ cur = this.ledger.getParent(cur);
|
|
|
|
|
+ }
|
|
|
|
|
+ return cur;
|
|
|
|
|
+ }
|
|
|
|
|
+ getDwgc(peg, xmj) {
|
|
|
|
|
+ if (peg) {
|
|
|
|
|
+ return peg.name;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ const node = this.getNodeByLevel(xmj, 2);
|
|
|
|
|
+ return node ? node.name : '';
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ getFbgc(peg, xmj) {
|
|
|
|
|
+ if (peg && peg.id !== xmj.id) {
|
|
|
|
|
+ const node = this.getNodeByLevel(xmj, peg.level + 1);
|
|
|
|
|
+ return node ? node.name : '';
|
|
|
|
|
+ } else {
|
|
|
|
|
+ const node = this.getNodeByLevel(xmj, 3);
|
|
|
|
|
+ return node ? node.name : '';
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ getFxgc (peg, xmj) {
|
|
|
|
|
+ if (!peg) {
|
|
|
|
|
+ const node = this.getNodeByLevel(xmj, 4);
|
|
|
|
|
+ return node ? node.name : '';
|
|
|
|
|
+ } else if (peg.id === xmj.id) {
|
|
|
|
|
+ if (xmj.level > 4) {
|
|
|
|
|
+ let value = '';
|
|
|
|
|
+ for (let level = 4; level < xmj.level; level++) {
|
|
|
|
|
+ const node = this.getNodeByLevel(xmj, level);
|
|
|
|
|
+ value = value === '' ? node.name : value + mergeChar + node.name;
|
|
|
|
|
+ }
|
|
|
|
|
+ return value;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return '';
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (peg.level + 2 < xmj.level) {
|
|
|
|
|
+ let value = '';
|
|
|
|
|
+ for (let level = peg.level + 2; level < xmj.level; level++) {
|
|
|
|
|
+ const node = this.getNodeByLevel(xmj, level);
|
|
|
|
|
+ value = value === '' ? node.name : value + mergeChar + node.name;
|
|
|
|
|
+ }
|
|
|
|
|
+ return value;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return '';
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ newCacheLeafXmj(leafXmj) {
|
|
|
|
|
+ const peg = this.getPegNode(leafXmj);
|
|
|
|
|
+ const cacheLX = {
|
|
|
|
|
+ id: leafXmj.id,
|
|
|
|
|
+ code: leafXmj.code,
|
|
|
|
|
+ jldy: leafXmj.name,
|
|
|
|
|
+ fbgc: this.getFbgc(peg, leafXmj),
|
|
|
|
|
+ fxgc: this.getFxgc(peg, leafXmj),
|
|
|
|
|
+ dwgc: this.getDwgc(peg, leafXmj),
|
|
|
|
|
+ drawing_code: leafXmj.drawing_code,
|
|
|
|
|
+ };
|
|
|
|
|
+ this.leafXmjs.push(cacheLX);
|
|
|
|
|
+ return cacheLX;
|
|
|
|
|
+ }
|
|
|
|
|
+ getCacheLeafXmj(leafXmj) {
|
|
|
|
|
+ if (!this.leafXmjs) this.leafXmjs = [];
|
|
|
|
|
+
|
|
|
|
|
+ const cacheLX = this.leafXmjs.find(lx => { return lx.id === leafXmj.id; });
|
|
|
|
|
+ if (!cacheLX) {
|
|
|
|
|
+ return this.newCacheLeafXmj(leafXmj);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return cacheLX;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ convertCalcHeader(target, calcTemplate) {
|
|
|
|
|
+ for (const [i, col] of calcTemplate.col_set.entries()) {
|
|
|
|
|
+ target['detail_' + i] = col.title + (col.unit ? `(${col.unit})` : '');
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ convertCalcData(target, source, calcTemplate) {
|
|
|
|
|
+ for (const [i, col] of calcTemplate.col_set.entries()) {
|
|
|
|
|
+ target['detail_' + i] = source[col.field];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ convertAncGclDetail(gclBaseData, pos, ancGcl, details, calcTemplate) {
|
|
|
|
|
+ const calc = [];
|
|
|
|
|
+ for (const d of details) {
|
|
|
|
|
+ calc.push(d.qty);
|
|
|
|
|
+ const dData = {
|
|
|
|
|
+ ...gclBaseData,
|
|
|
|
|
+ pos_id: pos.id, pos_name: pos.name,
|
|
|
|
|
+ anc_gcl_id: ancGcl.id, anc_gcl_name: ancGcl.name,
|
|
|
|
|
+ anc_gcl_detail_id: d.id, data_type: this.dataType.fs,
|
|
|
|
|
+ };
|
|
|
|
|
+ this.convertCalcData(dData, d, calcTemplate);
|
|
|
|
|
+ this.ledgerCheckData.push(dData);
|
|
|
|
|
+ }
|
|
|
|
|
+ return calc.join('+');
|
|
|
|
|
+ }
|
|
|
|
|
+ convertAncGcl(gclBaseData, pos, ancGcl) {
|
|
|
|
|
+ for (const ag of ancGcl) {
|
|
|
|
|
+ const agData = {
|
|
|
|
|
+ ...gclBaseData,
|
|
|
|
|
+ pos_id: pos.id, pos_name: pos.name,
|
|
|
|
|
+ anc_gcl_id: ag.id, anc_gcl_name: ancGcl.name, quantity: ag.quantity, data_type: this.dataType.fs,
|
|
|
|
|
+ };
|
|
|
|
|
+ const calcTemplate = this.calcTemplate.find(x => { return x.id === ag.calc_template; });
|
|
|
|
|
+ this.ledgerCheckData.push(agData);
|
|
|
|
|
+
|
|
|
|
|
+ const details = this.ancGclDetail.getLedgerPos(ag.id);
|
|
|
|
|
+ if (calcTemplate) this.convertCalcHeader(agData, calcTemplate);
|
|
|
|
|
+ if (calcTemplate && details && details.length > 0) {
|
|
|
|
|
+ agData.expr = this.convertAncGclDetail(gclBaseData, pos, ag, details, calcTemplate);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ agData.expr = ag.expr;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ convertPosCalcDetail(gclBaseData, pos, details, calcTemplate) {
|
|
|
|
|
+ const calc = [];
|
|
|
|
|
+ for (const d of details) {
|
|
|
|
|
+ calc.push(d.qty);
|
|
|
|
|
+ const dData = {
|
|
|
|
|
+ ...gclBaseData,
|
|
|
|
|
+ pos_id: pos.id, pos_name: pos.name,
|
|
|
|
|
+ pos_calc_detail_id: d.id, data_type: this.dataType.jl,
|
|
|
|
|
+ };
|
|
|
|
|
+ this.convertCalcData(dData, d, calcTemplate);
|
|
|
|
|
+ this.ledgerCheckData.push(dData);
|
|
|
|
|
+ }
|
|
|
|
|
+ return calc.join('+');
|
|
|
|
|
+ }
|
|
|
|
|
+ convertPosRange(gclBaseData, posRange, calcTemplate) {
|
|
|
|
|
+ const calc = [];
|
|
|
|
|
+ for (const p of posRange) {
|
|
|
|
|
+ calc.push(p.sgfh_qty);
|
|
|
|
|
+ const posData = {
|
|
|
|
|
+ ...gclBaseData,
|
|
|
|
|
+ pos_id: p.id, pos_name: p.name, quantity: p.sgfh_qty, data_type: this.dataType.jl,
|
|
|
|
|
+ };
|
|
|
|
|
+ this.ledgerCheckData.push(posData);
|
|
|
|
|
+ const details = this.posCalcDetail.getLedgerPos(p.id);
|
|
|
|
|
+ if (calcTemplate) this.convertCalcHeader(posData, calcTemplate);
|
|
|
|
|
+ if (calcTemplate && details && details.length > 0) {
|
|
|
|
|
+ posData.expr = this.convertPosCalcDetail(gclBaseData, p, details, calcTemplate);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ posData.expr = p.sgfh_expr;
|
|
|
|
|
+ }
|
|
|
|
|
+ const ancGcl = this.ancGcl.getLedgerPos(p.id);
|
|
|
|
|
+ if (ancGcl && ancGcl.length > 0) this.convertAncGcl(gclBaseData, p, ancGcl);
|
|
|
|
|
+ }
|
|
|
|
|
+ return calc.join('+');
|
|
|
|
|
+ }
|
|
|
|
|
+ convertGclNode(node, leafXmj) {
|
|
|
|
|
+ const cacheLeafXmj = this.getCacheLeafXmj(leafXmj);
|
|
|
|
|
+ const posRange = this.pos.getLedgerPos(node.id);
|
|
|
|
|
+ const gclBaseData = {
|
|
|
|
|
+ id: node.id, tid: node.tender_id, leaf_xmj_id: leafXmj.id,
|
|
|
|
|
+ b_code: node.b_code, name: node.name, unit: node.unit, unit_price: node.unit_price,
|
|
|
|
|
+ drawing_code: node.drawing_code,
|
|
|
|
|
+ g_jldy: cacheLeafXmj.jldy, g_fbgc: cacheLeafXmj.fbgc, g_fxgc: cacheLeafXmj.fxgc, g_dwgc: cacheLeafXmj.dwgc, g_bwmx: cacheLeafXmj.bwmx,
|
|
|
|
|
+ };
|
|
|
|
|
+ const gclData = { ...gclBaseData, quantity: node.sgfh_qty, data_type: this.dataType.jl } ;
|
|
|
|
|
+ this.ledgerCheckData.push(gclData);
|
|
|
|
|
+ if (posRange && posRange.length > 0) {
|
|
|
|
|
+ const calcTemplate = node.calc_template ? this.calcTemplate.find(x => { return x.id === node.calc_template; }) : null;
|
|
|
|
|
+ gclData.expr = this.convertPosRange(gclBaseData, posRange, calcTemplate);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ gclData.expr = node.sgfh_expr;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ recursiveConvertLedgerCheckData(nodes, leafXmj) {
|
|
|
|
|
+ for (const node of nodes) {
|
|
|
|
|
+ if (node.b_code) {
|
|
|
|
|
+ if (node.children.length > 0) {
|
|
|
|
|
+ this.recursiveConvertLedgerCheckData(node.children, leafXmj);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ this.convertGclNode(node, leafXmj);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else if (node.children.length > 0) {
|
|
|
|
|
+ this.recursiveConvertLedgerCheckData(node.children, node);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ async getLedgerCheckData(tid) {
|
|
|
|
|
+ await this.ctx.service.tender.checkTender(tid);
|
|
|
|
|
+ await this.loadLedgerData(tid);
|
|
|
|
|
+ this.ledgerCheckData = [];
|
|
|
|
|
+ this.recursiveConvertLedgerCheckData(this.ledger.children, null);
|
|
|
|
|
+ return this.ledgerCheckData;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
module.exports = {
|
|
module.exports = {
|
|
|
jhHelper,
|
|
jhHelper,
|
|
|
fjHelper,
|
|
fjHelper,
|
|
|
|
|
+ huajingHelper,
|
|
|
};
|
|
};
|