SET NOCOUNT ON
GO

IF OBJECT_ID(N'dbo.XD_TCS_AGV_配置', N'U') IS NULL
BEGIN
    CREATE TABLE dbo.XD_TCS_AGV_配置
    (
        配置键 nvarchar(50) NOT NULL CONSTRAINT PK_XD_TCS_AGV_配置 PRIMARY KEY,
        配置值 nvarchar(500) NOT NULL,
        配置说明 nvarchar(200) NULL,
        是否启用 bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_配置_是否启用 DEFAULT(1),
        操作时间 datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_配置_操作时间 DEFAULT(GETDATE())
    )
END
GO

IF OBJECT_ID(N'dbo.XD_TCS_AGV_点位配置', N'U') IS NULL
BEGIN
    CREATE TABLE dbo.XD_TCS_AGV_点位配置
    (
        ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_XD_TCS_AGV_点位配置 PRIMARY KEY,
        产线代码 nvarchar(20) NOT NULL,
        MES工位号 nvarchar(50) NOT NULL,
        现场位置 nvarchar(50) NOT NULL,
        WorkStation nvarchar(50) NOT NULL,
        插XSDProgramName nvarchar(100) NOT NULL,
        插XSEProgramName nvarchar(100) NOT NULL,
        拔XSDProgramName nvarchar(100) NOT NULL,
        拔XSEProgramName nvarchar(100) NOT NULL,
        排序 int NOT NULL,
        是否启用 bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_点位配置_是否启用 DEFAULT(1),
        操作时间 datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_点位配置_操作时间 DEFAULT(GETDATE()),
        CONSTRAINT UK_XD_TCS_AGV_点位配置_MES工位号 UNIQUE(MES工位号),
        CONSTRAINT UK_XD_TCS_AGV_点位配置_WorkStation UNIQUE(WorkStation)
    )
END
GO

IF OBJECT_ID(N'dbo.XD_TCS_AGV_型号动作映射', N'U') IS NULL
BEGIN
    CREATE TABLE dbo.XD_TCS_AGV_型号动作映射
    (
        ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_XD_TCS_AGV_型号动作映射 PRIMARY KEY,
        产线代码 nvarchar(20) NOT NULL,
        产品型号 nvarchar(100) NOT NULL,
        任务动作 nvarchar(10) NOT NULL,
        执行XSD bit NOT NULL,
        执行XSE bit NOT NULL,
        是否启用 bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_型号动作映射_是否启用 DEFAULT(1),
        操作时间 datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_型号动作映射_操作时间 DEFAULT(GETDATE()),
        CONSTRAINT UK_XD_TCS_AGV_型号动作映射 UNIQUE(产线代码,产品型号,任务动作),
        CONSTRAINT CK_XD_TCS_AGV_型号动作映射_动作 CHECK(任务动作 IN(N'插',N'拔')),
        CONSTRAINT CK_XD_TCS_AGV_型号动作映射_组合 CHECK(执行XSD=1 OR 执行XSE=1)
    )
END
GO

IF OBJECT_ID(N'dbo.XD_TCS_AGV_任务', N'U') IS NULL
BEGIN
    CREATE TABLE dbo.XD_TCS_AGV_任务
    (
        ID bigint IDENTITY(1,1) NOT NULL CONSTRAINT PK_XD_TCS_AGV_任务 PRIMARY KEY,
        外部任务编号 nvarchar(100) NOT NULL,
        原任务编号 nvarchar(100) NULL,
        MES工位号 nvarchar(50) NOT NULL,
        现场位置 nvarchar(50) NULL,
        TCS站点 nvarchar(50) NULL,
        任务动作 nvarchar(20) NOT NULL,
        产品型号 nvarchar(100) NULL,
        动作组合 nvarchar(20) NULL,
        ProgramName nvarchar(100) NULL,
        任务类型 nvarchar(50) NOT NULL,
        参数 nvarchar(max) NOT NULL,
        优先级 int NOT NULL,
        机器人组 nvarchar(50) NULL,
        机器人IP nvarchar(50) NULL,
        来源 nvarchar(20) NOT NULL,
        操作人 nvarchar(50) NULL,
        任务状态 int NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_任务状态 DEFAULT(0),
        状态说明 nvarchar(50) NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_状态说明 DEFAULT(N'未开始'),
        开始时间 nvarchar(50) NULL,
        结束时间 nvarchar(50) NULL,
        TCS备注 nvarchar(1000) NULL,
        请求报文 nvarchar(max) NULL,
        响应报文 nvarchar(max) NULL,
        错误信息 nvarchar(2000) NULL,
        是否通知PLC bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_是否通知PLC DEFAULT(0),
        PLC已通知 bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_PLC已通知 DEFAULT(0),
        处理状态 int NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_处理状态 DEFAULT(0),
        已复位 bit NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_已复位 DEFAULT(0),
        处理人 nvarchar(50) NULL,
        处理时间 datetime NULL,
        处理说明 nvarchar(1000) NULL,
        创建时间 datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_创建时间 DEFAULT(GETDATE()),
        更新时间 datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_任务_更新时间 DEFAULT(GETDATE()),
        CONSTRAINT UK_XD_TCS_AGV_任务_外部任务编号 UNIQUE(外部任务编号),
        CONSTRAINT CK_XD_TCS_AGV_任务_状态 CHECK(任务状态 IN (0,1,2,3,4,5))
    )

    CREATE INDEX IX_XD_TCS_AGV_任务_状态时间
        ON dbo.XD_TCS_AGV_任务(任务状态, 创建时间 DESC)
    CREATE INDEX IX_XD_TCS_AGV_任务_工位时间
        ON dbo.XD_TCS_AGV_任务(MES工位号, 创建时间 DESC)
