﻿-- 生产完成审核查询与审核处理 修改人:Ld 修改时间:2026-07-02 13:57:18;
-- 生产审核补充计价方式和工价字段，用于传递到工时统计；修改人:Ld 修改时间:2026-07-06 15:18:06;
IF OBJECT_ID(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'U') IS NOT NULL
AND COL_LENGTH(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'计价方式') IS NULL
  ALTER TABLE [dbo].[MES_机加工MES_加工完成整修审核表] ADD [计价方式] NVARCHAR(20) NULL CONSTRAINT [DF_MES_机加工MES_加工完成整修审核表_计价方式] DEFAULT (N'计件');
GO

IF OBJECT_ID(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'U') IS NOT NULL
AND COL_LENGTH(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'单件工价') IS NULL
  ALTER TABLE [dbo].[MES_机加工MES_加工完成整修审核表] ADD [单件工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_MES_机加工MES_加工完成整修审核表_单件工价] DEFAULT ((0));
GO

IF OBJECT_ID(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'U') IS NOT NULL
AND COL_LENGTH(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'单时工价') IS NULL
  ALTER TABLE [dbo].[MES_机加工MES_加工完成整修审核表] ADD [单时工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_MES_机加工MES_加工完成整修审核表_单时工价] DEFAULT ((0));
GO

-- 审核通过后写入完成过程表的计价字段，保障本脚本可单独部署；修改人:Ld 修改时间:2026-07-06 15:18:06;
IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL
AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'计价方式') IS NULL
  ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [计价方式] NVARCHAR(20) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_计价方式] DEFAULT (N'计件');
GO

IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL
AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'单件工价') IS NULL
  ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [单件工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_单件工价] DEFAULT ((0));
GO

IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL
AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'单时工价') IS NULL
  ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [单时工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_单时工价] DEFAULT ((0));
GO

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.完成类型,
      ISNULL(NULLIF(A.计价方式, N''), N'计件') AS 计价方式,
      CASE WHEN ISNULL(A.单件工价, 0) <> 0 THEN A.单件工价 ELSE ISNULL(priceData.单件工价, 0) END AS 单件工价,
      ISNULL(A.单时工价, 0) AS 单时工价,
      A.录工票人员编号,
      录工票人员.姓名 AS 录工票人员姓名,
      A.工位号,
      ISNULL(SB.设备名称, A.设备名) AS 工位设备名称,
      A.备注,
      A.剩余工时,
      A.剩余数量,
      A.设备号,
      A.设备名,
      A.操作者,
      -- 操作者人名查询兼容操作者、工作者和录工票人员；修改人:Ld 修改时间:2026-07-23 16:08:35;
      COALESCE(操作者人员.姓名, 工作者.姓名, 录工票人员.姓名, 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.工位号
    OUTER APPLY (
      SELECT TOP 1
        CASE
          WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价]
          ELSE ISNULL(price.[最终单价(元/件)], 0)
        END AS 单件工价
      FROM [dbo].[车间生产管理工艺_工序工价] price
      WHERE price.工序流水号 = A.工序流水号
        AND ISNULL(price.是否启用, 1) = 1
      ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC
    ) priceData
    WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态)
      AND (@审核类型_check = 0 OR A.审核类型 = @审核类型)
      AND (
        @操作者_check = 0
        OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%'
        OR ISNULL(工作者.姓名, N'') LIKE N'%' + @操作者 + N'%'
        OR ISNULL(录工票人员.姓名, 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.工作者考勤编号 = 工作者.考勤编号
  LEFT JOIN [dbo].[人事档案管理_人员名单] AS 录工票人员
    ON A.录工票人员编号 = 录工票人员.序号
    OR 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'%'
      OR ISNULL(工作者.姓名, N'') LIKE N'%' + @操作者 + N'%'
      OR ISNULL(录工票人员.姓名, N'') LIKE N'%' + @操作者 + N'%'
    )
    AND (@时间_check = 0 OR CONVERT(DATE, A.提交时间) BETWEEN CONVERT(DATE, @开始时间) AND CONVERT(DATE, @结束时间));
END;
GO

-- 生产审核普通通过只改审核状态为已审核；修改数量/时间才修正生产完成数据。修改人: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
GO

