CancelOrder.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. const API = require('../../lib/API')
  2. const db = require('../../plugin/DataBase/db')
  3. const Redis = require('../../plugin/DataBase/Redis')
  4. const { BaseStdResponse } = require('../../BaseStdResponse')
  5. const AccessControl = require('../../lib/AccessControl')
  6. const { releaseUsageForOrder } = require('../../lib/CouponService')
  7. class CancelOrder extends API {
  8. constructor() {
  9. super()
  10. this.setPath('/Order/CancelOrder')
  11. this.setMethod('POST')
  12. }
  13. async onRequest(req, res) {
  14. const { uuid, session, orderId } = req.body
  15. if ([uuid, session, orderId].some(v => v === '' || v === null || v === undefined)) {
  16. return res.json({
  17. ...BaseStdResponse.MISSING_PARAMETER
  18. })
  19. }
  20. if (!await AccessControl.checkSession(uuid, session)) {
  21. return res.status(401).json({
  22. ...BaseStdResponse.ACCESS_DENIED
  23. })
  24. }
  25. try {
  26. const rows = await db.query(
  27. 'SELECT state FROM orders WHERE orderId = ? AND create_user = ? LIMIT 1',
  28. [orderId, uuid]
  29. )
  30. if (!rows || rows.length !== 1) {
  31. return res.json({
  32. ...BaseStdResponse.ERR,
  33. msg: '订单不存在'
  34. })
  35. }
  36. if (Number(rows[0].state) !== 0) {
  37. return res.json({
  38. ...BaseStdResponse.ERR,
  39. msg: '仅未支付订单可取消'
  40. })
  41. }
  42. const updateRes = await db.query(
  43. 'UPDATE orders SET state = 3 WHERE orderId = ? AND create_user = ? AND state = 0',
  44. [orderId, uuid]
  45. )
  46. if (!updateRes || updateRes.affectedRows !== 1) {
  47. return res.json({
  48. ...BaseStdResponse.ERR,
  49. msg: '取消订单失败,订单状态可能已变更'
  50. })
  51. }
  52. await releaseUsageForOrder(orderId)
  53. try {
  54. await Redis.del(`payData:${orderId}`)
  55. } catch (redisErr) {
  56. this.logger.warn(`清除订单支付缓存失败 ${orderId}: ${redisErr.message || redisErr}`)
  57. }
  58. this.logger.info(`用户取消订单成功,订单号:${orderId}`)
  59. return res.json({
  60. ...BaseStdResponse.OK,
  61. msg: '订单已取消'
  62. })
  63. } catch (error) {
  64. this.logger.error(`取消订单失败 ${orderId}: ${error.stack || error}`)
  65. return res.json({
  66. ...BaseStdResponse.ERR,
  67. msg: '取消订单失败,请稍后再试'
  68. })
  69. }
  70. }
  71. }
  72. module.exports.CancelOrder = CancelOrder