deal_bills_controller.js 3.9 KB

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