From 58f11b2043fd358899d31f7ed924a592b6c5cb76 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sun, 16 Aug 2026 20:00:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BA=BF=E4=B8=8B=E7=BB=93?= =?UTF-8?q?=E7=AE=97=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/internal/modules/order/dto.go | 15 +- .../internal/modules/order/handler_parse.go | 15 +- backend/internal/modules/order/queries.go | 3 + backend/internal/modules/pickup/dto.go | 13 +- .../internal/modules/pickup/handler_parse.go | 13 +- backend/internal/modules/pickup/repository.go | 3 + .../modules/pickup/repository_test.go | 26 +++ .../src/features/admin/api/adminPickup.ts | 1 + .../features/admin/views/AdminOrdersView.vue | 15 ++ .../features/admin/views/AdminPickupView.vue | 166 ++++++++++++++---- frontend/src/features/orders/api/orders.ts | 1 + 11 files changed, 212 insertions(+), 59 deletions(-) diff --git a/backend/internal/modules/order/dto.go b/backend/internal/modules/order/dto.go index 2f3f218..067deff 100644 --- a/backend/internal/modules/order/dto.go +++ b/backend/internal/modules/order/dto.go @@ -150,13 +150,14 @@ type OfflineSettlementRequest struct { } type AdminOrderQuery struct { - Page int - PageSize int - Keyword string - Status string - HandoffStatus string - HandoffMode string - SettlementStatus string + Page int + PageSize int + Keyword string + Status string + HandoffStatus string + HandoffMode string + SettlementStatus string + OfflineSettlementStatus string } type AuditMeta = auditlog.Meta diff --git a/backend/internal/modules/order/handler_parse.go b/backend/internal/modules/order/handler_parse.go index ca0e737..bc54a53 100644 --- a/backend/internal/modules/order/handler_parse.go +++ b/backend/internal/modules/order/handler_parse.go @@ -55,12 +55,13 @@ func parsePagination(c *gin.Context) (int, int) { func parseAdminOrderQuery(c *gin.Context) AdminOrderQuery { page, pageSize := parsePagination(c) return AdminOrderQuery{ - Page: page, - PageSize: pageSize, - Keyword: strings.TrimSpace(c.Query("keyword")), - Status: strings.TrimSpace(c.Query("status")), - HandoffStatus: strings.TrimSpace(c.Query("handoff_status")), - HandoffMode: strings.TrimSpace(c.Query("handoff_mode")), - SettlementStatus: strings.TrimSpace(c.Query("settlement_status")), + Page: page, + PageSize: pageSize, + Keyword: strings.TrimSpace(c.Query("keyword")), + Status: strings.TrimSpace(c.Query("status")), + HandoffStatus: strings.TrimSpace(c.Query("handoff_status")), + HandoffMode: strings.TrimSpace(c.Query("handoff_mode")), + SettlementStatus: strings.TrimSpace(c.Query("settlement_status")), + OfflineSettlementStatus: strings.TrimSpace(c.Query("offline_settlement_status")), } } diff --git a/backend/internal/modules/order/queries.go b/backend/internal/modules/order/queries.go index 724381e..1679881 100644 --- a/backend/internal/modules/order/queries.go +++ b/backend/internal/modules/order/queries.go @@ -93,6 +93,9 @@ func applyAdminOrderFilters(db *gorm.DB, query AdminOrderQuery) *gorm.DB { if query.SettlementStatus != "" { db = db.Where("o.settlement_status = ?", query.SettlementStatus) } + if query.OfflineSettlementStatus != "" { + db = db.Where("COALESCE(NULLIF(o.offline_settlement_status, ''), 'none') = ?", query.OfflineSettlementStatus) + } if keyword := strings.TrimSpace(query.Keyword); keyword != "" { like := "%" + keyword + "%" if id, err := strconv.ParseUint(keyword, 10, 64); err == nil { diff --git a/backend/internal/modules/pickup/dto.go b/backend/internal/modules/pickup/dto.go index 8713a4b..6117c2d 100644 --- a/backend/internal/modules/pickup/dto.go +++ b/backend/internal/modules/pickup/dto.go @@ -136,12 +136,13 @@ type CancelRequest struct { } type AdminPickupQuery struct { - Page int - PageSize int - Keyword string - Status string - ShopName string - AccountSource string + Page int + PageSize int + Keyword string + Status string + ShopName string + AccountSource string + OfflineSettlementStatus string } type SellerPickupQuery struct { diff --git a/backend/internal/modules/pickup/handler_parse.go b/backend/internal/modules/pickup/handler_parse.go index cab57e2..f39e66c 100644 --- a/backend/internal/modules/pickup/handler_parse.go +++ b/backend/internal/modules/pickup/handler_parse.go @@ -54,12 +54,13 @@ func parsePagination(c *gin.Context) (int, int) { func parseAdminQuery(c *gin.Context) AdminPickupQuery { page, pageSize := parsePagination(c) return AdminPickupQuery{ - Page: page, - PageSize: pageSize, - Keyword: c.Query("keyword"), - Status: c.Query("status"), - ShopName: c.Query("shop_name"), - AccountSource: c.Query("account_source"), + Page: page, + PageSize: pageSize, + Keyword: c.Query("keyword"), + Status: c.Query("status"), + ShopName: c.Query("shop_name"), + AccountSource: c.Query("account_source"), + OfflineSettlementStatus: c.Query("offline_settlement_status"), } } diff --git a/backend/internal/modules/pickup/repository.go b/backend/internal/modules/pickup/repository.go index 13d9c8b..4ee045a 100644 --- a/backend/internal/modules/pickup/repository.go +++ b/backend/internal/modules/pickup/repository.go @@ -687,6 +687,9 @@ func (r *Repository) ListAdmin(ctx context.Context, query AdminPickupQuery) (*Pa if accountSource := strings.TrimSpace(query.AccountSource); accountSource != "" { db = db.Where("p.account_source = ?", accountSource) } + if offlineSettlementStatus := strings.TrimSpace(query.OfflineSettlementStatus); offlineSettlementStatus != "" { + db = db.Where("p.offline_settlement_status = ?", offlineSettlementStatus) + } if kw := strings.TrimSpace(query.Keyword); kw != "" { like := "%" + kw + "%" db = db.Where( diff --git a/backend/internal/modules/pickup/repository_test.go b/backend/internal/modules/pickup/repository_test.go index 6d936e4..589ebb1 100644 --- a/backend/internal/modules/pickup/repository_test.go +++ b/backend/internal/modules/pickup/repository_test.go @@ -175,6 +175,32 @@ func TestRepositoryListAdminFiltersOwnerPhone(t *testing.T) { } } +func TestRepositoryListAdminFiltersOfflineSettlementStatus(t *testing.T) { + repo, db := newPickupTestRepo(t) + first := seedPickup(t, db, StatusCompleted) + if err := db.Model(&first).Updates(map[string]any{ + "settlement_mode": SettlementModePlatformManaged, + "offline_settlement_status": OfflineSettlementStatusPending, + }).Error; err != nil { + t.Fatalf("设置待线下结算提号失败: %v", err) + } + second := first + second.ID = 0 + second.PickupNo = "PK-OFFLINE-SETTLED-001" + second.OfflineSettlementStatus = OfflineSettlementStatusSettled + if err := db.Create(&second).Error; err != nil { + t.Fatalf("创建已线下结算提号失败: %v", err) + } + + result, err := repo.ListAdmin(t.Context(), AdminPickupQuery{OfflineSettlementStatus: OfflineSettlementStatusPending}) + if err != nil { + t.Fatalf("ListAdmin() error = %v", err) + } + if result.Total != 1 || len(result.Items) != 1 || result.Items[0].OfflineSettlementStatus != OfflineSettlementStatusPending { + t.Fatalf("待线下结算筛选结果 = %+v", result) + } +} + func TestRepositoryListShopNamesReturnsDistinctPlatformOptions(t *testing.T) { repo, db := newPickupTestRepo(t) first := seedPickup(t, db, StatusPickingUp) diff --git a/frontend/src/features/admin/api/adminPickup.ts b/frontend/src/features/admin/api/adminPickup.ts index 3800a76..daff9f5 100644 --- a/frontend/src/features/admin/api/adminPickup.ts +++ b/frontend/src/features/admin/api/adminPickup.ts @@ -127,6 +127,7 @@ export interface AdminPickupListQuery { status?: string shop_name?: string account_source?: PickupAccountSource | '' + offline_settlement_status?: PickupOfflineSettlementStatus | '' } function cleanParams(query: object) { diff --git a/frontend/src/features/admin/views/AdminOrdersView.vue b/frontend/src/features/admin/views/AdminOrdersView.vue index a16a806..0d6c5c6 100644 --- a/frontend/src/features/admin/views/AdminOrdersView.vue +++ b/frontend/src/features/admin/views/AdminOrdersView.vue @@ -21,6 +21,7 @@ const filters = reactive({ handoff_status: '', handoff_mode: '', settlement_status: '', + offline_settlement_status: '', }) const loading = ref(false) const orders = ref([]) @@ -92,6 +93,7 @@ async function loadOrders() { handoff_status: filters.handoff_status, handoff_mode: filters.handoff_mode, settlement_status: filters.settlement_status, + offline_settlement_status: filters.offline_settlement_status, }) orders.value = result.items total.value = result.total @@ -115,6 +117,7 @@ function resetFilters() { filters.handoff_status = '' filters.handoff_mode = '' filters.settlement_status = '' + filters.offline_settlement_status = '' void queryOrders() } @@ -225,6 +228,18 @@ function isPlatformManaged(row: Order) { /> + + + + + + 查询 -
- - - - - - - - - - - - - - 查询 - 刷新 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 查询 + 重置 + 刷新 + +
@@ -872,6 +908,70 @@ function listingOptionLabel(item: AvailableListing) { font-size: 12px; color: #64748b; } +.pickup-filter-bar { + margin-bottom: 16px; +} + +.pickup-filter-bar :deep(.el-form) { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 10px 16px; +} + +.pickup-filter-bar :deep(.el-form-item) { + margin: 0; +} + +.pickup-filter-bar :deep(.el-form-item__label) { + padding-right: 7px; + color: #52616f; + font-size: 13px; +} + +.pickup-filter-bar :deep(.el-select) { + width: 128px; +} + +.pickup-filter-bar :deep(.el-form-item:nth-child(3) .el-select) { + width: 150px; +} + +.pickup-filter-bar :deep(.el-form-item:nth-child(4) .el-select) { + width: 175px; +} + +.pickup-keyword-filter :deep(.el-input) { + width: 280px; +} + +.pickup-filter-actions :deep(.el-form-item__content) { + gap: 8px; +} + +@media (max-width: 900px) { + .pickup-filter-bar :deep(.el-form) { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .pickup-filter-bar :deep(.el-form-item), + .pickup-filter-bar :deep(.el-select), + .pickup-keyword-filter :deep(.el-input) { + width: 100%; + } + + .pickup-filter-bar :deep(.el-form-item__content) { + min-width: 0; + flex: 1; + } +} + +@media (max-width: 600px) { + .pickup-filter-bar :deep(.el-form) { + grid-template-columns: minmax(0, 1fr); + } +} .text-muted { color: #94a3b8; } diff --git a/frontend/src/features/orders/api/orders.ts b/frontend/src/features/orders/api/orders.ts index 35a63d3..375c0e8 100644 --- a/frontend/src/features/orders/api/orders.ts +++ b/frontend/src/features/orders/api/orders.ts @@ -196,6 +196,7 @@ export interface AdminOrderQuery { handoff_status?: string handoff_mode?: string settlement_status?: string + offline_settlement_status?: 'pending' | 'settled' | '' } interface SubmitCheckoutRequest {