index.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. import Dialog from 'tdesign-miniprogram/dialog/index';
  2. import { ORDER_STATUS, updateOrderStatus } from '../../../../services/order/order';
  3. import { pay, refund } from '../../../../services/pay/pay';
  4. import { OrderButtonTypes } from '../../config';
  5. import { objectToParamString } from '../../../../utils/util';
  6. import { OPERATION_TYPE } from '../../../../utils/orderOperation';
  7. const OPERATION_DONE_EVENT = 'operation';
  8. Component({
  9. options: {
  10. addGlobalClass: true,
  11. },
  12. properties: {
  13. order: {
  14. type: Object,
  15. observer(order) {
  16. this.init(order);
  17. },
  18. },
  19. goodsIndex: {
  20. type: Number,
  21. value: null,
  22. },
  23. isBtnMax: {
  24. type: Boolean,
  25. value: false,
  26. },
  27. },
  28. data: {
  29. order: {},
  30. buttons: {
  31. left: [],
  32. right: [],
  33. },
  34. },
  35. methods: {
  36. // 点击【订单操作】按钮,根据按钮类型分发
  37. onOrderBtnTap(e) {
  38. const { type } = e.currentTarget.dataset;
  39. switch (type) {
  40. case OrderButtonTypes.CANCEL:
  41. this.onCancel(this.data.order);
  42. break;
  43. case OrderButtonTypes.CONFIRM:
  44. this.onConfirm(this.data.order);
  45. break;
  46. case OrderButtonTypes.PAY:
  47. this.onPay(this.data.order);
  48. break;
  49. case OrderButtonTypes.APPLY_REFUND:
  50. this.onApplyRefund(this.data.order);
  51. break;
  52. case OrderButtonTypes.COMMENT:
  53. this.onAddComment(this.data.order);
  54. break;
  55. }
  56. },
  57. checkOrder(order, operationType) {
  58. if (order != null) {
  59. return true;
  60. }
  61. this.triggerEvent(OPERATION_DONE_EVENT, {
  62. type: operationType,
  63. message: 'no order',
  64. success: false,
  65. });
  66. return false;
  67. },
  68. async onCancel(order) {
  69. if (!this.checkOrder(order, OPERATION_TYPE.CANCEL)) return;
  70. // if order is paid, we should first refund
  71. if (order.status !== ORDER_STATUS.TO_PAY) {
  72. try {
  73. await refund(order._id);
  74. } catch (e) {
  75. this.triggerEvent(OPERATION_DONE_EVENT, {
  76. type: OPERATION_TYPE.CANCEL,
  77. message: 'refund failed',
  78. success: false,
  79. detail: e,
  80. });
  81. return;
  82. }
  83. }
  84. try {
  85. await updateOrderStatus({ orderId: order._id, status: ORDER_STATUS.CANCELED });
  86. } catch (e) {
  87. this.triggerEvent(OPERATION_DONE_EVENT, {
  88. type: OPERATION_TYPE.CANCEL,
  89. message: 'update order status failed',
  90. success: false,
  91. detail: e,
  92. });
  93. return;
  94. }
  95. this.triggerEvent(OPERATION_DONE_EVENT, {
  96. type: OPERATION_TYPE.CANCEL,
  97. success: true,
  98. });
  99. },
  100. async onConfirm(order) {
  101. if (!this.checkOrder(order, OPERATION_TYPE.CONFIRM)) return;
  102. try {
  103. await Dialog.confirm({
  104. title: '确认是否已经收到货?',
  105. content: '',
  106. confirmBtn: '确认收货',
  107. cancelBtn: '取消',
  108. });
  109. } catch (e) {
  110. this.triggerEvent(OPERATION_DONE_EVENT, {
  111. type: OPERATION_TYPE.CONFIRM,
  112. message: 'confirm dialog failed',
  113. success: false,
  114. detail: e,
  115. });
  116. return;
  117. }
  118. try {
  119. await updateOrderStatus({ orderId: order._id, status: ORDER_STATUS.FINISHED });
  120. } catch (e) {
  121. this.triggerEvent(OPERATION_DONE_EVENT, {
  122. type: OPERATION_TYPE.CONFIRM,
  123. message: 'update order status failed',
  124. success: false,
  125. detail: e,
  126. });
  127. }
  128. this.triggerEvent(OPERATION_DONE_EVENT, {
  129. type: OPERATION_TYPE.CONFIRM,
  130. success: true,
  131. });
  132. },
  133. async onPay(order) {
  134. if (!this.checkOrder(order, OPERATION_TYPE.PAY)) return;
  135. try {
  136. await pay({ id: order._id, totalPrice: order.totalPrice });
  137. try {
  138. await updateOrderStatus({ orderId: order._id, status: ORDER_STATUS.TO_SEND });
  139. } catch (e) {
  140. console.error(e);
  141. this.triggerEvent(OPERATION_DONE_EVENT, {
  142. type: OPERATION_TYPE.PAY,
  143. message: 'pay failed',
  144. success: false,
  145. detail: e,
  146. });
  147. return;
  148. }
  149. } catch (e) {
  150. this.triggerEvent(OPERATION_DONE_EVENT, {
  151. type: OPERATION_TYPE.PAY,
  152. message: 'pay failed',
  153. success: false,
  154. detail: e,
  155. });
  156. return;
  157. }
  158. this.triggerEvent(OPERATION_DONE_EVENT, {
  159. type: OPERATION_TYPE.PAY,
  160. success: true,
  161. });
  162. },
  163. onApplyRefund(order) {
  164. wx.navigateTo({ url: `/pages/order/apply-service/index?${objectToParamString({ orderId: order._id })}` });
  165. },
  166. /** 添加订单评论 */
  167. onAddComment(order) {
  168. wx.navigateTo({
  169. url: `/pages/goods/comments/create-list/index?${objectToParamString({ orderId: order._id })}`,
  170. });
  171. },
  172. init(order) {
  173. if (order == null) return;
  174. if (order.status === ORDER_STATUS.TO_PAY) {
  175. this.setData({
  176. buttons: {
  177. left: [],
  178. right: [
  179. { type: OrderButtonTypes.CANCEL, name: '取消订单' },
  180. { type: OrderButtonTypes.PAY, name: '付款', primary: true },
  181. ],
  182. },
  183. });
  184. return;
  185. }
  186. if (order.status === ORDER_STATUS.TO_SEND) {
  187. this.setData({
  188. buttons: {
  189. left: [],
  190. right: [{ type: OrderButtonTypes.CANCEL, name: '取消订单' }],
  191. },
  192. });
  193. return;
  194. }
  195. if (order.status === ORDER_STATUS.TO_RECEIVE) {
  196. this.setData({
  197. buttons: {
  198. left: [],
  199. right: [{ type: OrderButtonTypes.CONFIRM, name: '确认收货', primary: true }],
  200. },
  201. });
  202. return;
  203. }
  204. if (order.status === ORDER_STATUS.FINISHED) {
  205. this.setData({
  206. buttons: {
  207. left: [],
  208. right: [{ type: OrderButtonTypes.COMMENT, name: '评价', primary: true }],
  209. },
  210. });
  211. return;
  212. }
  213. if (order.status === ORDER_STATUS.CANCELED) {
  214. this.setData({
  215. buttons: {
  216. left: [],
  217. right: [],
  218. },
  219. });
  220. return;
  221. }
  222. if (order.status === ORDER_STATUS.RETURN_APPLIED) {
  223. this.setData({
  224. buttons: {
  225. left: [],
  226. right: [],
  227. },
  228. });
  229. return;
  230. }
  231. if (order.status === ORDER_STATUS.RETURN_REFUSED) {
  232. this.setData({
  233. buttons: {
  234. left: [],
  235. right: [],
  236. },
  237. });
  238. return;
  239. }
  240. if (order.status === ORDER_STATUS.RETURN_FINISH) {
  241. this.setData({
  242. buttons: {
  243. left: [],
  244. right: [],
  245. },
  246. });
  247. return;
  248. }
  249. if (order.status === ORDER_STATUS.RETURN_MONEY_REFUSED) {
  250. this.setData({
  251. buttons: {
  252. left: [],
  253. right: [],
  254. },
  255. });
  256. return;
  257. }
  258. },
  259. },
  260. lifetimes: {
  261. attached() {
  262. this.init(this.data.order);
  263. },
  264. },
  265. });