feat(优惠券): 实现优惠券状态管理功能

- 新增优惠券状态管理相关实体类字段和方法
- 实现优惠券状态自动更新和手动更新功能- 添加优惠券适用范围验证逻辑
- 新增优惠券状态查询和统计接口
- 优化数据库索引和查询性能
This commit is contained in:
2025-08-15 00:35:55 +08:00
parent b09141e848
commit b2e0aa9f28
13 changed files with 1681 additions and 14 deletions

View File

@@ -0,0 +1,113 @@
package com.gxwebsoft.shop.service;
import com.gxwebsoft.shop.entity.ShopUserCoupon;
import com.gxwebsoft.shop.service.CouponStatusService.CouponStatusResult;
import com.gxwebsoft.shop.service.CouponStatusService.CouponValidationResult;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
/**
* 优惠券状态管理服务测试
*
* @author WebSoft
* @since 2025-01-15
*/
@SpringBootTest
@ActiveProfiles("dev")
public class CouponStatusServiceTest {
@Autowired
private CouponStatusService couponStatusService;
@Test
public void testCouponStatusConstants() {
// 测试状态常量
assertEquals(0, ShopUserCoupon.STATUS_UNUSED);
assertEquals(1, ShopUserCoupon.STATUS_USED);
assertEquals(2, ShopUserCoupon.STATUS_EXPIRED);
// 测试类型常量
assertEquals(10, ShopUserCoupon.TYPE_REDUCE);
assertEquals(20, ShopUserCoupon.TYPE_DISCOUNT);
assertEquals(30, ShopUserCoupon.TYPE_FREE);
// 测试适用范围常量
assertEquals(10, ShopUserCoupon.APPLY_ALL);
assertEquals(20, ShopUserCoupon.APPLY_GOODS);
assertEquals(30, ShopUserCoupon.APPLY_CATEGORY);
}
@Test
public void testCouponStatusMethods() {
// 创建测试优惠券
ShopUserCoupon coupon = new ShopUserCoupon();
coupon.setStatus(ShopUserCoupon.STATUS_UNUSED);
coupon.setEndTime(LocalDateTime.now().plusDays(7));
// 测试可用状态
assertTrue(coupon.isAvailable());
assertFalse(coupon.isUsed());
assertFalse(coupon.isExpired());
assertEquals("可使用", coupon.getStatusDesc());
// 测试已使用状态
coupon.markAsUsed(123, "ORDER123");
assertTrue(coupon.isUsed());
assertFalse(coupon.isAvailable());
assertEquals("已使用", coupon.getStatusDesc());
assertEquals(Integer.valueOf(123), coupon.getOrderId());
assertEquals("ORDER123", coupon.getOrderNo());
// 测试过期状态
coupon.setStatus(ShopUserCoupon.STATUS_UNUSED);
coupon.setEndTime(LocalDateTime.now().minusDays(1));
assertTrue(coupon.isExpired());
assertFalse(coupon.isAvailable());
assertEquals("已过期", coupon.getStatusDesc());
}
@Test
public void testValidateCouponForOrder() {
// 这个测试需要数据库中有实际的优惠券数据
// 这里只是演示测试结构
List<Integer> goodsIds = Arrays.asList(1, 2, 3);
BigDecimal totalAmount = new BigDecimal("150.00");
// 注意这个测试需要实际的优惠券ID在真实环境中需要先创建测试数据
// CouponValidationResult result = couponStatusService.validateCouponForOrder(1L, totalAmount, goodsIds);
// assertNotNull(result);
System.out.println("优惠券验证测试需要实际的数据库数据");
}
@Test
public void testGetUserCouponsGroupByStatus() {
// 这个测试需要数据库中有实际的用户和优惠券数据
// 这里只是演示测试结构
// 注意这个测试需要实际的用户ID在真实环境中需要先创建测试数据
// CouponStatusResult result = couponStatusService.getUserCouponsGroupByStatus(1);
// assertNotNull(result);
// assertTrue(result.getTotalCount() >= 0);
System.out.println("用户优惠券分组测试需要实际的数据库数据");
}
@Test
public void testUpdateExpiredCoupons() {
// 测试批量更新过期优惠券
int updatedCount = couponStatusService.updateExpiredCoupons();
assertTrue(updatedCount >= 0);
System.out.println("更新了 " + updatedCount + " 张过期优惠券");
}
}