ChangeLepaoCount.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 { insertLedgerRecord } = require("../../../../lib/Lepao/CountLedger");
  6. class ChangeLepaoCount extends API {
  7. constructor() {
  8. super()
  9. this.setPath('/Admin/User/ChangeLepaoCount')
  10. this.setMethod('POST')
  11. }
  12. async onRequest(req, res) {
  13. let {
  14. uuid,
  15. session,
  16. userid,
  17. lepao_count,
  18. remark
  19. } = req.body
  20. remark = typeof remark === 'string' ? remark.trim() : ''
  21. if ([uuid, session, userid, lepao_count].some(value => value === '' || value === null || value === undefined))
  22. return res.json({
  23. ...BaseStdResponse.MISSING_PARAMETER
  24. })
  25. if (remark.length > 255)
  26. return res.json({
  27. ...BaseStdResponse.ERR,
  28. msg: '备注长度不能超过255个字符'
  29. })
  30. // 检查 session
  31. if (!await AccessControl.checkSession(uuid, session))
  32. return res.status(401).json({
  33. ...BaseStdResponse.ACCESS_DENIED
  34. })
  35. // 检查权限
  36. if (!await AccessControl.canAccess(uuid, ['action.user.changeCount']))
  37. return res.json({
  38. ...BaseStdResponse.PERMISSION_DENIED
  39. })
  40. const conn = await db.connect()
  41. try {
  42. await conn.beginTransaction()
  43. const [userRows] = await conn.execute(
  44. 'SELECT lepao_count FROM users WHERE uuid = ? FOR UPDATE',
  45. [userid]
  46. )
  47. if (!userRows || userRows.length !== 1) {
  48. await conn.rollback()
  49. return res.json({
  50. ...BaseStdResponse.MISSING_FILE,
  51. msg: '未找到用户信息'
  52. })
  53. }
  54. const beforeCount = Number(userRows[0].lepao_count || 0)
  55. const targetCount = Number(lepao_count)
  56. const delta = targetCount - beforeCount
  57. const [r] = await conn.execute(
  58. 'UPDATE users SET lepao_count = ? WHERE uuid = ?',
  59. [targetCount, userid]
  60. )
  61. if (!r || r.affectedRows !== 1) {
  62. await conn.rollback()
  63. return res.json({
  64. ...BaseStdResponse.DATABASE_ERR
  65. })
  66. }
  67. if (delta !== 0) {
  68. await insertLedgerRecord({
  69. executor: conn,
  70. userUuid: userid,
  71. delta,
  72. balanceBefore: beforeCount,
  73. balanceAfter: targetCount,
  74. bizType: 'admin_adjust',
  75. bizId: `admin_adjust:${Date.now()}:${userid}`,
  76. operatorUuid: uuid,
  77. remark: remark || '系统调整次数'
  78. })
  79. }
  80. await conn.commit()
  81. } catch (error) {
  82. try { await conn.rollback() } catch (_) { }
  83. this.logger.error(`管理员调整次数失败: ${error.stack || error}`)
  84. return res.json({
  85. ...BaseStdResponse.DATABASE_ERR
  86. })
  87. } finally {
  88. if (conn?.connection && typeof conn.connection.release === 'function' && typeof conn?.release === 'function') {
  89. conn.release()
  90. }
  91. }
  92. res.json({
  93. ...BaseStdResponse.OK
  94. })
  95. }
  96. }
  97. module.exports.ChangeLepaoCount = ChangeLepaoCount