﻿USE [ERPTOOL_JY]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- 工序工价编辑保存公式输入 F、G、H，并由触发器统一计算 I、J；修改人:Ld 修改时间:2026-08-08 10:24:44;
ALTER PROCEDURE [dbo].[车间生产管理工艺_工序工价_编辑数据]
  @工价流水号 NVARCHAR(50) = N'',
  @工艺名称 NVARCHAR(100) = N'',
  @工序名称 NVARCHAR(100) = N'',
  @零件名称 NVARCHAR(100) = N'',
  @图号 NVARCHAR(100) = N'',
  @机动时间s NVARCHAR(50) = N'',
  @辅助时间s NVARCHAR(50) = N'',
  @总时间s NVARCHAR(50) = N'',
  @单装数量件 NVARCHAR(50) = N'',
  @操作台数 NVARCHAR(50) = N'',
  @日产能件 NVARCHAR(50) = N'',
  @最终单价元件 NVARCHAR(50) = N'',
  @生效日期 NVARCHAR(50) = N'',
  @变更次数 NVARCHAR(50) = N'',
  @是否启用 NVARCHAR(20) = N'',
  @备注 NVARCHAR(500) = N'',
  @工序流水号 NVARCHAR(50) = N'',
  @修改人 NVARCHAR(50) = N'',
  @工作时间时 NVARCHAR(50) = N'',
  @宽放时间时 NVARCHAR(50) = N'',
  @日工资元 NVARCHAR(50) = N''
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @Id INT;
  DECLARE @Safe工序流水号 INT;
  DECLARE @Safe机动时间s DECIMAL(18, 4);
  DECLARE @Safe辅助时间s DECIMAL(18, 4);
  DECLARE @Safe总时间s DECIMAL(18, 4);
  DECLARE @Safe单装数量件 DECIMAL(18, 4);
  DECLARE @Safe操作台数 DECIMAL(18, 4);
  DECLARE @Safe日产能件 DECIMAL(18, 4);
  DECLARE @Safe最终单价元件 DECIMAL(18, 4);
  DECLARE @Safe工作时间时 DECIMAL(18, 4);
  DECLARE @Safe宽放时间时 DECIMAL(18, 4);
  DECLARE @Safe日工资元 DECIMAL(18, 4);
  DECLARE @Safe生效日期 DATE;
  DECLARE @Safe变更次数 INT;
  DECLARE @Safe是否启用 BIT = CASE WHEN NULLIF(@是否启用, N'') IS NULL THEN 1 WHEN @是否启用 = N'1' THEN 1 ELSE 0 END;
  DECLARE @操作人 NVARCHAR(50) = NULLIF(@修改人, N'');
  DECLARE @当前时间 DATETIME = GETDATE();
  DECLARE @旧数据 NVARCHAR(MAX);
  DECLARE @新数据 NVARCHAR(MAX);
  DECLARE @Old工序流水号 INT;

  SET @Id = CASE WHEN ISNUMERIC(NULLIF(@工价流水号, N'')) = 1 THEN CONVERT(INT, @工价流水号) ELSE NULL END;
  SET @Safe工序流水号 = CASE WHEN ISNUMERIC(NULLIF(@工序流水号, N'')) = 1 THEN CONVERT(INT, @工序流水号) ELSE NULL END;
  SET @Safe机动时间s = CASE WHEN ISNUMERIC(NULLIF(@机动时间s, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @机动时间s) ELSE 0 END;
  SET @Safe辅助时间s = CASE WHEN ISNUMERIC(NULLIF(@辅助时间s, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @辅助时间s) ELSE 0 END;
  -- 修改人:Ld 修改时间:2026-08-08 10:24:44; E 固定按 C+D 计算，不使用前端传入的总时间
  SET @Safe总时间s = @Safe机动时间s + @Safe辅助时间s;
  SET @Safe单装数量件 = CASE WHEN ISNUMERIC(NULLIF(@单装数量件, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @单装数量件) ELSE 0 END;
  SET @Safe操作台数 = CASE WHEN ISNUMERIC(NULLIF(@操作台数, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @操作台数) ELSE 0 END;
  SET @Safe日产能件 = CASE WHEN ISNUMERIC(NULLIF(@日产能件, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @日产能件) ELSE 0 END;
  SET @Safe最终单价元件 = CASE WHEN ISNUMERIC(NULLIF(@最终单价元件, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @最终单价元件) ELSE 0 END;
  -- 修改人:Ld 修改时间:2026-08-08 10:24:44; 兼容旧接口未传 F、G、H 时，按新公式反推输入字段
  SET @Safe工作时间时 = CASE
    WHEN ISNUMERIC(NULLIF(@工作时间时, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @工作时间时)
    WHEN @Safe日产能件 <> 0 AND @Safe总时间s <> 0 AND @Safe单装数量件 <> 0
      THEN @Safe日产能件 * @Safe总时间s / (3600 * @Safe单装数量件)
    ELSE 0
  END;
  SET @Safe宽放时间时 = CASE WHEN ISNUMERIC(NULLIF(@宽放时间时, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @宽放时间时) ELSE 0 END;
  SET @Safe日工资元 = CASE
    WHEN ISNUMERIC(NULLIF(@日工资元, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @日工资元)
    WHEN @Safe最终单价元件 <> 0 AND @Safe日产能件 <> 0 AND @Safe操作台数 <> 0
      THEN @Safe最终单价元件 * @Safe操作台数 * @Safe日产能件
    ELSE 0
  END;
  SET @Safe生效日期 = CASE WHEN ISDATE(NULLIF(@生效日期, N'')) = 1 THEN CONVERT(DATE, @生效日期) ELSE NULL END;
  SET @Safe变更次数 = CASE WHEN ISNUMERIC(NULLIF(@变更次数, N'')) = 1 THEN CONVERT(INT, @变更次数) ELSE 0 END;

  IF @Safe工序流水号 IS NULL
  BEGIN
    SELECT N'0' AS result, N'工序流水号不能为空' AS message;
    RETURN;
  END;

  IF NULLIF(LTRIM(RTRIM(@工艺名称)), N'') IS NULL
    OR NULLIF(LTRIM(RTRIM(@工序名称)), N'') IS NULL
    OR NULLIF(LTRIM(RTRIM(@零件名称)), N'') IS NULL
    OR NULLIF(LTRIM(RTRIM(@图号)), N'') IS NULL
  BEGIN
    SELECT N'0' AS result, N'工艺名称、工序名称、零件名称和图号不能为空' AS message;
    RETURN;
  END;

  IF @Id IS NULL
  BEGIN
    SELECT TOP 1 @Id = 工价流水号
    FROM [dbo].[车间生产管理工艺_工序工价]
    WHERE 工序流水号 = @Safe工序流水号;
  END;

  IF @Id IS NOT NULL
  AND NOT EXISTS (
    SELECT 1
    FROM [dbo].[车间生产管理工艺_工序工价]
    WHERE 工价流水号 = @Id
  )
  BEGIN
    SELECT N'0' AS result, N'工序工价记录不存在' AS message;
    RETURN;
  END;

  BEGIN TRY
    BEGIN TRAN;

    IF @Id IS NOT NULL
    BEGIN
      SELECT
        @Old工序流水号 = 工序流水号,
        @旧数据 = [dbo].[车间生产管理工艺_工序工价_历史快照](
          [机动时间s],
          [辅助时间s],
          [总时间s],
          [单装数量(件)],
          [操作台数],
          [日产能(件)],
          [最终单价(元/件)],
          生效日期,
          变更次数
        )
      FROM [dbo].[车间生产管理工艺_工序工价]
      WHERE 工价流水号 = @Id;

      UPDATE [dbo].[车间生产管理工艺_工序工价]
      SET 工序流水号 = @Safe工序流水号,
          工艺名称 = LTRIM(RTRIM(@工艺名称)),
          工序名称 = LTRIM(RTRIM(@工序名称)),
          零件名称 = LTRIM(RTRIM(@零件名称)),
          图号 = LTRIM(RTRIM(@图号)),
          [机动时间s] = @Safe机动时间s,
          [辅助时间s] = @Safe辅助时间s,
          [总时间s] = @Safe总时间s,
          [单装数量(件)] = @Safe单装数量件,
          [操作台数] = @Safe操作台数,
          [日产能(件)] = @Safe日产能件,
          [最终单价(元/件)] = @Safe最终单价元件,
          [工作时间(时)] = @Safe工作时间时,
          [宽放时间(时)] = @Safe宽放时间时,
          [日工资(元)] = @Safe日工资元,
          生效日期 = @Safe生效日期,
          变更次数 = @Safe变更次数,
          是否启用 = @Safe是否启用,
          备注 = NULLIF(@备注, N''),
          计价方式 = N'按件',
          单件工价 = @Safe最终单价元件,
          修改人 = @操作人,
          修改时间 = @当前时间
      WHERE 工价流水号 = @Id;
    END
    ELSE
    BEGIN
      INSERT INTO [dbo].[车间生产管理工艺_工序工价](
        工序流水号, 工艺名称, 工序名称, 零件名称, 图号,
        [机动时间s], [辅助时间s], [总时间s], [单装数量(件)], [操作台数],
        [日产能(件)], [最终单价(元/件)], [工作时间(时)], [宽放时间(时)], [日工资(元)],
        生效日期, 变更次数, 是否启用, 备注,
        创建人, 创建时间, 修改人, 修改时间, 计价方式, 单件工价
      )
      VALUES (
        @Safe工序流水号, LTRIM(RTRIM(@工艺名称)), LTRIM(RTRIM(@工序名称)), LTRIM(RTRIM(@零件名称)), LTRIM(RTRIM(@图号)),
        @Safe机动时间s, @Safe辅助时间s, @Safe总时间s, @Safe单装数量件, @Safe操作台数,
        @Safe日产能件, @Safe最终单价元件, @Safe工作时间时, @Safe宽放时间时, @Safe日工资元,
        @Safe生效日期, @Safe变更次数, @Safe是否启用, NULLIF(@备注, N''),
        @操作人, @当前时间, @操作人, @当前时间, N'按件', @Safe最终单价元件
      );

      SET @Id = SCOPE_IDENTITY();
      SET @Old工序流水号 = @Safe工序流水号;
      SET @旧数据 = N'';
    END;

    SET @新数据 = [dbo].[车间生产管理工艺_工序工价_历史快照](
      @Safe机动时间s, @Safe辅助时间s, @Safe总时间s, @Safe单装数量件, @Safe操作台数,
      @Safe日产能件, @Safe最终单价元件, @Safe生效日期, @Safe变更次数
    );

    INSERT INTO [dbo].[车间生产管理工艺_工序工价历史记录](
      工价流水号, 工序流水号, 工艺名称, 工序名称, 零件名称, 图号,
      操作类型, 变更前, 变更后, 操作人, 操作时间, 备注
    )
    VALUES (
      @Id, ISNULL(@Safe工序流水号, @Old工序流水号), LTRIM(RTRIM(@工艺名称)), LTRIM(RTRIM(@工序名称)),
      LTRIM(RTRIM(@零件名称)), LTRIM(RTRIM(@图号)), CASE WHEN @旧数据 = N'' THEN N'新增' ELSE N'编辑' END,
      @旧数据, @新数据, @操作人, @当前时间, NULLIF(@备注, N'')
    );

    COMMIT TRAN;
    SELECT N'1' AS result, @Id AS 工价流水号;
  END TRY
  BEGIN CATCH
    IF @@TRANCOUNT > 0
      ROLLBACK TRAN;
    SELECT N'0' AS result, ERROR_MESSAGE() AS message;
  END CATCH;
END
GO

-- 工序工价字段公式：E=C+D，I=F*3600/E*A，J=H/B/I；修改人:Ld 修改时间:2026-08-08 10:24:44;
IF OBJECT_ID(N'[dbo].[TR_车间生产管理工艺_工序工价_字段公式计算]', N'TR') IS NOT NULL
  DROP TRIGGER [dbo].[TR_车间生产管理工艺_工序工价_字段公式计算];
GO

CREATE TRIGGER [dbo].[TR_车间生产管理工艺_工序工价_字段公式计算]
ON [dbo].[车间生产管理工艺_工序工价]
AFTER INSERT, UPDATE
AS
BEGIN
  SET NOCOUNT ON;

  IF TRIGGER_NESTLEVEL() > 1
    RETURN;

  ;WITH FormulaSource AS (
    SELECT
      price.工价流水号,
      ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS 总时间s,
      ISNULL(price.[单装数量(件)], 0) AS 单装数量件,
      ISNULL(price.[操作台数], 0) AS 操作台数,
      -- 修改人:Ld 修改时间:2026-08-08 10:24:44; F 优先保存页面输入，旧接口仅传日产能时按 I=F*3600/E*A 反推
      CASE
        WHEN ISNULL(price.[工作时间(时)], 0) <> 0 THEN ISNULL(price.[工作时间(时)], 0)
        WHEN ISNULL(price.[日产能(件)], 0) <> 0
          AND ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) <> 0
          AND ISNULL(price.[单装数量(件)], 0) <> 0
          THEN ISNULL(price.[日产能(件)], 0) * (ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0)) / (3600 * ISNULL(price.[单装数量(件)], 0))
        ELSE 0
      END AS 工作时间时,
      ISNULL(price.[宽放时间(时)], 0) AS 宽放时间时,
      -- 修改人:Ld 修改时间:2026-08-08 10:24:44; H 优先保存页面输入，旧接口仅传工价定额时按 J=H/B/I 反推
      CASE
        WHEN ISNULL(price.[日工资(元)], 0) <> 0 THEN ISNULL(price.[日工资(元)], 0)
        WHEN ISNULL(price.[最终单价(元/件)], 0) <> 0
          AND ISNULL(price.[日产能(件)], 0) <> 0
          AND ISNULL(price.[操作台数], 0) <> 0
          THEN ISNULL(price.[最终单价(元/件)], 0) * ISNULL(price.[操作台数], 0) * ISNULL(price.[日产能(件)], 0)
        ELSE 0
      END AS 日工资元
    FROM [dbo].[车间生产管理工艺_工序工价] price
      INNER JOIN inserted i ON price.工价流水号 = i.工价流水号
  ),
  FormulaResult AS (
    SELECT
      工价流水号,
      总时间s,
      工作时间时,
      宽放时间时,
      日工资元,
      单装数量件,
      操作台数,
      CASE WHEN 总时间s <> 0 THEN 工作时间时 * 3600 / 总时间s * 单装数量件 ELSE 0 END AS 标准产能件天
    FROM FormulaSource
  )
  UPDATE price
  SET price.[总时间s] = calc.总时间s,
      price.[工作时间(时)] = calc.工作时间时,
      price.[宽放时间(时)] = calc.宽放时间时,
      price.[日工资(元)] = calc.日工资元,
      price.[标准产能(件/天)] = calc.标准产能件天,
      price.[工价定额] = CASE WHEN calc.操作台数 <> 0 AND calc.标准产能件天 <> 0 THEN calc.日工资元 / calc.操作台数 / calc.标准产能件天 ELSE 0 END,
      price.[日产能(件)] = calc.标准产能件天,
      price.[最终单价(元/件)] = CASE WHEN calc.操作台数 <> 0 AND calc.标准产能件天 <> 0 THEN calc.日工资元 / calc.操作台数 / calc.标准产能件天 ELSE 0 END,
      price.单件工价 = CASE WHEN calc.操作台数 <> 0 AND calc.标准产能件天 <> 0 THEN calc.日工资元 / calc.操作台数 / calc.标准产能件天 ELSE 0 END
  FROM [dbo].[车间生产管理工艺_工序工价] price
    INNER JOIN FormulaResult calc ON price.工价流水号 = calc.工价流水号;
END
GO

-- 按新公式回算测试库现有数据；修改人:Ld 修改时间:2026-08-08 10:24:44;
UPDATE [dbo].[车间生产管理工艺_工序工价]
SET [工作时间(时)] = [工作时间(时)];
GO

