export_excel.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const LedgerTree = require('./ledger');
  10. const xlsx = require('js-xlsx');
  11. const measureType = require('../const/tender').measureType;
  12. class exportExcel {
  13. constructor(ctx) {
  14. this.ctx = ctx;
  15. this.setting = null;
  16. this.xlsxData = {
  17. SheetNames: [],
  18. Sheets: {}
  19. };
  20. }
  21. export2Sheet(xlsxData, name, data) {
  22. if (xlsxData.SheetNames.indexOf(name) >= 0) throw '存在同名Sheet';
  23. if (this.setting) {
  24. xlsxData.SheetNames.push(name);
  25. xlsxData.Sheets[name] = this.ctx.helper.simpleXlsxSheetData(this.setting, data);
  26. }
  27. }
  28. async export2File(fileName) {
  29. this.export2Sheet(this.xlsxData, 'Sheet1', []);
  30. xlsx.writeFile(this.xlsxData, fileName);
  31. }
  32. }
  33. class exportLedger2Excel extends exportExcel {
  34. constructor(ctx) {
  35. super(ctx);
  36. this.setting = {
  37. header: ['项目节编号', '清单子目号', '计量单元', '名称', '单位', '清单数量', '设计数量1', '设计数量2', '单价', '合价', '图号', '备注'],
  38. width: [100, 70, 70, 300, 60, 80, 80, 80, 80, 80, 100, 100],
  39. hAlign: ['left', 'left', 'left', 'left','center', 'right', 'right', 'right', 'right', 'right', 'left', 'left'],
  40. };
  41. }
  42. async sortLedgerData(billsTree, pos) {
  43. const result = [];
  44. for (const node of billsTree.nodes) {
  45. result.push([node.code, node.b_code, '', node.name, node.unit,
  46. node.quantity, node.dgn_qty1, node.dgn_qty2, node.unit_price, node.total_price,
  47. node.drawing_code, node.memo
  48. ]);
  49. const posRange = pos.getLedgerPos(node.id);
  50. if (posRange && posRange.length > 0) {
  51. for (const [i, p] of posRange.entries()) {
  52. result.push([
  53. '', '', (i + 1) + '', p.name, '',
  54. p.quantity, null, null, null, null,
  55. p.drawing_code, p.memo
  56. ]);
  57. }
  58. }
  59. }
  60. return result;
  61. }
  62. async getLedgerMapData() {
  63. const billsData = await this.ctx.service.ledger.getData(this.ctx.tender.id);
  64. const billsTree = new LedgerTree.billsTree(this.ctx, {
  65. id: 'ledger_id',
  66. pid: 'ledger_pid',
  67. order: 'order',
  68. level: 'level',
  69. rootId: -1,
  70. keys: ['id', 'tender_id', 'ledger_id'],
  71. stageId: 'id',
  72. calcFields: ['deal_tp', 'total_price']
  73. });
  74. billsTree.loadDatas(billsData);
  75. billsTree.calculateAll();
  76. const posData = this.ctx.tender.data.measure_type === measureType.tz.value
  77. ? await this.ctx.service.pos.getPosData({tid: this.ctx.tender.id}) : [];
  78. const pos = new LedgerTree.pos({id: 'id', ledgerId: 'lid'});
  79. pos.loadDatas(posData);
  80. return this.sortLedgerData(billsTree, pos);
  81. }
  82. async export2File(fileName) {
  83. const ledgerData = await this.getLedgerMapData();
  84. this.export2Sheet(this.xlsxData, '台账分解', ledgerData);
  85. xlsx.writeFile(this.xlsxData, fileName);
  86. }
  87. }
  88. module.exports = {
  89. exportLedger2Excel
  90. };