Files
xk-docs/docs/guide/architecture.md

200 lines
5.0 KiB
Markdown
Raw Normal View History

2026-07-08 15:04:42 +08:00
# 系统架构
## 整体架构
```mermaid
graph TB
subgraph 客户端
U[患者小程序<br/>xk-client-wx]
D[医生小程序<br/>xk-doctor-wx]
A[管理后台<br/>xk-admin]
S[数据大屏<br/>xk-data]
end
subgraph API层
API[xk-api<br/>Laravel 12]
YII[xk-api-yii<br/>Yii2 遗留]
end
subgraph 数据层
DB1[(z_xk<br/>新库)]
DB2[(z_o_xk<br/>旧库)]
RD[(Redis)]
MQ[(RabbitMQ)]
OSS[(阿里云 OSS)]
end
subgraph 外部集成
PAY1[微信支付]
PAY2[易票联支付]
SMS[短信服务]
HY[xk-hy-forward-go<br/>Go 转发]
GOV[浙江省政务云<br/>监管平台]
MES[和利康 MES<br/>中药智造]
ERP[ERP 系统]
KUAI100[快递100]
end
U --> API
D --> API
A --> API
S --> API
API --> DB1
API --> DB2
API --> RD
API --> MQ
API --> OSS
API --> PAY1
API --> PAY2
API --> SMS
API --> HY
API --> MES
API --> ERP
API --> KUAI100
HY --> GOV
```
## 双数据库策略
系统同时连接两个 MySQL 数据库:
```mermaid
graph LR
subgraph z_xk 新库 67张表
A1[管理后台 xk_admin]
A2[财务 xk_account_*]
A3[销售 xk_salesperson_*]
A4[处方 xk_special_prescription*]
A5[监管 xk_hy_transit_*]
A6[系统配置 xk_system_config]
end
subgraph z_o_xk 旧库 约100张表
B1[药品 yii_drug]
B2[订单 yii_product_order]
B3[处方 yii_prescription]
B4[用户 yii_user]
B5[门店 yii_store]
B6[医生 yii_doctor_info]
B7[挂号 yii_register]
end
API[xk-api] -->|读写| A1
API -->|读写| A2
API -->|读写| A3
API -->|读写| B1
API -->|读写| B2
API -->|读写| B3
```
::: warning 跨库注意事项
- 新库和旧库之间**不允许 JOIN 查询**
- 跨库关联需要在应用层做两步查询
- 定时任务 `app:accrue-salesperson-commission` 需要同时查两个库
:::
## API 路由架构
xk-api 通过路由文件划分不同端的接口:
| 路由文件 | 前缀 | 用途 | 认证方式 |
|----------|------|------|----------|
| `admin.php` | `/api/admin` | 管理后台 API | JWT (AdminAuthMiddleware) |
| `mobile.php` | `/api/mobile` | 患者小程序 API | JWT (MobileAuthMiddleware) |
| `doctor.php` | `/api/doctor` | 医生端小程序 API | 多种角色中间件 |
| `hy.php` | `/api/hy` | 互联网医院监管 API | HyTransitApiMiddleware |
| `callback.php` | `/api/callback` | 支付回调 | 签名验证 |
| `open-api.php` | `/api/open` | 开放 API | 无/简单认证 |
## 中间件链
```mermaid
graph LR
REQ[请求] --> CORS[CORS]
CORS --> THROTTLE[限流]
THROTTLE --> AUTH{认证中间件}
AUTH -->|Admin| JWT[JWT验证]
AUTH -->|Mobile| MJWT[Mobile JWT]
AUTH -->|Doctor| DROLE[角色验证]
AUTH -->|Hy| HTOKEN[Hy Transit Token]
JWT --> LOG[操作日志]
MJWT --> LOG
DROLE --> LOG
HTOKEN --> LOG
LOG --> CTRL[Controller]
```
## 消息队列架构
```mermaid
graph TB
subgraph 生产者
P1[订单支付回调]
P2[挂号支付回调]
P3[退款回调]
P4[定时任务]
end
subgraph RabbitMQ
Q1[default 队列]
Q2[failed_jobs]
end
subgraph 消费者 Job
J1[ProductOrderPaidJob<br/>分账结算]
J2[RegisterPaidJob<br/>挂号分账]
J3[ProductOrderRefundJob<br/>退款处理]
J4[SalespersonCommissionRefundJob<br/>佣金冲销]
J5[AutoConfirmReceiptOrderJob<br/>自动确认收货]
J6[AutomaticallyCancelTheOrderJob<br/>自动取消订单]
J7[AutoExpirePrescriptionHandlerJob<br/>处方过期处理]
J8[SyncDrugPriceBySubscribeJob<br/>药品价格同步]
end
P1 --> Q1
P2 --> Q1
P3 --> Q1
P4 --> Q1
Q1 --> J1
Q1 --> J2
Q1 --> J3
Q1 --> J4
Q1 --> J5
Q1 --> J6
Q1 --> J7
Q1 --> J8
```
## 监管数据流转
```mermaid
sequenceDiagram
participant API as xk-api
participant GO as xk-hy-forward-go
participant GOV as 浙江省政务云
Note over API: 定时触发 / 手动拉取
API->>API: 1. 创建批次 (batch/create)
API->>API: 2. 拉取数据 (supervise/consult, /recipe, ...)
API->>API: 3. 加密打包数据
API->>GO: 4. 转发加密数据
GO->>GOV: 5. 透传至政务云
GOV-->>GO: 6. 返回处理结果
GO-->>API: 7. 回调结果
API->>API: 8. 更新批次状态
```
## 部署架构
| 服务 | 部署方式 | 说明 |
|------|----------|------|
| xk-api | 服务器 + LaravelS | PHP-FPM + LaravelS 常驻进程 |
| xk-admin | CDN / Nginx | 静态资源部署 |
| xk-client-wx | 微信小程序平台 | HBuilderX 上传 |
| xk-doctor-wx | 微信小程序平台 | HBuilderX 上传 |
| xk-data | 服务器 / CDN | 静态页面 |
| xk-hy-forward-go | 内网服务器 | Windows 部署run.bat 启动 |
| MySQL | 服务器 | 双库部署 |
| Redis | 服务器 | 缓存 / 队列 |
| RabbitMQ | 服务器 | 消息队列 |