Add a second-level project management directory to match the requested navigation hierarchy. Preserve page permissions and legacy URLs, and migrate existing role grants to include the new ancestor. User will validate after integration.
中科兴皖后端
Python 3.9 + FastAPI + SQLAlchemy + Pydantic v2。共享 MySQL 5.7、Redis、MinIO,提供认证、权限、市场协议、存储、生产、质检、中试及 OA 等 API。
结构
app/main.py:应用入口、路由与中间件注册。app/api/:接口;app/schemas/:请求与响应结构(部分旧模块在 API 中定义)。app/services/:业务服务与两套现有流程引擎;app/crud/:数据操作。app/models/:模型;app/core/:认证、配置、数据库与权限。app/tasks/:定时任务;tests/:回归测试;scripts/:检查及一次性运维工具。
规则见 AGENTS,工程关系见根 README。依赖包含 Alembic,但仓库目前没有可直接运行的 Alembic 迁移目录,不能据此假定可执行 alembic upgrade head。
准备环境
以下命令从 backend/ 执行。已有环境无需重复创建或覆盖配置。
python3.9 -m venv venv
venv/bin/python -m pip install -r requirements.txt
venv/bin/python -m pip check
首次配置时复制 .env.example 为 .env,按团队提供的本地环境填写。默认读取 backend/.env;其他环境通过 ENV_FILE 指定。不要提交实际凭据或把测试环境指向生产数据。
虚拟环境由每台机器重建,不纳入 Git。测试工具不是运行依赖;需要 pytest 时安装到开发虚拟环境,再从本目录执行,例如 venv/bin/python -m pytest tests/test_child_row_sync.py。完整测试集需先确认配置及隔离数据环境。
服务命令(由用户执行)
| 环境 | 命令入口 | 默认监听/配置 |
|---|---|---|
| 本地 | ./start.sh --host 127.0.0.1 --port 8000 --reload |
.env,脚本默认 host 原为 0.0.0.0,此处显式绑定本机 |
| 生产 | ./start-prod.sh start |
0.0.0.0:8111、.env.production、venv/ |
| 测试 | ./start-test.sh start |
127.0.0.1:10002、.env.test、.venv/ |
生产/测试脚本另支持 status、stop、restart、logs。Agent 不自行启停或重启服务。不存在 start-local.sh;旧测试端口 8112 不能代替当前脚本默认值。
API 与数据
默认前缀 /api;Web 管理接口主要为 /api/web/...,移动接口主要为 /api/mini/...。公共登录路径以 app/api/public.py 为准。JWT、RSA 登录加密、API 加密和审计由现有中间件与配置控制。
/health 是健康检查;/docs、/redoc 仅在 DEBUG 启用时提供。
SQL 位于 docs/sql。当前初始化基线不完整,部分历史迁移缺失;尚未验证从空库部署。不能直接向现有业务库导入根目录备份或运行清库、重置密码、导入脚本作为验证。
检查
- 运行受影响测试;测试数量随代码变化,不把旧报告视为当前通过证明。
- CRUD 修改从根目录运行
python backend/scripts/check_field_consistency.py,同时人工核对新增或未注册实体;已知覆盖限制见字段一致性指南。 scripts/中的 migration、seed、reset、clear、import 工具可能写库,先读用途和数据范围,不批量执行。
项目归属启用
项目组的区域、医院仅作资料记录;不参与细胞存储和科研捐赠的业务地点、权限校验。
切换到项目统计版本前,先在已授权数据库执行增量结构脚本
2026-11-02-project_management.sql,
再依次执行菜单种子与
项目一级菜单迁移,
再执行全部项目权限种子,
最后执行项目管理分组迁移。
已执行前四个脚本的数据库只需追加分组迁移;完整重跑时也须将分组迁移放在最后。
“项目”与“市场、生产、质检”平级,下设“项目管理”目录,其下包含项目组管理、项目管理、业务统计、历史归属维护。
分组迁移保留四个页面的 ID 和权限,仅为已授权子页面/编辑按钮的角色补齐祖先;
旧 /project/{页面} 和 /market/project-management/{页面} 地址跳转至 /project/management/{页面}。
菜单种子不会给角色新增业务权限,应在现有角色管理分配项目管理权限及祖先菜单;
一级菜单迁移保留已有叶子 ID/授权,仅给已授权项目子菜单的角色补齐新祖先。
“所属项目”默认只列出本人担任负责人或成员的项目组内项目(多组取并集)。
需要跨组选择时,在“系统管理 → 角色管理 → 菜单权限 → 项目 → 全部项目”显式授予
project:project:all;多角色与职位继承权限取有效角色并集。已有归属维护权限、普通管理员身份不会自动获得该权限。
超级管理员沿用系统全部权限语义,但所有候选仍限当前租户。新建仅列启用且支持该业务的项目;
历史筛选叠加原订单数据权限,可保留组内停用项目。全部项目权限不授予订单查看、项目资料编辑或归属维护权限。
授权配置入口同时加固:用户、角色、职位和菜单变更分别需要已有的 system:user:list、
system:role:list、system:post:list、system:menu:list 权限(超级管理员保留全权限),
避免普通业务管理员自行绑定角色或修改权限码。质检金额专用角色授权的三个写入口也校验
biz:qcMaterialAmountAuth:list,防止经专用角色绕过上述限制。配置保存校验当前租户,角色菜单自动补齐祖先,
不自动勾选其他功能。升级前应核对实际配置人员已获对应系统管理权限。
脚本不回填历史业务,不代表空库初始化;执行前备份并在隔离 MySQL 环境验证。
PROJECT_ASSIGNMENT_REQUIRED 默认 false,便于先配置项目组和项目、兼容历史客户端。
人员和启用项目配置齐全后由运维将其设为 true;新建预签约及四类正式业务必须选择项目。
普通编辑保留历史归属,历史补录/调整须通过归属维护并填写原因;受控业务转换继承原归属。
该开关同时返回给 Web 和移动表单,调整配置后的服务重启由用户执行。