lib_controller.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. 'use strict';
  2. /**
  3. * 指标库控制器
  4. *
  5. * @author Mai
  6. * @data 2018/4/19
  7. * @version
  8. */
  9. const fs = require('fs');
  10. const path = require('path');
  11. const awaitWriteStream = require('await-stream-ready').write;
  12. const sendToWormhole = require('stream-wormhole');
  13. const libConst = require('../const/lib');
  14. module.exports = app => {
  15. class LibController extends app.BaseController {
  16. /**
  17. * 指标库页面
  18. *
  19. * @param {object} ctx - egg全局context
  20. * @return {void}
  21. */
  22. async index (ctx) {
  23. let status = ctx.query.status;
  24. const libList = await ctx.service.quotaLib.getList(status);
  25. //获取指标源状态数量
  26. const libStatus = await ctx.service.quotaLib.getStatusNum();
  27. const renderData = {
  28. status,
  29. libList,
  30. libConst,
  31. libStatus
  32. };
  33. await this.layout('lib/index.ejs', renderData, 'lib/modal.ejs');
  34. }
  35. /**
  36. * 上传指标源
  37. *
  38. * @param {object} ctx - egg全局context
  39. * @return {void}
  40. */
  41. async upload(ctx) {
  42. const parts = ctx.multipart({ autoFields: true });
  43. let addData = {};
  44. let stream;
  45. while ((stream = await parts()) != null) {
  46. const filename = stream.filename.toLowerCase();
  47. if(filename === ''){
  48. throw '请上传文件';
  49. ctx.redirect('/lib');
  50. }
  51. const fileInfo = path.parse(filename);
  52. let create_time = Date.parse( new Date())/1000;
  53. if(!fs.existsSync(libConst.quotaLibDir)) {
  54. fs.mkdirSync(libConst.quotaLibDir);
  55. }
  56. let filepath = libConst.quotaLibDir + create_time + fileInfo.ext;
  57. addData = {
  58. name: fileInfo.name,
  59. path: filepath,
  60. create_time: create_time
  61. };
  62. const target = path.join(filepath);
  63. const writeStream = fs.createWriteStream(target);
  64. try {
  65. await awaitWriteStream(stream.pipe(writeStream));
  66. } catch (err) {
  67. await sendToWormhole(stream);
  68. throw err;
  69. }
  70. }
  71. if(addData !== {}){
  72. let fileStram = fs.readFileSync(addData.path, 'utf8');
  73. try {
  74. const fileResult = JSON.parse(fileStram);
  75. //插入数据到数据库
  76. const result = await ctx.service.quotaLib.batchAdd(addData,fileResult);
  77. // const result = await ctx.service.quotaLib.add(addData);
  78. if (!result) {
  79. //插入失败则删除文件;
  80. fs.unlinkSync(addData.path);
  81. throw '新增指标源数据失败';
  82. }
  83. ctx.redirect('/lib');
  84. } catch (err) {
  85. //插入失败则删除文件;
  86. fs.unlinkSync(addData.path);
  87. throw err;
  88. }
  89. }else{
  90. throw '请上传文件';
  91. }
  92. }
  93. /**
  94. * 指标源全局参数页面
  95. *
  96. * @param {object} ctx - egg全局context
  97. * @return {void}
  98. */
  99. async global (ctx) {
  100. let lid = ctx.params.id;
  101. lid = parseInt(lid);
  102. try{
  103. if(isNaN(lid) || lid < 0){
  104. throw '参数有误';
  105. }
  106. //获取指标源数据
  107. const libInfo = await ctx.service.quotaLib.getLibDataById(lid);
  108. //获取全局指标参数
  109. const condition = {
  110. where: {
  111. lib_id: lid,
  112. node_id: 0,
  113. }
  114. }
  115. const globalParams = await ctx.service.tenderParam.getAllDataByCondition(condition);
  116. const renderData = {
  117. libInfo,
  118. libConst,
  119. globalParams,
  120. };
  121. await this.layout('lib/global.ejs', renderData);
  122. } catch (error) {
  123. console.log(error);
  124. ctx.redirect('/lib');
  125. }
  126. }
  127. /**
  128. * 指标源详细页面
  129. *
  130. * @param {object} ctx - egg全局context
  131. * @return {void}
  132. */
  133. async detail (ctx) {
  134. let lid = ctx.params.id;
  135. lid = parseInt(lid);
  136. try{
  137. if(isNaN(lid) || lid < 0){
  138. throw '参数有误';
  139. }
  140. //获取指标源数据
  141. const libInfo = await ctx.service.quotaLib.getLibDataById(lid);
  142. const billsData = await ctx.service.bills.getDataByLibId(lid);
  143. // if(libInfo.status === libConst.status.enter){
  144. // throw '指标源已入库';
  145. // }
  146. //获取项目节编号
  147. // const billsList = await ctx.service.bills.getListById(lid);
  148. const renderData = {
  149. libInfo,
  150. libConst,
  151. billsData: JSON.stringify(billsData),
  152. };
  153. await this.layout('lib/detail.ejs', renderData, 'lib/detail-modal.ejs');
  154. } catch (error) {
  155. console.log(error);
  156. ctx.redirect('/lib');
  157. }
  158. }
  159. async getChildren(ctx) {
  160. const responseData = {
  161. err: 0,
  162. msg: '',
  163. data: [],
  164. };
  165. try {
  166. const data = JSON.parse(ctx.request.body.data);
  167. const libId = data.lib_id;
  168. if (!libId) {
  169. throw '当前未打开指标源';
  170. }
  171. const id = data.n_id;
  172. if (isNaN(id) || id <= 0) {
  173. throw '参数错误';
  174. }
  175. responseData.data = await ctx.service.bills.getChildrenByParentId(libId, id);
  176. } catch (err) {
  177. responseData.err = 1;
  178. responseData.msg = err.toString();
  179. }
  180. ctx.body = responseData;
  181. }
  182. /**
  183. * 删除指标源
  184. *
  185. * @param {Object} ctx -egg全局变量
  186. * @return {void}
  187. */
  188. async delete(ctx) {
  189. let id = ctx.request.body.del_lib_id;
  190. let text = ctx.request.body.del_lib_text;
  191. id = parseInt(id);
  192. try {
  193. if (isNaN(id) || id <= 0) {
  194. throw '参数错误';
  195. }
  196. if(text === undefined || text !== '确认删除'){
  197. throw '参数错误';
  198. }
  199. //获取指标源数据
  200. const libInfo = await ctx.service.quotaLib.getLibDataById(id);
  201. if(!libInfo){
  202. throw '不存在该标段';
  203. }
  204. //删清指标源和清单数据
  205. const result = ctx.service.quotaLib.deleteLibById(id);
  206. if (!result) {
  207. throw '删除标段失败';
  208. }
  209. fs.unlinkSync(libInfo.filepath);
  210. ctx.redirect('/lib');
  211. } catch (error) {
  212. console.log(error);
  213. ctx.redirect(ctx.request.headers.referer);
  214. }
  215. }
  216. /**
  217. * 指标源入库
  218. *
  219. * @param {Object} ctx -egg全局变量
  220. * @return {void}
  221. */
  222. async enter(ctx) {
  223. let id = ctx.request.body.enter_lib_id;
  224. id = parseInt(id);
  225. try {
  226. if (isNaN(id) || id <= 0) {
  227. throw '参数错误';
  228. }
  229. const result = ctx.service.quotaLib.enterLibById(id);
  230. if (!result) {
  231. throw '指标入库失败';
  232. }
  233. ctx.redirect('/lib');
  234. } catch (error) {
  235. console.log(error);
  236. ctx.redirect(ctx.request.headers.referer);
  237. }
  238. }
  239. }
  240. return LibController;
  241. }