feat: update appraisal ordering and payment flows
This commit is contained in:
@@ -4,6 +4,7 @@ import { onLoad, onShow } from "@dcloudio/uni-app";
|
||||
import { appApi, type OrderDetailData, type UserAddressItem } from "../../api/app";
|
||||
import { orderDetailFallback } from "../../mocks/app";
|
||||
import { resolveErrorMessage, showErrorToast, showInfoToast } from "../../utils/feedback";
|
||||
import { launchOrderPayment, prepareMiniProgramPaymentIdentity } from "../../utils/payment";
|
||||
import { getPrivacyMode, maskOrderNo } from "../../utils/privacy";
|
||||
|
||||
const detail = ref<OrderDetailData>(orderDetailFallback);
|
||||
@@ -16,6 +17,8 @@ const addressOptions = ref<UserAddressItem[]>([]);
|
||||
const loading = ref(false);
|
||||
const pageReady = ref(false);
|
||||
const loadError = ref("");
|
||||
const paymentLaunching = ref(false);
|
||||
const cancelSubmitting = ref(false);
|
||||
|
||||
const serviceProviderText = computed(() =>
|
||||
detail.value.order_info.service_provider === "zhongjian" ? "中检鉴定" : "实物鉴定",
|
||||
@@ -68,8 +71,10 @@ const returnLogisticsStatusText = computed(
|
||||
() => detail.value.return_logistics?.provider_status_text || detail.value.return_logistics?.tracking_status_text || "",
|
||||
);
|
||||
const canEditReturnAddress = computed(() => detail.value.order_info.can_edit_return_address);
|
||||
const isPendingPayment = computed(() => detail.value.order_info.order_status === "pending_payment");
|
||||
|
||||
const heroTagClass = computed(() => {
|
||||
if (detail.value.order_info.order_status === "pending_payment") return "tag tag--warning";
|
||||
if (detail.value.order_info.order_status === "pending_supplement") return "tag tag--warning";
|
||||
if (detail.value.order_info.order_status === "pending_shipping" || detail.value.order_info.order_status === "pending_submission") {
|
||||
return "tag tag--accent";
|
||||
@@ -82,6 +87,8 @@ const heroTagClass = computed(() => {
|
||||
|
||||
const heroTagText = computed(() => {
|
||||
switch (detail.value.order_info.order_status) {
|
||||
case "pending_payment":
|
||||
return "待支付";
|
||||
case "pending_shipping":
|
||||
return shippingSubmitted.value ? "待签收" : "待寄送";
|
||||
case "pending_submission":
|
||||
@@ -93,6 +100,8 @@ const heroTagText = computed(() => {
|
||||
case "report_published":
|
||||
case "completed":
|
||||
return "已出报告";
|
||||
case "cancelled":
|
||||
return "已取消";
|
||||
default:
|
||||
return "处理中";
|
||||
}
|
||||
@@ -100,6 +109,8 @@ const heroTagText = computed(() => {
|
||||
|
||||
const focusTitle = computed(() => {
|
||||
switch (detail.value.order_info.order_status) {
|
||||
case "pending_payment":
|
||||
return "下一步请完成支付";
|
||||
case "pending_shipping":
|
||||
return shippingSubmitted.value ? "下一步等待鉴定中心签收" : "下一步请先寄送商品";
|
||||
case "pending_supplement":
|
||||
@@ -108,6 +119,8 @@ const focusTitle = computed(() => {
|
||||
return hasReturnAddress.value ? "下一步等待平台寄回物品" : "下一步请先确认寄回地址";
|
||||
case "completed":
|
||||
return returnReceived.value ? "本次订单已完成" : hasReturnLogistics.value ? "物品已寄回,请留意签收" : "结果已经可以查看";
|
||||
case "cancelled":
|
||||
return "订单已取消";
|
||||
default:
|
||||
return "当前订单正在继续处理";
|
||||
}
|
||||
@@ -119,6 +132,8 @@ const focusDesc = computed(() => {
|
||||
}
|
||||
|
||||
switch (detail.value.order_info.order_status) {
|
||||
case "pending_payment":
|
||||
return "支付成功后,订单会进入待寄送商品环节,平台再开始安排后续鉴定作业。";
|
||||
case "pending_shipping":
|
||||
return shippingSubmitted.value
|
||||
? "运单已登记成功,无需再次寄送商品,后续等待鉴定中心签收后继续处理。"
|
||||
@@ -133,6 +148,8 @@ const focusDesc = computed(() => {
|
||||
: hasReturnLogistics.value
|
||||
? "平台已登记回寄运单,可在本页查看回寄物流进度和最新节点。"
|
||||
: "正式报告已生成,可前往报告页查看结果并完成验真。";
|
||||
case "cancelled":
|
||||
return "该订单已取消,不会继续进入鉴定流程。如仍需服务,请重新发起鉴定。";
|
||||
default:
|
||||
return detail.value.order_info.status_desc;
|
||||
}
|
||||
@@ -157,6 +174,8 @@ const progressSectionDesc = computed(() =>
|
||||
|
||||
const supportHelpText = computed(() => {
|
||||
switch (detail.value.order_info.order_status) {
|
||||
case "pending_payment":
|
||||
return "如果支付页面无法打开或支付后状态未更新,可先刷新本页,也可以联系客服协助核查。";
|
||||
case "pending_supplement":
|
||||
return "如果暂时无法补图,可先联系客服说明情况,我们会协助判断下一步处理方式。";
|
||||
case "pending_shipping":
|
||||
@@ -173,6 +192,9 @@ const supportHelpText = computed(() => {
|
||||
|
||||
const primaryActionText = computed(() =>
|
||||
{
|
||||
if (isPendingPayment.value && paymentLaunching.value) {
|
||||
return "支付中...";
|
||||
}
|
||||
if (detail.value.order_info.order_status === "report_published" && !hasReturnAddress.value) {
|
||||
return "确认寄回地址";
|
||||
}
|
||||
@@ -183,6 +205,10 @@ const primaryActionText = computed(() =>
|
||||
},
|
||||
);
|
||||
|
||||
const secondaryActionText = computed(() =>
|
||||
isPendingPayment.value ? (cancelSubmitting.value ? "取消中..." : "取消订单") : detail.value.available_actions.secondary_action,
|
||||
);
|
||||
|
||||
async function fetchDetail() {
|
||||
if (!orderId.value) return;
|
||||
loading.value = true;
|
||||
@@ -205,6 +231,24 @@ async function fetchDetail() {
|
||||
}
|
||||
}
|
||||
|
||||
async function syncPendingPaymentStatus(silent = true) {
|
||||
if (!orderId.value || !isPendingPayment.value) return;
|
||||
try {
|
||||
const data = await appApi.getOrderPaymentStatus(orderId.value);
|
||||
if (data.order_status !== detail.value.order_info.order_status || data.payment_status !== detail.value.order_info.payment_status) {
|
||||
await fetchDetail();
|
||||
return;
|
||||
}
|
||||
detail.value.payment = data.payment;
|
||||
detail.value.order_info.display_status = data.display_status;
|
||||
detail.value.order_info.status_desc = data.order_status === "pending_payment" ? "请完成支付后继续本次鉴定服务" : detail.value.order_info.status_desc;
|
||||
} catch (error) {
|
||||
if (!silent) {
|
||||
showErrorToast(error, "支付状态同步失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchAddressOptions() {
|
||||
addressesLoading.value = true;
|
||||
try {
|
||||
@@ -217,7 +261,31 @@ async function fetchAddressOptions() {
|
||||
}
|
||||
}
|
||||
|
||||
function handlePrimaryAction() {
|
||||
async function payCurrentOrder() {
|
||||
if (paymentLaunching.value || !orderId.value) return;
|
||||
paymentLaunching.value = true;
|
||||
try {
|
||||
await prepareMiniProgramPaymentIdentity();
|
||||
const data = await appApi.retryOrderPayment(orderId.value);
|
||||
if (data.payment.status === "paid") {
|
||||
showInfoToast("订单已支付");
|
||||
await fetchDetail();
|
||||
return;
|
||||
}
|
||||
launchOrderPayment(data.payment);
|
||||
} catch (error) {
|
||||
showErrorToast(error, "支付发起失败");
|
||||
await syncPendingPaymentStatus(true);
|
||||
} finally {
|
||||
paymentLaunching.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function handlePrimaryAction() {
|
||||
if (isPendingPayment.value) {
|
||||
await payCurrentOrder();
|
||||
return;
|
||||
}
|
||||
if (detail.value.order_info.order_status === "report_published" && !hasReturnAddress.value) {
|
||||
openReturnAddressSheet();
|
||||
return;
|
||||
@@ -249,12 +317,46 @@ function handlePrimaryAction() {
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (!action) {
|
||||
uni.pageScrollTo({
|
||||
selector: "#order-progress",
|
||||
duration: 260,
|
||||
});
|
||||
return;
|
||||
}
|
||||
uni.showToast({
|
||||
title: action,
|
||||
icon: "none",
|
||||
});
|
||||
}
|
||||
|
||||
function handleSecondaryAction() {
|
||||
if (!isPendingPayment.value) {
|
||||
contactService();
|
||||
return;
|
||||
}
|
||||
if (cancelSubmitting.value) return;
|
||||
|
||||
uni.showModal({
|
||||
title: "取消订单",
|
||||
content: "确认取消这笔待支付订单吗?取消后不会进入鉴定流程。",
|
||||
success: async (result) => {
|
||||
if (!result.confirm) return;
|
||||
cancelSubmitting.value = true;
|
||||
try {
|
||||
await appApi.cancelOrder(detail.value.order_info.order_id);
|
||||
showInfoToast("订单已取消");
|
||||
await fetchDetail();
|
||||
} catch (error) {
|
||||
showErrorToast(error, "订单取消失败");
|
||||
await syncPendingPaymentStatus(true);
|
||||
} finally {
|
||||
cancelSubmitting.value = false;
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
function contactService() {
|
||||
uni.navigateTo({
|
||||
url: `/pages/support/create?ticket_type=order_issue&order_id=${detail.value.order_info.order_id}&prefill_title=${encodeURIComponent("订单问题咨询")}`,
|
||||
@@ -314,7 +416,10 @@ onLoad((options) => {
|
||||
}
|
||||
});
|
||||
|
||||
onShow(fetchDetail);
|
||||
onShow(async () => {
|
||||
await fetchDetail();
|
||||
await syncPendingPaymentStatus(true);
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -342,6 +447,7 @@ onShow(fetchDetail);
|
||||
<text class="meta-chip">订单号 {{ maskOrderNo(detail.order_info.order_no, privacyMode) }}</text>
|
||||
<text class="meta-chip">鉴定单号 {{ maskOrderNo(detail.order_info.appraisal_no, privacyMode) }}</text>
|
||||
<text class="meta-chip">{{ serviceProviderText }}</text>
|
||||
<text v-if="detail.order_info.price_package_name" class="meta-chip">{{ detail.order_info.price_package_name }}</text>
|
||||
<text v-if="detail.order_info.estimated_finish_time" class="meta-chip">预计 {{ detail.order_info.estimated_finish_time }}</text>
|
||||
</view>
|
||||
|
||||
@@ -563,7 +669,7 @@ onShow(fetchDetail);
|
||||
</view>
|
||||
|
||||
<view class="fixed-action-bar">
|
||||
<view class="btn btn--secondary" @click="contactService">联系客服</view>
|
||||
<view class="btn btn--secondary" @click="handleSecondaryAction">{{ secondaryActionText }}</view>
|
||||
<view class="btn btn--primary" @click="handlePrimaryAction">{{ primaryActionText }}</view>
|
||||
</view>
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ const heroStats = computed(() => {
|
||||
stats.completed += 1;
|
||||
continue;
|
||||
}
|
||||
if (item.order_status === "pending_supplement") {
|
||||
if (["pending_payment", "pending_supplement"].includes(item.order_status)) {
|
||||
stats.pending += 1;
|
||||
continue;
|
||||
}
|
||||
@@ -146,7 +146,7 @@ onShow(async () => {
|
||||
</view>
|
||||
<text
|
||||
class="order-card__status"
|
||||
:class="item.order_status === 'pending_supplement' ? 'order-card__status--warning' : ['report_published', 'completed'].includes(item.order_status) ? 'order-card__status--success' : 'order-card__status--info'"
|
||||
:class="['pending_payment', 'pending_supplement'].includes(item.order_status) ? 'order-card__status--warning' : ['report_published', 'completed'].includes(item.order_status) ? 'order-card__status--success' : 'order-card__status--info'"
|
||||
>
|
||||
{{ item.display_status }}
|
||||
</text>
|
||||
@@ -155,7 +155,10 @@ onShow(async () => {
|
||||
<view v-if="item.order_status === 'report_published'" class="order-card__desc">平台待安排寄回,请先确认寄回地址。</view>
|
||||
<view v-if="item.order_status === 'completed' && item.display_status === '物品已寄回'" class="order-card__desc">平台已回寄商品,请留意签收物流。</view>
|
||||
<view class="order-card__footer">
|
||||
<view class="order-card__provider">{{ item.service_provider === "zhongjian" ? "中检鉴定" : "安心验鉴定" }}</view>
|
||||
<view class="order-card__provider">
|
||||
{{ item.service_provider === "zhongjian" ? "中检鉴定" : "安心验鉴定" }}
|
||||
<text v-if="item.price_package_name"> / {{ item.price_package_name }}</text>
|
||||
</view>
|
||||
<view class="order-card__action">{{ item.primary_action }}</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
Reference in New Issue
Block a user