diff --git a/README.md b/README.md index 1d7ab9c..0383e53 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 营销人员绩效工资核算系统。后端 Python/FastAPI,前端 Vue 3,数据存 MySQL,会话与缓存在 Redis。 -> 当前进度:正式工资闭环及同步运维自动化已完成本地开发验证,支持每周原始采集、有限重试、独立心跳和站内提示,并提供 Windows 托管脚本。生产自动化默认关闭,尚未安装启用;真实金额与整月工资尚未验收,首组样本缺人工指导成本。审核能力保留但默认关闭,多原单更正仍单独跟踪。最新交付见 [开发记录](docs/同步运维自动化与样本核对开发记录_2026-10-30.md) 和 [Windows 操作说明](scripts/windows/README.md)。 +> 当前进度:正式工资闭环及同步运维自动化已完成本地开发验证,支持每周原始采集、有限重试、独立心跳和站内提示,并提供 Windows 托管脚本。辽宁兴晟达真实样本已在隔离库完成正式导入、核算、月结、报表与导出验收,整月实际工资仍须另行核定,见[真实样本业务闭环验收](docs/真实样本业务闭环验收_2026-11-03.md)。生产自动化默认关闭,尚未安装启用。审核能力保留但默认关闭,多原单更正仍单独跟踪。相关说明见 [T+ 本地恢复与同步开发手册](docs/T+本地恢复与同步开发手册.md) 和 [Windows 操作说明](scripts/windows/README.md)。 ## 快速开始 @@ -128,6 +128,8 @@ python e2e/system_management.py # 系统管理 13 项 ## 相关文档 +客户现场部署见 [客户现场部署与 T+ 连接说明](docs/客户现场部署与T+连接说明.md):按 Linux 容器、Windows Server 或 Linux 原生选择托管方式,连接客户既有 T+ SQL Server。生产 Compose 为 `docker/docker-compose.prod.yml`,T+ 恢复库编排仅用于本地开发。 + | 文档 | 内容 | | --- | --- | | `backend/README.md` | 后端启动、分层约定、接口清单 | @@ -141,7 +143,7 @@ python e2e/system_management.py # 系统管理 13 项 - 应用新增迁移后,T+ 页面提供正式业务导入预览/执行;业务列表“正式核算”准备人工业务资料或核算已导入资料,台账可查看逐段依据。 - “生成月结快照”首次成功即锁定该月分配;审批退回、重新生成不解锁。历史已生成工资保留,差额计调整单生成当月。 - 后端接口说明、验证状态和已知边界见 `docs/正式工资闭环开发记录_2026-10-30.md`。旧引擎仅通过 `PAYROLL_ALLOW_LEGACY_CALCULATION` 显式启用作历史兼容,默认关闭,不用于最新规则验收。 -- 集成回归使用 `scripts/run_isolated_tests.py`;原 `.venv` 不可用时,本机使用 `backend/.venv-workbench/Scripts/python.exe`。测试运行器保留隔离库供复查,不删除原开发数据。 +- 集成回归使用 `scripts/run_isolated_tests.py`;原 `.venv` 不可用时,本机使用 `backend/.venv-workbench/Scripts/python.exe`。运行器默认清理本次新建的隔离库和账号,绝不删除原开发数据;需复查失败现场时加 `--keep`。 审核默认关闭:`PAYROLL_APPROVAL_ENABLED=false`,工资生成直接完成且不产生审批痕迹;如确需系统内复核,显式开启后沿用财务/领导审核和各类审批参数。此配置与旧核算引擎兼容开关独立。 diff --git a/db/restore_run.ps1 b/db/restore_run.ps1 new file mode 100644 index 0000000..df679b7 --- /dev/null +++ b/db/restore_run.ps1 @@ -0,0 +1,28 @@ +# restore_run.ps1 - 独立进程执行 RESTORE,默认不覆盖已有数据库 +if (-not $env:PAYROLL_RESTORE_CONNECTION_STRING) { throw "PAYROLL_RESTORE_CONNECTION_STRING is required" } +$connStr = $env:PAYROLL_RESTORE_CONNECTION_STRING +$c = New-Object System.Data.Odbc.OdbcConnection $connStr +$cmd = $null +try { + $c.Open() + $cmd = $c.CreateCommand() + $cmd.CommandTimeout = 14400 + $cmd.CommandText = @" +RESTORE DATABASE [UFTData472115_000001] +FROM DISK = '\\192.168.1.170\dbbak\ceshi20261026.bak' +WITH MOVE 'MsSql' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\UFTData472115_000001.mdf', + MOVE 'MsSql_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\UFTData472115_000001_log.ldf', + RECOVERY, STATS = 10 +"@ + $cmd.ExecuteNonQuery() | Out-Null + "RESTORE-DONE-OK" | Out-File 'D:\work\code\PayrollManagementSystem\db\restore_result.txt' -Encoding ascii + exit 0 +} catch { + $message = $_.Exception.Message + if ($_.Exception.InnerException) { $message = $_.Exception.InnerException.Message } + ("RESTORE-FAILED: " + $message) | Out-File 'D:\work\code\PayrollManagementSystem\db\restore_result.txt' -Encoding ascii + exit 1 +} finally { + if ($cmd) { $cmd.Dispose() } + if ($c) { $c.Close(); $c.Dispose() } +} diff --git a/db/restore_run2.ps1 b/db/restore_run2.ps1 new file mode 100644 index 0000000..3c1511f --- /dev/null +++ b/db/restore_run2.ps1 @@ -0,0 +1,19 @@ +if (-not $env:PAYROLL_RESTORE_CONNECTION_STRING) { throw "PAYROLL_RESTORE_CONNECTION_STRING is required" } +$connStr = $env:PAYROLL_RESTORE_CONNECTION_STRING +$c = New-Object System.Data.Odbc.OdbcConnection $connStr +$cmd = $null +try { + $c.Open() + $cmd = $c.CreateCommand() + $cmd.CommandTimeout = 14400 + $cmd.CommandText = "RESTORE DATABASE [UFTData472115_000001] FROM DISK = 'C:\baktmp\ceshi20261026.bak' WITH MOVE 'MsSql' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\UFTData472115_000001.mdf', MOVE 'MsSql_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\UFTData472115_000001_log.ldf', RECOVERY, STATS = 10" + $cmd.ExecuteNonQuery() | Out-Null + "RESTORE-DONE-OK" | Out-File "D:\work\code\PayrollManagementSystem\db\restore_result.txt" -Encoding ascii + exit 0 +} catch { + ("RESTORE-FAILED: " + $_.Exception.Message) | Out-File "D:\work\code\PayrollManagementSystem\db\restore_result.txt" -Encoding ascii + exit 1 +} finally { + if ($cmd) { $cmd.Dispose() } + if ($c) { $c.Close(); $c.Dispose() } +}