GetOrderDetail.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. g.vip,
  39. g.vip_validity_type,
  40. g.vip_valid_days,
  41. g.vip_fixed_expire_time,
  42. g.allow_refund
  43. FROM
  44. orders a
  45. LEFT JOIN
  46. goods g
  47. ON
  48. a.goods_id = g.id
  49. WHERE
  50. a.create_user = ?
  51. AND
  52. a.orderId = ?
  53. `;
  54. const rows = await db.query(sql, [uuid, orderId]);
  55. return rows?.[0] || null;
  56. }
  57. async onRequest(req, res) {
  58. const { uuid, session, orderId } = req.query;
  59. if (!uuid || !session || !orderId) {
  60. return res.json({
  61. ...BaseStdResponse.MISSING_PARAMETER,
  62. endpoint: 1513126
  63. });
  64. }
  65. if (!await AccessControl.checkSession(uuid, session)) {
  66. return res.status(401).json({
  67. ...BaseStdResponse.ACCESS_DENIED
  68. });
  69. }
  70. let order = await this.getOrderDetail(uuid, orderId);
  71. if (!order) {
  72. return res.json({
  73. ...BaseStdResponse.ERR,
  74. msg: '订单获取失败!'
  75. });
  76. }
  77. const userRows = await db.query(
  78. 'SELECT lepao_count FROM users WHERE uuid = ? LIMIT 1',
  79. [uuid]
  80. );
  81. const userLepaoCount = userRows?.[0]?.lepao_count ?? 0;
  82. const refundEligibility = evaluateRefundEligibility({
  83. state: order.state,
  84. payTime: order.pay_time,
  85. userLepaoCount,
  86. goodsLepaoCount: order.lepao_count,
  87. allowRefund: order.allow_refund,
  88. skipTimeLimit: false
  89. });
  90. order.canRefund = refundEligibility.canRefund;
  91. order.refundDisabledReason = refundEligibility.reason;
  92. order.user_lepao_count = Number(userLepaoCount || 0);
  93. order.canChangePayType = Number(order.state) === 0;
  94. order.paymentMethods = await getPaymentMethods();
  95. // 订单未支付
  96. if (order.state === 0) {
  97. let payData = await Redis.get(`payData:${order.orderId}`);
  98. if (!payData) {
  99. // 标记为过期订单
  100. // await db.query('UPDATE orders SET state = 3 WHERE orderId = ?', [order.orderId]);
  101. // 重新获取订单信息(更新后的)
  102. order = await this.getOrderDetail(uuid, orderId);
  103. if (!order) {
  104. return res.json({
  105. ...BaseStdResponse.ERR,
  106. msg: '订单获取失败!'
  107. });
  108. }
  109. order.canChangePayType = Number(order.state) === 0;
  110. order.paymentMethods = await getPaymentMethods();
  111. return res.json({
  112. ...BaseStdResponse.OK,
  113. data: order
  114. });
  115. }
  116. let paymentConfig
  117. try {
  118. paymentConfig = await getPaymentConfig();
  119. } catch (error) {
  120. this.logger.warn(`读取支付配置失败,订单详情不返回支付表单 ${order.orderId}: ${error.message || error}`)
  121. return res.json({
  122. ...BaseStdResponse.OK,
  123. data: order
  124. });
  125. }
  126. return res.json({
  127. ...BaseStdResponse.OK,
  128. data: order,
  129. payData: {
  130. payUrl: `${normalizePayBaseUrl(paymentConfig?.url)}/submit.php`,
  131. payData: JSON.parse(payData),
  132. autoSubmit: true
  133. }
  134. });
  135. }
  136. // 订单已支付或其他状态
  137. return res.json({
  138. ...BaseStdResponse.OK,
  139. data: order
  140. });
  141. }
  142. }
  143. module.exports.GetAccount = GetAccount;