ApproveSendCountRequest.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. const API = require("../../../lib/API")
  2. const db = require("../../../plugin/DataBase/db")
  3. const AccessControl = require("../../../lib/AccessControl")
  4. const { BaseStdResponse } = require("../../../BaseStdResponse")
  5. const EmailTemplate = require("../../../plugin/Email/emailTemplate")
  6. class ApproveSendCountRequest extends API {
  7. constructor() {
  8. super()
  9. this.setPath("/Admin/Goods/SendCountRequest/Approve")
  10. this.setMethod("POST")
  11. }
  12. async onRequest(req, res) {
  13. let { uuid, session, id } = req.body
  14. id = Number(id)
  15. if ([uuid, session, id].some(value => value === "" || value === null || value === undefined || Number.isNaN(id)))
  16. return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
  17. if (!Number.isInteger(id) || id <= 0)
  18. return res.json({ ...BaseStdResponse.ERR, msg: "参数错误" })
  19. if (!await AccessControl.checkSession(uuid, session))
  20. return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED })
  21. let permission = await AccessControl.getPermission(uuid)
  22. if (!permission.includes("admin") && !permission.includes("service"))
  23. return res.json({ ...BaseStdResponse.PERMISSION_DENIED })
  24. const conn = await db.connect()
  25. try {
  26. await conn.beginTransaction()
  27. const [requestRows] = await conn.execute(
  28. `SELECT id, sender_uuid, receiver_user_id, count, status
  29. FROM lepao_send_count_request
  30. WHERE id = ?
  31. FOR UPDATE`,
  32. [id]
  33. )
  34. if (!requestRows || requestRows.length !== 1) {
  35. await conn.rollback()
  36. return res.json({ ...BaseStdResponse.MISSING_FILE, msg: "未找到赠送申请记录!" })
  37. }
  38. const request = requestRows[0]
  39. if (request.status !== "pending") {
  40. await conn.rollback()
  41. return res.json({ ...BaseStdResponse.ERR, msg: "该申请已审核,请刷新后重试!" })
  42. }
  43. const [incResult] = await conn.execute(
  44. "UPDATE users SET lepao_count = lepao_count + ? WHERE id = ?",
  45. [request.count, request.receiver_user_id]
  46. )
  47. if (!incResult || incResult.affectedRows !== 1) {
  48. await conn.rollback()
  49. return res.json({ ...BaseStdResponse.ERR, msg: "接收用户不存在,审核通过失败!" })
  50. }
  51. const [updateResult] = await conn.execute(
  52. `UPDATE lepao_send_count_request
  53. SET status = 'approved', reviewer_uuid = ?, reviewed_at = NOW(), reject_reason = NULL
  54. WHERE id = ?`,
  55. [uuid, id]
  56. )
  57. if (!updateResult || updateResult.affectedRows !== 1) {
  58. await conn.rollback()
  59. return res.json({ ...BaseStdResponse.ERR, msg: "更新审核状态失败,请稍后再试!" })
  60. }
  61. await conn.commit()
  62. const requestId = request.id
  63. const reviewTime = new Date().getTime()
  64. // 非阻塞通知接收人,不影响审核结果
  65. Promise.resolve().then(async () => {
  66. try {
  67. const infoSql = `
  68. SELECT
  69. ru.email AS receiver_email,
  70. ru.username AS receiver_username,
  71. su.username AS sender_username
  72. FROM users ru
  73. LEFT JOIN users su ON su.uuid = ?
  74. WHERE ru.id = ?
  75. `
  76. const infoRows = await db.query(infoSql, [request.sender_uuid, request.receiver_user_id])
  77. if (!infoRows || infoRows.length !== 1 || !infoRows[0].receiver_email) {
  78. this.logger.warn(`[SendCountNotify][approve][requestId=${requestId}] 接收人邮箱为空或用户不存在,跳过通知`)
  79. return
  80. }
  81. await EmailTemplate.sendCountRequestApproved(infoRows[0].receiver_email, {
  82. requestId,
  83. senderUsername: infoRows[0].sender_username || "未知用户",
  84. count: request.count,
  85. reviewTime
  86. })
  87. } catch (mailErr) {
  88. this.logger.error(`[SendCountNotify][approve][requestId=${requestId}] 接收人通知发送失败:${mailErr.message || "未知错误"}`)
  89. }
  90. })
  91. return res.json({ ...BaseStdResponse.OK, msg: "审核通过成功" })
  92. } catch (err) {
  93. try { await conn.rollback() } catch (_) { }
  94. this.logger.error(`审核通过赠送申请失败!${err.message || "未知错误"}`)
  95. return res.json({ ...BaseStdResponse.ERR, msg: "审核通过失败,请稍后再试!" })
  96. }
  97. }
  98. }
  99. module.exports.ApproveSendCountRequest = ApproveSendCountRequest