新增软件购买-购买方式列表关联对应的优惠活动展示赠送时间

This commit is contained in:
gaoqr
2025-11-05 15:25:48 +08:00
parent 1a381a9976
commit 0ecb7ada52
2 changed files with 54 additions and 6 deletions
@@ -25,6 +25,12 @@ public class ProductDetailsRespVO {
@Schema(description = "产品时长单位,0:年、1:月", example = "1")
private Integer durationUnit;
@Schema(description = "赠送时长", example = "1")
private Integer giftDuration;
@Schema(description = "赠送时长单位,0:年、1:月", example = "1")
private Integer giftDurationUnit;
@Schema(description = "产品原价", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private BigDecimal originalPrice;
@@ -24,6 +24,7 @@ import com.cf.imes.module.system.controller.admin.funds.purchase.vo.SalesDetailR
import com.cf.imes.module.system.controller.admin.funds.purchase.vo.SalesDetailsPageReqVO;
import com.cf.imes.module.system.controller.admin.organ.vo.organ.OrganCreateProductPurchaseReqVO;
import com.cf.imes.module.system.controller.admin.statistics.vo.ManageSalesTotalStatisticRespVO;
import com.cf.imes.module.system.dal.dataobject.funds.productpromotion.ProductPromotionDO;
import com.cf.imes.module.system.dal.dataobject.funds.products.ProductsDO;
import com.cf.imes.module.system.dal.dataobject.funds.products.ProductsDetailDO;
import com.cf.imes.module.system.dal.dataobject.funds.purchase.PurchaseRecordDO;
@@ -36,6 +37,7 @@ import com.cf.imes.module.system.enums.pay.PurchaseRecordStatusEnum;
import com.cf.imes.module.system.enums.pay.TradeTypeEnum;
import com.cf.imes.module.system.framework.snowflake.config.MybatisIdProperties;
import com.cf.imes.module.system.service.funds.delay.ProductDelayService;
import com.cf.imes.module.system.service.funds.productpromotion.ProductPromotionService;
import com.cf.imes.module.system.service.funds.products.ProductsDetailService;
import com.cf.imes.module.system.service.organ.OrganService;
import jakarta.annotation.Resource;
@@ -84,6 +86,9 @@ public class PurchaseServiceImpl implements PurchaseService {
@Lazy
private ProductDelayService productDelayService;
@Resource
private ProductPromotionService productPromotionService;
@Override
public PurchaseRecordDO getRecord(Long id) {
return purchaseRecordMapper.selectById(id);
@@ -159,7 +164,7 @@ public class PurchaseServiceImpl implements PurchaseService {
if (ObjectUtil.isNotNull(purchaseRecordDO)) {
// 查询延期记录
List<ProductDelayRespVO> recordsByPurchaseId = productDelayService.getRecordsByPurchaseId(purchaseRecordDO.getId(), organId);
if(CollUtil.isNotEmpty(recordsByPurchaseId)) {
if (CollUtil.isNotEmpty(recordsByPurchaseId)) {
// 延期记录是按自增id逆序的,第一条的延期后时间作为产品到期时间
purchaseRecordDO.setEndTime(recordsByPurchaseId.get(0).getDelayTime());
}
@@ -351,10 +356,13 @@ public class PurchaseServiceImpl implements PurchaseService {
pageReqVO.setProductId(productId);
PageResult<ProductsDetailDO> page = productsDetailService.getPage(pageReqVO);
// 查询可用的产品对应优惠活动
List<ProductPromotionDO> availableProductPromotionList = productPromotionService.getAvailableProductPromotionList(productId);
// 查询组织下的首次订购产品记录
PurchaseRecordDO orgInitialPurchaseRecord = getOrgInitialPurchaseRecord(organId, productId);
if (ObjectUtil.isNull(orgInitialPurchaseRecord)) {
return getInitialProductDetailList(productsDO, page.getList());
return getInitialProductDetailList(productsDO, page.getList(), availableProductPromotionList);
}
List<ProductDetailsRespVO> resultList = new ArrayList<>();
@@ -370,8 +378,10 @@ public class PurchaseServiceImpl implements PurchaseService {
// 折扣
BigDecimal discount = detailDO.getDiscount();
Integer durationUnit = detailDO.getDurationUnit();
// 重新计算购买价格
switch (ProductDurationUnitEnum.fromStatus(detailDO.getDurationUnit())) {
switch (ProductDurationUnitEnum.fromStatus(durationUnit)) {
case YEAR -> {
Integer duration = detailDO.getDuration();
// 原价
@@ -379,6 +389,8 @@ public class PurchaseServiceImpl implements PurchaseService {
newDetailRespVO.setOriginalPrice(originalPrice);
// 折扣价格
newDetailRespVO.setCurrentPrice(originalPrice.multiply(discount).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
// 补充优惠活动赠送时长
fillGiftDurationFromPromotion(duration, durationUnit, newDetailRespVO, availableProductPromotionList);
productDetailRespVOList.add(newDetailRespVO);
}
default -> {
@@ -393,6 +405,8 @@ public class PurchaseServiceImpl implements PurchaseService {
oneYearRespVO.setDurationUnit(ProductDurationUnitEnum.YEAR.getCode());
oneYearRespVO.setCurrentPrice(productsDO.getPrice());
oneYearRespVO.setOriginalPrice(productsDO.getPrice());
// 补充优惠活动赠送时长
fillGiftDurationFromPromotion(1, ProductDurationUnitEnum.YEAR.getCode(), oneYearRespVO, availableProductPromotionList);
productDetailRespVOList.add(oneYearRespVO);
}
// 默认展示1到10月的价格
@@ -419,14 +433,15 @@ public class PurchaseServiceImpl implements PurchaseService {
*
* @param productsDO
* @param productsDetailDOS
* @param availableProductPromotionList
* @return
*/
private List<ProductDetailsRespVO> getInitialProductDetailList(ProductsDO productsDO, List<ProductsDetailDO> productsDetailDOS) {
private List<ProductDetailsRespVO> getInitialProductDetailList(ProductsDO productsDO, List<ProductsDetailDO> productsDetailDOS, List<ProductPromotionDO> availableProductPromotionList) {
List<ProductDetailsRespVO> resultList = new ArrayList<>();
// 没有首次购买记录的产品,展示的总价是产品建议价格
// 1年定价
BigDecimal totalAmount = productsDO.getPrice();
if(ObjectUtil.isNull(totalAmount)) {
if (ObjectUtil.isNull(totalAmount)) {
throw new ServiceException(PRODUCT_PRICE_NULL_ERROR);
}
// 月均单价
@@ -437,8 +452,11 @@ public class PurchaseServiceImpl implements PurchaseService {
ProductDetailsRespVO newDetailRespVO = BeanUtils.toBean(detailDO, ProductDetailsRespVO.class);
// 折扣
BigDecimal discount = detailDO.getDiscount();
Integer durationUnit = detailDO.getDurationUnit();
// 重新计算购买价格
switch (ProductDurationUnitEnum.fromStatus(detailDO.getDurationUnit())) {
switch (ProductDurationUnitEnum.fromStatus(durationUnit)) {
case YEAR -> {
Integer duration = detailDO.getDuration();
// 原价
@@ -446,6 +464,8 @@ public class PurchaseServiceImpl implements PurchaseService {
newDetailRespVO.setOriginalPrice(originalPrice);
// 折扣价格
newDetailRespVO.setCurrentPrice(originalPrice.multiply(discount).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
// 补充优惠活动赠送时长
fillGiftDurationFromPromotion(duration, durationUnit, newDetailRespVO, availableProductPromotionList);
productDetailRespVOList.add(newDetailRespVO);
}
default -> {
@@ -461,6 +481,8 @@ public class PurchaseServiceImpl implements PurchaseService {
oneYearRespVO.setDurationUnit(ProductDurationUnitEnum.YEAR.getCode());
oneYearRespVO.setCurrentPrice(productsDO.getPrice());
oneYearRespVO.setOriginalPrice(productsDO.getPrice());
// 补充优惠活动赠送时长
fillGiftDurationFromPromotion(1, ProductDurationUnitEnum.YEAR.getCode(), oneYearRespVO, availableProductPromotionList);
productDetailRespVOList.add(oneYearRespVO);
}
@@ -482,6 +504,26 @@ public class PurchaseServiceImpl implements PurchaseService {
return resultList;
}
/**
* 填充优惠活动的赠送时间
*
* @param duration
* @param durationUnit
* @param productDetailsRespVO
* @param availableProductPromotionList
* @return
*/
private ProductDetailsRespVO fillGiftDurationFromPromotion(Integer duration, Integer durationUnit, ProductDetailsRespVO productDetailsRespVO, List<ProductPromotionDO> availableProductPromotionList) {
// 补充优惠活动的赠送时间
Optional<ProductPromotionDO> promotionOpt = availableProductPromotionList.stream().filter(p -> p.getPurchaseDuration().equals(duration) && p.getPurchaseDurationUnit().equals(durationUnit)).findFirst();
if (promotionOpt.isPresent()) {
ProductPromotionDO productPromotionDO = promotionOpt.get();
productDetailsRespVO.setGiftDuration(productPromotionDO.getGiftDuration());
productDetailsRespVO.setGiftDurationUnit(productPromotionDO.getGiftDurationUnit());
}
return productDetailsRespVO;
}
@Override
public void invalidHistoryOrganProductPurchaseRecord(Long organId, Long purchaseRecordId) {
purchaseRecordMapper.update(new LambdaUpdateWrapper<PurchaseRecordDO>()