From e24160753566e1b2f60490e15fb79abcd8b6ed1e Mon Sep 17 00:00:00 2001 From: yml2213 Date: Thu, 16 Jul 2026 20:47:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=8F=B7=E4=B8=BB=E4=B8=8E?= =?UTF-8?q?=E7=A7=9F=E5=AE=A2=E6=9F=A5=E7=9C=8B=E8=87=AA=E5=B7=B1=E7=9A=84?= =?UTF-8?q?=E5=8F=91=E5=B8=83/=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增卖家商品详情页;订单详情底部增加可折叠账号快照,已完成订单展示结账明细。 --- backend/internal/modules/order/presenter.go | 41 +- .../components/OrderAccountSnapshot.vue | 503 +++++++++++++ frontend/src/features/orders/index.ts | 1 + .../orders/views/MobileOrderDetailView.vue | 55 +- .../features/orders/views/OrderDetailView.vue | 11 +- .../views/MobileSellerListingDetailView.vue | 661 ++++++++++++++++++ .../seller/views/MobileSellerListingsView.vue | 84 ++- .../seller/views/SellerListingDetailView.vue | 515 ++++++++++++++ .../seller/views/SellerListingsView.vue | 78 ++- frontend/src/router/mobileHost.ts | 4 + frontend/src/router/mobileRoutes.ts | 6 + frontend/src/router/sellerRoutes.ts | 6 + 12 files changed, 1870 insertions(+), 95 deletions(-) create mode 100644 frontend/src/features/orders/components/OrderAccountSnapshot.vue create mode 100644 frontend/src/features/seller/views/MobileSellerListingDetailView.vue create mode 100644 frontend/src/features/seller/views/SellerListingDetailView.vue diff --git a/backend/internal/modules/order/presenter.go b/backend/internal/modules/order/presenter.go index 21eab22..1f34bf7 100644 --- a/backend/internal/modules/order/presenter.go +++ b/backend/internal/modules/order/presenter.go @@ -231,10 +231,43 @@ func sanitizeOrderSnapshot(snapshot *datatypes.JSON, role string) { return } } - breakdown, _ := summary["price_breakdown"].(map[string]any) - if role == "owner" && breakdown != nil { - if sellerRatio := readJSONNumber(breakdown["seller_ratio"]); sellerRatio > 0 { - summary["publish_ratio"] = sellerRatio + // price_breakdown 含双方比例与加价明细,仅把当前角色可见的价格字段摊平到 summary,再删除原对象。 + if breakdown, ok := summary["price_breakdown"].(map[string]any); ok && breakdown != nil { + switch role { + case "owner": + if v := readJSONNumber(breakdown["seller_ratio"]); v > 0 { + summary["publish_ratio"] = v + summary["display_ratio"] = v + } + if v := readJSONNumber(breakdown["seller_reference_ratio"]); v > 0 { + summary["reference_ratio"] = v + } + if v := readJSONNumber(breakdown["seller_total_price"]); v > 0 { + summary["display_total_price"] = v + } + if v := readJSONNumber(breakdown["seller_coin_base_price"]); v > 0 { + summary["display_coin_base_price"] = v + } + if v := readJSONNumber(breakdown["accelerated_sale_ratio"]); v > 0 { + summary["accelerated_sale_ratio"] = v + } + case "renter": + if v := readJSONNumber(breakdown["buyer_ratio"]); v > 0 { + summary["publish_ratio"] = v + summary["display_ratio"] = v + } + if v := readJSONNumber(breakdown["buyer_total_price"]); v > 0 { + summary["display_total_price"] = v + } + if v := readJSONNumber(breakdown["buyer_coin_base_price"]); v > 0 { + summary["display_coin_base_price"] = v + } + } + if v := readJSONNumber(breakdown["consumable_price"]); v > 0 { + summary["consumable_price"] = v + } + if v := readJSONNumber(breakdown["daily_loss_ratio_adjustment"]); v != 0 { + summary["daily_loss_ratio_adjustment"] = v } } delete(summary, "price_breakdown") diff --git a/frontend/src/features/orders/components/OrderAccountSnapshot.vue b/frontend/src/features/orders/components/OrderAccountSnapshot.vue new file mode 100644 index 0000000..05518c1 --- /dev/null +++ b/frontend/src/features/orders/components/OrderAccountSnapshot.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/frontend/src/features/orders/index.ts b/frontend/src/features/orders/index.ts index 6e8d803..225c944 100644 --- a/frontend/src/features/orders/index.ts +++ b/frontend/src/features/orders/index.ts @@ -1,6 +1,7 @@ // Orders 模块统一导出 export * from './api/orders' export * from './composables/useOrderSnapshot' +export { default as OrderAccountSnapshot } from './components/OrderAccountSnapshot.vue' export { default as OrderCheckoutSummary } from './components/OrderCheckoutSummary.vue' export { default as OrderHandoffTimeline } from './components/OrderHandoffTimeline.vue' export { default as OrderResourceUsageEditor } from './components/OrderResourceUsageEditor.vue' diff --git a/frontend/src/features/orders/views/MobileOrderDetailView.vue b/frontend/src/features/orders/views/MobileOrderDetailView.vue index 9a8cfc7..4707fc1 100644 --- a/frontend/src/features/orders/views/MobileOrderDetailView.vue +++ b/frontend/src/features/orders/views/MobileOrderDetailView.vue @@ -8,13 +8,9 @@ import MobilePayWaySelectPopup from '@/features/orders/components/MobilePayWaySe import { useOrderActions, CONFIRMABLE_ACTIONS } from '@/features/orders/composables/useOrderActions' import { useMobilePaymentCashier } from '@/features/orders/composables/useMobilePaymentCashier' import { useMobilePayWaySelect } from '@/features/orders/composables/useMobilePayWaySelect' +import { amountYuan, money } from '@/features/orders/composables/useOrderSnapshot' import { - amountYuan, - money, - readAssetSummary as readOrderAssetSummary, - readSnapshot as readOrderSnapshot, -} from '@/features/orders/composables/useOrderSnapshot' -import { + OrderAccountSnapshot, OrderCheckoutSummary, OrderHandoffTimeline, OrderResourceUsageEditor, @@ -116,20 +112,11 @@ const { onCreateDisputeSuccess: () => (showDisputePopup.value = false), }) -// Mobile 独有 UI 状态:折叠面板、各类 popup 显隐。 -const activeNames = ref([]) +// Mobile 独有 UI 状态:各类 popup 显隐。 const showDisputePopup = ref(false) const showCounterPopup = ref(false) const showRejectPopup = ref(false) -// 账号快照展示(PC 不用,保留在本视图)。 -function readSnapshot() { - return readOrderSnapshot(order.value) as Record | null -} -function readAssetSummary() { - return readOrderAssetSummary(order.value) as Record | null -} - // 状态颜色映射(vant 标签主题)。 function getStatusTagType(status: string) { if (['completed', 'received'].includes(status)) return 'success' @@ -336,11 +323,16 @@ async function copyListingCode() { @submit="handleSubmitCheckout" /> - + - -
- - - - - - -
+
diff --git a/frontend/src/features/orders/views/OrderDetailView.vue b/frontend/src/features/orders/views/OrderDetailView.vue index 2fa103f..b1844b9 100644 --- a/frontend/src/features/orders/views/OrderDetailView.vue +++ b/frontend/src/features/orders/views/OrderDetailView.vue @@ -7,6 +7,7 @@ import { ChatDotRound, CopyDocument, Loading, Service } from '@element-plus/icon import { amountYuan, money, + OrderAccountSnapshot, OrderCheckoutSummary, OrderHandoffTimeline, OrderResourceUsageEditor, @@ -467,7 +468,12 @@ watch([() => route.query.focus, order, loading], () => { v-if=" order && order.checkout && - ['pending_checkout_confirm', 'pending_checkout_accept'].includes(order.status) + [ + 'pending_checkout_confirm', + 'pending_checkout_accept', + 'checkout_disputing', + 'completed', + ].includes(order.status) " :order="order" :is-owner="isOwner" @@ -569,6 +575,9 @@ watch([() => route.query.focus, order, loading], () => { >
+ + + diff --git a/frontend/src/features/seller/views/MobileSellerListingDetailView.vue b/frontend/src/features/seller/views/MobileSellerListingDetailView.vue new file mode 100644 index 0000000..cf7d547 --- /dev/null +++ b/frontend/src/features/seller/views/MobileSellerListingDetailView.vue @@ -0,0 +1,661 @@ + + + + + diff --git a/frontend/src/features/seller/views/MobileSellerListingsView.vue b/frontend/src/features/seller/views/MobileSellerListingsView.vue index e5e7c54..0bacf9d 100644 --- a/frontend/src/features/seller/views/MobileSellerListingsView.vue +++ b/frontend/src/features/seller/views/MobileSellerListingsView.vue @@ -142,6 +142,10 @@ function goEdit(row: Listing) { router.push(`/m/seller/listings/${row.id}/edit`) } +function goDetail(row: Listing) { + router.push(`/m/seller/listings/${row.id}`) +} + function canSubmit(row: Listing) { return !isTerminalListing(row) && !isPendingReview(row) && row.status !== 'published' } @@ -244,7 +248,7 @@ function isPendingReview(row: Listing) {
- @@ -262,35 +266,47 @@ function isPendingReview(row: Listing) {
- -

{{ item.title }}

+ +