feat(后端): 添加授权体系、系统监控与试用期计提
按 2026-11-02 需求补齐计划交付后端能力: - 角色授权:权限目录化,接口统一准入校验,未登记默认拒绝; 管理员判断改为按数据库角色重新判定,防止权限码持有者绕过 - 系统监控:单进程采集资源、请求与异常指标,分钟级聚合, 阈值配置化;敏感配置增加 repr 保护,Redis 密码 URL 转义 - 试用期计提:按回款日判定并写入快照,年度结清与调整单联动; 人员模型补试用期、离职日期与工资版本历史字段 - 计提模板:公式骨架受控,页面维护名称与参数绑定 - T+ 采集:自动化配置表与进度查询 内置角色禁停用保护对齐模块注释;核算规则版本提为常量并 补充批量核算失败堆栈日志。 影响范围:后端全部模块、数据库迁移 V22-V28 验证:uv run ruff check 通过;922 个单元测试全部通过; 集成测试因本机 MySQL 数据卷被其他容器锁定暂未运行
这个提交包含在:
1 父节点
02fb06e0af
当前提交
1461a8d113
149 个文件已更改
+8736
-368
没有与搜索条件相匹配的文件
@@ -1,5 +1,55 @@
|
||||
# 后端测试
|
||||
|
||||
|
||||
## 角色授权与工资权限(2026-11-02)
|
||||
|
||||
- `tests/unit/test_authorization.py`:验证角色并集、查看依赖、多角色合并、即时撤权、管理员固定权限、旧个人覆盖拒绝、旧全局绑定不影响工资判定和已生成月份锁。
|
||||
- `tests/integration/test_authorization.py`:隔离 MySQL 覆盖角色创建/授权、用户分配、旧会话即时生效、授权版本冲突、并发分配、排队任务撤权、工资角色免绑定和元数据脱敏。
|
||||
- 最终复核:完整单元 916 项通过;隔离定点授权、结构同步与工资准入 41 项通过。V26 本地迁移前已备份,迁移后核验旧入口停用、全局制作人引用为空、个人覆盖为 0。
|
||||
|
||||
## 人员经理候选与产品体验回归(2026-11-02)
|
||||
|
||||
- `test_requirement_completion.py` 与 `test_authorization_policy.py` 相关单元 13 项通过;`test_personnel.py` 与 `test_requirement_completion.py` 隔离 MySQL 集成 29 项通过。
|
||||
- 新增经理候选测试:普通在职岗位不能新选、经理参照只返回最小字段、经理转岗后旧参考可保留但不能新增引用。已有成功夹具使用真正经理岗位,未放宽校验或跳过用例。
|
||||
- Ruff、前端类型/构建及 6 项本地真实接口浏览器检查通过;单元和集成日志 `.ai/product-personnel-*.log`,页面结果 `.ai/product-personnel-browser/result.json`。类型检查遇到本机 Node 分配失败后,以较小年轻代配置重跑通过,未降低标准。
|
||||
- 用户明确要求的本地演示数据通过真实 API 新增并审计,清单 `.ai/product-demo-manifest.json`;未用集成清理夹具操作原开发库,也未核算或生成工资。
|
||||
|
||||
## 新增免填原因与确认框宽度(2026-11-02,当前行为)
|
||||
|
||||
- 用户要求新增不填写修改原因:创建请求可省略 `reason`,后台审计自动写入“创建角色并配置初始权限”,包含初始权限明细;修改既有权限仍要求原因。
|
||||
- 相关单元 31 项、隔离 MySQL 初始授权 6 项通过,含自动审计及事务回滚。前端类型/构建、Ruff 通过;8 项真实浏览器检查通过,确认框在 2560/1440/768/375/320 宽度居中并保留默认最大宽度,新增无需原因可保存,修改保护继续生效。
|
||||
- 证据 `.ai/role-create-no-reason-integration.log`、`.ai/role-create-no-reason/result.json`。下方上一轮“初始原因必填”仅是历史记录,已由本条更新。
|
||||
|
||||
## 新建角色同时授权与遮罩关闭修复(2026-11-02)
|
||||
|
||||
- `tests/unit/test_role_schemas.py tests/unit/test_authorization.py`:31 项通过,覆盖兼容旧创建载荷、初始权限原因必填及统一授权规则。
|
||||
- `tests/integration/test_role_management.py tests/integration/test_authorization.py`:31 项隔离 MySQL 回归通过,覆盖创建即授权、绑定后旧令牌生效、未知/重复/管理员专用/缺查看权限拒绝,以及权限写入失败时角色和授权版本一起回滚。
|
||||
- 前端类型、生产构建和相关 Ruff 通过;开发模式及固定生产构建分别完成 6 项无模拟接口浏览器检查,验证灰色遮罩关闭、未保存提醒、同页创建与权限落库、失败保留输入、768 宽度。
|
||||
- 日志 `.ai/role-create-permissions-integration.log`;页面结果 `.ai/role-create-ui-dev/result.json`、`.ai/role-create-ui/result.json`。不改写上一轮全量测试数量,不操作生产或真实业务账号。
|
||||
|
||||
## 角色授权切换回归(2026-11-02)
|
||||
|
||||
- 按用户后续选择切换为“角色配置权限 → 用户分配角色”,取消个人覆盖和全局制作人绑定;月份锁、实际经办人及审批节点保护继续生效。
|
||||
- 最新完整单元 **893 passed**;角色授权/参数/核算准入/结构同步 **31 passed**;正式工资/审批/月结/T+ 工作区 **52 passed**,共 83 项隔离 MySQL 专项通过。
|
||||
- 修正旧测试约定:人员必须提供计提岗位,参数查看通过角色授予,未授权角色不能核算,管理员无需单独绑定。未放宽产品校验或跳过测试。
|
||||
- 日志:`.ai/authorization-role-unit-final.log`、`.ai/authorization-current-recheck.log`、`.ai/authorization-role-sensitive.log`。先前角色切换期间的全量 420 passed / 4 failed 保留原记录,不写成一次性全量全绿。
|
||||
- Ruff、前端类型及生产构建通过;真实无模拟接口浏览器 6 项通过,见 `.ai/authorization-role-real/result.json`。全部写入测试使用隔离库,未对本地业务库运行清理夹具。
|
||||
|
||||
## 客户页面参数说明核验(2026-11-02)
|
||||
|
||||
- 参数目录改为使用当前注册表的业务说明,历史参数值与生效日期仍从数据库记录读取;新增回归防止旧数据库说明继续误导页面,且不改写历史数值。
|
||||
- 命令:`.venv-workbench/Scripts/python.exe -m pytest tests/unit/test_param_registry.py tests/unit/test_formula.py -q --tb=short -p no:cacheprovider`,**59 passed**;相关 Ruff 检查通过。
|
||||
- 本次说明修订依据最新客户回执:系统审核默认关闭且不伪造通过痕迹,预收款实际发货后计提,低于毛利阈值的负结果仍按原规则计算。未修改公式或参数默认值,未运行业务数据写入测试。
|
||||
|
||||
## 系统监控(2026-11-02)
|
||||
|
||||
- `tests/unit/test_monitoring.py`、`tests/unit/test_monitor_service.py` 共 18 项通过:路由模板、4xx/5xx、近似 P95、有界缓冲、编号及日志关联、权限、脱敏导出、落库与重启历史、故障恢复、采集未知及后台错误去重。
|
||||
- 本轮完整单元回归 884 项通过;新增监控 Python 文件 Ruff 检查通过。
|
||||
- 修复验证发现的问题:遥测失败不得覆盖业务响应;重启首次 CPU 未知和 T+ 状态不可读时,不误标历史故障为恢复;迁移链检测兼容 Alembic 的无类型注解版本声明。
|
||||
- 真实 MySQL/Redis 与迁移验证仅在显式创建的隔离测试库执行,不对原开发业务库运行集成清理夹具。页面浏览器验证不代替真实依赖验证。
|
||||
- 真实隔离验证已通过:V23 升级/降级/再升级,原健康接口 7 项,三张新表 ORM/迁移 SQL/初始化 SQL 一致,管理员与普通用户真实鉴权、异常编号唯一关联、无人访问期间持续采集落库、重启后历史查询及业务表未写入。
|
||||
- 真实页面无拦截联调通过,四页签脚本错误与监控 API 失败均为 0。修复 HTTP 查询参数 `hours` 的字符串转换,补测全部三个时间范围的趋势、接口和事件查询,18 项专项复验通过。
|
||||
|
||||
## 审查问题修复核验(2026-11-02)
|
||||
|
||||
- 修复正式核算起付比例的日期范围:2026-03-01 前的发货由期初应收承接,不再计入新业务销售额分母;与 FIFO 的启用边界保持一致。
|
||||
@@ -336,3 +386,10 @@ uv run pytest tests/integration -q # 仅集成
|
||||
**禁止直接对原业务库执行集成测试。** 运行 `python scripts/run_isolated_tests.py` 创建受限测试库;夹具在执行前及清理前核验显式标记、名称及真实引擎目标。运行器保留隔离库便于复查,不打印临时凭据。
|
||||
|
||||
最新完整集成补验:全部29个测试文件分两套独立数据库覆盖,215+184=399项通过,失败0、跳过0。上述旧夹具失败已经修复并关闭;最终结果以本条和开发记录末节为准。完整单元749通过,V18/V19往返及结构9通过。
|
||||
\n\n## T+ 详情分项空值与去重回归(2026-11-02)\n\n- T+ 任务/工作台/监控相关单元 66 项通过;Ruff、前端类型和构建通过。模拟接口浏览器覆盖创建不弹详情、详情去重、轮询停止、异常与响应式、旧任务空分项说明。真实任务只读验证通过。证据 `.ai/tplus-detail-null-progress-unit.log`、`.ai/tplus-detail-browser/result.json`、`.ai/tplus-detail-live/result.json`。未操作生产或真实写入。\n
|
||||
|
||||
## 计提公式模板入库(2026-11-02)
|
||||
|
||||
- 模板定义迁移至 `calc_template_definitions`(V28 种子 5 个内置模板);骨架 `FORMULAS` 受控,核算/预览按骨架分派,岗位模板校验改为数据库定义优先、旧库注册表兜底。
|
||||
- 更新 `test_param_registry` 模板断言:内置模板参数绑定覆盖骨架角色且参数编码已注册。单元 24 项通过;`test_calc_helpers`、`test_param_snapshot`、`test_formal_payroll` 合计 63 项通过;Ruff 与前端类型/构建通过。
|
||||
- 岗位相关 MySQL 集成需独立测试库环境(`PAYROLL_TEST_DATABASE`),本轮未执行;新增模板 CRUD 集成用例待补。
|
||||
在新工单中引用
屏蔽一个用户