From a8502d1daef49143a741a43dc05122cd8bc97895 Mon Sep 17 00:00:00 2001
From: zhangsan <646228430@qq.com>
Date: Fri, 4 Jul 2025 14:10:59 +0800
Subject: [PATCH] =?UTF-8?q?7.4=20=E4=BA=A4=E6=98=93=E7=BB=93=E7=AE=97?=
=?UTF-8?q?=E8=BF=87=E7=A8=8B=E8=B4=A3=E4=BB=BB=E9=93=BE=E8=BF=87=E6=BB=A4?=
=?UTF-8?q?=EF=BC=9A=E6=B8=A0=E9=81=93+=E4=BA=A4=E6=98=93=E5=8D=95?=
=?UTF-8?q?=E5=8F=B7=E6=9C=89=E6=95=88=E6=80=A7+=E4=BA=A4=E6=98=93?=
=?UTF-8?q?=E6=97=B6=E9=97=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mysql/sql/0702group_buying_sys.sql | 50 +++-
.../dev-ops/sql-back/0702group_buying_sys.sql | 247 ++++++++++++++++++
.../mybatis/mapper/group_buy_order_mapper.xml | 2 +-
.../TradeSettlementOrderServiceTest.java | 11 +-
.../trigger/MarketTradeControllerTest.java | 4 +-
.../adapter/repository/ITradeRepository.java | 2 +-
...y.java => TradeLockRuleCommandEntity.java} | 2 +-
...ava => TradeLockRuleFilterBackEntity.java} | 2 +-
.../TradeSettlementRuleCommandEntity.java | 30 +++
.../TradeSettlementRuleFilterBackEntity.java | 36 +++
.../service/ITradeSettlementOrderService.java | 2 +-
.../lock/TradeLockLockOrderService.java | 11 +-
...y.java => TradeLockRuleFilterFactory.java} | 10 +-
.../filter/ActivityUsabilityRuleFilter.java | 10 +-
.../lock/filter/UserTakeLimitRuleFilter.java | 12 +-
.../TradeSettlementOrderService.java | 28 +-
.../TradeSettlementRuleFilterFactory.java | 55 ++++
.../settlement/filter/EndRuleFilter.java | 38 +++
.../filter/OutTradeNoRuleFilter.java | 42 +++
.../settlement/filter/SCRuleFilter.java | 38 +++
.../settlement/filter/SettableRuleFilter.java | 52 ++++
.../adapter/repository/TagRepository.java | 10 +-
.../adapter/repository/TradeRepository.java | 42 ++-
.../whut/infrastructure/dcc/DCCService.java | 20 ++
.../edu/whut/types/enums/ResponseCode.java | 3 +
25 files changed, 672 insertions(+), 87 deletions(-)
create mode 100644 docs/dev-ops/sql-back/0702group_buying_sys.sql
rename group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/{TradeRuleCommandEntity.java => TradeLockRuleCommandEntity.java} (89%)
rename group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/{TradeRuleFilterBackEntity.java => TradeLockRuleFilterBackEntity.java} (88%)
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeSettlementRuleCommandEntity.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeSettlementRuleFilterBackEntity.java
rename group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/factory/{TradeRuleFilterFactory.java => TradeLockRuleFilterFactory.java} (73%)
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/factory/TradeSettlementRuleFilterFactory.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/EndRuleFilter.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/OutTradeNoRuleFilter.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/SCRuleFilter.java
create mode 100644 group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/SettableRuleFilter.java
diff --git a/docs/dev-ops/mysql/sql/0702group_buying_sys.sql b/docs/dev-ops/mysql/sql/0702group_buying_sys.sql
index fabc86a..e440eca 100644
--- a/docs/dev-ops/mysql/sql/0702group_buying_sys.sql
+++ b/docs/dev-ops/mysql/sql/0702group_buying_sys.sql
@@ -11,7 +11,7 @@
Target Server Version : 80042
File Encoding : 65001
- Date: 02/07/2025 13:52:59
+ Date: 04/07/2025 14:09:17
*/
SET NAMES utf8mb4;
@@ -104,12 +104,12 @@ CREATE TABLE `group_buy_activity` (
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uq_activity_id`(`activity_id` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '拼团活动' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '拼团活动' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of group_buy_activity
-- ----------------------------
-INSERT INTO `group_buy_activity` VALUES (1, 100123, '测试活动', '25120207', 0, 1, 3, 15, 1, '2025-06-19 10:19:40', '2025-07-31 10:19:40', 'RQ_KJHKL98UU78H66554GFDV', '1,2', '2025-06-19 10:19:40', '2025-07-02 13:21:27');
+INSERT INTO `group_buy_activity` VALUES (1, 100123, '测试活动', '25120207', 0, 1, 3, 60, 1, '2025-06-19 10:19:40', '2025-07-31 10:19:40', 'RQ_KJHKL98UU78H66554GFDV', '1,2', '2025-06-19 10:19:40', '2025-07-03 18:25:55');
-- ----------------------------
-- Table structure for group_buy_discount
@@ -128,7 +128,7 @@ CREATE TABLE `group_buy_discount` (
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uq_discount_id`(`discount_id` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '折扣配置' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '折扣配置' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of group_buy_discount
@@ -157,14 +157,16 @@ CREATE TABLE `group_buy_order` (
`status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态(0-拼单中、1-完成、2-失败)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `valid_start_time` datetime NOT NULL COMMENT '拼团开始时间',
+ `valid_end_time` datetime NOT NULL COMMENT '拼团结束时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uq_team_id`(`team_id` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '拼团订单表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '拼团订单表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of group_buy_order
-- ----------------------------
-INSERT INTO `group_buy_order` VALUES (4, '80437493', 100123, 's01', 'c01', 100.00, 20.00, 80.00, 5, 0, 4, 0, '2025-07-02 13:31:35', '2025-07-02 13:48:16');
+INSERT INTO `group_buy_order` VALUES (6, '36689983', 100123, 's01', 'c01', 100.00, 20.00, 80.00, 3, 2, 3, 0, '2025-07-04 13:38:08', '2025-07-04 14:05:57', '2025-07-04 13:38:09', '2025-07-04 14:38:09');
-- ----------------------------
-- Table structure for group_buy_order_list
@@ -183,23 +185,45 @@ CREATE TABLE `group_buy_order_list` (
`channel` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '来源',
`original_price` decimal(8, 2) NOT NULL COMMENT '原始价格',
`deduction_price` decimal(8, 2) NOT NULL COMMENT '折扣金额',
- `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态;0初始锁定、1消费完成、2用户退单',
+ `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态;0初始锁定、1消费完成',
`out_trade_no` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci 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 '更新时间',
`biz_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '业务唯一ID',
+ `out_trade_time` datetime NULL DEFAULT NULL COMMENT '外部交易时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uq_order_id`(`order_id` ASC) USING BTREE,
INDEX `idx_user_id_activity_id`(`user_id` ASC, `activity_id` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '拼团订单明细表' ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '拼团订单明细表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of group_buy_order_list
-- ----------------------------
-INSERT INTO `group_buy_order_list` VALUES (6, 'smile01', '80437493', '915634883913', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 0, '093147606342', '2025-07-02 13:31:35', '2025-07-02 13:31:35', '100123_smile01_1');
-INSERT INTO `group_buy_order_list` VALUES (7, 'smile02', '80437493', '337142187685', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 0, '835118458939', '2025-07-02 13:40:23', '2025-07-02 13:40:23', '100123_smile02_1');
-INSERT INTO `group_buy_order_list` VALUES (8, 'smile03', '80437493', '299471294958', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 0, '135668811039', '2025-07-02 13:41:31', '2025-07-02 13:41:31', '100123_smile03_1');
-INSERT INTO `group_buy_order_list` VALUES (9, 'smile04', '80437493', '254753792328', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 0, '088164349390', '2025-07-02 13:47:45', '2025-07-02 13:47:45', '100123_smile04_1');
+INSERT INTO `group_buy_order_list` VALUES (13, 'zy01', '36689983', '572779808155', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 1, '745473510043', '2025-07-04 13:38:08', '2025-07-04 13:54:35', '100123_zy01_1', '2025-07-04 13:54:35');
+INSERT INTO `group_buy_order_list` VALUES (14, 'zy03', '36689983', '155916576309', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 1, '251255361034', '2025-07-04 13:55:56', '2025-07-04 13:56:36', '100123_zy03_1', '2025-07-04 13:56:36');
+INSERT INTO `group_buy_order_list` VALUES (15, 'zy02', '36689983', '179025338470', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 0, '044998214077', '2025-07-04 14:05:57', '2025-07-04 14:05:57', '100123_zy02_1', NULL);
+
+-- ----------------------------
+-- Table structure for notify_task
+-- ----------------------------
+DROP TABLE IF EXISTS `notify_task`;
+CREATE TABLE `notify_task` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `activity_id` bigint NOT NULL COMMENT '活动ID',
+ `team_id` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '拼单组队ID',
+ `notify_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '回调接口',
+ `notify_count` int NOT NULL COMMENT '回调次数',
+ `notify_status` tinyint(1) NOT NULL COMMENT '回调状态【0初始、1完成、2重试、3失败】',
+ `parameter_json` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci 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`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of notify_task
+-- ----------------------------
+INSERT INTO `notify_task` VALUES (1, 100123, '26432069', '暂无', 0, 0, '{\"teamId\":\"26432069\",\"outTradeNoList\":[\"052609289877\",\"621314246005\",\"192426946598\"]}', '2025-07-02 19:34:43', '2025-07-02 19:34:43');
-- ----------------------------
-- Table structure for sc_sku_activity
@@ -237,7 +261,7 @@ CREATE TABLE `sku` (
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uq_goods_id`(`goods_id` ASC) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品信息' ROW_FORMAT = DYNAMIC;
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品信息' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of sku
diff --git a/docs/dev-ops/sql-back/0702group_buying_sys.sql b/docs/dev-ops/sql-back/0702group_buying_sys.sql
new file mode 100644
index 0000000..fabc86a
--- /dev/null
+++ b/docs/dev-ops/sql-back/0702group_buying_sys.sql
@@ -0,0 +1,247 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : group_buy
+ Source Server Type : MySQL
+ Source Server Version : 80042
+ Source Host : localhost:13306
+ Source Schema : group_buying_sys
+
+ Target Server Type : MySQL
+ Target Server Version : 80042
+ File Encoding : 65001
+
+ Date: 02/07/2025 13:52:59
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for crowd_tags
+-- ----------------------------
+DROP TABLE IF EXISTS `crowd_tags`;
+CREATE TABLE `crowd_tags` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `tag_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人群ID',
+ `tag_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人群名称',
+ `tag_desc` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人群描述',
+ `statistics` int 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`) USING BTREE,
+ UNIQUE INDEX `uq_tag_id`(`tag_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '人群标签' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of crowd_tags
+-- ----------------------------
+INSERT INTO `crowd_tags` VALUES (1, 'RQ_KJHKL98UU78H66554GFDV', '潜在消费用户', '潜在消费用户', 28, '2025-06-26 09:12:22', '2025-06-28 11:02:00');
+
+-- ----------------------------
+-- Table structure for crowd_tags_detail
+-- ----------------------------
+DROP TABLE IF EXISTS `crowd_tags_detail`;
+CREATE TABLE `crowd_tags_detail` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `tag_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '人群ID',
+ `user_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID',
+ `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`) USING BTREE,
+ UNIQUE INDEX `uq_tag_user`(`tag_id` ASC, `user_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '人群标签明细' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of crowd_tags_detail
+-- ----------------------------
+INSERT INTO `crowd_tags_detail` VALUES (20, 'RQ_KJHKL98UU78H66554GFDV', 'zy123', '2025-06-28 10:53:23', '2025-06-28 10:53:23');
+INSERT INTO `crowd_tags_detail` VALUES (21, 'RQ_KJHKL98UU78H66554GFDV', 'smile', '2025-06-28 10:53:23', '2025-06-28 10:53:23');
+
+-- ----------------------------
+-- Table structure for crowd_tags_job
+-- ----------------------------
+DROP TABLE IF EXISTS `crowd_tags_job`;
+CREATE TABLE `crowd_tags_job` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `tag_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '标签ID',
+ `batch_id` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '批次ID',
+ `tag_type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '标签类型(参与量、消费金额)',
+ `tag_rule` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '标签规则(限定类型 N次)',
+ `stat_start_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '统计数据,开始时间',
+ `stat_end_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '统计数据,结束时间',
+ `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态;0初始、1计划(进入执行阶段)、2重置、3完成',
+ `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`) USING BTREE,
+ UNIQUE INDEX `uq_batch_id`(`batch_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '人群标签任务' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of crowd_tags_job
+-- ----------------------------
+INSERT INTO `crowd_tags_job` VALUES (1, 'RQ_KJHKL98UU78H66554GFDV', '10001', 0, '100', '2025-06-26 09:13:31', '2025-06-26 09:13:31', 0, '2025-06-26 09:13:31', '2025-06-26 09:13:31');
+
+-- ----------------------------
+-- Table structure for group_buy_activity
+-- ----------------------------
+DROP TABLE IF EXISTS `group_buy_activity`;
+CREATE TABLE `group_buy_activity` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增',
+ `activity_id` bigint NOT NULL COMMENT '活动ID',
+ `activity_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '活动名称',
+ `discount_id` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '折扣ID',
+ `group_type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '拼团方式(0自动成团、1达成目标拼团)',
+ `take_limit_count` int NOT NULL DEFAULT 1 COMMENT '拼团次数限制',
+ `target` int NOT NULL DEFAULT 1 COMMENT '拼团目标',
+ `valid_time` int 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(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '人群标签规则标识',
+ `tag_scope` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL 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`) USING BTREE,
+ UNIQUE INDEX `uq_activity_id`(`activity_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '拼团活动' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of group_buy_activity
+-- ----------------------------
+INSERT INTO `group_buy_activity` VALUES (1, 100123, '测试活动', '25120207', 0, 1, 3, 15, 1, '2025-06-19 10:19:40', '2025-07-31 10:19:40', 'RQ_KJHKL98UU78H66554GFDV', '1,2', '2025-06-19 10:19:40', '2025-07-02 13:21:27');
+
+-- ----------------------------
+-- Table structure for group_buy_discount
+-- ----------------------------
+DROP TABLE IF EXISTS `group_buy_discount`;
+CREATE TABLE `group_buy_discount` (
+ `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `discount_id` int NOT NULL COMMENT '折扣ID',
+ `discount_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '折扣标题',
+ `discount_desc` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '折扣描述',
+ `discount_type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '折扣类型(0:base、1:tag)',
+ `market_plan` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'ZJ' COMMENT '营销优惠计划(ZJ:直减、MJ:满减、ZK:折扣、N元购)',
+ `market_expr` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '营销优惠表达式',
+ `tag_id` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL 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`) USING BTREE,
+ UNIQUE INDEX `uq_discount_id`(`discount_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '折扣配置' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of group_buy_discount
+-- ----------------------------
+INSERT INTO `group_buy_discount` VALUES (1, 25120207, '直减优惠20元', '直减优惠20元', 0, 'ZJ', '20', NULL, '2025-06-25 14:02:13', '2025-06-25 14:02:13');
+INSERT INTO `group_buy_discount` VALUES (2, 25120208, '满减优惠100-10元', '满减优惠100-10元', 0, 'MJ', '100,10', NULL, '2025-06-25 14:02:13', '2025-06-25 14:02:13');
+INSERT INTO `group_buy_discount` VALUES (4, 25120209, '折扣优惠8折', '折扣优惠8折', 0, 'ZK', '0.8', NULL, '2025-06-25 14:02:13', '2025-06-25 14:02:13');
+INSERT INTO `group_buy_discount` VALUES (5, 25120210, 'N元购买优惠', 'N元购买优惠', 0, 'N', '1.99', NULL, '2025-06-25 14:02:13', '2025-06-25 14:02:13');
+
+-- ----------------------------
+-- Table structure for group_buy_order
+-- ----------------------------
+DROP TABLE IF EXISTS `group_buy_order`;
+CREATE TABLE `group_buy_order` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `team_id` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '拼单组队ID',
+ `activity_id` bigint NOT NULL COMMENT '活动ID',
+ `source` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '渠道',
+ `channel` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '来源',
+ `original_price` decimal(8, 2) NOT NULL COMMENT '原始价格',
+ `deduction_price` decimal(8, 2) NOT NULL COMMENT '折扣金额',
+ `pay_price` decimal(8, 2) NOT NULL COMMENT '支付价格',
+ `target_count` int NOT NULL COMMENT '目标数量',
+ `complete_count` int NOT NULL COMMENT '完成数量',
+ `lock_count` int NOT NULL COMMENT '锁单数量',
+ `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态(0-拼单中、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`) USING BTREE,
+ UNIQUE INDEX `uq_team_id`(`team_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '拼团订单表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of group_buy_order
+-- ----------------------------
+INSERT INTO `group_buy_order` VALUES (4, '80437493', 100123, 's01', 'c01', 100.00, 20.00, 80.00, 5, 0, 4, 0, '2025-07-02 13:31:35', '2025-07-02 13:48:16');
+
+-- ----------------------------
+-- Table structure for group_buy_order_list
+-- ----------------------------
+DROP TABLE IF EXISTS `group_buy_order_list`;
+CREATE TABLE `group_buy_order_list` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID',
+ `team_id` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '拼单组队ID',
+ `order_id` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '订单ID',
+ `activity_id` bigint NOT NULL COMMENT '活动ID',
+ `start_time` datetime NOT NULL COMMENT '活动开始时间',
+ `end_time` datetime NOT NULL COMMENT '活动结束时间',
+ `goods_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品ID',
+ `source` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '渠道',
+ `channel` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '来源',
+ `original_price` decimal(8, 2) NOT NULL COMMENT '原始价格',
+ `deduction_price` decimal(8, 2) NOT NULL COMMENT '折扣金额',
+ `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态;0初始锁定、1消费完成、2用户退单',
+ `out_trade_no` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci 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 '更新时间',
+ `biz_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '业务唯一ID',
+ PRIMARY KEY (`id`) USING BTREE,
+ UNIQUE INDEX `uq_order_id`(`order_id` ASC) USING BTREE,
+ INDEX `idx_user_id_activity_id`(`user_id` ASC, `activity_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '拼团订单明细表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of group_buy_order_list
+-- ----------------------------
+INSERT INTO `group_buy_order_list` VALUES (6, 'smile01', '80437493', '915634883913', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 0, '093147606342', '2025-07-02 13:31:35', '2025-07-02 13:31:35', '100123_smile01_1');
+INSERT INTO `group_buy_order_list` VALUES (7, 'smile02', '80437493', '337142187685', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 0, '835118458939', '2025-07-02 13:40:23', '2025-07-02 13:40:23', '100123_smile02_1');
+INSERT INTO `group_buy_order_list` VALUES (8, 'smile03', '80437493', '299471294958', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 0, '135668811039', '2025-07-02 13:41:31', '2025-07-02 13:41:31', '100123_smile03_1');
+INSERT INTO `group_buy_order_list` VALUES (9, 'smile04', '80437493', '254753792328', 100123, '2025-06-19 10:19:40', '2025-07-31 10:19:40', '9890001', 's01', 'c01', 100.00, 20.00, 0, '088164349390', '2025-07-02 13:47:45', '2025-07-02 13:47:45', '100123_smile04_1');
+
+-- ----------------------------
+-- Table structure for sc_sku_activity
+-- ----------------------------
+DROP TABLE IF EXISTS `sc_sku_activity`;
+CREATE TABLE `sc_sku_activity` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `source` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '渠道',
+ `channel` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '来源',
+ `activity_id` bigint NOT NULL COMMENT '活动ID',
+ `goods_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品ID',
+ `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`) USING BTREE,
+ UNIQUE INDEX `uq_sc_goodsid`(`source` ASC, `channel` ASC, `goods_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '渠道商品活动配置关联表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sc_sku_activity
+-- ----------------------------
+INSERT INTO `sc_sku_activity` VALUES (1, 's01', 'c01', 100123, '9890001', '2025-06-26 17:15:54', '2025-06-26 17:15:54');
+
+-- ----------------------------
+-- Table structure for sku
+-- ----------------------------
+DROP TABLE IF EXISTS `sku`;
+CREATE TABLE `sku` (
+ `id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
+ `source` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '渠道',
+ `channel` varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '来源',
+ `goods_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '商品ID',
+ `goods_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci 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`) USING BTREE,
+ UNIQUE INDEX `uq_goods_id`(`goods_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '商品信息' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sku
+-- ----------------------------
+INSERT INTO `sku` VALUES (1, 's01', 'c01', '9890001', '《手写MyBatis:渐进式源码实践》', 100.00, '2025-06-22 11:10:06', '2025-06-22 11:10:06');
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_order_mapper.xml b/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_order_mapper.xml
index 9be2123..3282d82 100644
--- a/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_order_mapper.xml
+++ b/group-buying-sys-app/src/main/resources/mybatis/mapper/group_buy_order_mapper.xml
@@ -66,7 +66,7 @@
diff --git a/group-buying-sys-app/src/test/java/edu/whut/test/domain/trade/TradeSettlementOrderServiceTest.java b/group-buying-sys-app/src/test/java/edu/whut/test/domain/trade/TradeSettlementOrderServiceTest.java
index 5601e9a..8028fce 100644
--- a/group-buying-sys-app/src/test/java/edu/whut/test/domain/trade/TradeSettlementOrderServiceTest.java
+++ b/group-buying-sys-app/src/test/java/edu/whut/test/domain/trade/TradeSettlementOrderServiceTest.java
@@ -11,6 +11,7 @@ import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
+import java.util.Date;
/**
* 拼团交易结算服务测试
@@ -24,12 +25,14 @@ public class TradeSettlementOrderServiceTest {
private ITradeSettlementOrderService tradeSettlementOrderService;
@Test
- public void test_settlementMarketPayOrder() {
+ public void test_settlementMarketPayOrder() throws Exception {
+ //模拟支付成功后传入的信息
TradePaySuccessEntity tradePaySuccessEntity = new TradePaySuccessEntity();
- tradePaySuccessEntity.setSource("s01");
- tradePaySuccessEntity.setChannel("c01");
+ tradePaySuccessEntity.setSource("s02");
+ tradePaySuccessEntity.setChannel("c02");
tradePaySuccessEntity.setUserId("zy03");
- tradePaySuccessEntity.setOutTradeNo("192426946598");
+ tradePaySuccessEntity.setOutTradeNo("251255361034");
+ tradePaySuccessEntity.setOutTradeTime(new Date()); //交易时间
TradePaySettlementEntity tradePaySettlementEntity = tradeSettlementOrderService.settlementMarketPayOrder(tradePaySuccessEntity);
log.info("请求参数:{}", JSON.toJSONString(tradePaySuccessEntity));
log.info("测试结果:{}", JSON.toJSONString(tradePaySettlementEntity));
diff --git a/group-buying-sys-app/src/test/java/edu/whut/test/trigger/MarketTradeControllerTest.java b/group-buying-sys-app/src/test/java/edu/whut/test/trigger/MarketTradeControllerTest.java
index 8053931..cd34a5a 100644
--- a/group-buying-sys-app/src/test/java/edu/whut/test/trigger/MarketTradeControllerTest.java
+++ b/group-buying-sys-app/src/test/java/edu/whut/test/trigger/MarketTradeControllerTest.java
@@ -44,8 +44,8 @@ public class MarketTradeControllerTest {
@Test
public void test_lockMarketPayOrder_teamId_not_null() {
LockMarketPayOrderRequestDTO lockMarketPayOrderRequestDTO = new LockMarketPayOrderRequestDTO();
- lockMarketPayOrderRequestDTO.setUserId("zy03");
- lockMarketPayOrderRequestDTO.setTeamId("26432069");
+ lockMarketPayOrderRequestDTO.setUserId("zy04");
+ lockMarketPayOrderRequestDTO.setTeamId("36689983");
lockMarketPayOrderRequestDTO.setActivityId(100123L);
lockMarketPayOrderRequestDTO.setGoodsId("9890001");
lockMarketPayOrderRequestDTO.setSource("s01");
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/adapter/repository/ITradeRepository.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/adapter/repository/ITradeRepository.java
index cc87e36..311ecca 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/adapter/repository/ITradeRepository.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/adapter/repository/ITradeRepository.java
@@ -26,5 +26,5 @@ public interface ITradeRepository {
void settlementMarketPayOrder(GroupBuyTeamSettlementAggregate groupBuyTeamSettlementAggregate);
-
+ boolean isSCBlackIntercept(String source, String channel);
}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeRuleCommandEntity.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeLockRuleCommandEntity.java
similarity index 89%
rename from group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeRuleCommandEntity.java
rename to group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeLockRuleCommandEntity.java
index f20f399..25ba87a 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeRuleCommandEntity.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeLockRuleCommandEntity.java
@@ -12,7 +12,7 @@ import lombok.NoArgsConstructor;
@Builder
@AllArgsConstructor
@NoArgsConstructor
-public class TradeRuleCommandEntity {
+public class TradeLockRuleCommandEntity {
/** 用户ID */
private String userId;
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeRuleFilterBackEntity.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeLockRuleFilterBackEntity.java
similarity index 88%
rename from group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeRuleFilterBackEntity.java
rename to group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeLockRuleFilterBackEntity.java
index 16966ec..3dac1e5 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeRuleFilterBackEntity.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeLockRuleFilterBackEntity.java
@@ -12,7 +12,7 @@ import lombok.NoArgsConstructor;
@Builder
@AllArgsConstructor
@NoArgsConstructor
-public class TradeRuleFilterBackEntity {
+public class TradeLockRuleFilterBackEntity {
// 用户参与活动的订单量
private Integer userTakeOrderCount;
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeSettlementRuleCommandEntity.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeSettlementRuleCommandEntity.java
new file mode 100644
index 0000000..5c7e2d3
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeSettlementRuleCommandEntity.java
@@ -0,0 +1,30 @@
+package edu.whut.domain.trade.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * 拼团交易结算规则命令
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class TradeSettlementRuleCommandEntity {
+
+ /** 渠道 */
+ private String source;
+ /** 来源 */
+ private String channel;
+ /** 用户ID */
+ private String userId;
+ /** 外部交易单号 */
+ private String outTradeNo;
+ /** 外部交易时间 */
+ private Date outTradeTime;
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeSettlementRuleFilterBackEntity.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeSettlementRuleFilterBackEntity.java
new file mode 100644
index 0000000..8127140
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/model/entity/TradeSettlementRuleFilterBackEntity.java
@@ -0,0 +1,36 @@
+package edu.whut.domain.trade.model.entity;
+import edu.whut.types.enums.GroupBuyOrderStatusEnumVO;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * 拼团交易结算规则反馈
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class TradeSettlementRuleFilterBackEntity {
+
+ /** 拼单组队ID */
+ private String teamId;
+ /** 活动ID */
+ private Long activityId;
+ /** 目标数量 */
+ private Integer targetCount;
+ /** 完成数量 */
+ private Integer completeCount;
+ /** 锁单数量 */
+ private Integer lockCount;
+ /** 状态(0-拼单中、1-完成、2-失败) */
+ private GroupBuyOrderStatusEnumVO status;
+ /** 拼团开始时间 - 参与拼团时间 */
+ private Date validStartTime;
+ /** 拼团结束时间 - 拼团有效时长 */
+ private Date validEndTime;
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/ITradeSettlementOrderService.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/ITradeSettlementOrderService.java
index 451ce48..8be0360 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/ITradeSettlementOrderService.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/ITradeSettlementOrderService.java
@@ -13,6 +13,6 @@ public interface ITradeSettlementOrderService {
* @param tradePaySuccessEntity 交易支付订单实体对象
* @return 交易结算订单实体
*/
- TradePaySettlementEntity settlementMarketPayOrder(TradePaySuccessEntity tradePaySuccessEntity);
+ TradePaySettlementEntity settlementMarketPayOrder(TradePaySuccessEntity tradePaySuccessEntity) throws Exception;
}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/TradeLockLockOrderService.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/TradeLockLockOrderService.java
index 9ee4246..859f73b 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/TradeLockLockOrderService.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/TradeLockLockOrderService.java
@@ -5,7 +5,7 @@ import edu.whut.domain.trade.model.aggregate.GroupBuyOrderAggregate;
import edu.whut.domain.trade.model.entity.*;
import edu.whut.domain.trade.model.valobj.GroupBuyProgressVO;
import edu.whut.domain.trade.service.ITradeLockOrderService;
-import edu.whut.domain.trade.service.lock.factory.TradeRuleFilterFactory;
+import edu.whut.domain.trade.service.lock.factory.TradeLockRuleFilterFactory;
import edu.whut.types.design.framework.link.model2.chain.BusinessLinkedList;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -23,7 +23,7 @@ public class TradeLockLockOrderService implements ITradeLockOrderService {
private final ITradeRepository repository;
//注入责任链,tradeRuleFilter为自定义bean名
- private final BusinessLinkedList tradeRuleFilter;
+ private final BusinessLinkedList tradeRuleFilter;
@Override
@@ -38,18 +38,19 @@ public class TradeLockLockOrderService implements ITradeLockOrderService {
return repository.queryGroupBuyProgress(teamId);
}
+ //TODO:设置超时未付款自动取消lock,释放资源
@Override
public MarketPayOrderEntity lockMarketPayOrder(UserEntity userEntity, PayActivityEntity payActivityEntity, PayDiscountEntity payDiscountEntity) throws Exception{
log.info("拼团交易-锁定营销优惠支付订单:{} activityId:{} goodsId:{}", userEntity.getUserId(), payActivityEntity.getActivityId(), payDiscountEntity.getGoodsId());
// 责任链校验:确保活动仍有效、用户参与次数未到上限。
- TradeRuleFilterBackEntity tradeRuleFilterBackEntity = tradeRuleFilter.apply(TradeRuleCommandEntity.builder()
+ TradeLockRuleFilterBackEntity tradeLockRuleFilterBackEntity = tradeRuleFilter.apply(TradeLockRuleCommandEntity.builder()
.activityId(payActivityEntity.getActivityId())
.userId(userEntity.getUserId())
.build(),
- new TradeRuleFilterFactory.DynamicContext());
+ new TradeLockRuleFilterFactory.DynamicContext());
// 获得该用户在该活动上已参与的拼团量 - 用于构建数据库唯一索引使用,确保用户只能在一个活动上参与固定的次数
- Integer userTakeOrderCount = tradeRuleFilterBackEntity.getUserTakeOrderCount();
+ Integer userTakeOrderCount = tradeLockRuleFilterBackEntity.getUserTakeOrderCount();
// 构建聚合对象
GroupBuyOrderAggregate groupBuyOrderAggregate = GroupBuyOrderAggregate.builder()
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/factory/TradeRuleFilterFactory.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/factory/TradeLockRuleFilterFactory.java
similarity index 73%
rename from group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/factory/TradeRuleFilterFactory.java
rename to group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/factory/TradeLockRuleFilterFactory.java
index 8ded231..a7a4f1e 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/factory/TradeRuleFilterFactory.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/factory/TradeLockRuleFilterFactory.java
@@ -1,7 +1,7 @@
package edu.whut.domain.trade.service.lock.factory;
import edu.whut.domain.trade.model.entity.GroupBuyActivityEntity;
-import edu.whut.domain.trade.model.entity.TradeRuleCommandEntity;
-import edu.whut.domain.trade.model.entity.TradeRuleFilterBackEntity;
+import edu.whut.domain.trade.model.entity.TradeLockRuleCommandEntity;
+import edu.whut.domain.trade.model.entity.TradeLockRuleFilterBackEntity;
import edu.whut.domain.trade.service.lock.filter.ActivityUsabilityRuleFilter;
import edu.whut.domain.trade.service.lock.filter.UserTakeLimitRuleFilter;
import edu.whut.types.design.framework.link.model2.LinkArmory;
@@ -19,15 +19,15 @@ import org.springframework.stereotype.Service;
*/
@Slf4j
@Service
-public class TradeRuleFilterFactory {
+public class TradeLockRuleFilterFactory {
/**
* 通过 Spring @Bean 暴露:外部只需注入 BusinessLinkedList 即可调用 apply
*/
@Bean("tradeRuleFilter")
- public BusinessLinkedList tradeRuleFilter(ActivityUsabilityRuleFilter activityUsabilityRuleFilter, UserTakeLimitRuleFilter userTakeLimitRuleFilter) {
+ public BusinessLinkedList tradeRuleFilter(ActivityUsabilityRuleFilter activityUsabilityRuleFilter, UserTakeLimitRuleFilter userTakeLimitRuleFilter) {
// 1. 组装链
- LinkArmory linkArmory =
+ LinkArmory linkArmory =
new LinkArmory<>("交易规则过滤链", activityUsabilityRuleFilter, userTakeLimitRuleFilter);
// 2. 返回链容器(即可作为责任链使用)
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/filter/ActivityUsabilityRuleFilter.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/filter/ActivityUsabilityRuleFilter.java
index acc2ec2..324ac5e 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/filter/ActivityUsabilityRuleFilter.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/filter/ActivityUsabilityRuleFilter.java
@@ -1,9 +1,9 @@
package edu.whut.domain.trade.service.lock.filter;
import edu.whut.domain.trade.adapter.repository.ITradeRepository;
import edu.whut.domain.trade.model.entity.GroupBuyActivityEntity;
-import edu.whut.domain.trade.model.entity.TradeRuleCommandEntity;
-import edu.whut.domain.trade.model.entity.TradeRuleFilterBackEntity;
-import edu.whut.domain.trade.service.lock.factory.TradeRuleFilterFactory;
+import edu.whut.domain.trade.model.entity.TradeLockRuleCommandEntity;
+import edu.whut.domain.trade.model.entity.TradeLockRuleFilterBackEntity;
+import edu.whut.domain.trade.service.lock.factory.TradeLockRuleFilterFactory;
import edu.whut.types.design.framework.link.model2.handler.ILogicHandler;
import edu.whut.types.enums.ActivityStatusEnumVO;
import edu.whut.types.enums.ResponseCode;
@@ -20,12 +20,12 @@ import java.util.Date;
@Slf4j
@Service
@RequiredArgsConstructor
-public class ActivityUsabilityRuleFilter implements ILogicHandler {
+public class ActivityUsabilityRuleFilter implements ILogicHandler {
private final ITradeRepository repository;
@Override
- public TradeRuleFilterBackEntity apply(TradeRuleCommandEntity requestParameter, TradeRuleFilterFactory.DynamicContext dynamicContext) throws Exception {
+ public TradeLockRuleFilterBackEntity apply(TradeLockRuleCommandEntity requestParameter, TradeLockRuleFilterFactory.DynamicContext dynamicContext) throws Exception {
log.info("交易规则过滤-活动的可用性校验{} activityId:{}", requestParameter.getUserId(), requestParameter.getActivityId());
// 查询拼团活动
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/filter/UserTakeLimitRuleFilter.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/filter/UserTakeLimitRuleFilter.java
index 0cbb3db..652a40d 100644
--- a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/filter/UserTakeLimitRuleFilter.java
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/lock/filter/UserTakeLimitRuleFilter.java
@@ -1,9 +1,9 @@
package edu.whut.domain.trade.service.lock.filter;
import edu.whut.domain.trade.adapter.repository.ITradeRepository;
import edu.whut.domain.trade.model.entity.GroupBuyActivityEntity;
-import edu.whut.domain.trade.model.entity.TradeRuleCommandEntity;
-import edu.whut.domain.trade.model.entity.TradeRuleFilterBackEntity;
-import edu.whut.domain.trade.service.lock.factory.TradeRuleFilterFactory;
+import edu.whut.domain.trade.model.entity.TradeLockRuleCommandEntity;
+import edu.whut.domain.trade.model.entity.TradeLockRuleFilterBackEntity;
+import edu.whut.domain.trade.service.lock.factory.TradeLockRuleFilterFactory;
import edu.whut.types.design.framework.link.model2.handler.ILogicHandler;
import edu.whut.types.enums.ResponseCode;
import edu.whut.types.exception.AppException;
@@ -17,13 +17,13 @@ import javax.annotation.Resource;
*/
@Slf4j
@Service
-public class UserTakeLimitRuleFilter implements ILogicHandler {
+public class UserTakeLimitRuleFilter implements ILogicHandler {
@Resource
private ITradeRepository repository;
@Override
- public TradeRuleFilterBackEntity apply(TradeRuleCommandEntity requestParameter, TradeRuleFilterFactory.DynamicContext dynamicContext) throws Exception {
+ public TradeLockRuleFilterBackEntity apply(TradeLockRuleCommandEntity requestParameter, TradeLockRuleFilterFactory.DynamicContext dynamicContext) throws Exception {
log.info("交易规则过滤-用户参与次数校验{} activityId:{}", requestParameter.getUserId(), requestParameter.getActivityId());
GroupBuyActivityEntity groupBuyActivity = dynamicContext.getGroupBuyActivity();
@@ -36,7 +36,7 @@ public class UserTakeLimitRuleFilter implements ILogicHandler tradeSettlementRuleFilter;
- @Resource
- private ITradeRepository repository;
/**
* 第三方支付渠道确认用户“支付成功”之后调用该函数,更新拼团订单状态为 已完成,并同步拼团人数。
@@ -24,17 +30,17 @@ public class TradeSettlementOrderService implements ITradeSettlementOrderService
* @return
*/
@Override
- public TradePaySettlementEntity settlementMarketPayOrder(TradePaySuccessEntity tradePaySuccessEntity) {
+ public TradePaySettlementEntity settlementMarketPayOrder(TradePaySuccessEntity tradePaySuccessEntity) throws Exception {
log.info("拼团交易-支付订单结算:{} outTradeNo:{}", tradePaySuccessEntity.getUserId(), tradePaySuccessEntity.getOutTradeNo());
- // 1. 查询拼团信息
- MarketPayOrderEntity marketPayOrderEntity = repository.queryMarketPayOrderEntityByOutTradeNo(tradePaySuccessEntity.getUserId(), tradePaySuccessEntity.getOutTradeNo());
- if (null == marketPayOrderEntity) {
- log.info("不存在的外部交易单号或用户已退单,不需要做支付订单结算:{} outTradeNo:{}", tradePaySuccessEntity.getUserId(), tradePaySuccessEntity.getOutTradeNo());
- return null;
- }
+ // 1. 结算规则过滤
+ TradeSettlementRuleCommandEntity command = new TradeSettlementRuleCommandEntity();
+ BeanUtils.copyProperties(tradePaySuccessEntity, command);
+ TradeSettlementRuleFilterBackEntity tradeSettlementRuleFilterBackEntity = tradeSettlementRuleFilter.apply(
+ command, new TradeSettlementRuleFilterFactory.DynamicContext());
// 2. 查询组团信息
- GroupBuyTeamEntity groupBuyTeamEntity = repository.queryGroupBuyTeamByTeamId(marketPayOrderEntity.getTeamId());
+ GroupBuyTeamEntity groupBuyTeamEntity = new GroupBuyTeamEntity();
+ BeanUtils.copyProperties(tradeSettlementRuleFilterBackEntity, groupBuyTeamEntity);
// 3. 构建聚合对象
GroupBuyTeamSettlementAggregate groupBuyTeamSettlementAggregate = GroupBuyTeamSettlementAggregate.builder()
@@ -51,7 +57,7 @@ public class TradeSettlementOrderService implements ITradeSettlementOrderService
.source(tradePaySuccessEntity.getSource())
.channel(tradePaySuccessEntity.getChannel())
.userId(tradePaySuccessEntity.getUserId())
- .teamId(marketPayOrderEntity.getTeamId())
+ .teamId(tradeSettlementRuleFilterBackEntity.getTeamId())
.activityId(groupBuyTeamEntity.getActivityId())
.outTradeNo(tradePaySuccessEntity.getOutTradeNo())
.build();
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/factory/TradeSettlementRuleFilterFactory.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/factory/TradeSettlementRuleFilterFactory.java
new file mode 100644
index 0000000..0715af0
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/factory/TradeSettlementRuleFilterFactory.java
@@ -0,0 +1,55 @@
+package edu.whut.domain.trade.service.settlement.factory;
+import edu.whut.domain.trade.model.entity.GroupBuyTeamEntity;
+import edu.whut.domain.trade.model.entity.MarketPayOrderEntity;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleCommandEntity;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleFilterBackEntity;
+import edu.whut.domain.trade.service.settlement.filter.EndRuleFilter;
+import edu.whut.domain.trade.service.settlement.filter.OutTradeNoRuleFilter;
+import edu.whut.domain.trade.service.settlement.filter.SCRuleFilter;
+import edu.whut.domain.trade.service.settlement.filter.SettableRuleFilter;
+import edu.whut.types.design.framework.link.model2.LinkArmory;
+import edu.whut.types.design.framework.link.model2.chain.BusinessLinkedList;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Service;
+
+/**
+ * 交易结算规则过滤工厂
+ */
+@Slf4j
+@Service
+public class TradeSettlementRuleFilterFactory {
+
+ //方法的返回值作为bean被spring管理
+ @Bean("tradeSettlementRuleFilter")
+ public BusinessLinkedList tradeSettlementRuleFilter(
+ SCRuleFilter scRuleFilter,
+ OutTradeNoRuleFilter outTradeNoRuleFilter,
+ SettableRuleFilter settableRuleFilter,
+ EndRuleFilter endRuleFilter) {
+
+ // 这一步 new 出来一个链表工厂,内部会把传进来的各个 Filter 节点按顺序 add() 到双向链表里
+ LinkArmory linkArmory =
+ new LinkArmory<>("交易结算规则过滤链", scRuleFilter, outTradeNoRuleFilter, settableRuleFilter, endRuleFilter);
+
+ // 把链表实例拿出来,交给 Spring 管理
+ return linkArmory.getLogicLink();
+ }
+
+ @Data
+ @Builder
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class DynamicContext {
+ // 订单营销实体对象
+ private MarketPayOrderEntity marketPayOrderEntity;
+ // 拼团组队实体对象
+ private GroupBuyTeamEntity groupBuyTeamEntity;
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/EndRuleFilter.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/EndRuleFilter.java
new file mode 100644
index 0000000..362799a
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/EndRuleFilter.java
@@ -0,0 +1,38 @@
+package edu.whut.domain.trade.service.settlement.filter;
+
+import edu.whut.domain.trade.model.entity.GroupBuyTeamEntity;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleCommandEntity;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleFilterBackEntity;
+import edu.whut.domain.trade.service.settlement.factory.TradeSettlementRuleFilterFactory;
+import edu.whut.types.design.framework.link.model2.handler.ILogicHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 结束节点
+ */
+@Slf4j
+@Service
+public class EndRuleFilter implements ILogicHandler {
+
+ @Override
+ public TradeSettlementRuleFilterBackEntity apply(TradeSettlementRuleCommandEntity requestParameter, TradeSettlementRuleFilterFactory.DynamicContext dynamicContext) throws Exception {
+ log.info("结算规则过滤-结束节点{} outTradeNo:{}", requestParameter.getUserId(), requestParameter.getOutTradeNo());
+
+ // 获取上下文对象
+ GroupBuyTeamEntity groupBuyTeamEntity = dynamicContext.getGroupBuyTeamEntity();
+
+ // 返回封装数据
+ return TradeSettlementRuleFilterBackEntity.builder()
+ .teamId(groupBuyTeamEntity.getTeamId())
+ .activityId(groupBuyTeamEntity.getActivityId())
+ .targetCount(groupBuyTeamEntity.getTargetCount())
+ .completeCount(groupBuyTeamEntity.getCompleteCount())
+ .lockCount(groupBuyTeamEntity.getLockCount())
+ .status(groupBuyTeamEntity.getStatus())
+ .validStartTime(groupBuyTeamEntity.getValidStartTime())
+ .validEndTime(groupBuyTeamEntity.getValidEndTime())
+ .build();
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/OutTradeNoRuleFilter.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/OutTradeNoRuleFilter.java
new file mode 100644
index 0000000..4190d4b
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/OutTradeNoRuleFilter.java
@@ -0,0 +1,42 @@
+package edu.whut.domain.trade.service.settlement.filter;
+import edu.whut.domain.trade.adapter.repository.ITradeRepository;
+import edu.whut.domain.trade.model.entity.MarketPayOrderEntity;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleCommandEntity;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleFilterBackEntity;
+import edu.whut.domain.trade.service.settlement.factory.TradeSettlementRuleFilterFactory;
+import edu.whut.types.design.framework.link.model2.handler.ILogicHandler;
+import edu.whut.types.enums.ResponseCode;
+import edu.whut.types.exception.AppException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 外部交易单号过滤;如果是退单,则被过滤掉。
+ */
+@Slf4j
+@Service
+public class OutTradeNoRuleFilter implements ILogicHandler {
+
+ @Resource
+ private ITradeRepository repository;
+
+ @Override
+ public TradeSettlementRuleFilterBackEntity apply(TradeSettlementRuleCommandEntity requestParameter, TradeSettlementRuleFilterFactory.DynamicContext dynamicContext) throws Exception {
+ log.info("结算规则过滤-外部单号校验{} outTradeNo:{}", requestParameter.getUserId(), requestParameter.getOutTradeNo());
+
+ // 查询拼团信息
+ MarketPayOrderEntity marketPayOrderEntity = repository.queryMarketPayOrderEntityByOutTradeNo(requestParameter.getUserId(), requestParameter.getOutTradeNo());
+
+ if (null == marketPayOrderEntity) {
+ log.error("不存在的外部交易单号或用户已退单,不需要做支付订单结算:{} outTradeNo:{}", requestParameter.getUserId(), requestParameter.getOutTradeNo());
+ throw new AppException(ResponseCode.E0104);
+ }
+
+ dynamicContext.setMarketPayOrderEntity(marketPayOrderEntity);
+
+ return next(requestParameter, dynamicContext);
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/SCRuleFilter.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/SCRuleFilter.java
new file mode 100644
index 0000000..86098ff
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/SCRuleFilter.java
@@ -0,0 +1,38 @@
+package edu.whut.domain.trade.service.settlement.filter;
+import edu.whut.domain.trade.adapter.repository.ITradeRepository;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleCommandEntity;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleFilterBackEntity;
+import edu.whut.domain.trade.service.settlement.factory.TradeSettlementRuleFilterFactory;
+import edu.whut.types.design.framework.link.model2.handler.ILogicHandler;
+import edu.whut.types.enums.ResponseCode;
+import edu.whut.types.exception.AppException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * SC 渠道来源过滤 - 当某个签约渠道下架后,则不会记账
+ */
+@Slf4j
+@Service
+public class SCRuleFilter implements ILogicHandler {
+
+ @Resource
+ private ITradeRepository repository;
+
+ @Override
+ public TradeSettlementRuleFilterBackEntity apply(TradeSettlementRuleCommandEntity requestParameter, TradeSettlementRuleFilterFactory.DynamicContext dynamicContext) throws Exception {
+ log.info("结算规则过滤-渠道黑名单校验{} outTradeNo:{} outTradeTime:{}", requestParameter.getUserId(), requestParameter.getOutTradeNo(), requestParameter.getOutTradeTime());
+
+ // sc 渠道黑名单拦截
+ boolean intercept = repository.isSCBlackIntercept(requestParameter.getSource(), requestParameter.getChannel());
+ if (intercept) {
+ log.error("{}{} 渠道黑名单拦截", requestParameter.getSource(), requestParameter.getChannel());
+ throw new AppException(ResponseCode.E0105);
+ }
+
+ return next(requestParameter, dynamicContext);
+ }
+
+}
diff --git a/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/SettableRuleFilter.java b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/SettableRuleFilter.java
new file mode 100644
index 0000000..1096fd6
--- /dev/null
+++ b/group-buying-sys-domain/src/main/java/edu/whut/domain/trade/service/settlement/filter/SettableRuleFilter.java
@@ -0,0 +1,52 @@
+package edu.whut.domain.trade.service.settlement.filter;
+import edu.whut.domain.trade.adapter.repository.ITradeRepository;
+import edu.whut.domain.trade.model.entity.GroupBuyTeamEntity;
+import edu.whut.domain.trade.model.entity.MarketPayOrderEntity;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleCommandEntity;
+import edu.whut.domain.trade.model.entity.TradeSettlementRuleFilterBackEntity;
+import edu.whut.domain.trade.service.settlement.factory.TradeSettlementRuleFilterFactory;
+import edu.whut.types.design.framework.link.model2.handler.ILogicHandler;
+import edu.whut.types.enums.ResponseCode;
+import edu.whut.types.exception.AppException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+/**
+ * 可结算规则过滤;交易时间
+ */
+@Slf4j
+@Service
+public class SettableRuleFilter implements ILogicHandler {
+
+ @Resource
+ private ITradeRepository repository;
+
+ @Override
+ public TradeSettlementRuleFilterBackEntity apply(TradeSettlementRuleCommandEntity requestParameter, TradeSettlementRuleFilterFactory.DynamicContext dynamicContext) throws Exception {
+ log.info("结算规则过滤-有效时间校验{} outTradeNo:{}", requestParameter.getUserId(), requestParameter.getOutTradeNo());
+
+ // 上下文;获取数据
+ MarketPayOrderEntity marketPayOrderEntity = dynamicContext.getMarketPayOrderEntity();
+
+ // 查询拼团对象
+ GroupBuyTeamEntity groupBuyTeamEntity = repository.queryGroupBuyTeamByTeamId(marketPayOrderEntity.getTeamId());
+
+ // 外部交易时间 - 也就是用户支付完成的时间,这个时间要在拼团有效时间范围内
+ Date outTradeTime = requestParameter.getOutTradeTime();
+
+ // 判断,外部交易时间,要小于拼团结束时间。否则抛异常。
+ if (!outTradeTime.before(groupBuyTeamEntity.getValidEndTime())) {
+ log.error("订单交易时间不在拼团有效时间范围内");
+ throw new AppException(ResponseCode.E0106);
+ }
+
+ // 设置上下文
+ dynamicContext.setGroupBuyTeamEntity(groupBuyTeamEntity);
+
+ return next(requestParameter, dynamicContext);
+ }
+
+}
diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/TagRepository.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/TagRepository.java
index fe2d9c6..ed09e61 100644
--- a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/TagRepository.java
+++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/TagRepository.java
@@ -12,6 +12,7 @@ import edu.whut.infrastructure.redis.IRedisService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBitSet;
+import org.springframework.beans.BeanUtils;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;
@@ -51,12 +52,9 @@ public class TagRepository implements ITagRepository {
CrowdTagsJob crowdTagsJobRes = crowdTagsJobDao.queryCrowdTagsJob(crowdTagsJobReq);
if (null == crowdTagsJobRes) return null;
- return CrowdTagsJobEntity.builder()
- .tagType(crowdTagsJobRes.getTagType())
- .tagRule(crowdTagsJobRes.getTagRule())
- .statStartTime(crowdTagsJobRes.getStatStartTime())
- .statEndTime(crowdTagsJobRes.getStatEndTime())
- .build();
+ CrowdTagsJobEntity crowdTagsJobEntity = new CrowdTagsJobEntity();
+ BeanUtils.copyProperties(crowdTagsJobRes, crowdTagsJobEntity);
+ return crowdTagsJobEntity;
}
/**
diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/TradeRepository.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/TradeRepository.java
index 2b694fc..77202b3 100644
--- a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/TradeRepository.java
+++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/TradeRepository.java
@@ -25,6 +25,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@@ -69,7 +70,7 @@ public class TradeRepository implements ITradeRepository {
return null;
}
- // // 组装领域对象返回,只返回上层真正关心的属性
+ // 组装领域对象返回,只返回上层真正关心的属性
return MarketPayOrderEntity.builder()
.teamId(po.getTeamId())
.orderId(po.getOrderId())
@@ -192,20 +193,12 @@ public class TradeRepository implements ITradeRepository {
@Override
public GroupBuyActivityEntity queryGroupBuyActivityEntityByActivityId(Long activityId) {
GroupBuyActivity groupBuyActivity = groupBuyActivityDao.queryGroupBuyActivityByActivityId(activityId);
- return GroupBuyActivityEntity.builder()
- .activityId(groupBuyActivity.getActivityId())
- .activityName(groupBuyActivity.getActivityName())
- .discountId(groupBuyActivity.getDiscountId())
- .groupType(groupBuyActivity.getGroupType())
- .takeLimitCount(groupBuyActivity.getTakeLimitCount())
- .target(groupBuyActivity.getTarget())
- .validTime(groupBuyActivity.getValidTime())
- .status(ActivityStatusEnumVO.valueOf(groupBuyActivity.getStatus()))
- .startTime(groupBuyActivity.getStartTime())
- .endTime(groupBuyActivity.getEndTime())
- .tagId(groupBuyActivity.getTagId())
- .tagScope(groupBuyActivity.getTagScope())
- .build();
+ GroupBuyActivityEntity groupBuyActivityEntity = new GroupBuyActivityEntity();
+ BeanUtils.copyProperties(groupBuyActivity, groupBuyActivityEntity);
+ groupBuyActivityEntity.setStatus(
+ ActivityStatusEnumVO.valueOf(groupBuyActivity.getStatus())
+ );
+ return groupBuyActivityEntity;
}
/**
@@ -225,16 +218,10 @@ public class TradeRepository implements ITradeRepository {
@Override
public GroupBuyTeamEntity queryGroupBuyTeamByTeamId(String teamId) {
GroupBuyOrder groupBuyOrder = groupBuyOrderDao.queryGroupBuyTeamByTeamId(teamId);
- return GroupBuyTeamEntity.builder()
- .teamId(groupBuyOrder.getTeamId())
- .activityId(groupBuyOrder.getActivityId())
- .targetCount(groupBuyOrder.getTargetCount())
- .completeCount(groupBuyOrder.getCompleteCount())
- .lockCount(groupBuyOrder.getLockCount())
- .status(GroupBuyOrderStatusEnumVO.valueOf(groupBuyOrder.getStatus()))
- .validStartTime(groupBuyOrder.getValidStartTime())
- .validEndTime(groupBuyOrder.getValidEndTime())
- .build();
+ GroupBuyTeamEntity groupBuyTeamEntity = new GroupBuyTeamEntity();
+ BeanUtils.copyProperties(groupBuyOrder, groupBuyTeamEntity, "status");
+ groupBuyTeamEntity.setStatus(GroupBuyOrderStatusEnumVO.valueOf(groupBuyOrder.getStatus()));
+ return groupBuyTeamEntity;
}
@@ -298,4 +285,9 @@ public class TradeRepository implements ITradeRepository {
notifyTaskDao.insert(task);
}
}
+
+ @Override
+ public boolean isSCBlackIntercept(String source, String channel) {
+ return dccService.isSCBlackIntercept(source, channel);
+ }
}
diff --git a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dcc/DCCService.java b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dcc/DCCService.java
index a13665a..c95c476 100644
--- a/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dcc/DCCService.java
+++ b/group-buying-sys-infrastructure/src/main/java/edu/whut/infrastructure/dcc/DCCService.java
@@ -1,7 +1,11 @@
package edu.whut.infrastructure.dcc;
import edu.whut.types.annotations.DCCValue;
+import edu.whut.types.common.Constants;
import org.springframework.stereotype.Service;
+import java.util.Arrays;
+import java.util.List;
+
/**
* DCC动态配置服务 Dynamic Configuration Center
*/
@@ -10,16 +14,24 @@ public class DCCService {
/**
* 降级开关 0关闭、1开启 当外部依赖异常、系统负载过高等场景下,主动关闭或简化某些功能
+ * 默认值为0,即关闭降级
*/
@DCCValue("downgradeSwitch:0")
private String downgradeSwitch;
/**
* 人群切量开关,只让部分人群先使用新功能或新版本
+ * 默认值为100,即不对人群过滤
*/
@DCCValue("cutRange:100")
private String cutRange;
+ /**
+ * 对指定“来源+渠道”进行拦截
+ */
+ @DCCValue("scBlacklist:s02c02,s03c03")
+ private String scBlacklist;
+
/**
* 判断是否降级
* @return
@@ -43,4 +55,12 @@ public class DCCService {
return false;
}
+ /**
+ * 判断黑名单拦截渠道,true 拦截、false 放行
+ */
+ public boolean isSCBlackIntercept(String source, String channel) {
+ List list = Arrays.asList(scBlacklist.split(Constants.SPLIT)); //可能拦截多渠道:s02c02,s03c03
+ return list.contains(source + channel);
+ }
+
}
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 eb3662b..d077a90 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
@@ -25,6 +25,9 @@ public enum ResponseCode {
E0101("E0101", "拼团活动未生效"),
E0102("E0102", "不在拼团活动有效时间内"),
E0103("E0103", "当前用户参与此拼团次数已达上限"),
+ E0104("E0104", "不存在的外部交易单号或用户已退单"),
+ E0105("E0105", "SC渠道黑名单拦截"),
+ E0106("E0106", "订单交易时间不在拼团有效时间范围内"),
;
private String code;