Files
xk-docs/docs/guide/architecture.md
2026-07-08 15:04:42 +08:00

200 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 系统架构
## 整体架构
```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 | 服务器 | 消息队列 |