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

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") @Schema(description = "产品时长单位,0:年、1:月", example = "1")
private Integer durationUnit; 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") @Schema(description = "产品原价", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private BigDecimal originalPrice; 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.funds.purchase.vo.SalesDetailsPageReqVO;
import com.cf.imes.module.system.controller.admin.organ.vo.organ.OrganCreateProductPurchaseReqVO; 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.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.ProductsDO;
import com.cf.imes.module.system.dal.dataobject.funds.products.ProductsDetailDO; import com.cf.imes.module.system.dal.dataobject.funds.products.ProductsDetailDO;
import com.cf.imes.module.system.dal.dataobject.funds.purchase.PurchaseRecordDO; 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.enums.pay.TradeTypeEnum;
import com.cf.imes.module.system.framework.snowflake.config.MybatisIdProperties; 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.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.funds.products.ProductsDetailService;
import com.cf.imes.module.system.service.organ.OrganService; import com.cf.imes.module.system.service.organ.OrganService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@@ -84,6 +86,9 @@ public class PurchaseServiceImpl implements PurchaseService {
@Lazy @Lazy
private ProductDelayService productDelayService; private ProductDelayService productDelayService;
@Resource
private ProductPromotionService productPromotionService;
@Override @Override
public PurchaseRecordDO getRecord(Long id) { public PurchaseRecordDO getRecord(Long id) {
return purchaseRecordMapper.selectById(id); return purchaseRecordMapper.selectById(id);
@@ -351,10 +356,13 @@ public class PurchaseServiceImpl implements PurchaseService {
pageReqVO.setProductId(productId); pageReqVO.setProductId(productId);
PageResult<ProductsDetailDO> page = productsDetailService.getPage(pageReqVO); PageResult<ProductsDetailDO> page = productsDetailService.getPage(pageReqVO);
// 查询可用的产品对应优惠活动
List<ProductPromotionDO> availableProductPromotionList = productPromotionService.getAvailableProductPromotionList(productId);
// 查询组织下的首次订购产品记录 // 查询组织下的首次订购产品记录
PurchaseRecordDO orgInitialPurchaseRecord = getOrgInitialPurchaseRecord(organId, productId); PurchaseRecordDO orgInitialPurchaseRecord = getOrgInitialPurchaseRecord(organId, productId);
if (ObjectUtil.isNull(orgInitialPurchaseRecord)) { if (ObjectUtil.isNull(orgInitialPurchaseRecord)) {
return getInitialProductDetailList(productsDO, page.getList()); return getInitialProductDetailList(productsDO, page.getList(), availableProductPromotionList);
} }
List<ProductDetailsRespVO> resultList = new ArrayList<>(); List<ProductDetailsRespVO> resultList = new ArrayList<>();
@@ -370,8 +378,10 @@ public class PurchaseServiceImpl implements PurchaseService {
// 折扣 // 折扣
BigDecimal discount = detailDO.getDiscount(); BigDecimal discount = detailDO.getDiscount();
Integer durationUnit = detailDO.getDurationUnit();
// 重新计算购买价格 // 重新计算购买价格
switch (ProductDurationUnitEnum.fromStatus(detailDO.getDurationUnit())) { switch (ProductDurationUnitEnum.fromStatus(durationUnit)) {
case YEAR -> { case YEAR -> {
Integer duration = detailDO.getDuration(); Integer duration = detailDO.getDuration();
// 原价 // 原价
@@ -379,6 +389,8 @@ public class PurchaseServiceImpl implements PurchaseService {
newDetailRespVO.setOriginalPrice(originalPrice); newDetailRespVO.setOriginalPrice(originalPrice);
// 折扣价格 // 折扣价格
newDetailRespVO.setCurrentPrice(originalPrice.multiply(discount).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN)); newDetailRespVO.setCurrentPrice(originalPrice.multiply(discount).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
// 补充优惠活动赠送时长
fillGiftDurationFromPromotion(duration, durationUnit, newDetailRespVO, availableProductPromotionList);
productDetailRespVOList.add(newDetailRespVO); productDetailRespVOList.add(newDetailRespVO);
} }
default -> { default -> {
@@ -393,6 +405,8 @@ public class PurchaseServiceImpl implements PurchaseService {
oneYearRespVO.setDurationUnit(ProductDurationUnitEnum.YEAR.getCode()); oneYearRespVO.setDurationUnit(ProductDurationUnitEnum.YEAR.getCode());
oneYearRespVO.setCurrentPrice(productsDO.getPrice()); oneYearRespVO.setCurrentPrice(productsDO.getPrice());
oneYearRespVO.setOriginalPrice(productsDO.getPrice()); oneYearRespVO.setOriginalPrice(productsDO.getPrice());
// 补充优惠活动赠送时长
fillGiftDurationFromPromotion(1, ProductDurationUnitEnum.YEAR.getCode(), oneYearRespVO, availableProductPromotionList);
productDetailRespVOList.add(oneYearRespVO); productDetailRespVOList.add(oneYearRespVO);
} }
// 默认展示1到10月的价格 // 默认展示1到10月的价格
@@ -419,9 +433,10 @@ public class PurchaseServiceImpl implements PurchaseService {
* *
* @param productsDO * @param productsDO
* @param productsDetailDOS * @param productsDetailDOS
* @param availableProductPromotionList
* @return * @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<>(); List<ProductDetailsRespVO> resultList = new ArrayList<>();
// 没有首次购买记录的产品,展示的总价是产品建议价格 // 没有首次购买记录的产品,展示的总价是产品建议价格
// 1年定价 // 1年定价
@@ -437,8 +452,11 @@ public class PurchaseServiceImpl implements PurchaseService {
ProductDetailsRespVO newDetailRespVO = BeanUtils.toBean(detailDO, ProductDetailsRespVO.class); ProductDetailsRespVO newDetailRespVO = BeanUtils.toBean(detailDO, ProductDetailsRespVO.class);
// 折扣 // 折扣
BigDecimal discount = detailDO.getDiscount(); BigDecimal discount = detailDO.getDiscount();
Integer durationUnit = detailDO.getDurationUnit();
// 重新计算购买价格 // 重新计算购买价格
switch (ProductDurationUnitEnum.fromStatus(detailDO.getDurationUnit())) { switch (ProductDurationUnitEnum.fromStatus(durationUnit)) {
case YEAR -> { case YEAR -> {
Integer duration = detailDO.getDuration(); Integer duration = detailDO.getDuration();
// 原价 // 原价
@@ -446,6 +464,8 @@ public class PurchaseServiceImpl implements PurchaseService {
newDetailRespVO.setOriginalPrice(originalPrice); newDetailRespVO.setOriginalPrice(originalPrice);
// 折扣价格 // 折扣价格
newDetailRespVO.setCurrentPrice(originalPrice.multiply(discount).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN)); newDetailRespVO.setCurrentPrice(originalPrice.multiply(discount).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN));
// 补充优惠活动赠送时长
fillGiftDurationFromPromotion(duration, durationUnit, newDetailRespVO, availableProductPromotionList);
productDetailRespVOList.add(newDetailRespVO); productDetailRespVOList.add(newDetailRespVO);
} }
default -> { default -> {
@@ -461,6 +481,8 @@ public class PurchaseServiceImpl implements PurchaseService {
oneYearRespVO.setDurationUnit(ProductDurationUnitEnum.YEAR.getCode()); oneYearRespVO.setDurationUnit(ProductDurationUnitEnum.YEAR.getCode());
oneYearRespVO.setCurrentPrice(productsDO.getPrice()); oneYearRespVO.setCurrentPrice(productsDO.getPrice());
oneYearRespVO.setOriginalPrice(productsDO.getPrice()); oneYearRespVO.setOriginalPrice(productsDO.getPrice());
// 补充优惠活动赠送时长
fillGiftDurationFromPromotion(1, ProductDurationUnitEnum.YEAR.getCode(), oneYearRespVO, availableProductPromotionList);
productDetailRespVOList.add(oneYearRespVO); productDetailRespVOList.add(oneYearRespVO);
} }
@@ -482,6 +504,26 @@ public class PurchaseServiceImpl implements PurchaseService {
return resultList; 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 @Override
public void invalidHistoryOrganProductPurchaseRecord(Long organId, Long purchaseRecordId) { public void invalidHistoryOrganProductPurchaseRecord(Long organId, Long purchaseRecordId) {
purchaseRecordMapper.update(new LambdaUpdateWrapper<PurchaseRecordDO>() purchaseRecordMapper.update(new LambdaUpdateWrapper<PurchaseRecordDO>()