lib_controller.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  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. const paramConst = require('../const/template_param');
  15. module.exports = app => {
  16. class LibController extends app.BaseController {
  17. /**
  18. * 指标库页面
  19. *
  20. * @param {object} ctx - egg全局context
  21. * @return {void}
  22. */
  23. async index (ctx) {
  24. let status = ctx.query.status;
  25. const libList = await ctx.service.quotaLib.getList(status);
  26. //获取指标源状态数量
  27. const libStatus = await ctx.service.quotaLib.getStatusNum();
  28. const renderData = {
  29. status,
  30. libList,
  31. libConst,
  32. libStatus
  33. };
  34. await this.layout('lib/index.ejs', renderData, 'lib/modal.ejs');
  35. }
  36. /**
  37. * 上传指标源
  38. *
  39. * @param {object} ctx - egg全局context
  40. * @return {void}
  41. */
  42. async upload(ctx) {
  43. const parts = ctx.multipart({ autoFields: true });
  44. let addData = {};
  45. let stream;
  46. while ((stream = await parts()) != null) {
  47. const filename = stream.filename.toLowerCase();
  48. if(filename === ''){
  49. throw '请上传文件';
  50. ctx.redirect('/lib');
  51. }
  52. const fileInfo = path.parse(filename);
  53. let create_time = Date.parse( new Date())/1000;
  54. if(!fs.existsSync(libConst.quotaLibDir)) {
  55. fs.mkdirSync(libConst.quotaLibDir);
  56. }
  57. let filepath = libConst.quotaLibDir + create_time + fileInfo.ext;
  58. addData = {
  59. name: fileInfo.name,
  60. path: filepath,
  61. create_time: create_time
  62. };
  63. const target = path.join(filepath);
  64. const writeStream = fs.createWriteStream(target);
  65. try {
  66. await awaitWriteStream(stream.pipe(writeStream));
  67. } catch (err) {
  68. await sendToWormhole(stream);
  69. throw err;
  70. }
  71. }
  72. if(addData !== {}){
  73. let fileStram = fs.readFileSync(addData.path, 'utf8');
  74. try {
  75. const fileResult = JSON.parse(fileStram);
  76. //插入数据到数据库
  77. const result = await ctx.service.quotaLib.batchAdd(addData,fileResult);
  78. // const result = await ctx.service.quotaLib.add(addData);
  79. if (!result) {
  80. //插入失败则删除文件;
  81. fs.unlinkSync(addData.path);
  82. throw '新增指标源数据失败';
  83. }
  84. ctx.redirect('/lib');
  85. } catch (err) {
  86. //插入失败则删除文件;
  87. fs.unlinkSync(addData.path);
  88. throw err;
  89. }
  90. }else{
  91. throw '请上传文件';
  92. }
  93. }
  94. /**
  95. * 指标源全局参数页面
  96. *
  97. * @param {object} ctx - egg全局context
  98. * @return {void}
  99. */
  100. async global (ctx) {
  101. let lid = ctx.params.id;
  102. lid = parseInt(lid);
  103. try{
  104. if(isNaN(lid) || lid < 0){
  105. throw '参数有误';
  106. }
  107. //获取指标源数据
  108. const libInfo = await ctx.service.quotaLib.getLibDataById(lid);
  109. //获取全局指标参数
  110. const condition = {
  111. where: {
  112. lib_id: lid,
  113. node_id: 0,
  114. }
  115. }
  116. const globalParams = await ctx.service.tenderParam.getAllDataByCondition(condition);
  117. const renderData = {
  118. libInfo,
  119. libConst,
  120. globalParams,
  121. paramConst,
  122. };
  123. await this.layout('lib/global.ejs', renderData);
  124. } catch (error) {
  125. console.log(error);
  126. ctx.redirect('/lib');
  127. }
  128. }
  129. /**
  130. * 指标源详细页面
  131. *
  132. * @param {object} ctx - egg全局context
  133. * @return {void}
  134. */
  135. async detail (ctx) {
  136. let lid = ctx.params.id;
  137. lid = parseInt(lid);
  138. try{
  139. if(isNaN(lid) || lid < 0){
  140. throw '参数有误';
  141. }
  142. //获取指标源数据
  143. const libInfo = await ctx.service.quotaLib.getLibDataById(lid);
  144. const billsData = await ctx.service.bills.getDataByLibId(lid);
  145. // if(libInfo.status === libConst.status.enter){
  146. // throw '指标源已入库';
  147. // }
  148. //获取项目节编号
  149. // const billsList = await ctx.service.bills.getListById(lid);
  150. const renderData = {
  151. libInfo,
  152. libConst,
  153. billsData: JSON.stringify(billsData),
  154. };
  155. await this.layout('lib/detail.ejs', renderData, 'lib/detail-modal.ejs');
  156. } catch (error) {
  157. console.log(error);
  158. ctx.redirect('/lib');
  159. }
  160. }
  161. async getChildren(ctx) {
  162. const responseData = {
  163. err: 0,
  164. msg: '',
  165. data: [],
  166. };
  167. try {
  168. const data = JSON.parse(ctx.request.body.data);
  169. const libId = data.lib_id;
  170. if (!libId) {
  171. throw '当前未打开指标源';
  172. }
  173. const id = data.n_id;
  174. if (isNaN(id) || id <= 0) {
  175. throw '参数错误';
  176. }
  177. responseData.data = await ctx.service.bills.getChildrenByParentId(libId, id);
  178. } catch (err) {
  179. responseData.err = 1;
  180. responseData.msg = err.toString();
  181. }
  182. ctx.body = responseData;
  183. }
  184. /**
  185. * 删除指标源
  186. *
  187. * @param {Object} ctx -egg全局变量
  188. * @return {void}
  189. */
  190. async delete(ctx) {
  191. let id = ctx.request.body.del_lib_id;
  192. let text = ctx.request.body.del_lib_text;
  193. id = parseInt(id);
  194. try {
  195. if (isNaN(id) || id <= 0) {
  196. throw '参数错误';
  197. }
  198. if(text === undefined || text.trim() !== '确认删除'){
  199. throw '参数错误';
  200. }
  201. //获取指标源数据
  202. const libInfo = await ctx.service.quotaLib.getLibDataById(id);
  203. if(!libInfo){
  204. throw '不存在该标段';
  205. }
  206. //删清指标源和清单数据
  207. const result = ctx.service.quotaLib.deleteLibById(id);
  208. if (!result) {
  209. throw '删除标段失败';
  210. }
  211. if(fs.existsSync(libInfo.filepath)) {
  212. fs.unlinkSync(libInfo.filepath);
  213. }
  214. ctx.redirect('/lib');
  215. } catch (error) {
  216. console.log(error);
  217. ctx.redirect(ctx.request.headers.referer);
  218. }
  219. }
  220. /**
  221. * 指标源入库
  222. *
  223. * @param {Object} ctx -egg全局变量
  224. * @return {void}
  225. */
  226. async enter(ctx) {
  227. let id = ctx.request.body.enter_lib_id;
  228. id = parseInt(id);
  229. try {
  230. if (isNaN(id) || id <= 0) {
  231. throw '参数错误';
  232. }
  233. const result = ctx.service.quotaLib.enterLibById(id);
  234. if (!result) {
  235. throw '指标入库失败';
  236. }
  237. ctx.redirect('/lib');
  238. } catch (error) {
  239. console.log(error);
  240. ctx.redirect(ctx.request.headers.referer);
  241. }
  242. }
  243. async updateParamValue (ctx) {
  244. const responseData = {
  245. err: 0,
  246. msg: '',
  247. data: {},
  248. };
  249. const data = JSON.parse(ctx.request.body.data);
  250. try {
  251. if (!data.updateType) {
  252. throw '参数修改提交类型未知';
  253. }
  254. if ((data.lib_id === undefined) || (data.node_id === undefined) || (data.code === undefined)) {
  255. throw '提交信息错误';
  256. }
  257. let result;
  258. if (data.updateType === 'reset') {
  259. result = await ctx.service.tenderParam.resetCalcValue(data);
  260. } else if (data.updateType === 'modify') {
  261. result = await ctx.service.tenderParam.updateCalcValue(data);
  262. }
  263. if (!result) {
  264. throw '提交数据失败';
  265. }
  266. } catch (err) {
  267. console.log(err);
  268. responseData.err = 1;
  269. responseData.msg = err.toString();
  270. }
  271. responseData.data.param = await ctx.service.tenderParam.getDataByCondition({
  272. lib_id: data.lib_id, node_id: data.node_id, code: data.code,
  273. });
  274. if (data.node_id !== 0) {
  275. responseData.data.indexes = await ctx.service.tenderIndex.getAllDataByCondition({
  276. where: {lib_id: data.lib_id, node_id: data.node_id,}
  277. });
  278. }
  279. ctx.body = responseData;
  280. }
  281. /**
  282. * 获取指标和参数信息
  283. *
  284. * @param {Object} ctx -egg全局变量
  285. * @return {void}
  286. */
  287. async getParamAndIndex(ctx) {
  288. const responseData = {
  289. err: 0,
  290. msg: '',
  291. data: {},
  292. };
  293. const data = JSON.parse(ctx.request.body.data);
  294. try {
  295. if (data.lib_id === undefined || data.node_id === undefined || data.bills_id === undefined) {
  296. throw '提交信息错误';
  297. }
  298. //取指标编号列表
  299. responseData.data.indexList = await ctx.service.tenderIndex.getAllDataByCondition({
  300. where: {lib_id: data.lib_id, node_id: data.node_id}
  301. });
  302. responseData.data.paramList = await ctx.service.tenderParam.getAllDataByCondition({
  303. where: {lib_id: data.lib_id, node_id: data.node_id}
  304. });
  305. } catch (err) {
  306. console.log(err);
  307. responseData.err = 1;
  308. responseData.msg = err.toString();
  309. }
  310. ctx.body = responseData;
  311. }
  312. }
  313. return LibController;
  314. }