END
GO

IF COL_LENGTH(N'dbo.XD_TCS_AGV_任务', N'产品型号') IS NULL
    ALTER TABLE dbo.XD_TCS_AGV_任务 ADD 产品型号 nvarchar(100) NULL
GO

IF COL_LENGTH(N'dbo.XD_TCS_AGV_任务', N'动作组合') IS NULL
    ALTER TABLE dbo.XD_TCS_AGV_任务 ADD 动作组合 nvarchar(20) NULL
GO

IF COL_LENGTH(N'dbo.XD_TCS_AGV_任务', N'已复位') IS NULL
BEGIN
    ALTER TABLE dbo.XD_TCS_AGV_任务 ADD 已复位 bit NOT NULL
        CONSTRAINT DF_XD_TCS_AGV_任务_已复位 DEFAULT(0)
END
GO

IF EXISTS
(
    SELECT 1 FROM sys.check_constraints
    WHERE parent_object_id=OBJECT_ID(N'dbo.XD_TCS_AGV_任务')
      AND name=N'CK_XD_TCS_AGV_任务_状态'
)
    ALTER TABLE dbo.XD_TCS_AGV_任务 DROP CONSTRAINT CK_XD_TCS_AGV_任务_状态
GO

ALTER TABLE dbo.XD_TCS_AGV_任务 ADD CONSTRAINT CK_XD_TCS_AGV_任务_状态
    CHECK(任务状态 IN (0,1,2,3,4,5))
GO

IF OBJECT_ID(N'dbo.XD_TCS_AGV_位置状态', N'U') IS NULL
BEGIN
    CREATE TABLE dbo.XD_TCS_AGV_位置状态
    (
        ID int NOT NULL CONSTRAINT PK_XD_TCS_AGV_位置状态 PRIMARY KEY,
        机器人IP nvarchar(50) NULL,
        当前站点 nvarchar(100) NULL,
        目标站点 nvarchar(100) NULL,
        原始报文 nvarchar(max) NULL,
        更新时间 datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_位置状态_更新时间 DEFAULT(GETDATE()),
        CONSTRAINT CK_XD_TCS_AGV_位置状态_单车 CHECK(ID = 1)
    )
END
GO

IF OBJECT_ID(N'dbo.XD_TCS_AGV_操作记录', N'U') IS NULL
BEGIN
    CREATE TABLE dbo.XD_TCS_AGV_操作记录
    (
        ID bigint IDENTITY(1,1) NOT NULL CONSTRAINT PK_XD_TCS_AGV_操作记录 PRIMARY KEY,
        外部任务编号 nvarchar(100) NULL,
        MES工位号 nvarchar(50) NULL,
        操作类型 nvarchar(50) NOT NULL,
        操作人 nvarchar(50) NULL,
        请求报文 nvarchar(max) NULL,
        响应报文 nvarchar(max) NULL,
        是否成功 bit NOT NULL,
        操作结果 nvarchar(1000) NULL,
        操作时间 datetime NOT NULL CONSTRAINT DF_XD_TCS_AGV_操作记录_操作时间 DEFAULT(GETDATE())
    )

    CREATE INDEX IX_XD_TCS_AGV_操作记录_时间
        ON dbo.XD_TCS_AGV_操作记录(操作时间 DESC)
