|
@@ -0,0 +1,103 @@
|
|
|
+'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
|
|
|
+};
|