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