deal_bills_controller.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. ctx.body = {err: 1, msg: err.toString(), data: null};
  67. }
  68. }
  69. /**
  70. * 下载模板文件
  71. * @param ctx
  72. * @return {Promise<void>}
  73. */
  74. async download(ctx) {
  75. const file = ctx.params.file;
  76. if (file) {
  77. try {
  78. let fileName;
  79. if (file === 'template.xls') {
  80. fileName = this.app.baseDir + '/app/public/deal_bills/deal_template.xls';
  81. } else {
  82. const create_time = Date.parse(new Date()) / 1000;
  83. fileName = this.app.baseDir + '/app/public/deal_bills/downloads/' + ctx.tender.id + '-' + create_time + '.xlsx';
  84. // todo 导出签约清单Excel
  85. }
  86. ctx.body = await fs.readFileSync(fileName);
  87. } catch (err) {
  88. this.log(err);
  89. }
  90. }
  91. }
  92. }
  93. return DealBillsController;
  94. };