index.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. import { formatTime } from '../../../utils/util';
  2. import { OrderStatus, LogisticsIconMap } from '../config';
  3. import { fetchBusinessTime, fetchOrderDetail } from '../../../services/order/orderDetail';
  4. import Toast from 'tdesign-miniprogram/toast/index';
  5. import { getAddressPromise } from '../../../services/address/list';
  6. Page({
  7. data: {
  8. pageLoading: true,
  9. order: {}, // 后台返回的原始数据
  10. _order: {}, // 内部使用和提供给 order-card 的数据
  11. storeDetail: {},
  12. countDownTime: null,
  13. addressEditable: false,
  14. backRefresh: false, // 用于接收其他页面back时的状态
  15. formatCreateTime: '', //格式化订单创建时间
  16. logisticsNodes: [],
  17. /** 订单评论状态 */
  18. orderHasCommented: true,
  19. },
  20. onLoad(query) {
  21. this.orderNo = query.orderNo;
  22. this.init();
  23. this.navbar = this.selectComponent('#navbar');
  24. this.pullDownRefresh = this.selectComponent('#wr-pull-down-refresh');
  25. },
  26. onShow() {
  27. // 当从其他页面返回,并且 backRefresh 被置为 true 时,刷新数据
  28. if (!this.data.backRefresh) return;
  29. this.onRefresh();
  30. this.setData({ backRefresh: false });
  31. },
  32. onPageScroll(e) {
  33. this.pullDownRefresh && this.pullDownRefresh.onPageScroll(e);
  34. },
  35. onImgError(e) {
  36. if (e.detail) {
  37. console.error('img 加载失败');
  38. }
  39. },
  40. // 页面初始化,会展示pageLoading
  41. init() {
  42. this.setData({ pageLoading: true });
  43. this.getStoreDetail();
  44. this.getDetail()
  45. .then(() => {
  46. this.setData({ pageLoading: false });
  47. })
  48. .catch((e) => {
  49. console.error(e);
  50. });
  51. },
  52. // 页面刷新,展示下拉刷新
  53. onRefresh() {
  54. this.init();
  55. // 如果上一页为订单列表,通知其刷新数据
  56. const pages = getCurrentPages();
  57. const lastPage = pages[pages.length - 2];
  58. if (lastPage) {
  59. lastPage.data.backRefresh = true;
  60. }
  61. },
  62. // 页面刷新,展示下拉刷新
  63. onPullDownRefresh_(e) {
  64. const { callback } = e.detail;
  65. return this.getDetail().then(() => callback && callback());
  66. },
  67. getDetail() {
  68. const params = {
  69. parameter: this.orderNo,
  70. };
  71. return fetchOrderDetail(params).then((res) => {
  72. const order = res.data;
  73. const _order = {
  74. id: order.orderId,
  75. orderNo: order.orderNo,
  76. parentOrderNo: order.parentOrderNo,
  77. storeId: order.storeId,
  78. storeName: order.storeName,
  79. status: order.orderStatus,
  80. statusDesc: order.orderStatusName,
  81. amount: order.paymentAmount,
  82. totalAmount: order.goodsAmountApp,
  83. logisticsNo: order.logisticsVO.logisticsNo,
  84. goodsList: (order.orderItemVOs || []).map((goods) =>
  85. Object.assign({}, goods, {
  86. id: goods.id,
  87. thumb: goods.goodsPictureUrl,
  88. title: goods.goodsName,
  89. skuId: goods.skuId,
  90. spuId: goods.spuId,
  91. specs: (goods.specifications || []).map((s) => s.specValue),
  92. price: goods.tagPrice ? goods.tagPrice : goods.actualPrice, // 商品销售单价, 优先取限时活动价
  93. num: goods.buyQuantity,
  94. titlePrefixTags: goods.tagText ? [{ text: goods.tagText }] : [],
  95. buttons: goods.buttonVOs || [],
  96. }),
  97. ),
  98. buttons: order.buttonVOs || [],
  99. createTime: order.createTime,
  100. receiverAddress: this.composeAddress(order),
  101. groupInfoVo: order.groupInfoVo,
  102. };
  103. this.setData({
  104. order,
  105. _order,
  106. formatCreateTime: formatTime(parseFloat(`${order.createTime}`), 'YYYY-MM-DD HH:mm'), // 格式化订单创建时间
  107. countDownTime: this.computeCountDownTime(order),
  108. addressEditable:
  109. [OrderStatus.PENDING_PAYMENT, OrderStatus.PENDING_DELIVERY].includes(order.orderStatus) &&
  110. order.orderSubStatus !== -1, // 订单正在取消审核时不允许修改地址(但是返回的状态码与待发货一致)
  111. isPaid: !!order.paymentVO.paySuccessTime,
  112. invoiceStatus: this.datermineInvoiceStatus(order),
  113. invoiceDesc: order.invoiceDesc,
  114. invoiceType: order.invoiceVO?.invoiceType === 5 ? '电子普通发票' : '不开发票', //是否开票 0-不开 5-电子发票
  115. logisticsNodes: this.flattenNodes(order.trajectoryVos || []),
  116. });
  117. });
  118. },
  119. // 展开物流节点
  120. flattenNodes(nodes) {
  121. return (nodes || []).reduce((res, node) => {
  122. return (node.nodes || []).reduce((res1, subNode, index) => {
  123. res1.push({
  124. title: index === 0 ? node.title : '', // 子节点中仅第一个显示title
  125. desc: subNode.status,
  126. date: formatTime(+subNode.timestamp, 'YYYY-MM-DD HH:mm:ss'),
  127. icon: index === 0 ? LogisticsIconMap[node.code] || '' : '', // 子节点中仅第一个显示icon
  128. });
  129. return res1;
  130. }, res);
  131. }, []);
  132. },
  133. datermineInvoiceStatus(order) {
  134. // 1-已开票
  135. // 2-未开票(可补开)
  136. // 3-未开票
  137. // 4-门店不支持开票
  138. return order.invoiceStatus;
  139. },
  140. // 拼接省市区
  141. composeAddress(order) {
  142. return [
  143. //order.logisticsVO.receiverProvince,
  144. order.logisticsVO.receiverCity,
  145. order.logisticsVO.receiverCountry,
  146. order.logisticsVO.receiverArea,
  147. order.logisticsVO.receiverAddress,
  148. ]
  149. .filter((s) => !!s)
  150. .join(' ');
  151. },
  152. getStoreDetail() {
  153. fetchBusinessTime().then((res) => {
  154. const storeDetail = {
  155. storeTel: res.data.telphone,
  156. storeBusiness: res.data.businessTime.join('\n'),
  157. };
  158. this.setData({ storeDetail });
  159. });
  160. },
  161. // 仅对待支付状态计算付款倒计时
  162. // 返回时间若是大于2020.01.01,说明返回的是关闭时间,否则说明返回的直接就是剩余时间
  163. computeCountDownTime(order) {
  164. if (order.orderStatus !== OrderStatus.PENDING_PAYMENT) return null;
  165. return order.autoCancelTime > 1577808000000 ? order.autoCancelTime - Date.now() : order.autoCancelTime;
  166. },
  167. onCountDownFinish() {
  168. //this.setData({ countDownTime: -1 });
  169. const { countDownTime, order } = this.data;
  170. if (countDownTime > 0 || (order && order.groupInfoVo && order.groupInfoVo.residueTime > 0)) {
  171. this.onRefresh();
  172. }
  173. },
  174. onGoodsCardTap(e) {
  175. const { index } = e.currentTarget.dataset;
  176. const goods = this.data.order.orderItemVOs[index];
  177. wx.navigateTo({ url: `/pages/goods/details/index?spuId=${goods.spuId}` });
  178. },
  179. onEditAddressTap() {
  180. getAddressPromise()
  181. .then((address) => {
  182. this.setData({
  183. 'order.logisticsVO.receiverName': address.name,
  184. 'order.logisticsVO.receiverPhone': address.phone,
  185. '_order.receiverAddress': address.address,
  186. });
  187. })
  188. .catch(() => {});
  189. wx.navigateTo({
  190. url: `/pages/user/address/list/index?selectMode=1`,
  191. });
  192. },
  193. onOrderNumCopy() {
  194. wx.setClipboardData({
  195. data: this.data.order.orderNo,
  196. });
  197. },
  198. onDeliveryNumCopy() {
  199. wx.setClipboardData({
  200. data: this.data.order.logisticsVO.logisticsNo,
  201. });
  202. },
  203. onToInvoice() {
  204. wx.navigateTo({
  205. url: `/pages/order/invoice/index?orderNo=${this.data._order.orderNo}`,
  206. });
  207. },
  208. onSuppleMentInvoice() {
  209. wx.navigateTo({
  210. url: `/pages/order/receipt/index?orderNo=${this.data._order.orderNo}`,
  211. });
  212. },
  213. onDeliveryClick() {
  214. const logisticsData = {
  215. nodes: this.data.logisticsNodes,
  216. company: this.data.order.logisticsVO.logisticsCompanyName,
  217. logisticsNo: this.data.order.logisticsVO.logisticsNo,
  218. phoneNumber: this.data.order.logisticsVO.logisticsCompanyTel,
  219. };
  220. wx.navigateTo({
  221. url: `/pages/order/delivery-detail/index?data=${encodeURIComponent(JSON.stringify(logisticsData))}`,
  222. });
  223. },
  224. /** 跳转订单评价 */
  225. navToCommentCreate() {
  226. wx.navigateTo({
  227. url: `/pages/order/createComment/index?orderNo=${this.orderNo}`,
  228. });
  229. },
  230. /** 跳转拼团详情/分享页*/
  231. toGrouponDetail() {
  232. wx.showToast({ title: '点击了拼团' });
  233. },
  234. clickService() {
  235. Toast({
  236. context: this,
  237. selector: '#t-toast',
  238. message: '您点击了联系客服',
  239. });
  240. },
  241. onOrderInvoiceView() {
  242. wx.navigateTo({
  243. url: `/pages/order/invoice/index?orderNo=${this.orderNo}`,
  244. });
  245. },
  246. });