mirror of
http://192.168.1.205:9980/cf_devdept2/cf_imes_server.git
synced 2026-08-12 21:02:08 +08:00
产品延期管理单元测试完善
This commit is contained in:
+9
-1
@@ -12,6 +12,7 @@ import uk.co.jemos.podam.api.PodamFactoryImpl;
|
||||
import uk.co.jemos.podam.api.RandomDataProviderStrategy;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
@@ -50,7 +51,7 @@ public class RandomUtils {
|
||||
}
|
||||
// 如果是 type、status 结尾的字段,返回 tinyint 范围
|
||||
if (CharSequenceUtil.endWithAnyIgnoreCase(attributeMetadata.getAttributeName(),
|
||||
"type", "status", "category", "scope", "result", "sort")) {
|
||||
"type", "status", "category", "scope", "result", "sort", "unit")) {
|
||||
return RandomUtil.randomInt(0, TINYINT_MAX + 1);
|
||||
}
|
||||
return RandomUtil.randomInt();
|
||||
@@ -66,6 +67,9 @@ public class RandomUtils {
|
||||
}
|
||||
return RandomUtil.randomBoolean();
|
||||
});
|
||||
// BigDecimal
|
||||
PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(BigDecimal.class,
|
||||
(dataProviderStrategy, attributeMetadata, map) -> randomBigDecimal());
|
||||
((RandomDataProviderStrategy) PODAM_FACTORY.getStrategy()).addOrReplaceAttributeStrategy(NumberValid.class, new NumberValidStrategy());
|
||||
}
|
||||
|
||||
@@ -81,6 +85,10 @@ public class RandomUtils {
|
||||
return RandomUtil.randomInt(0, Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
public static BigDecimal randomBigDecimal() {
|
||||
return RandomUtil.randomBigDecimal(BigDecimal.ZERO, BigDecimal.TEN);
|
||||
}
|
||||
|
||||
public static Date randomDate() {
|
||||
return RandomUtil.randomDay(0, RANDOM_DATE_MAX);
|
||||
}
|
||||
|
||||
+1
@@ -364,4 +364,5 @@ public class ErrorCodeConstants {
|
||||
//=========== 产品延期管理 1-002-049-000 ============
|
||||
public static final ErrorCode PRODUCT_PURCHASE_NO_EXIST = new ErrorCode(1_002_049_001, "product_purchase.no_exist");
|
||||
public static final ErrorCode PRODUCT_PURCHASE_ENDTIME_BEFORE_DELAYTIME_ERROR = new ErrorCode(1_002_049_002, "product_purchase.endtime_before_delaytime_error");
|
||||
public static final ErrorCode PRODUCT_DELAY_UNIT_NOT_SUPPORT = new ErrorCode(1_002_049_003, "product.delay_duration_unit_not_support");
|
||||
}
|
||||
|
||||
+15
-24
@@ -1,10 +1,10 @@
|
||||
package com.cf.imes.module.system.service.funds.delay;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.cf.imes.framework.common.exception.ServiceException;
|
||||
import com.cf.imes.framework.common.pojo.PageResult;
|
||||
import com.cf.imes.framework.common.util.Assert.AssertUtils;
|
||||
import com.cf.imes.framework.common.util.object.BeanUtils;
|
||||
@@ -29,7 +29,9 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static com.cf.imes.module.system.enums.ErrorCodeConstants.PRODUCT_DELAY_UNIT_NOT_SUPPORT;
|
||||
import static com.cf.imes.module.system.enums.ErrorCodeConstants.PRODUCT_PURCHASE_NO_EXIST;
|
||||
|
||||
/**
|
||||
@@ -120,11 +122,7 @@ public class ProductDelayServiceImpl implements ProductDelayService {
|
||||
* @return
|
||||
*/
|
||||
private static LocalDate calculateEndTime(LocalDate startTime, Integer duration, Integer durationUnit) {
|
||||
if (ObjectUtil.isNotNull(duration) && ObjectUtil.isNotNull(durationUnit)) {
|
||||
startTime = addTime(startTime, duration, durationUnit);
|
||||
}
|
||||
|
||||
return startTime;
|
||||
return addTime(startTime, duration, durationUnit);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -136,15 +134,15 @@ public class ProductDelayServiceImpl implements ProductDelayService {
|
||||
* @return
|
||||
*/
|
||||
private static LocalDate addTime(LocalDate time, int duration, int unit) {
|
||||
switch (DurationUnitEnum.fromStatus(unit)) {
|
||||
case YEAR:
|
||||
return time.plusYears(duration);
|
||||
case MONTH:
|
||||
return time.plusMonths(duration);
|
||||
case DAY:
|
||||
return time.plusDays(duration);
|
||||
default:
|
||||
return time;
|
||||
DurationUnitEnum e = DurationUnitEnum.fromStatus(unit);
|
||||
if (Objects.equals(e, DurationUnitEnum.YEAR)) {
|
||||
return time.plusYears(duration);
|
||||
} else if (Objects.equals(e, DurationUnitEnum.MONTH)) {
|
||||
return time.plusMonths(duration);
|
||||
} else if (Objects.equals(e, DurationUnitEnum.DAY)) {
|
||||
return time.plusDays(duration);
|
||||
} else {
|
||||
throw new ServiceException(PRODUCT_DELAY_UNIT_NOT_SUPPORT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,8 +170,7 @@ public class ProductDelayServiceImpl implements ProductDelayService {
|
||||
.eq(PurchaseRecordDO::getStatus, PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
||||
.eq(PurchaseRecordDO::getDeleted, false)
|
||||
);
|
||||
List<ProductDelayRespVO> resultList;
|
||||
if(ObjectUtil.isNotNull(purchaseRecordDO)) {
|
||||
if (ObjectUtil.isNotNull(purchaseRecordDO)) {
|
||||
previouProductDelayRespVO.setPreviouPurchaseRecord(purchaseRecordDO);
|
||||
List<ProductDelayRecordDO> recordDOS = productDelayRecordMapper.selectList(new LambdaQueryWrapper<ProductDelayRecordDO>()
|
||||
.eq(ProductDelayRecordDO::getProductId, productId)
|
||||
@@ -182,19 +179,13 @@ public class ProductDelayServiceImpl implements ProductDelayService {
|
||||
.eq(ProductDelayRecordDO::getDeleted, false)
|
||||
.select(ProductDelayRecordDO::getDelayDuration, ProductDelayRecordDO::getDelayDurationUnit, ProductDelayRecordDO::getDelayTime, ProductDelayRecordDO::getEndTime, ProductDelayRecordDO::getId)
|
||||
);
|
||||
if(CollUtil.isNotEmpty(recordDOS)) {
|
||||
resultList = BeanUtil.copyToList(recordDOS, ProductDelayRespVO.class);
|
||||
previouProductDelayRespVO.setDelayRespVOList(resultList);
|
||||
}
|
||||
previouProductDelayRespVO.setDelayRespVOList(BeanUtil.copyToList(recordDOS, ProductDelayRespVO.class));
|
||||
}
|
||||
return previouProductDelayRespVO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePurchaseDelayRecordsPaidAndRemark(List<ProductDelayRecordDO> list, Long organId, Boolean paid) {
|
||||
if (CollUtil.isEmpty(list)) {
|
||||
return;
|
||||
}
|
||||
for (ProductDelayRecordDO recordDO : list) {
|
||||
productDelayRecordMapper.update(new LambdaUpdateWrapperX<ProductDelayRecordDO>()
|
||||
.eq(ProductDelayRecordDO::getId, recordDO.getId())
|
||||
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+492
@@ -0,0 +1,492 @@
|
||||
package com.cf.imes.module.system.service.funds.delay;
|
||||
|
||||
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.delay.vo.PreviouProductDelayRespVO;
|
||||
import com.cf.imes.module.system.controller.admin.funds.delay.vo.ProductDelayPageReqVO;
|
||||
import com.cf.imes.module.system.controller.admin.funds.delay.vo.ProductDelayRespVO;
|
||||
import com.cf.imes.module.system.controller.admin.funds.delay.vo.ProductDelaySaveReqVO;
|
||||
import com.cf.imes.module.system.dal.dataobject.funds.delay.ProductDelayRecordDO;
|
||||
import com.cf.imes.module.system.dal.dataobject.funds.purchase.PurchaseRecordDO;
|
||||
import com.cf.imes.module.system.dal.dataobject.organ.OrganizationDO;
|
||||
import com.cf.imes.module.system.dal.mysql.funds.delay.ProductDelayRecordMapper;
|
||||
import com.cf.imes.module.system.dal.mysql.funds.purchase.PurchaseRecordMapper;
|
||||
import com.cf.imes.module.system.enums.pay.DurationUnitEnum;
|
||||
import com.cf.imes.module.system.enums.pay.PayChannelCodeEnum;
|
||||
import com.cf.imes.module.system.enums.pay.PurchaseRecordStatusEnum;
|
||||
import com.cf.imes.module.system.service.funds.products.ProductsDetailService;
|
||||
import com.cf.imes.module.system.service.funds.purchase.PurchaseService;
|
||||
import com.cf.imes.module.system.service.organ.OrganService;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.test.context.bean.override.mockito.MockitoBean;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import static com.cf.imes.framework.test.core.util.AssertUtils.assertServiceException;
|
||||
import static com.cf.imes.framework.test.core.util.RandomUtils.randomLongId;
|
||||
import static com.cf.imes.framework.test.core.util.RandomUtils.randomPojo;
|
||||
import static com.cf.imes.module.system.enums.ErrorCodeConstants.PRODUCT_DELAY_UNIT_NOT_SUPPORT;
|
||||
import static com.cf.imes.module.system.enums.ErrorCodeConstants.PRODUCT_PURCHASE_NO_EXIST;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* {@link ProductDelayServiceImpl} 的单元测试类
|
||||
*
|
||||
* @author Gqr
|
||||
* @since 2025/12/8 14:30
|
||||
*/
|
||||
@Import(ProductDelayServiceImpl.class)
|
||||
public class ProductDelayServiceImplTest extends BaseDbAndRedisUnitTest {
|
||||
|
||||
@Resource
|
||||
private ProductDelayServiceImpl productDelayService;
|
||||
|
||||
@Resource
|
||||
private ProductDelayRecordMapper recordMapper;
|
||||
|
||||
@Resource
|
||||
private PurchaseRecordMapper purchaseRecordMapper;
|
||||
|
||||
@MockitoBean
|
||||
private OrganService organService;
|
||||
|
||||
@MockitoBean
|
||||
private PurchaseService purchaseService;
|
||||
|
||||
@MockitoBean
|
||||
private ProductsDetailService productsDetailService;
|
||||
|
||||
@Test
|
||||
public void testCreateProductDelay_noPreDelayRecord_success() {
|
||||
// 准备参数
|
||||
Long organId = randomLongId();
|
||||
Long purchaseId = randomLongId();
|
||||
Long productId = randomLongId();
|
||||
|
||||
// Mock 组织
|
||||
OrganizationDO organization = new OrganizationDO();
|
||||
organization.setId(organId);
|
||||
organization.setName("测试组织");
|
||||
when(organService.validOrgan(organId)).thenReturn(organization);
|
||||
|
||||
// Mock 购买记录
|
||||
PurchaseRecordDO purchaseRecord = PurchaseRecordDO.builder()
|
||||
.id(purchaseId)
|
||||
.productId(productId)
|
||||
.productName("测试产品")
|
||||
.startTime(LocalDate.now().minusMonths(6))
|
||||
.endTime(LocalDate.now().plusMonths(6))
|
||||
.build();
|
||||
when(purchaseService.getRecord(purchaseId)).thenReturn(purchaseRecord);
|
||||
|
||||
// 构造请求
|
||||
ProductDelaySaveReqVO reqVO = new ProductDelaySaveReqVO();
|
||||
reqVO.setOrganId(organId);
|
||||
reqVO.setPurchaseId(purchaseId);
|
||||
reqVO.setDelayDuration(3);
|
||||
reqVO.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
|
||||
// 调用
|
||||
Long delayId = productDelayService.createProductDelay(reqVO);
|
||||
|
||||
// 断言
|
||||
assertNotNull(delayId);
|
||||
ProductDelayRecordDO dbRecord = recordMapper.selectById(delayId);
|
||||
assertNotNull(dbRecord);
|
||||
assertEquals(organId, dbRecord.getOrganId());
|
||||
assertEquals("测试组织", dbRecord.getOrganName());
|
||||
assertEquals(productId, dbRecord.getProductId());
|
||||
assertEquals("测试产品", dbRecord.getProductName());
|
||||
assertEquals(3, dbRecord.getDelayDuration());
|
||||
assertEquals(DurationUnitEnum.MONTH.getCode(), dbRecord.getDelayDurationUnit());
|
||||
assertEquals(purchaseRecord.getEndTime(), dbRecord.getEndTime());
|
||||
assertEquals(purchaseRecord.getEndTime().plusMonths(3), dbRecord.getDelayTime());
|
||||
assertEquals(purchaseId, dbRecord.getPurchaseId());
|
||||
assertFalse(dbRecord.getPaid());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateProductDelay_withPreDelayRecord_success() {
|
||||
// 准备参数
|
||||
Long organId = randomLongId();
|
||||
Long purchaseId = randomLongId();
|
||||
Long productId = randomLongId();
|
||||
|
||||
// Mock 组织
|
||||
OrganizationDO organization = new OrganizationDO();
|
||||
organization.setId(organId);
|
||||
organization.setName("测试组织");
|
||||
when(organService.validOrgan(organId)).thenReturn(organization);
|
||||
|
||||
// Mock 购买记录
|
||||
PurchaseRecordDO purchaseRecord = PurchaseRecordDO.builder()
|
||||
.id(purchaseId)
|
||||
.productId(productId)
|
||||
.productName("测试产品")
|
||||
.startTime(LocalDate.now().minusMonths(6))
|
||||
.endTime(LocalDate.now().plusMonths(6))
|
||||
.build();
|
||||
when(purchaseService.getRecord(purchaseId)).thenReturn(purchaseRecord);
|
||||
|
||||
// 插入前序延期记录
|
||||
ProductDelayRecordDO preDelayRecord = ProductDelayRecordDO.builder()
|
||||
.organId(organId)
|
||||
.organName("测试组织")
|
||||
.productId(productId)
|
||||
.productName("测试产品")
|
||||
.delayDuration(1)
|
||||
.delayDurationUnit(DurationUnitEnum.YEAR.getCode())
|
||||
.endTime(purchaseRecord.getEndTime())
|
||||
.delayTime(purchaseRecord.getEndTime().plusYears(1))
|
||||
.purchaseId(purchaseId)
|
||||
.paid(true)
|
||||
.build();
|
||||
recordMapper.insert(preDelayRecord);
|
||||
|
||||
// 构造请求
|
||||
ProductDelaySaveReqVO reqVO = new ProductDelaySaveReqVO();
|
||||
reqVO.setOrganId(organId);
|
||||
reqVO.setPurchaseId(purchaseId);
|
||||
reqVO.setDelayDuration(6);
|
||||
reqVO.setDelayDurationUnit(DurationUnitEnum.YEAR.getCode());
|
||||
|
||||
// 调用
|
||||
Long delayId = productDelayService.createProductDelay(reqVO);
|
||||
|
||||
// 断言
|
||||
assertNotNull(delayId);
|
||||
ProductDelayRecordDO dbRecord = recordMapper.selectById(delayId);
|
||||
assertNotNull(dbRecord);
|
||||
// 应该基于前序记录的延期时间计算
|
||||
assertEquals(preDelayRecord.getDelayTime(), dbRecord.getEndTime());
|
||||
assertEquals(preDelayRecord.getDelayTime().plusYears(6), dbRecord.getDelayTime());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateProductDelay_expiredEndTime_success() {
|
||||
// 准备参数
|
||||
Long organId = randomLongId();
|
||||
Long purchaseId = randomLongId();
|
||||
Long productId = randomLongId();
|
||||
|
||||
// Mock 组织
|
||||
OrganizationDO organization = new OrganizationDO();
|
||||
organization.setId(organId);
|
||||
organization.setName("测试组织");
|
||||
when(organService.validOrgan(organId)).thenReturn(organization);
|
||||
|
||||
// Mock 购买记录(已过期)
|
||||
PurchaseRecordDO purchaseRecord = PurchaseRecordDO.builder()
|
||||
.id(purchaseId)
|
||||
.productId(productId)
|
||||
.productName("测试产品")
|
||||
.startTime(LocalDate.now().minusMonths(12))
|
||||
.endTime(LocalDate.now().minusMonths(1)) // 已过期
|
||||
.build();
|
||||
when(purchaseService.getRecord(purchaseId)).thenReturn(purchaseRecord);
|
||||
|
||||
// 构造请求
|
||||
ProductDelaySaveReqVO reqVO = new ProductDelaySaveReqVO();
|
||||
reqVO.setOrganId(organId);
|
||||
reqVO.setPurchaseId(purchaseId);
|
||||
reqVO.setDelayDuration(3);
|
||||
reqVO.setDelayDurationUnit(DurationUnitEnum.DAY.getCode());
|
||||
|
||||
// 调用
|
||||
Long delayId = productDelayService.createProductDelay(reqVO);
|
||||
|
||||
// 断言
|
||||
assertNotNull(delayId);
|
||||
ProductDelayRecordDO dbRecord = recordMapper.selectById(delayId);
|
||||
assertNotNull(dbRecord);
|
||||
// 已过期的情况,应该从今天开始计算
|
||||
assertEquals(LocalDate.now(), dbRecord.getEndTime());
|
||||
assertEquals(LocalDate.now().plusDays(3), dbRecord.getDelayTime());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateProductDelay_withExpiredPreDelayRecord_success() {
|
||||
// 准备参数
|
||||
Long organId = randomLongId();
|
||||
Long purchaseId = randomLongId();
|
||||
Long productId = randomLongId();
|
||||
|
||||
// Mock 组织
|
||||
OrganizationDO organization = new OrganizationDO();
|
||||
organization.setId(organId);
|
||||
organization.setName("测试组织");
|
||||
when(organService.validOrgan(organId)).thenReturn(organization);
|
||||
|
||||
// Mock 购买记录(未过期)
|
||||
PurchaseRecordDO purchaseRecord = PurchaseRecordDO.builder()
|
||||
.id(purchaseId)
|
||||
.productId(productId)
|
||||
.productName("测试产品")
|
||||
.startTime(LocalDate.now().minusMonths(6))
|
||||
.endTime(LocalDate.now().plusMonths(6))
|
||||
.build();
|
||||
when(purchaseService.getRecord(purchaseId)).thenReturn(purchaseRecord);
|
||||
|
||||
// 插入前序延期记录(延期时间未过期)
|
||||
ProductDelayRecordDO preDelayRecord = ProductDelayRecordDO.builder()
|
||||
.organId(organId)
|
||||
.organName("测试组织")
|
||||
.productId(productId)
|
||||
.productName("测试产品")
|
||||
.delayDuration(3)
|
||||
.delayDurationUnit(DurationUnitEnum.MONTH.getCode())
|
||||
.endTime(purchaseRecord.getEndTime())
|
||||
.delayTime(LocalDate.now().plusMonths(9)) // 未过期的延期时间
|
||||
.purchaseId(purchaseId)
|
||||
.paid(true)
|
||||
.build();
|
||||
recordMapper.insert(preDelayRecord);
|
||||
|
||||
// 构造请求
|
||||
ProductDelaySaveReqVO reqVO = new ProductDelaySaveReqVO();
|
||||
reqVO.setOrganId(organId);
|
||||
reqVO.setPurchaseId(purchaseId);
|
||||
reqVO.setDelayDuration(6);
|
||||
reqVO.setDelayDurationUnit(4);
|
||||
|
||||
// 调用并断言异常
|
||||
assertServiceException(() -> productDelayService.createProductDelay(reqVO),
|
||||
PRODUCT_DELAY_UNIT_NOT_SUPPORT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateProductDelay_purchaseNotExist() {
|
||||
// 准备参数
|
||||
Long organId = randomLongId();
|
||||
Long purchaseId = randomLongId();
|
||||
|
||||
// Mock 组织
|
||||
OrganizationDO organization = new OrganizationDO();
|
||||
organization.setId(organId);
|
||||
organization.setName("测试组织");
|
||||
when(organService.validOrgan(organId)).thenReturn(organization);
|
||||
|
||||
// Mock 购买记录不存在
|
||||
when(purchaseService.getRecord(purchaseId)).thenReturn(null);
|
||||
|
||||
// 构造请求
|
||||
ProductDelaySaveReqVO reqVO = new ProductDelaySaveReqVO();
|
||||
reqVO.setOrganId(organId);
|
||||
reqVO.setPurchaseId(purchaseId);
|
||||
reqVO.setDelayDuration(3);
|
||||
reqVO.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
|
||||
// 调用并断言异常
|
||||
assertServiceException(() -> productDelayService.createProductDelay(reqVO),
|
||||
PRODUCT_PURCHASE_NO_EXIST);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetPage() {
|
||||
// mock 数据
|
||||
ProductDelayRecordDO record1 = randomPojo(ProductDelayRecordDO.class, o -> {
|
||||
o.setOrganName("晨丰科技");
|
||||
o.setProductName("ERP产品");
|
||||
o.setDelayDuration(3);
|
||||
o.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
});
|
||||
recordMapper.insert(record1);
|
||||
|
||||
// 不匹配的数据
|
||||
recordMapper.insert(randomPojo(ProductDelayRecordDO.class, o -> {
|
||||
o.setOrganName("其他组织");
|
||||
o.setProductName("ERP产品");
|
||||
o.setDelayDuration(4);
|
||||
o.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
}));
|
||||
|
||||
// 准备参数
|
||||
ProductDelayPageReqVO reqVO = new ProductDelayPageReqVO();
|
||||
reqVO.setOrganName("晨丰科技");
|
||||
reqVO.setProductName("ERP产品");
|
||||
reqVO.setDelayDuration(3);
|
||||
reqVO.setPageNo(1);
|
||||
reqVO.setPageSize(10);
|
||||
|
||||
// 调用
|
||||
PageResult<ProductDelayRespVO> pageResult = productDelayService.getPage(reqVO);
|
||||
|
||||
// 断言
|
||||
assertEquals(1, pageResult.getTotal());
|
||||
assertEquals(1, pageResult.getList().size());
|
||||
ProductDelayRespVO respVO = pageResult.getList().get(0);
|
||||
assertEquals("晨丰科技", respVO.getOrganName());
|
||||
assertEquals("ERP产品", respVO.getProductName());
|
||||
assertEquals(3, respVO.getDelayDuration());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetRecordsByPurchaseId() {
|
||||
// 准备数据
|
||||
Long purchaseId = randomLongId();
|
||||
Long organId = randomLongId();
|
||||
|
||||
// mock 数据
|
||||
ProductDelayRecordDO record1 = randomPojo(ProductDelayRecordDO.class, o -> {
|
||||
o.setOrganName("晨丰科技");
|
||||
o.setProductName("ERP产品");
|
||||
o.setDelayDuration(3);
|
||||
o.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
o.setPurchaseId(purchaseId);
|
||||
o.setOrganId(organId);
|
||||
});
|
||||
recordMapper.insert(record1);
|
||||
|
||||
// 不匹配的数据
|
||||
recordMapper.insert(randomPojo(ProductDelayRecordDO.class, o -> {
|
||||
o.setOrganName("其他组织");
|
||||
o.setProductName("ERP产品");
|
||||
o.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
}));
|
||||
|
||||
// 调用
|
||||
List<ProductDelayRespVO> records = productDelayService.getRecordsByPurchaseId(purchaseId, organId);
|
||||
|
||||
// 断言
|
||||
assertEquals(1, records.size());
|
||||
// 验证按 ID 倒序
|
||||
assertEquals(3, records.get(0).getDelayDuration());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetActiveRecordsByProductId_withRecords() {
|
||||
// 准备数据
|
||||
Long productId = randomLongId();
|
||||
Long organId = randomLongId();
|
||||
Long purchaseId = randomLongId();
|
||||
|
||||
// 插入活跃的购买记录
|
||||
PurchaseRecordDO purchaseRecord = randomPojo(PurchaseRecordDO.class, o -> {
|
||||
o.setId(purchaseId);
|
||||
o.setOrganId(organId);
|
||||
o.setProductId(productId);
|
||||
o.setStatus(PurchaseRecordStatusEnum.ACTIVE.getStatus());
|
||||
o.setCurrency(null);
|
||||
o.setIsInvocing(null);
|
||||
o.setPaymentMethod(PayChannelCodeEnum.ALIPAY_PC.getCode());
|
||||
});
|
||||
purchaseRecordMapper.insert(purchaseRecord);
|
||||
|
||||
// 插入延期记录
|
||||
ProductDelayRecordDO delayRecord = randomPojo(ProductDelayRecordDO.class, o -> {
|
||||
o.setOrganId(organId);
|
||||
o.setProductId(productId);
|
||||
o.setPurchaseId(purchaseId);
|
||||
o.setDelayDuration(3);
|
||||
o.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
o.setDelayTime(LocalDate.now().plusMonths(3));
|
||||
o.setEndTime(LocalDate.now());
|
||||
});
|
||||
recordMapper.insert(delayRecord);
|
||||
|
||||
// 调用
|
||||
PreviouProductDelayRespVO result = productDelayService.getActiveRecordsByProductId(productId, organId);
|
||||
|
||||
// 断言
|
||||
assertNotNull(result);
|
||||
assertNotNull(result.getPreviouPurchaseRecord());
|
||||
assertEquals(purchaseId, result.getPreviouPurchaseRecord().getId());
|
||||
assertNotNull(result.getDelayRespVOList());
|
||||
assertEquals(1, result.getDelayRespVOList().size());
|
||||
assertEquals(3, result.getDelayRespVOList().get(0).getDelayDuration());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetActiveRecordsByProductId_noPurchaseRecord() {
|
||||
// 准备数据
|
||||
Long productId = randomLongId();
|
||||
Long organId = randomLongId();
|
||||
|
||||
// 调用(没有购买记录)
|
||||
PreviouProductDelayRespVO result = productDelayService.getActiveRecordsByProductId(productId, organId);
|
||||
|
||||
// 断言
|
||||
assertNotNull(result);
|
||||
assertNull(result.getPreviouPurchaseRecord());
|
||||
assertNull(result.getDelayRespVOList());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdatePurchaseDelayRecordsPaidAndRemark() {
|
||||
// 准备数据
|
||||
Long organId = randomLongId();
|
||||
|
||||
ProductDelayRecordDO record1 = randomPojo(ProductDelayRecordDO.class, o -> {
|
||||
o.setPaid(false);
|
||||
o.setRemark(null);
|
||||
o.setDelayDuration(3);
|
||||
o.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
o.setOrganId(organId);
|
||||
});
|
||||
|
||||
recordMapper.insert(record1);
|
||||
|
||||
// 准备更新数据
|
||||
record1.setRemark("备注1");
|
||||
List<ProductDelayRecordDO> updateList = Arrays.asList(record1);
|
||||
|
||||
// 调用
|
||||
productDelayService.updatePurchaseDelayRecordsPaidAndRemark(updateList, organId, true);
|
||||
|
||||
// 断言
|
||||
ProductDelayRecordDO dbRecord1 = recordMapper.selectById(record1.getId());
|
||||
assertTrue(dbRecord1.getPaid());
|
||||
assertEquals("备注1", dbRecord1.getRemark());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUpdatePurchaseDelayRecordsPaid() {
|
||||
// 准备数据
|
||||
Long purchaseId = randomLongId();
|
||||
Long organId = randomLongId();
|
||||
|
||||
ProductDelayRecordDO record1 = randomPojo(ProductDelayRecordDO.class, o -> {
|
||||
o.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
o.setOrganId(organId);
|
||||
o.setPurchaseId(purchaseId);
|
||||
o.setPaid(false);
|
||||
});
|
||||
recordMapper.insert(record1);
|
||||
|
||||
// 调用
|
||||
productDelayService.updatePurchaseDelayRecordsPaid(purchaseId, organId);
|
||||
|
||||
// 断言
|
||||
ProductDelayRecordDO dbRecord1 = recordMapper.selectById(record1.getId());
|
||||
assertTrue(dbRecord1.getPaid());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testResetPurchaseDelayRecordsRemark() {
|
||||
// 准备数据
|
||||
Long purchaseId = randomLongId();
|
||||
Long organId = randomLongId();
|
||||
|
||||
ProductDelayRecordDO record1 = randomPojo(ProductDelayRecordDO.class, o -> {
|
||||
o.setRemark("测试备注");
|
||||
o.setDelayDuration(3);
|
||||
o.setDelayDurationUnit(DurationUnitEnum.MONTH.getCode());
|
||||
o.setOrganId(organId);
|
||||
o.setPurchaseId(purchaseId);
|
||||
});
|
||||
recordMapper.insert(record1);
|
||||
|
||||
|
||||
// 调用
|
||||
productDelayService.resetPurchaseDelayRecordsRemark(purchaseId, organId);
|
||||
|
||||
// 断言
|
||||
ProductDelayRecordDO dbRecord1 = recordMapper.selectById(record1.getId());
|
||||
assertNull(dbRecord1.getRemark());
|
||||
}
|
||||
}
|
||||
@@ -38,4 +38,6 @@ DELETE FROM "process_group";
|
||||
DELETE FROM "products";
|
||||
DELETE FROM "products_details";
|
||||
DELETE FROM "product_promotion";
|
||||
DELETE FROM "advertisement";
|
||||
DELETE FROM "advertisement";
|
||||
DELETE FROM "product_delay_record";
|
||||
DELETE FROM "purchase_record"
|
||||
@@ -752,3 +752,59 @@ CREATE TABLE IF NOT EXISTS "advertisement" (
|
||||
"deleted" BIT DEFAULT FALSE NOT NULL COMMENT '是否删除,0否1是',
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '广告表 advertisement';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "product_delay_record"
|
||||
(
|
||||
"id" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '主键,自增',
|
||||
"organ_id" BIGINT NOT NULL DEFAULT '0' COMMENT '组织ID',
|
||||
"organ_name" VARCHAR(30) NOT NULL COMMENT '组织名称',
|
||||
"product_id" BIGINT NOT NULL COMMENT '产品编号',
|
||||
"product_name" VARCHAR(64) NOT NULL COMMENT '产品名称',
|
||||
"delay_duration" INT NOT NULL COMMENT '延期时长',
|
||||
"delay_duration_unit" TINYINT NOT NULL COMMENT '延期时长单位',
|
||||
"end_time" DATE NOT NULL COMMENT '产品结束时间',
|
||||
"delay_time" DATE NOT NULL COMMENT '延期后有效时长',
|
||||
"purchase_id" VARCHAR(2048) DEFAULT NULL COMMENT '购买记录单号',
|
||||
"remark" VARCHAR(1024) DEFAULT NULL COMMENT '备注',
|
||||
"creator" VARCHAR(64) DEFAULT NULL COMMENT '创建者',
|
||||
"create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
"updater" VARCHAR(64) DEFAULT NULL COMMENT '更新者',
|
||||
"update_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
"paid" BIT DEFAULT FALSE COMMENT '是否支付',
|
||||
"deleted" BIT NOT NULL DEFAULT FALSE COMMENT '是否删除,0否1是',
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '产品延期记录表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS "purchase_record"
|
||||
(
|
||||
"id" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '主键,根据ID号规则生成',
|
||||
"organ_id" BIGINT NOT NULL DEFAULT '0' COMMENT '组织ID',
|
||||
"previous_id" BIGINT DEFAULT NULL COMMENT '前序订购记录id',
|
||||
"product_id" BIGINT NOT NULL COMMENT '产品ID',
|
||||
"product_details_id" BIGINT NOT NULL COMMENT '产品明细ID',
|
||||
"product_promotion_id" BIGINT DEFAULT NULL COMMENT '优惠活动id',
|
||||
"product_name" VARCHAR(64) NOT NULL COMMENT '产品名称',
|
||||
"order_no" VARCHAR(64) DEFAULT NULL COMMENT '订单号',
|
||||
"purchase_duration" INT NOT NULL DEFAULT '0' COMMENT '购买时长',
|
||||
"purchase_duration_unit" TINYINT NOT NULL COMMENT '购买时长单位:0年、1月、2日',
|
||||
"gift_duration" INT DEFAULT NULL COMMENT '赠送时长',
|
||||
"gift_duration_unit" TINYINT DEFAULT NULL COMMENT '赠送时长单位:0年、1月、2日',
|
||||
"start_time" DATE NOT NULL COMMENT '产品开始时间',
|
||||
"end_time" DATE NOT NULL COMMENT '产品结束时间',
|
||||
"payment_method" TINYINT NOT NULL DEFAULT '0' COMMENT '支付方式:0现金余额;1赠送金;2支付宝;3微信;4现金+赠送金;5现金+支付宝;6现金+微信;7赠送金+支付宝;8赠送金+微信;9现金+赠送金+支付宝;10现金+赠送金+微信',
|
||||
"total_amount" DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '订单总额',
|
||||
"original_amount" DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '原始价格',
|
||||
"month_average_amount" DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '月均单价',
|
||||
"external_spent" DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '外部支付金额',
|
||||
"currency" TINYINT DEFAULT NULL COMMENT '货币类型',
|
||||
"currency_unit" VARCHAR(10) DEFAULT NULL COMMENT '货币单位',
|
||||
"is_invocing" TINYINT DEFAULT NULL COMMENT '是否开票:0可开票 1待开票 2已开票',
|
||||
"initial" BIT NOT NULL DEFAULT FALSE COMMENT '是否首次订购',
|
||||
"status" INT DEFAULT '1' COMMENT '购买记录状态,1有效、2等待支付、3作废',
|
||||
"creator" VARCHAR(64) DEFAULT NULL COMMENT '创建者',
|
||||
"create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
"updater" VARCHAR(64) DEFAULT NULL COMMENT '更新者',
|
||||
"update_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
"deleted" BIT NOT NULL DEFAULT FALSE COMMENT '是否删除:0否 1是',
|
||||
PRIMARY KEY ("id")
|
||||
) COMMENT '购买记录表';
|
||||
|
||||
Reference in New Issue
Block a user