revise_audit.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. 'use strict'
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const auditConst = require('../const/audit').revise
  10. const smsTypeConst = require('../const/sms_type')
  11. const SmsAliConst = require('../const/sms_alitemplate')
  12. const pushType = require('../const/audit').pushType
  13. module.exports = app => {
  14. class ReviseAudit extends app.BaseService {
  15. /**
  16. * 构造函数
  17. *
  18. * @param {Object} ctx - egg全局变量
  19. * @return {void}
  20. */
  21. constructor(ctx) {
  22. super(ctx)
  23. this.tableName = 'revise_audit'
  24. }
  25. /**
  26. * 获取标段审核人信息
  27. *
  28. * @param {Number} reviseId - 修订id
  29. * @param {Number} auditorId - 审核人id
  30. * @param {Number} times - 第几次审批
  31. * @returns {Promise<*>}
  32. */
  33. async getAuditor(reviseId, auditorId, times = 1) {
  34. const sql =
  35. 'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, pa.`mobile`, pa.`telephone`, la.`times`, la.`audit_order`, la.`status`, la.`opinion`, la.`begin_time`, la.`end_time` ' +
  36. 'FROM ?? AS la, ?? AS pa ' +
  37. 'WHERE la.`rid` = ? and la.`audit_id` = ? and la.`times` = ?' +
  38. ' and la.`audit_id` = pa.`id`'
  39. const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, reviseId, auditorId, times]
  40. return await this.db.queryOne(sql, sqlParam)
  41. }
  42. /**
  43. * 获取标段审核列表信息
  44. *
  45. * @param {Number} reviseId - 修订id
  46. * @param {Number} times - 第几次审批
  47. * @returns {Promise<*>}
  48. */
  49. async getAuditors(reviseId, times = 1) {
  50. const sql =
  51. 'SELECT la.`audit_id`, la.`times`, la.`audit_order`, la.`status`, la.`opinion`, la.`begin_time`, la.`end_time`,' +
  52. ' pa.`name`, pa.`company`, pa.`role`, pa.`mobile`, pa.`telephone`' +
  53. ' FROM ' +
  54. this.tableName +
  55. ' AS la ' +
  56. ' INNER JOIN ' +
  57. this.ctx.service.projectAccount.tableName +
  58. ' AS pa ON la.`rid` = ? and la.`times` = ? and la.`audit_id` = pa.`id`' +
  59. ' ORDER BY la.`audit_order`'
  60. const sqlParam = [reviseId, times]
  61. return await this.db.query(sql, sqlParam)
  62. }
  63. /**
  64. * 获取 审核列表信息(修订列表页审批流程用)
  65. *
  66. * @param {Number} rid - 修订id
  67. * @param {Number} times - 第几次审批
  68. * @returns {Promise<*>}
  69. */
  70. async getAuditors2ReviseList(rid, times = 1) {
  71. const sql =
  72. 'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, pa.`mobile`, pa.`telephone`, la.`times`, la.`audit_order`, la.`status`, la.`opinion`, la.`begin_time`, la.`end_time`, g.`sort` ' +
  73. 'FROM ?? AS la, ?? AS pa, (SELECT `audit_id`,(@i:=@i+1) as `sort` FROM ??, (select @i:=0) as it WHERE `rid` = ? AND `times` = ? GROUP BY `audit_id`) as g ' +
  74. 'WHERE la.`rid` = ? and la.`times` = ? and la.`audit_id` = pa.`id` and g.`audit_id` = la.`audit_id` order by la.`audit_order`'
  75. const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, this.tableName, rid, times, rid, times]
  76. const result = await this.db.query(sql, sqlParam)
  77. const sql2 = 'SELECT COUNT(a.`audit_id`) as num FROM (SELECT `audit_id` FROM ?? WHERE `rid` = ? AND `times` = ? GROUP BY `audit_id`) as a'
  78. const sqlParam2 = [this.tableName, rid, times]
  79. const count = await this.db.queryOne(sql2, sqlParam2)
  80. for (const i in result) {
  81. result[i].max_sort = count.num
  82. }
  83. return result
  84. }
  85. /**
  86. * 获取标段当前审核人
  87. *
  88. * @param {Number} reviseId - 修订id
  89. * @param {Number} times - 第几次审批
  90. * @returns {Promise<*>}
  91. */
  92. async getCurAuditor(reviseId, times = 1) {
  93. const sql =
  94. 'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, pa.`mobile`, pa.`telephone`, la.`times`, la.`audit_order`, la.`status`, la.`opinion`, la.`begin_time`, la.`end_time` ' +
  95. 'FROM ?? AS la, ?? AS pa ' +
  96. 'WHERE la.`rid` = ? and la.`status` = ? and la.`times` = ?' +
  97. ' and la.`audit_id` = pa.`id`'
  98. const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, reviseId, auditConst.status.checking, times]
  99. return await this.db.queryOne(sql, sqlParam)
  100. }
  101. /**
  102. * 获取最新审核顺序
  103. *
  104. * @param {Number} reviseId - 修订id
  105. * @param {Number} times - 第几次审批
  106. * @returns {Promise<number>}
  107. */
  108. async getNewOrder(reviseId, times = 1) {
  109. const sql = 'SELECT Max(??) As max_order FROM ?? Where `rid` = ? and `times` = ?'
  110. const sqlParam = ['audit_order', this.tableName, reviseId, times]
  111. const result = await this.db.queryOne(sql, sqlParam)
  112. return result && result.max_order ? result.max_order + 1 : 1
  113. }
  114. /**
  115. * 新增审核人
  116. *
  117. * @param {Object} revise - 修订
  118. * @param {Number} auditorId - 审核人id
  119. * @param {Number} times - 第几次审批
  120. * @returns {Promise<number>}
  121. */
  122. async addAuditor(revise, auditorId) {
  123. const times = revise.times ? revise.times : 1
  124. const newOrder = await this.getNewOrder(revise.id, times)
  125. const data = {
  126. tender_id: revise.tid,
  127. audit_id: auditorId,
  128. times,
  129. audit_order: newOrder,
  130. status: auditConst.status.uncheck,
  131. rid: revise.id,
  132. in_time: new Date()
  133. }
  134. const result = await this.db.insert(this.tableName, data)
  135. return (result.effectRows = 1)
  136. }
  137. /**
  138. * 移除审核人时,同步其后审核人order
  139. * @param transaction - 事务
  140. * @param {Number} reviseId - 修订id
  141. * @param {Number} auditorId - 审核人id
  142. * @param {Number} times - 第几次审批
  143. * @returns {Promise<*>}
  144. * @private
  145. */
  146. async _syncOrderByDelete(transaction, reviseId, order, times) {
  147. this.initSqlBuilder()
  148. this.sqlBuilder.setAndWhere('rid', {
  149. value: this.db.escape(reviseId),
  150. operate: '='
  151. })
  152. this.sqlBuilder.setAndWhere('audit_order', {
  153. value: order,
  154. operate: '>='
  155. })
  156. this.sqlBuilder.setAndWhere('times', {
  157. value: times,
  158. operate: '='
  159. })
  160. this.sqlBuilder.setUpdateData('audit_order', {
  161. value: 1,
  162. selfOperate: '-'
  163. })
  164. const [sql, sqlParam] = this.sqlBuilder.build(this.tableName, 'update')
  165. const data = await transaction.query(sql, sqlParam)
  166. return data
  167. }
  168. /**
  169. * 移除审核人
  170. *
  171. * @param {Object} revise - 修订
  172. * @param {Number} auditorId - 审核人id
  173. * @param {Number} times - 第几次审批
  174. * @returns {Promise<boolean>}
  175. */
  176. async deleteAuditor(revise, auditorId) {
  177. const times = revise.times ? revise.times : 1
  178. const transaction = await this.db.beginTransaction()
  179. try {
  180. const condition = { rid: revise.id, audit_id: auditorId, times }
  181. const auditor = await this.getDataByCondition(condition)
  182. if (!auditor) {
  183. throw '该审核人不存在'
  184. }
  185. await this._syncOrderByDelete(transaction, revise.id, auditor.audit_order, times)
  186. await transaction.delete(this.tableName, condition)
  187. await transaction.commit()
  188. } catch (err) {
  189. await transaction.rollback()
  190. throw err
  191. }
  192. return true
  193. }
  194. /**
  195. * 开始审批
  196. *
  197. * @param {Object} revise - 修订
  198. * @param {Number} times - 第几次审批
  199. * @returns {Promise<boolean>}
  200. */
  201. async start(revise, times = 1) {
  202. const audit = await this.getDataByCondition({ rid: revise.id, times, audit_order: 1 })
  203. if (!audit) throw '审核人信息错误'
  204. const time = new Date()
  205. // 拷贝备份台账数据
  206. const [billsHis, posHis] = await this.ctx.service.ledgerRevise.backupReviseHistoryFile(revise)
  207. const transaction = await this.db.beginTransaction()
  208. try {
  209. await transaction.update(this.tableName, {
  210. id: audit.id,
  211. status: auditConst.status.checking,
  212. begin_time: time,
  213. bills_file: revise.bills_file,
  214. pos_file: revise.pos_file
  215. })
  216. const reviseData = {
  217. id: revise.id,
  218. status: auditConst.status.checking,
  219. bills_file: billsHis,
  220. pos_file: posHis
  221. }
  222. if (revise.times === 1) {
  223. reviseData.begin_time = time
  224. }
  225. await transaction.update(this.ctx.service.ledgerRevise.tableName, reviseData)
  226. // 添加短信通知-需要审批提醒功能
  227. // 下一人
  228. // await this.ctx.helper.sendUserSms(audit.audit_id, smsTypeConst.const.XD,
  229. // smsTypeConst.judge.approval.toString(), '台帐修订需要您审批,请登录系统处理。');
  230. await this.ctx.helper.sendAliSms(audit.audit_id, smsTypeConst.const.XD, smsTypeConst.judge.approval.toString(), SmsAliConst.template.revise_check)
  231. // 其他参与人
  232. const auditList = await this.getAuditors(revise.id, times)
  233. const users = this._.pull(this._.map(auditList, 'user_id'), audit.id)
  234. // await this.ctx.helper.sendUserSms(users, smsTypeConst.const.XD,
  235. // smsTypeConst.judge.result.toString(), '台账修订已上报。');
  236. await this.ctx.helper.sendAliSms(users, smsTypeConst.const.XD, smsTypeConst.judge.result.toString(), SmsAliConst.template.revise_report)
  237. await transaction.commit()
  238. } catch (err) {
  239. await transaction.rollback()
  240. throw err
  241. }
  242. return true
  243. }
  244. async _replaceLedgerByRevise(transaction, revise) {
  245. const sqlParam = [revise.tid]
  246. await transaction.delete(this.ctx.service.ledger.tableName, { tender_id: revise.tid })
  247. const bSql =
  248. 'Insert Into ' +
  249. this.ctx.service.ledger.tableName +
  250. ' (id, code, b_code, name, unit, source, remark, ledger_id, ledger_pid, level, `order`, full_path, is_leaf,' +
  251. ' quantity, total_price, unit_price, drawing_code, memo, dgn_qty1, dgn_qty2, deal_qty, deal_tp,' +
  252. ' sgfh_qty, sgfh_tp, sjcl_qty, sjcl_tp, qtcl_qty, qtcl_tp, node_type, crid, tender_id, is_tp,' +
  253. ' sgfh_expr, sjcl_expr, qtcl_expr)' +
  254. ' Select id, code, b_code, name, unit, source, remark, ledger_id, ledger_pid, level, `order`, full_path, is_leaf,' +
  255. ' quantity, total_price, unit_price, drawing_code, memo, dgn_qty1, dgn_qty2, deal_qty, deal_tp,' +
  256. ' sgfh_qty, sgfh_tp, sjcl_qty, sjcl_tp, qtcl_qty, qtcl_tp, node_type, crid, tender_id, is_tp, ' +
  257. ' sgfh_expr, sjcl_expr, qtcl_expr' +
  258. ' From ' +
  259. this.ctx.service.reviseBills.tableName +
  260. ' Where `tender_id` = ?'
  261. await transaction.query(bSql, sqlParam)
  262. await transaction.delete(this.ctx.service.pos.tableName, { tid: revise.tid })
  263. const pSql =
  264. 'Insert Into ' +
  265. this.ctx.service.pos.tableName +
  266. ' (id, tid, lid, name, drawing_code, quantity, add_stage, add_times, add_user,' +
  267. ' sgfh_qty, sjcl_qty, qtcl_qty, crid, porder, position, ' +
  268. ' sgfh_expr, sjcl_expr, qtcl_expr)' +
  269. ' Select id, tid, lid, name, drawing_code, quantity, add_stage, add_times, add_user,' +
  270. ' sgfh_qty, sjcl_qty, qtcl_qty, crid, porder, position,' +
  271. ' sgfh_expr, sjcl_expr, qtcl_expr' +
  272. ' From ' +
  273. this.ctx.service.revisePos.tableName +
  274. ' Where `tid` = ?'
  275. await transaction.query(pSql, sqlParam)
  276. }
  277. /**
  278. * 审批
  279. * @param {Object} revise - 修订
  280. * @param {auditConst.status.checked|auditConst.status.checkNo} checkType - 审批结果
  281. * @param {String} opinion - 审批意见
  282. * @param {Number} times - 第几次审批
  283. * @returns {Promise<void>}
  284. */
  285. async check(revise, checkType, opinion, times = 1) {
  286. if (checkType !== auditConst.status.checked && checkType !== auditConst.status.checkNo) throw '提交数据错误'
  287. const audit = await this.getDataByCondition({
  288. rid: revise.id,
  289. times,
  290. status: auditConst.status.checking
  291. })
  292. if (!audit) throw '审核数据错误'
  293. const pid = this.ctx.session.sessionProject.id
  294. const transaction = await this.db.beginTransaction()
  295. try {
  296. const auditList = await this.getAuditors(revise.id, times)
  297. // 审核通过添加到推送表
  298. const noticeContent = await this.getNoticeContent(pid, audit.tender_id, audit.rid, audit.audit_id)
  299. const records = [
  300. {
  301. pid,
  302. type: pushType.revise,
  303. uid: revise.uid,
  304. status: checkType,
  305. content: noticeContent
  306. }
  307. ]
  308. auditList.forEach(audit => {
  309. records.push({
  310. pid,
  311. type: pushType.revise,
  312. uid: audit.audit_id,
  313. status: checkType,
  314. content: noticeContent
  315. })
  316. })
  317. await transaction.insert('zh_notice', records)
  318. // 整理当前流程审核人状态更新
  319. const time = new Date()
  320. // 更新当前审核流程
  321. await transaction.update(this.tableName, {
  322. id: audit.id,
  323. status: checkType,
  324. opinion,
  325. end_time: time
  326. })
  327. if (checkType === auditConst.status.checked) {
  328. const nextAudit = await this.getDataByCondition({
  329. rid: revise.id,
  330. times,
  331. audit_order: audit.audit_order + 1
  332. })
  333. // 无下一审核人表示,审核结束
  334. if (nextAudit) {
  335. await transaction.update(this.tableName, {
  336. id: nextAudit.id,
  337. status: auditConst.status.checking,
  338. begin_time: time
  339. })
  340. // 短信通知-需要审批提醒功能
  341. // 下一人
  342. // await this.ctx.helper.sendUserSms(nextAudit.user_id, smsTypeConst.const.XD,
  343. // smsTypeConst.judge.approval.toString(), '台帐修订需要您审批,请登录系统处理。');
  344. await this.ctx.helper.sendAliSms(nextAudit.user_id, smsTypeConst.const.XD, smsTypeConst.judge.result.toString(), SmsAliConst.template.revise_result, {
  345. status: SmsAliConst.status.success
  346. })
  347. // 其他参与人
  348. const users = this._.pull(this._.map(auditList, 'user_id'), audit.id)
  349. users.push(revise.uid)
  350. // await this.ctx.helper.sendUserSms(users, smsTypeConst.const.XD,
  351. // smsTypeConst.judge.result.toString(), '台账修订审批通过。');
  352. await this.ctx.helper.sendAliSms(users, smsTypeConst.const.XD, smsTypeConst.judge.result.toString(), SmsAliConst.template.revise_result2, {
  353. status: SmsAliConst.status.success
  354. })
  355. } else {
  356. // 同步修订信息
  357. await transaction.update(this.ctx.service.ledgerRevise.tableName, {
  358. id: revise.id,
  359. status: checkType,
  360. end_time: time
  361. })
  362. // 最新一期跟台账相关的缓存数据应过期
  363. const lastStage = await this.ctx.service.stage.getLastestStage(revise.tid, true)
  364. const cacheTime = new Date()
  365. if (lastStage)
  366. await transaction.update(this.ctx.service.stage.tableName, {
  367. id: lastStage.id,
  368. cache_time_l: cacheTime,
  369. cache_time_r: cacheTime
  370. })
  371. // 拷贝修订数据至台账
  372. await this._replaceLedgerByRevise(transaction, revise)
  373. const sum = await this.ctx.service.reviseBills.addUp({
  374. tender_id: revise.tid /* , is_leaf: true*/
  375. })
  376. await transaction.update(this.ctx.service.tender.tableName, {
  377. id: revise.tid,
  378. total_price: sum.total_price,
  379. deal_tp: sum.deal_tp
  380. })
  381. // 短信通知-审批通过提醒功能
  382. // 下一人
  383. // const msg = '台账修订审批通过,请登录系统处理。';
  384. // await this.ctx.helper.sendUserSms(revise.uid, smsTypeConst.const.XD,
  385. // smsTypeConst.judge.result.toString(), msg);
  386. await this.ctx.helper.sendAliSms(revise.uid, smsTypeConst.const.XD, smsTypeConst.judge.result.toString(), SmsAliConst.template.revise_result, {
  387. status: SmsAliConst.status.success
  388. })
  389. // 其他参与人
  390. const users = this._.pull(this._.map(auditList, 'user_id'), audit.id)
  391. // await this.ctx.helper.sendUserSms(users, smsTypeConst.const.XD,
  392. // smsTypeConst.judge.result.toString(), '台账修订审批通过。');
  393. await this.ctx.helper.sendAliSms(users, smsTypeConst.const.XD, smsTypeConst.judge.result.toString(), SmsAliConst.template.revise_result2, {
  394. status: SmsAliConst.status.success
  395. })
  396. }
  397. } else {
  398. // 同步修订信息
  399. await transaction.update(this.ctx.service.ledgerRevise.tableName, {
  400. id: revise.id,
  401. times: times + 1,
  402. status: checkType
  403. })
  404. // 拷贝新一次审核流程列表
  405. const auditors = await this.getAllDataByCondition({
  406. where: { rid: revise.id, times },
  407. columns: ['tender_id', 'rid', 'audit_order', 'audit_id']
  408. })
  409. for (const a of auditors) {
  410. a.times = times + 1
  411. a.status = auditConst.status.uncheck
  412. a.in_time = time
  413. }
  414. await transaction.insert(this.tableName, auditors)
  415. // 短信通知-审批退回提醒功能
  416. // 下一人
  417. // await this.ctx.helper.sendUserSms(revise.uid, smsTypeConst.const.XD,
  418. // smsTypeConst.judge.result.toString(), '台账修订审批退回,请登录系统处理。');
  419. await this.ctx.helper.sendAliSms(revise.uid, smsTypeConst.const.XD, smsTypeConst.judge.result.toString(), SmsAliConst.template.revise_result, {
  420. status: SmsAliConst.status.back
  421. })
  422. // 其他参与人
  423. // await this.ctx.helper.sendUserSms(this._.map(auditors, 'user_id'),
  424. // smsTypeConst.const.XD, smsTypeConst.judge.result.toString(), '台账修订审批退回。');
  425. await this.ctx.helper.sendAliSms(
  426. this._.map(auditors, 'user_id'),
  427. smsTypeConst.const.XD,
  428. smsTypeConst.judge.result.toString(),
  429. SmsAliConst.template.revise_result2,
  430. {
  431. status: SmsAliConst.status.back
  432. }
  433. )
  434. }
  435. await transaction.commit()
  436. } catch (err) {
  437. await transaction.rollback()
  438. throw err
  439. }
  440. }
  441. /**
  442. * 获取审核人需要审核的标段列表
  443. *
  444. * @param auditorId
  445. * @returns {Promise<*>}
  446. */
  447. async getAuditRevise(auditorId) {
  448. const sql =
  449. 'SELECT ra.`audit_id`, ra.`times`, ra.`audit_order`, ra.`begin_time`, ra.`end_time`,' +
  450. ' r.id, r.corder, r.uid, r.status, r.content,' +
  451. ' t.id As t_id, t.`name` As t_name, t.`project_id` As t_pid, t.`type` As t_type, t.`user_id` As t_uid, t.`status` As t_status, ' +
  452. ' p.name As audit_name, p.role As audit_role, p.company As audit_company' +
  453. ' FROM ' +
  454. this.tableName +
  455. ' AS ra' +
  456. ' Left Join ' +
  457. this.ctx.service.ledgerRevise.tableName +
  458. ' As r On ra.rid = r.id' +
  459. ' Left Join ' +
  460. this.ctx.service.tender.tableName +
  461. ' AS t On r.tid = t.id' +
  462. ' Left Join ' +
  463. this.ctx.service.projectAccount.tableName +
  464. ' As p On ra.audit_id = p.id' +
  465. ' WHERE r.`valid` != 0 and ((ra.`audit_id` = ? and ra.`status` = ?) OR' +
  466. ' (r.`uid` = ? and r.`status` = ? and ra.`status` = ? and ra.`times` = (r.`times`-1)))'
  467. const sqlParam = [auditorId, auditConst.status.checking, auditorId, auditConst.status.checkNo, auditConst.status.checkNo]
  468. return await this.db.query(sql, sqlParam)
  469. }
  470. /**
  471. * 获取 某时间后 审批进度 更新的台账
  472. * @param {Integer} pid - 项目id
  473. * @param {Integer} uid - 查询人id
  474. * @param {Date} noticeTime - 查询事件
  475. * @returns {Promise<*>}
  476. */
  477. async getNoticeRevise(pid, uid, noticeTime) {
  478. // const sql = 'SELECT * FROM (SELECT ra.`audit_id`, ra.`times`, ra.`audit_order`, ra.`end_time`, ra.`status`,' +
  479. // ' r.id, r.corder, r.uid, r.status As `r_status`, r.content, ' +
  480. // ' t.`id` As t_id, t.`name` As t_name, t.`project_id` As t_pid, t.`type` As t_type, t.`user_id` As t_uid, ' +
  481. // ' pa.name As `ru_name`, pa.role As `ru_role`, pa.company As `ru_company`' +
  482. // ' FROM (SELECT * FROM ?? WHERE `user_id` = ? OR `id` in (SELECT `tender_id` FROM ?? WHERE `audit_id` = ? GROUP BY `tender_id`)) As t' +
  483. // ' LEFT JOIN ' + this.ctx.service.ledgerRevise.tableName + ' As r ON r.`tid` = t.`id`' +
  484. // ' LEFT JOIN ' + this.tableName + ' As ra ON ra.rid = r.id' +
  485. // ' LEFT JOIN ' + this.ctx.service.projectAccount.tableName + ' As pa ON ra.`audit_id` = pa.`id`' +
  486. // ' WHERE ra.end_time > ? and t.project_id = ?' +
  487. // ' ORDER By ra.`end_time` DESC LIMIT 1000) as new_t GROUP BY new_t.`id`' +
  488. // ' ORDER By new_t.`end_time`';
  489. // const sqlParam = [this.ctx.service.tender.tableName, auditorId, this.tableName, auditorId, noticeTime, projectId];
  490. // return await this.db.query(sql, sqlParam);
  491. let notice = await this.db.select('zh_notice', {
  492. where: { pid, type: pushType.revise, uid },
  493. orders: [['create_time', 'desc']],
  494. limit: 10,
  495. offset: 0
  496. })
  497. notice = notice.map(v => {
  498. const extra = JSON.parse(v.content)
  499. delete v.content
  500. return { ...v, ...extra }
  501. })
  502. return notice
  503. }
  504. /**
  505. * 用于添加推送所需的content内容
  506. * @param {Number} pid 项目id
  507. * @param {Number} tid 台账id
  508. * @param {Number} rid 修订id
  509. * @param {Number} uid 审核人id
  510. */
  511. async getNoticeContent(pid, tid, rid, uid) {
  512. const noticeSql =
  513. 'SELECT * FROM (SELECT ' +
  514. ' t.`id` As `tid`, t.`name`, r.`corder`, pa.`name` As `su_name`, pa.role As `su_role`' +
  515. ' FROM (SELECT * FROM ?? WHERE `id` = ? ) As t' +
  516. ' LEFT JOIN ?? As r On r.`id` = ? ' +
  517. ' LEFT JOIN ?? As pa ON pa.`id` = ? ' +
  518. ' WHERE t.`project_id` = ? ) as new_t GROUP BY new_t.`tid`'
  519. const noticeSqlParam = [this.ctx.service.tender.tableName, tid, this.ctx.service.ledgerRevise.tableName, rid, this.ctx.service.projectAccount.tableName, uid, pid]
  520. const content = await this.db.query(noticeSql, noticeSqlParam)
  521. return content.length ? JSON.stringify(content[0]) : ''
  522. }
  523. /**
  524. * 获取最新的审批人状态
  525. *
  526. * @param {Number} rid - 修订id
  527. * @param {Number} status - 修订状态
  528. * @param {Number} times - 修订次数
  529. * @return {Promise<boolean>}
  530. */
  531. async getAuditorByStatus(rid, status, times = 1) {
  532. let auditor = null
  533. let sql = ''
  534. let sqlParam = ''
  535. switch (status) {
  536. case auditConst.status.checking:
  537. case auditConst.status.checked:
  538. case auditConst.status.checkNoPre:
  539. sql =
  540. 'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`rid`, la.`audit_order` ' +
  541. 'FROM ?? AS la, ?? AS pa ' +
  542. 'WHERE la.`rid` = ? and la.`status` = ? and la.`audit_id` = pa.`id` order by la.`times` desc, la.`audit_order` desc'
  543. sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, rid, status]
  544. auditor = await this.db.queryOne(sql, sqlParam)
  545. break
  546. case auditConst.status.checkNo:
  547. sql =
  548. 'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`rid`, la.`audit_order` ' +
  549. 'FROM ?? AS la, ?? AS pa ' +
  550. 'WHERE la.`rid` = ? and la.`status` = ? and la.`times` = ? and la.`audit_id` = pa.`id` order by la.`times` desc, la.`audit_order` desc'
  551. sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, rid, auditConst.status.checkNo, parseInt(times) - 1]
  552. auditor = await this.db.queryOne(sql, sqlParam)
  553. break
  554. case auditConst.status.uncheck:
  555. default:
  556. break
  557. }
  558. return auditor
  559. }
  560. /**
  561. * 获取审核人流程列表
  562. *
  563. * @param auditorId
  564. * @returns {Promise<*>}
  565. */
  566. async getAuditGroupByList(rid, times) {
  567. const sql =
  568. 'SELECT la.`audit_id`, pa.`name`, pa.`company`, pa.`role`, la.`times`, la.`rid`, la.`audit_order` ' +
  569. 'FROM ?? AS la, ?? AS pa ' +
  570. 'WHERE la.`rid` = ? and la.`times` = ? and la.`audit_id` = pa.`id` GROUP BY la.`audit_id` ORDER BY la.`audit_order`'
  571. const sqlParam = [this.tableName, this.ctx.service.projectAccount.tableName, rid, times]
  572. return await this.db.query(sql, sqlParam)
  573. // const sql = 'SELECT `tid`, `sid`, `aid`, `order` FROM ?? WHERE `sid` = ? and `times` = ? GROUP BY `aid`';
  574. // const sqlParam = [this.tableName, stageId, times];
  575. // return await this.db.query(sql, sqlParam);
  576. }
  577. async getAllAuditors(tenderId) {
  578. const sql =
  579. 'SELECT ra.audit_id, ra.tender_id FROM ' +
  580. this.tableName +
  581. ' ra' +
  582. ' LEFT JOIN ' +
  583. this.ctx.service.tender.tableName +
  584. ' t On ra.tender_id = t.id' +
  585. ' WHERE t.id = ?' +
  586. ' GROUP BY ra.audit_id'
  587. const sqlParam = [tenderId]
  588. return this.db.query(sql, sqlParam)
  589. }
  590. }
  591. return ReviseAudit
  592. }