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'%'