END
GO

DECLARE @默认配置 TABLE
(
    配置键 nvarchar(50),
    配置值 nvarchar(500),
    配置说明 nvarchar(200)
)

INSERT INTO @默认配置 VALUES
(N'TCS_BaseUrl', N'http://10.112.111.21:11008', N'TCS调度服务地址，客户已确认'),
(N'TCS_Enabled', N'0', N'1启用真实下发，0仅允许查询配置'),
(N'McrGroup', N'G001', N'机器人组'),
(N'McrIp', N'10.146.79.9', N'客户确认的单台AGV IP'),
(N'TCS_OperatorUserId', N'BZS001', N'TCS任务状态定向推送标识'),
(N'DefaultPriority', N'1', N'默认任务优先级'),
(N'HttpTimeoutSeconds', N'15', N'TCS HTTP超时秒数')

MERGE dbo.XD_TCS_AGV_配置 AS T
USING @默认配置 AS S ON T.配置键 = S.配置键
WHEN NOT MATCHED THEN
    INSERT(配置键,配置值,配置说明) VALUES(S.配置键,S.配置值,S.配置说明);
GO

DECLARE @产线代码 nvarchar(20)
SELECT TOP 1 @产线代码 = 值 FROM dbo.基本配置 WHERE 参数名称 = N'产线名称'

DECLARE @点位 TABLE
(
    产线代码 nvarchar(20), MES工位号 nvarchar(50), 现场位置 nvarchar(50), WorkStation nvarchar(50),
    插XSD nvarchar(100), 插XSE nvarchar(100), 拔XSD nvarchar(100), 拔XSE nvarchar(100), 排序 int
)

IF @产线代码 = N'GLKG'
BEGIN
    INSERT INTO @点位 VALUES
    (N'GLKG',N'AC0909-01',N'GIS1',N'S000214',N'214GIS1插XSD',N'214GIS1插XSE',N'214GIS1拔XSD',N'214GIS1拔XSE',1),
    (N'GLKG',N'AC0909-02',N'GIS2',N'S000215',N'215GIS2插XSD',N'215GIS2插XSE',N'215GIS2拔XSD',N'215GIS2拔XSE',2),
    (N'GLKG',N'AC0909-03',N'GIS3',N'S000217',N'217GIS3插XSD',N'217GIS3插XSE',N'217GIS3拔XSD',N'217GIS3拔XSE',3),
    (N'GLKG',N'AC0909-04',N'GIS4',N'S000218',N'218GIS4插XSD',N'218GIS4插XSE',N'218GIS4拔XSD',N'218GIS4拔XSE',4),
    (N'GLKG',N'AC0909-05',N'GIS5',N'S000219',N'219GIS5插XSD',N'219GIS5插XSE',N'219GIS5拔XSD',N'219GIS5拔XSE',5),
    (N'GLKG',N'AC0909-06',N'GIS6',N'S000220',N'220GIS6插XSD',N'220GIS6插XSE',N'220GIS6拔XSD',N'220GIS6拔XSE',6),
    (N'GLKG',N'AC0909-07',N'GIS7',N'S000221',N'221GIS7插XSD',N'221GIS7插XSE',N'221GIS7拔XSD',N'221GIS7拔XSE',7),
    (N'GLKG',N'AC0909-08',N'GIS8',N'S000222',N'222GIS8插XSD',N'222GIS8插XSE',N'222GIS8拔XSD',N'222GIS8拔XSE',8),
    (N'GLKG',N'AC0909-09',N'GIS9',N'S000201',N'201GIS9插XSD',N'201GIS9插XSE',N'201GIS9拔XSD',N'201GIS9拔XSE',9),
    (N'GLKG',N'AC0909-10',N'GIS10',N'S000202',N'202GIS10插XSD',N'202GIS10插XSE',N'202GIS10拔XSD',N'202GIS10拔XSE',10)
