简介
本开发文档围绕 DouPHP 促销营销系统的优惠券、分销、会员等级与分享推广四大模块,系统化梳理业务规则、数据流转、实现要点与扩展方式。面向电商运营与开发者,提供从活动配置到效果追踪的完整参考,帮助快速搭建限时折扣、满减优惠、团购等营销场景,并给出数据统计与用户行为追踪的技术建议。
项目结构
营销相关代码采用“核心服务 + 前后端控制器/路由 + 模型/服务 + 视图/样式”的分层组织:
- 核心服务:统一封装优惠券计算、资格判定、VIP状态、订单联动升级等通用逻辑
- 后台管理:提供营销活动配置、审核、统计与导出能力
- 前台展示:面向用户的领券、使用、分享申请与记录查看
- 视图与样式:模板与主题样式负责呈现
graph TB
subgraph "核心服务"
CS["CouponService<br/>优惠券服务"]
CE["CouponEligibility<br/>优惠券资格判定"]
VS["VipStatus<br/>VIP状态"]
end
subgraph "后台管理"
AR["Admin Route<br/>coupon.php"]
AV["Admin View<br/>coupon.htm / order.htm"]
DS["DistributionService<br/>分销服务"]
SS["ShareService(后台)<br/>分享审核"]
end
subgraph "前台"
FS["ShareService(前台)<br/>分享提交"]
end
subgraph "订单与支付"
OT["OrderStatusTransition<br/>订单状态变更"]
end
CS --> AR
CE --> CS
VS --> FS
AR --> AV
DS --> OT
SS --> DS
FS --> SS
OT --> DS
图表来源
- admin/route/coupon.php:29-39
- admin/view/coupon.htm:29-52
- core/service/coupon/CouponService.php:31-71
- _'/module/coupon/core/service/coupon/CouponEligibility.php:52-78
- _'/module/distribution/admin/service/distribution/DistributionService.php:66-135
- _'/module/share/admin/service/share/ShareService.php:99-156
- _'/module/share/front/service/share/ShareService.php:50-76
- _'/module/order/core/service/order/OrderStatusTransition.php:241-276
章节来源
- admin/route/coupon.php:29-39
- core/service/coupon/CouponService.php:31-71
- _'/module/coupon/core/service/coupon/CouponEligibility.php:52-78
- _'/module/distribution/admin/service/distribution/DistributionService.php:66-135
- _'/module/share/admin/service/share/ShareService.php:99-156
- _'/module/share/front/service/share/ShareService.php:50-76
- _'/module/order/core/service/order/OrderStatusTransition.php:241-276
核心组件
- 优惠券服务:提供券列表、用户券列表、券详情、折扣计算、过期判断、唯一码生成等能力
- 优惠券资格判定:基于范围(全量/模块/分类/商品)、首单限制、有效期与门槛金额,判定购物车是否可用并计算生效金额
- VIP 状态:根据起止时间判定生效中/已过期/无记录,用于前端展示与续费提示
- 分销服务:申请审核、佣金明细查询、等级关联与日志记录
- 分享推广:前台提交分享申请与附件认领,后台审核发放积分奖励
- 订单联动:付款后触发积分与分销奖励,并在事务保护下避免重复发放;随后检查会员等级与分销等级升级
章节来源
- core/service/coupon/CouponService.php:111-164
- _'/module/coupon/core/service/coupon/CouponEligibility.php:52-78
- core/foundation/vip/VipStatus.php:32-61
- _'/module/distribution/admin/service/distribution/DistributionService.php:189-293
- _'/module/share/admin/service/share/ShareService.php:191-224
- _'/module/order/core/service/order/OrderStatusTransition.php:241-276
架构总览
营销链路贯穿“活动配置 → 用户参与 → 结算核销 → 奖励发放 → 等级升级 → 数据沉淀”。
sequenceDiagram
participant U as "用户"
participant F as "前台分享服务"
participant A as "后台分享服务"
participant C as "优惠券服务"
participant O as "订单状态变更"
participant D as "分销服务"
participant V as "VIP状态"
U->>F : 提交分享申请
F->>A : 创建分享记录并认领附件
A-->>U : 待审核
U->>C : 领取/使用优惠券
C-->>U : 返回折扣结果
U->>O : 下单支付
O->>D : 发放分销奖励事务+行锁
O->>V : 检查VIP状态
O->>D : 检查分销等级升级
D-->>U : 佣金到账/等级提升
图表来源
- _'/module/share/front/service/share/ShareService.php:50-76
- _'/module/share/admin/service/share/ShareService.php:191-224
- core/service/coupon/CouponService.php:111-164
- _'/module/order/core/service/order/OrderStatusTransition.php:241-276
- core/foundation/vip/VipStatus.php:32-61
详细组件分析
优惠券系统
- 发放与展示:后台可维护券信息,前台按有效期与状态列出可领券;用户券列表过滤未过期券
- 使用规则:支持满减与折扣两种类型;支持最大折扣上限;需满足门槛金额且处于有效期内
- 资格判定:支持全量/模块/分类/商品范围;支持首单限制;计算“生效范围内金额”并与门槛比较
- 订单结算:订单视图汇总显示使用的优惠券及减免金额
flowchart TD
Start(["开始"]) --> CheckTime["校验有效期"]
CheckTime --> |无效| EndNo["不可用"]
CheckTime --> |有效| Scope["计算生效范围内金额"]
Scope --> FirstOnly{"是否首单限制?"}
FirstOnly --> |是| CheckFirst["检查是否已有已支付/完成订单"]
FirstOnly --> |否| Threshold["门槛金额比较"]
CheckFirst --> |非首单| EndNo
CheckFirst --> |首单| Threshold
Threshold --> |不满足| EndNo
Threshold --> |满足| Calc["计算折扣/满减"]
Calc --> EndYes["返回折扣结果"]
图表来源
- _'/module/coupon/core/service/coupon/CouponEligibility.php:52-78
- core/service/coupon/CouponService.php:111-164
- admin/view/order.htm:152-167
章节来源
- core/service/coupon/CouponService.php:31-71
- core/service/coupon/CouponService.php:111-164
- _'/module/coupon/core/service/coupon/CouponEligibility.php:52-78
- admin/view/order.htm:152-167
分销机制
- 申请与审核:后台分页查询申请、查看资料、设置等级并记录处理时间与说明
- 佣金明细:支持按收益人、来源人、时间范围筛选,展示直推/间推奖励
- 等级迁移:历史字段下线与新增字段回填,确保等级与百分比配置一致
- 订单联动:付款后在事务内发放分销奖励,防止并发重复;随后检查分销等级升级
sequenceDiagram
participant Admin as "管理员"
participant DS as "分销服务"
participant DB as "数据库"
participant OT as "订单状态变更"
Admin->>DS : 审核申请设置等级/备注
DS->>DB : 更新申请状态与等级
OT->>DS : 付款后发放佣金行锁保护
DS-->>OT : 写入佣金记录
OT->>DS : 检查分销等级升级
DS-->>OT : 完成升级或跳过
图表来源
- _'/module/distribution/admin/service/distribution/DistributionService.php:66-135
- _'/module/distribution/admin/service/distribution/DistributionService.php:189-293
- _'/module/distribution/_update/data/upgrade.php:67-94
- _'/module/order/core/service/order/OrderStatusTransition.php:241-276
章节来源
- _'/module/distribution/admin/service/distribution/DistributionService.php:66-135
- _'/module/distribution/admin/service/distribution/DistributionService.php:189-293
- _'/module/distribution/_update/data/upgrade.php:67-94
- _'/module/order/core/service/order/OrderStatusTransition.php:241-276
会员等级与VIP
- VIP 套餐与购买:前台展示套餐、价格与内容;购买记录分页展示,包含订单号与状态
- VIP 状态:依据起止时间判定 ACTIVE/EXPIRED/NONE,用于界面徽章与续费提示
- 等级名称与折扣:通过用户等级查询当前等级与商品折扣,支撑会员权益
classDiagram
class VipStatus {
+ACTIVE
+EXPIRED
+NONE
+classify(startTime, endTime, now) string
+all() array
+badgeClass(status) string
}
class VipService {
+buildVipPackageListData() array
+buildVipLogListData(userId, page, pageUrl) array
}
VipService --> VipStatus : "使用状态判定"
图表来源
- core/foundation/vip/VipStatus.php:32-61
- front/service/vip/VipService.php:37-55
- front/service/vip/VipService.php:65-101
章节来源
- front/service/vip/VipService.php:37-55
- front/service/vip/VipService.php:65-101
- core/foundation/vip/VipStatus.php:32-61
分享推广
- 前台提交:生成唯一分享编号,创建分享记录(待审核),将草稿附件认领至真实主键
- 后台审核:分页查询分享记录,查看图片与处理记录,审核后发放积分奖励(可配置)
- 用户侧查看:展示个人分享记录、处理状态与积分获取情况
sequenceDiagram
participant User as "用户"
participant FS as "前台分享服务"
participant AS as "后台分享服务"
participant W as "钱包服务"
User->>FS : 提交分享申请含草稿令牌
FS->>FS : 创建分享记录与唯一编号
FS->>AS : 认领附件到真实ID
AS-->>User : 待审核
User->>AS : 等待审核
AS->>W : 审核通过后发放积分
W-->>AS : 积分入账
AS-->>User : 审核完成
图表来源
- _'/module/share/front/service/share/ShareService.php:50-76
- _'/module/share/admin/service/share/ShareService.php:191-224
章节来源
- _'/module/share/front/service/share/ShareService.php:50-76
- _'/module/share/admin/service/share/ShareService.php:99-156
- _'/module/share/admin/service/share/ShareService.php:191-224
促销活动配置与结算
- 限时折扣:通过优惠券类型“百分比”与最大折扣上限控制
- 满减优惠:通过优惠券类型“金额”与门槛金额控制
- 团购活动:可在购物车范围中限定模块/分类/商品,结合首单限制实现特定人群/商品的团购价
- 订单结算:订单视图汇总展示优惠券减免明细与最终应付金额
章节来源
- core/service/coupon/CouponService.php:111-164
- _'/module/coupon/core/service/coupon/CouponEligibility.php:87-126
- admin/view/order.htm:152-167
依赖关系分析
- 优惠券服务依赖数据库表 coupon、coupon_log,以及配置项 price_decimal
- 资格判定依赖订单表以判断首单,依赖 scope_type/scope_value 解析范围
- 分销服务依赖 user_level、distribution_level、money 表,以及升级日志表
- 订单状态变更依赖钱包服务进行积分发放,依赖分销服务进行佣金发放与等级升级
- VIP 状态由基础枚举类提供,供前台与服务层复用
graph LR
CouponService --> DB["coupon / coupon_log"]
CouponEligibility --> Order["order"]
DistributionService --> Money["money"]
DistributionService --> Level["user_level / distribution_level"]
OrderStatusTransition --> Wallet["钱包服务"]
OrderStatusTransition --> DistributionService
VipStatus --> Front["前台展示"]
图表来源
- core/service/coupon/CouponService.php:111-164
- _'/module/coupon/core/service/coupon/CouponEligibility.php:148-165
- _'/module/distribution/admin/service/distribution/DistributionService.php:189-293
- _'/module/order/core/service/order/OrderStatusTransition.php:241-276
- core/foundation/vip/VipStatus.php:32-61
章节来源
- core/service/coupon/CouponService.php:111-164
- _'/module/coupon/core/service/coupon/CouponEligibility.php:148-165
- _'/module/distribution/admin/service/distribution/DistributionService.php:189-293
- _'/module/order/core/service/order/OrderStatusTransition.php:241-276
- core/foundation/vip/VipStatus.php:32-61
性能考虑
- 优惠券折扣计算:优先使用数据库条件过滤有效期与状态,减少应用层循环;对百分比折扣与最大折扣上限进行数值格式化,避免精度问题
- 资格判定:范围匹配使用 JSON 数组解码与 in_array 判断,注意 scope_value 为空时的降级处理
- 分销奖励发放:使用事务与 FOR UPDATE 行锁保证幂等,避免回调与重跑导致的重复发放
- 分页与索引:后台列表均使用分页,建议在常用筛选字段(如 created_at、user_id、from_user_id)建立索引以提升查询性能
- 资源加载:优惠券列表样式使用主题 CSS,注意移动端适配与渲染性能
故障排查指南
- 优惠券不可用:检查有效期、状态、门槛金额与范围命中;确认用户是否已领取且未过期
- 优惠券重复使用:核对 coupon_log 中是否存在该用户与券的记录;确认 discount 流程中的存在性检查
- 分销奖励未到账:检查订单状态变更事务是否成功;确认 money 表中 action 为直推/间推的记录;查看升级日志
- 分享审核失败:确认附件认领是否成功;检查后台审核流程与参数白名单;查看处理记录
- VIP 状态异常:核对 start_at/end_at 时间戳;使用 VipStatus 工具方法重新判定
章节来源
- core/service/coupon/CouponService.php:111-164
- _'/module/order/core/service/order/OrderStatusTransition.php:241-276
- _'/module/share/admin/service/share/ShareService.php:191-224
- core/foundation/vip/VipStatus.php:32-61
结论
DouPHP 促销营销系统通过清晰的服务分层与严谨的事务保护,实现了优惠券、分销、VIP 与分享推广的闭环。开发者可基于现有服务快速扩展新的营销场景(如团购、限时折扣、满减),并通过后台管理与订单联动完成效果追踪与数据分析。建议在生产环境完善索引、监控与日志,保障高并发下的稳定性与准确性。
附录
- 开发示例(路径指引)
- 创建营销活动:参考后台路由与视图,配置优惠券名称、类型、面额、门槛、有效期与状态
- admin/route/coupon.php:29-39
- admin/view/coupon.htm:29-52
- 设置促销规则:在资格判定中配置范围与首单限制,结合订单结算展示
- _'/module/coupon/core/service/coupon/CouponEligibility.php:52-78
- core/service/coupon/CouponService.php:111-164
- 追踪营销效果:通过分销佣金明细与分享记录统计活动转化
- _'/module/distribution/admin/service/distribution/DistributionService.php:189-293
- _'/module/share/admin/service/share/ShareService.php:99-156
- 用户行为追踪:结合订单视图中的优惠券使用明细与 VIP 购买记录
- admin/view/order.htm:152-167
- front/service/vip/VipService.php:65-101
- 创建营销活动:参考后台路由与视图,配置优惠券名称、类型、面额、门槛、有效期与状态
章节来源
- admin/route/coupon.php:29-39
- admin/view/coupon.htm:29-52
- _'/module/coupon/core/service/coupon/CouponEligibility.php:52-78
- core/service/coupon/CouponService.php:111-164
- _'/module/distribution/admin/service/distribution/DistributionService.php:189-293
- _'/module/share/admin/service/share/ShareService.php:99-156
- admin/view/order.htm:152-167
- front/service/vip/VipService.php:65-101