基于 DDD 分层架构的拼团营销中台 + 支付商城一体仓库,提供营销试算、拼团锁单、支付结算、拼团退单、回调通知的完整闭环,营销侧规则通过自研责任链规则引擎扩展。
仓库包含两个独立可部署的工程:
| 工程 | 说明 | 端口 |
|---|---|---|
qucemarket |
团购营销平台(6 个 Maven 模块) | 8091 |
s-pay-mall-ddd-market |
支付商城(6 个 Maven 模块,作为对接商户端) | 8080 |
根聚合 pom.xml 一次性聚合 7 个模块(6 个平台模块 + 支付商城聚合工程),仓库根目录 mvn clean install 即可全量构建。
- 架构总览
- 项目结构
- 自研框架(com.quce.framework)
- 核心业务链路
- 规则引擎(责任链)
- 新增规则(本仓库扩展)
- 对外接口
- 消息拓扑(RabbitMQ)
- 定时任务
- 环境依赖
- 快速启动
- 对接流程
- 运维与可观测
- 说明
┌─────────────────── 用户 ───────────────────┐
│ 微信扫码登录 / 下单 / 支付宝支付 │
└───────────────────┬────────────────────────┘
▼
┌────────────────────────────────────────────────────────────────────┐
│ 支付商城 s-pay-mall-ddd-market (8080) │
│ HTTP: 登录 / 下单 / 支付 / 拼团回调接收 │
│ MQ: 消费订单支付成功、组队成功消息 │
│ 定时: 超时关单、未支付订单通知 │
└───────┬──────────────────────────────────┬─────────────────────────┘
│ Retrofit2 锁单/结算 │ HTTP 回调 + MQ
▼ ▼
┌────────────────────────────────────────────────────────────────────┐
│ 营销平台 qucemarket (8091) │
│ HTTP: 锁单 / 结算 / 退单 / 活动索引(限流)/ DCC 动态配置 │
│ 领域: 营销试算(策略树)│ 交易(责任链 + 策略)│ 人群标签 │
│ MQ: 发布组队成功 / 退单消息 │
│ 定时: 超时未支付自动退款、通知重试补偿 │
└────────────────────────────────────────────────────────────────────┘
qucemarket/
├── qucemarket-api # 对外接口层 + DTO
├── qucemarket-app # 营销平台启动层(启动类、配置)
├── qucemarket-domain # 领域层(活动试算、交易锁单/结算/退单、人群标签)
├── qucemarket-infrastructure # 基础设施层(DAO、仓储、Redis、DCC、回调网关、限流 AOP)
├── qucemarket-trigger # 触发层(HTTP 接口、MQ 监听、定时任务)
├── qucemarket-types # 通用类型 + 自研框架(责任链/策略树/DCC/限流)
├── s-pay-mall-ddd-market/ # 支付商城(嵌套聚合工程,6 个模块)
│ ├── s-pay-mall-ddd-api / -app / -domain / -infrastructure / -trigger / -types
└── docs # 部署脚本、SQL、UI
qucemarket-types 模块内置自研框架组件,不依赖任何外部责任链/规则引擎组件:
| 组件 | 包 | 说明 |
|---|---|---|
| 责任链 model1 | com.quce.framework.link.model1 |
节点持有下一节点引用(appendNext 链尾追加) |
| 责任链 model2 | com.quce.framework.link.model2 |
LinkArmory 组装 + 路由上下文,ILogicHandler.next() 自动路由到下一节点 |
| 策略树 | com.quce.framework.tree |
AbstractMultiThreadStrategyRouter 模板方法路由,支持多线程数据预加载 |
| 动态配置 DCC | com.quce.framework.dcc |
@DCCValue 注解注入 + Redis 主题动态更新(/api/v1/gbm/dcc/update_config) |
| 限流 | com.quce.framework.ratelimiter |
@RateLimiterAccessInterceptor 注解 + Redisson 令牌桶限流:超限走降级方法,连续超限进入黑名单 |
限流注解定义在 types 模块,拦截器实现(RateLimiterInterceptor,基于 RRateLimiter)在 infrastructure 模块,按 @RateLimiterAccessInterceptor(key = "userId", ...) 维度限流。
- 营销试算:商品 + 活动 → 折扣试算 → 人群标签限定 → 返回优惠价(策略树:Root → Switch → Market → Tag → End)
- 锁单:用户下单携带活动ID → 责任链校验(黑名单/活动可用性/参与次数/队伍库存)→ 锁定营销优惠
- 结算:支付成功 → 责任链校验(渠道黑名单/外部单号/有效时间/队伍状态/折扣上限)→ 组队记账 → 回调通知商户
- 退单:拼团失败/超时未支付 → 策略处理(未支付退款/已支付退款/已组队退款)→ 回调通知
- 通知补偿:回调失败进入 NotifyTask 定时任务重试,不丢单
规则通过责任链编排,新增规则只需实现过滤器并注入工厂即可,无需改动主流程。
锁单链:黑名单拦截 → 活动可用性 → 用户参与次数 → 队伍库存占用
结算链:渠道黑名单 → 外部单号 → 有效时间 → 队伍状态 → 折扣上限 → 结束
退单策略:未支付退款 / 已支付退款 / 已组队退款三种策略按订单状态分发。
| 规则 | 责任链 | 说明 | 错误码 |
|---|---|---|---|
| 用户黑名单拦截 | 锁单链(首位) | 基于人群标签 RQ_QUCE_BLACKLIST 的 Redis BitSet 校验,黑名单用户直接拦截 |
E0107 |
| 拼团队伍状态校验 | 结算链 | 仅「拼单中」队伍允许结算,拦截已完结/已失败队伍的重复记账 | E0109 |
| 折扣力度上限校验 | 结算链 | 实付折扣率不得超过配置上限(默认 8 折),防资损 | E0108 |
黑名单人群标签可通过 TagService.execTagBatchJob 批次任务写入;折扣上限可通过 DCC 配置中心动态调整(discountCap,默认 0.8)。
| 接口 | 说明 |
|---|---|
POST /api/v1/gbm/trade/lock_market_pay_order |
拼团锁单 |
POST /api/v1/gbm/trade/settlement_market_pay_order |
支付成功结算 |
POST /api/v1/gbm/trade/refund_market_pay_order |
拼团退单 |
POST /api/v1/gbm/index/query_group_buy_market_config |
活动配置查询(试算 + 进行中队伍 + 队伍统计,含限流保护) |
GET /api/v1/gbm/dcc/update_config |
DCC 动态配置发布 |
POST /api/v1/test/group_buy_notify |
模拟第三方回调(联调用) |
| 接口 | 说明 |
|---|---|
GET /api/v1/login/weixin_qrcode_ticket |
微信扫码登录(生成二维码 ticket) |
GET /api/v1/login/weixin_qrcode_ticket_scene |
扫码登录(场景值版本) |
GET /api/v1/login/check_login / check_login_scene |
轮询确认登录状态 |
POST /api/v1/alipay/create_pay_order |
创建支付单(下单 + 营销锁单) |
POST /api/v1/alipay/alipay_notify_url |
支付宝异步支付回调 |
POST /api/v1/alipay/group_buy_notify |
接收营销平台拼团组队完成回调 |
GET/POST /api/v1/weixin/portal/receive |
微信公众号消息接入(签名校验 + XML 收发) |
交换机 group_buy_market_exchange(TOPIC),供平台发布、商城消费:
| Routing Key | 生产方 | 消费方 | 说明 |
|---|---|---|---|
topic.team_success |
营销平台(组队完成) | 商城 + 平台 | 组队成功通知,商城更新订单状态 |
topic.team_refund |
营销平台(退单) | 平台 | 退单通知,恢复队伍锁单库存 |
| 工程 | 任务 | 周期 | 说明 |
|---|---|---|---|
| 营销平台 | TimeoutRefundJob | 每分钟 | 扫描超时未支付订单自动退款(Redisson 分布式锁防并发) |
| 营销平台 | GroupBuyNotifyJob | 每日凌晨 | 扫描未通知回调重试补偿,保证不丢单 |
| 支付商城 | TimeoutCloseOrderJob | 每 30 分钟 | 超时订单关闭 |
| 支付商城 | NoPayNotifyOrderJob | 每 30 分钟 | 未支付订单催付通知 |
- JDK 8、Maven 3.6+
- MySQL(营销库:
docs/dev-ops/mysql/sql/2-29-group_buy_market.sql;商城库:s-pay-mall-ddd-market/docs/dev-ops/mysql/sql/s-pay-mall-ddd-market.sql) - Redis(锁单库存、人群标签 BitSet、限流)
- RabbitMQ(组队成功/退单消息、订单支付成功消息)
- 微信公众号 + 支付宝沙箱(支付商城侧,配置见其
application-dev.yml)
# 1. 初始化数据库
mysql -h <host> -u root -p < docs/dev-ops/mysql/sql/2-29-group_buy_market.sql
mysql -h <host> -u root -p < s-pay-mall-ddd-market/docs/dev-ops/mysql/sql/s-pay-mall-ddd-market.sql
# 2. 按需修改两个工程的 application-dev.yml(MySQL / Redis / RabbitMQ / 微信 / 支付宝)
# 3. 仓库根目录一次构建全部工程
mvn clean install -DskipTests
# 4. 启动营销平台(端口 8091)
java -jar qucemarket-app/target/qucemarket-app.jar --spring.profiles.active=dev
# 5. 启动支付商城(端口 8080)
java -jar s-pay-mall-ddd-market/s-pay-mall-ddd-app/target/s-pay-mall-ddd-app.jar --spring.profiles.active=dev依赖中间件也可用 docs/dev-ops/docker-compose-*.yml 一键拉起(MySQL / Redis / RabbitMQ / Nginx / ELK / Grafana 等)。
用户 → 支付商城(s-pay-mall-ddd-market) 营销平台(qucemarket)
│ 1.下单(携带活动ID + 回调地址) │
│ ────────────────────────────────────────────────▶ │
│ 2.营销锁单/试算(Retrofit2) │
│ ◀──────────────────────────────────────────────── │
│ 3.支付宝支付 │
│ 4.支付成功 → 结算接口 │
│ ────────────────────────────────────────────────▶ │
│ 5.拼团组队完成:HTTP 回调 + MQ(topic.team_success) │
│ ◀──────────────────────────────────────────────── │
- 支付商城通过
IGroupBuyMarketService(Retrofit2)调用平台锁单/结算接口,平台地址配置app.config.group-buy-market.api-url - 平台组队完成通过 HTTP 回调(
notifyConfigVO.notifyUrl)与 MQ(group_buy_market_exchange/topic.team_success)双通道通知支付商城 - 详见
s-pay-mall-ddd-market/README.md
- 日志:Logstash 采集上报 ELK(
docs/dev-ops/docker-compose-elk.yml) - 监控:Prometheus + Grafana(
docs/dev-ops/docker-compose-grafana.yml、docs/dev-ops/prometheus) - 部署:
docs/dev-ops/app/start.sh/stop.sh、docs/dev-ops/docker-compose-app.yml - 版本发布:各里程碑配置快照见
docs/tag/v1.0~v3.0
- 镜像地址
quce-studio/*为占位,请按需替换为自己的镜像仓库。