deal_bills_controller.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date 2018/5/7
  7. * @version
  8. */
  9. const fs = require('fs');
  10. const path = require('path');
  11. const excel = require('node-xlsx');
  12. const xlsx = require('js-xlsx');
  13. const sendToWormhole = require('stream-wormhole');
  14. const loadExcelType = {
  15. display: 1,
  16. actual: 2,
  17. };
  18. const loadType = loadExcelType.display;
  19. module.exports = app => {
  20. class DealBillsController extends app.BaseController {
  21. /**
  22. * 获取标段的签约清单数据
  23. * @param ctx
  24. * @return {Promise<void>}
  25. */
  26. async getData(ctx) {
  27. const responseData = {
  28. err: 0,
  29. msg: '',
  30. data: [],
  31. };
  32. try {
  33. responseData.data = await ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: ctx.tender.id } });
  34. } catch (error) {
  35. this.log(error);
  36. responseData.err = 1;
  37. responseData.msg = error.toString();
  38. }
  39. ctx.body = responseData;
  40. }
  41. /**
  42. * 导入Excel数据
  43. * @param ctx
  44. * @return {Promise<void>}
  45. */
  46. async loadExcel(ctx) {
  47. let stream;
  48. try {
  49. stream = await ctx.getFileStream();
  50. const create_time = Date.parse(new Date()) / 1000;
  51. const fileInfo = path.parse(stream.filename);
  52. const fileName = this.app.config.filePath + '/cache/deal_bills/uploads/' + 'deal_bills' + create_time + fileInfo.ext;
  53. // 保存文件
  54. await ctx.helper.saveStreamFile(stream, fileName);
  55. if (loadType === loadExcelType.display) {
  56. const wb = xlsx.readFile(fileName);
  57. const name = wb.SheetNames[0];
  58. const sheetData = {
  59. rows: xlsx.utils.sheet_to_json(wb.Sheets[name], {header: 1}),
  60. merge: wb.Sheets[name]["!merges"],
  61. };
  62. const result = await ctx.service.dealBills.importDataJsXlsx(sheetData, ctx.tender.id);
  63. if (!result) {
  64. throw '导入数据失败';
  65. }
  66. } else {
  67. // 读取文件
  68. const sheet = excel.parse(fileName);
  69. if (!sheet || sheet.length === 0 || sheet[0] === undefined || sheet[0].data === undefined) {
  70. throw 'excel没有对应数据';
  71. }
  72. const result = await ctx.service.dealBills.importData(sheet[0], ctx.tender.id);
  73. if (!result) {
  74. throw '导入数据失败';
  75. }
  76. }
  77. const dealBills = await this.ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: ctx.tender.id } });
  78. ctx.body = {err: 0, msg: '', data: dealBills};
  79. } catch (err) {
  80. this.log(err);
  81. // 失败需要消耗掉stream 以防卡死
  82. if (stream) {
  83. await sendToWormhole(stream);
  84. }
  85. ctx.body = {err: 1, msg: err.toString(), data: null};
  86. }
  87. }
  88. /**
  89. * 下载模板文件
  90. * @param ctx
  91. * @return {Promise<void>}
  92. */
  93. async download(ctx) {
  94. const file = ctx.params.file;
  95. if (file) {
  96. try {
  97. let fileName;
  98. if (file === '签约清单导入格式.xls') {
  99. fileName = this.app.baseDir + '/app/public/deal_bills/template.xls';
  100. } else {
  101. const create_time = Date.parse(new Date()) / 1000;
  102. fileName = this.app.baseDir + '/app/public/deal_bills/downloads/' + ctx.tender.id + '-' + create_time + '.xlsx';
  103. // todo 导出签约清单Excel
  104. }
  105. ctx.body = await fs.readFileSync(fileName);
  106. } catch (err) {
  107. this.log(err);
  108. }
  109. }
  110. }
  111. }
  112. return DealBillsController;
  113. };