template_controller.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. 'use strict';
  2. /**
  3. * 指标模板控制器
  4. *
  5. * @author Mai
  6. * @data 2018/4/19
  7. * @version
  8. */
  9. // excel解析
  10. const excel = require('node-xlsx');
  11. const sendToWormhole = require('stream-wormhole');
  12. const paramConst = require('../const/template_param');
  13. const nodeConst = require('../const/template_node');
  14. module.exports = app => {
  15. class TemplateController extends app.BaseController {
  16. /**
  17. * 指标模板页面
  18. *
  19. * @param {object} ctx - egg全局context
  20. * @return {void}
  21. */
  22. async index (ctx) {
  23. const id = ctx.queries.id ? ctx.queries.id[0] : 1;
  24. const node = await ctx.service.templateNode.getAllDataByCondition({template_id: 1});
  25. for (const n of node) {
  26. n.url = '/template?id=' + n.node_id;
  27. n.target = '_self';
  28. }
  29. const treeNode = ctx.helper.convertData(node, true, 'node_id', 'node_pid');
  30. const condition = {template_id: 1, node_id: id};
  31. const selectNode = await ctx.service.templateNode.getDataByCondition(condition);
  32. const selectIndex = await ctx.service.templateIndex.getAllDataByCondition({ where: condition });
  33. const globalParams = await ctx.service.templateParam.getAllDataByCondition({ where: {template_id: 1, node_id: 0}});
  34. const nodeParams = await ctx.service.templateParam.getAllDataByCondition({ where: condition});
  35. const renderData = {
  36. nodes: JSON.stringify(treeNode),
  37. selectNode: selectNode,
  38. selectIndex: selectIndex,
  39. globalParams: globalParams,
  40. nodeParams: nodeParams,
  41. paramConst: paramConst,
  42. nodeConst: nodeConst,
  43. }
  44. await this.layout('template/index.ejs', renderData, 'template/modal.ejs');
  45. }
  46. /**
  47. * 导出Excel数据
  48. * @param ctx
  49. * @returns {Promise<void>}
  50. */
  51. async uploadExcel(ctx) {
  52. let stream;
  53. try {
  54. stream = await ctx.getFileStream();
  55. const fileName = this.app.baseDir + '/app/public/template/uploads/' + stream.filename;
  56. // 保存文件
  57. await ctx.helper.saveStreamFile(stream, fileName);
  58. // 读取文件
  59. const sheet = excel.parse(fileName);
  60. if (!sheet || sheet.length === 0 || sheet[0] === undefined || sheet[0].data === undefined) {
  61. throw 'excel没有对应数据';
  62. }
  63. const result = await ctx.service.templateNode.importData(sheet);
  64. if (!result) {
  65. throw '导入数据失败';
  66. }
  67. ctx.redirect('/template');
  68. } catch (err) {
  69. console.log(err);
  70. // 失败需要消耗掉stream 以防卡死
  71. if (stream) {
  72. await sendToWormhole(stream);
  73. }
  74. //this.setMessage(err.toString(), this.messageType.ERROR);
  75. ctx.redirect('/template');
  76. }
  77. }
  78. /**
  79. * 指标节点,绑定匹配规则
  80. * @param ctx
  81. * @returns {Promise<void>}
  82. */
  83. async updateNodeMatch(ctx) {
  84. const data = JSON.parse(ctx.request.body.data);
  85. const condition = {
  86. template_id: 1,
  87. node_id: data.id
  88. };
  89. delete data.id;
  90. const responseData = {
  91. err: 0,
  92. msg: '',
  93. data,
  94. };
  95. try {
  96. responseData.data = await ctx.service.templateNode.updateNodeMatch(data, condition);
  97. } catch (err) {
  98. console.log(err);
  99. responseData.err = 1;
  100. responseData.msg = err.toString();
  101. responseData.data = await ctx.service.templateNode.getDataByCondition(condition);
  102. }
  103. if (responseData.data.match_type) {
  104. responseData.data.match_type_str = nodeConst.matchTypeStr[responseData.data.match_type];
  105. } else {
  106. responseData.data.match_type_str = '';
  107. }
  108. ctx.body = responseData;
  109. }
  110. /**
  111. * 设置指标计算规则
  112. * @param ctx
  113. * @returns {Promise<void>}
  114. */
  115. async setIndexRule(ctx) {
  116. const result = await ctx.service.templateIndex.setRule(JSON.parse(ctx.request.body.data));
  117. const responseData = result ? { err: 0, msg: '', data: [], } : { err: 1, msg: '提交数据失败', data: [], };
  118. ctx.body = responseData;
  119. }
  120. /**
  121. * 指标参数,绑定参数取值等
  122. * @param ctx
  123. * @returns {Promise<void>}
  124. */
  125. async updateParamMatch(ctx) {
  126. const data = JSON.parse(ctx.request.body.data);
  127. const condition = {
  128. template_id: 1,
  129. node_id: data.node_id,
  130. code: data.code,
  131. };
  132. delete data.node_id;
  133. delete data.code;
  134. const responseData = {
  135. err: 0,
  136. msg: '',
  137. data,
  138. };
  139. try {
  140. responseData.data = await ctx.service.templateParam.updateNodeMatch(data, condition);
  141. } catch (err) {
  142. console.log(err);
  143. responseData.err = 1;
  144. responseData.msg = err.toString();
  145. responseData.data = await ctx.service.templateParam.getDataByCondition(condition);
  146. }
  147. if (responseData.data.match_num) {
  148. responseData.data.match_num_str = paramConst.matchNumStr[responseData.data.match_num];
  149. } else {
  150. responseData.data.match_num_str = '';
  151. }
  152. ctx.body = responseData;
  153. }
  154. }
  155. return TemplateController;
  156. }