-- 生产完成审核查询与审核处理 修改人:Ld 修改时间:2026-07-02 13:57:18;
IF OBJECT_ID(N'[dbo].[机加工MES_加工完成整修审核_查询数据]', N'P') IS NOT NULL
  DROP PROCEDURE [dbo].[机加工MES_加工完成整修审核_查询数据];
GO

CREATE PROCEDURE [dbo].[机加工MES_加工完成整修审核_查询数据]
  @审核状态_check INT = 0,
  @审核状态 NVARCHAR(20) = N'',
  @审核类型_check INT = 0,
  @审核类型 NVARCHAR(50) = N'',
  @操作者_check INT = 0,
  @操作者 NVARCHAR(100) = N'',
  @时间_check INT = 0,
  @开始时间 NVARCHAR(20) = N'',
  @结束时间 NVARCHAR(20) = N'',
  @PageCurrent INT = 1,
  @PageSize INT = 100
AS
BEGIN
  SET NOCOUNT ON;

  IF @PageCurrent IS NULL OR @PageCurrent < 1 SET @PageCurrent = 1;
  IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 100;

  ;WITH AuditData AS (
    SELECT
      ROW_NUMBER() OVER (
        ORDER BY
          CASE WHEN A.审核状态 = N'待审核' THEN 0 ELSE 1 END,
          A.提交时间 DESC,
          A.id DESC
      ) AS RowNum,
      A.id,
      A.审核类型,
      A.审核状态,
      V.订单号,
      V.产品名称,
      V.零件名称,
      V.零件图号,
      V.工序,
      V.工艺计划流水号,
      V.数量 AS 投产数量,
      V.已完成数,
      V.工序顺序,
      V.物料编码,
      V.材料,
      A.工序流水号,
      A.工作者考勤编号,
      工作者.姓名 AS 工作者姓名,
      A.完成数量,
      A.完成类型,
      A.录工票人员编号,
      录工票人员.姓名 AS 录工票人员姓名,
      A.工位号,
      ISNULL(SB.设备名称, A.设备名) AS 工位设备名称,
      A.备注,
      A.剩余工时,
      A.剩余数量,
      A.设备号,
      A.设备名,
      A.操作者,
      ISNULL(操作者人员.姓名, A.操作者) AS 操作者姓名,
      A.整修状态,
      A.整修记录id,
      A.整修方案,
      CONVERT(VARCHAR(19), A.开始时间, 120) AS 开始时间,
      CONVERT(VARCHAR(19), A.结束时间, 120) AS 结束时间,
      CONVERT(VARCHAR(19), A.提交时间, 120) AS 提交时间,
      A.审核人,
      审核人员.姓名 AS 审核人姓名,
      CONVERT(VARCHAR(19), A.审核时间, 120) AS 审核时间,
      A.审核意见,
      A.修改人,
      CONVERT(VARCHAR(19), A.修改时间, 120) AS 修改时间
    FROM [dbo].[MES_机加工MES_加工完成整修审核表] AS A
    LEFT JOIN [dbo].[车间生产管理_零件工序_视图] AS V
      ON A.工序流水号 = V.工序流水号
    LEFT JOIN [dbo].[人事档案管理_人员名单] AS 工作者
      ON A.工作者考勤编号 = 工作者.考勤编号
    LEFT JOIN [dbo].[人事档案管理_人员名单] AS 录工票人员
      ON A.录工票人员编号 = 录工票人员.序号
      OR A.录工票人员编号 = 录工票人员.人员编号
    LEFT JOIN [dbo].[人事档案管理_人员名单] AS 操作者人员
      ON A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.人员编号)
      OR A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.序号)
      OR A.操作者 = 操作者人员.姓名
    LEFT JOIN [dbo].[人事档案管理_人员名单] AS 审核人员
      ON A.审核人 = CONVERT(NVARCHAR(100), 审核人员.人员编号)
      OR A.审核人 = CONVERT(NVARCHAR(100), 审核人员.序号)
      OR A.审核人 = 审核人员.姓名
    LEFT JOIN [dbo].[基础数据_设备工位点检表] AS SB
      ON A.工位号 = SB.工位号
    WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态)
      AND (@审核类型_check = 0 OR A.审核类型 = @审核类型)
      AND (@操作者_check = 0 OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%')
      AND (@时间_check = 0 OR CONVERT(DATE, A.提交时间) BETWEEN CONVERT(DATE, @开始时间) AND CONVERT(DATE, @结束时间))
  )
  SELECT
    id,
    审核类型,
    审核状态,
    订单号,
    产品名称,
    零件名称,
    零件图号,
    工序,
    工艺计划流水号,
    投产数量,
    已完成数,
    工序顺序,
    物料编码,
    材料,
    工序流水号,
    工作者考勤编号,
    工作者姓名,
    完成数量,
    完成类型,
    录工票人员编号,
    录工票人员姓名,
    工位号,
    工位设备名称,
    备注,
    剩余工时,
    剩余数量,
    设备号,
    设备名,
    操作者,
    操作者姓名,
    整修状态,
    整修记录id,
    整修方案,
    开始时间,
    结束时间,
    提交时间,
    审核人,
    审核人姓名,
    审核时间,
    审核意见,
    修改人,
    修改时间
  FROM AuditData
  WHERE RowNum BETWEEN ((@PageCurrent - 1) * @PageSize + 1) AND (@PageCurrent * @PageSize)
  ORDER BY RowNum;

  SELECT COUNT(1) AS total
  FROM [dbo].[MES_机加工MES_加工完成整修审核表] AS A
  LEFT JOIN [dbo].[人事档案管理_人员名单] AS 操作者人员
    ON A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.人员编号)
    OR A.操作者 = CONVERT(NVARCHAR(100), 操作者人员.序号)
    OR A.操作者 = 操作者人员.姓名
  WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态)
    AND (@审核类型_check = 0 OR A.审核类型 = @审核类型)
    AND (@操作者_check = 0 OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%')
    AND (@时间_check = 0 OR CONVERT(DATE, A.提交时间) BETWEEN CONVERT(DATE, @开始时间) AND CONVERT(DATE, @结束时间));
END;
GO

-- 生产完成审核状态更新，审核通过时接入原 MES 完工链路 修改人:Ld 修改时间:2026-07-02 14:55:23;
IF OBJECT_ID(N'[dbo].[机加工MES_加工完成整修审核_审核数据]', N'P') IS NOT NULL
  DROP PROCEDURE [dbo].[机加工MES_加工完成整修审核_审核数据];
GO

CREATE PROCEDURE [dbo].[机加工MES_加工完成整修审核_审核数据]
  @审核流水号 INT,
  @审核状态 NVARCHAR(20),
  @审核人 NVARCHAR(100) = NULL,
  @审核意见 NVARCHAR(1000) = NULL,
  @审核完成数量 FLOAT = NULL,
  @审核加工开始时间 DATETIME = NULL,
  @审核加工完成时间 DATETIME = NULL,
  @审核整修开始时间 DATETIME = NULL,
  @审核整修结束时间 DATETIME = NULL,
  @审核整修方案 NVARCHAR(1000) = NULL
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @审核类型 NVARCHAR(50);
  DECLARE @工序流水号 INT;
  DECLARE @工作者考勤编号 NVARCHAR(50);
  DECLARE @完成数量 FLOAT;
  DECLARE @完成类型 INT;
  DECLARE @录工票人员编号 INT;
  DECLARE @工位号 NVARCHAR(100);
  DECLARE @备注 NVARCHAR(500);
  DECLARE @设备号 NVARCHAR(100);
  DECLARE @整修记录id INT;
  DECLARE @整修方案 NVARCHAR(1000);
  DECLARE @剩余工时 FLOAT;
  DECLARE @剩余数量 INT;
  DECLARE @原流程结果 NVARCHAR(100);
  DECLARE @完成过程流水号 INT;
  DECLARE @是否本过程开启事务 BIT;
  DECLARE @原流程返回 TABLE (result NVARCHAR(100));

  IF NOT EXISTS (
    SELECT 1
    FROM [dbo].[MES_机加工MES_加工完成整修审核表]
    WHERE id = @审核流水号
      AND 审核状态 = N'待审核'
  )
  BEGIN
    SELECT N'0' AS result, N'该审核记录不存在或已审核' AS message;
    RETURN;
  END;

  IF @审核状态 NOT IN (N'审核通过', N'审核不通过')
  BEGIN
    SELECT N'0' AS result, N'审核状态不正确' AS message;
    RETURN;
  END;

  SELECT
    @审核类型 = 审核类型,
    @工序流水号 = 工序流水号,
    @工作者考勤编号 = 工作者考勤编号,
    @完成数量 = ISNULL(@审核完成数量, 完成数量),
    @完成类型 = 完成类型,
    @录工票人员编号 = 录工票人员编号,
    @工位号 = 工位号,
    @备注 = 备注,
    @设备号 = 设备号,
    @整修记录id = 整修记录id,
    @整修方案 = ISNULL(@审核整修方案, 整修方案)
  FROM [dbo].[MES_机加工MES_加工完成整修审核表]
  WHERE id = @审核流水号
    AND 审核状态 = N'待审核';

  BEGIN TRY
    SET @是否本过程开启事务 = CASE WHEN @@TRANCOUNT = 0 THEN 1 ELSE 0 END;
    IF @是否本过程开启事务 = 1
    BEGIN
      BEGIN TRAN;
    END
    ELSE
    BEGIN
      SAVE TRAN 生产完成审核保存点;
    END;

    IF @审核状态 = N'审核通过' AND @审核类型 = N'加工完成'
    BEGIN
      IF @工序流水号 IS NULL OR @工作者考勤编号 IS NULL OR @完成数量 IS NULL OR @完成类型 IS NULL OR @录工票人员编号 IS NULL
      BEGIN
        IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点;
        SELECT N'0' AS result, N'审核记录缺少原 MES 完工必需参数' AS message;
        RETURN;
      END;

      IF @完成数量 <= 0 OR @完成数量 <> FLOOR(@完成数量)
      BEGIN
        IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点;
        SELECT N'0' AS result, N'完成数量必须为大于 0 的整数' AS message;
        RETURN;
      END;

      INSERT INTO @原流程返回(result)
      EXEC [dbo].[设备管理_零件工序_工序完成过程情况_增加数据]
        @工序流水号 = @工序流水号,
        @工作者考勤编号 = @工作者考勤编号,
        @完成数量 = @完成数量,
        @完成类型 = @完成类型,
        @录工票人员编号 = @录工票人员编号,
        @工位号 = @工位号,
        @备注 = @备注,
        @剩余工时 = @剩余工时 OUTPUT,
        @剩余数量 = @剩余数量 OUTPUT;

      SELECT TOP 1 @原流程结果 = result FROM @原流程返回;

      IF ISNULL(@原流程结果, N'') <> N'成功'
      BEGIN
        IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点;
        SELECT N'0' AS result, ISNULL(@原流程结果, N'原 MES 完工流程执行失败') AS message;
        RETURN;
      END;

      IF @审核加工完成时间 IS NOT NULL
      BEGIN
        SELECT @完成过程流水号 = MAX(完成过程流水号)
        FROM [dbo].[设备管理_零件工序_工序完成过程情况]
        WHERE 工序流水号 = @工序流水号
          AND 录工票人员编号 = @录工票人员编号
          AND 完成数量 = @完成数量;

        UPDATE [dbo].[设备管理_零件工序_工序完成过程情况]
        SET 加工开始时间 = ISNULL(@审核加工开始时间, 加工开始时间),
            加工完成时间 = @审核加工完成时间,
            完成日期 = CONVERT(DATE, @审核加工完成时间),
            操作日期 = @审核加工完成时间,
            修改人员 = CASE WHEN ISNUMERIC(@审核人) = 1 THEN CAST(@审核人 AS INT) ELSE 修改人员 END,
            修改时间 = GETDATE()
        WHERE 完成过程流水号 = @完成过程流水号;

        UPDATE [dbo].[车间生产管理工艺_零件工序]
        SET 完成日期 = CASE WHEN 完成日期 IS NULL OR 完成数量 >= ISNULL(完成数量, 0) THEN @审核加工完成时间 ELSE 完成日期 END
        WHERE 工序流水号 = @工序流水号;
      END;

      IF @审核加工开始时间 IS NOT NULL AND @审核加工完成时间 IS NULL
      BEGIN
        SELECT @完成过程流水号 = MAX(完成过程流水号)
        FROM [dbo].[设备管理_零件工序_工序完成过程情况]
        WHERE 工序流水号 = @工序流水号
          AND 录工票人员编号 = @录工票人员编号
          AND 完成数量 = @完成数量;

        UPDATE [dbo].[设备管理_零件工序_工序完成过程情况]
        SET 加工开始时间 = @审核加工开始时间,
            修改人员 = CASE WHEN ISNUMERIC(@审核人) = 1 THEN CAST(@审核人 AS INT) ELSE 修改人员 END,
            修改时间 = GETDATE()
        WHERE 完成过程流水号 = @完成过程流水号;
      END;
    END;

    IF @审核状态 = N'审核通过' AND @审核类型 = N'结束整修'
    BEGIN
      IF @整修记录id IS NULL OR @设备号 IS NULL
      BEGIN
        IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点;
        SELECT N'0' AS result, N'审核记录缺少整修结束必需参数' AS message;
        RETURN;
      END;

      UPDATE [dbo].[设备管理_整修]
      SET 整修开始时间 = CASE WHEN @审核整修开始时间 IS NULL THEN 整修开始时间 ELSE CONVERT(VARCHAR(20), @审核整修开始时间, 120) END,
          整修结束时间 = CONVERT(VARCHAR(20), ISNULL(@审核整修结束时间, GETDATE()), 120),
          整修状态 = N'1',
          整修方案 = @整修方案
      WHERE id = @整修记录id
        AND 设备号 = @设备号;
    END;

    UPDATE [dbo].[MES_机加工MES_加工完成整修审核表]
    SET 审核状态 = @审核状态,
        审核人 = @审核人,
        审核时间 = GETDATE(),
        审核意见 = ISNULL(@审核意见, N''),
        完成数量 = CASE WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' THEN @完成数量 ELSE 完成数量 END,
        开始时间 = CASE
          WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' AND @审核加工开始时间 IS NOT NULL THEN @审核加工开始时间
          WHEN @审核状态 = N'审核通过' AND @审核类型 = N'结束整修' AND @审核整修开始时间 IS NOT NULL THEN @审核整修开始时间
          ELSE 开始时间
        END,
        结束时间 = CASE
          WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' AND @审核加工完成时间 IS NOT NULL THEN @审核加工完成时间
          WHEN @审核状态 = N'审核通过' AND @审核类型 = N'结束整修' THEN ISNULL(@审核整修结束时间, GETDATE())
          ELSE 结束时间
        END,
        整修方案 = CASE WHEN @审核状态 = N'审核通过' AND @审核类型 = N'结束整修' THEN @整修方案 ELSE 整修方案 END,
        剩余工时 = CASE WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' THEN @剩余工时 ELSE 剩余工时 END,
        剩余数量 = CASE WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' THEN @剩余数量 ELSE 剩余数量 END,
        修改人 = N'Ld',
        修改时间 = GETDATE()
    WHERE id = @审核流水号
      AND 审核状态 = N'待审核';

    IF @是否本过程开启事务 = 1
    BEGIN
      COMMIT TRAN;
    END;
  END TRY
  BEGIN CATCH
    IF @@TRANCOUNT > 0
    BEGIN
      IF ISNULL(@是否本过程开启事务, 1) = 1
      BEGIN
        ROLLBACK TRAN;
      END
      ELSE
      BEGIN
        ROLLBACK TRAN 生产完成审核保存点;
      END;
    END;

    SELECT N'0' AS result, ERROR_MESSAGE() AS message;
    RETURN;
  END CATCH;

  SELECT N'1' AS result;
END;
GO
