feat: update appraisal ordering and payment flows

This commit is contained in:
wushumin
2026-06-03 18:14:40 +08:00
parent 0838db5aba
commit 6383ec5a2a
50 changed files with 6143 additions and 988 deletions

View File

@@ -10,6 +10,7 @@ import {
type AdminOrderDetail,
type AdminOrderListItem,
type AdminOrderWarehouseOption,
type AdminServicePricePackage,
} from "../../api/admin";
import OrderStatusTag from "../../components/OrderStatusTag.vue";
import { recognizeReturnAddress } from "../../utils/address-recognition";
@@ -36,7 +37,7 @@ const defaultExpressCompany = ref("");
const manualDialogVisible = ref(false);
const manualSubmitting = ref(false);
const manualMetaLoading = ref(false);
const manualMeta = ref<AdminManualOrderMeta>({ categories: [], brands: [] });
const manualMeta = ref<AdminManualOrderMeta>({ categories: [], brands: [], service_price_packages: [] });
const manualForm = ref<AdminManualOrderCreatePayload>(createManualOrderForm());
const manualAddressRecognitionText = ref("");
@@ -150,11 +151,16 @@ const expressCompanySelectOptions = computed(() => {
...expressCompanyOptions.value,
];
});
const manualServicePackages = computed<AdminServicePricePackage[]>(() =>
manualMeta.value.service_price_packages.find((item) => item.service_provider === manualForm.value.service_provider)?.packages.filter((item) => item.is_enabled) || [],
);
let returnRecognitionTimer: ReturnType<typeof setTimeout> | undefined;
function createManualOrderForm(): AdminManualOrderCreatePayload {
return {
service_provider: "anxinyan",
price_package_id: 0,
price_package_code: "",
product_info: {
category_id: 0,
brand_id: 0,
@@ -214,6 +220,7 @@ async function ensureManualMeta() {
try {
const response = await adminApi.getManualOrderMeta();
manualMeta.value = response.data;
applyManualDefaultPackage(true);
} catch (error) {
console.error(error);
ElMessage.error("补录订单选项加载失败");
@@ -222,11 +229,24 @@ async function ensureManualMeta() {
}
}
function applyManualDefaultPackage(force = false) {
const current = manualServicePackages.value.find((item) => item.id === manualForm.value.price_package_id);
if (current && !force) {
manualForm.value.price_package_code = current.package_code;
return;
}
const target = manualServicePackages.value.find((item) => item.is_default) || manualServicePackages.value[0];
manualForm.value.price_package_id = target?.id || 0;
manualForm.value.price_package_code = target?.package_code || "";
}
async function openManualDialog() {
manualForm.value = createManualOrderForm();
manualAddressRecognitionText.value = "";
manualDialogVisible.value = true;
await ensureManualMeta();
applyManualDefaultPackage(true);
}
async function ensureExpressCompanyOptions() {
@@ -260,6 +280,10 @@ function applyRecognizedManualAddress() {
function validateManualForm() {
const form = manualForm.value;
if (!form.price_package_id) {
ElMessage.warning("请选择价格套餐");
return false;
}
if (!form.product_info.category_id) {
ElMessage.warning("请选择品类");
return false;
@@ -474,6 +498,10 @@ watch(returnTrackingNo, () => {
}
});
watch(() => manualForm.value.service_provider, () => {
applyManualDefaultPackage(true);
});
onBeforeUnmount(() => {
if (returnRecognitionTimer) {
clearTimeout(returnRecognitionTimer);
@@ -523,6 +551,9 @@ onMounted(fetchOrders);
<el-table-column prop="appraisal_no" label="鉴定单号" min-width="180" />
<el-table-column prop="product_name" label="商品名称" min-width="220" />
<el-table-column prop="service_provider_text" label="服务类型" min-width="120" />
<el-table-column prop="price_package_name" label="价格套餐" min-width="150">
<template #default="{ row }">{{ row.price_package_name || "-" }}</template>
</el-table-column>
<el-table-column label="下单渠道" min-width="150">
<template #default="{ row }">
<span>{{ row.source_channel_text }}</span>
@@ -615,6 +646,10 @@ onMounted(fetchOrders);
<div class="order-detail-item__label">服务类型</div>
<div class="order-detail-item__value">{{ detail.order_info.service_provider_text }}</div>
</div>
<div class="order-detail-item">
<div class="order-detail-item__label">价格套餐</div>
<div class="order-detail-item__value">{{ detail.order_info.price_package_name || "-" }}</div>
</div>
<div class="order-detail-item">
<div class="order-detail-item__label">下单渠道</div>
<div class="order-detail-item__value">{{ detail.order_info.source_channel_text || "-" }}</div>
@@ -966,6 +1001,21 @@ onMounted(fetchOrders);
<el-option label="中检鉴定" value="zhongjian" />
</el-select>
</el-form-item>
<el-form-item label="价格套餐">
<el-select
v-model="manualForm.price_package_id"
style="width: 100%"
:disabled="manualServicePackages.length === 0"
@change="applyManualDefaultPackage(false)"
>
<el-option
v-for="item in manualServicePackages"
:key="item.id"
:label="`${item.package_name} / ¥${item.price}`"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="品类">
<el-select v-model="manualForm.product_info.category_id" filterable style="width: 100%">
<el-option v-for="item in manualMeta.categories" :key="item.id" :label="item.name" :value="item.id" />