From 59baf8811b840ad17ccba591e7ee43c12df72b49 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Thu, 25 Sep 2025 10:40:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(pricing):=20=E6=B7=BB=E5=8A=A0=E5=95=86?= =?UTF-8?q?=E5=93=81=E4=B8=80=E5=8F=A3=E4=BB=B7=E4=BC=98=E6=83=A0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 PriceProductConfig 实体中新增 canUseOnePrice 字段 - 更新数据库插入和更新语句,支持 canUseOnePrice 字段持久化- 在 OnePricePurchaseDiscountProvider 中实现商品一口价优惠支持检查逻辑 - 新增 areAllProductsSupportOnePrice 方法,验证购物车商品是否支持一口价优惠 - 支持查询具体商品配置和默认配置的一口价优惠设置 - 添加日志记录和异常处理,确保检查过程不影响主流程 --- .../pricing/entity/PriceProductConfig.java | 7 ++- .../mapper/PriceProductConfigMapper.java | 6 +- .../OnePricePurchaseDiscountProvider.java | 60 ++++++++++++++++++- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/ycwl/basic/pricing/entity/PriceProductConfig.java b/src/main/java/com/ycwl/basic/pricing/entity/PriceProductConfig.java index aa4452a7..037e6017 100644 --- a/src/main/java/com/ycwl/basic/pricing/entity/PriceProductConfig.java +++ b/src/main/java/com/ycwl/basic/pricing/entity/PriceProductConfig.java @@ -68,7 +68,12 @@ public class PriceProductConfig { * 是否可使用券码 */ private Boolean canUseVoucher; - + + /** + * 是否可使用一口价优惠 + */ + private Boolean canUseOnePrice; + @TableField("create_time") private Date createTime; diff --git a/src/main/java/com/ycwl/basic/pricing/mapper/PriceProductConfigMapper.java b/src/main/java/com/ycwl/basic/pricing/mapper/PriceProductConfigMapper.java index eec4d5fc..1f890f24 100644 --- a/src/main/java/com/ycwl/basic/pricing/mapper/PriceProductConfigMapper.java +++ b/src/main/java/com/ycwl/basic/pricing/mapper/PriceProductConfigMapper.java @@ -57,15 +57,15 @@ public interface PriceProductConfigMapper extends BaseMapper /** * 插入商品价格配置 */ - @Insert("INSERT INTO price_product_config (product_type, product_id, scenic_id, product_name, base_price, original_price, unit, is_active, can_use_coupon, can_use_voucher, create_time, update_time) " + - "VALUES (#{productType}, #{productId}, #{scenicId}, #{productName}, #{basePrice}, #{originalPrice}, #{unit}, #{isActive}, #{canUseCoupon}, #{canUseVoucher}, NOW(), NOW())") + @Insert("INSERT INTO price_product_config (product_type, product_id, scenic_id, product_name, base_price, original_price, unit, is_active, can_use_coupon, can_use_voucher, can_use_one_price, create_time, update_time) " + + "VALUES (#{productType}, #{productId}, #{scenicId}, #{productName}, #{basePrice}, #{originalPrice}, #{unit}, #{isActive}, #{canUseCoupon}, #{canUseVoucher}, #{canUseOnePrice}, NOW(), NOW())") int insertProductConfig(PriceProductConfig config); /** * 更新商品价格配置 */ @Update("UPDATE price_product_config SET product_id = #{productId}, scenic_id = #{scenicId}, product_name = #{productName}, base_price = #{basePrice}, " + - "original_price = #{originalPrice}, unit = #{unit}, is_active = #{isActive}, can_use_coupon = #{canUseCoupon}, can_use_voucher = #{canUseVoucher}, update_time = NOW() WHERE id = #{id}") + "original_price = #{originalPrice}, unit = #{unit}, is_active = #{isActive}, can_use_coupon = #{canUseCoupon}, can_use_voucher = #{canUseVoucher}, can_use_one_price = #{canUseOnePrice}, update_time = NOW() WHERE id = #{id}") int updateProductConfig(PriceProductConfig config); /** diff --git a/src/main/java/com/ycwl/basic/pricing/service/impl/OnePricePurchaseDiscountProvider.java b/src/main/java/com/ycwl/basic/pricing/service/impl/OnePricePurchaseDiscountProvider.java index d066e159..37cf6b71 100644 --- a/src/main/java/com/ycwl/basic/pricing/service/impl/OnePricePurchaseDiscountProvider.java +++ b/src/main/java/com/ycwl/basic/pricing/service/impl/OnePricePurchaseDiscountProvider.java @@ -4,8 +4,11 @@ import com.ycwl.basic.pricing.dto.DiscountDetectionContext; import com.ycwl.basic.pricing.dto.DiscountInfo; import com.ycwl.basic.pricing.dto.DiscountResult; import com.ycwl.basic.pricing.dto.OnePriceInfo; +import com.ycwl.basic.pricing.dto.ProductItem; +import com.ycwl.basic.pricing.entity.PriceProductConfig; import com.ycwl.basic.pricing.service.IDiscountProvider; import com.ycwl.basic.pricing.service.IOnePricePurchaseService; +import com.ycwl.basic.pricing.service.IProductConfigService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -21,8 +24,9 @@ import java.util.List; @Component @RequiredArgsConstructor public class OnePricePurchaseDiscountProvider implements IDiscountProvider { - + private final IOnePricePurchaseService onePricePurchaseService; + private final IProductConfigService productConfigService; @Override public String getProviderType() { @@ -49,6 +53,12 @@ public class OnePricePurchaseDiscountProvider implements IDiscountProvider { log.debug("景区 {} 不适用一口价", context.getScenicId()); return discounts; } + + // 检查商品是否支持一口价优惠 + if (!areAllProductsSupportOnePrice(context.getProducts())) { + log.debug("存在不支持一口价优惠的商品,跳过一口价检测"); + return discounts; + } // 获取一口价信息 OnePriceInfo onePriceInfo = onePricePurchaseService.getOnePriceInfo( @@ -170,6 +180,54 @@ public class OnePricePurchaseDiscountProvider implements IDiscountProvider { return BigDecimal.ZERO; } + /** + * 检查购物车中的所有商品是否都支持一口价优惠 + */ + private boolean areAllProductsSupportOnePrice(List products) { + if (products == null || products.isEmpty()) { + return true; // 空购物车时默认支持 + } + + for (ProductItem product : products) { + try { + // 查询商品配置 + PriceProductConfig productConfig = productConfigService.getProductConfig( + product.getProductType().getCode(), product.getProductId()); + + if (productConfig != null) { + // 检查商品是否支持一口价优惠 + if (Boolean.FALSE.equals(productConfig.getCanUseOnePrice())) { + log.debug("商品 {}({}) 不支持一口价优惠", + product.getProductType().getCode(), product.getProductId()); + return false; + } + } else { + // 如果找不到具体商品配置,尝试查询 default 配置 + PriceProductConfig defaultConfig = productConfigService.getProductConfig( + product.getProductType().getCode(), "default"); + + if (defaultConfig != null) { + if (Boolean.FALSE.equals(defaultConfig.getCanUseOnePrice())) { + log.debug("商品类型 {} 的默认配置不支持一口价优惠", + product.getProductType().getCode()); + return false; + } + } else { + // 如果既没有具体配置也没有默认配置,默认支持一口价优惠 + log.debug("商品 {}({}) 未找到价格配置,默认支持一口价优惠", + product.getProductType().getCode(), product.getProductId()); + } + } + } catch (Exception e) { + log.warn("检查商品 {}({}) 一口价优惠支持情况时发生异常,默认支持", + product.getProductType().getCode(), product.getProductId(), e); + // 异常情况下默认支持,避免影响正常业务流程 + } + } + + return true; + } + /** * 检查优惠叠加规则 */