advance_controller.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. 'use strict'
  2. const accountGroup = require('../const/account_group').group
  3. const auditConst = require('../const/audit').advance
  4. module.exports = app => {
  5. class advanceController extends app.BaseController {
  6. /**
  7. * 开工预付款页面(AJAX) GET
  8. * @param {Object} ctx 全局上下文
  9. */
  10. async index(ctx) {
  11. const type = auditConst.type.start
  12. const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type)
  13. const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true)
  14. const renderData = {
  15. type,
  16. advanceList,
  17. latestOrder,
  18. auditConst,
  19. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.advance.main),
  20. advancePayTotal: ctx.tender.info.deal_param.startAdvance
  21. }
  22. await this.layout('advance/index.ejs', renderData, 'advance/modal.ejs')
  23. }
  24. /**
  25. * 材料预付款页面(AJAX) GET
  26. * @param {Object} ctx 全局上下文
  27. */
  28. async materialList(ctx) {
  29. const type = auditConst.type.material
  30. const advanceList = await ctx.service.advance.getAdvanceList(ctx.tender.id, type)
  31. const latestOrder = await ctx.service.advance.getLastestAdvance(ctx.tender.id, type, true)
  32. const renderData = {
  33. type,
  34. advanceList,
  35. latestOrder,
  36. auditConst,
  37. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.advance.main),
  38. advancePayTotal: ctx.tender.info.deal_param.materialAdvance
  39. }
  40. await this.layout('advance/index.ejs', renderData, 'advance/modal.ejs')
  41. }
  42. /**
  43. * 获取通用的renderData(用于layout, Menu, subMenu部分)
  44. * @param {Object} ctx 全局上下文
  45. * @return {{auditConst, jsFiles, accountGroup?, accountList?, auditors, auditHistory}}
  46. * @private
  47. */
  48. async _getDefaultRenderData(ctx) {
  49. const data = {
  50. auditConst,
  51. jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.advance.info)
  52. }
  53. // 获取所有项目参与者
  54. if ((ctx.advance.status === auditConst.status.uncheck || ctx.advance.status === auditConst.status.checkNo) && ctx.session.sessionUser.accountId === ctx.advance.uid) {
  55. data.accountGroup = accountGroup
  56. // 获取所有项目参与者
  57. const accountList = await ctx.service.projectAccount.getAllDataByCondition({
  58. where: { project_id: ctx.session.sessionProject.id, enable: 1 },
  59. columns: ['id', 'name', 'company', 'role', 'enable', 'is_admin', 'account_group']
  60. })
  61. data.accountList = accountList
  62. }
  63. // 获取审核人左边列表
  64. data.auditors = await ctx.service.advanceAudit.getAuditorsWithOwner(ctx.advance.id, ctx.advance.times)
  65. // 获取审批流程中右边列表
  66. const auditHistory = []
  67. const times = ctx.advance.status === auditConst.status.checkNo ? ctx.advance.times - 1 : ctx.advance.times
  68. if (times >= 1) {
  69. for (let i = 1; i <= times; i++) {
  70. auditHistory.push(await ctx.service.advanceAudit.getAuditors(ctx.advance.id, i))
  71. }
  72. }
  73. data.auditHistory = auditHistory
  74. return data
  75. }
  76. /**
  77. * 预付款详情页(AJAX) GET
  78. * @param {Object} ctx 全局上下文
  79. */
  80. async detail(ctx) {
  81. const advancePayTotal = ctx.advance.type === 0 ? ctx.tender.info.deal_param.startAdvance : ctx.tender.info.deal_param.materialAdvance
  82. try {
  83. const renderData = await this._getDefaultRenderData(ctx)
  84. const { uncheck, checkNo } = auditConst.status
  85. const { status } = ctx.advance
  86. // 获取上一期预付款记录
  87. const prevAdvance = await ctx.service.advance.getPreviousRecord(ctx.tender.id, ctx.advance.type)
  88. renderData.isEdited = status === uncheck || status === checkNo
  89. renderData.advance = ctx.advance
  90. renderData.advancePayTotal = advancePayTotal
  91. renderData.prevAdvance = prevAdvance
  92. await this.layout('advance/detail.ejs', renderData, 'advance/modal_audit.ejs')
  93. } catch (error) {
  94. this.log(error)
  95. ctx.redirect('/tender/' + ctx.tender.id + '/advance')
  96. }
  97. }
  98. /**
  99. * 添加新一期
  100. * @param {Object} ctx 全局上下文
  101. */
  102. async create(ctx) {
  103. const response = { err: 0, msg: '', data: {} }
  104. const type = parseInt(ctx.params.type)
  105. try {
  106. const record = await ctx.service.advance.createRecord(type)
  107. response.data = record
  108. } catch (error) {
  109. response.err = 1
  110. response.msg = error
  111. }
  112. ctx.body = response
  113. }
  114. /**
  115. * 添加审批人
  116. * @param {Object} ctx 全局上下文
  117. */
  118. async addAudit(ctx) {
  119. try {
  120. const data = JSON.parse(ctx.request.body.data)
  121. const audit_id = data && this.app._.toInteger(data.auditorId)
  122. if (isNaN(audit_id) || audit_id <= 0) {
  123. throw '参数错误'
  124. }
  125. // 检查权限等
  126. if (ctx.advance.uid !== ctx.session.sessionUser.accountId) {
  127. throw '您无权添加审核人'
  128. }
  129. if (ctx.advance.status === auditConst.status.checking || ctx.advance.status === auditConst.status.checked) {
  130. throw '当前不允许添加审核人'
  131. }
  132. // 检查审核人是否已存在
  133. const exist = this.app._.find(ctx.advance.auditors, { audit_id })
  134. if (exist) {
  135. throw '该审核人已存在,请勿重复添加'
  136. }
  137. const result = await ctx.service.advanceAudit.addAuditor(ctx.advance.id, audit_id, ctx.advance.times)
  138. if (!result) {
  139. throw '添加审核人失败'
  140. }
  141. const audit = await ctx.service.advanceAudit.getAuditor(ctx.advance.id, audit_id, ctx.advance.times)
  142. ctx.body = { err: 0, msg: '', data: audit }
  143. } catch (err) {
  144. this.log(err)
  145. ctx.body = { err: 1, msg: err.toString(), data: null }
  146. }
  147. }
  148. /**
  149. * 移除审批人
  150. * @param {Object} ctx 全局上下文
  151. */
  152. async deleteAudit(ctx) {
  153. try {
  154. const data = JSON.parse(ctx.request.body.data)
  155. const id = data && data.auditorId instanceof Number ? data.auditorId : this.app._.toNumber(data.auditorId)
  156. if (isNaN(id) || id <= 0) {
  157. throw '参数错误'
  158. }
  159. const result = await ctx.service.advanceAudit.deleteAuditor(ctx.advance.id, id, ctx.advance.times)
  160. if (!result) {
  161. throw '移除审核人失败'
  162. }
  163. const auditors = await ctx.service.advanceAudit.getAuditGroupByList(ctx.advance.id, ctx.advance.times)
  164. ctx.body = { err: 0, msg: '', data: auditors }
  165. } catch (err) {
  166. ctx.body = { err: 1, msg: err.toString(), data: null }
  167. }
  168. }
  169. /**
  170. * 上报审批
  171. * @param {Object} ctx 全局上下文
  172. */
  173. async start(ctx) {
  174. const data = JSON.parse(ctx.request.body.data)
  175. try {
  176. // 检查权限等
  177. if (!ctx.advance) {
  178. throw '数据错误'
  179. }
  180. if (ctx.advance.uid !== ctx.session.sessionUser.accountId) {
  181. throw '您无权上报该期数据'
  182. }
  183. if (ctx.advance.status === auditConst.status.checking || ctx.advance.status === auditConst.status.checked) {
  184. throw '该预付款期数据当前无法上报'
  185. }
  186. await ctx.service.advanceAudit.check(ctx.advance.id, data, ctx.advance.times, data)
  187. ctx.redirect(ctx.request.header.referer)
  188. } catch (error) {
  189. this.log(error)
  190. ctx.session.postError = error.toString()
  191. ctx.redirect(ctx.request.header.referer)
  192. }
  193. }
  194. /**
  195. * 审批
  196. * @param {Object} ctx 全局上下文
  197. */
  198. async checkAudit(ctx) {
  199. try {
  200. if (!ctx.advance || ctx.advance.status !== auditConst.status.checking) {
  201. throw '当前材料调差期数据有误'
  202. }
  203. if (!ctx.advance.curAuditor || ctx.advance.curAuditor.audit_id !== ctx.session.sessionUser.accountId) {
  204. throw '您无权进行该操作'
  205. }
  206. const data = {
  207. checkType: parseInt(ctx.request.body.checkType),
  208. opinion: ctx.request.body.opinion
  209. }
  210. if (!data.checkType || isNaN(data.checkType)) {
  211. throw '提交数据错误'
  212. }
  213. if (data.checkType === auditConst.status.checkNo) {
  214. if (!data.checkType || isNaN(data.checkType)) {
  215. throw '提交数据错误'
  216. }
  217. }
  218. await ctx.service.advanceAudit.check(ctx.advance.id, data, ctx.advance.times)
  219. ctx.redirect(ctx.request.header.referer)
  220. } catch (err) {
  221. this.log(err)
  222. ctx.session.postError = err.toString()
  223. ctx.redirect(ctx.request.header.referer)
  224. }
  225. }
  226. }
  227. return advanceController
  228. }