6.25 策略模式+优惠折扣计算

This commit is contained in:
zhangsan 2025-06-25 20:36:48 +08:00
parent c81b97ece7
commit c268b51b9b
31 changed files with 384 additions and 31 deletions

View File

@ -47,7 +47,7 @@ CREATE TABLE `group_buy_discount` (
`discount_name` varchar(64) NOT NULL COMMENT '折扣标题',
`discount_desc` varchar(256) NOT NULL COMMENT '折扣描述',
`discount_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '折扣类型0:base、1:tag',
`market_plan` varchar(4) NOT NULL DEFAULT 'ZJ' COMMENT '营销优惠计划ZJ:直减、MJ:满减、N元购',
`market_plan` varchar(4) NOT NULL DEFAULT 'ZJ' COMMENT '营销优惠计划ZJ:直减、MJ:满减、ZK:折扣、N元购',
`market_expr` varchar(32) NOT NULL COMMENT '营销优惠表达式',
`tag_id` varchar(8) DEFAULT NULL COMMENT '人群标签,特定优惠限定',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
@ -60,7 +60,10 @@ LOCK TABLES `group_buy_discount` WRITE;
INSERT INTO `group_buy_discount` (`id`, `discount_id`, `discount_name`, `discount_desc`, `discount_type`, `market_plan`, `market_expr`, `tag_id`, `create_time`, `update_time`)
VALUES
(1,25120207,'测试优惠','测试优惠',0,'ZJ','20',NULL,'2025-06-19 10:20:15','2025-06-19 10:20:15');
(1,'25120207','直减优惠20元','直减优惠20元',0,'ZJ','20',NULL,'2025-06-25 14:02:13','2025-06-25 14:02:13'),
(2,'25120208','满减优惠100-10元','满减优惠100-10元',0,'MJ','100,10',NULL,'2025-06-25 14:02:13','2025-06-25 14:02:13'),
(4,'25120209','折扣优惠8折','折扣优惠8折',0,'ZK','0.8',NULL,'2025-06-25 14:02:13','2025-06-25 14:02:13'),
(5,'25120210','N元购买优惠','N元购买优惠',0,'N','1.99',NULL,'2025-06-25 14:02:13','2025-06-25 14:02:13');
UNLOCK TABLES;

View File

@ -0,0 +1,91 @@
SET NAMES utf8mb4;
CREATE database if NOT EXISTS `group_buying_sys` default character set utf8mb4 collate utf8mb4_0900_ai_ci;
use `group_buying_sys`;
DROP TABLE IF EXISTS `group_buy_activity`;
CREATE TABLE `group_buy_activity` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增',
`activity_id` bigint(8) NOT NULL COMMENT '活动ID',
`activity_name` varchar(128) NOT NULL COMMENT '活动名称',
`source` varchar(8) NOT NULL COMMENT '来源',
`channel` varchar(8) NOT NULL COMMENT '渠道',
`goods_id` varchar(12) NOT NULL COMMENT '商品ID',
`discount_id` varchar(8) NOT NULL COMMENT '折扣ID',
`group_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '拼团方式0自动成团、1达成目标拼团',
`take_limit_count` int(4) NOT NULL DEFAULT '1' COMMENT '拼团次数限制',
`target` int(5) NOT NULL DEFAULT '1' COMMENT '拼团目标',
`valid_time` int(4) NOT NULL DEFAULT '15' COMMENT '拼团时长(分钟)',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '活动状态0创建、1生效、2过期、3废弃',
`start_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '活动开始时间',
`end_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '活动结束时间',
`tag_id` varchar(8) DEFAULT NULL COMMENT '人群标签规则标识',
`tag_scope` varchar(4) DEFAULT NULL COMMENT '人群标签规则范围多选1可见限制、2参与限制',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uq_activity_id` (`activity_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='拼团活动';
LOCK TABLES `group_buy_activity` WRITE;
/*!40000 ALTER TABLE `group_buy_activity` DISABLE KEYS */;
INSERT INTO `group_buy_activity` (`id`, `activity_id`, `activity_name`, `source`, `channel`, `goods_id`, `discount_id`, `group_type`, `take_limit_count`, `target`, `valid_time`, `status`, `start_time`, `end_time`, `tag_id`, `tag_scope`, `create_time`, `update_time`)
VALUES
(1,100123,'测试活动','s01','c01','9890001','25120207',0,1,1,15,0,'2025-06-19 10:19:40','2025-06-19 10:19:40','1','1','2025-06-19 10:19:40','2025-06-19 11:47:27');
UNLOCK TABLES;
DROP TABLE IF EXISTS `group_buy_discount`;
CREATE TABLE `group_buy_discount` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`discount_id` int(8) NOT NULL COMMENT '折扣ID',
`discount_name` varchar(64) NOT NULL COMMENT '折扣标题',
`discount_desc` varchar(256) NOT NULL COMMENT '折扣描述',
`discount_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '折扣类型0:base、1:tag',
`market_plan` varchar(4) NOT NULL DEFAULT 'ZJ' COMMENT '营销优惠计划ZJ:直减、MJ:满减、N元购',
`market_expr` varchar(32) NOT NULL COMMENT '营销优惠表达式',
`tag_id` varchar(8) DEFAULT NULL COMMENT '人群标签,特定优惠限定',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uq_discount_id` (`discount_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOCK TABLES `group_buy_discount` WRITE;
INSERT INTO `group_buy_discount` (`id`, `discount_id`, `discount_name`, `discount_desc`, `discount_type`, `market_plan`, `market_expr`, `tag_id`, `create_time`, `update_time`)
VALUES
(1,25120207,'测试优惠','测试优惠',0,'ZJ','20',NULL,'2025-06-19 10:20:15','2025-06-19 10:20:15');
UNLOCK TABLES;
DROP TABLE IF EXISTS `sku`;
CREATE TABLE `sku` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`source` varchar(8) NOT NULL COMMENT '渠道',
`channel` varchar(8) NOT NULL COMMENT '来源',
`goods_id` varchar(16) NOT NULL COMMENT '商品ID',
`goods_name` varchar(128) NOT NULL COMMENT '商品名称',
`original_price` decimal(10,2) NOT NULL COMMENT '商品价格',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uq_goods_id` (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品信息';
LOCK TABLES `sku` WRITE;
INSERT INTO `sku` (`id`, `source`, `channel`, `goods_id`, `goods_name`, `original_price`, `create_time`, `update_time`)
VALUES
(1,'s01','c01','9890001','《手写MyBatis渐进式源码实践》',100.00,'2025-06-22 11:10:06','2025-06-22 11:10:06');
UNLOCK TABLES;

View File

@ -10,6 +10,7 @@ thread:
max-pool-size: 50
keep-alive-time: 5000
block-queue-size: 5000
# 当线程池中的任务队列已满并且没有空闲线程可以执行新任务时CallerRunsPolicy 会将任务回退到调用者线程中运行。这种策略适用于不希望丢失任务且可以接受调用者线程被阻塞的场景。
policy: CallerRunsPolicy
# 数据库配置;启动时配置数据库资源信息

View File

@ -1,4 +1,4 @@
package edu.whut.test.activity;
package edu.whut.test.domain.activity;
import com.alibaba.fastjson.JSON;
import edu.whut.domain.activity.model.entity.MarketProductEntity;

View File

@ -1,4 +1,4 @@
package edu.whut.test.dao;
package edu.whut.test.infrastructure.dao;
import com.alibaba.fastjson.JSON;
import edu.whut.infrastructure.dao.IGroupBuyActivityDao;

View File

@ -1,4 +1,4 @@
package edu.whut.test.dao;
package edu.whut.test.infrastructure.dao;
import com.alibaba.fastjson.JSON;
import edu.whut.infrastructure.dao.IGroupBuyDiscountDao;
import edu.whut.infrastructure.dao.po.GroupBuyDiscount;

View File

@ -0,0 +1,33 @@
package edu.whut.domain.activity.model.valobj;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* 折扣优惠类型
*/
@Getter
@AllArgsConstructor
@NoArgsConstructor
public enum DiscountTypeEnum {
BASE(0, "基础优惠"), //人人都能享受的折扣
TAG(1, "人群标签"), //满足人群标签的用户才能享受折扣
;
private Integer code;
private String info;
public static DiscountTypeEnum get(Integer code) {
switch (code) {
case 0:
return BASE;
case 1:
return TAG;
default:
throw new RuntimeException("err code!");
}
}
}

View File

@ -95,7 +95,7 @@ public class GroupBuyActivityDiscountVO {
/**
* 折扣类型0:base1:tag
*/
private Byte discountType;
private DiscountTypeEnum discountType;
/**
* 营销优惠计划ZJ:直减MJ:满减N元购

View File

@ -2,7 +2,7 @@ package edu.whut.domain.activity.service;
import edu.whut.domain.activity.model.entity.MarketProductEntity;
import edu.whut.domain.activity.model.entity.TrialBalanceEntity;
import edu.whut.domain.activity.service.trial.factory.DefaultActivityStrategyFactory;
import edu.whut.types.framework.tree.StrategyHandler;
import edu.whut.types.design.framework.tree.StrategyHandler;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

View File

@ -0,0 +1,33 @@
package edu.whut.domain.activity.service.discount;
import edu.whut.domain.activity.model.valobj.DiscountTypeEnum;
import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import java.math.BigDecimal;
/**
* 折扣计算服务抽象类
*/
public abstract class AbstractDiscountCalculateService implements IDiscountCalculateService {
@Override
public BigDecimal calculate(String userId, BigDecimal originalPrice, GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount) {
// 1. 人群标签过滤, 只有当 discountType = TAG 时才检查用户是否在标签范围内
if (DiscountTypeEnum.TAG.equals(groupBuyDiscount.getDiscountType())){
boolean isCrowdRange = filterTagId(userId, groupBuyDiscount.getTagId());
if (!isCrowdRange) return originalPrice; // 不在标签范围 无优惠
}
// 2. 折扣优惠计算
return doCalculate(originalPrice, groupBuyDiscount);
}
// 人群过滤 - 限定人群优惠
private boolean filterTagId(String userId, String tagId) {
return true;
}
//留给子类实现的抽象方法真正去算直减多少 / 满减多少 / N 元购
protected abstract BigDecimal doCalculate(BigDecimal originalPrice, GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount);
}

View File

@ -0,0 +1,21 @@
package edu.whut.domain.activity.service.discount;
import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import java.math.BigDecimal;
/**
* 折扣计算服务
*/
public interface IDiscountCalculateService {
/**
* 折扣计算
*
* @param userId 用户ID
* @param originalPrice 商品原始价格
* @param groupBuyDiscount 折扣计划配置
* @return 商品优惠价格
*/
BigDecimal calculate(String userId, BigDecimal originalPrice, GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount);
}

View File

@ -0,0 +1,44 @@
package edu.whut.domain.activity.service.discount.impl;
import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import edu.whut.domain.activity.service.discount.AbstractDiscountCalculateService;
import edu.whut.types.common.Constants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* 满减优惠计算
*/
@Slf4j
@Service("MJ")
public class MJCalculateService extends AbstractDiscountCalculateService {
@Override
public BigDecimal doCalculate(BigDecimal originalPrice, GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount) {
log.info("优惠策略折扣计算:{}", groupBuyDiscount.getDiscountType().getCode());
// 获取折扣表达式 - 100,10 满100减10元
String marketExpr = groupBuyDiscount.getMarketExpr();
String[] split = marketExpr.split(Constants.SPLIT);
BigDecimal x = new BigDecimal(split[0].trim());
BigDecimal y = new BigDecimal(split[1].trim());
// 不满足最低满减约束则按照原价
if (originalPrice.compareTo(x) < 0) {
return originalPrice;
}
// 折扣价格
BigDecimal deductionPrice = originalPrice.subtract(y);
// 判断折扣后金额最低支付1分钱
if (deductionPrice.compareTo(BigDecimal.ZERO) <= 0) {
return new BigDecimal("0.01");
}
return deductionPrice;
}
}

View File

@ -0,0 +1,26 @@
package edu.whut.domain.activity.service.discount.impl;
import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import edu.whut.domain.activity.service.discount.AbstractDiscountCalculateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* N元购计算
*/
@Slf4j
@Service("N")
public class NCalculateService extends AbstractDiscountCalculateService {
@Override
public BigDecimal doCalculate(BigDecimal originalPrice, GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount) {
log.info("优惠策略折扣计算:{}", groupBuyDiscount.getDiscountType().getCode());
// 折扣表达式 - 直接为优惠后的金额
String marketExpr = groupBuyDiscount.getMarketExpr();
// n元购
return new BigDecimal(marketExpr);
}
}

View File

@ -0,0 +1,34 @@
package edu.whut.domain.activity.service.discount.impl;
import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import edu.whut.domain.activity.service.discount.AbstractDiscountCalculateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* 直减
*/
@Slf4j
@Service("ZJ")
public class ZJCalculateService extends AbstractDiscountCalculateService {
@Override
public BigDecimal doCalculate(BigDecimal originalPrice, GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount) {
log.info("优惠策略折扣计算:{}", groupBuyDiscount.getDiscountType().getCode());
// 折扣表达式 - 直减为扣减金额
String marketExpr = groupBuyDiscount.getMarketExpr();
// 折扣价格
BigDecimal deductionPrice = originalPrice.subtract(new BigDecimal(marketExpr));
// 判断折扣后金额最低支付1分钱
if (deductionPrice.compareTo(BigDecimal.ZERO) <= 0) {
return new BigDecimal("0.01");
}
return deductionPrice;
}
}

View File

@ -0,0 +1,34 @@
package edu.whut.domain.activity.service.discount.impl;
import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import edu.whut.domain.activity.service.discount.AbstractDiscountCalculateService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* 折扣优惠计算
*/
@Slf4j
@Service("ZK")
public class ZKCalculateService extends AbstractDiscountCalculateService {
@Override
public BigDecimal doCalculate(BigDecimal originalPrice, GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount) {
log.info("优惠策略折扣计算:{}", groupBuyDiscount.getDiscountType().getCode());
// 折扣表达式 - 折扣百分比
String marketExpr = groupBuyDiscount.getMarketExpr();
// 折扣价格
BigDecimal deductionPrice = originalPrice.multiply(new BigDecimal(marketExpr));
// 判断折扣后金额最低支付1分钱
if (deductionPrice.compareTo(BigDecimal.ZERO) <= 0) {
return new BigDecimal("0.01");
}
return deductionPrice;
}
}

View File

@ -1,10 +1,8 @@
package edu.whut.domain.activity.service.trial;
import edu.whut.domain.activity.adapter.repository.IActivityRepository;
import edu.whut.domain.activity.model.entity.MarketProductEntity;
import edu.whut.domain.activity.model.entity.TrialBalanceEntity;
import edu.whut.domain.activity.service.trial.factory.DefaultActivityStrategyFactory;
import edu.whut.types.framework.tree.AbstractMultiThreadStrategyRouter;
import edu.whut.types.design.framework.tree.AbstractMultiThreadStrategyRouter;
import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;
@ -13,6 +11,7 @@ import java.util.concurrent.TimeoutException;
/**
* 抽象的拼团营销支撑类
*/
public abstract class AbstractGroupBuyMarketSupport<MarketProductEntity, DynamicContext, TrialBalanceEntity> extends AbstractMultiThreadStrategyRouter<edu.whut.domain.activity.model.entity.MarketProductEntity, DefaultActivityStrategyFactory.DynamicContext, edu.whut.domain.activity.model.entity.TrialBalanceEntity> {
protected long timeout = 500;

View File

@ -4,13 +4,15 @@ import edu.whut.domain.activity.model.entity.TrialBalanceEntity;
import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import edu.whut.domain.activity.model.valobj.SkuVO;
import edu.whut.domain.activity.service.trial.node.RootNode;
import edu.whut.types.framework.tree.StrategyHandler;
import edu.whut.types.design.framework.tree.StrategyHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
/**
* 活动策略工厂
*/
@ -36,6 +38,8 @@ public class DefaultActivityStrategyFactory {
private GroupBuyActivityDiscountVO groupBuyActivityDiscountVO;
// 商品信息
private SkuVO skuVO;
// 折扣价格
private BigDecimal deductionPrice;
}
}

View File

@ -6,7 +6,9 @@ import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import edu.whut.domain.activity.model.valobj.SkuVO;
import edu.whut.domain.activity.service.trial.AbstractGroupBuyMarketSupport;
import edu.whut.domain.activity.service.trial.factory.DefaultActivityStrategyFactory;
import edu.whut.types.framework.tree.StrategyHandler;
import edu.whut.types.design.framework.tree.StrategyHandler;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -26,6 +28,8 @@ public class EndNode extends AbstractGroupBuyMarketSupport<MarketProductEntity,
GroupBuyActivityDiscountVO groupBuyActivityDiscountVO = dynamicContext.getGroupBuyActivityDiscountVO();
SkuVO skuVO = dynamicContext.getSkuVO();
// 折扣价格
BigDecimal deductionPrice = dynamicContext.getDeductionPrice();
// 返回空结果
return TrialBalanceEntity.builder()
.goodsId(skuVO.getGoodsId())

View File

@ -4,15 +4,21 @@ import edu.whut.domain.activity.model.entity.MarketProductEntity;
import edu.whut.domain.activity.model.entity.TrialBalanceEntity;
import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import edu.whut.domain.activity.model.valobj.SkuVO;
import edu.whut.domain.activity.service.discount.IDiscountCalculateService;
import edu.whut.domain.activity.service.trial.AbstractGroupBuyMarketSupport;
import edu.whut.domain.activity.service.trial.factory.DefaultActivityStrategyFactory;
import edu.whut.domain.activity.service.trial.thread.QueryGroupBuyActivityDiscountVOThreadTask;
import edu.whut.domain.activity.service.trial.thread.QuerySkuVOFromDBThreadTask;
import edu.whut.types.framework.tree.StrategyHandler;
import edu.whut.types.design.framework.tree.StrategyHandler;
import edu.whut.types.enums.ResponseCode;
import edu.whut.types.exception.AppException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Map;
import java.util.concurrent.*;
/**
@ -20,12 +26,15 @@ import java.util.concurrent.*;
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class MarketNode extends AbstractGroupBuyMarketSupport<MarketProductEntity, DefaultActivityStrategyFactory.DynamicContext, TrialBalanceEntity> {
@Resource
private ThreadPoolExecutor threadPoolExecutor;
@Resource
private EndNode endNode;
private final ThreadPoolExecutor threadPoolExecutor;
private final EndNode endNode;
private final Map<String, IDiscountCalculateService> discountCalculateServiceMap;
@Override
protected void multiThread(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws ExecutionException, InterruptedException, TimeoutException {
@ -50,7 +59,20 @@ public class MarketNode extends AbstractGroupBuyMarketSupport<MarketProductEntit
public TrialBalanceEntity doApply(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
log.info("拼团商品查询试算服务-MarketNode userId:{} requestParameter:{}", requestParameter.getUserId(), JSON.toJSONString(requestParameter));
// todo xfg 拼团优惠试算
GroupBuyActivityDiscountVO groupBuyActivityDiscountVO = dynamicContext.getGroupBuyActivityDiscountVO();
GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount = groupBuyActivityDiscountVO.getGroupBuyDiscount();
SkuVO skuVO = dynamicContext.getSkuVO();
IDiscountCalculateService discountCalculateService = discountCalculateServiceMap.get(groupBuyDiscount.getMarketPlan());
if (null == discountCalculateService) {
log.info("不存在{}类型的折扣计算服务,支持类型为:{}", groupBuyDiscount.getMarketPlan(), JSON.toJSONString(discountCalculateServiceMap.keySet()));
throw new AppException(ResponseCode.E0001.getCode(), ResponseCode.E0001.getInfo());
}
// 折扣价格
BigDecimal deductionPrice = discountCalculateService.calculate(requestParameter.getUserId(), skuVO.getOriginalPrice(), groupBuyDiscount);
dynamicContext.setDeductionPrice(deductionPrice);
return router(requestParameter, dynamicContext);
}

View File

@ -7,7 +7,7 @@ import edu.whut.domain.activity.service.trial.AbstractGroupBuyMarketSupport;
import edu.whut.domain.activity.service.trial.factory.DefaultActivityStrategyFactory;
import edu.whut.types.enums.ResponseCode;
import edu.whut.types.exception.AppException;
import edu.whut.types.framework.tree.StrategyHandler;
import edu.whut.types.design.framework.tree.StrategyHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

View File

@ -3,7 +3,7 @@ import edu.whut.domain.activity.model.entity.MarketProductEntity;
import edu.whut.domain.activity.model.entity.TrialBalanceEntity;
import edu.whut.domain.activity.service.trial.AbstractGroupBuyMarketSupport;
import edu.whut.domain.activity.service.trial.factory.DefaultActivityStrategyFactory;
import edu.whut.types.framework.tree.StrategyHandler;
import edu.whut.types.design.framework.tree.StrategyHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

View File

@ -1,6 +1,7 @@
package edu.whut.infrastructure.adapter.repository;
import edu.whut.domain.activity.adapter.repository.IActivityRepository;
import edu.whut.domain.activity.model.valobj.DiscountTypeEnum;
import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
import edu.whut.domain.activity.model.valobj.SkuVO;
import edu.whut.infrastructure.dao.IGroupBuyActivityDao;
@ -41,7 +42,7 @@ public class ActivityRepository implements IActivityRepository {
GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount = GroupBuyActivityDiscountVO.GroupBuyDiscount.builder()
.discountName(groupBuyDiscountRes.getDiscountName())
.discountDesc(groupBuyDiscountRes.getDiscountDesc())
.discountType(groupBuyDiscountRes.getDiscountType())
.discountType(DiscountTypeEnum.get(groupBuyDiscountRes.getDiscountType()))
.marketPlan(groupBuyDiscountRes.getMarketPlan())
.marketExpr(groupBuyDiscountRes.getMarketExpr())
.tagId(groupBuyDiscountRes.getTagId())

View File

@ -39,7 +39,7 @@ public class GroupBuyDiscount {
/**
* 折扣类型0:base1:tag
*/
private Byte discountType;
private Integer discountType;
/**
* 营销优惠计划ZJ:直减MJ:满减N元购

View File

@ -3,4 +3,4 @@
* @author Fuzhengwei bugstack.cn @小傅哥
* @create 2024-12-14 12:04
*/
package edu.whut.types.framework.link;
package edu.whut.types.design.framework.link;

View File

@ -1,4 +1,4 @@
package edu.whut.types.framework.tree;
package edu.whut.types.design.framework.tree;
import lombok.Getter;
import lombok.Setter;
@ -15,12 +15,14 @@ public abstract class AbstractMultiThreadStrategyRouter<T, D, R> implements Stra
@Setter
protected StrategyHandler<T, D, R> defaultStrategyHandler = StrategyHandler.DEFAULT;
//实现自己的普通方法router
public R router(T requestParameter, D dynamicContext) throws Exception {
StrategyHandler<T, D, R> strategyHandler = get(requestParameter, dynamicContext);
if(null != strategyHandler) return strategyHandler.apply(requestParameter, dynamicContext);
return defaultStrategyHandler.apply(requestParameter, dynamicContext);
}
//实现了接口中的apply方法
@Override
public R apply(T requestParameter, D dynamicContext) throws Exception {
// 异步加载数据

View File

@ -1,4 +1,4 @@
package edu.whut.types.framework.tree;
package edu.whut.types.design.framework.tree;
import lombok.Getter;
import lombok.Setter;

View File

@ -1,4 +1,4 @@
package edu.whut.types.framework.tree;
package edu.whut.types.design.framework.tree;
/**
* 受理策略处理

View File

@ -1,4 +1,4 @@
package edu.whut.types.framework.tree;
package edu.whut.types.design.framework.tree;
/**
* 策略映射器

View File

@ -0,0 +1,4 @@
/**
* 通用设计模板规则树
*/
package edu.whut.types.design.framework.tree;

View File

@ -12,6 +12,7 @@ public enum ResponseCode {
SUCCESS("0000", "成功"),
UN_ERROR("0001", "未知失败"),
ILLEGAL_PARAMETER("0002", "非法参数"),
E0001("E0001", "不存在对应的折扣计算服务"),
;
private String code;

View File

@ -1,4 +0,0 @@
/**
* 通用设计模板规则树
*/
package edu.whut.types.framework.tree;