Browse Source

✨ feat: 增加取消订单功能

Pchen. 3 weeks ago
parent
commit
1df7c8c3db
1 changed files with 82 additions and 0 deletions
  1. 82 0
      apis/Order/CancelOrder.js

+ 82 - 0
apis/Order/CancelOrder.js

@@ -0,0 +1,82 @@
+const API = require('../../lib/API')
+const db = require('../../plugin/DataBase/db')
+const Redis = require('../../plugin/DataBase/Redis')
+const { BaseStdResponse } = require('../../BaseStdResponse')
+const AccessControl = require('../../lib/AccessControl')
+const { releaseUsageForOrder } = require('../../lib/CouponService')
+
+class CancelOrder extends API {
+    constructor() {
+        super()
+        this.setPath('/Order/CancelOrder')
+        this.setMethod('POST')
+    }
+
+    async onRequest(req, res) {
+        const { uuid, session, orderId } = req.body
+
+        if ([uuid, session, orderId].some(v => v === '' || v === null || v === undefined)) {
+            return res.json({
+                ...BaseStdResponse.MISSING_PARAMETER
+            })
+        }
+
+        if (!await AccessControl.checkSession(uuid, session)) {
+            return res.status(401).json({
+                ...BaseStdResponse.ACCESS_DENIED
+            })
+        }
+
+        try {
+            const rows = await db.query(
+                'SELECT state FROM orders WHERE orderId = ? AND create_user = ? LIMIT 1',
+                [orderId, uuid]
+            )
+            if (!rows || rows.length !== 1) {
+                return res.json({
+                    ...BaseStdResponse.ERR,
+                    msg: '订单不存在'
+                })
+            }
+
+            if (Number(rows[0].state) !== 0) {
+                return res.json({
+                    ...BaseStdResponse.ERR,
+                    msg: '仅未支付订单可取消'
+                })
+            }
+
+            const updateRes = await db.query(
+                'UPDATE orders SET state = 3 WHERE orderId = ? AND create_user = ? AND state = 0',
+                [orderId, uuid]
+            )
+            if (!updateRes || updateRes.affectedRows !== 1) {
+                return res.json({
+                    ...BaseStdResponse.ERR,
+                    msg: '取消订单失败,订单状态可能已变更'
+                })
+            }
+
+            await releaseUsageForOrder(orderId)
+            try {
+                await Redis.del(`payData:${orderId}`)
+            } catch (redisErr) {
+                this.logger.warn(`清除订单支付缓存失败 ${orderId}: ${redisErr.message || redisErr}`)
+            }
+
+            this.logger.info(`用户取消订单成功,订单号:${orderId}`)
+            return res.json({
+                ...BaseStdResponse.OK,
+                msg: '订单已取消'
+            })
+        } catch (error) {
+            this.logger.error(`取消订单失败 ${orderId}: ${error.stack || error}`)
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '取消订单失败,请稍后再试'
+            })
+        }
+    }
+}
+
+module.exports.CancelOrder = CancelOrder