PayrollManagementSystem/backend/app/services/tplus
liuwenxin 71b7846a79 refactor(后端): 将工资与工作区业务逻辑下沉服务层
将月份状态、资料输出、调整单编排及工作区查询、
CSV 生成移至现有服务层,路由仅绑定参数并返回响应。

保持接口路径、参数、响应模型和权限依赖一致,
补充九项内存库行为回归并同步测试记录。
2026-11-02 09:42:55 +08:00
..
__init__.py feat(tplus): 新增 T+ 只读同步服务与同步管理 2026-10-28 11:42:15 +08:00
automation.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
business_import.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
calculation_preview.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
errors.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
fifo.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
mapping.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
master_import.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
materials.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
query_service.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
reader.py feat(tplus): 新增 T+ 只读同步服务与同步管理 2026-10-28 11:42:15 +08:00
README.md feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
relationship_audit.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
report_labels.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
snapshots.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
source_heads.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
staging.py feat(tplus): 新增 T+ 只读同步服务与同步管理 2026-10-28 11:42:15 +08:00
sync_service.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
task_service.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00
workbench.py refactor(后端): 将工资与工作区业务逻辑下沉服务层 2026-11-02 09:42:55 +08:00
worker.py feat(核算)!: 添加 T+ 正式核算与采集托管 2026-11-02 09:42:53 +08:00

T+ 读取、基础导入与核算预演

AI 摘要:读取外部 SQL Server 的原始快照,并管理持久化任务。关键文件为 task_service、worker、sync_service、relationship_audit 和 query_service;管理员 API 为 /api/v1/system/tplus。

职责与边界

  • task_service 创建/重试任务,控制请求幂等和事务,保留原批次与异常;HTTP 不执行源库长查询。
  • worker.run_once 取得 MySQL 执行锁后恢复中断任务、领取一个任务;读取和关联核验共用锁。
  • sync_service 主键分页读取白名单实体,每页保存原始快照,相同源 ID 和行哈希去重。
  • relationship_audit 执行 db/queries/tplus/audit/queries.sql,只返回系统字典和数量;按收款方向与单据类型核对关联。
  • query_service 分页元数据,按需加载白名单报告;不返回原始 payload、驱动异常或源配置。
  • source_heads/snapshots 记录全量读取的当前源版本,包含哈希去重的 A→B→A;中断任务不发布部分指针。
  • master_import 按人员、产品、客户预览及导入;源、事实、目标变化时拒绝旧预览,保留人工核算字段。
  • workbench 保存人工事实版本、幂等任务和逐行结果,与原 worker 共用锁;fifo/calculation_preview 固定快照并计算隔离预演,支持原快照重跑。

主要入口

管理员 API 提供概况、批次/异常分页、详情、创建与失败重试。CLI 为 python -m app.cli tplus-worker --once/--watch;原 tplus-stage --entity personnel 可继续直接读取。

连接配置、启动命令和异常处理参见项目 docs/T+本地恢复与同步开发手册.md。后端与 worker 必须指向同一 MySQL 业务库和 T+ 账套,查询文件随部署交付。

应用与兼容性脚本共用 Settings.t_plus_database_url 和连接文件校验;分号、花括号由 SQLAlchemy ODBC 方言转义。默认启用加密,失败不自动降级;既有私有配置需要按运行手册核对。管理页面不返回原始数据,但暂存 JSON 的生产敏感字段保护仍待 S1 决策。

验收限制

本轮允许已确认的人员、产品、客户进入基础表;不写正式业务、发货、回款、绩效台账、月结、审批或发放记录,不推进时间水位。源库始终只读。日期、含税和人工指导成本已明确;生成凭证资格已按ARAP01来源与有效总账凭证关联核实,未审不等于未生成;平账范围、取价时点、历史余额、特殊更正仍按记录分别待补。

Docker 是当前开发主线,2008 R2 10.50.1600 验收后置;2022 副本不能替代同版本实测。实际导入结果、接口、缺驱动处理及启动方法见 docs/T+基础导入与核算预演开发记录_2026-10-29.md,字段证据见同日字段与规则差异表。

正式工资闭环扩展(2026-10-30,优先于上方上一阶段边界)

已新增 BUSINESS_PREVIEW/BUSINESS_APPLY,允许核实后导入正式业务、发货和回款,正式核算通过独立工资入口执行。源 SQL Server 仍始终只读。新版按同一发货客户名头统一平账、按发货月份指导成本封存;不再按合同拆组或要求重复确认成本月份。

制作人身份由现有账号ID显式配置;审核能力保留但默认关闭,关闭时工资生成直接完成且不写审批步骤。多原单更正仍待讨论。字段、接口、迁移和最终验收边界见 docs/正式工资闭环开发记录_2026-10-30.md,客户回执原文见 docs/客户补充回执核对_2026-10-30.md。

自动采集与样本核对(2026-10-30)

automation.tick 通过 tplus-maintain --once 排队最近到期周的九类原始采集,默认每周一北京时间 02:00 且关闭。明确断连/超时最多两次自动重试,间隔 5/15 分钟;部分失败、配置/资料错误及正式导入不自动重试。人工重试结果接入同一周期,独立心跳不受长查询阻塞。概况的 automation 提供状态及异常,不暴露连接凭据。

tplus-materials --customer-id --month --connection-file --output-dir 从恢复库只读形成样本核对包;空费用和旧初始化只能作为证据,不能推定零运费/切换余额。用户没有首轮样本人工指导成本,真实金额验收待补。

V20/V21 迁移 head 为 21f2a3b4c5d6,现有迁移保留,开发初始化同步。Windows 托管、默认关闭及停止边界见根目录 scripts/windows/README.md;本轮完整验证和未验收事项见 docs/同步运维自动化与样本核对开发记录_2026-10-30.md。未迁移原业务库或启用生产。