From bd71a34f8902d2b1599b20c8eba63e92e533db84 Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Fri, 24 Oct 2025 17:27:10 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=85=85=E5=80=BC=E6=B4=BB=E5=8A=A8s?= =?UTF-8?q?erviceimpl=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E5=AE=8C?= =?UTF-8?q?=E5=96=84=EF=BC=9B2=E3=80=81=E5=85=85=E5=80=BC=E6=B4=BB?= =?UTF-8?q?=E5=8A=A8id=E6=94=B9=E4=B8=BA=E8=87=AA=E5=A2=9E=E3=80=81?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E5=AD=97=E6=AE=B5=E7=A7=BB=E9=99=A4=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../funds/recharge/GiftMoneyDetailsDO.java | 2 - .../recharge/RechargeActiveServiceImpl.java | 35 +-- .../RechargeActiveServiceImplTest.java | 252 ++++++++++++++++++ .../src/test/resources/sql/create_tables.sql | 18 ++ 4 files changed, 280 insertions(+), 27 deletions(-) create mode 100644 cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/funds/recharge/RechargeActiveServiceImplTest.java diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/recharge/GiftMoneyDetailsDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/recharge/GiftMoneyDetailsDO.java index 689c0891a..7d8d805d5 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/recharge/GiftMoneyDetailsDO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/recharge/GiftMoneyDetailsDO.java @@ -61,6 +61,4 @@ public class GiftMoneyDetailsDO extends BaseDO { * 备注 */ private String remark; - - private Boolean deleted; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/recharge/RechargeActiveServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/recharge/RechargeActiveServiceImpl.java index 540bacb53..0b09fe9cd 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/recharge/RechargeActiveServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/recharge/RechargeActiveServiceImpl.java @@ -1,8 +1,6 @@ package com.cf.imes.module.system.service.funds.recharge; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.IdUtil; -import com.cf.imes.framework.common.pojo.PageParam; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.Assert.AssertUtils; import com.cf.imes.framework.common.util.date.LocalDateTimeUtils; @@ -12,7 +10,6 @@ import com.cf.imes.module.system.controller.admin.funds.recharge.vo.RechargePage import com.cf.imes.module.system.controller.admin.funds.recharge.vo.RechargeSaveReqVO; import com.cf.imes.module.system.dal.dataobject.funds.recharge.GiftMoneyDetailsDO; import com.cf.imes.module.system.dal.mysql.funds.recharge.GiftMoneyDetailsMapper; -import com.cf.imes.module.system.framework.snowflake.config.MybatisIdProperties; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -34,26 +31,20 @@ import static com.cf.imes.module.system.enums.ErrorCodeConstants.RECHARGE_ACTIVE @Validated public class RechargeActiveServiceImpl implements RechargeActiveService{ - @Resource - private MybatisIdProperties mybatisIdProperties; - @Resource private GiftMoneyDetailsMapper giftMoneyDetailsMapper; @Override public Long create(RechargeSaveReqVO createReqVO) { - - long id = IdUtil.getSnowflake(mybatisIdProperties.getWorkerId(), mybatisIdProperties.getDatacenterId()).nextId(); - GiftMoneyDetailsDO giftMoneyDetailsDO = giftMoneyDetailsMapper.selectOne(new LambdaQueryWrapperX() .eq(GiftMoneyDetailsDO::getDeleted, false) .eq(GiftMoneyDetailsDO::getActivityName,createReqVO.getActivityName())); AssertUtils.empty(giftMoneyDetailsDO,RECHARGE_ACTIVE_NAME_IS_EXIST); - GiftMoneyDetailsDO giftMoneyDetailsDOn = BeanUtils.toBean(createReqVO, GiftMoneyDetailsDO.class).setId(id); + GiftMoneyDetailsDO giftMoneyDetailsDOn = BeanUtils.toBean(createReqVO, GiftMoneyDetailsDO.class); giftMoneyDetailsMapper.insert(giftMoneyDetailsDOn); - return id; + return giftMoneyDetailsDOn.getId(); } @Override @@ -101,19 +92,13 @@ public class RechargeActiveServiceImpl implements RechargeActiveService{ @Override public List getAvailableRechargeActiveList() { - RechargePageReqVO rechargePageReqVO = new RechargePageReqVO(); - // 查询全部 - rechargePageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - // 查询条件 - rechargePageReqVO.setDeleted(false); - PageResult giftMoneyDetailsDOPageResult = giftMoneyDetailsMapper.selectPage(rechargePageReqVO); - List resultList = giftMoneyDetailsDOPageResult.getList(); - if (CollUtil.isNotEmpty(resultList)) { - LocalDateTime now = LocalDateTime.now(); - // 筛选掉投放时间还没到和过期的 - resultList = resultList.stream().filter(item -> item.getStartTime().isBefore(now) && item.getEndTime().isAfter(now)).toList(); - } - return resultList; + LocalDateTime now = LocalDateTime.now(); + // 筛选掉投放时间还没到和过期的 + return giftMoneyDetailsMapper.selectList(new LambdaQueryWrapper() + .eq(GiftMoneyDetailsDO::getDeleted, false) + .le(GiftMoneyDetailsDO::getStartTime, now) + .ge(GiftMoneyDetailsDO::getEndTime, now) + ); } // 校验是否存在 diff --git a/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/funds/recharge/RechargeActiveServiceImplTest.java b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/funds/recharge/RechargeActiveServiceImplTest.java new file mode 100644 index 000000000..cea0278b4 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/test/java/com/cf/imes/module/system/service/funds/recharge/RechargeActiveServiceImplTest.java @@ -0,0 +1,252 @@ +package com.cf.imes.module.system.service.funds.recharge; + +import cn.hutool.core.bean.BeanUtil; +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.test.core.ut.BaseDbAndRedisUnitTest; +import com.cf.imes.module.system.controller.admin.funds.recharge.vo.RechargePageReqVO; +import com.cf.imes.module.system.controller.admin.funds.recharge.vo.RechargeSaveReqVO; +import com.cf.imes.module.system.dal.dataobject.funds.recharge.GiftMoneyDetailsDO; +import com.cf.imes.module.system.dal.mysql.funds.recharge.GiftMoneyDetailsMapper; +import com.cf.imes.module.system.enums.recharge.RechargeGiftTypeEnum; +import com.cf.imes.module.system.enums.recharge.RechargeTypeEnum; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.context.annotation.Import; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import static com.cf.imes.framework.common.util.object.ObjectUtils.cloneIgnoreId; +import static com.cf.imes.framework.test.core.util.AssertUtils.assertPojoEquals; +import static com.cf.imes.framework.test.core.util.AssertUtils.assertServiceException; +import static com.cf.imes.framework.test.core.util.RandomUtils.randomPojo; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.RECHARGE_ACTIVE_NAME_IS_EXIST; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.RECHARGE_ACTIVE_NO_EXIST; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * @author Gqr + * @since 2025/10/24 11:20 + */ +@Import(RechargeActiveServiceImpl.class) +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +class RechargeActiveServiceImplTest extends BaseDbAndRedisUnitTest { + @Resource + private RechargeActiveService rechargeActiveService; + + @Resource + private GiftMoneyDetailsMapper giftMoneyDetailsMapper; + + private static GiftMoneyDetailsDO createDO; + + @Test + @Order(1) + void testCreate() { + RechargeSaveReqVO reqVO = randomPojo(RechargeSaveReqVO.class, o -> { + o.setId(null); + o.setActivityName("充值送活动"); + o.setRechargeGiftType(RechargeGiftTypeEnum.EVERY_X_GIVE_X.getStatus()); + o.setRechargeType(RechargeTypeEnum.WECHAT_AND_ALIPAY.getStatus()); + o.setRechargeAmount(BigDecimal.valueOf(100)); + o.setGiftAmount(BigDecimal.valueOf(20)); + }); + + Long id = rechargeActiveService.create(reqVO); + + // 校验数据库插入结果 + createDO = giftMoneyDetailsMapper.selectById(id); + assertNotNull(createDO); + assertEquals("充值送活动", createDO.getActivityName()); + assertEquals(RechargeTypeEnum.WECHAT_AND_ALIPAY.getStatus(), createDO.getRechargeType()); + assertEquals(RechargeGiftTypeEnum.EVERY_X_GIVE_X.getStatus(), createDO.getRechargeGiftType()); + assertEquals(new BigDecimal("100.000"), createDO.getRechargeAmount()); + assertEquals(new BigDecimal("20.000"), createDO.getGiftAmount()); + + // 再次插入相同活动名称,断言异常 + assertServiceException(() -> rechargeActiveService.create(reqVO), + RECHARGE_ACTIVE_NAME_IS_EXIST); + } + + @Test + @Order(2) + void testUpdate_not_exist() { + RechargeSaveReqVO reqVO = new RechargeSaveReqVO(); + reqVO.setId(321L); + + assertServiceException(() -> rechargeActiveService.update(reqVO), + RECHARGE_ACTIVE_NO_EXIST); + + reqVO.setId(null); + + assertServiceException(() -> rechargeActiveService.update(reqVO), + RECHARGE_ACTIVE_NO_EXIST); + } + + @Test + @Order(2) + void testUpdate() { + + // 插入 + createDO.setId(null); + createDO.setActivityName("充值送活动新"); + createDO.setRechargeGiftType(RechargeGiftTypeEnum.EVERY_X_GIVE_X.getStatus()); + createDO.setRechargeType(RechargeTypeEnum.WECHAT_AND_ALIPAY.getStatus()); + createDO.setRechargeAmount(BigDecimal.valueOf(100)); + createDO.setGiftAmount(BigDecimal.valueOf(20)); + giftMoneyDetailsMapper.insert(createDO); + + RechargeSaveReqVO reqVO = new RechargeSaveReqVO(); + reqVO.setId(createDO.getId()); + reqVO.setActivityName("充值送活动"); + assertServiceException(() -> rechargeActiveService.update(reqVO), + RECHARGE_ACTIVE_NAME_IS_EXIST); + + // 更新成功 + RechargeSaveReqVO update = BeanUtil.copyProperties(createDO, RechargeSaveReqVO.class); + assertDoesNotThrow(() -> rechargeActiveService.update(update)); + } + + + + @Test + @Order(3) + void testGet_not_exist() { + assertServiceException(() -> rechargeActiveService.get(null), RECHARGE_ACTIVE_NO_EXIST); + } + + @Test + @Order(4) + void testGet() { + assertNotNull(rechargeActiveService.getDefaultNull(createDO.getId())); + } + + @Test + @Order(5) + void testGetPage_success() { + GiftMoneyDetailsDO detail = randomPojo(GiftMoneyDetailsDO.class, o -> { + o.setId(null); + o.setActivityName("晨丰分页活动"); + o.setRechargeGiftType(RechargeGiftTypeEnum.EVERY_X_GIVE_X.getStatus()); + o.setRechargeType(RechargeTypeEnum.WECHAT_AND_ALIPAY.getStatus()); + o.setRechargeAmount(BigDecimal.valueOf(100).setScale(3)); + o.setGiftAmount(BigDecimal.valueOf(20).setScale(3)); + }); + + giftMoneyDetailsMapper.insert(detail); + + // 不匹配 ActivityName + giftMoneyDetailsMapper.insert(cloneIgnoreId(detail, o -> o.setActivityName("新分页活动"))); + + // 不匹配 RechargeGiftType + giftMoneyDetailsMapper.insert(cloneIgnoreId(detail, o -> o.setRechargeGiftType(RechargeGiftTypeEnum.FULL_X_GIVE_X.getStatus()))); + + // 不匹配 GiftAmount + giftMoneyDetailsMapper.insert(cloneIgnoreId(detail, o -> o.setGiftAmount(BigDecimal.valueOf(99)))); + + // 不匹配 RechargeAmount + giftMoneyDetailsMapper.insert(cloneIgnoreId(detail, o -> o.setRechargeAmount(BigDecimal.valueOf(99)))); + + // 被逻辑删除 + giftMoneyDetailsMapper.insert(cloneIgnoreId(detail, o -> o.setDeleted(true))); + + // ============ 构造查询参数 ============ + RechargePageReqVO reqVO = new RechargePageReqVO(); + reqVO.setActivityName("晨丰"); + reqVO.setRechargeGiftType(RechargeGiftTypeEnum.EVERY_X_GIVE_X.getStatus()); + reqVO.setRechargeType(RechargeTypeEnum.WECHAT_AND_ALIPAY.getStatus()); + reqVO.setRechargeAmount(BigDecimal.valueOf(100)); + reqVO.setGiftAmount(BigDecimal.valueOf(20)); + reqVO.setPageNo(1); + reqVO.setPageSize(10); + + // ============ 调用方法 ============ + PageResult pageResult = rechargeActiveService.getPage(reqVO); + + // ============ 断言结果 ============ + assertEquals(1, pageResult.getTotal(), "分页结果数量应为1"); + assertEquals(1, pageResult.getList().size(), "分页列表长度应为1"); + assertPojoEquals(detail, pageResult.getList().get(0)); + } + + @Test + @Order(6) + void testDelete() { + assertDoesNotThrow(() -> rechargeActiveService.delete(createDO.getId())); + } + + @Test + @Order(7) + void testDelete_not_exist() { + assertServiceException(() -> rechargeActiveService.delete(null), RECHARGE_ACTIVE_NO_EXIST); + assertServiceException(() -> rechargeActiveService.delete(321L), RECHARGE_ACTIVE_NO_EXIST); + } + + @Test + @Order(8) + void testGetAvailableRechargeActiveList() { + // 当前时间 + LocalDateTime now = LocalDateTime.now(); + + // 1️⃣ 有效活动(时间区间内) + GiftMoneyDetailsDO valid = new GiftMoneyDetailsDO(); + valid.setActivityName("有效活动"); + valid.setRechargeAmount(new java.math.BigDecimal("100.000")); + valid.setGiftAmount(new java.math.BigDecimal("10.000")); + valid.setRechargeGiftType(RechargeGiftTypeEnum.EVERY_X_GIVE_X.getStatus()); + valid.setRechargeType(RechargeTypeEnum.WECHAT_AND_ALIPAY.getStatus()); + valid.setStartTime(now.minusDays(1)); + valid.setEndTime(now.plusDays(1)); + valid.setDeleted(false); + giftMoneyDetailsMapper.insert(valid); + + // 2️⃣ 未开始活动 + GiftMoneyDetailsDO notStarted = new GiftMoneyDetailsDO(); + notStarted.setActivityName("未开始活动"); + notStarted.setRechargeAmount(new java.math.BigDecimal("100.000")); + notStarted.setGiftAmount(new java.math.BigDecimal("10.000")); + notStarted.setRechargeGiftType(RechargeGiftTypeEnum.EVERY_X_GIVE_X.getStatus()); + notStarted.setRechargeType(RechargeTypeEnum.WECHAT_AND_ALIPAY.getStatus()); + notStarted.setStartTime(now.plusDays(1)); + notStarted.setEndTime(now.plusDays(2)); + notStarted.setDeleted(false); + giftMoneyDetailsMapper.insert(notStarted); + + // 3️⃣ 已过期活动 + GiftMoneyDetailsDO expired = new GiftMoneyDetailsDO(); + expired.setActivityName("已过期活动"); + expired.setRechargeAmount(new java.math.BigDecimal("100.000")); + expired.setGiftAmount(new java.math.BigDecimal("10.000")); + expired.setRechargeGiftType(RechargeGiftTypeEnum.EVERY_X_GIVE_X.getStatus()); + expired.setRechargeType(RechargeTypeEnum.WECHAT_AND_ALIPAY.getStatus()); + expired.setStartTime(now.minusDays(5)); + expired.setEndTime(now.minusDays(1)); + expired.setDeleted(false); + giftMoneyDetailsMapper.insert(expired); + + // 4️⃣ 被逻辑删除的活动 + GiftMoneyDetailsDO deleted = new GiftMoneyDetailsDO(); + deleted.setActivityName("被删除活动"); + deleted.setRechargeAmount(new java.math.BigDecimal("100.000")); + deleted.setGiftAmount(new java.math.BigDecimal("10.000")); + deleted.setRechargeGiftType(RechargeGiftTypeEnum.EVERY_X_GIVE_X.getStatus()); + deleted.setRechargeType(RechargeTypeEnum.WECHAT_AND_ALIPAY.getStatus()); + deleted.setStartTime(now.minusDays(1)); + deleted.setEndTime(now.plusDays(1)); + deleted.setDeleted(true); + giftMoneyDetailsMapper.insert(deleted); + + // 执行被测方法 + List result = rechargeActiveService.getAvailableRechargeActiveList(); + + // 验证结果 + assertEquals(1, result.size(), "只应返回一个有效活动"); + assertEquals("有效活动", result.get(0).getActivityName()); + } + +} diff --git a/cf-module-system/cf-module-system-biz/src/test/resources/sql/create_tables.sql b/cf-module-system/cf-module-system-biz/src/test/resources/sql/create_tables.sql index b750b8525..e2f33c593 100644 --- a/cf-module-system/cf-module-system-biz/src/test/resources/sql/create_tables.sql +++ b/cf-module-system/cf-module-system-biz/src/test/resources/sql/create_tables.sql @@ -713,3 +713,21 @@ CREATE TABLE IF NOT EXISTS "products_details" ( "deleted" bit NOT NULL DEFAULT FALSE, PRIMARY KEY ("id") ) COMMENT '产品购买信息表 products_details'; + +CREATE TABLE IF NOT EXISTS "gift_money_details" ( + "id" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '主键,自增ID', + "activity_name" VARCHAR(32) NOT NULL COMMENT '活动名称', + "recharge_gift_type" TINYINT NOT NULL COMMENT '赠送类型:0满X送X;1每满X送X', + "recharge_type" TINYINT NOT NULL COMMENT '充值类型:0微信、支付宝;1微信;2支付宝', + "recharge_amount" DECIMAL(10, 3) NOT NULL COMMENT '充值金额', + "gift_amount" DECIMAL(10, 3) NOT NULL COMMENT '赠送金额', + "start_time" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '开始时间', + "end_time" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '结束时间', + "remark" VARCHAR(1024) DEFAULT NULL COMMENT '备注', + "creator" VARCHAR(64) DEFAULT '' COMMENT '创建者', + "create_time" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + "updater" VARCHAR(64) DEFAULT '' COMMENT '更新者', + "update_time" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + "deleted" BIT NOT NULL DEFAULT FALSE COMMENT '是否删除:0否 1是', + PRIMARY KEY ("id") + ) COMMENT '赠送金规则明细表(base表)';