GetOrderDetail.js 4.9 KB

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