Files
xk-docs/docs/projects/xk-api/design.md
2026-07-08 15:04:42 +08:00

3.6 KiB
Raw Blame History

xk-api 设计思路

架构决策

双数据库策略

系统同时使用两个 MySQL 数据库z_xk 和 z_o_xk这是因为

  1. 历史迁移:旧系统基于 Yii2新系统基于 Laravel数据逐步迁移
  2. 业务连续性:迁移期间需要两套系统并行运行
  3. 表规模:旧库约 100 张表,新库 67 张表,完全迁移风险太大

::: warning 跨库约束

  • 不允许跨库 JOIN
  • 需要跨库关联时使用两步查询
  • 定时任务中需要特别注意数据一致性 :::

模型分层

Models/
├── old/          # 旧模型Yii表z_o_xk库
│   ├── config/   # 配置类
│   ├── doctor/   # 医生类
│   ├── drug/     # 药品类
│   ├── order/    # 订单类
│   ├── ...
└── new/          # 新模型xk表z_xk库
    ├── admin/    # 管理后台
    ├── finance/  # 财务
    ├── salesperson/ # 销售
    └── ...

服务层设计

服务层按业务域组织,避免上帝服务:

Service/
├── common/           # 公共服务(支付、短信、文件等)
│   ├── http/         # 外部 HTTP 客户端
│   ├── hy/           # 监管平台组件
│   ├── mes/          # MES 对接组件
│   └── sms/          # 短信服务
├── admin/            # 管理后台服务
│   ├── system/       # 系统管理
│   ├── business/     # 业务逻辑
│   ├── finance/      # 财务
│   ├── salesperson/  # 销售
│   └── hy/           # 监管
├── mobile/           # 移动端服务
│   ├── consultation/ # 问诊
│   ├── prescription/ # 处方
│   └── ...
├── DoctorWx/         # 医生微信端
├── ClinicAdminWx/    # 门店管理微信端
└── callback/         # 回调处理

中间件设计

每种客户端角色有独立的认证中间件:

  • 管理后台: AuthMiddleware (JWT)
  • 患者端: MobileAuthMiddleware (Mobile JWT)
  • 医生端: DoctorWxUnifiedAuthMiddleware (统一角色解析)
  • 监管接口: HyTransitApiMiddleware (Token 验证)

队列设计

使用 RabbitMQ 处理异步任务:

  • 支付回调 → 分账结算 Job
  • 退款回调 → 佣金冲销 Job
  • 定时任务 → 补算、同步 Job
  • 超时处理 → 自动取消、自动确认收货

多端路由分离

通过独立路由文件区分不同端的接口:

  • admin.php — 管理后台
  • mobile.php — 患者小程序
  • doctor.php — 医生端(含 8 种角色路由组)
  • hy.php — 监管接口
  • callback.php — 支付回调

技术选型

决策 选择 理由
框架 Laravel 12 PHP 生态最成熟,团队熟悉
认证 Sanctum + JWT 多端支持API 灵活
队列 RabbitMQ 可靠性高,支持延迟队列
缓存 Redis 高性能,支持分布式锁
文件 阿里云 OSS 国内访问快,成本低
支付 微信 + 易票联 双支付通道,覆盖主要场景
Excel Maatwebsite + PHPSpreadsheet 复杂报表需求

扩展性考虑

新增 API 端

  1. 创建新的路由文件
  2. 创建对应的认证中间件
  3. bootstrap/app.php 中注册

新增业务模块

  1. app/Http/Controllers/ 下创建控制器
  2. app/Service/ 下创建服务类
  3. app/Models/ 下创建模型(区分 new/old
  4. routes/ 对应文件中注册路由

新增定时任务

  1. app/Console/Commands/ 下创建命令类
  2. routes/console.php 中注册调度
  3. 更新 定时任务命令表.md