From c81b97ece7e6c959a55c10698f9ee66de33e4e5c Mon Sep 17 00:00:00 2001
From: zhangsan <646228430@qq.com>
Date: Sun, 22 Jun 2025 22:05:07 +0800
Subject: [PATCH] =?UTF-8?q?6.22=20=E8=AF=95=E7=AE=97=E6=A8=A1=E5=9E=8B?=
=?UTF-8?q?=E6=8A=BD=E8=B1=A1=E6=A8=A1=E6=9D=BF=E8=AE=BE=E8=AE=A1=E4=BB=A5?=
=?UTF-8?q?=E5=8F=8A=E5=A4=9A=E7=BA=BF=E7=A8=8B=E6=95=B0=E6=8D=AE=E5=BC=82?=
=?UTF-8?q?=E6=AD=A5=E5=8A=A0=E8=BD=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/dev-ops/mysql/sql/group_buy_market.sql | 60 ++++-----
.../dev-ops/sql-back/0619group_buy_market.sql | 70 +++++++++++
.../mapper/group_buy_activity_mapper.xml | 11 ++
.../mapper/group_buy_discount_mapper.xml | 6 +
.../resources/mybatis/mapper/sku_mapper.xml | 22 ++++
.../IIndexGroupBuyMarketServiceTest.java | 39 ++++++
.../adapter/package-info.java | 2 +-
.../adapter/port/package-info.java | 2 +-
.../repository/IActivityRepository.java | 14 +++
.../adapter/repository/package-info.java | 2 +-
.../model/aggregate/package-info.java | 2 +-
.../model/entity/MarketProductEntity.java | 26 ++++
.../model/entity/TrialBalanceEntity.java | 39 ++++++
.../valobj/GroupBuyActivityDiscountVO.java | 116 ++++++++++++++++++
.../domain/activity/model/valobj/SkuVO.java | 26 ++++
.../service/IIndexGroupBuyMarketService.java | 13 ++
.../IndexGroupBuyMarketServiceImpl.java | 29 +++++
.../domain/activity/service/package-info.java | 1 +
.../trial/AbstractGroupBuyMarketSupport.java | 27 ++++
.../DefaultActivityStrategyFactory.java | 41 +++++++
.../activity/service/trial/node/EndNode.java | 48 ++++++++
.../service/trial/node/MarketNode.java | 63 ++++++++++
.../activity/service/trial/node/RootNode.java | 43 +++++++
.../service/trial/node/SwitchNode.java | 31 +++++
...yGroupBuyActivityDiscountVOThreadTask.java | 39 ++++++
.../thread/QuerySkuVOFromDBThreadTask.java | 27 ++++
.../domain/xxx/model/entity/package-info.java | 7 --
.../domain/xxx/model/valobj/package-info.java | 6 -
.../whut/domain/xxx/service/package-info.java | 1 -
.../repository/ActivityRepository.java | 79 ++++++++++++
.../dao/IGroupBuyActivityDao.java | 2 +
.../dao/IGroupBuyDiscountDao.java | 2 +
.../edu/whut/infrastructure/dao/ISkuDao.java | 13 ++
.../edu/whut/infrastructure/dao/po/Sku.java | 37 ++++++
.../types/framework/link/package-info.java | 6 +
.../AbstractMultiThreadStrategyRouter.java | 42 +++++++
.../tree/AbstractStrategyRouter.java | 21 ++++
.../types/framework/tree/StrategyHandler.java | 15 +++
.../types/framework/tree/StrategyMapper.java | 21 ++++
.../types/framework/tree/package-info.java | 4 +
40 files changed, 1002 insertions(+), 53 deletions(-)
create mode 100644 docs/dev-ops/sql-back/0619group_buy_market.sql
create mode 100644 group-buying-sys-app/src/main/resources/mybatis/mapper/sku_mapper.xml
create mode 100644 group-buying-sys-app/src/test/java/edu/whut/test/activity/IIndexGroupBuyMarketServiceTest.java
rename group-buying-sys-domain/src/main/java/edu/whut/domain/{xxx => activity}/adapter/package-info.java (80%)
rename group-buying-sys-domain/src/main/java/edu/whut/domain/{xxx => activity}/adapter/port/package-info.java (78%)
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/repository/IActivityRepository.java
rename group-buying-sys-domain/src/main/java/edu/whut/domain/{xxx => activity}/adapter/repository/package-info.java (63%)
rename group-buying-sys-domain/src/main/java/edu/whut/domain/{xxx => activity}/model/aggregate/package-info.java (85%)
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/entity/MarketProductEntity.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/entity/TrialBalanceEntity.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/GroupBuyActivityDiscountVO.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/SkuVO.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IIndexGroupBuyMarketService.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IndexGroupBuyMarketServiceImpl.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/package-info.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/AbstractGroupBuyMarketSupport.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/factory/DefaultActivityStrategyFactory.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/EndNode.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/MarketNode.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/RootNode.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/SwitchNode.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/thread/QueryGroupBuyActivityDiscountVOThreadTask.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/thread/QuerySkuVOFromDBThreadTask.java
delete mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/entity/package-info.java
delete mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/valobj/package-info.java
delete mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/service/package-info.java
create mode 100644 group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/ActivityRepository.java
create mode 100644 group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/ISkuDao.java
create mode 100644 group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/Sku.java
create mode 100644 group-buying-sys-types/src/main/java/edu/whut/types/framework/link/package-info.java
create mode 100644 group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/AbstractMultiThreadStrategyRouter.java
create mode 100644 group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/AbstractStrategyRouter.java
create mode 100644 group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyHandler.java
create mode 100644 group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyMapper.java
create mode 100644 group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/package-info.java
diff --git a/docs/dev-ops/mysql/sql/group_buy_market.sql b/docs/dev-ops/mysql/sql/group_buy_market.sql
index 1cbd800..4d71dd9 100644
--- a/docs/dev-ops/mysql/sql/group_buy_market.sql
+++ b/docs/dev-ops/mysql/sql/group_buy_market.sql
@@ -1,29 +1,8 @@
-# ************************************************************
-# Sequel Ace SQL dump
-# 版本号: 20050
-#
-# https://sequel-ace.com/
-# https://github.com/Sequel-Ace/Sequel-Ace
-#
-# 主机: 127.0.0.1 (MySQL 5.6.39)
-# 数据库: group_buy_market
-# 生成时间: 2024-12-07 03:48:52 +0000
-# ************************************************************
-
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
SET NAMES utf8mb4;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE='NO_AUTO_VALUE_ON_ZERO', SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE database if NOT EXISTS `group_buying_sys` default character set utf8mb4 collate utf8mb4_0900_ai_ci;
use `group_buying_sys`;
-# 转储表 group_buy_activity
-# ------------------------------------------------------------
DROP TABLE IF EXISTS `group_buy_activity`;
@@ -55,15 +34,11 @@ LOCK TABLES `group_buy_activity` WRITE;
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,'2024-12-07 10:19:40','2024-12-07 10:19:40','1','1','2024-12-07 10:19:40','2024-12-07 11:47:27');
+ (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');
-/*!40000 ALTER TABLE `group_buy_activity` ENABLE KEYS */;
UNLOCK TABLES;
-# 转储表 group_buy_discount
-# ------------------------------------------------------------
-
DROP TABLE IF EXISTS `group_buy_discount`;
CREATE TABLE `group_buy_discount` (
@@ -82,20 +57,35 @@ CREATE TABLE `group_buy_discount` (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOCK TABLES `group_buy_discount` WRITE;
-/*!40000 ALTER TABLE `group_buy_discount` DISABLE KEYS */;
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,'2024-12-07 10:20:15','2024-12-07 10:20:15');
+ (1,25120207,'测试优惠','测试优惠',0,'ZJ','20',NULL,'2025-06-19 10:20:15','2025-06-19 10:20:15');
-/*!40000 ALTER TABLE `group_buy_discount` ENABLE KEYS */;
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;
+
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
diff --git a/docs/dev-ops/sql-back/0619group_buy_market.sql b/docs/dev-ops/sql-back/0619group_buy_market.sql
new file mode 100644
index 0000000..6871e9b
--- /dev/null
+++ b/docs/dev-ops/sql-back/0619group_buy_market.sql
@@ -0,0 +1,70 @@
+SET NAMES utf8mb4;
+
+CREATE database if NOT EXISTS `group_buying_sys` default character set utf8mb4 collate utf8mb4_0900_ai_ci;
+use `group_buying_sys`;
+
+# 转储表 group_buy_activity
+# ------------------------------------------------------------
+
+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;
+
+
+# 转储表 group_buy_discount
+# ------------------------------------------------------------
+
+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;
diff --git a/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_activity_mapper.xml b/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_activity_mapper.xml
index dc395c3..ee6ccf4 100644
--- a/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_activity_mapper.xml
+++ b/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_activity_mapper.xml
@@ -27,4 +27,15 @@
select * from group_buy_activity
+
+
diff --git a/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_discount_mapper.xml b/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_discount_mapper.xml
index 24dffe4..e8e2294 100644
--- a/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_discount_mapper.xml
+++ b/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_discount_mapper.xml
@@ -19,4 +19,10 @@
select * from group_buy_discount
+
+
diff --git a/group-buying-sys-app/src/main/resources/mybatis/mapper/sku_mapper.xml b/group-buying-sys-app/src/main/resources/mybatis/mapper/sku_mapper.xml
new file mode 100644
index 0000000..dc2e84b
--- /dev/null
+++ b/group-buying-sys-app/src/main/resources/mybatis/mapper/sku_mapper.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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/activity/IIndexGroupBuyMarketServiceTest.java
new file mode 100644
index 0000000..918ea2c
--- /dev/null
+++ b/group-buying-sys-app/src/test/java/edu/whut/test/activity/IIndexGroupBuyMarketServiceTest.java
@@ -0,0 +1,39 @@
+package edu.whut.test.activity;
+
+import com.alibaba.fastjson.JSON;
+import edu.whut.domain.activity.model.entity.MarketProductEntity;
+import edu.whut.domain.activity.model.entity.TrialBalanceEntity;
+import edu.whut.domain.activity.service.IIndexGroupBuyMarketService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+
+/**
+ * 首页营销服务接口测试
+ */
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class IIndexGroupBuyMarketServiceTest {
+
+ @Resource
+ private IIndexGroupBuyMarketService indexGroupBuyMarketService;
+
+ @Test
+ public void test_indexMarketTrial() throws Exception {
+ MarketProductEntity marketProductEntity = new MarketProductEntity();
+ marketProductEntity.setUserId("xiaofuge");
+ marketProductEntity.setSource("s01");
+ marketProductEntity.setChannel("c01");
+ marketProductEntity.setGoodsId("9890001");
+
+ TrialBalanceEntity trialBalanceEntity = indexGroupBuyMarketService.indexMarketTrial(marketProductEntity);
+ log.info("请求参数:{}", JSON.toJSONString(marketProductEntity));
+ log.info("返回结果:{}", JSON.toJSONString(trialBalanceEntity));
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/adapter/package-info.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/package-info.java
similarity index 80%
rename from group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/adapter/package-info.java
rename to group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/package-info.java
index ba422f3..107a8ad 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/adapter/package-info.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/package-info.java
@@ -1,4 +1,4 @@
/**
* 外部接口适配器层;当需要调用外部接口时,则创建出这一层,并定义接口,之后由基础设施层的 adapter 层具体实现
*/
-package edu.whut.domain.xxx.adapter;
\ No newline at end of file
+package edu.whut.domain.activity.adapter;
\ No newline at end of file
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/adapter/port/package-info.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/port/package-info.java
similarity index 78%
rename from group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/adapter/port/package-info.java
rename to group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/port/package-info.java
index 8f3e273..5cb22ed 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/adapter/port/package-info.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/port/package-info.java
@@ -1,4 +1,4 @@
/**
* 外部接口适配器层;当需要调用外部接口时,则创建出这一层,并定义接口,之后由基础设施层的 adapter 层具体实现
*/
-package edu.whut.domain.xxx.adapter.port;
\ No newline at end of file
+package edu.whut.domain.activity.adapter.port;
\ No newline at end of file
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/repository/IActivityRepository.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/repository/IActivityRepository.java
new file mode 100644
index 0000000..183ad90
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/repository/IActivityRepository.java
@@ -0,0 +1,14 @@
+package edu.whut.domain.activity.adapter.repository;
+import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
+import edu.whut.domain.activity.model.valobj.SkuVO;
+
+/**
+ * @description 活动仓储
+ */
+public interface IActivityRepository {
+
+ GroupBuyActivityDiscountVO queryGroupBuyActivityDiscountVO(String source, String channel);
+
+ SkuVO querySkuByGoodsId(String goodsId);
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/adapter/repository/package-info.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/repository/package-info.java
similarity index 63%
rename from group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/adapter/repository/package-info.java
rename to group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/repository/package-info.java
index 4fc83a4..354c4b6 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/adapter/repository/package-info.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/adapter/repository/package-info.java
@@ -2,4 +2,4 @@
* 仓储服务
* 1. 定义仓储接口,之后由基础设施层做具体实现
*/
-package edu.whut.domain.xxx.adapter.repository;
\ No newline at end of file
+package edu.whut.domain.activity.adapter.repository;
\ No newline at end of file
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/aggregate/package-info.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/aggregate/package-info.java
similarity index 85%
rename from group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/aggregate/package-info.java
rename to group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/aggregate/package-info.java
index d2ee6fb..b4bbab8 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/aggregate/package-info.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/aggregate/package-info.java
@@ -4,4 +4,4 @@
* 2. 聚合是聚合的对象,和提供基础处理对象的方法。但不建议在聚合中引入仓储和接口来做过大的逻辑。而这些复杂的操作应该放到service中处理
* 3. 对象名称 XxxAggregate
*/
-package edu.whut.domain.xxx.model.aggregate;
\ No newline at end of file
+package edu.whut.domain.activity.model.aggregate;
\ No newline at end of file
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/entity/MarketProductEntity.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/entity/MarketProductEntity.java
new file mode 100644
index 0000000..e04f657
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/entity/MarketProductEntity.java
@@ -0,0 +1,26 @@
+package edu.whut.domain.activity.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 营销商品实体信息,通过这样一个信息获取商品优惠信息
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class MarketProductEntity {
+
+ /** 用户ID */
+ private String userId;
+ /** 商品ID */
+ private String goodsId;
+ /** 渠道 */
+ private String source;
+ /** 来源 */
+ private String channel;
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/entity/TrialBalanceEntity.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/entity/TrialBalanceEntity.java
new file mode 100644
index 0000000..50fece5
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/entity/TrialBalanceEntity.java
@@ -0,0 +1,39 @@
+package edu.whut.domain.activity.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 试算结果实体对象(给用户展示拼团可获得的优惠信息)
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class TrialBalanceEntity {
+
+ /** 商品ID */
+ private String goodsId;
+ /** 商品名称 */
+ private String goodsName;
+ /** 原始价格 */
+ private BigDecimal originalPrice;
+ /** 折扣价格 */
+ private BigDecimal deductionPrice;
+ /** 拼团目标数量 */
+ private Integer targetCount;
+ /** 拼团开始时间 */
+ private Date startTime;
+ /** 拼团结束时间 */
+ private Date endTime;
+ /** 是否可见拼团 */
+ private Boolean isVisible;
+ /** 是否可参与进团 */
+ private Boolean isEnable;
+
+}
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
new file mode 100644
index 0000000..79d8046
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/GroupBuyActivityDiscountVO.java
@@ -0,0 +1,116 @@
+package edu.whut.domain.activity.model.valobj;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * 拼团活动营销配置值对象
+ */
+@Getter
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class GroupBuyActivityDiscountVO {
+
+ /**
+ * 活动ID
+ */
+ private Long activityId;
+ /**
+ * 活动名称
+ */
+ private String activityName;
+ /**
+ * 来源
+ */
+ private String source;
+ /**
+ * 渠道
+ */
+ private String channel;
+ /**
+ * 商品ID
+ */
+ private String goodsId;
+ /**
+ * 折扣配置
+ */
+ private GroupBuyDiscount groupBuyDiscount;
+ /**
+ * 拼团方式(0自动成团、1达成目标拼团)
+ */
+ private Integer groupType;
+ /**
+ * 拼团次数限制
+ */
+ private Integer takeLimitCount;
+ /**
+ * 拼团目标
+ */
+ private Integer target;
+ /**
+ * 拼团时长(分钟)
+ */
+ private Integer validTime;
+ /**
+ * 活动状态(0创建、1生效、2过期、3废弃)
+ */
+ private Integer status;
+ /**
+ * 活动开始时间
+ */
+ private Date startTime;
+ /**
+ * 活动结束时间
+ */
+ private Date endTime;
+ /**
+ * 人群标签规则标识
+ */
+ private String tagId;
+ /**
+ * 人群标签规则范围
+ */
+ private String tagScope;
+
+ @Getter
+ @Builder
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class GroupBuyDiscount {
+ /**
+ * 折扣标题
+ */
+ private String discountName;
+
+ /**
+ * 折扣描述
+ */
+ private String discountDesc;
+
+ /**
+ * 折扣类型(0:base、1:tag)
+ */
+ private Byte discountType;
+
+ /**
+ * 营销优惠计划(ZJ:直减、MJ:满减、N元购)
+ */
+ private String marketPlan;
+
+ /**
+ * 营销优惠表达式
+ */
+ private String marketExpr;
+
+ /**
+ * 人群标签,特定优惠限定
+ */
+ private String tagId;
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/SkuVO.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/SkuVO.java
new file mode 100644
index 0000000..122b159
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/model/valobj/SkuVO.java
@@ -0,0 +1,26 @@
+package edu.whut.domain.activity.model.valobj;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * 商品信息
+ */
+@Getter
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class SkuVO {
+
+ /** 商品ID */
+ private String goodsId;
+ /** 商品名称 */
+ private String goodsName;
+ /** 原始价格 */
+ private BigDecimal originalPrice;
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IIndexGroupBuyMarketService.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IIndexGroupBuyMarketService.java
new file mode 100644
index 0000000..21eba5d
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IIndexGroupBuyMarketService.java
@@ -0,0 +1,13 @@
+package edu.whut.domain.activity.service;
+
+import edu.whut.domain.activity.model.entity.MarketProductEntity;
+import edu.whut.domain.activity.model.entity.TrialBalanceEntity;
+
+/**
+ * 首页营销服务接口
+ */
+public interface IIndexGroupBuyMarketService {
+
+ TrialBalanceEntity indexMarketTrial(MarketProductEntity marketProductEntity) throws Exception;
+
+}
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
new file mode 100644
index 0000000..e570bc6
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/IndexGroupBuyMarketServiceImpl.java
@@ -0,0 +1,29 @@
+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 org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 首页营销服务
+ */
+@Service
+public class IndexGroupBuyMarketServiceImpl implements IIndexGroupBuyMarketService {
+
+ @Resource
+ private DefaultActivityStrategyFactory defaultActivityStrategyFactory;
+
+ @Override
+ public TrialBalanceEntity indexMarketTrial(MarketProductEntity marketProductEntity) throws Exception {
+
+ StrategyHandler strategyHandler = defaultActivityStrategyFactory.strategyHandler();
+
+ TrialBalanceEntity trialBalanceEntity = strategyHandler.apply(marketProductEntity, new DefaultActivityStrategyFactory.DynamicContext());
+
+ return trialBalanceEntity;
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/package-info.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/package-info.java
new file mode 100644
index 0000000..b048c41
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/package-info.java
@@ -0,0 +1 @@
+package edu.whut.domain.activity.service;
\ No newline at end of file
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
new file mode 100644
index 0000000..416d6ae
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/AbstractGroupBuyMarketSupport.java
@@ -0,0 +1,27 @@
+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 javax.annotation.Resource;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * 抽象的拼团营销支撑类
+ */
+public abstract class AbstractGroupBuyMarketSupport extends AbstractMultiThreadStrategyRouter {
+
+ protected long timeout = 500;
+ @Resource
+ protected IActivityRepository repository;
+
+ @Override
+ protected void multiThread(edu.whut.domain.activity.model.entity.MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws ExecutionException, InterruptedException, TimeoutException {
+ // 缺省的方法
+ }
+
+}
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
new file mode 100644
index 0000000..1be8a2e
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/factory/DefaultActivityStrategyFactory.java
@@ -0,0 +1,41 @@
+package edu.whut.domain.activity.service.trial.factory;
+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.trial.node.RootNode;
+import edu.whut.types.framework.tree.StrategyHandler;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 活动策略工厂
+ */
+@Service
+public class DefaultActivityStrategyFactory {
+
+ private final RootNode rootNode;
+
+ public DefaultActivityStrategyFactory(RootNode rootNode) {
+ this.rootNode = rootNode;
+ }
+
+ public StrategyHandler strategyHandler() {
+ return rootNode;
+ }
+
+ @Data
+ @Builder
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class DynamicContext {
+ // 拼团活动营销配置值对象
+ private GroupBuyActivityDiscountVO groupBuyActivityDiscountVO;
+ // 商品信息
+ private SkuVO skuVO;
+ }
+
+}
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
new file mode 100644
index 0000000..94eb9de
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/EndNode.java
@@ -0,0 +1,48 @@
+package edu.whut.domain.activity.service.trial.node;
+import com.alibaba.fastjson.JSON;
+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.trial.AbstractGroupBuyMarketSupport;
+import edu.whut.domain.activity.service.trial.factory.DefaultActivityStrategyFactory;
+import edu.whut.types.framework.tree.StrategyHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/**
+ * 结束节点
+ */
+@Slf4j
+@Service
+public class EndNode extends AbstractGroupBuyMarketSupport {
+
+ @Override
+ public TrialBalanceEntity doApply(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
+ log.info("拼团商品查询试算服务-EndNode userId:{} requestParameter:{}", requestParameter.getUserId(), JSON.toJSONString(requestParameter));
+
+ GroupBuyActivityDiscountVO groupBuyActivityDiscountVO = dynamicContext.getGroupBuyActivityDiscountVO();
+ SkuVO skuVO = dynamicContext.getSkuVO();
+
+ // 返回空结果
+ return TrialBalanceEntity.builder()
+ .goodsId(skuVO.getGoodsId())
+ .goodsName(skuVO.getGoodsName())
+ .originalPrice(skuVO.getOriginalPrice())
+ .deductionPrice(new BigDecimal("0.00"))
+ .targetCount(groupBuyActivityDiscountVO.getTarget())
+ .startTime(groupBuyActivityDiscountVO.getStartTime())
+ .endTime(groupBuyActivityDiscountVO.getEndTime())
+ .isVisible(false)
+ .isEnable(false)
+ .build();
+ }
+
+ @Override
+ public StrategyHandler get(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
+ return defaultStrategyHandler;
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/MarketNode.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/MarketNode.java
new file mode 100644
index 0000000..d8e7eeb
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/MarketNode.java
@@ -0,0 +1,63 @@
+package edu.whut.domain.activity.service.trial.node;
+import com.alibaba.fastjson.JSON;
+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.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 lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.concurrent.*;
+
+/**
+ * 营销优惠节点
+ */
+@Slf4j
+@Service
+public class MarketNode extends AbstractGroupBuyMarketSupport {
+
+ @Resource
+ private ThreadPoolExecutor threadPoolExecutor;
+ @Resource
+ private EndNode endNode;
+
+ @Override
+ protected void multiThread(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws ExecutionException, InterruptedException, TimeoutException {
+ // 异步查询活动配置
+ QueryGroupBuyActivityDiscountVOThreadTask queryGroupBuyActivityDiscountVOThreadTask = new QueryGroupBuyActivityDiscountVOThreadTask(requestParameter.getSource(), requestParameter.getChannel(), repository);
+ FutureTask groupBuyActivityDiscountVOFutureTask = new FutureTask<>(queryGroupBuyActivityDiscountVOThreadTask);
+ threadPoolExecutor.execute(groupBuyActivityDiscountVOFutureTask);
+
+ // 异步查询商品信息 - 在实际生产中,商品有同步库或者调用接口查询。这里暂时使用DB方式查询。
+ QuerySkuVOFromDBThreadTask querySkuVOFromDBThreadTask = new QuerySkuVOFromDBThreadTask(requestParameter.getGoodsId(), repository);
+ FutureTask skuVOFutureTask = new FutureTask<>(querySkuVOFromDBThreadTask);
+ threadPoolExecutor.execute(skuVOFutureTask);
+
+ // 写入上下文 - 对于一些复杂场景,获取数据的操作,有时候会在下N个节点获取,这样前置查询数据,可以提高接口响应效率
+ dynamicContext.setGroupBuyActivityDiscountVO(groupBuyActivityDiscountVOFutureTask.get(timeout, TimeUnit.MINUTES));
+ dynamicContext.setSkuVO(skuVOFutureTask.get(timeout, TimeUnit.MINUTES));
+
+ log.info("拼团商品查询试算服务-MarketNode userId:{} 异步线程加载数据「GroupBuyActivityDiscountVO、SkuVO」完成", requestParameter.getUserId());
+ }
+
+ @Override
+ public TrialBalanceEntity doApply(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
+ log.info("拼团商品查询试算服务-MarketNode userId:{} requestParameter:{}", requestParameter.getUserId(), JSON.toJSONString(requestParameter));
+
+ // todo xfg 拼团优惠试算
+
+ return router(requestParameter, dynamicContext);
+ }
+
+ @Override
+ public StrategyHandler get(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
+ return endNode;
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/RootNode.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/RootNode.java
new file mode 100644
index 0000000..6ced9d0
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/RootNode.java
@@ -0,0 +1,43 @@
+package edu.whut.domain.activity.service.trial.node;
+
+import com.alibaba.fastjson.JSON;
+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.enums.ResponseCode;
+import edu.whut.types.exception.AppException;
+import edu.whut.types.framework.tree.StrategyHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 根节点
+ */
+@Slf4j
+@Service
+public class RootNode extends AbstractGroupBuyMarketSupport {
+
+ @Resource
+ private SwitchNode switchNode;
+
+ @Override
+ protected TrialBalanceEntity doApply(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
+ log.info("拼团商品查询试算服务-RootNode userId:{} requestParameter:{}", requestParameter.getUserId(), JSON.toJSONString(requestParameter));
+ // 参数判断
+ if (StringUtils.isBlank(requestParameter.getUserId()) || StringUtils.isBlank(requestParameter.getGoodsId()) ||
+ StringUtils.isBlank(requestParameter.getSource()) || StringUtils.isBlank(requestParameter.getChannel())) {
+ throw new AppException(ResponseCode.ILLEGAL_PARAMETER.getCode(), ResponseCode.ILLEGAL_PARAMETER.getInfo());
+ }
+ return router(requestParameter, dynamicContext);
+ }
+
+ @Override
+ public StrategyHandler get(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
+ return switchNode;
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/SwitchNode.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/SwitchNode.java
new file mode 100644
index 0000000..39c1b0a
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/node/SwitchNode.java
@@ -0,0 +1,31 @@
+package edu.whut.domain.activity.service.trial.node;
+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 lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+
+/**
+ * 开关节点
+ */
+@Slf4j
+@Service
+public class SwitchNode extends AbstractGroupBuyMarketSupport {
+
+ @Resource
+ private MarketNode marketNode;
+
+ @Override
+ public TrialBalanceEntity doApply(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
+ return router(requestParameter, dynamicContext);
+ }
+
+ @Override
+ public StrategyHandler get(MarketProductEntity requestParameter, DefaultActivityStrategyFactory.DynamicContext dynamicContext) throws Exception {
+ return marketNode;
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/thread/QueryGroupBuyActivityDiscountVOThreadTask.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/thread/QueryGroupBuyActivityDiscountVOThreadTask.java
new file mode 100644
index 0000000..607efcc
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/thread/QueryGroupBuyActivityDiscountVOThreadTask.java
@@ -0,0 +1,39 @@
+package edu.whut.domain.activity.service.trial.thread;
+
+import edu.whut.domain.activity.adapter.repository.IActivityRepository;
+import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
+
+import java.util.concurrent.Callable;
+
+/**
+ * 查询营销配置任务
+ */
+public class QueryGroupBuyActivityDiscountVOThreadTask implements Callable {
+
+ /**
+ * 来源
+ */
+ private final String source;
+
+ /**
+ * 渠道
+ */
+ private final String channel;
+
+ /**
+ * 活动仓储
+ */
+ private final IActivityRepository activityRepository;
+
+ public QueryGroupBuyActivityDiscountVOThreadTask(String source, String channel, IActivityRepository activityRepository) {
+ this.source = source;
+ this.channel = channel;
+ this.activityRepository = activityRepository;
+ }
+
+ @Override
+ public GroupBuyActivityDiscountVO call() throws Exception {
+ return activityRepository.queryGroupBuyActivityDiscountVO(source, channel);
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/thread/QuerySkuVOFromDBThreadTask.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/thread/QuerySkuVOFromDBThreadTask.java
new file mode 100644
index 0000000..36da8ec
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/activity/service/trial/thread/QuerySkuVOFromDBThreadTask.java
@@ -0,0 +1,27 @@
+package edu.whut.domain.activity.service.trial.thread;
+
+import edu.whut.domain.activity.adapter.repository.IActivityRepository;
+import edu.whut.domain.activity.model.valobj.SkuVO;
+
+import java.util.concurrent.Callable;
+
+/**
+ * 查询商品信息任务
+ */
+public class QuerySkuVOFromDBThreadTask implements Callable {
+
+ private final String goodsId;
+
+ private final IActivityRepository activityRepository;
+
+ public QuerySkuVOFromDBThreadTask(String goodsId, IActivityRepository activityRepository) {
+ this.goodsId = goodsId;
+ this.activityRepository = activityRepository;
+ }
+
+ @Override
+ public SkuVO call() throws Exception {
+ return activityRepository.querySkuByGoodsId(goodsId);
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/entity/package-info.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/entity/package-info.java
deleted file mode 100644
index a7a8ce5..0000000
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/entity/package-info.java
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * 实体对象;
- * 1. 一般和数据库持久化对象1v1的关系,但因各自开发系统的不同,也有1vn的可能。
- * 2. 如果是老系统改造,那么旧的库表冗余了太多的字段,可能会有nv1的情况
- * 3. 对象名称 XxxEntity
- */
-package edu.whut.domain.xxx.model.entity;
\ No newline at end of file
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/valobj/package-info.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/valobj/package-info.java
deleted file mode 100644
index f34a181..0000000
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/model/valobj/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * 值对象;
- * 1. 用于描述对象属性的值,如一个库表中有json后者一个字段多个属性信息的枚举对象
- * 2. 对象名称如;XxxVO
- */
-package edu.whut.domain.xxx.model.valobj;
\ No newline at end of file
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/service/package-info.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/service/package-info.java
deleted file mode 100644
index a82b91f..0000000
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/xxx/service/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package edu.whut.domain.xxx.service;
\ No newline at end of file
diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/ActivityRepository.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/ActivityRepository.java
new file mode 100644
index 0000000..aeae001
--- /dev/null
+++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/ActivityRepository.java
@@ -0,0 +1,79 @@
+package edu.whut.infrastructure.adapter.repository;
+
+import edu.whut.domain.activity.adapter.repository.IActivityRepository;
+import edu.whut.domain.activity.model.valobj.GroupBuyActivityDiscountVO;
+import edu.whut.domain.activity.model.valobj.SkuVO;
+import edu.whut.infrastructure.dao.IGroupBuyActivityDao;
+import edu.whut.infrastructure.dao.IGroupBuyDiscountDao;
+import edu.whut.infrastructure.dao.ISkuDao;
+import edu.whut.infrastructure.dao.po.GroupBuyActivity;
+import edu.whut.infrastructure.dao.po.GroupBuyDiscount;
+import edu.whut.infrastructure.dao.po.Sku;
+import org.springframework.stereotype.Repository;
+
+import javax.annotation.Resource;
+
+/**
+ * 活动仓储
+ */
+@Repository
+public class ActivityRepository implements IActivityRepository {
+
+ @Resource
+ private IGroupBuyActivityDao groupBuyActivityDao;
+ @Resource
+ private IGroupBuyDiscountDao groupBuyDiscountDao;
+
+ @Resource
+ private ISkuDao skuDao;
+
+ @Override
+ public GroupBuyActivityDiscountVO queryGroupBuyActivityDiscountVO(String source, String channel) {
+ // 根据SC渠道值查询配置中最新的1个有效的活动
+ GroupBuyActivity groupBuyActivityReq = new GroupBuyActivity();
+ groupBuyActivityReq.setSource(source);
+ groupBuyActivityReq.setChannel(channel);
+ GroupBuyActivity groupBuyActivityRes = groupBuyActivityDao.queryValidGroupBuyActivity(groupBuyActivityReq);
+
+ String discountId = groupBuyActivityRes.getDiscountId();
+
+ GroupBuyDiscount groupBuyDiscountRes = groupBuyDiscountDao.queryGroupBuyActivityDiscountByDiscountId(discountId);
+ GroupBuyActivityDiscountVO.GroupBuyDiscount groupBuyDiscount = GroupBuyActivityDiscountVO.GroupBuyDiscount.builder()
+ .discountName(groupBuyDiscountRes.getDiscountName())
+ .discountDesc(groupBuyDiscountRes.getDiscountDesc())
+ .discountType(groupBuyDiscountRes.getDiscountType())
+ .marketPlan(groupBuyDiscountRes.getMarketPlan())
+ .marketExpr(groupBuyDiscountRes.getMarketExpr())
+ .tagId(groupBuyDiscountRes.getTagId())
+ .build();
+
+ return GroupBuyActivityDiscountVO.builder()
+ .activityId(groupBuyActivityRes.getActivityId())
+ .activityName(groupBuyActivityRes.getActivityName())
+ .source(groupBuyActivityRes.getSource())
+ .channel(groupBuyActivityRes.getChannel())
+ .goodsId(groupBuyActivityRes.getGoodsId())
+ .groupBuyDiscount(groupBuyDiscount)
+ .groupType(groupBuyActivityRes.getGroupType())
+ .takeLimitCount(groupBuyActivityRes.getTakeLimitCount())
+ .target(groupBuyActivityRes.getTarget())
+ .validTime(groupBuyActivityRes.getValidTime())
+ .status(groupBuyActivityRes.getStatus())
+ .startTime(groupBuyActivityRes.getStartTime())
+ .endTime(groupBuyActivityRes.getEndTime())
+ .tagId(groupBuyActivityRes.getTagId())
+ .tagScope(groupBuyActivityRes.getTagScope())
+ .build();
+ }
+
+ @Override
+ public SkuVO querySkuByGoodsId(String goodsId) {
+ Sku sku = skuDao.querySkuByGoodsId(goodsId);
+ return SkuVO.builder()
+ .goodsId(sku.getGoodsId())
+ .goodsName(sku.getGoodsName())
+ .originalPrice(sku.getOriginalPrice())
+ .build();
+ }
+
+}
diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/IGroupBuyActivityDao.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/IGroupBuyActivityDao.java
index faa30aa..a153e31 100644
--- a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/IGroupBuyActivityDao.java
+++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/IGroupBuyActivityDao.java
@@ -11,4 +11,6 @@ import java.util.List;
public interface IGroupBuyActivityDao {
List queryGroupBuyActivityList();
+ GroupBuyActivity queryValidGroupBuyActivity(GroupBuyActivity groupBuyActivityReq);
+
}
diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/IGroupBuyDiscountDao.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/IGroupBuyDiscountDao.java
index 149689c..f8e9f97 100644
--- a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/IGroupBuyDiscountDao.java
+++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/IGroupBuyDiscountDao.java
@@ -11,4 +11,6 @@ import java.util.List;
public interface IGroupBuyDiscountDao {
List queryGroupBuyDiscountList();
+ GroupBuyDiscount queryGroupBuyActivityDiscountByDiscountId(String discountId);
+
}
diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/ISkuDao.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/ISkuDao.java
new file mode 100644
index 0000000..6dc79c8
--- /dev/null
+++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/ISkuDao.java
@@ -0,0 +1,13 @@
+package edu.whut.infrastructure.dao;
+import edu.whut.infrastructure.dao.po.Sku;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 商品查询
+ */
+@Mapper
+public interface ISkuDao {
+
+ Sku querySkuByGoodsId(String goodsId);
+
+}
diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/Sku.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/Sku.java
new file mode 100644
index 0000000..be38482
--- /dev/null
+++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/Sku.java
@@ -0,0 +1,37 @@
+package edu.whut.infrastructure.dao.po;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 商品信息
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class Sku {
+
+ /** 自增 */
+ private Long id;
+ /** 来源 */
+ private String source;
+ /** 渠道 */
+ private String channel;
+ /** 商品ID */
+ private String goodsId;
+ /** 商品名称 */
+ private String goodsName;
+ /** 原始价格 */
+ private BigDecimal originalPrice;
+ /** 创建时间 */
+ private Date createTime;
+ /** 更新时间 */
+ private Date updateTime;
+
+}
diff --git a/group-buying-sys-types/src/main/java/edu/whut/types/framework/link/package-info.java b/group-buying-sys-types/src/main/java/edu/whut/types/framework/link/package-info.java
new file mode 100644
index 0000000..d7a7aef
--- /dev/null
+++ b/group-buying-sys-types/src/main/java/edu/whut/types/framework/link/package-info.java
@@ -0,0 +1,6 @@
+/**
+ * @description 通用设计模板;责任链
+ * @author Fuzhengwei bugstack.cn @小傅哥
+ * @create 2024-12-14 12:04
+ */
+package edu.whut.types.framework.link;
\ No newline at end of file
diff --git a/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/AbstractMultiThreadStrategyRouter.java b/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/AbstractMultiThreadStrategyRouter.java
new file mode 100644
index 0000000..71abc02
--- /dev/null
+++ b/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/AbstractMultiThreadStrategyRouter.java
@@ -0,0 +1,42 @@
+package edu.whut.types.framework.tree;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * 异步资源加载策略
+ */
+public abstract class AbstractMultiThreadStrategyRouter implements StrategyMapper, StrategyHandler {
+
+ @Getter
+ @Setter
+ protected StrategyHandler defaultStrategyHandler = StrategyHandler.DEFAULT;
+
+ 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);
+ }
+
+ @Override
+ public R apply(T requestParameter, D dynamicContext) throws Exception {
+ // 异步加载数据
+ multiThread(requestParameter, dynamicContext);
+ // 业务流程受理
+ return doApply(requestParameter, dynamicContext);
+ }
+
+ /**
+ * 异步加载数据
+ */
+ protected abstract void multiThread(T requestParameter, D dynamicContext) throws ExecutionException, InterruptedException, TimeoutException;
+
+ /**
+ * 业务流程受理
+ */
+ protected abstract R doApply(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/framework/tree/AbstractStrategyRouter.java
new file mode 100644
index 0000000..08f8bbf
--- /dev/null
+++ b/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/AbstractStrategyRouter.java
@@ -0,0 +1,21 @@
+package edu.whut.types.framework.tree;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 策略路由抽象类
+ */
+public abstract class AbstractStrategyRouter implements StrategyMapper, StrategyHandler {
+
+ @Getter
+ @Setter
+ protected StrategyHandler defaultStrategyHandler = StrategyHandler.DEFAULT;
+
+ 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);
+ }
+
+}
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/framework/tree/StrategyHandler.java
new file mode 100644
index 0000000..6e70ca7
--- /dev/null
+++ b/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyHandler.java
@@ -0,0 +1,15 @@
+package edu.whut.types.framework.tree;
+
+/**
+ * 受理策略处理
+ * T 入参类型
+ * D 上下文参数
+ * R 返参类型
+ */
+public interface StrategyHandler {
+
+ StrategyHandler DEFAULT = (T, D) -> null;
+
+ R apply(T requestParameter, D dynamicContext) throws Exception;
+
+}
\ No newline at end of file
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/framework/tree/StrategyMapper.java
new file mode 100644
index 0000000..becda81
--- /dev/null
+++ b/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/StrategyMapper.java
@@ -0,0 +1,21 @@
+package edu.whut.types.framework.tree;
+
+/**
+ * 策略映射器
+ * T 入参类型
+ * D 上下文参数
+ * R 返参类型
+ */
+public interface StrategyMapper {
+
+ /**
+ * 获取待执行策略
+ *
+ * @param requestParameter 入参
+ * @param dynamicContext 上下文
+ * @return 返参
+ * @throws Exception 异常
+ */
+ StrategyHandler get(T requestParameter, D dynamicContext) throws Exception;
+
+}
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
new file mode 100644
index 0000000..b1e7308
--- /dev/null
+++ b/group-buying-sys-types/src/main/java/edu/whut/types/framework/tree/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * 通用设计模板;规则树
+ */
+package edu.whut.types.framework.tree;
\ No newline at end of file