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