Files
chisup/docs/current-state.md
2026-07-05 11:39:28 +08:00

89 lines
6.5 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.
# 当前实现状态
> 本文是可覆盖的当前快照,记录代码与任务看板的现实状态。历史执行流水追加到 [../progress.md](../progress.md)。
## 当前快照
- 日期:2026-07-05
- 阶段:MVP 起步 / Phase 1 CHIS 登录与会话验证推进中
- 技术栈:当前系统 Python 3.8、Flask 3.0.3 application factory、pytest 8.3.5、requests[socks] 2.32.4、gmssl 3.2.2、redis-py 3.5.3;不创建虚拟环境
- 生产代码:`app/__init__.py`、`app/api/health.py`、`app/config.py`、`run.py`、`app/chis/auth.py`、`app/chis/crypto.py`、`app/chis/session_store.py`,以及 `app/middleware/`、`app/services/`、`app/mappers/`、`app/chis/`、`app/repositories/`、`app/validators/` 包目录;`ChisLoginClient` 已支持登录和 `getLanderInfo` 会话验证,`RedisChisSessionStore` 已支持会话缓存读写和过期清理
- 测试:`tests/test_app_factory.py`、`tests/test_config_and_structure.py`、`tests/test_project_setup.py`、`tests/test_chis_auth.py`、`tests/test_chis_session_store.py`
- 数据 / 资料:`reverse_file/` 下已有 CHIS HAR、前端脚本和 schema;`D:\hans\chupd\chis\login_client_v2.py` 可作为登录链路参考
- 标准启动路径:`python run.py`
- 标准验证路径:`python -m pytest`
- 当前 blocker:无硬阻塞;用户已新增 T-004,本地 `.env` 自动加载尚未实现;后续仍需接入失效重登策略:会话验证失败时清缓存、重登一次、重试一次
## 当前目录要点
| 路径 | 状态 | 说明 |
| --- | --- | --- |
| `docs/` | 已有 | 项目规范化文档 |
| `reverse_file/` | 已有 | CHIS 逆向资料,当前重要事实来源 |
| `reverse_file/20260704_query_health_check.har` | 已有 | 体检详情只读查询 HAR,包含 `getHMNIListOfHTML` 和 `getCheckInfoDetail` |
| `D:\hans\chupd\chis\login_client_v2.py` | 外部参考 | CHIS 登录、SM2 加密、角色选择、cookie 拼接、`getLanderInfo` 会话验证 |
| `app/` | 已有 | Flask application factory 和 health check API |
| `app/chis/` | 已有 | CHIS integration layer;T-101 已包含登录客户端与 SM2 加密,T-102 已包含 `getLanderInfo` 会话验证,T-103 已包含 Redis 会话缓存 |
| `app/mappers/` | 已有 | 数据转换层包目录 |
| `app/middleware/` | 已有 | 中间件包目录 |
| `app/repositories/` | 已有 | 存储 / 缓存包目录 |
| `app/services/` | 已有 | 应用服务层包目录 |
| `app/validators/` | 已有 | 请求校验包目录 |
| `tests/` | 已有 | pytest 可收集的测试 |
| `pytest.ini` | 已有 | pytest 测试入口配置,限制测试目录为 `tests` |
| `requirements.txt` | 已有 | Python 依赖,固定 `Flask==3.0.3`、`pytest==8.3.5`、`requests[socks]==2.32.4`、`gmssl==3.2.2`、`redis==3.5.3` |
| `.env.example` | 已有 | 环境变量占位示例,不含真实密钥 |
## 任务看板状态
任务状态以 [06-tasks.md](06-tasks.md) 为准。
- 已完成:DOC-001 建立 harness coding 项目文档;DOC-002 更新 CHIS 登录与只读查询验证路线;DOC-003 明确使用系统 Python 3.8;DOC-004 明确 Flask factory 模式;DOC-005 明确日志与请求归档方案;DOC-006 明确 CHIS SOCKS5 代理配置;T-001 初始化 Flask 项目骨架;T-002 建立基础配置与目录;T-003 建立最小测试框架;T-101 迁移 CHIS 登录链路;T-102 接入账号信息查询验证会话;T-103 实现 Redis 会话缓存。详见 [../progress.md](../progress.md)。
- 正在进行:无。
- 下一个可领取任务:T-004 支持本地 `.env` 配置加载。
## 已确认技术事实
- CHIS public key 可通过配置文件或环境变量提供。
- 使用当前系统 Python 3.8 环境,不创建虚拟环境;T-001 创建 `requirements.txt` 固定依赖。
- pytest 8.3.5 已固定到 `requirements.txt`;标准测试命令为 `python -m pytest`。
- requests[socks] 2.32.4 和 gmssl 3.2.2 已固定到 `requirements.txt`,用于 CHIS 登录请求、SOCKS5 代理和 SM2 加密。`redis==3.5.3` 已固定用于 CHIS 会话缓存,并兼容当前系统 Python 环境里的 `django-q` 约束。
- Flask 应用使用 application factory 模式,`app/__init__.py` 暴露 `create_app(config_object=None)`。
- 基础配置通过环境变量读取:`CHIS_BASE_URL`、`CHIS_PUBLIC_KEY`、`CHIS_PROXY`、`REDIS_URL`、`LOG_DIR`、`ARCHIVE_DIR`。
- `CHIS_BASE_URL` 兼容完整地址和旧项目 host 写法;未带 scheme 时按 `http://<host>/chis` 处理。
- CHIS 外呼支持可选 SOCKS5 代理配置:`CHIS_PROXY` 为空直连;有值时后续 CHIS client 对登录、会话验证、查询和保存请求统一走代理。
- `.env.example` 只保留占位符和非敏感默认值,不写真实密钥;当前尚未自动加载真实 `.env` 文件,T-004 将实现本地 `.env` 加载。
- 登录链路已迁移到 `app/chis/auth.py`:`myRoles` -> 选择 `责任医生助理` / `责任医生` -> `myApps` -> 提取 `JSESSIONID` -> 拼接 cookie。
- SM2 加密已迁移到 `app/chis/crypto.py`,兼容 `hans_chis.sm2.sm2_encrypt`:`gmssl.sm2.CryptSM2(mode=0)`,返回带 `04` 前缀密文。
- 会话验证已接入 `ChisLoginClient.get_lander_info(cookie)`,请求 `chis.myPageService / getLanderInfo`;CHIS 非 200 业务码会抛出 `chis_session_invalid`。Redis 会话缓存已接入 `RedisChisSessionStore`,会话对象包含 `base_url`、`uid`、`role_id`、`manage_unit`、`cookies`、`login_at`、`expires_at`、`last_validated_at`,过期会话读取时自动删除。
- 体检详情查询第一版可用 `healthCheck + phrId + idCard` 调 `getHMNIListOfHTML`,用 `idCard + checkDate` 调 `getCheckInfoDetail`。
- 当前不能证明只传 `healthCheck` 就能查完整详情。
- 运行日志保存到 `logs/`,每天一个综合日志文件,保留 1 年。
- 每个 API 请求保存一个 `archives/` JSON 归档文件,包含完整 API 和 CHIS 请求 / 响应,archive 不脱敏,仅用于内网前置机本地受控排查。
## 当前可运行内容
```powershell
python -m pip install -r requirements.txt
python -m pytest
python run.py
```
## 开始编码前检查
1. 读 [../AGENTS.md](../AGENTS.md)。
2. 读 [00-ai-start-here.md](00-ai-start-here.md)。
3. 读 [05-coding-rules.md](05-coding-rules.md)。
4. 从 [06-tasks.md](06-tasks.md) 领取第一个 `TODO` 且依赖均完成的任务。
5. 将该任务状态改为 `DOING` 后再改代码。
## 维护规则
当实际代码状态发生变化时,同步更新本文件:
- 新增或移动入口文件。
- 初始化框架或模块。
- 任务从 `TODO` 进入 `DOING` 或 `DONE`。
- 新增可运行命令。
- 发现文档和代码现实不一致。