-- 生产审核普通通过只改审核状态为已审核；修改数量/时间才修正生产完成数据。修改人:Ld 修改时间:2026-07-17 09:10:08;
ALTER 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,
  @计价方式 NVARCHAR(20) = NULL
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @目标审核状态 NVARCHAR(20);
  DECLARE @审核类型 NVARCHAR(50);
  DECLARE @工序流水号 INT;
  DECLARE @原完成数量 FLOAT;
  DECLARE @最终完成数量 FLOAT;
  DECLARE @数量差 FLOAT;
  DECLARE @投产数量 FLOAT;
  DECLARE @当前工序完成数量 FLOAT;
  DECLARE @修改后工序完成数量 FLOAT;
  DECLARE @录工票人员编号 INT;
  DECLARE @工位号 NVARCHAR(100);
  DECLARE @设备流水号 INT;
  DECLARE @完成过程流水号 INT;
  DECLARE @设备号 NVARCHAR(100);
  DECLARE @整修记录id INT;
  DECLARE @整修方案 NVARCHAR(1000);
  DECLARE @Safe计价方式 NVARCHAR(20);
  DECLARE @单件工价 DECIMAL(18, 4);
  DECLARE @单时工价 DECIMAL(18, 4);
  DECLARE @是否修改加工 BIT = 0;
  DECLARE @是否修改整修 BIT = 0;
  DECLARE @是否本过程开启事务 BIT;

  SET @目标审核状态 = CASE WHEN @审核状态 IN (N'审核通过', N'已审核') THEN N'已审核' ELSE @审核状态 END;

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

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

  SELECT
    @审核类型 = 审核类型,
    @工序流水号 = 工序流水号,
    @原完成数量 = ISNULL(完成数量, 0),
    @录工票人员编号 = 录工票人员编号,
    @工位号 = 工位号,
    @设备号 = 设备号,
    @整修记录id = 整修记录id,
    @整修方案 = ISNULL(@审核整修方案, 整修方案),
    @Safe计价方式 = ISNULL(NULLIF(@计价方式, N''), ISNULL(NULLIF(计价方式, N''), N'计件')),
    @单时工价 = ISNULL(单时工价, 0)
  FROM [dbo].[MES_机加工MES_加工完成整修审核表]
  WHERE id = @审核流水号
    AND 审核状态 = N'待审核';

  IF @Safe计价方式 NOT IN (N'计件', N'计时')
    SET @Safe计价方式 = N'计件';

  SET @最终完成数量 = ISNULL(@审核完成数量, @原完成数量);
  SET @数量差 = ISNULL(@最终完成数量, 0) - ISNULL(@原完成数量, 0);
  SET @是否修改加工 = CASE
    WHEN @目标审核状态 = N'已审核'
     AND @审核类型 = N'加工完成'
     AND (@审核完成数量 IS NOT NULL OR @审核加工开始时间 IS NOT NULL OR @审核加工完成时间 IS NOT NULL OR @计价方式 IS NOT NULL)
    THEN 1 ELSE 0 END;
  SET @是否修改整修 = CASE
    WHEN @目标审核状态 = N'已审核'
     AND @审核类型 = N'结束整修'
     AND (@审核整修开始时间 IS NOT NULL OR @审核整修结束时间 IS NOT NULL OR @审核整修方案 IS NOT NULL)
    THEN 1 ELSE 0 END;

  IF @是否修改加工 = 1 AND (@最终完成数量 < 0 OR @最终完成数量 <> FLOOR(@最终完成数量))
  BEGIN
    SELECT N'0' AS result, N'完成数量必须为大于等于 0 的整数' AS message;
    RETURN;
  END;

  -- 修改完成数量后的累计结果不能超过投产数量；修改人:Ld 修改时间:2026-07-23 16:22:46;
  IF @是否修改加工 = 1 AND @审核完成数量 IS NOT NULL
  BEGIN
    SELECT
      @投产数量 = ISNULL(V.数量, 0),
      @当前工序完成数量 = ISNULL(V.已完成数, 0)
    FROM [dbo].[车间生产管理_零件工序_视图] AS V
    WHERE V.工序流水号 = @工序流水号;

    SET @修改后工序完成数量 = ISNULL(@当前工序完成数量, 0) + ISNULL(@数量差, 0);

    IF ISNULL(@投产数量, 0) > 0 AND @修改后工序完成数量 > @投产数量
    BEGIN
      SELECT N'0' AS result, N'修改后的已完成数不能超过投产数量' AS message;
      RETURN;
    END;
  END;

  SELECT TOP 1 @单件工价 = CASE
      WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
      ELSE ISNULL(price.[最终单价(元/件)], 0)
    END
  FROM [dbo].[车间生产管理工艺_工序工价] price
  WHERE price.工序流水号 = @工序流水号
    AND ISNULL(price.是否启用, 1) = 1
  ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC;

  SET @单件工价 = ISNULL(@单件工价, 0);
  SET @单时工价 = ISNULL(@单时工价, 0);

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

    IF @是否修改加工 = 1
    BEGIN
      SELECT @设备流水号 = [设备流水号]
      FROM [dbo].[基础数据_设备工位点检表]
      WHERE [工位号] = @工位号;

      SELECT TOP 1 @完成过程流水号 = [完成过程流水号]
      FROM [dbo].[设备管理_零件工序_工序完成过程情况]
      WHERE [工序流水号] = @工序流水号
        AND [录工票人员编号] = @录工票人员编号
        AND [工位号] = @工位号
        AND [完成数量] = @原完成数量
      ORDER BY [完成过程流水号] DESC;

      IF @完成过程流水号 IS NULL
      BEGIN
        SELECT TOP 1 @完成过程流水号 = [完成过程流水号]
        FROM [dbo].[设备管理_零件工序_工序完成过程情况]
        WHERE [工序流水号] = @工序流水号
          AND [录工票人员编号] = @录工票人员编号
          AND [工位号] = @工位号
        ORDER BY [完成过程流水号] DESC;
      END;

      IF @完成过程流水号 IS NULL
      BEGIN
        IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点;
        SELECT N'0' AS result, N'未找到对应生产完成记录' AS message;
        RETURN;
      END;

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

      IF ISNULL(@数量差, 0) <> 0
      BEGIN
        UPDATE [dbo].[车间生产管理工艺_零件工序]
           SET [完成数量] = ISNULL([完成数量], 0) + @数量差
         WHERE [工序流水号] = @工序流水号;

        UPDATE [dbo].[车间生产管理工艺_零件工序_任务分配]
           SET [加工数量] = ISNULL([加工数量], 0) + @数量差
         WHERE [工序流水号] = @工序流水号
           AND [人员编号] = @录工票人员编号
           AND [设备流水号] = @设备流水号;
      END;

      IF @审核加工完成时间 IS NOT NULL
      BEGIN
        UPDATE [dbo].[车间生产管理工艺_零件工序]
           SET [完成日期] = @审核加工完成时间
         WHERE [工序流水号] = @工序流水号;
      END;
    END;

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

    UPDATE [dbo].[MES_机加工MES_加工完成整修审核表]
       SET [审核状态] = @目标审核状态,
           [审核人] = @审核人,
           [审核时间] = GETDATE(),
           [审核意见] = ISNULL(@审核意见, N''),
           [完成数量] = CASE WHEN @是否修改加工 = 1 THEN @最终完成数量 ELSE [完成数量] END,
           [开始时间] = CASE
             WHEN @是否修改加工 = 1 AND @审核加工开始时间 IS NOT NULL THEN @审核加工开始时间
             WHEN @是否修改整修 = 1 AND @审核整修开始时间 IS NOT NULL THEN @审核整修开始时间
             ELSE [开始时间]
           END,
           [结束时间] = CASE
             WHEN @是否修改加工 = 1 AND @审核加工完成时间 IS NOT NULL THEN @审核加工完成时间
             WHEN @是否修改整修 = 1 AND @审核整修结束时间 IS NOT NULL THEN @审核整修结束时间
             ELSE [结束时间]
           END,
           [整修方案] = CASE WHEN @是否修改整修 = 1 THEN @整修方案 ELSE [整修方案] END,
           [计价方式] = CASE WHEN @是否修改加工 = 1 THEN @Safe计价方式 ELSE [计价方式] END,
           [单件工价] = CASE WHEN @是否修改加工 = 1 THEN @单件工价 ELSE [单件工价] END,
           [单时工价] = CASE WHEN @是否修改加工 = 1 THEN @单时工价 ELSE [单时工价] END,
           [修改人] = N'Ld',
           [修改时间] = GETDATE()
     WHERE [id] = @审核流水号
       AND [审核状态] = N'待审核';

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

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

  SELECT N'1' AS result;
END;
GO
