6.25 策略模式+优惠折扣计算
This commit is contained in:
parent
c81b97ece7
commit
c268b51b9b
@ -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;
|
||||
|
||||
|
91
docs/dev-ops/sql-back/0622group_buy_market.sql
Normal file
91
docs/dev-ops/sql-back/0622group_buy_market.sql
Normal 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;
|
||||
|
||||
|
@ -10,6 +10,7 @@ thread:
|
||||
max-pool-size: 50
|
||||
keep-alive-time: 5000
|
||||
block-queue-size: 5000
|
||||
# 当线程池中的任务队列已满,并且没有空闲线程可以执行新任务时,CallerRunsPolicy 会将任务回退到调用者线程中运行。这种策略适用于不希望丢失任务且可以接受调用者线程被阻塞的场景。
|
||||
policy: CallerRunsPolicy
|
||||
|
||||
# 数据库配置;启动时配置数据库资源信息
|
||||
|
@ -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;
|
@ -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;
|
@ -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;
|
@ -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!");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -95,7 +95,7 @@ public class GroupBuyActivityDiscountVO {
|
||||
/**
|
||||
* 折扣类型(0:base、1:tag)
|
||||
*/
|
||||
private Byte discountType;
|
||||
private DiscountTypeEnum discountType;
|
||||
|
||||
/**
|
||||
* 营销优惠计划(ZJ:直减、MJ:满减、N元购)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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())
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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())
|
||||
|
@ -39,7 +39,7 @@ public class GroupBuyDiscount {
|
||||
/**
|
||||
* 折扣类型(0:base、1:tag)
|
||||
*/
|
||||
private Byte discountType;
|
||||
private Integer discountType;
|
||||
|
||||
/**
|
||||
* 营销优惠计划(ZJ:直减、MJ:满减、N元购)
|
||||
|
@ -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;
|
@ -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 {
|
||||
// 异步加载数据
|
@ -1,4 +1,4 @@
|
||||
package edu.whut.types.framework.tree;
|
||||
package edu.whut.types.design.framework.tree;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
@ -1,4 +1,4 @@
|
||||
package edu.whut.types.framework.tree;
|
||||
package edu.whut.types.design.framework.tree;
|
||||
|
||||
/**
|
||||
* 受理策略处理
|
@ -1,4 +1,4 @@
|
||||
package edu.whut.types.framework.tree;
|
||||
package edu.whut.types.design.framework.tree;
|
||||
|
||||
/**
|
||||
* 策略映射器
|
@ -0,0 +1,4 @@
|
||||
/**
|
||||
* 通用设计模板;规则树
|
||||
*/
|
||||
package edu.whut.types.design.framework.tree;
|
@ -12,6 +12,7 @@ public enum ResponseCode {
|
||||
SUCCESS("0000", "成功"),
|
||||
UN_ERROR("0001", "未知失败"),
|
||||
ILLEGAL_PARAMETER("0002", "非法参数"),
|
||||
E0001("E0001", "不存在对应的折扣计算服务"),
|
||||
;
|
||||
|
||||
private String code;
|
||||
|
@ -1,4 +0,0 @@
|
||||
/**
|
||||
* 通用设计模板;规则树
|
||||
*/
|
||||
package edu.whut.types.framework.tree;
|
Loading…
x
Reference in New Issue
Block a user