dashboard_controller.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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. const moment = require('moment');
  14. module.exports = app => {
  15. class DashboardController extends app.BaseController {
  16. /**
  17. * 控制面板页面
  18. *
  19. * @param {Object} ctx - egg全局变量
  20. * @return {void}
  21. */
  22. async index(ctx) {
  23. const auditTenders = await ctx.service.ledgerAudit.getAuditTender(ctx.session.sessionUser.accountId);
  24. const auditStages = await ctx.service.stageAudit.getAuditStage(ctx.session.sessionUser.accountId);
  25. const auditChanges = await ctx.service.changeAudit.getAuditChange(ctx.session.sessionUser.accountId);
  26. const auditRevise = await ctx.service.reviseAudit.getAuditRevise(ctx.session.sessionUser.accountId);
  27. const auditMaterial = ctx.session.sessionProject.page_show.openMaterial ? await ctx.service.materialAudit.getAuditMaterial(ctx.session.sessionUser.accountId) : [];
  28. const auditAdvance = await ctx.service.advanceAudit.getAuditAdvance(ctx.session.sessionUser.accountId);
  29. const auditChangeProject = ctx.session.sessionProject.page_show.openChangeProject ? await ctx.service.changeProjectAudit.getAuditChangeProject(ctx.session.sessionUser.accountId) : [];
  30. const auditChangeApply = ctx.session.sessionProject.page_show.openChangeApply ? await ctx.service.changeApplyAudit.getAuditChangeApply(ctx.session.sessionUser.accountId) : [];
  31. const auditChangePlan = ctx.session.sessionProject.page_show.openChangePlan ? await ctx.service.changePlanAudit.getAuditChangePlan(ctx.session.sessionUser.accountId) : [];
  32. const auditPayments = ctx.session.sessionProject.page_show.openPayment ? await ctx.service.paymentDetailAudit.getAuditPayment(ctx.session.sessionUser.accountId) : [];
  33. const auditStageAss = await ctx.service.stageAuditAss.getAuditStageAss(ctx.session.sessionUser.accountId);
  34. const auditFinancials = ctx.session.sessionProject.page_show.openFinancial ? await ctx.service.financialPayAudit.getAuditFinancial(ctx.session.sessionUser.accountId) : [];
  35. const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
  36. const noticeList = await ctx.service.noticePush.getNotice(ctx.session.sessionProject.id, pa.id);
  37. const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
  38. // 获取销售人员数据
  39. const salesmanData = await ctx.service.manager.getDataById(projectData.manager_id);
  40. const officeName = officeList[salesmanData.office];
  41. // 获取版本信息
  42. const versionList = await ctx.service.version.getAllDataByCondition({ orders: [['id', 'desc']], limit: 5, offset: 0 });
  43. // 获取项目通知
  44. const msgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id);
  45. const userPermission = pa !== undefined && pa.permission !== '' ? JSON.parse(pa.permission) : null;
  46. const userMsgPermission = userPermission !== null && userPermission.project_msg !== undefined && parseInt(userPermission.project_msg) === 1;
  47. // 获取系统通知
  48. const sysMsgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id, 1, 0, 2);
  49. // 获取系统维护信息
  50. const maintainData = await ctx.service.maintain.getDataById(1);
  51. // 获取各个审批的次数及最后的审批时间
  52. const shenpi_count = [
  53. { count: await ctx.service.advanceAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '预付款' },
  54. { count: await ctx.service.ledgerAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '台账审批' },
  55. { count: await ctx.service.reviseAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '台账修订' },
  56. { count: await ctx.service.stageAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '计量审批' },
  57. { count: await ctx.service.changeAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '变更审批' },
  58. ];
  59. if (ctx.session.sessionProject.page_show.openChangeProject) shenpi_count.push({ count: await ctx.service.changeProjectAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '变更立项' });
  60. if (ctx.session.sessionProject.page_show.openChangeApply) shenpi_count.push({ count: await ctx.service.changeApplyAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '变更申请' });
  61. if (ctx.session.sessionProject.page_show.openChangePlan) shenpi_count.push({ count: await ctx.service.changePlanAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '变更方案' });
  62. if (ctx.session.sessionProject.page_show.openMaterial) shenpi_count.push({ count: await ctx.service.materialAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '材料调差' });
  63. if (ctx.session.sessionProject.page_show.openFinancial) shenpi_count.push({ count: await ctx.service.financialPayAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '资金支付' });
  64. // shenpi_count.push({ count: await ctx.service.advanceAudit.getCountByChecked(ctx.session.sessionUser.accountId), name: '预付款' });
  65. const total_count = ctx.app._.sumBy(shenpi_count, 'count');
  66. const shenpi_lastime = [
  67. await ctx.service.advanceAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  68. await ctx.service.ledgerAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  69. await ctx.service.reviseAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  70. await ctx.service.stageAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  71. await ctx.service.changeAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId),
  72. ctx.session.sessionProject.page_show.openChangeProject ? await ctx.service.changeProjectAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId) : null,
  73. ctx.session.sessionProject.page_show.openChangeApply ? await ctx.service.changeApplyAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId) : null,
  74. ctx.session.sessionProject.page_show.openChangePlan ? await ctx.service.changePlanAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId) : null,
  75. ctx.session.sessionProject.page_show.openMaterial ? await ctx.service.materialAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId) : null,
  76. ctx.session.sessionProject.page_show.openFinancial ? await ctx.service.financialPayAudit.getLastEndTimeByChecked(ctx.session.sessionUser.accountId) : null,
  77. ];
  78. const last_time = ctx.app._.max(shenpi_lastime);
  79. // console.log(ctx.app._.max(shenpi_lastime), ctx.helper.calcDayNum(last_time));
  80. const renderData = {
  81. auditTenders,
  82. auditStages,
  83. auditChanges,
  84. auditRevise,
  85. auditMaterial,
  86. auditAdvance,
  87. auditChangeProject,
  88. auditChangeApply,
  89. auditChangePlan,
  90. auditPayments,
  91. auditStageAss,
  92. auditFinancials,
  93. shenpi_count,
  94. total_count,
  95. last_day: ctx.helper.calcDayNum(last_time),
  96. role: pa.role,
  97. authMobile: pa.auth_mobile,
  98. acLedger: auditConst.ledger,
  99. acStage: auditConst.stage,
  100. acChange: auditConst.change,
  101. acRevise: auditConst.revise,
  102. acMaterial: auditConst.material,
  103. acAdvance: auditConst.advance,
  104. acChangeProject: auditConst.changeProject,
  105. acChangeApply: auditConst.changeApply,
  106. acChangePlan: auditConst.changeApply,
  107. acFinancial: auditConst.financial,
  108. noticeList,
  109. pushType: auditConst.pushType,
  110. projectData,
  111. salesmanData,
  112. officeName,
  113. versionList: JSON.parse(JSON.stringify(versionList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
  114. msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
  115. sysMsgList: JSON.parse(JSON.stringify(sysMsgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
  116. userMsgPermission,
  117. uid: ctx.session.sessionUser.accountId,
  118. maintainData,
  119. maintainConst,
  120. typeColMap,
  121. };
  122. await this.layout('dashboard/index.ejs', renderData, 'dashboard/modal.ejs');
  123. await ctx.service.projectAccount.defaultUpdate({
  124. id: this.ctx.session.sessionUser.accountId,
  125. last_notice: new Date(),
  126. });
  127. }
  128. /**
  129. * 控制面板-通知页面
  130. *
  131. * @param {Object} ctx - egg全局变量
  132. * @return {void}
  133. */
  134. async msg(ctx) {
  135. try {
  136. const page = ctx.page;
  137. const msgId = parseInt(ctx.params.id) || 0;
  138. let msgInfo = msgId ? await ctx.service.message.getDataById(msgId) : null;
  139. const type = msgInfo ? msgInfo.type : ctx.request.query.type ? parseInt(ctx.request.query.type) : 1;
  140. if (msgInfo && msgInfo.type === 1 && msgInfo.project_id !== ctx.session.sessionProject.id) {
  141. throw '非该项目通知无权查看';
  142. }
  143. const total = type === 1 ?
  144. await ctx.service.message.count({ project_id: ctx.session.sessionProject.id, type }) :
  145. await ctx.service.message.count({ status: 1, type });
  146. const limit = 5;
  147. const offset = limit * (this.ctx.page - 1);
  148. const msgList = await ctx.service.message.getMsgList(ctx.session.sessionProject.id, limit, offset, type);
  149. const pa = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
  150. const userPermission = pa !== undefined && pa.permission !== '' ? JSON.parse(pa.permission) : null;
  151. const userMsgPermission = userPermission !== null && userPermission.project_msg !== undefined && parseInt(userPermission.project_msg) === 1;
  152. if (!msgId) {
  153. msgInfo = msgList[0];
  154. }
  155. // 分页相关
  156. const pageInfo = {
  157. page,
  158. total: Math.ceil(total / limit),
  159. queryData: JSON.stringify(ctx.urlInfo.query),
  160. };
  161. const renderData = {
  162. msgInfo,
  163. uid: ctx.session.sessionUser.accountId,
  164. type,
  165. pageInfo,
  166. userMsgPermission,
  167. msgList: JSON.parse(JSON.stringify(msgList).replace(/\\r\\n/g, '<br>').replace(/\\"/g, '&#34;').replace(/'/g, '&#39;').replace(/\\t/g, '&#9;')),
  168. };
  169. await this.layout('dashboard/msg.ejs', renderData);
  170. } catch (error) {
  171. console.log(error);
  172. this.log(error);
  173. ctx.session.postError = error.toString();
  174. ctx.redirect('/dashboard');
  175. }
  176. }
  177. /**
  178. * 控制面板-通知添加和编辑页面
  179. *
  180. * @param {Object} ctx - egg全局变量
  181. * @return {void}
  182. */
  183. async msgAdd(ctx) {
  184. let id = ctx.params.id;
  185. id = parseInt(id);
  186. try {
  187. if (isNaN(id) || id < 0) {
  188. throw '参数错误';
  189. }
  190. const rule = ctx.service.message.rule();
  191. const jsValidator = await this.jsValidator.convert(rule).build();
  192. const msgInfo = id === 0 ? {} : await ctx.service.message.getDataById(id);
  193. const renderData = {
  194. jsValidator,
  195. msgInfo,
  196. };
  197. await this.layout('dashboard/msg_add.ejs', renderData, 'dashboard/msg_modal.ejs');
  198. } catch (error) {
  199. // this.setMessage(error.toString(), this.messageType.ERROR);
  200. ctx.redirect(ctx.request.header.referer);
  201. }
  202. }
  203. /**
  204. * 控制面板-通知保存
  205. *
  206. * @param {Object} ctx - egg全局变量
  207. * @return {void}
  208. */
  209. async msgSet(ctx) {
  210. try {
  211. let id = ctx.params.id;
  212. id = parseInt(id);
  213. if (isNaN(id) || id < 0) {
  214. throw '参数错误';
  215. }
  216. const rule = ctx.service.message.rule();
  217. ctx.helper.validate(rule);
  218. const result = await ctx.service.message.save(id, ctx.request.body, ctx.session.sessionUser, ctx.session.sessionProject.id);
  219. if (result) {
  220. // 新增的项目通知会发送微信模版消息通知客户
  221. if (id === 0) {
  222. // 获取该项目所有的openid,发送信息
  223. const wechats = await ctx.service.projectAccount.getOpenIdListByPid(ctx.session.sessionProject.id);
  224. if (wechats.length > 0) {
  225. const msgInfo = await ctx.service.message.getDataById(result);
  226. const projectData = await ctx.service.project.getDataById(ctx.session.sessionProject.id);
  227. // 绑定成功通知
  228. const templateId = 'VKUo4us4lt2dQY0EaaJxcui2jkjmriN3A0K7i4kpZwY';
  229. const url = ctx.protocol + '://' + ctx.host + '/wx/url2wap?project=' + ctx.session.sessionProject.code + '&url=' + ctx.protocol + '://' + ctx.host + '/wap/dashboard/msg/' + msgInfo.id;
  230. const msgData = {
  231. thing21: {
  232. value: ctx.helper.contentChange(projectData.name),
  233. },
  234. thing2: {
  235. value: ctx.helper.contentChange(msgInfo.title),
  236. },
  237. thing8: {
  238. value: msgInfo.creator,
  239. },
  240. time3: {
  241. value: moment(msgInfo.release_time * 1000).format('YYYY-MM-DD'),
  242. },
  243. };
  244. for (const wx of wechats) {
  245. const result = await app.wechat.api.sendTemplate(wx.wx_openid, templateId, url, '', msgData);
  246. }
  247. }
  248. }
  249. ctx.redirect('/dashboard/msg');
  250. }
  251. } catch (error) {
  252. ctx.redirect(ctx.request.header.referer);
  253. }
  254. }
  255. /**
  256. * 控制面板-通知删除
  257. *
  258. * @param {Object} ctx - egg全局变量
  259. * @return {void}
  260. */
  261. async msgDelete(ctx) {
  262. try {
  263. let id = ctx.params.id;
  264. id = parseInt(id);
  265. if (isNaN(id) || id <= 0) {
  266. throw '参数错误';
  267. }
  268. const msgInfo = await ctx.service.message.getDataById(id);
  269. if (!msgInfo || msgInfo.create_uid !== ctx.session.sessionUser.accountId) {
  270. throw '通知不存在或无权限操作';
  271. }
  272. const result = await ctx.service.message.deleteById(msgInfo.id);
  273. if (result) {
  274. ctx.redirect('/dashboard/msg');
  275. }
  276. } catch (error) {
  277. ctx.redirect(ctx.request.header.referer);
  278. }
  279. }
  280. /**
  281. * 将推送记录设置为已读
  282. * @param {Object} ctx 上下文
  283. */
  284. async pushSet(ctx) {
  285. try {
  286. const { id } = JSON.parse(ctx.request.body.data);
  287. const data = await ctx.service.noticePush.set(id);
  288. ctx.body = { err: 0, msg: '' };
  289. } catch (err) {
  290. this.log(err);
  291. ctx.body = { err: 1, msg: err.toString(), data: null };
  292. }
  293. }
  294. }
  295. return DashboardController;
  296. };