diff --git a/docs/dev-ops/mysql/sql/group_buy_market.sql b/docs/dev-ops/mysql/sql/group_buy_market.sql index 4d71dd9..65549bc 100644 --- a/docs/dev-ops/mysql/sql/group_buy_market.sql +++ b/docs/dev-ops/mysql/sql/group_buy_market.sql @@ -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; diff --git a/docs/dev-ops/sql-back/0622group_buy_market.sql b/docs/dev-ops/sql-back/0622group_buy_market.sql new file mode 100644 index 0000000..4d71dd9 --- /dev/null +++ b/docs/dev-ops/sql-back/0622group_buy_market.sql @@ -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; + + diff --git a/group-buying-sys-app/src/main/resources/application-dev.yml b/group-buying-sys-app/src/main/resources/application-dev.yml index 4f042b1..d228fde 100644 --- a/group-buying-sys-app/src/main/resources/application-dev.yml +++ b/group-buying-sys-app/src/main/resources/application-dev.yml @@ -10,6 +10,7 @@ thread: max-pool-size: 50 keep-alive-time: 5000 block-queue-size: 5000 + # 当线程池中的任务队列已满,并且没有空闲线程可以执行新任务时,CallerRunsPolicy 会将任务回退到调用者线程中运行。这种策略适用于不希望丢失任务且可以接受调用者线程被阻塞的场景。 policy: CallerRunsPolicy # 数据库配置;启动时配置数据库资源信息 diff --git a/group-buying-sys-app/src/test/java/edu/whut/test/activity/IIndexGroupBuyMarketServiceTest.java b/group-buying-sys-app/src/test/java/edu/whut/test/domain/activity/IIndexGroupBuyMarketServiceTest.java similarity index 97% rename from group-buying-sys-app/src/test/java/edu/whut/test/activity/IIndexGroupBuyMarketServiceTest.java rename to group-buying-sys-app/src/test/java/edu/whut/test/domain/activity/IIndexGroupBuyMarketServiceTest.java index 918ea2c..9d972d8 100644 --- a/group-buying-sys-app/src/test/java/edu/whut/test/activity/IIndexGroupBuyMarketServiceTest.java +++ b/group-buying-sys-app/src/test/java/edu/whut/test/domain/activity/IIndexGroupBuyMarketServiceTest.java @@ -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; diff --git a/group-buying-sys-app/src/test/java/edu/whut/test/dao/GroupBuyActivityDaoTest.java b/group-buying-sys-app/src/test/java/edu/whut/test/infrastructure/dao/GroupBuyActivityDaoTest.java similarity index 95% rename from group-buying-sys-app/src/test/java/edu/whut/test/dao/GroupBuyActivityDaoTest.java rename to group-buying-sys-app/src/test/java/edu/whut/test/infrastructure/dao/GroupBuyActivityDaoTest.java index 9ed0447..99c04dd 100644 --- a/group-buying-sys-app/src/test/java/edu/whut/test/dao/GroupBuyActivityDaoTest.java +++ b/group-buying-sys-app/src/test/java/edu/whut/test/infrastructure/dao/GroupBuyActivityDaoTest.java @@ -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; diff --git a/group-buying-sys-app/src/test/java/edu/whut/test/dao/GroupBuyDiscountDaoTest.java b/group-buying-sys-app/src/test/java/edu/whut/test/infrastructure/dao/GroupBuyDiscountDaoTest.java similarity index 95% rename from group-buying-sys-app/src/test/java/edu/whut/test/dao/GroupBuyDiscountDaoTest.java rename to group-buying-sys-app/src/test/java/edu/whut/test/infrastructure/dao/GroupBuyDiscountDaoTest.java index 923d63f..0120861 100644 --- a/group-buying-sys-app/src/test/java/edu/whut/test/dao/GroupBuyDiscountDaoTest.java +++ b/group-buying-sys-app/src/test/java/edu/whut/test/infrastructure/dao/GroupBuyDiscountDaoTest.java @@ -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; diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/DiscountTypeEnum.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/DiscountTypeEnum.java new file mode 100644 index 0000000..7d63b9c --- /dev/null +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/DiscountTypeEnum.java @@ -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!"); + } + } + +} diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/GroupBuyActivityDiscountVO.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/GroupBuyActivityDiscountVO.java index 79d8046..42da3a6 100644 --- a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/GroupBuyActivityDiscountVO.java +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/GroupBuyActivityDiscountVO.java @@ -95,7 +95,7 @@ public class GroupBuyActivityDiscountVO { /** * 折扣类型(0:base、1:tag) */ - private Byte discountType; + private DiscountTypeEnum discountType; /** * 营销优惠计划(ZJ:直减、MJ:满减、N元购) diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IndexGroupBuyMarketServiceImpl.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IndexGroupBuyMarketServiceImpl.java index e570bc6..c973e9e 100644 --- a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IndexGroupBuyMarketServiceImpl.java +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IndexGroupBuyMarketServiceImpl.java @@ -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; diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/AbstractDiscountCalculateService.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/AbstractDiscountCalculateService.java new file mode 100644 index 0000000..1840e45 --- /dev/null +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/AbstractDiscountCalculateService.java @@ -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); + +} diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/IDiscountCalculateService.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/IDiscountCalculateService.java new file mode 100644 index 0000000..dae65cd --- /dev/null +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/IDiscountCalculateService.java @@ -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); + +} diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/MJCalculateService.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/MJCalculateService.java new file mode 100644 index 0000000..0f0a9c7 --- /dev/null +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/MJCalculateService.java @@ -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; + } + +} diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/NCalculateService.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/NCalculateService.java new file mode 100644 index 0000000..c5a3924 --- /dev/null +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/NCalculateService.java @@ -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); + } + +} diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/ZJCalculateService.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/ZJCalculateService.java new file mode 100644 index 0000000..5c990ec --- /dev/null +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/ZJCalculateService.java @@ -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; + } + +} diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/ZKCalculateService.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/ZKCalculateService.java new file mode 100644 index 0000000..c4ad7b6 --- /dev/null +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/discount/impl/ZKCalculateService.java @@ -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; + } + +} diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/AbstractGroupBuyMarketSupport.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/AbstractGroupBuyMarketSupport.java index 416d6ae..7e211f6 100644 --- a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/AbstractGroupBuyMarketSupport.java +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/AbstractGroupBuyMarketSupport.java @@ -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 extends AbstractMultiThreadStrategyRouter { protected long timeout = 500; diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/factory/DefaultActivityStrategyFactory.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/factory/DefaultActivityStrategyFactory.java index 1be8a2e..4139385 100644 --- a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/factory/DefaultActivityStrategyFactory.java +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/factory/DefaultActivityStrategyFactory.java @@ -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; } } diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/EndNode.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/EndNode.java index 94eb9de..0df3abe 100644 --- a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/EndNode.java +++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/EndNode.java @@ -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 { - @Resource - private ThreadPoolExecutor threadPoolExecutor; - @Resource - private EndNode endNode; + private final ThreadPoolExecutor threadPoolExecutor; + + private final EndNode endNode; + + private final Map discountCalculateServiceMap; + @Override protected void multiThread(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws ExecutionException, InterruptedException, TimeoutException { @@ -50,7 +59,20 @@ public class MarketNode extends AbstractGroupBuyMarketSupport implements Stra @Setter protected StrategyHandler defaultStrategyHandler = StrategyHandler.DEFAULT; + //实现自己的普通方法router public R router(T requestParameter, D dynamicContext) throws Exception { StrategyHandler 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 { // 异步加载数据 diff --git a/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/AbstractStrategyRouter.java b/group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/AbstractStrategyRouter.java similarity index 93% rename from group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/AbstractStrategyRouter.java rename to group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/AbstractStrategyRouter.java index 08f8bbf..1037bba 100644 --- a/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/AbstractStrategyRouter.java +++ b/group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/AbstractStrategyRouter.java @@ -1,4 +1,4 @@ -package edu.whut.types.framework.tree; +package edu.whut.types.design.framework.tree; import lombok.Getter; import lombok.Setter; diff --git a/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyHandler.java b/group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/StrategyHandler.java similarity index 84% rename from group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyHandler.java rename to group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/StrategyHandler.java index 6e70ca7..a12bfd3 100644 --- a/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyHandler.java +++ b/group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/StrategyHandler.java @@ -1,4 +1,4 @@ -package edu.whut.types.framework.tree; +package edu.whut.types.design.framework.tree; /** * 受理策略处理 diff --git a/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyMapper.java b/group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/StrategyMapper.java similarity index 89% rename from group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyMapper.java rename to group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/StrategyMapper.java index becda81..01d194d 100644 --- a/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyMapper.java +++ b/group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/StrategyMapper.java @@ -1,4 +1,4 @@ -package edu.whut.types.framework.tree; +package edu.whut.types.design.framework.tree; /** * 策略映射器 diff --git a/group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/package-info.java b/group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/package-info.java new file mode 100644 index 0000000..78d2c32 --- /dev/null +++ b/group-buying-sys-types/src/main/java/edu/whut/types/design/framework/tree/package-info.java @@ -0,0 +1,4 @@ +/** + * 通用设计模板;规则树 + */ +package edu.whut.types.design.framework.tree; \ No newline at end of file diff --git a/group-buying-sys-types/src/main/java/edu/whut/types/enums/ResponseCode.java b/group-buying-sys-types/src/main/java/edu/whut/types/enums/ResponseCode.java index 8189263..96dc557 100644 --- a/group-buying-sys-types/src/main/java/edu/whut/types/enums/ResponseCode.java +++ b/group-buying-sys-types/src/main/java/edu/whut/types/enums/ResponseCode.java @@ -12,6 +12,7 @@ public enum ResponseCode { SUCCESS("0000", "成功"), UN_ERROR("0001", "未知失败"), ILLEGAL_PARAMETER("0002", "非法参数"), + E0001("E0001", "不存在对应的折扣计算服务"), ; private String code; diff --git a/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/package-info.java b/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/package-info.java deleted file mode 100644 index b1e7308..0000000 --- a/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 通用设计模板;规则树 - */ -package edu.whut.types.framework.tree; \ No newline at end of file