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