Files
JY1.0/sql/工序工价_公式调整_测试库_20260808.sql

287 lines
13 KiB
Transact-SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
USE [ERPTOOL_JY_20250826Back]
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+DI=F*3600/E*AJ=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