revise_audit.js 31 KB

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