diff --git a/sql/inventory_demand_exclude_completed_orders_20260714.sql b/sql/inventory_demand_exclude_completed_orders_20260714.sql new file mode 100644 index 00000000..3d897d56 --- /dev/null +++ b/sql/inventory_demand_exclude_completed_orders_20260714.sql @@ -0,0 +1,233 @@ +-- 库存查询需求量排除已完成订单 +-- 修改人:Ld 修改时间:2026-07-14 16:16:14; + +ALTER VIEW dbo.物料管理_需求量_视图 +AS +SELECT + b.物料流水号, + CASE WHEN b.需求量 > ISNULL(c.已领数, 0) THEN b.需求量 - ISNULL(c.已领数, 0) ELSE 0 END AS 需求量 +FROM +( + SELECT 物料流水号, SUM(数量) AS 需求量 + FROM + ( + SELECT p.物料流水号, ISNULL(p.数量, 0) AS 数量 + FROM dbo.PDM_零件明细表_所有视图 p + LEFT JOIN dbo.PDM_订单信息_视图 o ON p.订单编号 = o.订单编号 + WHERE p.是否分配 = 1 + AND p.订单类型 <> 3 + AND ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 库存查询需求数不计入已完成订单 + + UNION ALL + + SELECT t.物料流水号, ISNULL(t.实领数, 0) AS 数量 + FROM dbo.车间装配管理_装配执行_临时领料明细 t + LEFT JOIN dbo.PDM_组件名称_视图 cv ON cv.组件流水号 = t.组件流水号 + LEFT JOIN dbo.PDM_订单信息_视图 o ON cv.订单编号 = o.订单编号 + WHERE t.物料流水号 IS NOT NULL + AND ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 临时领料需求不计入已完成订单 + ) AS a + GROUP BY 物料流水号 +) AS b +LEFT JOIN +( + SELECT l.物料流水号, SUM(ISNULL(l.已领数, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细_视图 l + LEFT JOIN dbo.PDM_组件名称_视图 cv ON cv.组件流水号 = l.组件流水号 + LEFT JOIN dbo.PDM_订单信息_视图 o ON cv.订单编号 = o.订单编号 + WHERE ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 扣减已领数时同步排除已完成订单 + GROUP BY l.物料流水号 +) AS c ON b.物料流水号 = c.物料流水号; +GO + +ALTER PROCEDURE [dbo].[物料管理_需求量_更新] +AS +BEGIN + SET NOCOUNT ON; + + DELETE FROM [dbo].[物料管理_需求量]; + + INSERT INTO [dbo].[物料管理_需求量] + SELECT + b.物料流水号, + CASE WHEN b.需求量 > ISNULL(c.已领数, 0) THEN b.需求量 - ISNULL(c.已领数, 0) ELSE 0 END AS 需求量 + FROM + ( + SELECT 物料流水号, SUM(数量) AS 需求量 + FROM + ( + SELECT p.物料流水号, ISNULL(p.数量, 0) AS 数量 + FROM dbo.PDM_零件明细表_所有视图 p + LEFT JOIN dbo.PDM_订单信息_视图 o ON p.订单编号 = o.订单编号 + WHERE p.是否分配 = 1 + AND p.订单类型 <> 3 + AND ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 汇总需求量不计入已完成订单 + + UNION ALL + + SELECT t.物料流水号, ISNULL(t.实领数, 0) AS 数量 + FROM dbo.车间装配管理_装配执行_临时领料明细 t + LEFT JOIN dbo.PDM_组件名称_视图 cv ON cv.组件流水号 = t.组件流水号 + LEFT JOIN dbo.PDM_订单信息_视图 o ON cv.订单编号 = o.订单编号 + WHERE t.物料流水号 IS NOT NULL + AND ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 汇总临时领料需求不计入已完成订单 + ) AS a + GROUP BY 物料流水号 + ) AS b + LEFT JOIN + ( + SELECT l.物料流水号, SUM(ISNULL(l.已领数, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细_视图 l + LEFT JOIN dbo.PDM_组件名称_视图 cv ON cv.组件流水号 = l.组件流水号 + LEFT JOIN dbo.PDM_订单信息_视图 o ON cv.订单编号 = o.订单编号 + WHERE ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 汇总扣减已领数时同步排除已完成订单 + GROUP BY l.物料流水号 + ) AS c ON b.物料流水号 = c.物料流水号 + WHERE CASE WHEN b.需求量 > ISNULL(c.已领数, 0) THEN b.需求量 - ISNULL(c.已领数, 0) ELSE 0 END > 0; +END; +GO + +ALTER PROCEDURE [dbo].[仓储管理_报缺补货_需求量明细_查询] + @物料流水号 INT = 15448 +AS +BEGIN + SET NOCOUNT ON; + + ;WITH 需求明细 AS + ( + SELECT + p.订单编号, + p.组件流水号, + p.物料流水号, + SUM(ISNULL(p.数量, 0)) AS 需求量, + N'生产订单需求' AS 来源 + FROM dbo.PDM_零件明细表_所有视图 p + LEFT JOIN dbo.PDM_订单信息_视图 o ON p.订单编号 = o.订单编号 + WHERE p.是否分配 = 1 + AND p.订单类型 <> 3 + AND ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 需求量明细不显示已完成订单 + AND (@物料流水号 IS NULL OR p.物料流水号 = @物料流水号) + GROUP BY + p.订单编号, + p.组件流水号, + p.物料流水号 + + UNION ALL + + SELECT + cv.订单编号, + t.组件流水号, + t.物料流水号, + SUM(ISNULL(t.实领数, 0)) AS 需求量, + N'临时领料需求' AS 来源 + FROM dbo.车间装配管理_装配执行_临时领料明细 t + LEFT JOIN dbo.PDM_组件名称_视图 cv ON cv.组件流水号 = t.组件流水号 + LEFT JOIN dbo.PDM_订单信息_视图 o ON cv.订单编号 = o.订单编号 + WHERE t.物料流水号 IS NOT NULL + AND ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 临时领料明细不显示已完成订单 + AND (@物料流水号 IS NULL OR t.物料流水号 = @物料流水号) + GROUP BY + cv.订单编号, + t.组件流水号, + t.物料流水号 + ), + 已领明细 AS + ( + SELECT + cv.订单编号, + l.组件流水号, + l.物料流水号, + SUM(ISNULL(l.已领数, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细_视图 l + LEFT JOIN dbo.PDM_组件名称_视图 cv ON cv.组件流水号 = l.组件流水号 + LEFT JOIN dbo.PDM_订单信息_视图 o ON cv.订单编号 = o.订单编号 + WHERE ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 明细扣减已领数时同步排除已完成订单 + AND (@物料流水号 IS NULL OR l.物料流水号 = @物料流水号) + GROUP BY + cv.订单编号, + l.组件流水号, + l.物料流水号 + ) + SELECT + d.订单编号, + d.组件流水号, + d.物料流水号, + d.需求量, + ISNULL(l.已领数, 0) AS 已领数, + CASE + WHEN d.需求量 > ISNULL(l.已领数, 0) + THEN d.需求量 - ISNULL(l.已领数, 0) + ELSE 0 + END AS 最终需求量, + ISNULL(o.简称, '') AS 简称, + d.来源 + FROM 需求明细 d + LEFT JOIN 已领明细 l + ON d.物料流水号 = l.物料流水号 + AND d.组件流水号 = l.组件流水号 + AND ISNULL(d.订单编号, '') = ISNULL(l.订单编号, '') + LEFT JOIN dbo.PDM_订单信息_视图 o + ON d.订单编号 = o.订单编号 + ORDER BY + d.订单编号, + d.组件流水号, + d.来源; + + ;WITH 原视图需求 AS + ( + SELECT + x.物料流水号, + SUM(x.数量) AS 总需求量 + FROM + ( + SELECT + p.物料流水号, + ISNULL(p.数量, 0) AS 数量 + FROM dbo.PDM_零件明细表_所有视图 p + LEFT JOIN dbo.PDM_订单信息_视图 o ON p.订单编号 = o.订单编号 + WHERE p.是否分配 = 1 + AND p.订单类型 <> 3 + AND ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 汇总明细不计入已完成订单 + AND (@物料流水号 IS NULL OR p.物料流水号 = @物料流水号) + + UNION ALL + + SELECT + t.物料流水号, + ISNULL(t.实领数, 0) AS 数量 + FROM dbo.车间装配管理_装配执行_临时领料明细 t + LEFT JOIN dbo.PDM_组件名称_视图 cv ON cv.组件流水号 = t.组件流水号 + LEFT JOIN dbo.PDM_订单信息_视图 o ON cv.订单编号 = o.订单编号 + WHERE t.物料流水号 IS NOT NULL + AND ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 汇总临时领料不计入已完成订单 + AND (@物料流水号 IS NULL OR t.物料流水号 = @物料流水号) + ) x + GROUP BY x.物料流水号 + ), + 原视图已领 AS + ( + SELECT + l.物料流水号, + SUM(ISNULL(l.已领数, 0)) AS 总已领数 + FROM dbo.车间装配管理_领料单明细_视图 l + LEFT JOIN dbo.PDM_组件名称_视图 cv ON cv.组件流水号 = l.组件流水号 + LEFT JOIN dbo.PDM_订单信息_视图 o ON cv.订单编号 = o.订单编号 + WHERE ISNULL(o.订单状态, N'') <> N'已完成' -- 修改人:Ld 修改时间:2026-07-14 16:16:14; 汇总扣减已领数时同步排除已完成订单 + AND (@物料流水号 IS NULL OR l.物料流水号 = @物料流水号) + GROUP BY l.物料流水号 + ) + SELECT + d.物料流水号, + d.总需求量, + ISNULL(l.总已领数, 0) AS 总已领数, + CASE + WHEN d.总需求量 > ISNULL(l.总已领数, 0) + THEN d.总需求量 - ISNULL(l.总已领数, 0) + ELSE 0 + END AS 总最终需求量 + FROM 原视图需求 d + LEFT JOIN 原视图已领 l + ON d.物料流水号 = l.物料流水号 + ORDER BY d.物料流水号; +END; +GO diff --git a/sql/inventory_demand_performance_optimize_20260714.sql b/sql/inventory_demand_performance_optimize_20260714.sql new file mode 100644 index 00000000..dc96d45c --- /dev/null +++ b/sql/inventory_demand_performance_optimize_20260714.sql @@ -0,0 +1,322 @@ +-- 库存查询需求量性能优化:直连基础表判断订单完成状态,减少重视图展开 +-- 修改人:Ld 修改时间:2026-07-14 16:35:00; + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_零件基本件_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_零件明细表_基本件')) +BEGIN + CREATE NONCLUSTERED INDEX IX_Ld_零件基本件_物料组件_20260714 + ON dbo.PDM_零件明细表_基本件 (物料流水号, 组件流水号) + INCLUDE (零件数量, 已领数量); +END; +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_零件标准外购_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.PDM_零件明细表_标准件和外购件')) +BEGIN + CREATE NONCLUSTERED INDEX IX_Ld_零件标准外购_物料组件_20260714 + ON dbo.PDM_零件明细表_标准件和外购件 (物料流水号, 组件流水号) + INCLUDE (零件数量, 已领数量); +END; +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_临时领料_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_装配执行_临时领料明细')) +BEGIN + CREATE NONCLUSTERED INDEX IX_Ld_临时领料_物料组件_20260714 + ON dbo.车间装配管理_装配执行_临时领料明细 (物料流水号, 组件流水号) + INCLUDE (实领数); +END; +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_基本件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细')) +BEGIN + CREATE NONCLUSTERED INDEX IX_Ld_领料明细_基本件_20260714 + ON dbo.车间装配管理_领料单明细 (基本件流水号) + INCLUDE (已领数量); +END; +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_标准外购_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细')) +BEGIN + CREATE NONCLUSTERED INDEX IX_Ld_领料明细_标准外购_20260714 + ON dbo.车间装配管理_领料单明细 (标准件和外购件流水号) + INCLUDE (已领数量); +END; +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_物料组件_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细')) +BEGIN + CREATE NONCLUSTERED INDEX IX_Ld_领料明细_物料组件_20260714 + ON dbo.车间装配管理_领料单明细 (物料流水号, 组件流水号) + INCLUDE (已领数量); +END; +GO + +ALTER VIEW dbo.物料管理_需求量_视图 +AS +WITH 组件订单 AS +( + SELECT + c.组件流水号, + c.是否分配, + o.订单类型, + o.是否提交, + p.是否启用 + FROM dbo.PDM_组件名称 c + INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号 + INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号 + INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号 +), +需求 AS +( + SELECT b.物料流水号, SUM(ISNULL(b.零件数量, 0)) AS 需求量 + FROM dbo.PDM_零件明细表_基本件 b + INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号 + WHERE co.是否分配 = 1 + AND co.订单类型 <> 3 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 直接用基础字段排除已完成订单 + GROUP BY b.物料流水号 + + UNION ALL + + SELECT s.物料流水号, SUM(ISNULL(s.零件数量, 0)) AS 需求量 + FROM dbo.PDM_零件明细表_标准件和外购件 s + INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号 + WHERE co.是否分配 = 1 + AND co.订单类型 <> 3 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 直接用基础字段排除已完成订单 + GROUP BY s.物料流水号 + + UNION ALL + + SELECT t.物料流水号, SUM(ISNULL(t.实领数, 0)) AS 需求量 + FROM dbo.车间装配管理_装配执行_临时领料明细 t + LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号 + WHERE t.物料流水号 IS NOT NULL + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时领料同口径排除已完成订单 + GROUP BY t.物料流水号 +), +需求汇总 AS +( + SELECT 物料流水号, SUM(需求量) AS 需求量 + FROM 需求 + GROUP BY 物料流水号 +), +已领 AS +( + SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号 + INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号 + WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 扣减已领数时同步排除已完成订单 + GROUP BY b.物料流水号 + + UNION ALL + + SELECT s.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号 + INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号 + WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 扣减已领数时同步排除已完成订单 + GROUP BY s.物料流水号 + + UNION ALL + + SELECT l.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号 + WHERE l.物料流水号 IS NOT NULL + AND ISNULL(l.物料流水号, 0) <> 0 + AND ISNULL(l.基本件流水号, 0) = 0 + AND ISNULL(l.标准件和外购件流水号, 0) = 0 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时件扣减已领数时同步排除已完成订单 + GROUP BY l.物料流水号 +), +已领汇总 AS +( + SELECT 物料流水号, SUM(已领数) AS 已领数 + FROM 已领 + GROUP BY 物料流水号 +) +SELECT + d.物料流水号, + CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 需求量 +FROM 需求汇总 d +LEFT JOIN 已领汇总 l ON d.物料流水号 = l.物料流水号; +GO + +ALTER PROCEDURE [dbo].[物料管理_需求量_更新] +AS +BEGIN + SET NOCOUNT ON; + + DELETE FROM dbo.物料管理_需求量; + + INSERT INTO dbo.物料管理_需求量 + SELECT 物料流水号, 需求量 + FROM dbo.物料管理_需求量_视图 + WHERE 需求量 > 0; +END; +GO + +ALTER PROCEDURE [dbo].[仓储管理_报缺补货_需求量明细_查询] + @物料流水号 INT = 15448 +AS +BEGIN + SET NOCOUNT ON; + + ;WITH 组件订单 AS + ( + SELECT + c.组件流水号, + o.订单编号, + c.是否分配, + o.订单类型, + o.是否提交, + p.是否启用, + ISNULL(k.简称, '') AS 简称 + FROM dbo.PDM_组件名称 c + INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号 + INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号 + INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号 + LEFT JOIN dbo.客户关系管理系统_客户名称 k ON p.客户流水号 = k.客户流水号 + ), + 需求明细 AS + ( + SELECT + co.订单编号, + b.组件流水号, + b.物料流水号, + SUM(ISNULL(b.零件数量, 0)) AS 需求量, + N'生产订单需求' AS 来源 + FROM dbo.PDM_零件明细表_基本件 b + INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号 + WHERE co.是否分配 = 1 + AND co.订单类型 <> 3 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单 + AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号) + GROUP BY co.订单编号, b.组件流水号, b.物料流水号 + + UNION ALL + + SELECT + co.订单编号, + s.组件流水号, + s.物料流水号, + SUM(ISNULL(s.零件数量, 0)) AS 需求量, + N'生产订单需求' AS 来源 + FROM dbo.PDM_零件明细表_标准件和外购件 s + INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号 + WHERE co.是否分配 = 1 + AND co.订单类型 <> 3 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细不显示已完成订单 + AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号) + GROUP BY co.订单编号, s.组件流水号, s.物料流水号 + + UNION ALL + + SELECT + co.订单编号, + t.组件流水号, + t.物料流水号, + SUM(ISNULL(t.实领数, 0)) AS 需求量, + N'临时领料需求' AS 来源 + FROM dbo.车间装配管理_装配执行_临时领料明细 t + LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号 + WHERE t.物料流水号 IS NOT NULL + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时领料明细不显示已完成订单 + AND (@物料流水号 IS NULL OR t.物料流水号 = @物料流水号) + GROUP BY co.订单编号, t.组件流水号, t.物料流水号 + ), + 已领明细 AS + ( + SELECT + co.订单编号, + b.组件流水号, + b.物料流水号, + SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号 + INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号 + WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单 + AND (@物料流水号 IS NULL OR b.物料流水号 = @物料流水号) + GROUP BY co.订单编号, b.组件流水号, b.物料流水号 + + UNION ALL + + SELECT + co.订单编号, + s.组件流水号, + s.物料流水号, + SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号 + INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号 + WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 明细扣减已领数时同步排除已完成订单 + AND (@物料流水号 IS NULL OR s.物料流水号 = @物料流水号) + GROUP BY co.订单编号, s.组件流水号, s.物料流水号 + + UNION ALL + + SELECT + co.订单编号, + l.组件流水号, + l.物料流水号, + SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号 + WHERE l.物料流水号 IS NOT NULL + AND ISNULL(l.物料流水号, 0) <> 0 + AND ISNULL(l.基本件流水号, 0) = 0 + AND ISNULL(l.标准件和外购件流水号, 0) = 0 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:35:00; 临时件明细扣减已领数时同步排除已完成订单 + AND (@物料流水号 IS NULL OR l.物料流水号 = @物料流水号) + GROUP BY co.订单编号, l.组件流水号, l.物料流水号 + ), + 已领汇总 AS + ( + SELECT 订单编号, 组件流水号, 物料流水号, SUM(已领数) AS 已领数 + FROM 已领明细 + GROUP BY 订单编号, 组件流水号, 物料流水号 + ), + 明细 AS + ( + SELECT + d.订单编号, + d.组件流水号, + d.物料流水号, + d.需求量, + ISNULL(l.已领数, 0) AS 已领数, + CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 最终需求量, + d.来源 + FROM 需求明细 d + LEFT JOIN 已领汇总 l + ON d.物料流水号 = l.物料流水号 + AND d.组件流水号 = l.组件流水号 + AND ISNULL(d.订单编号, '') = ISNULL(l.订单编号, '') + ) + SELECT + d.订单编号, + d.组件流水号, + d.物料流水号, + d.需求量, + d.已领数, + d.最终需求量, + ISNULL(co.简称, '') AS 简称, + d.来源 + FROM 明细 d + LEFT JOIN 组件订单 co ON d.组件流水号 = co.组件流水号 + ORDER BY d.订单编号, d.组件流水号, d.来源; + + ;WITH 汇总 AS + ( + SELECT 物料流水号, 需求量 + FROM dbo.物料管理_需求量_视图 + WHERE (@物料流水号 IS NULL OR 物料流水号 = @物料流水号) + ) + SELECT + 物料流水号, + 需求量 AS 总需求量, + 0 AS 总已领数, + 需求量 AS 总最终需求量 + FROM 汇总 + ORDER BY 物料流水号; +END; +GO diff --git a/sql/inventory_demand_performance_optimize_backup_fix_20260714.sql b/sql/inventory_demand_performance_optimize_backup_fix_20260714.sql new file mode 100644 index 00000000..63c58dad --- /dev/null +++ b/sql/inventory_demand_performance_optimize_backup_fix_20260714.sql @@ -0,0 +1,149 @@ +-- 库存查询需求量性能优化补充:补齐备货/临时备货领料扣减口径 +-- 修改人:Ld 修改时间:2026-07-14 16:42:00; + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_备货领料_领料流水号_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_动力头备货_领料明细')) +BEGIN + CREATE NONCLUSTERED INDEX IX_Ld_备货领料_领料流水号_20260714 + ON dbo.车间装配管理_动力头备货_领料明细 (领料流水号) + INCLUDE (物料流水号); +END; +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_临时备货领料_临时流水号_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_动力头备货_临时领料明细')) +BEGIN + CREATE NONCLUSTERED INDEX IX_Ld_临时备货领料_临时流水号_20260714 + ON dbo.车间装配管理_动力头备货_临时领料明细 (临时流水号) + INCLUDE (物料流水号); +END; +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_Ld_领料明细_临时流水号_20260714' AND object_id = OBJECT_ID(N'dbo.车间装配管理_领料单明细')) +BEGIN + CREATE NONCLUSTERED INDEX IX_Ld_领料明细_临时流水号_20260714 + ON dbo.车间装配管理_领料单明细 (临时流水号) + INCLUDE (已领数量); +END; +GO + +ALTER VIEW dbo.物料管理_需求量_视图 +AS +WITH 组件订单 AS +( + SELECT + c.组件流水号, + c.是否分配, + o.订单类型, + o.是否提交, + p.是否启用 + FROM dbo.PDM_组件名称 c + INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号 + INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号 + INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号 +), +需求 AS +( + SELECT b.物料流水号, SUM(ISNULL(b.零件数量, 0)) AS 需求量 + FROM dbo.PDM_零件明细表_基本件 b + INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号 + WHERE co.是否分配 = 1 + AND co.订单类型 <> 3 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:42:00; 直接用基础字段排除已完成订单 + GROUP BY b.物料流水号 + + UNION ALL + + SELECT s.物料流水号, SUM(ISNULL(s.零件数量, 0)) AS 需求量 + FROM dbo.PDM_零件明细表_标准件和外购件 s + INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号 + WHERE co.是否分配 = 1 + AND co.订单类型 <> 3 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:42:00; 直接用基础字段排除已完成订单 + GROUP BY s.物料流水号 + + UNION ALL + + SELECT t.物料流水号, SUM(ISNULL(t.实领数, 0)) AS 需求量 + FROM dbo.车间装配管理_装配执行_临时领料明细 t + LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号 + WHERE t.物料流水号 IS NOT NULL + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:42:00; 临时领料同口径排除已完成订单 + GROUP BY t.物料流水号 +), +需求汇总 AS +( + SELECT 物料流水号, SUM(需求量) AS 需求量 + FROM 需求 + GROUP BY 物料流水号 +), +已领 AS +( + SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号 + INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号 + WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:42:00; 扣减已领数时同步排除已完成订单 + GROUP BY b.物料流水号 + + UNION ALL + + SELECT s.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号 + INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号 + WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:42:00; 扣减已领数时同步排除已完成订单 + GROUP BY s.物料流水号 + + UNION ALL + + SELECT l.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号 + WHERE l.物料流水号 IS NOT NULL + AND ISNULL(l.物料流水号, 0) <> 0 + AND ISNULL(l.基本件流水号, 0) = 0 + AND ISNULL(l.标准件和外购件流水号, 0) = 0 + AND ISNULL(l.领料流水号, 0) = 0 + AND ISNULL(l.临时流水号, 0) = 0 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:42:00; 临时件扣减已领数时同步排除已完成订单 + GROUP BY l.物料流水号 + + UNION ALL + + SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.车间装配管理_动力头备货_领料明细 b ON l.领料流水号 = b.领料流水号 + GROUP BY b.物料流水号 -- 修改人:Ld 修改时间:2026-07-14 16:42:00; 保留原口径中的备货领料扣减 + + UNION ALL + + SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.车间装配管理_动力头备货_临时领料明细 b ON l.临时流水号 = b.临时流水号 + GROUP BY b.物料流水号 -- 修改人:Ld 修改时间:2026-07-14 16:42:00; 保留原口径中的临时备货领料扣减 +), +已领汇总 AS +( + SELECT 物料流水号, SUM(已领数) AS 已领数 + FROM 已领 + GROUP BY 物料流水号 +) +SELECT + d.物料流水号, + CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 需求量 +FROM 需求汇总 d +LEFT JOIN 已领汇总 l ON d.物料流水号 = l.物料流水号; +GO + +ALTER PROCEDURE [dbo].[物料管理_需求量_更新] +AS +BEGIN + SET NOCOUNT ON; + + DELETE FROM dbo.物料管理_需求量; + + INSERT INTO dbo.物料管理_需求量 + SELECT 物料流水号, 需求量 + FROM dbo.物料管理_需求量_视图 + WHERE 需求量 > 0; -- 修改人:Ld 修改时间:2026-07-14 16:42:00; 复用优化后的视图口径刷新汇总表 +END; +GO diff --git a/sql/inventory_demand_performance_optimize_null_order_fix_20260714.sql b/sql/inventory_demand_performance_optimize_null_order_fix_20260714.sql new file mode 100644 index 00000000..fbb2b8f7 --- /dev/null +++ b/sql/inventory_demand_performance_optimize_null_order_fix_20260714.sql @@ -0,0 +1,111 @@ +-- 库存查询需求量性能优化补充:已领扣减侧保留无订单链路数据,保持旧口径一致 +-- 修改人:Ld 修改时间:2026-07-14 16:50:00; + +ALTER VIEW dbo.物料管理_需求量_视图 +AS +WITH 组件订单 AS +( + SELECT + c.组件流水号, + c.是否分配, + o.订单类型, + o.是否提交, + p.是否启用 + FROM dbo.PDM_组件名称 c + INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号 + INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号 + LEFT JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号 +), +需求 AS +( + SELECT b.物料流水号, SUM(ISNULL(b.零件数量, 0)) AS 需求量 + FROM dbo.PDM_零件明细表_基本件 b + INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号 + WHERE co.是否分配 = 1 + AND co.订单类型 <> 3 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:50:00; 需求侧仍排除已完成订单 + GROUP BY b.物料流水号 + + UNION ALL + + SELECT s.物料流水号, SUM(ISNULL(s.零件数量, 0)) AS 需求量 + FROM dbo.PDM_零件明细表_标准件和外购件 s + INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号 + WHERE co.是否分配 = 1 + AND co.订单类型 <> 3 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:50:00; 需求侧仍排除已完成订单 + GROUP BY s.物料流水号 + + UNION ALL + + SELECT t.物料流水号, SUM(ISNULL(t.实领数, 0)) AS 需求量 + FROM dbo.车间装配管理_装配执行_临时领料明细 t + LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号 + WHERE t.物料流水号 IS NOT NULL + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:50:00; 临时领料同口径排除已完成订单 + GROUP BY t.物料流水号 +), +需求汇总 AS +( + SELECT 物料流水号, SUM(需求量) AS 需求量 + FROM 需求 + GROUP BY 物料流水号 +), +已领 AS +( + SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号 + LEFT JOIN 组件订单 co ON b.组件流水号 = co.组件流水号 + WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:50:00; 已领扣减侧保留无订单链路数据 + GROUP BY b.物料流水号 + + UNION ALL + + SELECT s.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号 + LEFT JOIN 组件订单 co ON s.组件流水号 = co.组件流水号 + WHERE NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:50:00; 已领扣减侧保留无订单链路数据 + GROUP BY s.物料流水号 + + UNION ALL + + SELECT l.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号 + WHERE l.物料流水号 IS NOT NULL + AND ISNULL(l.物料流水号, 0) <> 0 + AND ISNULL(l.基本件流水号, 0) = 0 + AND ISNULL(l.标准件和外购件流水号, 0) = 0 + AND ISNULL(l.领料流水号, 0) = 0 + AND ISNULL(l.临时流水号, 0) = 0 + AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1) -- 修改人:Ld 修改时间:2026-07-14 16:50:00; 临时件扣减侧保留无订单链路数据 + GROUP BY l.物料流水号 + + UNION ALL + + SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.车间装配管理_动力头备货_领料明细 b ON l.领料流水号 = b.领料流水号 + GROUP BY b.物料流水号 -- 修改人:Ld 修改时间:2026-07-14 16:50:00; 保留原口径中的备货领料扣减 + + UNION ALL + + SELECT b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数 + FROM dbo.车间装配管理_领料单明细 l + INNER JOIN dbo.车间装配管理_动力头备货_临时领料明细 b ON l.临时流水号 = b.临时流水号 + GROUP BY b.物料流水号 -- 修改人:Ld 修改时间:2026-07-14 16:50:00; 保留原口径中的临时备货领料扣减 +), +已领汇总 AS +( + SELECT 物料流水号, SUM(已领数) AS 已领数 + FROM 已领 + GROUP BY 物料流水号 +) +SELECT + d.物料流水号, + CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 需求量 +FROM 需求汇总 d +LEFT JOIN 已领汇总 l ON d.物料流水号 = l.物料流水号; +GO diff --git a/sql/工时统计_导出null修复_20260717.sql b/sql/工时统计_导出null修复_20260717.sql new file mode 100644 index 00000000..4b5a0f49 --- /dev/null +++ b/sql/工时统计_导出null修复_20260717.sql @@ -0,0 +1,101 @@ +-- 修复员工工时统计导出 null:统一导出元数据列名,并修正导出文件名前缀;修改人:Ld 修改时间:2026-07-17 07:53:49; +ALTER PROCEDURE [dbo].[报表_精工车间_员工工时统计_查询数据] + @开始时间 DATETIME = NULL, + @结束时间 DATETIME = NULL, + @排序名称 INT = NULL, + @排序方式 INT = NULL +AS +BEGIN + SET NOCOUNT ON; + + -- 后端导出处理器未支持 tabletype=18,使用通用导出类型 15 防止返回 NULL;修改人:Ld 修改时间:2026-07-17 07:58:30; + SELECT N'员工工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype; + + SELECT + 256 * 15 AS 工序, + 256 * 10 AS 工序顺序, + 256 * 30 AS 零件名称, + 256 * 30 AS 零件图号, + 256 * 20 AS 物料编码, + 256 * 10 AS 加工数, + 256 * 12 AS 计价方式, + 256 * 10 AS 单价, + 256 * 12 AS 总价, + 256 * 15 AS 加工工时M, + 256 * 10 AS 暂停时长, + 256 * 30 AS 开始加工时间, + 256 * 30 AS 完成时间, + 256 * 10 AS 操作者, + 256 * 25 AS 设备, + 246 * 25 AS 订单编号, + 246 * 25 AS 产品名称; + + SELECT + 0 AS 工序, + 1 AS 工序顺序, + 0 AS 零件名称, + 0 AS 零件图号, + 0 AS 物料编码, + 1 AS 加工数, + 0 AS 计价方式, + 1 AS 单价, + 1 AS 总价, + 1 AS 加工工时M, + 1 AS 暂停时长, + 0 AS 开始加工时间, + 0 AS 完成时间, + 0 AS 操作者, + 0 AS 设备, + 0 AS 订单编号, + 0 AS 产品名称; + + ;WITH PriceData AS ( + SELECT + data.*, + CASE WHEN data.计价方式 = N'计时' THEN ISNULL(data.单时工价, 0) ELSE CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END END AS 单价, + CASE + WHEN data.计价方式 = N'计时' THEN ROUND(ISNULL(data.加工时长, 0) / 60.0 * ISNULL(data.单时工价, 0), 4) + ELSE ROUND(ISNULL(data.完成数, 0) * CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4) + END AS 总价 + FROM dbo.车间生产管理_零件工序加工时长_视图 data + OUTER APPLY ( + SELECT TOP 1 + CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END AS 单件工价 + FROM dbo.车间生产管理工艺_工序工价 price + WHERE price.零件名称 = data.零件名称 + AND price.图号 = data.图号 + AND price.工序名称 = data.工序 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC + ) priceData + WHERE data.结束加工 >= @开始时间 + AND data.结束加工 <= @结束时间 + ) + SELECT + 工序, + 工序顺序, + 零件名称, + 图号 AS 零件图号, + 物料编码, + 完成数 AS 加工数, + 计价方式, + 单价, + 总价, + 加工时长 AS 加工工时M, + 暂停时间 AS 暂停时长, + 开始加工 AS 开始加工时间, + 结束加工 AS 完成时间, + 操作者, + 工位号 AS 设备, + 订单编号, + 产品名称 + FROM PriceData + ORDER BY + CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN 结束加工 END DESC, + CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN 结束加工 END ASC, + CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN 结束加工 END DESC; +END +GO diff --git a/sql/工时统计_添加工价总价.sql b/sql/工时统计_添加工价总价.sql index 932d7e62..d4157128 100644 --- a/sql/工时统计_添加工价总价.sql +++ b/sql/工时统计_添加工价总价.sql @@ -7,7 +7,88 @@ GO SET QUOTED_IDENTIFIER ON GO --- 员工工时汇总增加工价总价,工价取工序工价当前启用最终单价,总价=完成数量*工价;修改人:Ld 修改时间:2026-07-06 09:12:38; +-- 完成过程表补充计价字段,工时统计按当次完成记录判断计件或计时;修改人:Ld 修改时间:2026-07-06 15:18:06; +IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL +AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'计价方式') IS NULL + ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [计价方式] NVARCHAR(20) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_计价方式] DEFAULT (N'计件'); +GO + +IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL +AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'单件工价') IS NULL + ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [单件工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_单件工价] DEFAULT ((0)); +GO + +IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL +AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'单时工价') IS NULL + ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [单时工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_单时工价] DEFAULT ((0)); +GO + +-- 旧完成记录默认计件,单件工价按工序工价当前启用价格回填;修改人:Ld 修改时间:2026-07-06 15:18:06; +UPDATE finishData +SET 计价方式 = ISNULL(NULLIF(finishData.计价方式, N''), N'计件'), + 单件工价 = CASE + WHEN ISNULL(finishData.单件工价, 0) <> 0 THEN finishData.单件工价 + ELSE ISNULL(priceData.单件工价, 0) + END, + 单时工价 = ISNULL(finishData.单时工价, 0) +FROM [dbo].[设备管理_零件工序_工序完成过程情况] finishData +OUTER APPLY ( + SELECT TOP 1 + CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END AS 单件工价 + FROM [dbo].[车间生产管理工艺_工序工价] price + WHERE price.工序流水号 = finishData.工序流水号 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC +) priceData +WHERE finishData.计价方式 IS NULL + OR finishData.计价方式 = N'' + OR finishData.单件工价 IS NULL + OR finishData.单时工价 IS NULL; +GO + +-- 工时统计明细视图补充完成过程流水号和计价字段,便于计时单价编辑回写;修改人:Ld 修改时间:2026-07-06 15:18:06; +ALTER VIEW [dbo].[车间生产管理_零件工序加工时长_视图] +AS +SELECT + dbo.车间生产管理_零件工序_视图.工序, + dbo.车间生产管理_零件工序_视图.加工设备, + dbo.车间生产管理_零件工序_视图.零件名称, + dbo.车间生产管理_零件工序_视图.零件图号 AS 图号, + dbo.车间生产管理_零件工序_视图.数量, + dbo.设备管理_零件工序_工序完成过程情况.完成数量 AS 完成数, + dbo.设备管理_零件工序_工序完成过程情况.加工开始时间 AS 开始加工, + dbo.设备管理_零件工序_工序完成过程情况.加工完成时间 AS 结束加工, + ISNULL(dbo.设备管理_零件工序_工序完成过程情况.扫码工时, 0) AS 加工时长, + dbo.车间生产管理_零件工序_视图.订单号 AS 订单编号, + dbo.车间生产管理_零件工序_视图.产品名称, + dbo.设备管理_零件工序_工序完成过程情况.操作者编号, + CONVERT(VARCHAR(10), dbo.车间生产管理_零件工序_视图.派工日期, 23) AS 任务下达, + dbo.基础数据_设备工位点检表.设备名称 + N'-' + dbo.设备管理_零件工序_工序完成过程情况.工位号 AS 工位号, + dbo.人事档案管理_人员名单.姓名 AS 操作者, + dbo.车间生产管理_零件工序_视图.订单流水号, + dbo.车间生产管理_零件工序_视图.定额工时, + dbo.车间生产管理_零件工序_视图.准结工时, + dbo.车间生产管理_零件工序_视图.工艺计划流水号, + dbo.车间生产管理_零件工序_视图.物料编码, + dbo.车间生产管理_零件工序_视图.工序顺序, + dbo.设备管理_零件工序_工序完成过程情况.暂停时间, + dbo.设备管理_零件工序_工序完成过程情况.完成过程流水号, + ISNULL(NULLIF(dbo.设备管理_零件工序_工序完成过程情况.计价方式, N''), N'计件') AS 计价方式, + ISNULL(dbo.设备管理_零件工序_工序完成过程情况.单件工价, 0) AS 单件工价, + ISNULL(dbo.设备管理_零件工序_工序完成过程情况.单时工价, 0) AS 单时工价 +FROM dbo.车间生产管理_零件工序_视图 + INNER JOIN dbo.设备管理_零件工序_工序完成过程情况 + ON dbo.车间生产管理_零件工序_视图.工序流水号 = dbo.设备管理_零件工序_工序完成过程情况.工序流水号 + INNER JOIN dbo.基础数据_设备工位点检表 + ON dbo.设备管理_零件工序_工序完成过程情况.工位号 = dbo.基础数据_设备工位点检表.工位号 + INNER JOIN dbo.人事档案管理_人员名单 + ON dbo.设备管理_零件工序_工序完成过程情况.操作者编号 = dbo.人事档案管理_人员名单.人员编号 +GO + +-- 员工工时汇总增加单价总价,计件按单件工价*数量,计时按单时工价*加工分钟/60;修改人:Ld 修改时间:2026-07-06 15:18:06; ALTER PROCEDURE [dbo].[车间生产管理_工人工时统计_查询数据] @开始时间 DATETIME = NULL, @结束时间 DATETIME = NULL @@ -28,16 +109,24 @@ BEGIN f.操作者编号, f.完成日期, f.完成数量, - ISNULL(f.完成数量, 0) * ISNULL(price.工价, 0) AS 总价 + CASE + WHEN ISNULL(NULLIF(f.计价方式, N''), N'计件') = N'计时' + THEN ROUND(ISNULL(f.扫码工时, 0) / 60.0 * ISNULL(f.单时工价, 0), 4) + ELSE ROUND(ISNULL(f.完成数量, 0) * CASE WHEN ISNULL(f.单件工价, 0) <> 0 THEN f.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4) + END AS 总价 FROM dbo.设备管理_零件工序_工序完成过程情况 f INNER JOIN dbo.人事档案管理_人员名单 p ON f.操作者编号 = p.人员编号 OUTER APPLY ( - SELECT TOP 1 ISNULL(pp.[最终单价(元/件)], 0) AS 工价 - FROM dbo.车间生产管理工艺_工序工价 pp - WHERE pp.工序流水号 = f.工序流水号 - AND ISNULL(pp.是否启用, 1) = 1 - ORDER BY ISNULL(pp.生效日期, CONVERT(DATE, '1900-01-01')) DESC, pp.修改时间 DESC, pp.工价流水号 DESC - ) price + SELECT TOP 1 + CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END AS 单件工价 + FROM dbo.车间生产管理工艺_工序工价 price + WHERE price.工序流水号 = f.工序流水号 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC + ) priceData WHERE f.完成日期 >= @开始时间 AND f.完成日期 <= @结束时间 ) a @@ -45,7 +134,7 @@ BEGIN END GO --- 员工工时明细增加工价总价,明细按零件名称+图号+工序匹配工序工价;修改人:Ld 修改时间:2026-07-06 09:12:38; +-- 员工工时明细返回单价,计时记录允许前端编辑单时工价;修改人:Ld 修改时间:2026-07-06 15:18:06; ALTER PROCEDURE [dbo].[精工车间_员工工时统计_详情_查询数据] @操作者编号 INT = 62, @开始时间 DATETIME = NULL, @@ -56,32 +145,43 @@ AS BEGIN SET NOCOUNT ON; - SELECT - data.*, - data.加工时长 / NULLIF(data.完成数, 0) AS 单个工时, - ISNULL(price.工价, 0) AS 工价, - ISNULL(data.完成数, 0) * ISNULL(price.工价, 0) AS 总价 - FROM dbo.车间生产管理_零件工序加工时长_视图 data - OUTER APPLY ( - SELECT TOP 1 ISNULL(pp.[最终单价(元/件)], 0) AS 工价 - FROM dbo.车间生产管理工艺_工序工价 pp - WHERE pp.零件名称 = data.零件名称 - AND pp.图号 = data.图号 - AND pp.工序名称 = data.工序 - AND ISNULL(pp.是否启用, 1) = 1 - ORDER BY ISNULL(pp.生效日期, CONVERT(DATE, '1900-01-01')) DESC, pp.修改时间 DESC, pp.工价流水号 DESC - ) price - WHERE data.操作者编号 = @操作者编号 - AND data.结束加工 >= @开始时间 - AND data.结束加工 < DATEADD(DAY, 1, @结束时间) + ;WITH PriceData AS ( + SELECT + data.*, + data.加工时长 / NULLIF(data.完成数, 0) AS 单个工时, + CASE WHEN data.计价方式 = N'计时' THEN ISNULL(data.单时工价, 0) ELSE CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END END AS 单价, + CASE + WHEN data.计价方式 = N'计时' THEN ROUND(ISNULL(data.加工时长, 0) / 60.0 * ISNULL(data.单时工价, 0), 4) + ELSE ROUND(ISNULL(data.完成数, 0) * CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4) + END AS 总价 + FROM dbo.车间生产管理_零件工序加工时长_视图 data + OUTER APPLY ( + SELECT TOP 1 + CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END AS 单件工价 + FROM dbo.车间生产管理工艺_工序工价 price + WHERE price.零件名称 = data.零件名称 + AND price.图号 = data.图号 + AND price.工序名称 = data.工序 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC + ) priceData + WHERE data.操作者编号 = @操作者编号 + AND data.结束加工 >= @开始时间 + AND data.结束加工 < DATEADD(DAY, 1, @结束时间) + ) + SELECT * + FROM PriceData ORDER BY - CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN data.结束加工 END DESC, - CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN data.结束加工 END ASC, - CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN data.结束加工 END DESC; + CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN 结束加工 END DESC, + CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN 结束加工 END ASC, + CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN 结束加工 END DESC; END GO --- 设备工时汇总增加工价总价,工价取工序工价当前启用最终单价,总价=完成数量*工价;修改人:Ld 修改时间:2026-07-06 09:12:38; +-- 设备工时汇总增加单价总价,计件按单件工价*数量,计时按单时工价*加工分钟/60;修改人:Ld 修改时间:2026-07-06 15:18:06; ALTER PROCEDURE [dbo].[车间生产管理_设备工时统计_查询数据] @开始时间 DATETIME = NULL, @结束时间 DATETIME = NULL @@ -99,16 +199,24 @@ BEGIN ISNULL(f.扫码工时, 0) AS 工时, e.设备名称 + N'-' + f.工位号 AS 工位号, f.完成数量, - ISNULL(f.完成数量, 0) * ISNULL(price.工价, 0) AS 总价 + CASE + WHEN ISNULL(NULLIF(f.计价方式, N''), N'计件') = N'计时' + THEN ROUND(ISNULL(f.扫码工时, 0) / 60.0 * ISNULL(f.单时工价, 0), 4) + ELSE ROUND(ISNULL(f.完成数量, 0) * CASE WHEN ISNULL(f.单件工价, 0) <> 0 THEN f.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4) + END AS 总价 FROM dbo.设备管理_零件工序_工序完成过程情况 f INNER JOIN dbo.基础数据_设备工位点检表 e ON f.工位号 = e.工位号 OUTER APPLY ( - SELECT TOP 1 ISNULL(pp.[最终单价(元/件)], 0) AS 工价 - FROM dbo.车间生产管理工艺_工序工价 pp - WHERE pp.工序流水号 = f.工序流水号 - AND ISNULL(pp.是否启用, 1) = 1 - ORDER BY ISNULL(pp.生效日期, CONVERT(DATE, '1900-01-01')) DESC, pp.修改时间 DESC, pp.工价流水号 DESC - ) price + SELECT TOP 1 + CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END AS 单件工价 + FROM dbo.车间生产管理工艺_工序工价 price + WHERE price.工序流水号 = f.工序流水号 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC + ) priceData WHERE f.完成日期 >= @开始时间 AND f.完成日期 <= @结束时间 ) a @@ -116,7 +224,7 @@ BEGIN END GO --- 设备工时明细增加工价总价,明细按零件名称+图号+工序匹配工序工价;修改人:Ld 修改时间:2026-07-06 09:12:38; +-- 设备工时明细返回单价,计时记录允许前端编辑单时工价;修改人:Ld 修改时间:2026-07-06 15:18:06; ALTER PROCEDURE [dbo].[精工车间_设备工时统计_详情_查询数据] @设备 NVARCHAR(50) = NULL, @开始时间 DATETIME = NULL, @@ -127,31 +235,76 @@ AS BEGIN SET NOCOUNT ON; - SELECT - data.*, - ISNULL(price.工价, 0) AS 工价, - ISNULL(data.完成数, 0) * ISNULL(price.工价, 0) AS 总价 - FROM dbo.车间生产管理_零件工序加工时长_视图 data - OUTER APPLY ( - SELECT TOP 1 ISNULL(pp.[最终单价(元/件)], 0) AS 工价 - FROM dbo.车间生产管理工艺_工序工价 pp - WHERE pp.零件名称 = data.零件名称 - AND pp.图号 = data.图号 - AND pp.工序名称 = data.工序 - AND ISNULL(pp.是否启用, 1) = 1 - ORDER BY ISNULL(pp.生效日期, CONVERT(DATE, '1900-01-01')) DESC, pp.修改时间 DESC, pp.工价流水号 DESC - ) price - WHERE data.工位号 = @设备 - AND data.结束加工 >= @开始时间 - AND data.结束加工 <= @结束时间 + ;WITH PriceData AS ( + SELECT + data.*, + CASE WHEN data.计价方式 = N'计时' THEN ISNULL(data.单时工价, 0) ELSE CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END END AS 单价, + CASE + WHEN data.计价方式 = N'计时' THEN ROUND(ISNULL(data.加工时长, 0) / 60.0 * ISNULL(data.单时工价, 0), 4) + ELSE ROUND(ISNULL(data.完成数, 0) * CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4) + END AS 总价 + FROM dbo.车间生产管理_零件工序加工时长_视图 data + OUTER APPLY ( + SELECT TOP 1 + CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END AS 单件工价 + FROM dbo.车间生产管理工艺_工序工价 price + WHERE price.零件名称 = data.零件名称 + AND price.图号 = data.图号 + AND price.工序名称 = data.工序 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC + ) priceData + WHERE data.工位号 = @设备 + AND data.结束加工 >= @开始时间 + AND data.结束加工 <= @结束时间 + ) + SELECT * + FROM PriceData ORDER BY - CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN data.结束加工 END DESC, - CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN data.结束加工 END ASC, - CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN data.结束加工 END DESC; + CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN 结束加工 END DESC, + CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN 结束加工 END ASC, + CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN 结束加工 END DESC; END GO --- 员工工时导出增加工价总价列,保持与页面明细一致;修改人:Ld 修改时间:2026-07-06 09:12:38; +-- 计时记录单时工价编辑保存;修改人:Ld 修改时间:2026-07-06 15:18:06; +IF OBJECT_ID(N'[dbo].[车间生产管理_工时统计_单时工价_修改数据]', N'P') IS NOT NULL + DROP PROCEDURE [dbo].[车间生产管理_工时统计_单时工价_修改数据]; +GO + +CREATE PROCEDURE [dbo].[车间生产管理_工时统计_单时工价_修改数据] + @完成过程流水号 NVARCHAR(50) = N'', + @单时工价 NVARCHAR(50) = N'' +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @Id INT; + DECLARE @Safe单时工价 DECIMAL(18, 4); + + SET @Id = CASE WHEN ISNUMERIC(NULLIF(@完成过程流水号, N'')) = 1 THEN CONVERT(INT, @完成过程流水号) ELSE NULL END; + SET @Safe单时工价 = CASE WHEN ISNUMERIC(NULLIF(@单时工价, N'')) = 1 THEN CONVERT(DECIMAL(18, 4), @单时工价) ELSE 0 END; + + IF @Id IS NULL + BEGIN + SELECT N'0' AS result, N'完成过程流水号不能为空' AS message; + RETURN; + END; + + UPDATE [dbo].[设备管理_零件工序_工序完成过程情况] + SET 计价方式 = N'计时', + 单时工价 = @Safe单时工价, + 修改时间 = GETDATE() + WHERE 完成过程流水号 = @Id; + + SELECT N'1' AS result; +END +GO + +-- 员工工时导出增加计价方式、单价和总价列;修改人:Ld 修改时间:2026-07-06 15:18:06; ALTER PROCEDURE [dbo].[报表_精工车间_员工工时统计_查询数据] @开始时间 DATETIME = NULL, @结束时间 DATETIME = NULL, @@ -161,7 +314,9 @@ AS BEGIN SET NOCOUNT ON; - SELECT N'库存_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '17' AS tabletype; + -- 修正导出文件名前缀,避免工时统计导出显示库存文件名;修改人:Ld 修改时间:2026-07-17 07:53:49; + -- 后端导出处理器未支持 tabletype=18,使用通用导出类型 15 防止返回 NULL;修改人:Ld 修改时间:2026-07-17 07:58:30; + SELECT N'员工工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype; SELECT 256 * 15 AS 工序, @@ -170,10 +325,11 @@ BEGIN 256 * 30 AS 零件图号, 256 * 20 AS 物料编码, 256 * 10 AS 加工数, + 256 * 12 AS 计价方式, + 256 * 10 AS 单价, + 256 * 12 AS 总价, 256 * 15 AS 加工工时M, 256 * 10 AS 暂停时长, - 256 * 10 AS 工价, - 256 * 12 AS 总价, 256 * 30 AS 开始加工时间, 256 * 30 AS 完成时间, 256 * 10 AS 操作者, @@ -186,12 +342,14 @@ BEGIN 1 AS 工序顺序, 0 AS 零件名称, 0 AS 零件图号, - 0 AS 物料编号, + -- 修正导出元数据列名需与字段宽度和数据列一致;修改人:Ld 修改时间:2026-07-17 07:53:49; + 0 AS 物料编码, 1 AS 加工数, + 0 AS 计价方式, + 1 AS 单价, + 1 AS 总价, 1 AS 加工工时M, 1 AS 暂停时长, - 1 AS 工价, - 1 AS 总价, 0 AS 开始加工时间, 0 AS 完成时间, 0 AS 操作者, @@ -199,38 +357,53 @@ BEGIN 0 AS 订单编号, 0 AS 产品名称; + ;WITH PriceData AS ( + SELECT + data.*, + CASE WHEN data.计价方式 = N'计时' THEN ISNULL(data.单时工价, 0) ELSE CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END END AS 单价, + CASE + WHEN data.计价方式 = N'计时' THEN ROUND(ISNULL(data.加工时长, 0) / 60.0 * ISNULL(data.单时工价, 0), 4) + ELSE ROUND(ISNULL(data.完成数, 0) * CASE WHEN ISNULL(data.单件工价, 0) <> 0 THEN data.单件工价 ELSE ISNULL(priceData.单件工价, 0) END, 4) + END AS 总价 + FROM dbo.车间生产管理_零件工序加工时长_视图 data + OUTER APPLY ( + SELECT TOP 1 + CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END AS 单件工价 + FROM dbo.车间生产管理工艺_工序工价 price + WHERE price.零件名称 = data.零件名称 + AND price.图号 = data.图号 + AND price.工序名称 = data.工序 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC + ) priceData + WHERE data.结束加工 >= @开始时间 + AND data.结束加工 <= @结束时间 + ) SELECT - data.工序, - data.工序顺序, - data.零件名称, - data.图号 AS 零件图号, - data.物料编码, - data.完成数 AS 加工数, - data.加工时长 AS 加工工时M, - data.暂停时间 AS 暂停时长, - ISNULL(price.工价, 0) AS 工价, - ISNULL(data.完成数, 0) * ISNULL(price.工价, 0) AS 总价, - data.开始加工 AS 开始加工时间, - data.结束加工 AS 完成时间, - data.操作者, - data.工位号 AS 设备, - data.订单编号, - data.产品名称 - FROM dbo.车间生产管理_零件工序加工时长_视图 data - OUTER APPLY ( - SELECT TOP 1 ISNULL(pp.[最终单价(元/件)], 0) AS 工价 - FROM dbo.车间生产管理工艺_工序工价 pp - WHERE pp.零件名称 = data.零件名称 - AND pp.图号 = data.图号 - AND pp.工序名称 = data.工序 - AND ISNULL(pp.是否启用, 1) = 1 - ORDER BY ISNULL(pp.生效日期, CONVERT(DATE, '1900-01-01')) DESC, pp.修改时间 DESC, pp.工价流水号 DESC - ) price - WHERE data.结束加工 >= @开始时间 - AND data.结束加工 <= @结束时间 + 工序, + 工序顺序, + 零件名称, + 图号 AS 零件图号, + 物料编码, + 完成数 AS 加工数, + 计价方式, + 单价, + 总价, + 加工时长 AS 加工工时M, + 暂停时间 AS 暂停时长, + 开始加工 AS 开始加工时间, + 结束加工 AS 完成时间, + 操作者, + 工位号 AS 设备, + 订单编号, + 产品名称 + FROM PriceData ORDER BY - CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN data.结束加工 END DESC, - CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN data.结束加工 END ASC, - CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN data.结束加工 END DESC; + CASE WHEN @排序名称 = 1 AND @排序方式 = 1 THEN 结束加工 END DESC, + CASE WHEN @排序名称 = 1 AND @排序方式 <> 1 THEN 结束加工 END ASC, + CASE WHEN ISNULL(@排序名称, 0) <> 1 THEN 结束加工 END DESC; END GO diff --git a/sql/机加工MES_加工完成整修审核_查询审核.sql b/sql/机加工MES_加工完成整修审核_查询审核.sql index c5633e0f..72ff05c0 100644 --- a/sql/机加工MES_加工完成整修审核_查询审核.sql +++ b/sql/机加工MES_加工完成整修审核_查询审核.sql @@ -1,4 +1,36 @@ --- 生产完成审核查询与审核处理 修改人:Ld 修改时间:2026-07-02 13:57:18; +-- 生产完成审核查询与审核处理 修改人:Ld 修改时间:2026-07-02 13:57:18; +-- 生产审核补充计价方式和工价字段,用于传递到工时统计;修改人:Ld 修改时间:2026-07-06 15:18:06; +IF OBJECT_ID(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'U') IS NOT NULL +AND COL_LENGTH(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'计价方式') IS NULL + ALTER TABLE [dbo].[MES_机加工MES_加工完成整修审核表] ADD [计价方式] NVARCHAR(20) NULL CONSTRAINT [DF_MES_机加工MES_加工完成整修审核表_计价方式] DEFAULT (N'计件'); +GO + +IF OBJECT_ID(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'U') IS NOT NULL +AND COL_LENGTH(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'单件工价') IS NULL + ALTER TABLE [dbo].[MES_机加工MES_加工完成整修审核表] ADD [单件工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_MES_机加工MES_加工完成整修审核表_单件工价] DEFAULT ((0)); +GO + +IF OBJECT_ID(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'U') IS NOT NULL +AND COL_LENGTH(N'[dbo].[MES_机加工MES_加工完成整修审核表]', N'单时工价') IS NULL + ALTER TABLE [dbo].[MES_机加工MES_加工完成整修审核表] ADD [单时工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_MES_机加工MES_加工完成整修审核表_单时工价] DEFAULT ((0)); +GO + +-- 审核通过后写入完成过程表的计价字段,保障本脚本可单独部署;修改人:Ld 修改时间:2026-07-06 15:18:06; +IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL +AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'计价方式') IS NULL + ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [计价方式] NVARCHAR(20) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_计价方式] DEFAULT (N'计件'); +GO + +IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL +AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'单件工价') IS NULL + ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [单件工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_单件工价] DEFAULT ((0)); +GO + +IF OBJECT_ID(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'U') IS NOT NULL +AND COL_LENGTH(N'[dbo].[设备管理_零件工序_工序完成过程情况]', N'单时工价') IS NULL + ALTER TABLE [dbo].[设备管理_零件工序_工序完成过程情况] ADD [单时工价] DECIMAL(18, 4) NULL CONSTRAINT [DF_设备管理_零件工序_工序完成过程情况_单时工价] DEFAULT ((0)); +GO + IF OBJECT_ID(N'[dbo].[机加工MES_加工完成整修审核_查询数据]', N'P') IS NOT NULL DROP PROCEDURE [dbo].[机加工MES_加工完成整修审核_查询数据]; GO @@ -49,6 +81,9 @@ BEGIN 工作者.姓名 AS 工作者姓名, A.完成数量, A.完成类型, + ISNULL(NULLIF(A.计价方式, N''), N'计件') AS 计价方式, + CASE WHEN ISNULL(A.单件工价, 0) <> 0 THEN A.单件工价 ELSE ISNULL(priceData.单件工价, 0) END AS 单件工价, + ISNULL(A.单时工价, 0) AS 单时工价, A.录工票人员编号, 录工票人员.姓名 AS 录工票人员姓名, A.工位号, @@ -90,6 +125,17 @@ BEGIN OR A.审核人 = 审核人员.姓名 LEFT JOIN [dbo].[基础数据_设备工位点检表] AS SB ON A.工位号 = SB.工位号 + OUTER APPLY ( + SELECT TOP 1 + CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END AS 单件工价 + FROM [dbo].[车间生产管理工艺_工序工价] price + WHERE price.工序流水号 = A.工序流水号 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC + ) priceData WHERE (@审核状态_check = 0 OR A.审核状态 = @审核状态) AND (@审核类型_check = 0 OR A.审核类型 = @审核类型) AND (@操作者_check = 0 OR ISNULL(操作者人员.姓名, ISNULL(A.操作者, N'')) LIKE N'%' + @操作者 + N'%') @@ -115,6 +161,9 @@ BEGIN 工作者姓名, 完成数量, 完成类型, + 计价方式, + 单件工价, + 单时工价, 录工票人员编号, 录工票人员姓名, 工位号, @@ -155,12 +204,8 @@ BEGIN END; GO --- 生产完成审核状态更新,审核通过时接入原 MES 完工链路 修改人:Ld 修改时间:2026-07-02 14:55:23; -IF OBJECT_ID(N'[dbo].[机加工MES_加工完成整修审核_审核数据]', N'P') IS NOT NULL - DROP PROCEDURE [dbo].[机加工MES_加工完成整修审核_审核数据]; -GO - -CREATE PROCEDURE [dbo].[机加工MES_加工完成整修审核_审核数据] +-- 生产审核普通通过只改审核状态为已审核;修改数量/时间才修正生产完成数据。修改人:Ld 修改时间:2026-07-17 09:10:08; +ALTER PROCEDURE [dbo].[机加工MES_加工完成整修审核_审核数据] @审核流水号 INT, @审核状态 NVARCHAR(20), @审核人 NVARCHAR(100) = NULL, @@ -170,28 +215,39 @@ CREATE PROCEDURE [dbo].[机加工MES_加工完成整修审核_审核数据] @审核加工完成时间 DATETIME = NULL, @审核整修开始时间 DATETIME = NULL, @审核整修结束时间 DATETIME = NULL, - @审核整修方案 NVARCHAR(1000) = NULL + @审核整修方案 NVARCHAR(1000) = NULL, + @计价方式 NVARCHAR(20) = NULL AS BEGIN SET NOCOUNT ON; + DECLARE @目标审核状态 NVARCHAR(20); DECLARE @审核类型 NVARCHAR(50); DECLARE @工序流水号 INT; - DECLARE @工作者考勤编号 NVARCHAR(50); - DECLARE @完成数量 FLOAT; - DECLARE @完成类型 INT; + DECLARE @原完成数量 FLOAT; + DECLARE @最终完成数量 FLOAT; + DECLARE @数量差 FLOAT; DECLARE @录工票人员编号 INT; DECLARE @工位号 NVARCHAR(100); - DECLARE @备注 NVARCHAR(500); + DECLARE @设备流水号 INT; + DECLARE @完成过程流水号 INT; DECLARE @设备号 NVARCHAR(100); DECLARE @整修记录id INT; DECLARE @整修方案 NVARCHAR(1000); - DECLARE @剩余工时 FLOAT; - DECLARE @剩余数量 INT; - DECLARE @原流程结果 NVARCHAR(100); - DECLARE @完成过程流水号 INT; + DECLARE @Safe计价方式 NVARCHAR(20); + DECLARE @单件工价 DECIMAL(18, 4); + DECLARE @单时工价 DECIMAL(18, 4); + DECLARE @是否修改加工 BIT = 0; + DECLARE @是否修改整修 BIT = 0; DECLARE @是否本过程开启事务 BIT; - DECLARE @原流程返回 TABLE (result NVARCHAR(100)); + + SET @目标审核状态 = CASE WHEN @审核状态 IN (N'审核通过', N'已审核') THEN N'已审核' ELSE @审核状态 END; + + IF @目标审核状态 NOT IN (N'已审核', N'审核不通过') + BEGIN + SELECT N'0' AS result, N'审核状态不正确' AS message; + RETURN; + END; IF NOT EXISTS ( SELECT 1 @@ -204,172 +260,172 @@ BEGIN RETURN; END; - IF @审核状态 NOT IN (N'审核通过', N'审核不通过') - BEGIN - SELECT N'0' AS result, N'审核状态不正确' AS message; - RETURN; - END; - SELECT @审核类型 = 审核类型, @工序流水号 = 工序流水号, - @工作者考勤编号 = 工作者考勤编号, - @完成数量 = ISNULL(@审核完成数量, 完成数量), - @完成类型 = 完成类型, + @原完成数量 = ISNULL(完成数量, 0), @录工票人员编号 = 录工票人员编号, @工位号 = 工位号, - @备注 = 备注, @设备号 = 设备号, @整修记录id = 整修记录id, - @整修方案 = ISNULL(@审核整修方案, 整修方案) + @整修方案 = ISNULL(@审核整修方案, 整修方案), + @Safe计价方式 = ISNULL(NULLIF(@计价方式, N''), ISNULL(NULLIF(计价方式, N''), N'计件')), + @单时工价 = ISNULL(单时工价, 0) FROM [dbo].[MES_机加工MES_加工完成整修审核表] WHERE id = @审核流水号 AND 审核状态 = N'待审核'; + IF @Safe计价方式 NOT IN (N'计件', N'计时') + SET @Safe计价方式 = N'计件'; + + SET @最终完成数量 = ISNULL(@审核完成数量, @原完成数量); + SET @数量差 = ISNULL(@最终完成数量, 0) - ISNULL(@原完成数量, 0); + SET @是否修改加工 = CASE + WHEN @目标审核状态 = N'已审核' + AND @审核类型 = N'加工完成' + AND (@审核完成数量 IS NOT NULL OR @审核加工开始时间 IS NOT NULL OR @审核加工完成时间 IS NOT NULL OR @计价方式 IS NOT NULL) + THEN 1 ELSE 0 END; + SET @是否修改整修 = CASE + WHEN @目标审核状态 = N'已审核' + AND @审核类型 = N'结束整修' + AND (@审核整修开始时间 IS NOT NULL OR @审核整修结束时间 IS NOT NULL OR @审核整修方案 IS NOT NULL) + THEN 1 ELSE 0 END; + + IF @是否修改加工 = 1 AND (@最终完成数量 < 0 OR @最终完成数量 <> FLOOR(@最终完成数量)) + BEGIN + SELECT N'0' AS result, N'完成数量必须为大于等于 0 的整数' AS message; + RETURN; + END; + + SELECT TOP 1 @单件工价 = CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END + FROM [dbo].[车间生产管理工艺_工序工价] price + WHERE price.工序流水号 = @工序流水号 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC; + + SET @单件工价 = ISNULL(@单件工价, 0); + SET @单时工价 = ISNULL(@单时工价, 0); + BEGIN TRY SET @是否本过程开启事务 = CASE WHEN @@TRANCOUNT = 0 THEN 1 ELSE 0 END; IF @是否本过程开启事务 = 1 - BEGIN BEGIN TRAN; - END ELSE - BEGIN SAVE TRAN 生产完成审核保存点; - END; - IF @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' + IF @是否修改加工 = 1 BEGIN - IF @工序流水号 IS NULL OR @工作者考勤编号 IS NULL OR @完成数量 IS NULL OR @完成类型 IS NULL OR @录工票人员编号 IS NULL + SELECT @设备流水号 = [设备流水号] + FROM [dbo].[基础数据_设备工位点检表] + WHERE [工位号] = @工位号; + + SELECT TOP 1 @完成过程流水号 = [完成过程流水号] + FROM [dbo].[设备管理_零件工序_工序完成过程情况] + WHERE [工序流水号] = @工序流水号 + AND [录工票人员编号] = @录工票人员编号 + AND [工位号] = @工位号 + AND [完成数量] = @原完成数量 + ORDER BY [完成过程流水号] DESC; + + IF @完成过程流水号 IS NULL + BEGIN + SELECT TOP 1 @完成过程流水号 = [完成过程流水号] + FROM [dbo].[设备管理_零件工序_工序完成过程情况] + WHERE [工序流水号] = @工序流水号 + AND [录工票人员编号] = @录工票人员编号 + AND [工位号] = @工位号 + ORDER BY [完成过程流水号] DESC; + END; + + IF @完成过程流水号 IS NULL BEGIN IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点; - SELECT N'0' AS result, N'审核记录缺少原 MES 完工必需参数' AS message; + SELECT N'0' AS result, N'未找到对应生产完成记录' AS message; RETURN; END; - IF @完成数量 <= 0 OR @完成数量 <> FLOOR(@完成数量) + UPDATE [dbo].[设备管理_零件工序_工序完成过程情况] + SET [完成数量] = @最终完成数量, + [加工开始时间] = ISNULL(@审核加工开始时间, [加工开始时间]), + [加工完成时间] = ISNULL(@审核加工完成时间, [加工完成时间]), + [完成日期] = CASE WHEN @审核加工完成时间 IS NULL THEN [完成日期] ELSE CONVERT(DATE, @审核加工完成时间) END, + [操作日期] = ISNULL(@审核加工完成时间, [操作日期]), + [计价方式] = @Safe计价方式, + [单件工价] = @单件工价, + [单时工价] = CASE WHEN @Safe计价方式 = N'计时' THEN ISNULL([单时工价], @单时工价) ELSE 0 END, + [修改人员] = CASE WHEN ISNUMERIC(@审核人) = 1 THEN CAST(@审核人 AS INT) ELSE [修改人员] END, + [修改时间] = GETDATE() + WHERE [完成过程流水号] = @完成过程流水号; + + IF ISNULL(@数量差, 0) <> 0 BEGIN - IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点; - SELECT N'0' AS result, N'完成数量必须为大于 0 的整数' AS message; - RETURN; - END; + UPDATE [dbo].[车间生产管理工艺_零件工序] + SET [完成数量] = ISNULL([完成数量], 0) + @数量差 + WHERE [工序流水号] = @工序流水号; - INSERT INTO @原流程返回(result) - EXEC [dbo].[设备管理_零件工序_工序完成过程情况_增加数据] - @工序流水号 = @工序流水号, - @工作者考勤编号 = @工作者考勤编号, - @完成数量 = @完成数量, - @完成类型 = @完成类型, - @录工票人员编号 = @录工票人员编号, - @工位号 = @工位号, - @备注 = @备注, - @剩余工时 = @剩余工时 OUTPUT, - @剩余数量 = @剩余数量 OUTPUT; - - SELECT TOP 1 @原流程结果 = result FROM @原流程返回; - - IF ISNULL(@原流程结果, N'') <> N'成功' - BEGIN - IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点; - SELECT N'0' AS result, ISNULL(@原流程结果, N'原 MES 完工流程执行失败') AS message; - RETURN; + UPDATE [dbo].[车间生产管理工艺_零件工序_任务分配] + SET [加工数量] = ISNULL([加工数量], 0) + @数量差 + WHERE [工序流水号] = @工序流水号 + AND [人员编号] = @录工票人员编号 + AND [设备流水号] = @设备流水号; END; IF @审核加工完成时间 IS NOT NULL BEGIN - SELECT @完成过程流水号 = MAX(完成过程流水号) - FROM [dbo].[设备管理_零件工序_工序完成过程情况] - WHERE 工序流水号 = @工序流水号 - AND 录工票人员编号 = @录工票人员编号 - AND 完成数量 = @完成数量; - - UPDATE [dbo].[设备管理_零件工序_工序完成过程情况] - SET 加工开始时间 = ISNULL(@审核加工开始时间, 加工开始时间), - 加工完成时间 = @审核加工完成时间, - 完成日期 = CONVERT(DATE, @审核加工完成时间), - 操作日期 = @审核加工完成时间, - 修改人员 = CASE WHEN ISNUMERIC(@审核人) = 1 THEN CAST(@审核人 AS INT) ELSE 修改人员 END, - 修改时间 = GETDATE() - WHERE 完成过程流水号 = @完成过程流水号; - UPDATE [dbo].[车间生产管理工艺_零件工序] - SET 完成日期 = CASE WHEN 完成日期 IS NULL OR 完成数量 >= ISNULL(完成数量, 0) THEN @审核加工完成时间 ELSE 完成日期 END - WHERE 工序流水号 = @工序流水号; - END; - - IF @审核加工开始时间 IS NOT NULL AND @审核加工完成时间 IS NULL - BEGIN - SELECT @完成过程流水号 = MAX(完成过程流水号) - FROM [dbo].[设备管理_零件工序_工序完成过程情况] - WHERE 工序流水号 = @工序流水号 - AND 录工票人员编号 = @录工票人员编号 - AND 完成数量 = @完成数量; - - UPDATE [dbo].[设备管理_零件工序_工序完成过程情况] - SET 加工开始时间 = @审核加工开始时间, - 修改人员 = CASE WHEN ISNUMERIC(@审核人) = 1 THEN CAST(@审核人 AS INT) ELSE 修改人员 END, - 修改时间 = GETDATE() - WHERE 完成过程流水号 = @完成过程流水号; + SET [完成日期] = @审核加工完成时间 + WHERE [工序流水号] = @工序流水号; END; END; - IF @审核状态 = N'审核通过' AND @审核类型 = N'结束整修' + IF @是否修改整修 = 1 BEGIN - IF @整修记录id IS NULL OR @设备号 IS NULL - BEGIN - IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点; - SELECT N'0' AS result, N'审核记录缺少整修结束必需参数' AS message; - RETURN; - END; - UPDATE [dbo].[设备管理_整修] - SET 整修开始时间 = CASE WHEN @审核整修开始时间 IS NULL THEN 整修开始时间 ELSE CONVERT(VARCHAR(20), @审核整修开始时间, 120) END, - 整修结束时间 = CONVERT(VARCHAR(20), ISNULL(@审核整修结束时间, GETDATE()), 120), - 整修状态 = N'1', - 整修方案 = @整修方案 - WHERE id = @整修记录id - AND 设备号 = @设备号; + SET [整修开始时间] = CASE WHEN @审核整修开始时间 IS NULL THEN [整修开始时间] ELSE CONVERT(VARCHAR(20), @审核整修开始时间, 120) END, + [整修结束时间] = CASE WHEN @审核整修结束时间 IS NULL THEN [整修结束时间] ELSE CONVERT(VARCHAR(20), @审核整修结束时间, 120) END, + [整修方案] = @整修方案 + WHERE [id] = @整修记录id + AND [设备号] = @设备号; END; UPDATE [dbo].[MES_机加工MES_加工完成整修审核表] - SET 审核状态 = @审核状态, - 审核人 = @审核人, - 审核时间 = GETDATE(), - 审核意见 = ISNULL(@审核意见, N''), - 完成数量 = CASE WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' THEN @完成数量 ELSE 完成数量 END, - 开始时间 = CASE - WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' AND @审核加工开始时间 IS NOT NULL THEN @审核加工开始时间 - WHEN @审核状态 = N'审核通过' AND @审核类型 = N'结束整修' AND @审核整修开始时间 IS NOT NULL THEN @审核整修开始时间 - ELSE 开始时间 - END, - 结束时间 = CASE - WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' AND @审核加工完成时间 IS NOT NULL THEN @审核加工完成时间 - WHEN @审核状态 = N'审核通过' AND @审核类型 = N'结束整修' THEN ISNULL(@审核整修结束时间, GETDATE()) - ELSE 结束时间 - END, - 整修方案 = CASE WHEN @审核状态 = N'审核通过' AND @审核类型 = N'结束整修' THEN @整修方案 ELSE 整修方案 END, - 剩余工时 = CASE WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' THEN @剩余工时 ELSE 剩余工时 END, - 剩余数量 = CASE WHEN @审核状态 = N'审核通过' AND @审核类型 = N'加工完成' THEN @剩余数量 ELSE 剩余数量 END, - 修改人 = N'Ld', - 修改时间 = GETDATE() - WHERE id = @审核流水号 - AND 审核状态 = N'待审核'; + SET [审核状态] = @目标审核状态, + [审核人] = @审核人, + [审核时间] = GETDATE(), + [审核意见] = ISNULL(@审核意见, N''), + [完成数量] = CASE WHEN @是否修改加工 = 1 THEN @最终完成数量 ELSE [完成数量] END, + [开始时间] = CASE + WHEN @是否修改加工 = 1 AND @审核加工开始时间 IS NOT NULL THEN @审核加工开始时间 + WHEN @是否修改整修 = 1 AND @审核整修开始时间 IS NOT NULL THEN @审核整修开始时间 + ELSE [开始时间] + END, + [结束时间] = CASE + WHEN @是否修改加工 = 1 AND @审核加工完成时间 IS NOT NULL THEN @审核加工完成时间 + WHEN @是否修改整修 = 1 AND @审核整修结束时间 IS NOT NULL THEN @审核整修结束时间 + ELSE [结束时间] + END, + [整修方案] = CASE WHEN @是否修改整修 = 1 THEN @整修方案 ELSE [整修方案] END, + [计价方式] = CASE WHEN @是否修改加工 = 1 THEN @Safe计价方式 ELSE [计价方式] END, + [单件工价] = CASE WHEN @是否修改加工 = 1 THEN @单件工价 ELSE [单件工价] END, + [单时工价] = CASE WHEN @是否修改加工 = 1 THEN @单时工价 ELSE [单时工价] END, + [修改人] = N'Ld', + [修改时间] = GETDATE() + WHERE [id] = @审核流水号 + AND [审核状态] = N'待审核'; IF @是否本过程开启事务 = 1 - BEGIN COMMIT TRAN; - END; END TRY BEGIN CATCH IF @@TRANCOUNT > 0 BEGIN IF ISNULL(@是否本过程开启事务, 1) = 1 - BEGIN ROLLBACK TRAN; - END ELSE - BEGIN ROLLBACK TRAN 生产完成审核保存点; - END; END; SELECT N'0' AS result, ERROR_MESSAGE() AS message; @@ -379,3 +435,5 @@ BEGIN SELECT N'1' AS result; END; GO +GO + diff --git a/sql/生产审核_通过仅更新审核状态.sql b/sql/生产审核_通过仅更新审核状态.sql new file mode 100644 index 00000000..b49ffa2f --- /dev/null +++ b/sql/生产审核_通过仅更新审核状态.sql @@ -0,0 +1,231 @@ +-- 生产审核普通通过只改审核状态为已审核;修改数量/时间才修正生产完成数据。修改人:Ld 修改时间:2026-07-17 09:10:08; +ALTER PROCEDURE [dbo].[机加工MES_加工完成整修审核_审核数据] + @审核流水号 INT, + @审核状态 NVARCHAR(20), + @审核人 NVARCHAR(100) = NULL, + @审核意见 NVARCHAR(1000) = NULL, + @审核完成数量 FLOAT = NULL, + @审核加工开始时间 DATETIME = NULL, + @审核加工完成时间 DATETIME = NULL, + @审核整修开始时间 DATETIME = NULL, + @审核整修结束时间 DATETIME = NULL, + @审核整修方案 NVARCHAR(1000) = NULL, + @计价方式 NVARCHAR(20) = NULL +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @目标审核状态 NVARCHAR(20); + DECLARE @审核类型 NVARCHAR(50); + DECLARE @工序流水号 INT; + DECLARE @原完成数量 FLOAT; + DECLARE @最终完成数量 FLOAT; + DECLARE @数量差 FLOAT; + DECLARE @录工票人员编号 INT; + DECLARE @工位号 NVARCHAR(100); + DECLARE @设备流水号 INT; + DECLARE @完成过程流水号 INT; + DECLARE @设备号 NVARCHAR(100); + DECLARE @整修记录id INT; + DECLARE @整修方案 NVARCHAR(1000); + DECLARE @Safe计价方式 NVARCHAR(20); + DECLARE @单件工价 DECIMAL(18, 4); + DECLARE @单时工价 DECIMAL(18, 4); + DECLARE @是否修改加工 BIT = 0; + DECLARE @是否修改整修 BIT = 0; + DECLARE @是否本过程开启事务 BIT; + + SET @目标审核状态 = CASE WHEN @审核状态 IN (N'审核通过', N'已审核') THEN N'已审核' ELSE @审核状态 END; + + IF @目标审核状态 NOT IN (N'已审核', N'审核不通过') + BEGIN + SELECT N'0' AS result, N'审核状态不正确' AS message; + RETURN; + END; + + IF NOT EXISTS ( + SELECT 1 + FROM [dbo].[MES_机加工MES_加工完成整修审核表] + WHERE id = @审核流水号 + AND 审核状态 = N'待审核' + ) + BEGIN + SELECT N'0' AS result, N'该审核记录不存在或已审核' AS message; + RETURN; + END; + + SELECT + @审核类型 = 审核类型, + @工序流水号 = 工序流水号, + @原完成数量 = ISNULL(完成数量, 0), + @录工票人员编号 = 录工票人员编号, + @工位号 = 工位号, + @设备号 = 设备号, + @整修记录id = 整修记录id, + @整修方案 = ISNULL(@审核整修方案, 整修方案), + @Safe计价方式 = ISNULL(NULLIF(@计价方式, N''), ISNULL(NULLIF(计价方式, N''), N'计件')), + @单时工价 = ISNULL(单时工价, 0) + FROM [dbo].[MES_机加工MES_加工完成整修审核表] + WHERE id = @审核流水号 + AND 审核状态 = N'待审核'; + + IF @Safe计价方式 NOT IN (N'计件', N'计时') + SET @Safe计价方式 = N'计件'; + + SET @最终完成数量 = ISNULL(@审核完成数量, @原完成数量); + SET @数量差 = ISNULL(@最终完成数量, 0) - ISNULL(@原完成数量, 0); + SET @是否修改加工 = CASE + WHEN @目标审核状态 = N'已审核' + AND @审核类型 = N'加工完成' + AND (@审核完成数量 IS NOT NULL OR @审核加工开始时间 IS NOT NULL OR @审核加工完成时间 IS NOT NULL OR @计价方式 IS NOT NULL) + THEN 1 ELSE 0 END; + SET @是否修改整修 = CASE + WHEN @目标审核状态 = N'已审核' + AND @审核类型 = N'结束整修' + AND (@审核整修开始时间 IS NOT NULL OR @审核整修结束时间 IS NOT NULL OR @审核整修方案 IS NOT NULL) + THEN 1 ELSE 0 END; + + IF @是否修改加工 = 1 AND (@最终完成数量 < 0 OR @最终完成数量 <> FLOOR(@最终完成数量)) + BEGIN + SELECT N'0' AS result, N'完成数量必须为大于等于 0 的整数' AS message; + RETURN; + END; + + SELECT TOP 1 @单件工价 = CASE + WHEN ISNULL(price.[单件工价], 0) <> 0 THEN price.[单件工价] + ELSE ISNULL(price.[最终单价(元/件)], 0) + END + FROM [dbo].[车间生产管理工艺_工序工价] price + WHERE price.工序流水号 = @工序流水号 + AND ISNULL(price.是否启用, 1) = 1 + ORDER BY ISNULL(price.生效日期, CONVERT(DATE, '1900-01-01')) DESC, price.修改时间 DESC, price.工价流水号 DESC; + + SET @单件工价 = ISNULL(@单件工价, 0); + SET @单时工价 = ISNULL(@单时工价, 0); + + BEGIN TRY + SET @是否本过程开启事务 = CASE WHEN @@TRANCOUNT = 0 THEN 1 ELSE 0 END; + IF @是否本过程开启事务 = 1 + BEGIN TRAN; + ELSE + SAVE TRAN 生产完成审核保存点; + + IF @是否修改加工 = 1 + BEGIN + SELECT @设备流水号 = [设备流水号] + FROM [dbo].[基础数据_设备工位点检表] + WHERE [工位号] = @工位号; + + SELECT TOP 1 @完成过程流水号 = [完成过程流水号] + FROM [dbo].[设备管理_零件工序_工序完成过程情况] + WHERE [工序流水号] = @工序流水号 + AND [录工票人员编号] = @录工票人员编号 + AND [工位号] = @工位号 + AND [完成数量] = @原完成数量 + ORDER BY [完成过程流水号] DESC; + + IF @完成过程流水号 IS NULL + BEGIN + SELECT TOP 1 @完成过程流水号 = [完成过程流水号] + FROM [dbo].[设备管理_零件工序_工序完成过程情况] + WHERE [工序流水号] = @工序流水号 + AND [录工票人员编号] = @录工票人员编号 + AND [工位号] = @工位号 + ORDER BY [完成过程流水号] DESC; + END; + + IF @完成过程流水号 IS NULL + BEGIN + IF @是否本过程开启事务 = 1 ROLLBACK TRAN ELSE ROLLBACK TRAN 生产完成审核保存点; + SELECT N'0' AS result, N'未找到对应生产完成记录' AS message; + RETURN; + END; + + UPDATE [dbo].[设备管理_零件工序_工序完成过程情况] + SET [完成数量] = @最终完成数量, + [加工开始时间] = ISNULL(@审核加工开始时间, [加工开始时间]), + [加工完成时间] = ISNULL(@审核加工完成时间, [加工完成时间]), + [完成日期] = CASE WHEN @审核加工完成时间 IS NULL THEN [完成日期] ELSE CONVERT(DATE, @审核加工完成时间) END, + [操作日期] = ISNULL(@审核加工完成时间, [操作日期]), + [计价方式] = @Safe计价方式, + [单件工价] = @单件工价, + [单时工价] = CASE WHEN @Safe计价方式 = N'计时' THEN ISNULL([单时工价], @单时工价) ELSE 0 END, + [修改人员] = CASE WHEN ISNUMERIC(@审核人) = 1 THEN CAST(@审核人 AS INT) ELSE [修改人员] END, + [修改时间] = GETDATE() + WHERE [完成过程流水号] = @完成过程流水号; + + IF ISNULL(@数量差, 0) <> 0 + BEGIN + UPDATE [dbo].[车间生产管理工艺_零件工序] + SET [完成数量] = ISNULL([完成数量], 0) + @数量差 + WHERE [工序流水号] = @工序流水号; + + UPDATE [dbo].[车间生产管理工艺_零件工序_任务分配] + SET [加工数量] = ISNULL([加工数量], 0) + @数量差 + WHERE [工序流水号] = @工序流水号 + AND [人员编号] = @录工票人员编号 + AND [设备流水号] = @设备流水号; + END; + + IF @审核加工完成时间 IS NOT NULL + BEGIN + UPDATE [dbo].[车间生产管理工艺_零件工序] + SET [完成日期] = @审核加工完成时间 + WHERE [工序流水号] = @工序流水号; + END; + END; + + IF @是否修改整修 = 1 + BEGIN + UPDATE [dbo].[设备管理_整修] + SET [整修开始时间] = CASE WHEN @审核整修开始时间 IS NULL THEN [整修开始时间] ELSE CONVERT(VARCHAR(20), @审核整修开始时间, 120) END, + [整修结束时间] = CASE WHEN @审核整修结束时间 IS NULL THEN [整修结束时间] ELSE CONVERT(VARCHAR(20), @审核整修结束时间, 120) END, + [整修方案] = @整修方案 + WHERE [id] = @整修记录id + AND [设备号] = @设备号; + END; + + UPDATE [dbo].[MES_机加工MES_加工完成整修审核表] + SET [审核状态] = @目标审核状态, + [审核人] = @审核人, + [审核时间] = GETDATE(), + [审核意见] = ISNULL(@审核意见, N''), + [完成数量] = CASE WHEN @是否修改加工 = 1 THEN @最终完成数量 ELSE [完成数量] END, + [开始时间] = CASE + WHEN @是否修改加工 = 1 AND @审核加工开始时间 IS NOT NULL THEN @审核加工开始时间 + WHEN @是否修改整修 = 1 AND @审核整修开始时间 IS NOT NULL THEN @审核整修开始时间 + ELSE [开始时间] + END, + [结束时间] = CASE + WHEN @是否修改加工 = 1 AND @审核加工完成时间 IS NOT NULL THEN @审核加工完成时间 + WHEN @是否修改整修 = 1 AND @审核整修结束时间 IS NOT NULL THEN @审核整修结束时间 + ELSE [结束时间] + END, + [整修方案] = CASE WHEN @是否修改整修 = 1 THEN @整修方案 ELSE [整修方案] END, + [计价方式] = CASE WHEN @是否修改加工 = 1 THEN @Safe计价方式 ELSE [计价方式] END, + [单件工价] = CASE WHEN @是否修改加工 = 1 THEN @单件工价 ELSE [单件工价] END, + [单时工价] = CASE WHEN @是否修改加工 = 1 THEN @单时工价 ELSE [单时工价] END, + [修改人] = N'Ld', + [修改时间] = GETDATE() + WHERE [id] = @审核流水号 + AND [审核状态] = N'待审核'; + + IF @是否本过程开启事务 = 1 + COMMIT TRAN; + END TRY + BEGIN CATCH + IF @@TRANCOUNT > 0 + BEGIN + IF ISNULL(@是否本过程开启事务, 1) = 1 + ROLLBACK TRAN; + ELSE + ROLLBACK TRAN 生产完成审核保存点; + END; + + SELECT N'0' AS result, ERROR_MESSAGE() AS message; + RETURN; + END CATCH; + + SELECT N'1' AS result; +END; +GO diff --git a/sql/自制件入库_入库单按钮_测试库.sql b/sql/自制件入库_入库单按钮_测试库.sql new file mode 100644 index 00000000..6e93f139 --- /dev/null +++ b/sql/自制件入库_入库单按钮_测试库.sql @@ -0,0 +1,81 @@ +-- 物料入库组件自制件入库模块添加入库单按钮配套测试库脚本 +-- 修改人:Ld 修改时间:2026-07-14 09:05:57; + +ALTER PROCEDURE [dbo].[仓储管理_入库单_查询] + @类型_check bit = 0, + @类型 nvarchar(50) = null +AS +BEGIN + SET NOCOUNT ON; + + -- 修改人:Ld 修改时间:2026-07-14 09:05:57; 返回订单和类型字段,并支持采购/自制件入库单筛选 + SELECT + 入库单.入库单流水号, + 入库单.入库单号, + 入库单.采购合同流水号, + 入库单.采购合同号, + 供应商.供应商名称, + 供应商.供应商流水号, + 入库单.到货数, + 入库单.是否入库, + 入库单.入库时间, + 入库单.订单流水号, + 入库单.订单号, + 入库单.类型 + FROM dbo.仓储管理_入库单 AS 入库单 + LEFT JOIN dbo.采购管理_供应商 AS 供应商 + ON 入库单.供应商流水号 = 供应商.供应商流水号 + WHERE + ISNULL(@类型_check, 0) = 0 + OR ( + @类型 = N'自制' + AND ISNULL(入库单.类型, N'') = N'自制' + ) + OR ( + @类型 = N'采购' + AND ISNULL(入库单.类型, N'') <> N'自制' + ); +END +GO + +IF OBJECT_ID(N'dbo.trg_库存管理_自制件_入库记录_回写入库单', N'TR') IS NOT NULL + DROP TRIGGER dbo.trg_库存管理_自制件_入库记录_回写入库单; +GO + +CREATE TRIGGER dbo.trg_库存管理_自制件_入库记录_回写入库单 +ON dbo.库存管理_自制件_入库记录 +AFTER INSERT +AS +BEGIN + SET NOCOUNT ON; + + -- 修改人:Ld 修改时间:2026-07-14 09:05:57; 自制件完成入库后按订单回写最近一张待入库单状态 + ;WITH 候选入库单 AS ( + SELECT + 入库单.入库单流水号, + ROW_NUMBER() OVER ( + PARTITION BY 新记录.入库记录流水号 + ORDER BY + CASE WHEN CONVERT(float, ISNULL(入库单.到货数, 0)) = CONVERT(float, ISNULL(新记录.实际到货数量, 0)) THEN 0 ELSE 1 END, + 入库单.入库单流水号 + ) AS 排序号 + FROM inserted AS 新记录 + INNER JOIN dbo.车间生产管理_零件工艺计划_视图 AS 工艺计划 + ON 新记录.工艺计划流水号 = 工艺计划.工艺计划流水号 + INNER JOIN dbo.仓储管理_入库单 AS 入库单 + ON 入库单.订单流水号 = CONVERT(nvarchar(100), 工艺计划.订单流水号) + AND ISNULL(入库单.类型, N'') = N'自制' + AND ISNULL(入库单.是否入库, 0) = 0 + ) + UPDATE 入库单 + SET + 入库单.是否入库 = 1, + 入库单.入库时间 = GETDATE() + FROM dbo.仓储管理_入库单 AS 入库单 + INNER JOIN 候选入库单 AS 候选 + ON 入库单.入库单流水号 = 候选.入库单流水号 + WHERE 候选.排序号 = 1; +END +GO + +-- 修改人:Ld 修改时间:2026-07-14 09:05:57; diff --git a/src/views/DeviceManagement/RepairRecord/index.vue b/src/views/DeviceManagement/RepairRecord/index.vue index 059b7e29..e2325875 100644 --- a/src/views/DeviceManagement/RepairRecord/index.vue +++ b/src/views/DeviceManagement/RepairRecord/index.vue @@ -4,6 +4,8 @@
| 物料编码 | 物料名称 | 图号 | 库位 |
|---|---|---|---|
| ' + (list[i].物料编码 || '') + ' | ' + printHtml += '' + (list[i].物料名称 || '') + ' | ' + printHtml += '' + (list[i].图号或型号 || '') + ' | ' + printHtml += '' + (list[i].货位名称 || '') + ' | ' + printHtml += '
| 物料编码 | +物料名称 | +图号或型号 | +库位 | +||||||||||||||
| {{ list.物料编码 }} | +{{ list.物料名称 }} | +{{ list.规格型号 }} | +{{ list.库位 }} | +||||||||||||||
| 合计 | +
+
+ {{ returns.length }} 条
+
+ |
+ ||||||||||||||||