deal_bills_controller.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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 sendToWormhole = require('stream-wormhole');
  13. module.exports = app => {
  14. class DealBillsController extends app.BaseController {
  15. /**
  16. * 获取标段的签约清单数据
  17. * @param ctx
  18. * @return {Promise<void>}
  19. */
  20. async getData(ctx) {
  21. const responseData = {
  22. err: 0,
  23. msg: '',
  24. data: [],
  25. };
  26. try {
  27. responseData.data = await ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: ctx.tender.id } });
  28. } catch (error) {
  29. this.log(error);
  30. responseData.err = 1;
  31. responseData.msg = error.toString();
  32. }
  33. ctx.body = responseData;
  34. }
  35. /**
  36. * 导入Excel数据
  37. * @param ctx
  38. * @return {Promise<void>}
  39. */
  40. async loadExcel(ctx) {
  41. let stream;
  42. try {
  43. stream = await ctx.getFileStream();
  44. const create_time = Date.parse(new Date()) / 1000;
  45. const fileInfo = path.parse(stream.filename);
  46. const fileName = this.app.baseDir + '/app/public/deal_bills/uploads/' + 'deal_bills' + create_time + fileInfo.ext;
  47. // 保存文件
  48. await ctx.helper.saveStreamFile(stream, fileName);
  49. // 读取文件
  50. const sheet = excel.parse(fileName);
  51. if (!sheet || sheet.length === 0 || sheet[0] === undefined || sheet[0].data === undefined) {
  52. throw 'excel没有对应数据';
  53. }
  54. const result = await ctx.service.dealBills.importData(sheet[0], ctx.tender.id);
  55. if (!result) {
  56. throw '导入数据失败';
  57. }
  58. const dealBills = await this.ctx.service.dealBills.getAllDataByCondition({ where: { tender_id: ctx.tender.id } });
  59. ctx.body = {err: 0, msg: '', data: dealBills};
  60. } catch (err) {
  61. this.log(err);
  62. // 失败需要消耗掉stream 以防卡死
  63. if (stream) {
  64. await sendToWormhole(stream);
  65. }
  66. this.setMessage(err.toString(), this.messageType.ERROR);
  67. if (err.stack) {
  68. ctx.body = {err: 1, msg: '导入的Excel的数据类型有误', data: null};
  69. } else {
  70. ctx.body = {err: 1, msg: err.toString(), data: null};
  71. }
  72. }
  73. }
  74. /**
  75. * 下载模板文件
  76. * @param ctx
  77. * @return {Promise<void>}
  78. */
  79. async download(ctx) {
  80. const file = ctx.params.file;
  81. if (file) {
  82. try {
  83. let fileName;
  84. if (file === 'template.xls') {
  85. fileName = this.app.baseDir + '/app/public/deal_bills/deal_template.xls';
  86. } else {
  87. const create_time = Date.parse(new Date()) / 1000;
  88. fileName = this.app.baseDir + '/app/public/deal_bills/downloads/' + ctx.tender.id + '-' + create_time + '.xlsx';
  89. // todo 导出签约清单Excel
  90. }
  91. ctx.body = await fs.readFileSync(fileName);
  92. } catch (err) {
  93. this.log(err);
  94. }
  95. }
  96. }
  97. }
  98. return DealBillsController;
  99. };