'use strict'; /** * * * @author Mai * @date * @version */ const LedgerTree = require('./ledger'); const xlsx = require('js-xlsx'); const measureType = require('../const/tender').measureType; class exportExcel { constructor(ctx) { this.ctx = ctx; this.setting = null; this.xlsxData = { SheetNames: [], Sheets: {} }; } export2Sheet(xlsxData, name, data) { if (xlsxData.SheetNames.indexOf(name) >= 0) throw '存在同名Sheet'; if (this.setting) { xlsxData.SheetNames.push(name); xlsxData.Sheets[name] = this.ctx.helper.simpleXlsxSheetData(this.setting, data); } } async export2File(fileName) { this.export2Sheet(this.xlsxData, 'Sheet1', []); xlsx.writeFile(this.xlsxData, fileName); } } class exportLedger2Excel extends exportExcel { constructor(ctx) { super(ctx); this.setting = { header: ['项目节编号', '清单子目号', '计量单元', '名称', '单位', '清单数量', '设计数量1', '设计数量2', '单价', '合价', '图号', '备注'], width: [100, 70, 70, 300, 60, 80, 80, 80, 80, 80, 100, 100], hAlign: ['left', 'left', 'left', 'left','center', 'right', 'right', 'right', 'right', 'right', 'left', 'left'], }; } async sortLedgerData(billsTree, pos) { const result = []; for (const node of billsTree.nodes) { result.push([node.code, node.b_code, '', node.name, node.unit, node.quantity, node.dgn_qty1, node.dgn_qty2, node.unit_price, node.total_price, node.drawing_code, node.memo ]); const posRange = pos.getLedgerPos(node.id); if (posRange && posRange.length > 0) { for (const [i, p] of posRange.entries()) { result.push([ '', '', (i + 1) + '', p.name, '', p.quantity, null, null, null, null, p.drawing_code, p.memo ]); } } } return result; } async getLedgerMapData() { const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id); const billsTree = new LedgerTree.billsTree(this.ctx, { id: 'ledger_id', pid: 'ledger_pid', order: 'order', level: 'level', rootId: -1, keys: ['id', 'tender_id', 'ledger_id'], stageId: 'id', calcFields: ['deal_tp', 'total_price'] }); billsTree.loadDatas(billsData); billsTree.calculateAll(); const posData = this.ctx.tender.data.measure_type === measureType.tz.value ? await this.ctx.service.pos.getPosData({tid: this.ctx.tender.id}) : []; const pos = new LedgerTree.pos({id: 'id', ledgerId: 'lid'}); pos.loadDatas(posData); return this.sortLedgerData(billsTree, pos); } async export2File(fileName) { const ledgerData = await this.getLedgerMapData(); this.export2Sheet(this.xlsxData, '台账分解', ledgerData); xlsx.writeFile(this.xlsxData, fileName); } } module.exports = { exportLedger2Excel };