Files
JY1.0/sql/工序工价_自动化拷贝_正式库_20260804.sql

346 lines
14 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]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- 工序工价自动补齐,按零件名称和图号检索已有工价,未找到则默认 0修改人:Ld 修改时间:2026-08-04 16:31:18;
IF OBJECT_ID(N'[dbo].[车间生产管理工艺_工序工价_自动补齐数据]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[车间生产管理工艺_工序工价_自动补齐数据];
GO
CREATE PROCEDURE [dbo].[车间生产管理工艺_工序工价_自动补齐数据]
@工艺计划流水号 INT = NULL,
@修改人 NVARCHAR(50) = N'',
@是否返回结果 BIT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @操作人 NVARCHAR(50) = NULLIF(@修改人, N'');
DECLARE @当前时间 DATETIME = GETDATE();
IF @工艺计划流水号 IS NULL
BEGIN
IF @是否返回结果 = 1
SELECT N'0' AS result, N'工艺计划流水号不能为空' AS message;
RETURN;
END;
IF NOT EXISTS (
SELECT 1
FROM [dbo].[车间生产管理_零件工艺计划_视图]
WHERE 工艺计划流水号 = @工艺计划流水号
AND 考核状态 >= 1
)
BEGIN
IF @是否返回结果 = 1
SELECT N'0' AS result, N'工艺计划不存在或未生效' AS message;
RETURN;
END;
;WITH TargetRows AS (
SELECT
gp.工艺计划流水号,
gx.工序流水号,
gx.工序顺序,
gp.零件名称,
gp.零件图号 AS 图号,
ISNULL(base.工艺名称, N'未设置工序') AS 工艺名称
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
WHERE gp.工艺计划流水号 = @工艺计划流水号
AND gp.考核状态 >= 1
AND NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM [dbo].[车间生产管理工艺_工序工价] price
WHERE price.工序流水号 = gx.工序流水号
)
)
INSERT INTO [dbo].[车间生产管理工艺_工序工价](
工序流水号,
工艺名称,
工序名称,
零件名称,
图号,
[机动时间s],
[辅助时间s],
[总时间s],
[单装数量(件)],
[操作台数],
[日产能(件)],
[最终单价(元/件)],
生效日期,
变更次数,
是否启用,
备注,
创建人,
创建时间,
修改人,
修改时间,
计价方式,
单件工价,
单时工价,
准结工价,
难度系数,
质量系数,
设备系数
)
SELECT
targetRow.工序流水号,
targetRow.工艺名称,
targetRow.工艺名称,
targetRow.零件名称,
targetRow.图号,
COALESCE(exactPrice.[机动时间s], fallbackPrice.[机动时间s], 0),
COALESCE(exactPrice.[辅助时间s], fallbackPrice.[辅助时间s], 0),
COALESCE(exactPrice.[总时间s], fallbackPrice.[总时间s], 0),
COALESCE(exactPrice.[单装数量(件)], fallbackPrice.[单装数量(件)], 0),
COALESCE(exactPrice.[操作台数], fallbackPrice.[操作台数], 0),
COALESCE(exactPrice.[日产能(件)], fallbackPrice.[日产能(件)], 0),
COALESCE(exactPrice.[最终单价(元/件)], fallbackPrice.[最终单价(元/件)], 0),
COALESCE(exactPrice.生效日期, fallbackPrice.生效日期),
COALESCE(exactPrice.变更次数, fallbackPrice.变更次数, 0),
COALESCE(exactPrice.是否启用, fallbackPrice.是否启用, 1),
NULL,
@操作人,
@当前时间,
@操作人,
@当前时间,
N'按件',
COALESCE(exactPrice.[最终单价(元/件)], fallbackPrice.[最终单价(元/件)], 0),
0,
0,
1,
1,
1
FROM TargetRows targetRow
OUTER APPLY (
-- 修改人:Ld 修改时间:2026-08-04 16:31:18; 优先同零件名称、图号、工序顺序和工艺名称精确匹配
SELECT TOP 1
price.*
FROM [dbo].[车间生产管理_零件工艺计划_视图] sourceGp
INNER JOIN [dbo].[车间生产管理工艺_零件工序] sourceGx ON sourceGp.工艺计划流水号 = sourceGx.工艺计划流水号
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] sourceBase ON sourceGx.工艺编号 = sourceBase.工艺编号
INNER JOIN [dbo].[车间生产管理工艺_工序工价] price ON sourceGx.工序流水号 = price.工序流水号
WHERE sourceGp.考核状态 >= 1
AND sourceGp.工艺计划流水号 <> targetRow.工艺计划流水号
AND sourceGp.零件名称 = targetRow.零件名称
AND sourceGp.零件图号 = targetRow.图号
AND sourceGx.工序顺序 = targetRow.工序顺序
AND ISNULL(sourceBase.工艺名称, N'未设置工序') = targetRow.工艺名称
ORDER BY sourceGp.工艺更新时间 DESC, sourceGp.工艺计划流水号 DESC, price.修改时间 DESC, price.工价流水号 DESC
) exactPrice
OUTER APPLY (
-- 修改人:Ld 修改时间:2026-08-04 16:31:18; 精确工序未命中时,按零件名称和图号取最近一条已有工价兜底
SELECT TOP 1
price.*
FROM [dbo].[车间生产管理_零件工艺计划_视图] sourceGp
INNER JOIN [dbo].[车间生产管理工艺_零件工序] sourceGx ON sourceGp.工艺计划流水号 = sourceGx.工艺计划流水号
INNER JOIN [dbo].[车间生产管理工艺_工序工价] price ON sourceGx.工序流水号 = price.工序流水号
WHERE exactPrice.工价流水号 IS NULL
AND sourceGp.考核状态 >= 1
AND sourceGp.工艺计划流水号 <> targetRow.工艺计划流水号
AND sourceGp.零件名称 = targetRow.零件名称
AND sourceGp.零件图号 = targetRow.图号
ORDER BY sourceGp.工艺更新时间 DESC, sourceGp.工艺计划流水号 DESC, price.修改时间 DESC, price.工价流水号 DESC
) fallbackPrice;
IF @是否返回结果 = 1
SELECT N'1' AS result, @@ROWCOUNT AS 工价流水数;
END
GO
-- 工序工序插入时自动补齐工价,按零件名称和图号直接拷贝已有数据;修改人:Ld 修改时间:2026-08-04 16:31:18;
IF OBJECT_ID(N'[dbo].[TR_车间生产管理工艺_零件工序_工价自动补齐]', N'TR') IS NOT NULL
DROP TRIGGER [dbo].[TR_车间生产管理工艺_零件工序_工价自动补齐];
GO
CREATE TRIGGER [dbo].[TR_车间生产管理工艺_零件工序_工价自动补齐]
ON [dbo].[车间生产管理工艺_零件工序]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @工艺计划流水号 INT;
DECLARE 工艺游标 CURSOR LOCAL FAST_FORWARD FOR
SELECT DISTINCT i.工艺计划流水号
FROM inserted i
WHERE i.工艺计划流水号 IS NOT NULL;
OPEN 工艺游标;
FETCH NEXT FROM 工艺游标 INTO @工艺计划流水号;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC [dbo].[车间生产管理工艺_工序工价_自动补齐数据]
@工艺计划流水号 = @工艺计划流水号,
@修改人 = N'Ld',
@是否返回结果 = 0;
FETCH NEXT FROM 工艺游标 INTO @工艺计划流水号;
END
CLOSE 工艺游标;
DEALLOCATE 工艺游标;
END
GO
-- 清理历史自动备注,取消自动写入备注后的残留文案;修改人:Ld 修改时间:2026-08-04 16:31:18;
UPDATE [dbo].[车间生产管理工艺_工序工价]
SET 备注 = NULL
WHERE 备注 LIKE N'自动拷贝来源工价流水号:%'
OR 备注 LIKE N'自动按零件图号兜底拷贝来源工价流水号:%'
OR 备注 = N'自动生成默认工价';
GO
-- 工序工价分页查询增加自动补齐调用,确保打开零件后立即生成缺失工价;修改人:Ld 修改时间:2026-08-04 16:31:18;
ALTER PROCEDURE [dbo].[车间生产管理工艺_工序工价_查询数据]
@订单流水号_check INT = 0,
@订单流水号 INT = NULL,
@组件流水号_check INT = 0,
@组件流水号 INT = NULL,
@工艺计划流水号_check INT = 0,
@工艺计划流水号 INT = NULL,
@工艺名称_check INT = 0,
@工艺名称 NVARCHAR(100) = N'',
@工序名称_check INT = 0,
@工序名称 NVARCHAR(100) = N'',
@零件名称_check INT = 0,
@零件名称 NVARCHAR(100) = N'',
@图号_check INT = 0,
@图号 NVARCHAR(100) = N'',
@是否启用_check INT = 0,
@是否启用 NVARCHAR(20) = N'',
@PageCurrent INT = 1,
@PageSize INT = 1000
AS
BEGIN
SET NOCOUNT ON;
IF @工艺计划流水号_check = 1 AND @工艺计划流水号 IS NOT NULL
BEGIN
EXEC [dbo].[车间生产管理工艺_工序工价_自动补齐数据]
@工艺计划流水号 = @工艺计划流水号,
@修改人 = N'Ld',
@是否返回结果 = 0;
END
IF @PageCurrent IS NULL OR @PageCurrent < 1 SET @PageCurrent = 1;
IF @PageSize IS NULL OR @PageSize < 1 SET @PageSize = 1000;
;WITH PlanData AS (
-- 与制定工艺组件订单、产品、零件选择保持同一工艺计划来源口径;修改人:Ld 修改时间:2026-08-04 16:31:18;
SELECT gp.*
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
WHERE gp.考核状态 >= 1
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
),
ProcessData AS (
SELECT
ROW_NUMBER() OVER (
ORDER BY gp.工艺更新时间 DESC, gp.工艺计划流水号 DESC, gx.工序顺序 ASC, gx.工序流水号 ASC
) AS RowNum,
price.工价流水号,
gx.工序流水号,
gx.工艺计划流水号,
gp.订单号,
gp.产品名称,
base.工艺名称 AS 工艺名称,
base.工艺名称 AS 工序名称,
gp.零件名称,
gp.零件图号 AS 图号,
gx.工序顺序,
gx.定额工时,
gx.准结工时,
ISNULL(price.[单装数量(件)], 0) AS [单装数量(件)],
ISNULL(price.[操作台数], 0) AS [操作台数],
ISNULL(price.[机动时间s], 0) AS [机动时间s],
ISNULL(price.[辅助时间s], 0) AS [辅助时间s],
ISNULL(price.[机动时间s], 0) + ISNULL(price.[辅助时间s], 0) AS [总时间s],
ISNULL(price.[工作时间(时)], 0) AS [工作时间(时)],
ISNULL(price.[宽放时间(时)], 0) AS [宽放时间(时)],
ISNULL(price.[日工资(元)], 0) AS [日工资(元)],
ISNULL(price.[标准产能(件/天)], 0) AS [标准产能(件/天)],
ISNULL(price.[工价定额], 0) AS 工价定额,
ISNULL(price.[标准产能(件/天)], ISNULL(price.[日产能(件)], 0)) AS [日产能(件)],
ISNULL(price.[工价定额], ISNULL(price.[最终单价(元/件)], 0)) AS [最终单价(元/件)],
CONVERT(VARCHAR(10), price.生效日期, 23) AS 生效日期,
ISNULL(price.变更次数, 0) AS 变更次数,
ISNULL(price.是否启用, 1) AS 是否启用,
price.备注,
price.创建人,
CONVERT(VARCHAR(19), price.创建时间, 120) AS 创建时间,
price.修改人,
CONVERT(VARCHAR(19), price.修改时间, 120) AS 修改时间
FROM PlanData gp
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
WHERE NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用)
)
SELECT
工价流水号,
工序流水号,
工艺计划流水号,
订单号,
产品名称,
工艺名称,
工序名称,
零件名称,
图号,
工序顺序,
定额工时,
准结工时,
[单装数量(件)],
操作台数,
[机动时间s],
[辅助时间s],
[总时间s],
[工作时间(时)],
[宽放时间(时)],
[日工资(元)],
[标准产能(件/天)],
工价定额,
[日产能(件)],
[最终单价(元/件)],
生效日期,
变更次数,
是否启用,
备注,
创建人,
创建时间,
修改人,
修改时间
FROM ProcessData
WHERE RowNum BETWEEN ((@PageCurrent - 1) * @PageSize + 1) AND (@PageCurrent * @PageSize)
ORDER BY RowNum;
SELECT COUNT(1) AS total
FROM [dbo].[车间生产管理_零件工艺计划_视图] gp
INNER JOIN [dbo].[车间生产管理工艺_零件工序] gx ON gp.工艺计划流水号 = gx.工艺计划流水号
LEFT JOIN [dbo].[车间生产管理工艺_基础表_工艺名称] base ON gx.工艺编号 = base.工艺编号
LEFT JOIN [dbo].[车间生产管理工艺_工序工价] price ON gx.工序流水号 = price.工序流水号
WHERE gp.考核状态 >= 1
AND (@订单流水号_check = 0 OR gp.订单流水号 = @订单流水号)
AND (@组件流水号_check = 0 OR gp.组件流水号 = @组件流水号)
AND (@工艺计划流水号_check = 0 OR gp.工艺计划流水号 = @工艺计划流水号)
AND NULLIF(LTRIM(RTRIM(base.工艺名称)), N'') IS NOT NULL
AND (@工艺名称_check = 0 OR base.工艺名称 LIKE N'%' + @工艺名称 + N'%')
AND (@工序名称_check = 0 OR base.工艺名称 LIKE N'%' + @工序名称 + N'%')
AND (@零件名称_check = 0 OR gp.零件名称 + gp.零件图号 LIKE N'%' + @零件名称 + N'%')
AND (@图号_check = 0 OR gp.零件图号 LIKE N'%' + @图号 + N'%')
AND (@是否启用_check = 0 OR CAST(ISNULL(price.是否启用, 1) AS NVARCHAR(20)) = @是否启用);
END
GO