END
ELSE IF @产线代码 = N'DLQ'
BEGIN
    INSERT INTO @点位 VALUES
    (N'DLQ',N'AC0605-01',N'GCB1',N'S000225',N'225GCB1插XSD',N'225GCB1插XSE',N'225GCB1拔XSD',N'225GCB1拔XSE',1),
    (N'DLQ',N'AC0605-02',N'GCB2',N'S000226',N'226GCB2插XSD',N'226GCB2插XSE',N'226GCB2拔XSD',N'226GCB2拔XSE',2),
    (N'DLQ',N'AC0605-03',N'GCB3',N'S000227',N'227GCB3插XSD',N'227GCB3插XSE',N'227GCB3拔XSD',N'227GCB3拔XSE',3),
    (N'DLQ',N'AC0605-04',N'GCB4',N'S000228',N'228GCB4插XSD',N'228GCB4插XSE',N'228GCB4拔XSD',N'228GCB4拔XSE',4)
END

MERGE dbo.XD_TCS_AGV_点位配置 AS T
USING @点位 AS S ON T.MES工位号 = S.MES工位号
WHEN MATCHED THEN UPDATE SET
    T.产线代码=S.产线代码,T.现场位置=S.现场位置,T.WorkStation=S.WorkStation,
    T.插XSDProgramName=S.插XSD,T.插XSEProgramName=S.插XSE,
    T.拔XSDProgramName=S.拔XSD,T.拔XSEProgramName=S.拔XSE,
    T.排序=S.排序,T.是否启用=1,T.操作时间=GETDATE()
