PayrollManagementSystem/tasks/plan.md
liuwenxin 4a888e9974 docs(计划): 记录最新 T+ 运行验收
记录当前提交在新端口的只读健康检查、接口发现和前端加载结果,明确验证码和真实写入尚未执行。
2026-11-05 19:13:34 +08:00

575 lines
86 KiB
Markdown
Raw 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.

# 当前计划:T+ 数据贯通业务流程(2026-11-04)
## 2026-11-05 T+ 页面化、跨平台托管修复计划(当前版本)
### 2026-11-05 审查补充
- 最新提交后的只读运行检查:在 `8002` 启动当前后端,`/api/health` 返回应用、MySQL、Redis 均为 `true`;OpenAPI 已包含业务接入和读取服务运行控制接口;前端在 `5175` 可加载。未绕过验证码、未执行真实写入或工资操作;原运行中的旧服务未中断。
- 最新授权修复后重新验证:完整隔离 MySQL 集成测试 458 项通过;完整单元测试 1081 项通过、1 项跳过(`test_mysql_month_lock.py` 需要显式配置空的临时 MySQL 测试库);两者各有 1 条 Starlette 弃用警告。前端 `npm run type-check` 通过。上述结果不替代现场服务、真实业务资料和浏览器闭环验收。
- 本轮复核自动接入和采集由 `worker.run_once` 共用全局互斥锁,接入执行前重新检查 `tplus:import`。隔离模拟浏览器重跑来源详情、接入日期、销售关系、更正单及客户/产品批量维护,均通过;批量维护使用临时本地 Vite 服务,测试后已停止。API 均为模拟,不能视为真实业务数据及工资闭环验收。
- [必须修复,已修复] 编辑角色时原先允许分配停用权限,权限记录缺失还会触发内部错误;现与创建角色共用启用记录校验,在替换既有授权前返回明确错误。隔离测试先复现停用权限错误成功,再覆盖停用和缺失两种情形;角色与授权相关集成测试 35 项通过、1 条弃用警告,相关 Ruff 通过。下方 456 项完整集成结果在本项修复之前,不能视为修复后的完整回归。
- 本轮修复后重新从空隔离库迁移到 V33 并运行完整集成测试:456 项通过,1 条 Starlette 弃用警告;运行器未报告临时资源清理失败。该结果不替代真实浏览器、现场服务及工资闭环验收。
- Docker 恢复后,角色管理及授权隔离集成测试在新建临时库迁移至 V33 后通过:33 项、1 条 Starlette 弃用警告;本轮修改涉及文件的 Ruff 检查通过。测试运行器已正常退出并清理其本次创建的临时资源。
- 只读检查发现远程仓库可访问,但其对象集合不包含本地 `HEAD`(`3efe72c34485ff4377a55a3ad1fdb025b2d11726`)及已确认损坏的 `1ebbae87c92efc566e51e01b473a05a122f1a9ce`,无法据此直接恢复本地历史。远程镜像仅存于临时目录,未修改当前仓库。
- 本轮只读查询 `SELECT DB_NAME(), 1` 成功,实际连接库为 `UFTData472115_000001`;未执行采集或写入。
- [已修复,待集成验证] 角色权限数量现与授权详情一样只统计当前权限目录;历史目录外权限不再导致列表数量不一致。内存 SQLite 定向查询和 Python 编译检查通过;新增隔离集成用例尚未运行,因为 Docker 引擎当前不可用,测试库未创建。
- 上轮完整隔离集成测试 455 项通过、1 条弃用警告;本轮修改后尚未重跑该套件。`git fsck --no-reflogs --connectivity-only` 仍报告对象损坏,禁止在完整差异和提交范围无法核验时提交。
- [必须修复,已修复] 旧工作台可绕过来源和历史成本检查直接封存指导成本;现仅允许未封存草稿,且不得与同产品同月已封存成本重叠。
- [必须修复,已修复] 业务详情登记指导成本时,发货单版本须对比实际应用版本,而不是最新观察版本;已补服务层创建、复用及版本变化回归。
- [必须修复,已修复] 托管服务释放 MySQL 命名锁异常时不得将可能带锁的连接放回池中;停止状态写入失败也必须尝试释放锁。
- [必须修复,已修复] 托管服务先前只检查连接配置而未探测源库;现以只读查询检测 T+,不可达时不排队或领取任务,错误信息不包含连接串。托管及 worker 相关定向单元 20 项、Ruff 通过。
- 隔离 MySQL `payroll_test_a80c30a5b266` 已从空库迁移到 V33;托管状态机集成测试 2 项通过,覆盖真实命名锁、重复托管拒绝、优雅停止与依赖故障降级。工作线程及源故障使用模拟,现场系统服务和实际采集仍待验证;测试库及专用账号保留。
- [必须修复,已修复] 回款确认响应使用微秒而数据库只保存秒,重复查询可能变化;确认时间统一到数据库精度。信息员预览和新增回款确认开关的历史集成测试预期已按现行接口契约修正。
- 隔离 MySQL 中托管、T+ 工作区、来源单价权限、回款确认和参数管理集成测试共 44 项通过;回款及托管定向单元 13 项、相关 Ruff 通过。未操作当前业务库或真实 T+ 采集。
- 本轮完整单元 1073 项通过;随后仅为源库探测增加既有查询超时,相关 20 项再次通过。
- 单元定向验证 76 项、完整单元 1066 项通过;前端类型检查、生产构建和相关 Ruff(禁用损坏缓存)通过。
- Git 对象库存在多处损坏和缺失,完整差异读取失败;在修复及核实仓库完整性之前不应提交。未重建仓库、未清理用户改动。
- 页面显示读取服务离线、自动业务接入关闭;SQL Server 当前只读连接查询成功,不等于采集或接入已完成。真实运行控制迁移和服务恢复尚待安全验证。
实施状态:已增加默认停止的运行控制迁移、带权限和版本校验的接口、supervisor 循环、页面控制及 Linux/Windows/Docker 配置示例。真实 MySQL 命名锁及模拟工作线程的托管启停已在隔离库验证;Windows Service、Linux 目标机及实际采集尚待验证。此前只读查询已证实当前 T+ 可连接,页面仍显示读取服务离线。当前工作区 Git 对象解压报错,既有 T+ README 读取出现大量空字节,避免迁移当前业务库或启动真实采集;部署说明另见 `docs/T+读取服务跨平台部署说明.md`。不得将当前状态视为目标环境交付完成。
### 目标
让用户只在 T+ 管理页面管理“是否自动采集”和“读取服务是否运行”,不依赖 Windows 任务计划,也不要求用户理解 Python、虚拟环境或 `app.cli`。系统部署到 Linux、Windows Server 或开发机时,行为保持一致:
- 系统服务未运行或后端健康检查未通过时,不启动 T+ worker;
- 页面保存的是业务期望状态,后台托管服务负责把期望状态落实为实际进程状态;
- 自动采集开关只控制是否按计划排队,不等同于启动操作系统服务;
- 读取服务停止后不删除任务、不修改已完成数据,只停止领取新任务并安全退出;
- T+ 连接文件、数据库、Redis 或驱动不可用时,页面显示明确状态和错误,不反复弹出 Python 控制台;
- 不再把“复制自动采集任务”作为启动入口。若保留该文案,必须改为复制业务任务配置,不能复制操作系统任务。
### 现状与根因
现有页面的“每周自动采集”开关已经联动 `PUT /v1/system/tplus/automation`,并由 `tplus-maintain` 读取 `tplus_automation_configs.enabled` 决定是否排队。但页面没有管理 worker 的实际运行状态,也没有跨平台的服务控制协议;worker 仍由外部托管入口直接运行。因此“自动采集开关”“采集任务记录”和“后台读取进程”目前是三条半独立链路,容易出现开关已开、任务已排队、worker 却未运行,或旧 Windows 任务重复启动的情况。
### 选定方案
采用“页面期望状态 + 跨平台 supervisor + 原生服务管理器”的三层结构:
1. **页面和后端控制层**
- 保留 `TPlusAutomationConfig`,只负责源级自动采集开关、星期和时间。
- 新增 `TPlusRuntimeControl`(或等价现有模型扩展),记录 `desired_state`、`actual_state`、`worker_phase`、`heartbeat_at`、`last_error`、`host`、`platform`、`version`、`updated_by`。
- 增加读取服务状态查询和期望状态更新接口,使用权限校验、乐观版本校验和操作审计。
- 后端 API 不直接执行 `systemd`、Windows Service 或 shell 命令,避免 Web 进程获得系统级权限。
2. **supervisor 执行层**
- 增加统一的 `tplus-supervisor` 运行入口,负责检查后端、数据库、Redis、T+ 连接和页面期望状态。
- `desired_state=RUNNING` 且依赖健康时启动或保持 worker;`desired_state=STOPPED` 时让 worker 完成安全退出并停止领取新任务。
- 连接配置缺失、依赖不健康、后端不可达或 worker 异常时保持空闲,写入受控错误和心跳,不进行快速重启循环。
- worker 继续复用现有幂等、停止标记、命名锁、有限重试和心跳逻辑。
3. **操作系统托管层**
- Linux 使用 `systemd` 托管 supervisor/worker;
- Windows Server 使用 Windows Service 托管 supervisor/worker;
- Windows Task Scheduler 只作为旧安装迁移检测对象,不作为产品交付入口;
- 安装模板只负责注册一个受限服务账号运行的托管服务,用户日常操作回到系统页面。
### 页面交互调整
- 保留“自动采集”开关,并明确说明它只控制计划排队。
- 在同一管理区域增加“读取服务”状态:运行中、已停止、启动中、停止中、依赖异常、离线。
- 增加“启动读取服务”和“停止读取服务”按钮,按钮只更新期望状态并等待实际状态回报;不能假装操作已立即完成。
- 展示最近心跳、运行主机、操作系统、最近错误和最后一次状态变更人。
- “立即同步”继续创建一次手动业务任务;不把它与服务启动混用。
- 移除或改名“复制自动采集任务”按钮。复制逻辑任务时必须使用新的请求键并经过后端幂等校验,禁止复制 Windows 任务计划或直接启动 Python。
### 实施顺序
1. 梳理现有 `TPlusAutomationConfig`、心跳、worker、维护命令和旧 Windows 入口,确定兼容字段和迁移边界。
2. 增加运行控制模型及迁移,补充状态枚举、版本号、错误长度和同一主机并发约束。
3. 增加后端运行状态查询、期望状态更新、权限校验、审计和冲突响应;保持旧自动采集接口兼容。
4. 实现 `tplus-supervisor`,让 worker 服从期望状态,处理启动前置检查、优雅停止、心跳和异常退避。
5. 改造 T+ 页面和 API 类型,接入启动、停止、状态刷新、错误提示和权限禁用状态;删除“复制自动采集任务”的错误入口。
6. 提供 Linux `systemd` 单元、Windows Service 安装模板和旧任务迁移检查;不再把 Task Scheduler 写入用户日常操作说明。
7. 更新 README、部署说明和页面使用说明,明确自动采集开关与读取服务开关的区别。
8. 在隔离环境验证后端停止、依赖异常、配置缺失、worker 崩溃、重复请求、优雅停止和跨平台服务配置;当前本机 T+ 连接文件缺失,不执行真实源库采集验收。
### 验收标准
- 页面能显示自动采集开关和读取服务实际状态,二者状态含义不混淆;
- 用户从页面点击启动后,只有 supervisor 在依赖健康时才启动 worker;
- 用户从页面点击停止后,worker 不再领取新任务,当前安全步骤结束后退出;
- 后端停止、数据库/Redis 不可用或连接文件缺失时,不会启动或反复重启 T+ Python;
- 自动采集关闭不会删除手动任务或历史记录,当前运行任务按既有规则继续完成;
- 同一主机只有一个有效 supervisor/worker 实例,旧 Windows 任务不会与新服务并行运行;
- Linux 和 Windows Server 的托管配置均不要求用户直接运行 `python.exe`、`uvicorn` 或任务计划;
- API 具备权限校验、乐观锁冲突提示和操作审计;
- 后端单元测试、隔离数据库测试、supervisor 状态机测试、前端类型检查和生产构建通过。
### 风险与未决项
- 本机当前 T+ 连接文件不存在,真实源库连接和长任务验收必须在目标环境完成。
- Windows Service 的具体安装方式需结合客户是否允许安装服务、服务账号和 ACL;不在代码中硬编码管理员凭据。
- 旧任务迁移只做识别、记录和停用建议;删除、生产注册和重启服务需在目标环境按部署授权执行。
- 不把“页面保存成功”误报为“进程已经运行”,实际状态必须由 supervisor 心跳确认。
## 历史方案:Windows 任务计划托管(已废弃,仅供迁移参考)
### 目标
向用户交付一个“启动工资系统即可使用,停止工资系统即可停止后台采集”的运行方式:
- 用户不需要理解 Python、虚拟环境、T+ worker 或 Windows 任务计划;
- 后端未启动或健康检查未通过时,不启动 T+ 采集进程;
- 后端停止后,T+ worker 自动停止领取任务;
- T+ 连接文件缺失、账号错误或 ODBC 不可用时,只写入受控日志和页面状态,不弹出黑色控制台窗口;
- 自动采集由系统内的源级开关控制,Windows 只负责托管进程,不绕过业务授权。
### 推荐运行模型
继续使用 Windows 任务计划作为托管入口,但统一放在项目专用任务目录,禁止直接注册调用 `python.exe` 的旧任务。
1. `Payroll-backend`:系统主进程。开机或用户启动系统时启动,绑定 `127.0.0.1`,失败后按固定次数重启。
2. `Payroll-worker`:从属进程。由统一启动器等待 `/api/health` 返回 `app=true、db=true、redis=true` 后再启动;运行期间周期检查后端,后端不可用时停止 worker,不领取新任务。
3. `Payroll-maintenance`:从属短任务。每分钟触发统一启动器,只有后端健康、T+ 开关已启用、连接文件存在且可读时才执行一次维护检查;其他情况正常退出并记录原因。
4. `Payroll-stop`:停止入口。先写停止标记,再停止 worker、maintenance 和 backend;等待长查询按现有宽限期退出,避免强制中断采集。
### 用户交付入口
交付包只暴露三个用户可见操作:
- `启动工资系统`:启动后端,等待健康检查通过,再启动 T+ worker;
- `停止工资系统`:停止后端及 T+ 后台任务,并保留当前日志与任务状态;
- `检查系统状态`:显示后端、MySQL、Redis、T+ 连接、worker 心跳、最近采集和下次维护时间。
开发环境可提供桌面快捷方式或 `Start-PayrollSystem.ps1`;客户环境使用受限服务账号注册同一组任务。用户不直接运行 `uvicorn`、`app.cli`、`python.exe` 或 PowerShell 托管脚本。
### 配置和安全边界
- `backend/.env` 只保存应用开关和非敏感配置;T+ 密码继续放在项目外的只读连接文件或受保护凭据中。
- 连接文件不存在或校验失败时,T+ 子任务不启动;不把 `T_PLUS_ENABLED=true` 当作“连接一定可用”。
- `T_PLUS_AUTOMATION_ENABLED` 只作为初始值,页面保存的源级自动化配置仍是最终开关。
- 安装程序检查并拒绝旧的 `PayrollTPlusCurrent-*`、重复 `PayrollDev-*` 任务;迁移时先记录任务动作、账号和状态,再停用旧任务,保留可回滚信息。
- 所有子进程使用隐藏窗口、独立 stdout/stderr 日志和固定日志轮转;连接字符串、密码和完整 Token 不进入日志。
### 实施顺序
1. 改造 `Run-PayrollHost.ps1`:增加后端健康等待、T+ 前置检查、运行中健康监控和从属进程停止逻辑。
2. 改造 `TaskHost.Common.ps1` 与安装脚本:统一任务名称和路径,阻止重复旧任务,明确启动顺序和停止顺序。
3. 增加 `Start/Stop/Check-PayrollSystem` 用户入口,输出人可读状态,不暴露内部命令细节。
4. 更新 `scripts/windows/README.md`:以用户操作为主线,补充首次安装、日常启动、停止、故障检查和回滚步骤。
5. 在隔离目录验证:后端未启动、后端健康、MySQL/Redis 不健康、T+ 连接文件缺失、worker 退出、停止标记和长查询退出等场景。
6. 在当前机器只停用旧重复任务,不注册生产任务;客户现场再由管理员执行安装和服务账号核验。
### 验收标准
- 开机或登录后,后端未被要求运行时不会启动 T+ Python 子进程;
- 后端健康检查未通过时,worker 和 maintenance 不执行 T+ 读取;
- 后端运行后,worker 才启动并能显示心跳;
- 后端停止后,worker 在宽限期内停止领取任务;
- T+ 连接配置错误只产生日志和状态提示,不弹出控制台窗口;
- 同一台机器不存在旧任务与新任务重复运行;
- 用户只通过启动、停止、检查三个入口即可完成日常操作;
- 现有采集幂等、失败重试、停止标记、日志轮转和只读权限保护测试继续通过。
### 当前决策与未决项
- 推荐保留 Windows 任务计划,不立即引入 NSSM、WinSW 等第三方服务包装器,降低客户安装依赖和维护成本。
- 生产环境是否开机自动启动后端,需按客户现场要求选择;默认建议“开机托管后端、T+ 按系统健康和应用开关运行”。
- 当前本机 T+ 连接文件不存在,不能重新启用 T+ worker;补齐并验证连接文件后再做真实采集验收。
## 当前验收对照(2026-11-05)
2026-11-05 列表加载状态:发货和回款列表在初次加载及后续请求中显示加载提示,失败显示重试提示,只有成功且无记录时才显示空结果;类型检查和前端构建通过,真实登录页发货列表正常显示 7504 条。受控延迟、失败及空结果的浏览器验证仍待完成;未改业务数据或重启服务。
2026-11-05 真实浏览器只读检查:用户登录后,当前运行版本显示每周自动采集和业务自动接入均已开启;首次采集新增 933203 条,后续采集的 933203 条为重复跳过,最近接入任务显示部分待核对。业务管理显示 463 条,抽查预收款业务可见来源回款单及客户分类、指导成本、发货、期初和人员归属待补提示。发货列表加载完成显示 7504 条,加载初期短暂显示无数据,需修正加载状态。未修改业务或触发核算。当前 API 和 worker 尚未加载最近修复,本次不代表最新代码、权限边界、订单或完整闭环已验收。
2026-11-05 指导成本复用:来源业务核算准备按来源产品、发货月、明细及单位匹配已有指导事实;唯一已封存单位价可在页面预填,明细总额只按总成本校验,不自动换算。多条候选、单位不符、未封存或与已封存依据不一致会阻止保存,不改历史输入;来源明细存在但产品标识缺失时也拒绝绕过。工作区和暂存快照相关单元各 100 项、模拟浏览器、前端构建及 Ruff 通过;前一版暂存快照全量单元 1083 项通过,不能视作包含本次指导成本变更的全量结果。没有指导事实时仍是逐明细人工录入,统一维护入口尚未完成;当前服务未加载本次代码,未修改业务数据。
2026-11-05 指导价历史保护进行中:新增的封存冲突检查和历史查询尚未接入写入路径。核查发现 T+ 封存快照的 line_id 是来源 ID,不能与当前本地发货明细 ID 直接比较;已改为读取快照中产品身份并对身份缺失保守拦截,补充来源 ID 不同、正式明细删除和产品身份缺失的回归用例。上述最新修改尚未通过测试:pytest 收集和 Python 语法检查均长时间无输出,项目部分文件读取阻塞;前端 5173 当前不可连接。Git diff 报告对象 a7585d0b80633044843a6dafa06eae47b5b4537f 解压失败,默认 PowerShell 缺少运行时组件。须先保护工作区和数据库并排查存储环境,恢复后复测,再完成统一维护、锁、权限及旧入口保护;不得将现有结果视为验收通过或提交。
2026-11-06 指导成本入口接入:新增 `PUT /v1/business/businesses/{id}/guidance`,要求 `payroll:prepare` 与 `tplus:facts` 双权限;服务端从本地发货明细关联的当前 T+ 快照推导来源产品、发货月份和单位,在 T+ 互斥锁内检查来源版本、重复事实、历史封存成本和审计后追加 `GUIDANCE` 事实。核算参照返回计量单位和指导成本状态,核算弹窗提供“登记并封存”入口,并清理重复表格模板。相关语法检查、Ruff(`--no-cache`)、前端类型检查和生产构建通过;指导成本、历史保护、元数据和权限测试 `21 passed`。Git 对象仍有损坏,尚未提交;真实 API/浏览器和 MySQL 写入闭环尚未运行,未修改业务库。
2026-11-05 来源人员参照:核算页面展示各发货明细的来源经办人;仅按同一账套已有的源人员身份关联预填候选,未匹配时保留空值,不按姓名或其他账套猜测,已封存归属不被覆盖。身份关联建立后无需重新采集来源即可查询。SQLite 参照测试 5 项覆盖同名及跨账套,工作区和暂存快照模拟浏览器覆盖预填、未匹配、封存优先和分页;前端构建及 Ruff 通过,暂存快照参照和手工保护共 6 项通过。实际业务库人员档案只读统计为 0,须由有权限的用户先核实身份及岗位;未自动虚构人员、岗位或修改业务库。当前服务未加载新参照接口,真实登录态及 MySQL 集成仍待验收。
2026-11-05 手工业务兼容审查:[必须修复] 手工核算资料再次保存时,省略交接字段会清空已有交接;仅比较成本总额还可能漏掉四舍五入后的指导单价微小变更。现在省略字段继承交接、显式空列表才清空;原单价按十进制数值比较,缺失原价时保守拒绝。两个问题均先以独立 SQLite 回归复现;工作区相关 48 项、暂存快照相关 41 项、显式清空专项和 Ruff 通过。两组数量不同是因为工作区正式工资测试包含未暂存的其他改动;未把它们计入本次提交,未修改业务库或更新运行服务。
2026-11-05 交接入口:来源业务核算资料页可维护交接类型、双方及生效日期;业务标识由核算参照接口返回,用户无须填写。未修改交接时不发送该字段,服务端继承原版本;在职交接须确认逐次发货归属,后台拒绝交接双方相同。工作区及暂存快照的模拟浏览器覆盖新增、未确认拦截、保存后展示、再次保存保留、分页失败恢复、205 条提交及 390/768/1440 像素窗口;前端构建、相关 26 项单元及 Ruff 通过。暂存快照浏览器运行时出现一次 `ResizeObserver` 提示;模拟接口不等于真实登录态或 MySQL 验收。运行中的 API 尚未加载参照接口更新,交接维护暂不可在当前服务中使用,本轮未改业务数据。
2026-11-05 在职交接审查:[必须修复] 预演要求确认逐次发货归属,但来源核算封存和共用 FIFO 未对未确认的在职交接设置同等保护,可能产生绩效。来源资料保存现明确拒绝未确认交接;FIFO 也对历史输入按相关业务标记待补,阻止正式核算,其他业务不受影响。修复前两个回归均失败;修复后来源与 FIFO 相关 108 项、确认后保存和归属专项 3 项及 Ruff 通过。包含本次修复的暂存快照完整单元 1081 项通过,保留第三方弃用警告。运行服务未加载本次修复,业务详情仍缺直接维护交接的入口;隔离 MySQL、真实登录态验收与最终提交未完成,未修改业务数据。
2026-11-05 人员交接与大业务审查:[必须修复] 来源核算资料未收录仅作为交接双方的人员,且再次保存省略交接字段会清空历史交接;现校验交接业务和正式人员、冻结双方岗位映射,并在字段省略时保留原交接。单元复现跨业务与静默清空,修复后通过,FIFO 预演验证接手人归属。另只读统计业务库有 6 个业务超过 200 张发货单、最多 406 张;旧核算参照接口会直接拒绝。现按页返回人员和发货明细,页面完整加载后分页编辑,加载不完整时禁止保存。相关单元 94 项、分页服务专项 4 项、205 条模拟浏览器分页/失败/完整提交、Ruff 和前端构建通过;真实登录态、MySQL 集成与运行服务更新仍待验收,未修改业务库。
2026-11-05 指导成本封存审查:[必须修复] 仅比较已封存成本总额会漏掉单价的微小变化,例如数量 5、单价从 1 改为 1.0001 时总额仍四舍五入为 5.00。现同时按数值比较原指导单价,等价表示如 1 与 1.0000 不误拦截;原单价缺失时保守拒绝。先以单元回归复现,再修复;相关 89 项单元在工作区及暂存快照分别通过,Ruff 通过。隔离 MySQL 闭环已补充同类接口用例,因 D 盘脏标记和共享数据库提交延迟,尚未运行;运行服务尚未加载本次修复。
2026-11-05 文件系统只读检查:`fsutil dirty query D:` 返回 `Volume - D: is Dirty`;前端登录页 HTTP 200。未运行磁盘修复、卸载卷或重启。磁盘及备份状态需用户处理后,再评估隔离 MySQL 回归对业务库的影响。
2026-11-05 后续审查:D 盘卷仍报告 `Warning`,业务库连接仍可观察到提交等待,暂未重启大批量 MySQL 测试。单价确认新增父单复核失败时回滚单价及记录失败审计的单元回归,1 项通过,Ruff 通过;双权限单元测试在暂存快照 2 项通过。真实登录态页面、双权限 MySQL 集成和最终提交仍未完成。
2026-11-05 环境提示:Windows `Get-Volume` 报告项目所在 D 盘卷状态为 `Warning`,仍有可用空间;MySQL 业务库连接出现超过 10 秒的 `waiting for handler commit`。为避免影响用户测试,已停止暂存快照的隔离 MySQL 全量回归,中断前 14 项通过,不能视为 21 项全部通过;隔离库及残留测试数据保留,未停止 MySQL 或业务服务。磁盘告警原因未经诊断,不对磁盘或业务数据执行修复和清理;新增单价确认双权限专项尚未执行。
2026-11-05 权限补证:新增单价确认的双权限 MySQL 集成用例,尚未执行;不连接 MySQL 的路由权限映射及核算准备权限拦截单元测试 2 项通过,相关 Ruff 通过。这两项单元测试不能替代真实数据库授权集成验收。
2026-11-05 暂存快照复验:包含来源空单价人工确认与审计修复的暂存版本,完整后端单元 1072 项通过,前端生产构建通过;保留第三方弃用及既有大包提示。只读查询时采集与业务接入队列为空;真实浏览器仍在登录页。工作区存在其他未暂存变更,重启工作区服务可能同时加载这些变更,本轮尚未重启服务或完成真实登录态验收。
2026-11-05 缺失来源单价人工核对:新增双权限确认入口,只补齐未封存正式明细的空单价;来源变更、已有单价及工资输入封存均拒绝,保留操作依据与成功/失败审计,多明细须逐条确认。审查发现提交后读取 ORM 可能导致成功操作被误记失败,已改为提交前固定返回值。相关单元 86 项及新增审计专项 2 项、审计边界调整后的隔离 MySQL 分批追加回归 1 项、模拟浏览器、Ruff 和前端构建通过。运行中的 API 和 worker 尚未加载新修复;真实登录态验收和最终提交仍待完成。未对业务库补写单价或生成工资。
2026-11-05 单价修复暂存快照复验:完整后端单元 1068 项、前端生产构建和来源详情模拟浏览器通过;保留第三方弃用及既有前端大包提示。隔离 MySQL 单价冲突恢复回归 1 项在本轮通过;后续仅追加单价税别展示和对应测试。修复尚未加载当前 API/worker;真实登录态页面验收和提交仍待完成。
2026-11-05 来源单价审查:[必须修复] 来源存在 `taxPrice: null` 且有未税单价时,原实现丢失单价并跳过精度校验。现接入时保留有效未税单价并校验四位精度;对既有正式明细为空或不一致的情况标记冲突,不覆盖人工值;来源列表及明细对照明确显示含税/未税和原始超精度值。当前业务库只读统计此类已接入空单价的订单/发货明细均为 0。相关单元 82 项、隔离 MySQL 分批追加及单价冲突恢复 1 项、来源详情模拟浏览器、Ruff 和前端构建通过;构建保留既有大包提示。当前正在使用的 API 和 worker 尚未加载此次单价修复,前端对旧 API 显示税别待确认;本轮未重启服务或修改真实业务数据。真实登录态浏览器验收和最终提交仍待完成。
2026-11-05 表头金额审查补证:订单和发货表头金额变更均经单元回归验证,业务详情显示原金额及新金额,核算准备状态标记来源冲突,调用核算准备会拒绝并且不创建 `PayrollInput`;来源恢复后冲突消除。2 项测试及对应 Ruff 通过;未变更真实源库或业务库,真实登录态页面验收仍待进行。
2026-11-05 运行环境与构建续验:最终暂存快照前端 `npm run build` 通过,保留现有大包体积提示。首次安全更新 worker 时同步锁繁忙,未终止进程;再次持锁确认采集与接入队列为空后更新 worker。新进程心跳为空闲,应用/MySQL/Redis 健康检查正常;未重启 HTTP 或前端,未手动触发真实采集和工资操作。表头金额差异修复已加载后台 worker,尚未通过制造真实来源变更验证。
2026-11-05 最终暂存快照完整单元复验:包含表头金额差异修复在内,1063 项通过,1 条第三方弃用警告;隔离 MySQL 的完整 21 项回归在该修复前通过,修复后重新运行分批追加及核算月结闭环 2 项通过。模拟浏览器不替代真实登录态验收。
2026-11-05 暂存快照最终增量验证:补充 Redis 认证后,隔离 MySQL 工作台 21 项完整回归通过;表头金额差异修复纳入暂存后,隔离快照接入单元 76 项、分批追加与核算月结闭环 2 项通过。来源详情、接入日期及订单发货关联的模拟浏览器回归通过,相关 Ruff 通过。完整快照单元 1061 项通过发生在表头金额增量修复前,修复后已重跑全部 76 项受影响单元,不将两次结果合称最终快照全量通过。`git diff --cached --check` 仅报告已应用 V30 SQL 原文行尾空格,其余暂存路径通过;敏感词命中均为测试占位值。本轮未重启用户运行中的服务,表头金额增量修复尚未加载运行 worker;真实浏览器仍在登录页,尚未完成真实登录态验收。
2026-11-05 暂存快照与审查续验:暂存版本缺少回款确认测试前置及参数注册数量更新,已选择性补入,不包含工作区无关公式及界面改动。隔离快照完整单元测试 1061 项通过;首次隔离 MySQL 工作台回归的 13 项失败均为隔离进程未提供 Redis 认证,已补充进程级配置并重新运行,未操作业务库。审查复现订单和发货表头含税金额变化未触发差异,现按已接入源版本比较该字段,不更改既有指纹;专项单元 76 项通过,订单及发货均覆盖变化与恢复。真实浏览器当前处于登录页,登录态验收仍未完成;生产账号权限和证书安全未验收。
2026-11-05 准备筛选性能及边界复核:[必须修复] 对 MySQL JSON `null` 和空对象,`IS NOT NULL` 会把手工业务误计入来源筛选;隔离回归复现总数 3 而实际来源业务仅 1,现改为检查来源账套字段。客户类型、产品类型、尚未发货和来源冲突筛选改由数据库按详情同口径预筛,其余原因保留分批精确计算;未封存业务不再加载无须比较的发货/回款明细,同一请求复用来源快照检查。真实业务库单次只读测量客户分类筛选总数仍为 463,耗时从约 5.45 秒降至约 0.29 秒;不代表并发压测。测试中新增的两条手工样本编号未匹配清理规则,导致隔离库外键清理失败;已核对仅在隔离测试库、无子项后按精确 ID 与编号清理这两条样本,并修正测试编号。完整后端单元 1070 项通过;工作台回归 20 项通过、首项受前次清理事务回滚遗留样本影响失败,隔离库恢复为空后首项及分批追加、筛选闭环三项专项重跑均通过。HTTP 已更新、健康检查正常,worker 心跳正常;未将分两次的测试结果记作单次全量通过。
2026-11-05 列表验收缺口修复:[必须修复] 业务列表此前未显示真实核算准备状态,也不能按具体待补原因筛选;旧 `pending_only` 仅判断是否存在工资输入,封存后发生来源冲突会漏报。现将列表和详情统一使用批量准备判断,支持状态/原因筛选与准确分页;单次只读测量 463 条来源业务时默认列表约 0.07 秒、原因筛选约 5.97 秒,不代表并发性能。隔离 MySQL 闭环已验证待分类、资料齐全和封存后来源冲突,跨批次分页单元测试及模拟浏览器筛选/四宽度检查通过;完整后端单元 1070 项、隔离 MySQL 工作台 21 项、Ruff 和前端构建通过。HTTP 已更新,健康检查和筛选接口定义正常;真实登录态验收和提交仍待完成。
2026-11-05 提交范围续查:回款确认的参数注册及权限目录是本次核算准备的直接依赖;公式编辑和部署产物等既有变动需独立判断,不能因工作区脏而整体暂存。已跟踪差异 `git diff --check` 通过,尚未暂存或提交。
2026-11-05 真实重算终态与服务更新:任务 `TP20261105031743af077c9d` 为 PARTIAL,共 12594 条(无变化 11572、待核对 1022),八类均指向完整批次 `TP202611042002170dd04dd5`,未写工资。来源业务 463、发货 7504、回款 786、来源工资输入 0、来源文档 44737,与基线一致;150 笔无发货且无工资输入的来源业务运费均为空。核对采集及接入队列为空,互斥锁首次忙时未中断任务,锁释放后持锁再次核对并更新 worker;HTTP 已更新,健康检查 app/MySQL/Redis 均正常,数量汇总接口已注册,worker 心跳正常。新增客户变更、来源消失及日期范围保护已加载,但没有制造真实源变更验证;真实登录态浏览器与提交仍待完成。
2026-11-05 增量回归与查询复核:新增来源数量汇总后的完整后端单元测试 1069 项、隔离 MySQL 工作台回归 21 项通过,前端类型检查与生产构建通过,来源详情模拟浏览器检查通过;构建保留既有大包提示。当前业务库对订单数量查询的单次 MySQL EXPLAIN 显示使用业务/来源类型索引和明细主键连接,不代表并发或大数据量性能验收。真实接入任务最近处理 11492 条,心跳正常,未写工资;终态和服务更新仍待核验。
2026-11-05 新版服务部署与重算:上一任务 `TP20261105012515048bb39f` 终态 PARTIAL,共 12594 条(无变化 11572、待核对 1022),八类来源清单均为完整批次 `TP202611042002170dd04dd5`,未写工资。来源业务 463、发货 7504、回款 786、来源工资输入 0、来源文档 44737,与前次基线一致。确认采集与接入队列空闲后持 T+ 命名锁核对进程身份并更新 worker;更新 API 后健康检查 app、MySQL、Redis 均通过,新 worker 心跳正常。使用原授权及起点排队新重算 `TP20261105031743af077c9d`,初查 RUNNING,处理 38 条、未写工资;须等终态后核对并验证历史未知金额,不中断或重复排队。全量单元测试 1059 项通过。
2026-11-05 终态明细复核:上一任务的 1022 条待核对包括单据未生效 695 条、来源值异常 323 条、档案唯一性冲突 4 条;按实体分别为订单 766 条、发货 217 条、回款 39 条。保留异常和冲突供核对,不将未知值补零或按名称猜测合并。已跟踪变更 `git diff --check` 通过;最新重算最近处理 801 条,心跳正常,未写工资。
2026-11-05 运行中只读核验:150 笔无发货且无工资输入的来源业务中,新重算已处理 2 笔,均已将原先错误的零运费恢复为空;其余须待任务处理完再比较。上一任务 39 条回款来源值异常均为负金额,保留为待核对,未按正向销售回款计入。以上为中途检查,不代表整批重算完成。
2026-11-05 待核对来源变更审查:[必须修复] 未正式接入的异常单据修改来源客户后,重试可能仍关联原客户却不提示变化;若随后金额修正,还可能静默进入另一客户业务。现保留原业务关联、标记客户变更冲突,并在业务详情展示新旧来源客户标识;来源恢复原客户后允许正常接入。同客户的待核对记录更新来源日期和人员信息。相关接入与 worker 单元 70 项、隔离 MySQL 两项、Ruff 和前端构建通过;当前 worker 尚未加载此增量修复。真实重算 `TP20261105031743af077c9d` 最近处理 3063 条,心跳正常,未写工资;任务结束前不重启、不重复排队。
2026-11-05 来源客户变更回归补充:订单、发货和回款均覆盖客户变更后保留原关联及来源恢复后的接入;最新全量后端单元 1063 项、隔离 MySQL 工作台完整回归 20 项通过,各有 1 条第三方弃用警告。运行服务尚未加载本次客户变更增量保护,真实重算终态与服务更新仍待完成。
2026-11-05 客户差异展示:扩展来源详情隔离模拟浏览器回归,验证待核对客户变更的原因、新旧客户标识、375 像素宽度无页面横向溢出,以及加载失败后重试;脚本通过。该模拟接口测试不等同于真实登录态浏览器验收。
2026-11-05 真实来源只读检查:按各实体最新已发布的完整批次及源单身份,检查 1022 条已关联但未正式接入单据;未发现来源消失、客户标识缺失或变化、日期无效或早于接入起点。该检查不修改记录,也不能替代新保护加载后的后续同步验证。
2026-11-05 待核对来源消失审查:[必须修复] 已关联但尚未正式接入的待核对单据从完整快照消失时,以前只保留旧异常原因,未提示来源消失。现保留业务与原记录并标记来源缺失,恢复后重新判断;无关联且未接入的排除记录不受影响。相关单元 73 项、隔离 MySQL 缺失/恢复和客户差异等两项、Ruff、前端构建通过;当前运行的 worker 尚未加载该增量修复,待任务终态后安全更新和验证。
2026-11-05 接入范围审查:[必须修复] 已关联待核对单据的来源日期移至起点之前后,旧状态可能未更新。现将其纳入差异检查,保留原关联并展示新旧日期,不生成正式单据;恢复范围后重新接入。订单、发货和回款相关单元共 76 项、隔离 MySQL 两项、模拟浏览器、Ruff 和前端构建通过;运行中的 worker 尚未加载该增量保护。
2026-11-05 最新全量回归:接入范围及来源缺失修复后,全量后端单元 1067 项、隔离 MySQL 工作台完整回归 20 项通过;各有 1 条第三方弃用警告。真实任务仍须终态验证,之后才安全更新 worker/HTTP 并验证增量保护。
2026-11-05 封存保护验收补强:隔离 MySQL 来源业务闭环在核算和月结后模拟来源发货消失,逐项比较封存 `PayrollInput` 快照、FIFO 分配、绩效台账及月结报表金额;测试和 Ruff 通过。该测试未操作当前业务库或真实工资。
2026-11-05 提交依赖核对:V30 的迁移前序为 V29,来源业务核算准备调用回款确认校验,回款模型和确认服务依赖 V29 字段;因此最终审查和提交必须连同这条功能依赖及对应 SQL、测试核对,不能仅提交 V30。工作区另有历史界面、部署及文档改动,尚须逐项区分;未暂存或提交。
2026-11-05 数量统计验收缺口:业务详情此前仅有逐条数量,缺少订单和发货的分别汇总。新增按产品、规格及单位分页统计已接入来源数量,不混加订单与发货、不称作库存;现有销售额和回款口径不变。相关单元 74 项、隔离 MySQL 分批追加/幂等及不同产品单位分页与未登录拒绝、模拟浏览器显示及失败重试、Ruff、前端构建通过;当前业务库只读抽样可查询分页。API 及 worker 仍是任务启动时版本,数量新接口尚待安全更新;前端将该区域失败隔离,保留来源单据查询。
2026-11-05 待核对业务汇总审查:[必须修复] 仅有异常来源单据的业务,MySQL 默认值可能把未知成本及运费记为零,且既有待核对单据重试时未重算。来源业务新建明确写入 SQL NULL;待核对建档和既有关联重试均重算,嵌套事务回滚清除汇总缓存。相关单元 68 项、隔离 MySQL 异常单据新建及重试回归 1 项、完整工作台隔离回归 19 项和 Ruff 通过。真实任务仍在运行,相关修复尚未加载运行中的 worker,不对真实库直接批量改写。
| 目标 | 当前证据 | 尚需确认 |
| --- | --- | --- |
| 订单先建业务,分类和成本缺失不阻断查询 | 自动接入单元与隔离 MySQL 订单接口通过;最新汇总修复已加载 worker | 真实重算终态及历史未知金额复核 |
| 分批发货回款、重复运行和差异保护 | 隔离 MySQL 追加与重试、来源冲突及保护回归通过;真实重跑数量不变且有完整批次清单 | 最新修复后的真实重算终态及数量复核 |
| 人工资料、核算准备、工资锁与报表 | 隔离 MySQL 来源业务闭环及正式核算 8 项通过;相关授权与凭证检查通过 | 不对真实业务执行工资;真实登录态核对待补入口 |
| 页面、权限与异常恢复 | 模拟接口浏览器覆盖 22 页四种宽度,日期草稿、运费和失败重试通过 | 登录后的真实后端查询、待补定位、权限与追加验收 |
| 自动排队与安全运行 | 快照去重、失败批次、撤权及恢复的单元与隔离 MySQL 回归通过;新服务健康、worker 心跳正常 | 最新重算终态及队列核验 |
| 代码审查及提交 | 已按中文审查规范修复多项问题,最新全量单元 1067 项通过,构建通过 | 核对剩余变更归属、已应用迁移风险、敏感内容与暂存差异,按授权提交,不推送 |
2026-11-05 提交前质量检查:最新代码全量后端单元 1058 项通过,1 条第三方弃用警告;清理相关模型及开发初始化脚本的行尾空格后,已跟踪变更 `git diff --check` 通过。V30 已应用迁移 SQL 内仍有行尾空格,遵循不改写已应用迁移的约束予以保留;暂存时需单独说明。未跟踪或纳入提交本地 `.env`、`.ai`、上传文件及前端构建目录。接入任务仍运行,待终态核对及后续验收。
2026-11-05 未知运费展示:发货列表将空运费明确显示为“待确认”,已确认的 `0.00` 原样显示;更新过期的手工新增业务选择器及新增接口模拟。前端构建通过,模拟接口浏览器回归覆盖 22 页四种宽度、弹窗、失败重试及未知/零运费,无页面错误、溢出或未匹配接口;这不替代真实登录态验收。真实任务 `TP20261105012515048bb39f` 最近处理 10316 条(无变化 9395、待核对 921),心跳正常,未写工资。
2026-11-05 汇总兼容回归:针对来源业务共用汇总入口的改动,在隔离 MySQL 运行手工业务编辑、发货创建/编辑/删除及回款新增删除 5 项,全部通过;未操作业务库测试数据。真实接入 `TP20261105012515048bb39f` 最近处理 9348 条(无变化 8465、待核对 883),未写工资;仍待终态后加载修复并复核。
2026-11-05 未知金额审查:[必须修复] 只有订单而没有发货时,空集合运费汇总误写为零;来源业务走手工回款/发货等通用重算路径时,也可能把未知成本和运费写成零并绕过来源销售汇总规则。现将无发货运费保留为空,已确认零仍为零;来源业务通用重算复用来源汇总,手工业务维持原口径。接入与报表单元 81 项、隔离 MySQL 订单与分批追加(含手工新增/删除回款、接口空值)1 项及 Ruff 通过。运行服务尚未加载修复,已受影响记录需新 worker 在后续接入重算;真实任务 `TP20261105012515048bb39f` 最近处理 9283 条(无变化 8402、待核对 881),未写工资。
2026-11-05 迁移与权限复核:隔离 MySQL 回款确认、无效凭证、排队后撤权及销售关系双权限专项 5 项通过。审查发现 V30 结构降级在尚无接入单据时仍可能删除自动接入设置;不改写已应用迁移,已在 T+ README 明确关闭接入、等待终态、备份并回退兼容应用版本,不将数据库结构降级当常规回退。真实任务 `TP20261105012515048bb39f` 最近处理 8396 条(无变化 7544、待核对 852),未写工资;终态核验、服务安全更新、真实登录态浏览器与提交尚待完成。
2026-11-05 页面及核算回归:审查发现自动刷新会覆盖正在填写的接入起始日期;现保留未提交草稿,远程启用后显示生效日期,隔离接口浏览器交互及前端构建通过。隔离 MySQL 正式核算回归首次为 7 通过、1 失败:测试在回款确认后修改抵顶标记却未重新确认,触发预期保护;测试补充先拒绝、重新确认后再核算的断言,重跑 8 项通过,Ruff 通过。未对业务库生成工资。真实任务最近处理 8154 条(无变化 7314、待核对 840),仍待终态及服务安全更新;真实登录态浏览器、完整审查及提交尚未完成。
2026-11-05 隔离集成回归:在隔离 MySQL `payroll_wbtest_a4815f69` 完整运行 `tests/integration/test_tplus_workbench.py`,19 项通过,1 条第三方弃用警告;未在业务库执行测试清理。真实接入 `TP20261105012515048bb39f` 最近处理 7607 条(无变化 6771、待核对 836),心跳正常,未写工资。终态核对、运行服务更新、真实登录态浏览器及提交仍待完成。
2026-11-05 全量回归:当前工作树运行 `pytest tests/unit -q`,1057 项通过,1 条第三方弃用警告;复核 T+ 队列仅有 `TP20261105012515048bb39f` 正在接入,无其他排队或运行的采集任务。接入终态、运行服务安全更新、真实浏览器登录态验收、完整变更归属审查及提交仍待完成;未清理业务数据。
2026-11-05 错误恢复审查:[建议修改] 复用已排队任务时清除设置错误未提交,手动重试成功也未清除旧授权错误。现对非失败的自动排队结果持久化清除,失败任务保留错误;当前授权人接入成功时同事务清除,其他人员不改变配置提示。业务接入单元 62 项、隔离 MySQL 去重及授权/恢复 5 项、Ruff 通过。运行服务尚未加载这些修复。真实任务 `TP20261105012515048bb39f` 最近处理 6829 条(无变化 6006、待核对 823),未写工资,心跳正常。
2026-11-05 授权状态审查:[建议修改] 自动接入任务排队后,如授权人被停用或撤权,执行端虽拒绝任务,但设置页未立即反映授权失效。现将失败状态与当前启用且授权人未更换的配置在同一事务中记录;旧任务不得覆盖新授权人的配置。相关单元 125 项、隔离 MySQL 去重/失败批次/授权人变更 3 项及 Ruff 通过;代码尚未加载运行服务。真实任务 `TP20261105012515048bb39f` 最近处理 6048 条(无变化 5242、待核对 806),未写工资;保持 worker 运行,真实浏览器仍需用户登录。
2026-11-05 自动排队审查:[建议修改] 排队去重键此前根据批次声明的实体而非实际发布批次生成;历史成功批次若未发布所声明实体,会对同一快照重复排队。现统一使用核算和接入共用的发布快照清单,正常批次保持原去重键格式;相关 123 项单元、Ruff 和前端重新构建通过。此改动尚未加载运行服务。真实任务 `TP20261105012515048bb39f` 最近处理 5311 条(无变化 4519、待核对 792),心跳正常,未写工资,终态前不重启 worker。真实浏览器当前仍在登录页。
2026-11-05 旧规则审查:[必须修复] 旧业务预览仍可按旧规则执行,可能绕开新业务接入流程。已保留历史预览/报告查询,在新请求排队与 worker 执行两处阻止旧 `BUSINESS_APPLY`,页面改为“旧业务预览”并移除执行入口;隔离 MySQL 验证历史可查、拒绝新请求及既有排队任务不写业务/工资输入,模拟浏览器验证无执行入口。HTTP 已加载该保护;真实 worker 正运行新版接入任务,其内存中的旧任务执行保护须任务终态后加载,当前检查无其他排队任务。
2026-11-05 工作区排队审查:普通工作区任务的完整性错误此前递归重试,现改为仅核对一次并发请求键,同意图复用、不同意图拒绝、其他冲突明确报错;相关 5 项单元及 Ruff 通过。该最后改动尚未加载 HTTP,待下次安全更新。真实任务 `TP20261105012515048bb39f` 最近处理 4632 条(无变化 3853、待核对 779),未写工资。
2026-11-05 来源明细对照:订单/发货单增加分页对照入口,以父单范围合并已接入和最新完整快照,展示新增、消失、变化和无变化,字段以字符串保留精度并限制白名单。覆盖分页、其他父单隔离、采集失败、未知字段变化及不泄露原文;相关 57 项单元、隔离 MySQL 接口回归、前端类型、模拟浏览器含 375px、失败重试和 Ruff 通过。前端构建通过(随后仅改动空差异提示文案);HTTP 已加载接口,最后一项“未展示字段变化也标记变化”的判断尚未加载,需安全更新后再验证。新版真实任务 `TP20261105012515048bb39f` 仍运行,最近处理 3037 条(无变化 2485、待核对 552),未写工资。
2026-11-05 01:25:幂等重跑 `TP202611042336560f8a9bee` 终态 PARTIAL,12594 条中无变化 11572、待核对 1022(未生效 695、来源值异常 323、唯一性冲突 4);未写工资。重跑后来源业务 463、发货 7504、回款 786、工资输入 0、来源文档 44737,与重跑前一致。确认所有 T+ 队列空闲并持命名锁核对进程身份后更新 worker;HTTP 已更新且健康检查通过。为生成新版快照清单,在锁内按现有配置排队 `TP20261105012515048bb39f`,已运行;首查处理 27 条,24 无变化、3 待核对。来源业务的核算准备确认提示快照待处理,须等终态再核对,不得运行真实工资。
2026-11-05:核算快照证明增加接入日期覆盖检查,接入起点晚于当前配置时拒绝核算。更新后相关单元 86 项、Ruff 与隔离 MySQL 完整核算闭环通过;旧任务无批次清单,升级后须重跑获取证明。真实浏览器登录态验收、最终审查、变更归属核对和提交尚未完成。
2026-11-05 核算快照保护:业务接入结束时记录八类来源的完整批次清单;核算准备仅认可最新已完成接入且与当前完整快照一致的清单,采集中断、接入进行中或失败均待处理。来源业务准备与正式核算取得采集同一 MySQL 命名锁,在新事务中检查并提交;手工业务沿用原流程。相关单元 85 项和 Ruff 通过,隔离 MySQL 两项通过,覆盖锁竞争、新快照发布后阻止冻结/计算、重新接入后恢复及月结报表闭环。旧版接入任务没有清单,升级后须完整重跑一次取得证明;代码尚未加载运行服务。仍须验证更多失败/恢复边界及真实任务完成后的安全升级,不认定全面审查结束。
2026-11-05 01:12:真实幂等重跑 `TP202611042336560f8a9bee` 仍运行,处理 11670 条(无变化 10687、待核对 983),心跳正常,未写工资。任务终态前不得重启 worker 或排队重复任务。
2026-11-05 来源差异:业务详情对已接入的订单/发货明细,从最近完整发布快照读取当前值,展示数量、单价、金额、产品及关联订单标识的白名单新旧差异;明细消失或快照不可用明确提示,不改已接入事实。相关 53 项单元、隔离 MySQL 接口、前端类型、模拟页面和 Ruff 通过;新代码尚未加载 HTTP 服务。此展示目前仅覆盖已有明细,新增来源明细的定位仍需完善。
2026-11-05 审查待解决:[必须修复] 完整快照发布后、业务接入处理前,`readiness` 和核算准备目前主要检查正式来源文档状态,可能尚未识别新的快照差异;`prepare` 未见与采集/接入共用互斥锁。需验证并关闭并发窗口,涵盖新增、修改、删除、采集中断与排队失败,不允许覆盖已封存结果;在此之前不得认定正式核算闭环通过,也不执行真实工资操作。
2026-11-05:新建隔离 MySQL `payroll_wbtest_a4815f69`,来源不一致新旧数据、报表待核对及既有分批同步回归共 3 项通过;测试为隔离库及隔离上传目录,未对业务库执行清理。首次迁移往返尝试在 V22 授权保护处拒绝继续回退,已保留授权数据并将隔离库重新升级到 head;本次不声称完整迁移往返通过。隔离运行器补齐测试库和上传目录校验参数。真实重跑最近处理 9040 条、无工资写入,worker 未中断,最终幂等和新版 worker 加载仍待完成。
2026-11-05 审查补充:发现发货仅按订单明细编号归并时,产品或订单父单不一致可能漏计销售额。新增来源一致性检查:新单据保留并标记冲突,历史错误关联重跑时保留正式数据并标记冲突;业务与报表按待核对隐藏不确定汇总。对应回归含新旧数据、无工资写入,相关单元 74 项、Ruff 和前端类型检查通过。尚需隔离 MySQL 验证、重跑终态后安全更新 worker 并核查真实数据;不能认为完整审查已结束。
2026-11-05 00:19:幂等重跑任务仍运行,已处理 5413 条(无变化 4619、待核对 794),心跳正常,未写工资。当前 worker 仍为旧版本,不能在运行中重启;最终数据数量及差异需任务终态后核对。
2026-11-05 00:08:重跑任务已进入发货阶段,最近处理 4329 条(无变化 3552、待核对 777),未写工资;来源字段对照增加白名单及空值回归,相关 6 项单元和 Ruff 通过。任务仍运行,不提前判断全量幂等。
2026-11-05:来源详情增加允许展示的表头字段新旧对照,涉及明细变化但表头无法对照时明确提示继续核对,不输出原始 JSON。隔离 MySQL 接口、模拟浏览器、前端构建及 Ruff 通过;HTTP 服务已更新,健康检查应用、MySQL、Redis 均正常。重跑 worker 未重启,新增人员及单号差异检测须等运行任务结束后加载。
2026-11-05:来源单据详情增加当前来源单号,与已接入单号并列以定位差异;隔离 MySQL 端到端、前端构建及模拟浏览器显示和失败重试通过。此接口和 worker 差异检测仍待运行任务结束后安全更新。
2026-11-04 复核补充:来源订单、发货和回款的原单号变化原先未进入差异,现保留旧单号并标记差异,来源恢复后恢复关联;针对原单号和回退经办人变化的单元 6 项、隔离 MySQL 接口/同步回归、手工毛利润接口 4 项及 Ruff 通过。只读单次测量:463 条业务环境下列表约 0.23 秒、报表约 4.57 秒,非并发或 P95 验证。新差异检测尚未加载到运行中的 worker,等待当前重跑终态后处理。
2026-11-04 复核发现并修复来源订单/发货使用 `idperson` 回退时,经办人变更未标记差异的问题;保留既有指纹格式与历史归属,兼容旧文档缺少人员投影的情况。相关 worker 和接入单元 49 项及隔离 MySQL 回归通过。重跑任务仍使用启动时的旧 worker 代码,最近处理 2111 条(无变化 1711、待核对 400),未写工资;须在任务完成后安全更新 worker,再核实本次修复,不能中断当前任务。
2026-11-04 补充:人工关系既有结论增加原发货和订单明细标识,相关 42 项单元、隔离 MySQL HTTP、模拟浏览器、前端构建及 Ruff 通过。该最后一项 HTTP 变更尚未加载到运行服务,避免频繁中断用户操作,待下一次安全更新;重跑仍在执行,最近检查 672 条(无变化 523、待核对 149),未生成工资输入。
2026-11-04 23:36:确认首次任务终态且队列空闲后,在 T+ 互斥锁内更新本机 worker,并更新 HTTP 后端;健康检查应用、MySQL、Redis 均通过,新增核对接口已加载。重跑前基线:来源业务 463、来源发货 7504、来源回款 786、来源工资输入 0、来源文档 44737。相同快照重跑任务 `TP202611042336560f8a9bee` 已排队并运行,起始数据为无变化 34、待核对 4;须等待终态后比较基线,不能凭起始进度声称幂等。毛利润去重与来源失效的隔离 MySQL HTTP 回归通过;正式浏览器仍等待用户登录。
2026-11-04 首次接入终态:任务 `TP20261104211703434853fc` 为 PARTIAL,共 12594 条,新增 11572、待核对 1022;新增包含订单 3282、发货 7504、回款 786。待核对包括单据未生效 695、来源值异常 323、目标唯一性冲突 4;未写入工资输入。隔离 MySQL 来源接入至核算、月结与报表闭环通过。审查中发现人工核对为订单发货后毛利润类别汇总仍重复计入,已修正并以订单发货、独立发货及关联失效测试验证;最新前端构建通过。真实任务重跑与服务更新、真实浏览器、完整审查和提交仍待完成。
2026-11-04 回归补充:T+ 工作台、模型与连接文件单元测试 414 项通过;来源详情加载失败及重试的模拟浏览器回归通过。首次真实接入已进入回款阶段,最近检查累计 12001 条,其中待核对 993 条,未写入正式工资,仍需等待终态。
2026-11-04 回归补充:业务同步、后台 worker、报表及正式核算单元测试共 90 项通过;隔离 MySQL 验证业务更新和核算准备权限缺一不可、同时具备可进入业务校验。真实浏览器现处于登录页,已请用户完成验证码,尚未进行真实登录态验收。
2026-11-04 补充:人工关系组件的模拟浏览器回归覆盖跨候选页选择、确认、撤销、权限不足、加载失败重试及 375 px 窄屏;隔离 MySQL 的候选分页和 HTTP 核对闭环通过。真实浏览器与运行服务升级仍待接入任务终态后验证。运行中只读统计显示待核对主要是单据未生效及来源值异常,并有少量目标唯一性冲突;尚非最终统计。
2026-11-04 续:订单与发货人工关系新增候选分页、确认和追加式撤销接口及业务详情入口;变更需业务更新和核算准备双权限,不改历史快照。修复来源单据和候选接口的查询参数解析;后端业务同步单元测试 42 项、隔离 MySQL 的 HTTP 确认/撤销/重确认及来源查询、双权限拒绝测试、前端构建和相关 Ruff 检查通过。真实接入任务 `TP20261104211703434853fc` 仍运行,最近检查已处理 10757 条且未写入正式工资;运行中的 HTTP 服务与 worker 尚未加载本轮代码。真实浏览器、接入终态与重跑幂等、完整审查及提交仍待完成;不能将本轮测试视作整项计划验收。
用户已批准完整实施:2026-03-01 起自动建档并持续追加,包含名单外人员业务;缺人工资料仅阻止核算,不阻止查看和建档。
1. 回归与兼容:订单先建业务、可空分类与运费、来源关联和查询索引;不覆盖既有修改。
2. 自动接入:独立 BUSINESS_SYNC 后台任务、来源防重、差异保留、权限复核及设置/回填预览。
3. 业务操作:来源单据、待补清单、统一资料维护与核算准备,沿用 FIFO/历史岗位/封存/月份锁。
4. 验收:单元、隔离 MySQL、真实浏览器与完整核算闭环;先只读预览当前库再启用开发接入。
5. 交付:保留手工及演示数据;不操作客户生产或真实工资,不推送;完成审查、修复及验收后按用户授权提交本任务代码。迁移开关默认关闭,回退保留已接入数据。
状态:实施中;尚未记为验收通过。前端类型检查与构建通过;相关单元测试 27 项通过,覆盖旧快照索引、订单/发货/预收归并、多人归属、差异保护、追加发货封存版本、凭证状态与人工确认、金额精度及采集与接入错误隔离。独立 MySQL 从空库升级至 head,工作台集成测试 6 项、旧快照索引专项测试及来源接入→资料补充→回款确认→核算→月结→报表核对通过;最新隔离库为 `payroll_test_e619969b1641`,此前的 `payroll_test_6b28bc9f4481` 已不存在。浏览器模拟接口验证来源运费提交、历史明细只读、新发货可编辑及三种窗口宽度通过;尚未用真实后端完成浏览器验收。当前 T+ 全量采集仍在运行,不重启采集 worker;业务自动接入尚未启用。采集完成后还须验证真实快照与只读回填预览;正式代码审查及提交仍未完成。
补充:修复来源回款的 `idclerk` 为空时未回退 `idperson` 的人员显示问题;来源人员档案缺失时保留来源标识并显示待匹配,不赋予岗位。相关 28 项单元测试及前端类型检查通过。2026-11-04 本机业务库为 `payroll`,T+ 账套为 `UFTData472115_000001`;自动采集已启用,运行中任务有心跳。该开发配置使用高权限账号并信任服务器证书,不能作为正式生产安全验收依据。
核算准备已改为按发货月份核对业务员及分管经理岗位,支持经确认的历史经理转岗记录,并将历史依据写入冻结输入;无相应岗位依据继续拦截。接入、历史岗位及任务迁移相关 38 项单元测试通过,真实快照及真实浏览器验证仍待完成。
后台排队发生完整性错误时,仅对并发请求键进行一次核验;不匹配或无已有任务时返回冲突,避免无限递归。含同请求、不同请求和其他约束错误的相关测试共 41 项通过,Ruff 通过。
补充来源差异保护:已接入单据在最新完整快照消失时保留正式数据并标记差异;日期被改到接入起点之前也进入差异核对,原单恢复且内容一致时恢复关联状态。页面和报告展示具体原因。相关单元 43 项、前端类型检查、Ruff 通过;复用隔离库 `payroll_test_e619969b1641` 的 MySQL 两项测试通过,验证已结算台账与报表不变。因并行采集期间磁盘负载较高,新建隔离库 `payroll_test_cd9927ab85a2` 的重复空库迁移中途停止并保留,未在该库执行测试;不清理任何业务数据。
基础数据客户和产品列表新增待分类筛选,客户列表支持待归属筛选;空分类显示待确认,前端类型与接口空值一致。相关单元测试 44 项、前端类型检查及 Ruff 通过。基础数据跨业务批量补充及真实浏览器验收尚未完成。
客户及产品列表新增批量补充分类:仅允许选择未分类档案,权限及分类值在服务端复核,任一档案变化则整批拒绝;产品分类同步未冻结业务的空明细分类,不改写已冻结明细。相关单元测试 46 项、隔离 MySQL 权限/筛选/冲突专项 1 项、前端类型检查、Ruff 及浏览器模拟接口的两页交互通过。客户归属批量补充、真实后端浏览器验收仍待完成。
客户待归属支持同一人员批量补充,服务端复核在职状态和逐条归属为空,单条/批量变更使用行锁并逐条留痕;历史输入快照不改。相关单元 47 项、隔离 MySQL 客户管理及批量权限专项 19 项、Ruff、前端类型及模拟浏览器交互通过。
第二次全量采集 `TP202611042002170dd04dd5` 已成功,读取 933203 条、失败 0。当前完整快照只读预览:2026-03-01 起候选订单 4048、发货 7721、正向收款 825;已有接入差异 0。以上是来源单据候选数,不等于实际新增业务数或实际冲突数;预览尚未充分预测档案身份冲突,不能据此直接认定可安全批量接入。自动业务接入尚未启用;真实后端浏览器、完整审查和提交待完成。
预览现增加客户/产品候选范围和来源身份风险检查。真实快照只读结果:候选客户 463(尚无业务关联 463,客户身份警示 0);候选产品 1852(尚无档案关联 1852,其中 26 个来源标识存在同名同规格风险)。预览约 13.9 秒,不创建档案;名称预检不能覆盖全部数据库排序规则和单据有效性,数字不是最终新增或冲突量。相关单元 49 项、隔离 MySQL 两项、前端类型及 Ruff 通过。旧 worker 尚需在空闲时安全更新后才能执行新接入代码;尚未启用自动业务接入。
真实快照中部分明细为非正数或超出字段精度:按单据去重统计,订单有 96 张含非正金额、1 张含缺失/异常金额、2 张含超精度数量;发货有 199 张含非正数量、207 张含非正金额、5 张含超精度数量(不同集合可能重叠)。异常单据在可识别客户时关联待核对业务,不创建虚假正式发货;产品身份冲突只阻止对应单据。相关单元 51 项和隔离 MySQL 异常事务专项通过。
2026-11-04 21:17:全量采集完成后,在命名互斥锁内确认队列为空并更新 worker;新 worker 心跳正常。按批准计划启用本机业务自动接入(起点 2026-03-01,配置版本 1),首次任务 `TP20261104211703434853fc` 正在运行,初查已处理 9 张,新增 8、待核对 1;未写入正式工资。任务尚未结束,不得将进度等同于验收结果。HTTP 服务尚未更新到当前代码,真实浏览器验收、接入完成统计、审查与提交待完成。
2026-11-04 21:27:HTTP 服务已更新并确认健康;首次业务接入仍运行,已处理 1456 条(新增 1180、待核对 276),心跳正常,未写入正式工资。业务详情补充客户分类增加行锁和已有分类冲突检查;隔离 MySQL 来源接入至月结闭环及冲突回归通过。该增量代码尚未更新到运行中的 HTTP 服务;需在安全时机更新并验证。接入终态、真实浏览器验收、完整审查及提交仍未完成。
2026-11-04 21:35:首次业务接入仍运行,处理 2546 条(新增 2074、待核对 472),未写正式工资。业务详情补产品分类时复用基础档案规则,补齐其他未封存业务的空明细,保留已封存明细;相关单元 37 项、隔离 MySQL 两项及 Ruff 通过。真实浏览器独立标签进入登录页,等待人工完成验证码后继续验证;尚未完成终态核对、审查及提交。
2026-11-04 21:39:业务核算准备增加最近封存口径的可参与平账回款展示;未封存、来源冲突或需刷新时显示待确认,无凭证排除项不计入,实际计提仍以期初与 FIFO 为准。相关单元 38 项、隔离 MySQL 闭环、前端类型检查及 Ruff 通过。首次接入运行中,已处理 3227 条(新增 2629、待核对 598),未写正式工资;新代码尚未更新到运行服务,真实浏览器及终态核验待完成。
2026-11-04 21:42:来源详情加载失败时清除旧单据并提供重试;模拟接口浏览器回归和前端类型检查通过,真实后端浏览器仍待登录验证。首次接入仍在运行,处理 3617 条(新增 2939、待核对 678),心跳正常,未写正式工资。
2026-11-04 21:44:仅更新 HTTP 后端至最新代码,健康检查确认应用、MySQL、Redis 可用;独立业务接入 worker 未重启,处理 3777 条(新增 3057、待核对 720),心跳正常。真实浏览器、接入终态、审查及提交仍待完成。
2026-11-04 21:51:新增订单后两批发货与回款、逐批重试的单元及隔离 MySQL 回归,均验证业务唯一、金额不重复、无核算输入,Ruff 通过。真实任务已完成 4048 条订单处理并进入发货阶段;累计 4295 条(新增 3518、待核对 777),心跳正常,未写工资。
2026-11-04 21:58:审查发现订单与无法匹配订单明细的发货并存时,旧汇总可能漏计发货;缺关联时也不能直接相加,否则可能重复。新代码将销售额和毛利润标为待核对并阻止核算,重跑可重算旧业务;相关单元、隔离 MySQL 两项和 Ruff 通过。首次任务仍运行旧 worker,累计 5104 条(新增 4316、待核对 788);任务结束前相关业务金额不得视为核算依据。尚须安全更新 worker、重跑并核验受影响业务,且需补充关联核对处理入口,不能将当前保守拦截视为完整解决方案。
2026-11-04 22:09:HTTP 端实时检测订单与发货关系,隐藏不确定销售额和成本、毛利润显示待核对;正式核算重新检查来源冲突和核算版本,不能绕过已封存资料后的变化。相关单元 66 项、隔离 MySQL 冲突/恢复及关系查询、Ruff 通过,HTTP 已更新且健康。旧 worker 仍执行首次任务,累计 6089 条(新增 5282、待核对 807);需继续实现人工关系核对、更新 worker 并重跑,未宣告完成。
2026-11-04 22:22:业务统计与 Excel 导出对关联不明的销售额显示待核对,筛选范围内有异常时合计不再按零或旧值汇总;单元 19 项、隔离 MySQL 跨页汇总、前端类型与 Ruff 通过,HTTP 已更新并健康。首次任务运行中,累计 7333 条(新增 6502、待核对 831),未写工资。人工确认入口、更新 worker、终态重跑及真实浏览器验收仍待完成。
2026-11-04 22:30:新增只读关联候选接口,按业务明细列出金额、数量与产品一致的发货和同产品订单候选,限制分页与候选数量,候选并非自动匹配;冲突来源发货不进入候选。单元、隔离 MySQL 接口及 Ruff 通过。该接口尚未接入页面和运行中 HTTP,人工确认、版本化依据及结论失效校验仍未实现。首次任务运行中,累计 8004 条(新增 7165、待核对 839),未写工资。
2026-11-04 22:37:增加人工关系确认的内部服务及不可变事实版本,校验明细、来源单据指纹、乐观版本和同一发货重复使用,保留依据,使用现有 T+ 互斥锁;单元及隔离 MySQL、Ruff 通过。该服务尚未对外开放,确认事实尚未接入金额判定、失效检查、页面与重算,因此核算仍保持待核对。首次任务运行中,累计 8892 条(新增 8020、待核对 872),未写工资。
---
# 当前计划:更正单闭环与备份恢复(2026-11-03)
依据用户本轮授权、第二版确认单 E9 及已接受聊天方案;抵顶按用户 11-03 指令线下处理。复用 TPlusFact 的不可变版本及既有导入、FIFO、调整单,不另建重复事实表。没有 Paperclip 议题连接,计划在本文件原位维护。
1. 更正单:一正一负销货单成对登记,核对源身份、不同客户、金额相抵、原平账组和回款归属;原子写事实,保留依据,拒绝单边排除及重复配对。
2. 贯通预演与正式导入:排除更正发货,B 实际回款按原身份和到账日归 A;重复同步不重复计提,源版本变化重新核对;已生成工资只允许既有当月调整单。
3. 页面:T+ 工作区提供成对选单及回款归原业务入口,事实及处理结果可查,沿用角色权限。
4. 运维:修复全量快照位点、活动 binlog 归档、完整性及链连续性检查,增加 Windows 可用入口和定时安装包;恢复演练仅独立容器/卷,不覆盖任何业务库。
5. 验收:错误配对、同 ID 不同实体、幂等、防重、正式 FIFO/工资锁测试;全量+更新后增量隔离恢复证明;Ruff、前端构建、页面验证。生产迁移/覆盖恢复/提交推送不在授权范围内。
状态:开发和隔离验收完成。105 项相关单元、37 项真实 MySQL 集成、前端构建及 Edge 4 组检查通过;真实全量+两段 binlog 增量隔离恢复逐值核对通过。目标机计划启用与实际工资金额验收另行执行。交付见 `docs/更正单与备份恢复交付_2026-11-03.md`。
---
# 历史计划:完整权限管理与操作体验(2026-11-02)
按用户后续明确选择更新:角色管理配置权限,用户管理分配角色,取消个人覆盖与全局制作人绑定;管理员拥有全部功能权限,月份锁、实际经办人和审核节点保护保留;轻动效尊重减少动态效果。
1. 权限目录与数据:复用 RBAC 表与授权版本锁;V22/V25 已应用,本轮隔离库升级 V26,本地 V26 由并行角色改造任务继续应用。
2. 授权闭环:角色分模块配置、用户分配角色、只读继承预览、修改摘要与审计,移除重复授权入口。
3. 后端接入:所有接口默认拒绝未登记权限,查询/写入/导出/元数据/后台任务均检查,保留工资业务约束。
4. 前端接入:菜单/路由/按钮共用权限,提供详情与只读提示,撤权无需重新登录,避免无权限重定向循环。
5. 验收交付:管理员、只读、区域角色、工资角色四类账号真实浏览器 6 项通过;完整单元 893 项、隔离专项 31+52 项、Ruff、类型/构建通过,使用说明同步。
旧计划及外部验收项保留如下;本轮不提交或推送、不启用生产或源自动采集、不生成真实工资。当前账号授权不再以绑定全局制作人为前置条件;客户环境授权仍须单独配置。
---
# 历史计划:同步运维自动化与真实样本验收(2026-10-30)
> 2026-11-02 规则来源更新:先读 `docs/业务规则时间线与当前口径_2026-11-02.md`。客户第 03 项已按第二版具体场景及聊天接受方案确认;旧“讨论后答复”已被后续内容补齐。内部实现与验证、实际资料及部署验收分别跟踪,不将泛化多原单分摊或任意日期覆盖列为当前客户前置条件。
依据本轮批准的 T1~T6 实施;下方正式工资及历史计划保留,当前状态以本节和开发记录为准。
1. T1 已形成恢复库只读样本核对包,源单据、有效凭证、工号、候选期初与费用证据可追溯;2017 年初始化不直接当 2026 年切换余额。
2. T2/T3 已实现每周九类原始采集、同周防重、手动协调、停机补最近一周、5/15 分钟最多两次明确断连重试、独立心跳和站内提示;生产自动化默认关闭。
3. T4 已交付 Windows 计划托管包、预演、账号/ACL 校验、检查及停用;本机隔离进程验证通过,客户账号、实际注册、开机及三次恢复留待专用目标环境验收。
4. T5 保持待资料:用户明确没有该样本人工指导成本;不替换为源成本或零成本,不重复索要同一资料。分类、费用、期初/历史及分管只核对本组,普通运维开发继续。
5. T6 已完成 784 项单元、405 项完整隔离集成、V21 迁移往返及 16 项专项、Ruff、类型构建及合成接口真实浏览器验证。自动化开发、真实金额验收和生产启用分别记录。
当前迁移 head 为 `21f2a3b4c5d6`,新增 V20/V21,不重写已应用迁移;仅隔离库执行。操作说明:`scripts/windows/README.md`;详细证据:`docs/同步运维自动化与样本核对开发记录_2026-10-30.md`。
后续跟踪已确认更正场景的配对/排除校验、前端选择及完整流程验证,以及 2008 R2 实机、目标环境恢复链及生产安装启用。通用多原单自动分摊和任意日期覆盖不作为当前客户待答复任务;未来实际出现未覆盖场景时再核实。既有节点 5 实现记录不替代当前缺口验证,未完成事项不因历史测试通过而勾选完成。
---
## 前一阶段计划与证据(保留)
# 当前计划:正式工资闭环与项目收尾(2026-10-30)
## 本次分节点执行计划与状态
### 节点 1:基线与范围确认(已完成)
- [x] 接续既有 `tasks/plan.md`、`tasks/todo.md` 和 `.ai/` 上下文,不覆盖未完成计划。
- [x] 核对当前代码、迁移、测试与部署脚本,区分仓库内可完成项和必须依赖客户/目标环境的验收项。
### 节点 2:正式工资与 T+ 正式衔接(已完成)
- [x] 正式业务导入写入来源关联、输入版本和幂等保护,并衔接发货、回款与正式 `PayrollInput`。
- [x] 正式 FIFO 逐段分配、期初先冲、预收、起付比例、重算级联、固化分管/交接和经理本人排除已落地。
- [x] 月份首次生成锁、实际制作人限制、审批默认关闭、已生成工资走当月调整单已落地。
### 节点 3:运维交付能力(已完成)
- [x] 每周自动排队、有限重试、心跳、停止标记和异常概况已实现。
- [x] Windows 托管任务安装/管理/启动器及隔离运行验证已通过,默认禁用且不写入凭据。
- [x] 全量与增量备份脚本改为永久留存口径,恢复演练脚本覆盖全业务表并对查询失败判为失败。
### 节点 4:最终验证与证据(已完成)
- [x] 后端单元测试:`786 passed`。
- [x] 隔离数据库集成测试:`406 passed`,失败 0、跳过 0。
- [x] Ruff、前端 `vue-tsc`、Vite 生产构建和托管脚本隔离验证通过。
- [x] 保留 Starlette/httpx 既有弃用提醒和 Vite 大包体积提示,均不影响本次功能验收。
### 节点 5:更正场景收口(已完成)
- [x] 新增版本化 `CORRECTION` 事实,校验一正一负配对标识。
- [x] 更正发货保留源快照并在预演/正式导入中排除绩效;跨客户回款按原业务标识归入,并在原客户侧自动排除。
- [x] 补充前端事实录入、FIFO 单元测试和事实校验测试;客户确认的示例处理已落地。
### 节点 6:外部验收交接(待外部条件)
- [ ] 真实样本补齐分类、指导成本、运费、期初/历史已处理金额和归属依据后,完成逐笔金额核对并扩大到整月。
- [ ] 绑定目标环境实际工资制作人账号并验证生产权限;当前不使用测试账号代替生产授权。
- [ ] 在 SQL Server 2008 R2 `10.50.1600` 目标环境完成连接、查询和兼容性实测。
- [ ] 在客户目标环境完成周同步、服务托管、告警与全量/增量恢复演练。
节点 6 依赖客户资料、目标数据库和部署授权,不能用本地测试结果代替;其余仓库内开发任务已完成并进入交付等待。
用户已批准实施四阶段计划;以下原 Docker 预演计划及未完成项保留,最新业务约束以本节及客户新回执为准。
1. 权限与隔离:实际账号绑定制作人;测试库名称、显式标记和真实引擎目标同时校验;月结草稿首次成功生成即锁定该月分配,生成失败不锁,审批不解锁。
2. 正式导入:复用源快照、稳定源身份、队列及预览指纹;新增 BUSINESS_PREVIEW/BUSINESS_APPLY。重复导入跳过,新增单据追加输入版本,旧金额/日期变化保留冲突。
3. 正式核算:共享 FIFO 内核、期初先冲、预收待发货、60%起付与 R×R;正式台账逐段计提/应付差额独立记录;从指定月起可级联重算尚未生成工资的后续月份,已生成工资走当月调整。
4. 归属与输出:每次发货对应业务员与当时分管经理,离职承接未发部分;经理本人业务排除。月结、报表与导出使用固化依据,调整单结构化关联原台账及分管。
## 新回执对计划的修订
来源:`docs/客户补充回执核对_2026-10-30.md` 与原回执副本。
- 第01项已明确:同一 T+ 发货客户名头下的合同合并为一笔业务平账。正式导入按账套内客户身份聚合,保留发货层的人员/分管/交接;不再要求每合同单独平账。
- 第02项已明确:固定取发货月份指导成本,录入完成后封存,后续跨月回款不变价。
- 第03项已确认一正一负更正单排除绩效、跨客户回款归入原业务;多原单金额分配与通用日期更正仍只阻塞相关特殊分支。
- 第04项为“不涉及”:不新增保证金、代收款计提。
- 第05项最新截图已明确:保留审核能力但默认关闭;关闭时工资生成即完成且不留审批痕迹,开启时使用原财务/领导流程。
## 验收与交付
新增 V18/V19 迁移、输入版本、FIFO明细与生成锁;迁移只能在隔离库验证,正式目标环境执行另按授权边界。已实现不等于已验收:完整单元、隔离集成、类型/构建及浏览器检查的最终结果统一记在开发记录。真实样本尚缺实际资料,不填默认成本、余额或虚假验收结果。
后续保留:多原单更正、SQL Server2008R2兼容、自动周同步、服务托管、告警、目标环境全量/增量恢复演练。备份文件不再按旧30天默认自动清理;本轮未运行清理或恢复脚本,不启用生产连接,不提交/推送。
---
## 上一阶段计划与原验收记录(保留)
# 下一阶段开发计划:Docker 基础导入与核算预演
日期:2026-10-29。按本轮用户批准计划实施。此前计划原文保留在 [历史计划](archive/2026-10-28-tplus-pre-docker-plan.md),已有未提交内容一并保存。
## 本轮目标
恢复原 Docker 数据环境,先完成有依据的基础数据导入,再提供可追溯、可重跑的核算预演。预演不进入正式工资、月结、审批和发放。SQL Server 2008 R2 10.50.1600 兼容验收后置;虚拟机安装和屏幕控制不在关键路径。
## 已确认的开发约束
- 发货、到账日期取销货单、收款单的单据日期;销售和指导成本均含税,销售额剔除运费。
- 绩效成本使用人工月度指导价,T+ 成本只留源快照,不导入绩效成本。
- 回款采用明确分组内的 FIFO,不再强制合同关联;组范围、期初及历史已发款未明确时分别待补。
- 人员按18人回执核对,工号保留前导零;不自动指定直属经理,不按姓名合并。
- 仅导入客户性质往来单位,客户和产品核算分类允许人工维护,不做单位换算。
- 经理本人业务排除;交接与经理分管保存独立事实,不覆盖当前人员关系推算历史。
- 特殊抵顶继续线下;不创建清理任务,不新增生产账号或权限。
- 全量读取、主键分页、哈希去重继续复用,时间增量关闭。源账号无写权限。
## 实施顺序与验收
| 阶段 | 已实施内容 | 验收信号与仍缺条件 |
|---|---|---|
| P1 环境及基线 | 原三容器恢复、九类源数据读取、当前指针、只读权限核验 | 当前源933203行;新增103359个历史版本来自补读单位、客户属性及凭证关联字段。2026-10-30原生ODBC连接、九类抽样和原worker重读已验证通过 |
| P2 规则与字段 | 日期、含税、客户性质、单位、人员名单核对;业务答复与字段证据分列 | 已核实收款到总账凭证的关联;13107张已有有效凭证、75张无关联不纳入本次预演,不以审核状态代替生成 |
| P3 基础导入 | 预览、执行、唯一源关联、人工字段保护、指纹失效、异常重试 | 实际17人导入,工号101124待核实;产品分类、客户属性不足的行保留待补 |
| P4 FIFO与预演 | 期初先冲、预收、逐段分配、冻结重跑、交接、经理排除、页面与CSV | 功能验证与客户验收分开;真实指导价、分组和历史资料不足,不能宣称整月工资对账通过 |
## 最小数据与接口
V16/V17新增五张工作区表,head为 `07b8c9d0e1f2`。复用现有 `/api/v1/system/tplus` 和worker,新增事实及历史、源编号选择、工作区任务、分页明细和报告。正式核算表与预演表分开保存;原快照重跑不读取后来的成本、分类和参数。
## 业务并行事项
1. 平账范围:同客户统一还是按项目分开。
2. 指导价:单位或总成本、发货月或回款月、历史处理。
3. 历史承接:2026-02-28分组应收、已核算及已发款、8月参数。
4. 交接及经理分管:时间、业务范围、双方人员与发货归属。
5. 其他更正及特殊款:日期更正、保证金与其他职责;B04已于2026-10-30明确月度工资生成前可改、仅制作人可改、差额归调整单生成当月,不再追问。
6. 逐笔复核:先以一个资料完整的平账组核对,再扩到整月。
未决条件只阻塞相关分支;已明确的日期、含税、指导成本与工号不重复询问。客户表见 `docs/核算预演补充确认清单_2026-10-29.xlsx`。
## 首轮结束标准
真实数据可导入,逐笔过程可核对,缺口能定位。完成定点、受影响模块、隔离迁移/集成回归、前端类型/构建和浏览器检查后交付。客户逐笔验收、原生驱动、2008R2兼容与生产部署分别记录,不混为完成。
验证细节见 `docs/T+基础导入与核算预演开发记录_2026-10-29.md`;任务状态见 `tasks/todo.md`。本轮不提交或推送,保留既有修改。
## 2026-10-30首轮样本与新回复
- 用户已授权按推荐选样本:辽阳精诚物业管理有限公司,2026-03,销货SA-2026-03-0034与收款SK-2026-03-0016各1125元;一个产品、一位业务员,关联凭证0035。
- 已登记候选平账组pilot-9395-202603并运行待补预演;未确认开关保持关闭,未填默认指导成本、分类或期初余额。
- B04新答复记录见docs/二次分配修改规则确认_2026-10-30.md;更正示例另按 `CORRECTION` 事实实现,不自动扩大至任意日期更正。正式工资入口按该规则的实现与验收已列节点 2、节点 5。
- 真实字段核查纠正:SA_SaleDelivery.isCancel为结清状态枚举(428未结清、180已结清),不是作废布尔值;预演改按voucherState生效与实际红冲标志判断。