288 lines
13 KiB
Transact-SQL
288 lines
13 KiB
Transact-SQL
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
|
||
|