1
0
Code Issues Pull Requests Packages Projects Releases Wiki Activity GitHub Gitee

289 lines
8.3 KiB
JavaScript
Raw Normal View History

import { formatTime } from '../../../utils/util';
import { OrderStatus, LogisticsIconMap } from '../config';
import {
fetchBusinessTime,
fetchOrderDetail,
} from '../../../services/order/orderDetail';
import Toast from 'tdesign-miniprogram/toast/index';
import { getAddressPromise } from '../../usercenter/address/list/util';
Page({
data: {
pageLoading: true,
order: {}, // 后台返回的原始数据
_order: {}, // 内部使用和提供给 order-card 的数据
storeDetail: {},
countDownTime: null,
addressEditable: false,
backRefresh: false, // 用于接收其他页面back时的状态
formatCreateTime: '', //格式化订单创建时间
logisticsNodes: [],
/** 订单评论状态 */
orderHasCommented: true,
},
onLoad(query) {
this.orderNo = query.orderNo;
this.init();
this.navbar = this.selectComponent('#navbar');
this.pullDownRefresh = this.selectComponent('#wr-pull-down-refresh');
},
onShow() {
// 当从其他页面返回,并且 backRefresh 被置为 true 时,刷新数据
if (!this.data.backRefresh) return;
this.onRefresh();
this.setData({ backRefresh: false });
},
onPageScroll(e) {
this.pullDownRefresh && this.pullDownRefresh.onPageScroll(e);
},
onImgError(e) {
if (e.detail) {
console.error('img 加载失败');
}
},
// 页面初始化会展示pageLoading
init() {
this.setData({ pageLoading: true });
this.getStoreDetail();
this.getDetail()
.then(() => {
this.setData({ pageLoading: false });
})
.catch((e) => {
console.error(e);
});
},
// 页面刷新,展示下拉刷新
onRefresh() {
this.init();
// 如果上一页为订单列表,通知其刷新数据
const pages = getCurrentPages();
const lastPage = pages[pages.length - 2];
if (lastPage) {
lastPage.data.backRefresh = true;
}
},
// 页面刷新,展示下拉刷新
onPullDownRefresh_(e) {
const { callback } = e.detail;
return this.getDetail().then(() => callback && callback());
},
getDetail() {
const params = {
parameter: this.orderNo,
};
return fetchOrderDetail(params).then((res) => {
const order = res.data;
const _order = {
id: order.orderId,
orderNo: order.orderNo,
parentOrderNo: order.parentOrderNo,
storeId: order.storeId,
storeName: order.storeName,
status: order.orderStatus,
statusDesc: order.orderStatusName,
amount: order.paymentAmount,
totalAmount: order.goodsAmountApp,
logisticsNo: order.logisticsVO.logisticsNo,
goodsList: (order.orderItemVOs || []).map((goods) =>
Object.assign({}, goods, {
id: goods.id,
thumb: goods.goodsPictureUrl,
title: goods.goodsName,
skuId: goods.skuId,
spuId: goods.spuId,
specs: (goods.specifications || []).map((s) => s.specValue),
price: goods.tagPrice ? goods.tagPrice : goods.actualPrice, // 商品销售单价, 优先取限时活动价
num: goods.buyQuantity,
titlePrefixTags: goods.tagText ? [{ text: goods.tagText }] : [],
buttons: goods.buttonVOs || [],
}),
),
buttons: order.buttonVOs || [],
createTime: order.createTime,
receiverAddress: this.composeAddress(order),
groupInfoVo: order.groupInfoVo,
};
this.setData({
order,
_order,
formatCreateTime: formatTime(
parseFloat(`${order.createTime}`),
'YYYY-MM-DD HH:mm',
), // 格式化订单创建时间
countDownTime: this.computeCountDownTime(order),
addressEditable:
[OrderStatus.PENDING_PAYMENT, OrderStatus.PENDING_DELIVERY].includes(
order.orderStatus,
) && order.orderSubStatus !== -1, // 订单正在取消审核时不允许修改地址(但是返回的状态码与待发货一致)
isPaid: !!order.paymentVO.paySuccessTime,
invoiceStatus: this.datermineInvoiceStatus(order),
invoiceDesc: order.invoiceDesc,
invoiceType:
order.invoiceVO?.invoiceType === 5 ? '电子普通发票' : '不开发票', //是否开票 0-不开 5-电子发票
logisticsNodes: this.flattenNodes(order.trajectoryVos || []),
});
});
},
// 展开物流节点
flattenNodes(nodes) {
return (nodes || []).reduce((res, node) => {
return (node.nodes || []).reduce((res1, subNode, index) => {
res1.push({
title: index === 0 ? node.title : '', // 子节点中仅第一个显示title
desc: subNode.status,
date: formatTime(+subNode.timestamp, 'YYYY-MM-DD HH:mm:ss'),
icon: index === 0 ? LogisticsIconMap[node.code] || '' : '', // 子节点中仅第一个显示icon
});
return res1;
}, res);
}, []);
},
datermineInvoiceStatus(order) {
// 1-已开票
// 2-未开票(可补开)
// 3-未开票
// 4-门店不支持开票
return order.invoiceStatus;
},
// 拼接省市区
composeAddress(order) {
return [
//order.logisticsVO.receiverProvince,
order.logisticsVO.receiverCity,
order.logisticsVO.receiverCountry,
order.logisticsVO.receiverArea,
order.logisticsVO.receiverAddress,
]
.filter((s) => !!s)
.join(' ');
},
getStoreDetail() {
fetchBusinessTime().then((res) => {
const storeDetail = {
storeTel: res.data.telphone,
storeBusiness: res.data.businessTime.join('\n'),
};
this.setData({ storeDetail });
});
},
// 仅对待支付状态计算付款倒计时
// 返回时间若是大于2020.01.01,说明返回的是关闭时间,否则说明返回的直接就是剩余时间
computeCountDownTime(order) {
if (order.orderStatus !== OrderStatus.PENDING_PAYMENT) return null;
return order.autoCancelTime > 1577808000000
? order.autoCancelTime - Date.now()
: order.autoCancelTime;
},
onCountDownFinish() {
//this.setData({ countDownTime: -1 });
const { countDownTime, order } = this.data;
if (
countDownTime > 0 ||
(order && order.groupInfoVo && order.groupInfoVo.residueTime > 0)
) {
this.onRefresh();
}
},
onGoodsCardTap(e) {
const { index } = e.currentTarget.dataset;
const goods = this.data.order.orderItemVOs[index];
wx.navigateTo({ url: `/pages/goods/details/index?spuId=${goods.spuId}` });
},
onEditAddressTap() {
getAddressPromise()
.then((address) => {
this.setData({
'order.logisticsVO.receiverName': address.name,
'order.logisticsVO.receiverPhone': address.phone,
'_order.receiverAddress': address.address,
});
})
.catch(() => {});
wx.navigateTo({
url: `/pages/usercenter/address/list/index?selectMode=1`,
});
},
onOrderNumCopy() {
wx.setClipboardData({
data: this.data.order.orderNo,
});
},
onDeliveryNumCopy() {
wx.setClipboardData({
data: this.data.order.logisticsVO.logisticsNo,
});
},
onToInvoice() {
wx.navigateTo({
url: `/pages/order/invoice/index?orderNo=${this.data._order.orderNo}`,
});
},
onSuppleMentInvoice() {
wx.navigateTo({
url: `/pages/order/receipt/index?orderNo=${this.data._order.orderNo}`,
});
},
onDeliveryClick() {
const logisticsData = {
nodes: this.data.logisticsNodes,
company: this.data.order.logisticsVO.logisticsCompanyName,
logisticsNo: this.data.order.logisticsVO.logisticsNo,
phoneNumber: this.data.order.logisticsVO.logisticsCompanyTel,
};
wx.navigateTo({
url: `/pages/order/delivery-detail/index?data=${encodeURIComponent(
JSON.stringify(logisticsData),
)}`,
});
},
/** 跳转订单评价 */
navToCommentCreate() {
wx.navigateTo({
url: `/pages/order/createComment/index?orderNo=${this.orderNo}`,
});
},
/** 跳转拼团详情/分享页*/
toGrouponDetail() {
wx.showToast({ title: '点击了拼团' });
},
clickService() {
Toast({
context: this,
selector: '#t-toast',
message: '您点击了联系客服',
});
},
onOrderInvoiceView() {
wx.navigateTo({
url: `/pages/order/invoice/index?orderNo=${this.orderNo}`,
});
},
});