diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/products/vo/productDetails/ProductDetailsRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/products/vo/productDetails/ProductDetailsRespVO.java index d94e6c739..d0e0bd61b 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/products/vo/productDetails/ProductDetailsRespVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/products/vo/productDetails/ProductDetailsRespVO.java @@ -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; diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/purchase/PurchaseServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/purchase/PurchaseServiceImpl.java index 28b5ca7ba..9d9b95984 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/purchase/PurchaseServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/purchase/PurchaseServiceImpl.java @@ -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 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 page = productsDetailService.getPage(pageReqVO); + // 查询可用的产品对应优惠活动 + List 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 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 getInitialProductDetailList(ProductsDO productsDO, List productsDetailDOS) { + private List getInitialProductDetailList(ProductsDO productsDO, List productsDetailDOS, List availableProductPromotionList) { List 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 availableProductPromotionList) { + // 补充优惠活动的赠送时间 + Optional 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()