template_controller.js 6.2 KB

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