WHEN NOT MATCHED THEN INSERT
    (产线代码,MES工位号,现场位置,WorkStation,插XSDProgramName,插XSEProgramName,拔XSDProgramName,拔XSEProgramName,排序)
    VALUES(S.产线代码,S.MES工位号,S.现场位置,S.WorkStation,S.插XSD,S.插XSE,S.拔XSD,S.拔XSE,S.排序);
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_配置_获取
AS
BEGIN
    SET NOCOUNT ON
    SELECT
        TCS_BaseUrl = MAX(CASE WHEN 配置键=N'TCS_BaseUrl' THEN 配置值 END),
        TCS_Enabled = MAX(CASE WHEN 配置键=N'TCS_Enabled' THEN 配置值 END),
        McrGroup = MAX(CASE WHEN 配置键=N'McrGroup' THEN 配置值 END),
        McrIp = MAX(CASE WHEN 配置键=N'McrIp' THEN 配置值 END),
        TCS_OperatorUserId = MAX(CASE WHEN 配置键=N'TCS_OperatorUserId' THEN 配置值 END),
        DefaultPriority = MAX(CASE WHEN 配置键=N'DefaultPriority' THEN 配置值 END),
        HttpTimeoutSeconds = MAX(CASE WHEN 配置键=N'HttpTimeoutSeconds' THEN 配置值 END)
    FROM dbo.XD_TCS_AGV_配置 WHERE 是否启用=1
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_点位配置_查询
@MES工位号 nvarchar(50) = N''
AS
BEGIN
    SET NOCOUNT ON
    SELECT * FROM dbo.XD_TCS_AGV_点位配置
    WHERE 是否启用=1 AND (@MES工位号=N'' OR MES工位号=@MES工位号)
    ORDER BY 排序
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_型号动作映射_查询
@产线代码 nvarchar(20),
@产品型号 nvarchar(100),
@任务动作 nvarchar(10)
AS
BEGIN
    SET NOCOUNT ON
    SELECT TOP 1 ID,产线代码,产品型号,任务动作,执行XSD,执行XSE,
        CASE WHEN 执行XSD=1 AND 执行XSE=1 THEN N'XSD+XSE'
             WHEN 执行XSD=1 THEN N'XSD' ELSE N'XSE' END 动作组合
    FROM dbo.XD_TCS_AGV_型号动作映射
    WHERE 产线代码=@产线代码 AND 产品型号=@产品型号
      AND 任务动作=@任务动作 AND 是否启用=1
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_库位产品_查询
@MES工位号 nvarchar(50)
AS
BEGIN
    SET NOCOUNT ON
    SELECT TOP 1 产品编号,产品型号
    FROM dbo.XD_磨合_状态
    WHERE 库位号=@MES工位号
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_创建
@外部任务编号 nvarchar(100),
@原任务编号 nvarchar(100)=N'',
@MES工位号 nvarchar(50),
@任务动作 nvarchar(20),
@产品型号 nvarchar(100)=N'',
@动作组合 nvarchar(20)=N'',
@ProgramName nvarchar(100)=N'',
@任务类型 nvarchar(50),
@参数 nvarchar(max),
@优先级 int,
@机器人组 nvarchar(50)=N'',
@机器人IP nvarchar(50)=N'',
@来源 nvarchar(20),
@操作人 nvarchar(50)=N'',
@是否通知PLC bit=0
AS
BEGIN
    SET NOCOUNT ON
    SET XACT_ABORT ON
    BEGIN TRAN

    IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_点位配置 WHERE MES工位号=@MES工位号 AND 是否启用=1)
    BEGIN
        ROLLBACK
        SELECT 2 result,N'工位未配置TCS点位' msg
        RETURN
    END

    IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@外部任务编号)
    BEGIN
        ROLLBACK
        SELECT 2 result,N'外部任务编号已存在' msg
        RETURN
    END

    IF ISNULL(@原任务编号,N'')<>N''
    BEGIN
        DECLARE @原任务工位 nvarchar(50),@原任务状态 int,@原处理状态 int,@原任务已复位 bit
        SELECT @原任务工位=MES工位号,@原任务状态=任务状态,
               @原处理状态=处理状态,@原任务已复位=已复位
        FROM dbo.XD_TCS_AGV_任务 WITH(UPDLOCK,HOLDLOCK)
        WHERE 外部任务编号=@原任务编号

        IF @原任务工位 IS NULL
        BEGIN
            ROLLBACK
            SELECT 2 result,N'原失败任务不存在' msg
            RETURN
        END
        IF @原任务状态 NOT IN(4,5) OR ISNULL(@原处理状态,0)<>0
        BEGIN
            ROLLBACK
            SELECT 2 result,N'原任务不是待处理的失败任务' msg
            RETURN
        END
        IF ISNULL(@原任务已复位,0)<>1
        BEGIN
            ROLLBACK
            SELECT 2 result,N'请先复位原失败任务对应的移动机器人' msg
            RETURN
        END
        IF @原任务工位<>@MES工位号
        BEGIN
            ROLLBACK
            SELECT 2 result,N'恢复任务工位必须与原失败任务一致' msg
            RETURN
        END
    END

    -- MES允许各工位独立下发任务，排队与执行顺序由TCS调度。

    DECLARE @现场位置 nvarchar(50),@TCS站点 nvarchar(50)
    SELECT @现场位置=现场位置,@TCS站点=WorkStation
    FROM dbo.XD_TCS_AGV_点位配置 WHERE MES工位号=@MES工位号 AND 是否启用=1

    INSERT INTO dbo.XD_TCS_AGV_任务
    (外部任务编号,原任务编号,MES工位号,现场位置,TCS站点,任务动作,产品型号,动作组合,ProgramName,任务类型,参数,
     优先级,机器人组,机器人IP,来源,操作人,是否通知PLC)
    VALUES
    (@外部任务编号,NULLIF(@原任务编号,N''),@MES工位号,@现场位置,@TCS站点,@任务动作,NULLIF(@产品型号,N''),NULLIF(@动作组合,N''),NULLIF(@ProgramName,N''),
     @任务类型,@参数,@优先级,@机器人组,@机器人IP,@来源,@操作人,@是否通知PLC)

    DECLARE @ID bigint=SCOPE_IDENTITY()
    COMMIT
    SELECT 1 result,N'任务已创建' msg,@ID ID,@外部任务编号 外部任务编号
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_下发结果更新
@外部任务编号 nvarchar(100),
@请求报文 nvarchar(max)=N'',
@响应报文 nvarchar(max)=N'',
@是否成功 bit,
@错误信息 nvarchar(2000)=N''
AS
BEGIN
    SET NOCOUNT ON
    UPDATE dbo.XD_TCS_AGV_任务 SET
        请求报文=@请求报文,响应报文=@响应报文,
        任务状态=CASE WHEN @是否成功=1 THEN 0 ELSE 4 END,
        状态说明=CASE WHEN @是否成功=1 THEN N'未开始' ELSE N'任务错误' END,
        错误信息=NULLIF(@错误信息,N''),更新时间=GETDATE()
    WHERE 外部任务编号=@外部任务编号

    SELECT CASE WHEN @@ROWCOUNT=1 THEN 1 ELSE 2 END result
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_状态更新
@外部任务编号 nvarchar(100),
@任务状态 int,
@机器人IP nvarchar(50)=N'',
@任务类型 nvarchar(50)=N'',
@开始时间 nvarchar(50)=N'',
@结束时间 nvarchar(50)=N'',
@备注 nvarchar(1000)=N''
AS
BEGIN
    SET NOCOUNT ON
    IF @任务状态 NOT IN(0,1,2,3,4,5)
    BEGIN
        SELECT 2 result,N'任务状态不正确' msg
        RETURN
    END

    IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@外部任务编号)
    BEGIN
        SELECT 2 result,N'外部任务编号不存在' msg
        RETURN
    END

    DECLARE @原状态 int
    SELECT @原状态=任务状态 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@外部任务编号

    IF (@原状态 IN(2,3,5) AND @任务状态<>@原状态)
       OR (@原状态=4 AND @任务状态 NOT IN(4,5))
    BEGIN
        SELECT 1 result,N'已忽略结束状态变更' msg,MES工位号,任务动作,是否通知PLC,PLC已通知
        FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@外部任务编号
        RETURN
    END

    UPDATE dbo.XD_TCS_AGV_任务 SET
        任务状态=@任务状态,
        状态说明=CASE @任务状态 WHEN 0 THEN N'未开始' WHEN 1 THEN N'进行中' WHEN 2 THEN N'已完成' WHEN 3 THEN N'已取消' WHEN 4 THEN N'任务错误' ELSE N'任务错误（已处理）' END,
        机器人IP=CASE WHEN @机器人IP=N'' THEN 机器人IP ELSE @机器人IP END,
        任务类型=CASE WHEN @任务类型=N'' THEN 任务类型 ELSE @任务类型 END,
        开始时间=CASE WHEN @开始时间=N'' THEN 开始时间 ELSE @开始时间 END,
        结束时间=CASE WHEN @结束时间=N'' THEN 结束时间 ELSE @结束时间 END,
        TCS备注=NULLIF(@备注,N''),
        错误信息=CASE WHEN @任务状态=4 THEN NULLIF(@备注,N'') ELSE 错误信息 END,
        已复位=CASE WHEN @任务状态=5 THEN 1 ELSE 已复位 END,
        更新时间=GETDATE()
    WHERE 外部任务编号=@外部任务编号

    SELECT 1 result,N'状态已更新' msg,MES工位号,任务动作,是否通知PLC,PLC已通知
    FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@外部任务编号
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_PLC通知完成
@外部任务编号 nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON
    UPDATE dbo.XD_TCS_AGV_任务 SET PLC已通知=1,更新时间=GETDATE()
    WHERE 外部任务编号=@外部任务编号 AND 任务状态=2
    SELECT CASE WHEN @@ROWCOUNT=1 THEN 1 ELSE 2 END result
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_获取
@外部任务编号 nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON
    SELECT * FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@外部任务编号
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_人工处理
@外部任务编号 nvarchar(100),
@处理人 nvarchar(50)=N'',
@处理说明 nvarchar(1000)=N''
AS
BEGIN
    SET NOCOUNT ON
    IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@外部任务编号 AND 任务状态 IN(4,5))
    BEGIN
        SELECT 2 result,N'仅任务错误状态可以标记人工处理' msg
        RETURN
    END


    IF NOT EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@外部任务编号 AND 已复位=1)
    BEGIN
        SELECT 2 result,N'请先复位移动机器人再完成人工处理' msg
        RETURN
    END

    UPDATE dbo.XD_TCS_AGV_任务 SET 处理状态=1,处理人=@处理人,处理时间=GETDATE(),处理说明=@处理说明,更新时间=GETDATE()
    WHERE 外部任务编号=@外部任务编号
    SELECT 1 result,N'已标记人工处理' msg
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_复位标记
@外部任务编号 nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON
    UPDATE dbo.XD_TCS_AGV_任务 SET 已复位=1,更新时间=GETDATE()
    WHERE 外部任务编号=@外部任务编号 AND 任务状态 IN(4,5)
    SELECT CASE WHEN @@ROWCOUNT=1 THEN 1 ELSE 2 END result,
           CASE WHEN @@ROWCOUNT=1 THEN N'复位状态已记录' ELSE N'未找到对应失败任务' END msg
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_本地状态设置
@外部任务编号 nvarchar(100),
@任务状态 int,
@状态说明 nvarchar(50),
@错误信息 nvarchar(2000)=N''
AS
BEGIN
    SET NOCOUNT ON
    UPDATE dbo.XD_TCS_AGV_任务 SET 任务状态=@任务状态,状态说明=@状态说明,
        错误信息=NULLIF(@错误信息,N''),更新时间=GETDATE()
    WHERE 外部任务编号=@外部任务编号
    SELECT CASE WHEN @@ROWCOUNT=1 THEN 1 ELSE 2 END result
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_分页查询
@开始时间 nvarchar(50)=N'',
@结束时间 nvarchar(50)=N'',
@MES工位号 nvarchar(50)=N'',
@外部任务编号 nvarchar(100)=N'',
@任务动作 nvarchar(20)=N'',
@任务状态 nvarchar(10)=N'',
@来源 nvarchar(20)=N'',
@PageCurrent int=1,
@PageSize int=20,
@PageCount int output,
@ItemCount int output
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @where nvarchar(2000)=N'1=1'
    IF @开始时间<>N'' SET @where+=N' AND 创建时间>='''+REPLACE(@开始时间,'''','''''')+N''''
    IF @结束时间<>N'' SET @where+=N' AND 创建时间<='''+REPLACE(@结束时间,'''','''''')+N''''
    IF @MES工位号<>N'' SET @where+=N' AND MES工位号='''+REPLACE(@MES工位号,'''','''''')+N''''
    IF @外部任务编号<>N'' SET @where+=N' AND 外部任务编号 LIKE ''%'+REPLACE(@外部任务编号,'''','''''')+N'%'''
    IF @任务动作<>N'' SET @where+=N' AND 任务动作='''+REPLACE(@任务动作,'''','''''')+N''''
    IF @任务状态<>N'' SET @where+=N' AND 任务状态='+CONVERT(nvarchar(10),CONVERT(int,@任务状态))
    IF @来源<>N'' SET @where+=N' AND 来源='''+REPLACE(@来源,'''','''''')+N''''

    EXEC sp_xt_pagesplit N'XD_TCS_AGV_任务',N'ID',@where,
        N'ID,外部任务编号,原任务编号,MES工位号,现场位置,TCS站点,任务动作,产品型号,动作组合,ProgramName,任务类型,优先级,机器人组,机器人IP,来源,操作人,任务状态,状态说明,开始时间,结束时间,TCS备注,错误信息,是否通知PLC,PLC已通知,处理状态,已复位,处理人,处理时间,处理说明,创建时间,更新时间',
        N'ID DESC',@PageCurrent,@PageSize,@PageCount output,@ItemCount output
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_详情查询
@外部任务编号 nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON
    SELECT * FROM dbo.XD_TCS_AGV_任务 WHERE 外部任务编号=@外部任务编号
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_当前查询
AS
BEGIN
    SET NOCOUNT ON
    SELECT TOP 1 * FROM dbo.XD_TCS_AGV_任务
    WHERE 任务状态=1
    ORDER BY 更新时间 DESC,ID DESC
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_任务_概览查询
AS
BEGIN
    SET NOCOUNT ON
    SELECT
        ISNULL(SUM(CASE WHEN 任务状态=0 THEN 1 ELSE 0 END),0) 待执行数量,
        ISNULL(SUM(CASE WHEN 任务状态=1 THEN 1 ELSE 0 END),0) 进行中数量,
        ISNULL(SUM(CASE WHEN 任务状态 IN(4,5) AND 处理状态=0 THEN 1 ELSE 0 END),0) 失败待处理数量
    FROM dbo.XD_TCS_AGV_任务
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_工位日志_分页查询
@MES工位号 nvarchar(50)=N'',
@日志类型 nvarchar(50)=N'',
@日志文本 nvarchar(200)=N'',
@开始时间 nvarchar(50)=N'',
@结束时间 nvarchar(50)=N'',
@PageCurrent int=1,
@PageSize int=20,
@PageCount int OUTPUT,
@ItemCount int OUTPUT
AS
BEGIN
    SET NOCOUNT ON

    IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
    IF ISNULL(@PageSize,0)<1 SET @PageSize=20

    DECLARE @开始 datetime=TRY_CONVERT(datetime,NULLIF(@开始时间,N''))
    DECLARE @结束 datetime=TRY_CONVERT(datetime,NULLIF(@结束时间,N''))

    SELECT @ItemCount=COUNT(1)
    FROM dbo.MES_系统日志 L
    WHERE EXISTS
    (
        SELECT 1 FROM dbo.XD_TCS_AGV_点位配置 P
        WHERE P.MES工位号=L.工位号 AND P.是否启用=1
    )
      AND (@MES工位号=N'' OR L.工位号=@MES工位号)
      AND (@日志类型=N'' OR L.日志类型=@日志类型)
      AND (@日志文本=N'' OR L.日志文本 LIKE N'%'+@日志文本+N'%')
      AND (@开始 IS NULL OR L.操作时间>=@开始)
      AND (@结束 IS NULL OR L.操作时间<=@结束)

    SET @PageCount=CASE WHEN @ItemCount=0 THEN 0 ELSE CEILING(@ItemCount*1.0/@PageSize) END

    SELECT L.ID,L.工位号,L.日志类型,L.日志文本,L.操作时间
    FROM dbo.MES_系统日志 L
    WHERE EXISTS
    (
        SELECT 1 FROM dbo.XD_TCS_AGV_点位配置 P
        WHERE P.MES工位号=L.工位号 AND P.是否启用=1
    )
      AND (@MES工位号=N'' OR L.工位号=@MES工位号)
      AND (@日志类型=N'' OR L.日志类型=@日志类型)
      AND (@日志文本=N'' OR L.日志文本 LIKE N'%'+@日志文本+N'%')
      AND (@开始 IS NULL OR L.操作时间>=@开始)
      AND (@结束 IS NULL OR L.操作时间<=@结束)
    ORDER BY L.操作时间 DESC,L.ID DESC
    OFFSET (@PageCurrent-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_位置_更新
@机器人IP nvarchar(50)=N'',
@当前站点 nvarchar(100)=N'',
@目标站点 nvarchar(100)=N'',
@原始报文 nvarchar(max)=N''
AS
BEGIN
    SET NOCOUNT ON
    IF EXISTS(SELECT 1 FROM dbo.XD_TCS_AGV_位置状态 WHERE ID=1)
        UPDATE dbo.XD_TCS_AGV_位置状态 SET 机器人IP=@机器人IP,当前站点=@当前站点,目标站点=@目标站点,原始报文=@原始报文,更新时间=GETDATE() WHERE ID=1
    ELSE
        INSERT INTO dbo.XD_TCS_AGV_位置状态(ID,机器人IP,当前站点,目标站点,原始报文) VALUES(1,@机器人IP,@当前站点,@目标站点,@原始报文)
    SELECT 1 result
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_位置_查询
AS
BEGIN
    SET NOCOUNT ON
    SELECT * FROM dbo.XD_TCS_AGV_位置状态 WHERE ID=1
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_操作记录_增加
@外部任务编号 nvarchar(100)=N'',
@MES工位号 nvarchar(50)=N'',
@操作类型 nvarchar(50),
@操作人 nvarchar(50)=N'',
@请求报文 nvarchar(max)=N'',
@响应报文 nvarchar(max)=N'',
@是否成功 bit,
@操作结果 nvarchar(1000)=N''
AS
BEGIN
    SET NOCOUNT ON
    INSERT INTO dbo.XD_TCS_AGV_操作记录(外部任务编号,MES工位号,操作类型,操作人,请求报文,响应报文,是否成功,操作结果)
    VALUES(NULLIF(@外部任务编号,N''),NULLIF(@MES工位号,N''),@操作类型,@操作人,@请求报文,@响应报文,@是否成功,@操作结果)
    SELECT 1 result
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_操作记录_分页查询
@开始时间 nvarchar(50)=N'',
@结束时间 nvarchar(50)=N'',
@操作类型 nvarchar(50)=N'',
@PageCurrent int=1,
@PageSize int=20,
@PageCount int output,
@ItemCount int output
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @where nvarchar(1000)=N'1=1'
    IF @开始时间<>N'' SET @where+=N' AND 操作时间>='''+REPLACE(@开始时间,'''','''''')+N''''
    IF @结束时间<>N'' SET @where+=N' AND 操作时间<='''+REPLACE(@结束时间,'''','''''')+N''''
    IF @操作类型<>N'' SET @where+=N' AND 操作类型='''+REPLACE(@操作类型,'''','''''')+N''''
    EXEC sp_xt_pagesplit N'XD_TCS_AGV_操作记录',N'ID',@where,
        N'ID,外部任务编号,MES工位号,操作类型,操作人,是否成功,操作结果,操作时间',
        N'ID DESC',@PageCurrent,@PageSize,@PageCount output,@ItemCount output
END
GO

CREATE OR ALTER PROCEDURE dbo.XD_TCS_AGV_操作记录_任务查询
@外部任务编号 nvarchar(100)
AS
BEGIN
    SET NOCOUNT ON
    SELECT ID,外部任务编号,MES工位号,操作类型,操作人,是否成功,操作结果,操作时间
    FROM dbo.XD_TCS_AGV_操作记录
    WHERE 外部任务编号=@外部任务编号
    ORDER BY ID DESC
END
GO
