GetOrderDetail.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. const API = require("../../lib/API.js");
  2. const db = require("../../plugin/DataBase/db.js");
  3. const Redis = require('../../plugin/DataBase/Redis');
  4. const config = require('../../config.json');
  5. const { BaseStdResponse } = require("../../BaseStdResponse.js");
  6. const AccessControl = require("../../lib/AccessControl.js");
  7. const { evaluateRefundEligibility } = require('../../lib/OrderRefundService');
  8. class GetAccount extends API {
  9. constructor() {
  10. super();
  11. this.setPath('/Order/Detail');
  12. this.setMethod('GET');
  13. }
  14. async getOrderDetail(uuid, orderId) {
  15. const sql = `
  16. SELECT
  17. a.orderId,
  18. a.create_time,
  19. a.price,
  20. a.original_price,
  21. a.discount_amount,
  22. a.coupon_code,
  23. a.state,
  24. a.pay_id,
  25. a.pay_type,
  26. a.pay_time,
  27. g.name,
  28. g.content,
  29. g.icon,
  30. g.isHot,
  31. g.description,
  32. g.category,
  33. g.features,
  34. g.lepao_count,
  35. g.ic_count
  36. FROM
  37. orders a
  38. LEFT JOIN
  39. goods g
  40. ON
  41. a.goods_id = g.id
  42. WHERE
  43. a.create_user = ?
  44. AND
  45. a.orderId = ?
  46. `;
  47. const rows = await db.query(sql, [uuid, orderId]);
  48. return rows?.[0] || null;
  49. }
  50. async onRequest(req, res) {
  51. const { uuid, session, orderId } = req.query;
  52. if (!uuid || !session || !orderId) {
  53. return res.json({
  54. ...BaseStdResponse.MISSING_PARAMETER,
  55. endpoint: 1513126
  56. });
  57. }
  58. if (!await AccessControl.checkSession(uuid, session)) {
  59. return res.status(401).json({
  60. ...BaseStdResponse.ACCESS_DENIED
  61. });
  62. }
  63. let order = await this.getOrderDetail(uuid, orderId);
  64. if (!order) {
  65. return res.json({
  66. ...BaseStdResponse.ERR,
  67. msg: '订单获取失败!'
  68. });
  69. }
  70. const userRows = await db.query(
  71. 'SELECT lepao_count FROM users WHERE uuid = ? LIMIT 1',
  72. [uuid]
  73. );
  74. const userLepaoCount = userRows?.[0]?.lepao_count ?? 0;
  75. const refundEligibility = evaluateRefundEligibility({
  76. state: order.state,
  77. payTime: order.pay_time,
  78. userLepaoCount,
  79. goodsLepaoCount: order.lepao_count,
  80. skipTimeLimit: false
  81. });
  82. order.canRefund = refundEligibility.canRefund;
  83. order.refundDisabledReason = refundEligibility.reason;
  84. order.user_lepao_count = Number(userLepaoCount || 0);
  85. // 订单未支付
  86. if (order.state === 0) {
  87. let payData = await Redis.get(`payData:${order.orderId}`);
  88. if (!payData) {
  89. // 标记为过期订单
  90. // await db.query('UPDATE orders SET state = 3 WHERE orderId = ?', [order.orderId]);
  91. // 重新获取订单信息(更新后的)
  92. order = await this.getOrderDetail(uuid, orderId);
  93. if (!order) {
  94. return res.json({
  95. ...BaseStdResponse.ERR,
  96. msg: '订单获取失败!'
  97. });
  98. }
  99. return res.json({
  100. ...BaseStdResponse.OK,
  101. data: order
  102. });
  103. }
  104. return res.json({
  105. ...BaseStdResponse.OK,
  106. data: order,
  107. payData: {
  108. payUrl: `${config.pay.url}/submit.php`,
  109. payData: JSON.parse(payData)
  110. }
  111. });
  112. }
  113. // 订单已支付或其他状态
  114. return res.json({
  115. ...BaseStdResponse.OK,
  116. data: order
  117. });
  118. }
  119. }
  120. module.exports.GetAccount = GetAccount;