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;