Use the business project and captured site predicates, validate single-stock proposals, and skip unsupported scopes without changing Legacy. Add the guarded V3.3 SQL upgrade, CMD operations, regression tests and deployment runbook.
70 lines
4.4 KiB
Batchfile
70 lines
4.4 KiB
Batchfile
@echo off
|
|
setlocal EnableExtensions DisableDelayedExpansion
|
|
set "PREFLIGHT_PUSHED="
|
|
|
|
if "%~1"=="" goto :usage
|
|
if "%~2"=="" goto :usage
|
|
if "%~3"=="" goto :usage
|
|
if "%~4"=="" goto :usage
|
|
|
|
set "REPO_ROOT=%~f1"
|
|
set "EXPECTED_COMMIT=%~2"
|
|
set "SQL_SERVER=%~3"
|
|
set "DATABASE=%~4"
|
|
set "EXPECTED_BRANCH=test/ft546wms-shadow-v3-20260903"
|
|
set "MAIN_COMMIT=916ac6bda32a5b102a3181cc8c5dbd5319c5656d"
|
|
|
|
where git >nul 2>nul
|
|
if errorlevel 1 (call :fail "git is not available on PATH" & exit /b 1)
|
|
where jps >nul 2>nul
|
|
if errorlevel 1 (call :fail "jps is not available on PATH" & exit /b 1)
|
|
where sqlcmd >nul 2>nul
|
|
if errorlevel 1 (call :fail "sqlcmd is not available on PATH" & exit /b 1)
|
|
if not exist "%REPO_ROOT%\.git" (call :fail "REPO_ROOT is not a Git repository" & exit /b 1)
|
|
|
|
pushd "%REPO_ROOT%" >nul
|
|
if errorlevel 1 (call :fail "cannot enter REPO_ROOT" & exit /b 1)
|
|
set "PREFLIGHT_PUSHED=1"
|
|
|
|
git rev-parse --is-inside-work-tree >nul 2>nul
|
|
if errorlevel 1 (call :fail "REPO_ROOT is not a Git worktree" & exit /b 1)
|
|
|
|
set "CURRENT_BRANCH="
|
|
for /f "usebackq delims=" %%I in (`git branch --show-current`) do set "CURRENT_BRANCH=%%I"
|
|
if /I not "%CURRENT_BRANCH%"=="%EXPECTED_BRANCH%" (call :fail "unexpected branch" & exit /b 1)
|
|
|
|
set "CURRENT_COMMIT="
|
|
for /f "usebackq delims=" %%I in (`git rev-parse HEAD`) do set "CURRENT_COMMIT=%%I"
|
|
if /I not "%CURRENT_COMMIT%"=="%EXPECTED_COMMIT%" (call :fail "HEAD does not match EXPECTED_COMMIT" & exit /b 1)
|
|
|
|
set "DIRTY="
|
|
for /f "usebackq delims=" %%I in (`git status --porcelain`) do set "DIRTY=1"
|
|
if defined DIRTY (call :fail "Git worktree is not clean" & exit /b 1)
|
|
|
|
git merge-base --is-ancestor %MAIN_COMMIT% HEAD
|
|
if errorlevel 1 (call :fail "required main commit is not an ancestor" & exit /b 1)
|
|
popd >nul
|
|
set "PREFLIGHT_PUSHED="
|
|
|
|
set "WMS_PROCESS_COUNT=0"
|
|
jps -lv >nul 2>nul
|
|
if errorlevel 1 (call :fail "jps could not inspect running JVMs" & exit /b 1)
|
|
for /f %%I in ('jps -lv 2^>nul ^| findstr /R /I /C:"^[0-9][0-9]* com\.ruoyi\.RuoYiApplication" ^| find /C /V ""') do set "WMS_PROCESS_COUNT=%%I"
|
|
if %WMS_PROCESS_COUNT% GTR 1 (call :fail "more than one FT546WMS JVM is running" & exit /b 1)
|
|
|
|
set "PREFLIGHT_SQL=SET NOCOUNT ON; IF SCHEMA_ID(N'alg') IS NULL SELECT N'CLEAN_INSTALL_ELIGIBLE' AS package_state; ELSE BEGIN IF OBJECT_ID(N'alg.shadow_package_manifest', N'U') IS NULL BEGIN; THROW 51050, 'shadow manifest is missing', 1; END; IF (SELECT COUNT(*) FROM alg.shadow_package_manifest) <> 1 OR NOT EXISTS (SELECT 1 FROM alg.shadow_package_manifest WHERE package_id='FT546WMS_SHADOW_ONLY' AND package_version IN ('2026-08-12-1','2026-09-03-3','2026-09-07-33')) BEGIN; THROW 51051, 'shadow manifest is not a supported version', 1; END; IF EXISTS (SELECT 1 FROM alg.shadow_package_manifest WHERE package_id='FT546WMS_SHADOW_ONLY' AND package_version IN ('2026-09-03-3','2026-09-07-33')) BEGIN IF OBJECT_ID(N'alg.shadow_snapshot_state', N'U') IS NULL BEGIN; THROW 51052, 'snapshot state is missing', 1; END; IF OBJECT_ID(N'alg.shadow_instance_heartbeat', N'U') IS NULL BEGIN; THROW 51055, 'shadow instance heartbeat is missing', 1; END; IF NOT EXISTS (SELECT 1 FROM alg.shadow_snapshot_state WHERE warehouse_id='01' AND snapshot_generation>0 AND snapshot_status='PUBLISHED' AND synchronized_at IS NOT NULL AND DATEDIFF(SECOND,synchronized_at,SYSUTCDATETIME()) BETWEEN 0 AND 300 AND source_signature IS NOT NULL AND last_error IS NULL) BEGIN; THROW 51053, 'published warehouse 01 snapshot is unusable', 1; END; IF EXISTS (SELECT 1 FROM alg.shadow_instance_heartbeat WHERE warehouse_id='01' AND ((DATEDIFF(SECOND,last_seen_at,SYSUTCDATETIME()) BETWEEN 0 AND 120) OR (DATEDIFF(SECOND,claimed_at,SYSUTCDATETIME()) BETWEEN 0 AND 120))) BEGIN; THROW 51054, 'a recent shadow instance heartbeat or claim exists', 1; END; END; SELECT package_id, package_version, installed_at FROM alg.shadow_package_manifest; IF OBJECT_ID(N'alg.shadow_snapshot_state', N'U') IS NOT NULL SELECT warehouse_id, snapshot_generation, snapshot_status, synchronized_at, CONVERT(varchar(64), source_signature, 2) AS source_signature, last_error FROM alg.shadow_snapshot_state; END"
|
|
sqlcmd -S "%SQL_SERVER%" -d "%DATABASE%" -E -b -r1 -Q "%PREFLIGHT_SQL%"
|
|
if errorlevel 1 (call :fail "SQL connectivity or shadow package validation failed" & exit /b 1)
|
|
|
|
echo PREFLIGHT_OK branch=%CURRENT_BRANCH% commit=%CURRENT_COMMIT% wmsProcesses=%WMS_PROCESS_COUNT%
|
|
exit /b 0
|
|
|
|
:usage
|
|
echo Usage: %~nx0 REPO_ROOT EXPECTED_COMMIT SQL_SERVER DATABASE 1>&2
|
|
exit /b 2
|
|
|
|
:fail
|
|
echo PREFLIGHT_FAILED %~1 1>&2
|
|
if defined PREFLIGHT_PUSHED popd >nul 2>nul
|
|
exit /b 1
|