From 0f67f6cc494bf878a041467abd2cbe1f8a466607 Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Sat, 14 Mar 2026 17:46:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A7=92=E6=9D=80?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E5=8F=91=E5=B8=83=E5=90=8E=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=9C=AA=E6=9B=B4=E6=96=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:publishFlashSale() 只做了缓存预热,从未调用 updateStatus() 将状态从1(未开始)更新为2(进行中),导致发布后UI无变化, 且活动无法被"进行中"查询找到。 修复内容: - publishFlashSale() 添加 updateStatus(id, 2) 和缓存更新 - 简化 getFlashSaleList 状态查询,直接按 status 字段过滤 - 新增 findByStatus 仓库方法 - 前后端全面支持 PAUSED(status=4) 状态 - 修复管理后台"恢复"按钮错误显示在"已结束"状态上 Co-Authored-By: Claude Opus 4.6 --- .../src/api/modules/flashsale.ts | 1 + .../src/components/business/FlashSaleCard.vue | 2 ++ .../src/pages/admin/flashsales.vue | 7 +++++-- flash-sale-frontend/src/types/api.d.ts | 2 +- flash-sale-frontend/src/utils/normalizers.ts | 1 + .../repository/FlashSaleRepository.java | 5 +++++ .../service/FlashSaleService.java | 20 +++++++------------ 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/flash-sale-frontend/src/api/modules/flashsale.ts b/flash-sale-frontend/src/api/modules/flashsale.ts index fa35e96..ff6ef30 100644 --- a/flash-sale-frontend/src/api/modules/flashsale.ts +++ b/flash-sale-frontend/src/api/modules/flashsale.ts @@ -6,6 +6,7 @@ const flashSaleStatusToCode = (status?: string) => { if (status === 'UPCOMING') return 1 if (status === 'ACTIVE') return 2 if (status === 'ENDED') return 3 + if (status === 'PAUSED') return 4 return undefined } diff --git a/flash-sale-frontend/src/components/business/FlashSaleCard.vue b/flash-sale-frontend/src/components/business/FlashSaleCard.vue index 3ae082a..5daea4a 100644 --- a/flash-sale-frontend/src/components/business/FlashSaleCard.vue +++ b/flash-sale-frontend/src/components/business/FlashSaleCard.vue @@ -61,6 +61,7 @@ const statusType = computed(() => { case 'UPCOMING': return 'warning' case 'ACTIVE': return 'danger' case 'ENDED': return 'info' + case 'PAUSED': return 'warning' default: return 'info' } }) @@ -70,6 +71,7 @@ const statusText = computed(() => { case 'UPCOMING': return '即将开始' case 'ACTIVE': return '秒杀中' case 'ENDED': return '已结束' + case 'PAUSED': return '已暂停' default: return '未知' } }) diff --git a/flash-sale-frontend/src/pages/admin/flashsales.vue b/flash-sale-frontend/src/pages/admin/flashsales.vue index 12033d3..dc62d10 100644 --- a/flash-sale-frontend/src/pages/admin/flashsales.vue +++ b/flash-sale-frontend/src/pages/admin/flashsales.vue @@ -43,6 +43,7 @@ + 搜索 @@ -88,8 +89,8 @@ 编辑 发布 暂停 - 恢复 - 结束 + 恢复 + 结束 删除 @@ -253,6 +254,7 @@ const getStatusText = (status: string) => { const map: Record = { UPCOMING: '即将开始', ACTIVE: '进行中', + PAUSED: '已暂停', ENDED: '已结束', } return map[status] || status @@ -262,6 +264,7 @@ const getStatusType = (status: string) => { const map: Record = { UPCOMING: 'warning', ACTIVE: 'danger', + PAUSED: 'warning', ENDED: 'info', } return map[status] || 'info' diff --git a/flash-sale-frontend/src/types/api.d.ts b/flash-sale-frontend/src/types/api.d.ts index 750f910..8520b18 100644 --- a/flash-sale-frontend/src/types/api.d.ts +++ b/flash-sale-frontend/src/types/api.d.ts @@ -83,7 +83,7 @@ export interface FlashSale { remainingStock: number startTime: string endTime: string - status: 'UPCOMING' | 'ACTIVE' | 'ENDED' + status: 'UPCOMING' | 'ACTIVE' | 'ENDED' | 'PAUSED' limitPerUser: number description?: string createdAt: string diff --git a/flash-sale-frontend/src/utils/normalizers.ts b/flash-sale-frontend/src/utils/normalizers.ts index 02d261a..716fb11 100644 --- a/flash-sale-frontend/src/utils/normalizers.ts +++ b/flash-sale-frontend/src/utils/normalizers.ts @@ -59,6 +59,7 @@ export const mapFlashSaleStatus = (status: number | string): FlashSale['status'] if (value === 'UPCOMING' || value === 1) return 'UPCOMING' if (value === 'ACTIVE' || value === 2) return 'ACTIVE' if (value === 'ENDED' || value === 3) return 'ENDED' + if (value === 'PAUSED' || value === 4) return 'PAUSED' return 'UPCOMING' } diff --git a/src/main/java/com/org/flashsalesystem/repository/FlashSaleRepository.java b/src/main/java/com/org/flashsalesystem/repository/FlashSaleRepository.java index 0f195e4..83efe97 100644 --- a/src/main/java/com/org/flashsalesystem/repository/FlashSaleRepository.java +++ b/src/main/java/com/org/flashsalesystem/repository/FlashSaleRepository.java @@ -71,6 +71,11 @@ public interface FlashSaleRepository extends JpaRepository { @Query("SELECT f FROM FlashSale f WHERE f.endTime <= :now OR f.status = 3") Page findEndedFlashSales(@Param("now") LocalDateTime now, Pageable pageable); + /** + * 按状态分页查找秒杀活动 + */ + Page findByStatus(Integer status, Pageable pageable); + /** * 更新秒杀库存 */ diff --git a/src/main/java/com/org/flashsalesystem/service/FlashSaleService.java b/src/main/java/com/org/flashsalesystem/service/FlashSaleService.java index c2f42ef..c89bb75 100644 --- a/src/main/java/com/org/flashsalesystem/service/FlashSaleService.java +++ b/src/main/java/com/org/flashsalesystem/service/FlashSaleService.java @@ -326,19 +326,7 @@ public class FlashSaleService { } else { // 根据状态查询 if (queryDTO.getStatus() != null) { - switch (queryDTO.getStatus()) { - case 1: // 未开始 - flashSalePage = flashSaleRepository.findUpcomingFlashSales(now, pageable); - break; - case 2: // 进行中 - flashSalePage = flashSaleRepository.findActiveFlashSales(now, pageable); - break; - case 3: // 已结束 - flashSalePage = flashSaleRepository.findEndedFlashSales(now, pageable); - break; - default: - flashSalePage = flashSaleRepository.findAll(pageable); - } + flashSalePage = flashSaleRepository.findByStatus(queryDTO.getStatus(), pageable); } else { flashSalePage = flashSaleRepository.findAll(pageable); } @@ -753,10 +741,16 @@ public class FlashSaleService { FlashSale flashSale = flashSaleOpt.get(); + // 更新状态为进行中 (status = 2) + flashSaleRepository.updateStatus(flashSaleId, 2); + flashSale.setStatus(2); + // 预热缓存 preloadFlashSale(flashSaleId); + // 更新缓存 Product product = productRepository.findById(flashSale.getProductId()).orElse(null); + cacheFlashSaleInfo(flashSale, product); log.info("秒杀活动发布成功: ID={}", flashSaleId);