payment_controller.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. 'use strict';
  2. const accountGroup = require('../const/account_group').group;
  3. const JV = require('../reports/rpt_component/jpc_value_define');
  4. const shenpiConst = require('../const/shenpi');
  5. module.exports = app => {
  6. class PaymentController extends app.BaseController {
  7. /**
  8. * 构造函数
  9. *
  10. * @param {Object} ctx - egg全局变量
  11. * @return {void}
  12. */
  13. constructor(ctx) {
  14. super(ctx);
  15. ctx.showProject = true;
  16. // ctx.showTitle = true;
  17. }
  18. /**
  19. * 支付审批列表页
  20. *
  21. * @param {Object} ctx - egg全局页面
  22. * @return {void}
  23. */
  24. async index(ctx) {
  25. try {
  26. const auditPermission = await this.ctx.service.paymentPermissionAudit.getOnePermission(ctx.session.sessionUser.is_admin, ctx.session.sessionUser.accountId);
  27. if (!auditPermission) {
  28. throw '权限不足';
  29. }
  30. // 列表读取及目录读取
  31. const renderData = {
  32. auditPermission,
  33. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.payment.index),
  34. };
  35. if (ctx.session.sessionUser.is_admin) {
  36. const projectId = ctx.session.sessionProject.id;
  37. const permissionAudits = await ctx.service.paymentPermissionAudit.getList(projectId);
  38. // 获取所有项目参与者
  39. const accountList = await ctx.service.projectAccount.getAllDataByCondition({
  40. where: { project_id: ctx.session.sessionProject.id, enable: 1 },
  41. columns: ['id', 'name', 'company', 'role', 'enable', 'is_admin', 'account_group', 'mobile'],
  42. });
  43. const accountGroupList = accountGroup.map((item, idx) => {
  44. const groupList = accountList.filter(item => item.account_group === idx);
  45. return { groupName: item, groupList };
  46. });
  47. renderData.permissionAudits = permissionAudits;
  48. renderData.accountList = accountList;
  49. renderData.accountGroup = accountGroupList;
  50. }
  51. await this.layout('payment/index.ejs', renderData, 'payment/modal.ejs');
  52. } catch (err) {
  53. console.log(err);
  54. this.log(err);
  55. ctx.redirect(this.menu.menu.dashboard.url);
  56. }
  57. }
  58. async listLoad(ctx) {
  59. const responseData = {
  60. err: 0, msg: '', data: {},
  61. };
  62. // 先获取你创建的标段及参与的标段
  63. const tenderList = await ctx.service.paymentTender.getList(ctx.session.sessionUser.accountId);
  64. // 获取你创建的目录及对应目录下的所有目录
  65. const folderList = await ctx.service.paymentFolder.getList(ctx.session.sessionUser.accountId, tenderList);
  66. responseData.data.folderList = folderList;
  67. responseData.data.tenderList = tenderList;
  68. ctx.body = responseData;
  69. }
  70. async permissionSave(ctx) {
  71. try {
  72. if (ctx.session.sessionUser.is_admin === 0) throw '没有设置权限';
  73. const projectId = ctx.session.sessionProject.id;
  74. const responseData = {
  75. err: 0, msg: '', data: null,
  76. };
  77. const data = JSON.parse(ctx.request.body.data);
  78. if (!data.type) {
  79. throw '提交数据错误';
  80. }
  81. let uids;
  82. let result = false;
  83. let auditList = [];
  84. switch (data.type) {
  85. case 'add-audit':
  86. // 判断用户是单个还是数组
  87. uids = data.id instanceof Array ? data.id : [data.id];
  88. // 判断该用户的组是否已加入到表中,已加入则提示无需添加
  89. auditList = await ctx.service.paymentPermissionAudit.getAllDataByCondition({ where: { pid: projectId, uid: uids } });
  90. const addAidList = ctx.helper._.difference(uids, ctx.helper._.map(auditList, 'uid'));
  91. if (addAidList.length === 0) {
  92. throw '用户已存在权限中,无需重复添加';
  93. }
  94. const accountList = await ctx.service.projectAccount.getAllDataByCondition({ where: { id: addAidList } });
  95. await ctx.service.paymentPermissionAudit.saveAudits(projectId, accountList);
  96. responseData.data = await ctx.service.paymentPermissionAudit.getList(projectId);
  97. break;
  98. case 'del-audit':
  99. uids = data.id instanceof Array ? data.id : [data.id];
  100. auditList = await ctx.service.paymentPermissionAudit.getAllDataByCondition({ where: { id: uids } });
  101. if (auditList.length !== uids.length) {
  102. throw '该用户已不存在权限中,移除失败';
  103. }
  104. await ctx.service.paymentPermissionAudit.delAudit(uids);
  105. responseData.data = await ctx.service.paymentPermissionAudit.getList(projectId);
  106. break;
  107. case 'save-permission-one':
  108. result = await ctx.service.paymentPermissionAudit.updateOnePermission(data.updateData);
  109. if (!result) {
  110. throw '修改权限失败';
  111. }
  112. break;
  113. case 'save-permission-all':
  114. result = await ctx.service.paymentPermissionAudit.updateAllPermission(projectId, data.permission_type, data.value);
  115. if (!result) {
  116. throw '修改权限失败';
  117. }
  118. responseData.data = await ctx.service.paymentPermissionAudit.getList(projectId);
  119. break;
  120. default: throw '参数有误';
  121. }
  122. ctx.body = responseData;
  123. } catch (err) {
  124. this.log(err);
  125. ctx.body = { err: 1, msg: err.toString(), data: null };
  126. }
  127. }
  128. async save(ctx) {
  129. try {
  130. const projectId = ctx.session.sessionProject.id;
  131. const auditPermission = await this.ctx.service.paymentPermissionAudit.getOnePermission(ctx.session.sessionUser.is_admin, ctx.session.sessionUser.accountId);
  132. if (!auditPermission) {
  133. throw '权限不足';
  134. }
  135. const responseData = {
  136. err: 0, msg: '', data: {},
  137. };
  138. const data = JSON.parse(ctx.request.body.data);
  139. if (!data.type) {
  140. throw '提交数据错误';
  141. }
  142. let type = '';
  143. switch (data.type) {
  144. case 'add-folder':
  145. if (!auditPermission.folder) {
  146. throw '没有权限新建目录';
  147. }
  148. await ctx.service.paymentFolder.addFolder(projectId, ctx.session.sessionUser.accountId, data.parentId, data.name);
  149. break;
  150. case 'add-tender':
  151. if (!auditPermission.tender) {
  152. throw '没有权限新建标段';
  153. }
  154. await ctx.service.paymentTender.addTender(projectId, ctx.session.sessionUser.accountId, data.folderId, data.name);
  155. break;
  156. case 'edit-name':
  157. type = data.postData.type;
  158. const updateData = {
  159. name: data.postData.name,
  160. };
  161. const conditionData = {
  162. id: data.postData.id,
  163. };
  164. if (type === 'tender') {
  165. await ctx.service.paymentTender.update(updateData, conditionData);
  166. } else {
  167. await ctx.service.paymentFolder.update(updateData, conditionData);
  168. }
  169. break;
  170. case 'del':
  171. type = data.postData.type;
  172. if (type === 'tender') {
  173. await ctx.service.paymentTender.deleteTender(data.postData.id);
  174. } else {
  175. await ctx.service.paymentFolder.deleteFolder(data.postData.id);
  176. }
  177. break;
  178. default: throw '参数有误';
  179. }
  180. // 先获取你创建的标段及参与的标段
  181. const tenderList = await ctx.service.paymentTender.getList(ctx.session.sessionUser.accountId);
  182. // 获取你创建的目录及对应目录下的所有目录
  183. const folderList = await ctx.service.paymentFolder.getList(ctx.session.sessionUser.accountId, tenderList);
  184. responseData.data.folderList = folderList;
  185. responseData.data.tenderList = tenderList;
  186. ctx.body = responseData;
  187. } catch (err) {
  188. this.log(err);
  189. ctx.body = { err: 1, msg: err.toString(), data: null };
  190. }
  191. }
  192. /**
  193. * 支付表单页面
  194. *
  195. * @param {Object} ctx - egg全局页面
  196. * @return {void}
  197. */
  198. async detail(ctx) {
  199. try {
  200. const id = parseInt(ctx.params.did);
  201. if (!id) throw '参数错误';
  202. const info = await ctx.service.paymentDetail.getDataById(id);
  203. const rptTpl = await ctx.service.rptTpl.getDataById(3029);
  204. const pageRst = ctx.service.jpcReport.getAllPreviewPagesCommon(rptTpl, 'A4');
  205. const renderData = {
  206. info,
  207. pageRst,
  208. };
  209. await this.layout('payment/detail.ejs', renderData);
  210. } catch (err) {
  211. console.log(err);
  212. this.log(err);
  213. ctx.redirect(this.menu.menu.dashboard.url);
  214. }
  215. }
  216. async process(ctx) {
  217. try {
  218. const auditPermission = await this.ctx.service.paymentPermissionAudit.getOnePermission(ctx.session.sessionUser.is_admin, ctx.session.sessionUser.accountId);
  219. if (!auditPermission || !auditPermission.process) {
  220. throw '权限不足';
  221. }
  222. // 获取报表表单列表
  223. const rptProject = await ctx.service.rptTreeNode.getDataByCondition({ name: '01.支付审批报表' });
  224. let rptProjectList = rptProject.items ? JSON.parse(rptProject.items) : [];
  225. // const rptTplList = [];
  226. // if (rptProjectList.length > 0) {
  227. // const params = { tender_id: id };
  228. // for (const rpt of rptProjectList) {
  229. // const rptTpl = await ctx.service.rptTpl.getDataById(rpt.ID);
  230. // // 根据模板ID获取报表JSON
  231. // const pageRst = ctx.service.jpcReport.getAllPreviewPagesCommon(rptTpl, 'A4');
  232. // console.log(pageRst.items[0]);
  233. // // return;
  234. // rptTplList.push(pageRst.items[0]);
  235. // }
  236. // }
  237. let tenderRptList = await ctx.service.paymentTenderRpt.getProcessList(ctx.tender.id, rptProjectList);
  238. [tenderRptList, rptProjectList] = await ctx.service.paymentTenderRpt.checkAndUpdateList(tenderRptList, rptProjectList);
  239. // for (const tr of tenderRptList) {
  240. // if (tr.status === shenpiConst.sp_status.gdspl) {
  241. // tr.auditList = await ctx.service.paymentShenpiAudit.getAuditList(ctx.tender.id, tr.id, tr.sp_status);
  242. // } else if (tr.status === shenpiConst.sp_status.gdzs) {
  243. // tr.audit = await ctx.service.paymentShenpiAudit.getAudit(ctx.tender.id, tr.id, tr.sp_status);
  244. // }
  245. // }
  246. // 获取所有项目参与者
  247. const accountList = await ctx.service.projectAccount.getAllDataByCondition({
  248. where: { project_id: ctx.session.sessionProject.id, enable: 1 },
  249. columns: ['id', 'name', 'company', 'role', 'enable', 'is_admin', 'account_group', 'mobile'],
  250. });
  251. const accountGroupList = accountGroup.map((item, idx) => {
  252. const groupList = accountList.filter(item => item.account_group === idx);
  253. return { groupName: item, groupList };
  254. });
  255. const renderData = {
  256. tender: ctx.tender,
  257. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.payment.process),
  258. rptProjectList,
  259. tenderRptList,
  260. shenpi: shenpiConst,
  261. accountList,
  262. accountGroup: accountGroupList,
  263. };
  264. await this.layout('payment/process.ejs', renderData, 'payment/process_modal.ejs');
  265. } catch (err) {
  266. console.log(err);
  267. this.log(err);
  268. ctx.redirect(this.request.headers.referer ? this.request.headers.referer : this.menu.menu.dashboard.url);
  269. }
  270. }
  271. async processSave(ctx) {
  272. try {
  273. const auditPermission = await this.ctx.service.paymentPermissionAudit.getOnePermission(ctx.session.sessionUser.is_admin, ctx.session.sessionUser.accountId);
  274. if (!auditPermission || !auditPermission.process) {
  275. throw '权限不足';
  276. }
  277. const responseData = {
  278. err: 0, msg: '', data: {},
  279. };
  280. const data = JSON.parse(ctx.request.body.data);
  281. if (!data.type) {
  282. throw '提交数据错误';
  283. }
  284. switch (data.type) {
  285. case 'add-rpt':
  286. responseData.data = await ctx.service.paymentTenderRpt.setRpt(ctx.tender.id, data.rpt_list);
  287. break;
  288. case 'change-status':
  289. responseData.data = await ctx.service.paymentTenderRpt.setStatus(data.tr_id, data.status);
  290. break;
  291. case 'get-audits':
  292. responseData.data = await ctx.service.paymentShenpiAudit.getShenpiAudit(data.tr_id, data.status);
  293. break;
  294. case 'add-audit':
  295. responseData.data = await ctx.service.paymentShenpiAudit.addAudit(data);
  296. break;
  297. case 'del-audit':
  298. responseData.data = await ctx.service.paymentShenpiAudit.removeAudit(data);
  299. break;
  300. default: throw '参数有误';
  301. }
  302. ctx.body = responseData;
  303. } catch (err) {
  304. this.log(err);
  305. ctx.body = { err: 1, msg: err.toString(), data: null };
  306. }
  307. }
  308. async rptList(ctx) {
  309. }
  310. }
  311. return PaymentController;
  312. };