Browse Source

华晶定制报表

MaiXinRong 1 day atrás
parent
commit
d51aca587e
3 changed files with 262 additions and 1 deletions
  1. 2 1
      app/lib/ledger.js
  2. 257 0
      app/lib/rptCustomData.js
  3. 3 0
      app/service/report.js

+ 2 - 1
app/lib/ledger.js

@@ -698,9 +698,10 @@ class pos {
     }
     }
 
 
     resortLedgerPos(ledgerPos) {
     resortLedgerPos(ledgerPos) {
+        const orderField = this.setting.orderField || 'porder';
         if (ledgerPos instanceof Array) {
         if (ledgerPos instanceof Array) {
             ledgerPos.sort(function (a, b) {
             ledgerPos.sort(function (a, b) {
-                return a.porder - b.porder;
+                return a[orderField] - b[orderField];
             })
             })
         }
         }
     }
     }

+ 257 - 0
app/lib/rptCustomData.js

@@ -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,
 };
 };

+ 3 - 0
app/service/report.js

@@ -732,6 +732,9 @@ module.exports = app => {
                     case 'mem_spss_compare_stage_pos':
                     case 'mem_spss_compare_stage_pos':
                         rst[filter] = await spssSource.getCompareStagePos();
                         rst[filter] = await spssSource.getCompareStagePos();
                         break;
                         break;
+                    case 'mem_huajing_ledger_check':
+                        const huajingHelper = new rptCustomData.huajingHelper(this.ctx);
+                        rst[filter] = await huajingHelper.getLedgerCheckData(params.tender_id);
                     default:
                     default:
                         break;
                         break;
                 }
                 }