SET NOCOUNT ON

DECLARE @前缀 nvarchar(50)=N'UT_AGV_STATE_'
DECLARE @首任务 nvarchar(100)=@前缀+N'BASE'
DECLARE @并发任务 nvarchar(100)=@前缀+N'SECOND'
DECLARE @未复位恢复 nvarchar(100)=@前缀+N'NORESET'
DECLARE @跨工位恢复 nvarchar(100)=@前缀+N'WRONG_STATION'
DECLARE @正确恢复 nvarchar(100)=@前缀+N'RECOVERY'
DECLARE @失败未处理阻断 nvarchar(100)=@前缀+N'BLOCKED'
DECLARE @处理后任务 nvarchar(100)=@前缀+N'AFTER_HANDLE'
DECLARE @失败断言数 int=0

DELETE FROM dbo.XD_TCS_AGV_操作记录 WHERE 外部任务编号 LIKE @前缀+N'%'
DELETE FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号 LIKE @前缀+N'%'

PRINT N'[1] 创建首个任务'
EXEC dbo.XD_TCS_AGV_任务_创建
    @首任务,N'',N'AC0909-01',N'插',N'',N'nav_action_program',
    N'[{"workStation":"S000214"},{"programName":"214GIS1插XSD"},{"programName":"214GIS1插XSE"}]',
    1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@首任务)
    SET @失败断言数+=1

PRINT N'[2] 单车活动任务拦截'
EXEC dbo.XD_TCS_AGV_任务_创建
    @并发任务,N'',N'AC0909-02',N'插',N'',N'nav_action_program',N'[{"workStation":"S000215"}]',
    1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@并发任务)
    SET @失败断言数+=1

EXEC dbo.XD_TCS_AGV_任务_本地状态设置 @首任务,4,N'任务错误',N'单元测试失败'

PRINT N'[3] 未复位恢复任务拦截'
EXEC dbo.XD_TCS_AGV_任务_创建
    @未复位恢复,@首任务,N'AC0909-01',N'插-单步',N'214GIS1插XSD',N'program',
    N'[{"programName":"214GIS1插XSD"}]',1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@未复位恢复)
    SET @失败断言数+=1

PRINT N'[4] 复位标记与跨工位恢复拦截'
EXEC dbo.XD_TCS_AGV_任务_复位标记 @首任务
EXEC dbo.XD_TCS_AGV_任务_状态更新
    @首任务,5,N'10.146.79.9',N'nav_action_program',N'',N'',N'任务错误已处理'
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@首任务 AND 任务状态=5 AND 已复位=1)
    SET @失败断言数+=1
EXEC dbo.XD_TCS_AGV_任务_创建
    @跨工位恢复,@首任务,N'AC0909-02',N'插-单步',N'215GIS2插XSD',N'program',
    N'[{"programName":"215GIS2插XSD"}]',1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@跨工位恢复)
    SET @失败断言数+=1

PRINT N'[5] 复位后同工位恢复放行'
EXEC dbo.XD_TCS_AGV_任务_创建
    @正确恢复,@首任务,N'AC0909-01',N'插-单步',N'214GIS1插XSD',N'program',
    N'[{"programName":"214GIS1插XSD"}]',1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@正确恢复)
    SET @失败断言数+=1
EXEC dbo.XD_TCS_AGV_任务_状态更新
    @正确恢复,2,N'10.146.79.9',N'program',N'2026-07-13 10:00:00',N'2026-07-13 10:01:00',N''

PRINT N'[6] 原失败任务未处理时继续阻断'
EXEC dbo.XD_TCS_AGV_任务_创建
    @失败未处理阻断,N'',N'AC0909-02',N'插',N'',N'nav_action_program',N'[{"workStation":"S000215"}]',
    1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@失败未处理阻断)
    SET @失败断言数+=1

PRINT N'[7] 人工处理后新任务放行'
EXEC dbo.XD_TCS_AGV_任务_人工处理 @首任务,N'状态机测试',N'恢复任务已完成'
EXEC dbo.XD_TCS_AGV_任务_状态更新 @首任务,2,N'',N'',N'',N'',N'迟到完成'
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@首任务 AND 任务状态<>5)
    SET @失败断言数+=1
EXEC dbo.XD_TCS_AGV_任务_创建
    @处理后任务,N'',N'AC0909-02',N'拔',N'',N'nav_action_program',N'[{"workStation":"S000215"}]',
    1,N'G001',N'10.146.79.9',N'UNIT_TEST',N'状态机测试',0
IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@处理后任务)
    SET @失败断言数+=1

PRINT N'[8] 未复位失败任务不能人工处理，终态不能改写'
EXEC dbo.XD_TCS_AGV_任务_本地状态设置 @处理后任务,4,N'任务错误',N'终态测试'
EXEC dbo.XD_TCS_AGV_任务_人工处理 @处理后任务,N'状态机测试',N'不应成功'
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@处理后任务 AND 处理状态=1)
    SET @失败断言数+=1
EXEC dbo.XD_TCS_AGV_任务_状态更新 @处理后任务,2,N'',N'',N'',N'',N'迟到完成'
IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@处理后任务 AND 任务状态<>4)
    SET @失败断言数+=1

SELECT @失败断言数 AS 失败断言数,
       (SELECT COUNT(*) FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号 LIKE @前缀+N'%') AS 测试任务数

DELETE FROM dbo.XD_TCS_AGV_操作记录 WHERE 外部任务编号 LIKE @前缀+N'%'
DELETE FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号 LIKE @前缀+N'%'

IF @失败断言数<>0
    RAISERROR(N'AGV数据库状态机测试失败',16,1)

SELECT COUNT(*) AS 清理后测试任务数
FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号 LIKE @前缀+N'%'
