dashboard_controller.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. 'use strict';
  2. /**
  3. * 控制面板
  4. *
  5. * @author CaiAoLin
  6. * @date 2017/11/23
  7. * @version
  8. */
  9. const auditConst = require('../const/audit');
  10. const officeList = require('../const/cld_office').list;
  11. const maintainConst = require('../const/maintain');
  12. const typeColMap = require('../const/advance').typeColMap;
  13. module.exports = app => {
  14. class DashboardController extends app.BaseController {
  15. /**
  16. * 控制面板页面
  17. *
  18. * @param {Object} ctx - egg全局变量
  19. * @return {void}
  20. */
  21. async index(ctx) {
  22. const auditTenders = await ctx.service.ledgerAudit.getAuditTender(ctx.session.sessionUser.accountId);
  23. const auditStages = await ctx.service.stageAudit.getAuditStage(ctx.session.sessionUser.accountId);
  24. const auditChanges = await ctx.service.changeAudit.getAuditChange(ctx.session.sessionUser.accountId);
  25. const auditRevise = await ctx.service.reviseAudit.getAuditRevise(ctx.session.sessionUser.accountId);
  26. const auditMaterial = await ctx.service.materialAudit.getAuditMaterial(ctx.session.sessionUser.accountId);
  27. const auditAdvance = await ctx.service.advanceAudit.getAuditAdvance(ctx.session.sessionUser.accountId);
  28. const auditChangeProject = ctx.session.sessionProject.page_show.openChangeProject ? await ctx.service.changeProjectAudit.getAuditChangeProject(ctx.session.sessionUser.accountId) : [];
  29. const auditChangeApply = ctx.session.sessionProject.page_show.openChangeApply ? await ctx.service.changeApplyAudit.getAuditChangeApply(ctx.session.sessionUser.accountId) : [];
  30. const auditChangePlan = ctx.session.sessionProject.page_show.openChangePlan ? await ctx.service.changePlanAudit.getAuditChangePlan(ctx.session.sessionUser.accountId) : [];
  31. const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
  32. const noticeList = await ctx.service.noticePush.getNotice(ctx.session.sessionProject.id, pa.id);
  33. const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
  34. // 获取销售人员数据
  35. const salesmanData = await ctx.service.manager.getDataById(projectData.manager_id);
  36. const officeName = officeList[salesmanData.office];
  37. // 获取版本信息
  38. const versionList = await ctx.service.version.getAllDataByCondition({ orders: [['id', 'desc']], limit: 5, offset: 0 });
  39. // 获取项目通知
  40. const msgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id);
  41. const userPermission = pa !== undefined && pa.permission !== '' ? JSON.parse(pa.permission) : null;
  42. const userMsgPermission = userPermission !== null && userPermission.project_msg !== undefined && parseInt(userPermission.project_msg) === 1;
  43. // 获取系统通知
  44. const sysMsgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id, 1, 0, 2);
  45. // 获取系统维护信息
  46. const maintainData = await ctx.service.maintain.getDataById(1);
  47. // 获取各个审批的次数及最后的审批时间
  48. const shenpi_count = [
  49. { count: await ctx.service.advanceAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '预付款' },
  50. { count: await ctx.service.ledgerAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '台账审批' },
  51. { count: await ctx.service.reviseAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '台账修订' },
  52. { count: await ctx.service.stageAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '计量审批' },
  53. { count: await ctx.service.changeAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '变更审批' },
  54. ];
  55. if (ctx.session.sessionProject.page_show.openChangeProject) shenpi_count.push({ count: await ctx.service.changeProjectAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '变更立项' });
  56. if (ctx.session.sessionProject.page_show.openChangeApply) shenpi_count.push({ count: await ctx.service.changeApplyAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '变更申请' });
  57. if (ctx.session.sessionProject.page_show.openChangePlan) shenpi_count.push({ count: await ctx.service.changePlanAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '变更方案' });
  58. shenpi_count.push({ count: await ctx.service.materialAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '材料调差' });
  59. // shenpi_count.push({ count: await ctx.service.advanceAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '预付款' });
  60. const total_count = ctx.app._.sumBy(shenpi_count, 'count');
  61. const shenpi_lastime = [
  62. await ctx.service.advanceAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  63. await ctx.service.ledgerAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  64. await ctx.service.reviseAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  65. await ctx.service.stageAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  66. await ctx.service.changeAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  67. ctx.session.sessionProject.page_show.openChangeProject ? await ctx.service.changeProjectAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId) : null,
  68. ctx.session.sessionProject.page_show.openChangeApply ? await ctx.service.changeApplyAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId) : null,
  69. ctx.session.sessionProject.page_show.openChangePlan ? await ctx.service.changePlanAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId) : null,
  70. await ctx.service.materialAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  71. ];
  72. const last_time = ctx.app._.max(shenpi_lastime);
  73. // console.log(ctx.app._.max(shenpi_lastime), ctx.helper.calcDayNum(last_time));
  74. const renderData = {
  75. auditTenders,
  76. auditStages,
  77. auditChanges,
  78. auditRevise,
  79. auditMaterial,
  80. auditAdvance,
  81. auditChangeProject,
  82. auditChangeApply,
  83. auditChangePlan,
  84. shenpi_count,
  85. total_count,
  86. last_day: ctx.helper.calcDayNum(last_time),
  87. role: pa.role,
  88. authMobile: pa.auth_mobile,
  89. acLedger: auditConst.ledger,
  90. acStage: auditConst.stage,
  91. acChange: auditConst.flow,
  92. acRevise: auditConst.revise,
  93. acMaterial: auditConst.material,
  94. acAdvance: auditConst.advance,
  95. acChangeProject: auditConst.changeProject,
  96. acChangeApply: auditConst.changeApply,
  97. acChangePlan: auditConst.changeApply,
  98. noticeList,
  99. pushType: auditConst.pushType,
  100. projectData,
  101. salesmanData,
  102. officeName,
  103. versionList: JSON.parse(JSON.stringify(versionList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
  104. msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
  105. sysMsgList: JSON.parse(JSON.stringify(sysMsgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
  106. userMsgPermission,
  107. uid: ctx.session.sessionUser.accountId,
  108. maintainData,
  109. maintainConst,
  110. typeColMap,
  111. };
  112. await this.layout('dashboard/index.ejs', renderData, 'dashboard/modal.ejs');
  113. await ctx.service.projectAccount.defaultUpdate({
  114. id: this.ctx.session.sessionUser.accountId,
  115. last_notice: new Date(),
  116. });
  117. }
  118. /**
  119. * 控制面板-通知页面
  120. *
  121. * @param {Object} ctx - egg全局变量
  122. * @return {void}
  123. */
  124. async msgList(ctx) {
  125. const page = ctx.page;
  126. const type = ctx.request.query.type ? parseInt(ctx.request.query.type) : 1;
  127. const total = type === 1 ?
  128. await ctx.service.message.count({ project_id: ctx.session.sessionProject.id, type }) :
  129. await ctx.service.message.count({ status: 1, type });
  130. const limit = 5;
  131. const offset = limit * (this.ctx.page - 1);
  132. const msgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id, limit, offset, type);
  133. const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
  134. const userPermission = pa !== undefined && pa.permission !== '' ? JSON.parse(pa.permission) : null;
  135. const userMsgPermission = userPermission !== null && userPermission.project_msg !== undefined && parseInt(userPermission.project_msg) === 1;
  136. // 分页相关
  137. const pageInfo = {
  138. page,
  139. total: Math.ceil(total / limit),
  140. queryData: JSON.stringify(ctx.urlInfo.query),
  141. };
  142. const renderData = {
  143. uid: ctx.session.sessionUser.accountId,
  144. type,
  145. pageInfo,
  146. userMsgPermission,
  147. msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
  148. };
  149. await this.layout('dashboard/msg.ejs', renderData);
  150. }
  151. /**
  152. * 控制面板-通知添加和编辑页面
  153. *
  154. * @param {Object} ctx - egg全局变量
  155. * @return {void}
  156. */
  157. async msgAdd(ctx) {
  158. let id = ctx.params.id;
  159. id = parseInt(id);
  160. try {
  161. if (isNaN(id) || id < 0) {
  162. throw '参数错误';
  163. }
  164. const rule = ctx.service.message.rule();
  165. const jsValidator = await this.jsValidator.convert(rule).build();
  166. const msgInfo = id === 0 ? {} : await ctx.service.message.getDataById(id);
  167. const renderData = {
  168. jsValidator,
  169. msgInfo,
  170. };
  171. await this.layout('dashboard/msg_add.ejs', renderData, 'dashboard/msg_modal.ejs');
  172. } catch (error) {
  173. // this.setMessage(error.toString(), this.messageType.ERROR);
  174. ctx.redirect(ctx.request.header.referer);
  175. }
  176. }
  177. /**
  178. * 控制面板-通知保存
  179. *
  180. * @param {Object} ctx - egg全局变量
  181. * @return {void}
  182. */
  183. async msgSet(ctx) {
  184. try {
  185. let id = ctx.params.id;
  186. id = parseInt(id);
  187. if (isNaN(id) || id < 0) {
  188. throw '参数错误';
  189. }
  190. const rule = ctx.service.message.rule();
  191. ctx.helper.validate(rule);
  192. const result = await ctx.service.message.save(id, ctx.request.body, ctx.session.sessionUser, ctx.session.sessionProject.id);
  193. if (result) {
  194. ctx.redirect('/dashboard/msg/list');
  195. }
  196. } catch (error) {
  197. ctx.redirect(ctx.request.header.referer);
  198. }
  199. }
  200. /**
  201. * 控制面板-通知删除
  202. *
  203. * @param {Object} ctx - egg全局变量
  204. * @return {void}
  205. */
  206. async msgDelete(ctx) {
  207. try {
  208. let id = ctx.params.id;
  209. id = parseInt(id);
  210. if (isNaN(id) || id <= 0) {
  211. throw '参数错误';
  212. }
  213. const msgInfo = await ctx.service.message.getDataById(id);
  214. if (!msgInfo || msgInfo.create_uid !== ctx.session.sessionUser.accountId) {
  215. throw '通知不存在或无权限操作';
  216. }
  217. const result = await ctx.service.message.deleteById(msgInfo.id);
  218. if (result) {
  219. ctx.redirect('/dashboard/msg/list');
  220. }
  221. } catch (error) {
  222. ctx.redirect(ctx.request.header.referer);
  223. }
  224. }
  225. /**
  226. * 将推送记录设置为已读
  227. * @param {Object} ctx 上下文
  228. */
  229. async pushSet(ctx) {
  230. try {
  231. const { id } = JSON.parse(ctx.request.body.data);
  232. const data = await ctx.service.noticePush.set(id);
  233. ctx.body = { err: 0, msg: '' };
  234. } catch (err) {
  235. this.log(err);
  236. ctx.body = { err: 1, msg: err.toString(), data: null };
  237. }
  238. }
  239. }
  240. return DashboardController;
  241. };