|
@@ -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
|