orderStatus.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /**
  2. * 商城订单状态文案与拼团履约判断
  3. * 用途:订单列表卡片、订单详情共用,避免只看 status / payStatus 把未成团单当成待配送
  4. * 拼团状态与后端 GroupBuyClass / xhGroupBuy.status 对齐:1拼团中 2成功 3失败 4已取消
  5. */
  6. /** 拼团中 */
  7. export const GROUP_BUY_STATUS_ONGOING = 1
  8. /** 拼团成功,可按普通已支付订单履约 */
  9. export const GROUP_BUY_STATUS_SUCCESS = 2
  10. /** 拼团失败(自动退款) */
  11. export const GROUP_BUY_STATUS_FAIL = 3
  12. /** 拼团已取消 */
  13. export const GROUP_BUY_STATUS_CANCEL = 4
  14. export const GROUP_BUY_STATUS_TEXT = {
  15. 1: '拼团中',
  16. 2: '拼团成功',
  17. 3: '拼团失败已退款',
  18. 4: '拼团已取消'
  19. }
  20. /**
  21. * 订单 status 文案,与后端 OrderStatusUtil::getSystemStatusDesc 保持一致
  22. * @param {number|string} status 系统订单状态 1-5
  23. * @returns {string}
  24. */
  25. export function getSystemStatusDesc(status) {
  26. const map = {
  27. 1: '待付款',
  28. 2: '待配送',
  29. 3: '配送中',
  30. 4: '已完成',
  31. 5: '已取消'
  32. }
  33. const key = Number(status)
  34. return map[key] || '未知状态'
  35. }
  36. /**
  37. * 是否团购单:groupBuyId > 0
  38. * @param {Object} order 订单行/详情
  39. * @returns {boolean}
  40. */
  41. export function isGroupBuyOrder(order) {
  42. return !!(order && Number(order.groupBuyId) > 0)
  43. }
  44. /**
  45. * 读取拼团状态;兼容接口误写 grouBuyStatus
  46. * @param {Object} order 订单行/详情
  47. * @returns {number}
  48. */
  49. export function getGroupBuyStatus(order) {
  50. if (!order) {
  51. return 0
  52. }
  53. const raw = order.groupBuyStatus != null && order.groupBuyStatus !== ''
  54. ? order.groupBuyStatus
  55. : order.grouBuyStatus
  56. return Number(raw) || 0
  57. }
  58. /**
  59. * 是否已支付:优先 payStatus=1;列表缺字段时用 status 推断(1/5 视为未履约支付)
  60. * @param {Object} order 订单行/详情
  61. * @returns {boolean}
  62. */
  63. export function isOrderPaid(order) {
  64. if (!order) {
  65. return false
  66. }
  67. if (order.payStatus !== undefined && order.payStatus !== null && order.payStatus !== '') {
  68. return Number(order.payStatus) === 1
  69. }
  70. const status = Number(order.status)
  71. return status !== 1 && status !== 5
  72. }
  73. /**
  74. * 团购单是否已成团成功,可按普通已支付订单履约/售后
  75. * 非团购单直接视为可履约(再由 status / payStatus 决定)
  76. * @param {Object} order 订单行/详情
  77. * @returns {boolean}
  78. */
  79. export function isGroupBuyFulfillable(order) {
  80. if (!isGroupBuyOrder(order)) {
  81. return true
  82. }
  83. return getGroupBuyStatus(order) === GROUP_BUY_STATUS_SUCCESS
  84. }
  85. /**
  86. * 团购失败或团已取消:不可履约、不可支付
  87. * @param {Object} order 订单行/详情
  88. * @returns {boolean}
  89. */
  90. export function isGroupBuyClosed(order) {
  91. if (!isGroupBuyOrder(order)) {
  92. return false
  93. }
  94. const groupBuyStatus = getGroupBuyStatus(order)
  95. return groupBuyStatus === GROUP_BUY_STATUS_FAIL || groupBuyStatus === GROUP_BUY_STATUS_CANCEL
  96. }
  97. /**
  98. * 列表/详情主状态文案:拼团未成团/失败时优先展示拼团状态,避免误显示「待配送」
  99. * @param {Object} order 订单行/详情
  100. * @returns {string}
  101. */
  102. export function getOrderDisplayStatus(order) {
  103. if (isGroupBuyOrder(order)) {
  104. const groupBuyStatus = getGroupBuyStatus(order)
  105. const status = Number(order.status)
  106. // 已付款但团未成:展示拼团中,避免误当成待配送
  107. if (groupBuyStatus === GROUP_BUY_STATUS_ONGOING && status !== 1 && status !== 5) {
  108. return GROUP_BUY_STATUS_TEXT[GROUP_BUY_STATUS_ONGOING]
  109. }
  110. if (groupBuyStatus === GROUP_BUY_STATUS_FAIL) {
  111. return GROUP_BUY_STATUS_TEXT[GROUP_BUY_STATUS_FAIL]
  112. }
  113. if (groupBuyStatus === GROUP_BUY_STATUS_CANCEL) {
  114. return GROUP_BUY_STATUS_TEXT[GROUP_BUY_STATUS_CANCEL]
  115. }
  116. }
  117. if (order && order.statusDesc) {
  118. return order.statusDesc
  119. }
  120. return getSystemStatusDesc(order && order.status)
  121. }
  122. /**
  123. * 详情状态下方提示:拼团单结合成团结果说明下一步
  124. * @param {Object} order 订单详情
  125. * @returns {string}
  126. */
  127. export function getOrderDisplayHint(order) {
  128. if (!order) {
  129. return ''
  130. }
  131. const status = Number(order.status)
  132. if (isGroupBuyOrder(order)) {
  133. const groupBuyStatus = getGroupBuyStatus(order)
  134. // 团已关闭时优先展示最终结果,避免未付款成员仍收到支付提示
  135. if (groupBuyStatus === GROUP_BUY_STATUS_FAIL) {
  136. return '未成团,款项将原路退回'
  137. }
  138. if (groupBuyStatus === GROUP_BUY_STATUS_CANCEL) {
  139. return '拼团已取消'
  140. }
  141. if (status === 1) {
  142. return '请尽快完成支付,支付后等待成团'
  143. }
  144. if (groupBuyStatus === GROUP_BUY_STATUS_ONGOING && status !== 5) {
  145. return '成团后商家开始备货配送'
  146. }
  147. }
  148. if (status === 1) {
  149. return '请尽快完成支付,超时订单可能自动取消'
  150. }
  151. if (status === 2) {
  152. return '商家备货中,请耐心等待配送'
  153. }
  154. if (status === 3) {
  155. return '鲜花配送途中,注意查收'
  156. }
  157. if (status === 4) {
  158. return '订单已完成,感谢您的惠顾'
  159. }
  160. if (status === 5) {
  161. return '订单已取消'
  162. }
  163. if (status === 6) {
  164. return '订单已退款'
  165. }
  166. return ''
  167. }
  168. /**
  169. * 待付款操作:未取消的待付款单可立即付款(拼团中未支付仍需付款)
  170. * @param {Object} order 订单行/详情
  171. * @returns {boolean}
  172. */
  173. export function canShowWaitPayAction(order) {
  174. return Number(order && order.status) === 1 && !isGroupBuyClosed(order)
  175. }
  176. /**
  177. * 待配送履约操作(联系客服):须已支付,拼团单还须成团成功
  178. * @param {Object} order 订单行/详情
  179. * @returns {boolean}
  180. */
  181. export function canShowWaitSendAction(order) {
  182. return Number(order && order.status) === 2 && isOrderPaid(order) && isGroupBuyFulfillable(order)
  183. }
  184. /**
  185. * 申请售后:非待付款,且拼团须已成团(失败走自动退款)
  186. * @param {Object} order 订单详情
  187. * @returns {boolean}
  188. */
  189. export function canShowApplyRefundAction(order) {
  190. if (!order || Number(order.status) === 1) {
  191. return false
  192. }
  193. // 拼团未成功一律不开放售后,即使旧接口 canApplyRefund 仍为 1
  194. if (!isGroupBuyFulfillable(order)) {
  195. return false
  196. }
  197. if (order.canApplyRefund !== undefined && order.canApplyRefund !== null && order.canApplyRefund !== '') {
  198. return Number(order.canApplyRefund) === 1
  199. }
  200. return true
  201. }