tender_controller.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  1. 'use strict';
  2. /**
  3. * 标段管理控制器
  4. *
  5. * @author CaiAoLin
  6. * @date 2018/2/5
  7. * @version
  8. */
  9. const tenderConst = require('../const/tender');
  10. const codeRuleConst = require('../const/code_rule');
  11. const settingConst = require('../const/setting.js');
  12. const tenderMenu = require('../../config/menu').tenderMenu;
  13. const auditConst = require('../const/audit');
  14. const accountPermission = require('../const/account_permission');
  15. module.exports = app => {
  16. class TenderController extends app.BaseController {
  17. /**
  18. * 构造函数
  19. *
  20. * @param {Object} ctx - egg全局变量
  21. * @return {void}
  22. */
  23. constructor(ctx) {
  24. super(ctx);
  25. ctx.showProject = true;
  26. ctx.showTitle = true;
  27. }
  28. async _list(view, setting, modal = '') {
  29. try {
  30. const tenderList = await this.ctx.service.tender.getList();
  31. for (const t of tenderList) {
  32. t.lastStage = await this.ctx.service.stage.getLastestStage(t.id, true);
  33. t.completeStage = await this.ctx.service.stage.getLastestCompleteStage(t.id);
  34. }
  35. const categoryData = await this.ctx.service.category.getAllCategory(this.ctx.session.sessionProject.id);
  36. const renderData = {
  37. tenderList,
  38. tenderConst,
  39. settingConst,
  40. categoryData,
  41. tableColSetting: setting,
  42. measureType: tenderConst.measureType,
  43. jsFiles: this.app.jsFiles.common.concat(this.jsFiles),
  44. auditConst,
  45. userPermission: this.ctx.session.sessionUser.permission !== '' ? JSON.parse(this.ctx.session.sessionUser.permission) : null,
  46. };
  47. await this.layout(view, renderData, modal);
  48. } catch (err) {
  49. this.log(err);
  50. this.ctx.redirect('/dashboard');
  51. }
  52. }
  53. /**
  54. * 标段概况(Get)
  55. *
  56. * @param {object} ctx - egg全局变量
  57. * @return {void}
  58. */
  59. async listInfo(ctx) {
  60. this.jsFiles = this.app.jsFiles.tender.list;
  61. await this._list('tender/index.ejs', tenderConst.infoTableCol, 'tender/modal.ejs');
  62. }
  63. /**
  64. * 计量进度(Get)
  65. *
  66. * @param ctx
  67. * @return {Promise<void>}
  68. */
  69. async listProgress(ctx) {
  70. this.jsFiles = this.app.jsFiles.tender.progress;
  71. await this._list('tender/progress.ejs', tenderConst.progressTableCol, 'tender/modal.ejs');
  72. }
  73. /**
  74. * 标段管理(Get)
  75. *
  76. * @param ctx
  77. * @return {Promise<void>}
  78. */
  79. async listManage(ctx) {
  80. this.jsFiles = this.app.jsFiles.tender.manage;
  81. await this._list('tender/manage.ejs', tenderConst.manageTableCol, 'tender/manage_modal.ejs');
  82. }
  83. /**
  84. * 新增标段(Ajax)
  85. *
  86. * @param ctx
  87. * @return {Promise<void>}
  88. */
  89. async addTender(ctx) {
  90. try {
  91. const responseData = {
  92. err: 0, msg: '', data: null,
  93. };
  94. const userPermission = ctx.session.sessionUser.permission !== '' ? JSON.parse(ctx.session.sessionUser.permission) : null;
  95. if (userPermission === null || userPermission.tender === undefined || userPermission.tender.indexOf('1') === -1) {
  96. throw '当前用户没有创建标段的权限';
  97. }
  98. const data = JSON.parse(ctx.request.body.data);
  99. if (!data.name || data.name === '') {
  100. throw '标段信息不完整';
  101. }
  102. responseData.data = await ctx.service.tender.add(data);
  103. ctx.body = responseData;
  104. } catch (error) {
  105. this.log(error);
  106. ctx.body = { err: 1, msg: error.toString(), data: null };
  107. }
  108. }
  109. /**
  110. * 编辑标段(Ajax)
  111. *
  112. * @param ctx
  113. * @return {Promise<void>}
  114. */
  115. async updateTender(ctx) {
  116. try {
  117. const responseData = {
  118. err: 0, msg: '', data: null,
  119. };
  120. const data = JSON.parse(ctx.request.body.data);
  121. if (!data.id) {
  122. throw '提交信息错误';
  123. }
  124. if (!data.name || data.name === '') {
  125. throw '标段信息不完整';
  126. }
  127. if (await ctx.service.tender.save(data, data.id)) {
  128. responseData.data = await ctx.service.tender.getTender(data.id);
  129. }
  130. ctx.body = responseData;
  131. } catch (error) {
  132. this.log(error);
  133. ctx.body = { err: 1, msg: error.toString(), data: null };
  134. }
  135. }
  136. /**
  137. * 删除标段(Ajax)
  138. *
  139. * @param ctx
  140. * @return {Promise<void>}
  141. */
  142. async deleteTender(ctx) {
  143. try {
  144. const data = JSON.parse(ctx.request.body.data), result = [];
  145. if (!(data instanceof Array) && (data.length === 0)) {
  146. throw '提交数据有误';
  147. }
  148. for (const id of data) {
  149. if (await ctx.service.tender.deleteTenderNoBackup(id)) {
  150. result.push(id);
  151. }
  152. }
  153. ctx.body = {err: 0, msg: '', data: result};
  154. } catch (err) {
  155. ctx.body = {err: 1, msg: err.toString(), data: []}
  156. }
  157. }
  158. /**
  159. * 标段概况(Get)
  160. *
  161. * @param ctx
  162. * @return {Promise<void>}
  163. */
  164. async tenderInfo(ctx) {
  165. try {
  166. const lastStage = await ctx.service.stage.getLastestStage(ctx.tender.id);
  167. const renderData = {
  168. tender: ctx.tender.data,
  169. tenderInfo: ctx.tender.info,
  170. tenderMenu: this.menu.tenderMenu,
  171. preUrl: '/tender/' + ctx.tender.id,
  172. cooperation: ctx.session.sessionUser.cooperation,
  173. lastStage,
  174. audit: auditConst,
  175. };
  176. await this.layout('tender/detail.ejs', renderData);
  177. } catch (error) {
  178. this.log(error);
  179. this.ctx.redirect('/list');
  180. }
  181. }
  182. /**
  183. * 保存标段属性等(Ajax)
  184. *
  185. * @param ctx
  186. * @return {Promise<void>}
  187. */
  188. async saveTenderInfo(ctx) {
  189. try {
  190. const data = JSON.parse(ctx.request.body.data);
  191. if (!data) {
  192. throw '提交数据错误';
  193. }
  194. await ctx.service.tenderInfo.saveTenderInfo(ctx.tender.id, data);
  195. ctx.body = { err: 0, msg: '', data: JSON.parse(ctx.request.body.data) };
  196. } catch (err) {
  197. this.log(err);
  198. ctx.body = { err: 1, msg: err.toString(), data: null };
  199. }
  200. }
  201. /**
  202. * 设置标段计量类型并调整到标段概况(Get)
  203. *
  204. * @param ctx
  205. * @return {Promise<void>}
  206. */
  207. async tenderType(ctx) {
  208. try {
  209. const tenderId = ctx.params.id,
  210. type = ctx.query.type;
  211. if (!tenderId) {
  212. throw '当前未打开标段';
  213. }
  214. const tender = await ctx.service.tender.getTender(tenderId);
  215. if (!tender) {
  216. throw '标段数据错误';
  217. }
  218. if (!tender.measure_type) {
  219. await ctx.service.tender.update({ measure_type: type }, { id: tender.id });
  220. }
  221. ctx.redirect('/tender/' + tenderId);
  222. } catch (error) {
  223. this.log(error);
  224. ctx.redirect('/list');
  225. }
  226. }
  227. /**
  228. * 标段协作办公
  229. *
  230. * @param {Object} ctx - egg全局变量
  231. * @return {void}
  232. */
  233. async tenderCooperation(ctx) {
  234. const tenderId = ctx.params.id;
  235. try {
  236. if (!ctx.session.sessionUser.cooperation) {
  237. throw '权限不足';
  238. }
  239. const tender = await ctx.service.tender.getDataById(tenderId);
  240. const user = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
  241. // 获取已参与协作用户列表
  242. const cooperationArray = [];
  243. if (tender.cooperation !== null && tender.cooperation !== '') {
  244. const cooperationList = JSON.parse(tender.cooperation);
  245. for (const cl in cooperationList) {
  246. const clArray = [];
  247. for (const audit of cooperationList[cl]) {
  248. const userInfo = await ctx.service.projectAccount.getDataById(audit);
  249. clArray.push(userInfo);
  250. }
  251. cooperationArray[cl] = clArray;
  252. }
  253. }
  254. const renderData = {
  255. user,
  256. tender,
  257. tenderMenu: this.menu.tenderMenu,
  258. preUrl: '/tender/' + tenderId,
  259. tenderPermissionList: accountPermission.tenderPermissionList,
  260. cooperationArray,
  261. };
  262. await this.layout('tender/cooperation.ejs', renderData, 'tender/cooperationModal.ejs');
  263. } catch (error) {
  264. this.log(error);
  265. this.ctx.redirect('/tender/' + tenderId);
  266. }
  267. }
  268. /**
  269. * 添加标段操作
  270. *
  271. * @param {Object} ctx - egg全局变量
  272. * @return {void}
  273. */
  274. async add(ctx) {
  275. try {
  276. const rule = ctx.service.tender.rule('add');
  277. ctx.helper.validate(rule);
  278. const result = ctx.service.tender.add(ctx.request.body);
  279. if (!result) {
  280. throw '新增标段失败';
  281. }
  282. } catch (error) {
  283. this.log(error);
  284. this.setMessage(error.toString(), this.messageType.ERROR);
  285. }
  286. ctx.redirect(ctx.request.header.referer);
  287. }
  288. /**
  289. * 切换标段 --》 暂时废弃,不存在此功能
  290. *
  291. * @param {Object} ctx - egg全局变量
  292. * @return {void}
  293. */
  294. async switchTender(ctx) {
  295. let tenderId = ctx.params.tenderId;
  296. tenderId = parseInt(tenderId);
  297. try {
  298. if (isNaN(tenderId) || tenderId <= 0) {
  299. throw '参数错误';
  300. }
  301. const result = await ctx.service.tender.switchTender(tenderId);
  302. if (!result) {
  303. throw '切换标段失败!';
  304. }
  305. } catch (error) {
  306. this.setMessage(error.toString(), this.messageType.ERROR);
  307. }
  308. ctx.redirect(ctx.request.header.referer);
  309. }
  310. /**
  311. * 保存标段操作
  312. *
  313. * @param {Object} ctx - egg全局变量
  314. * @return {void}
  315. */
  316. async save(ctx) {
  317. let id = ctx.request.body.tenderId;
  318. id = parseInt(id);
  319. try {
  320. if (isNaN(id) || id < 0) {
  321. throw '参数错误';
  322. }
  323. // 获取数据规则
  324. const rule = ctx.service.tender.rule('save');
  325. ctx.validate(rule);
  326. const result = await ctx.service.tender.save(ctx.request.body, id);
  327. if (!result) {
  328. throw '保存标段数据失败';
  329. }
  330. this.setMessage('保存标段数据成功', this.messageType.SUCCESS);
  331. } catch (error) {
  332. this.setMessage(error.toString(), this.messageType.ERROR);
  333. }
  334. ctx.redirect(ctx.request.header.referer);
  335. }
  336. /**
  337. * 删除标段
  338. *
  339. * @param {Object} ctx -egg全局变量
  340. * @return {void}
  341. */
  342. async delete(ctx) {
  343. let id = ctx.request.body.tenderId;
  344. id = parseInt(id);
  345. try {
  346. if (isNaN(id) || id <= 0) {
  347. throw '参数错误';
  348. }
  349. const result = ctx.service.tender.deleteTenderById(id);
  350. if (!result) {
  351. throw '删除标段失败';
  352. }
  353. this.setMessage('删除标段成功', this.messageType.SUCCESS);
  354. } catch (error) {
  355. this.setMessage(error.toString(), this.messageType.ERROR);
  356. }
  357. ctx.redirect(ctx.request.header.referer);
  358. }
  359. async rule(ctx) {
  360. const responseData = {
  361. err: 0,
  362. msg: '',
  363. data: {},
  364. };
  365. try {
  366. const tenderId = ctx.session.sessionUser.tenderId;
  367. if (!tenderId) {
  368. throw '当前未打开标段';
  369. }
  370. const data = JSON.parse(ctx.request.body.data);
  371. if (!data.rule || !data.connector || !codeRuleConst.ruleField[data.rule]) {
  372. throw '参数错误';
  373. }
  374. const updateData = {
  375. id: tenderId,
  376. };
  377. updateData[codeRuleConst.ruleField[data.rule]] = data.data;
  378. updateData.c_connector = data.connector;
  379. updateData.c_rule_first = 0;
  380. const result = await ctx.service.tender.db.update(ctx.service.tender.tableName, updateData);
  381. if (result.affectedRows !== 1) {
  382. throw '更新规则失败';
  383. }
  384. } catch (err) {
  385. this.log(err);
  386. responseData.err = 1;
  387. responseData.msg = err.toString();
  388. }
  389. ctx.body = responseData;
  390. }
  391. async ruleFirst(ctx) {
  392. const responseData = {
  393. err: 0,
  394. msg: '',
  395. data: {},
  396. };
  397. try {
  398. const tenderId = ctx.session.sessionUser.tenderId;
  399. if (!tenderId) {
  400. throw '当前未打开标段';
  401. }
  402. const updateData = {
  403. id: tenderId,
  404. };
  405. updateData.c_rule_first = 0;
  406. const result = await ctx.service.tender.db.update(ctx.service.tender.tableName, updateData);
  407. if (result.affectedRows !== 1) {
  408. throw '更新规则失败';
  409. }
  410. } catch (err) {
  411. this.log(err);
  412. responseData.err = 1;
  413. responseData.msg = err.toString();
  414. }
  415. ctx.body = responseData;
  416. }
  417. }
  418. return TenderController;
  419. };