CREATE PROCEDURE [dbo].[车间生产管理工艺_零件工序_取消派工] @工艺任务流水号 INT = NULL, @工序流水号 INT = NULL, @数量 INT = NULL, @退货人 INT = NULL, @订单流水号 INT = NULL AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; DECLARE @工艺计划流水号 INT; DECLARE @任务数量 FLO AT; DECLARE @加工数量 INT; DECLARE @是否加工中 INT; DECLARE @图号 NVARCHAR(50); DECLARE @物料名称 NVARCHAR(50); DECLARE @物料流水号 INT; DECLARE @出库记录流水号 INT; DECLARE @匹配出库记录数 INT; DECLARE @n INT = 0; BEGIN TRY BEGIN TRANSACTION; SELECT @任务数量 = 数量, @加工数量 = ISNULL(加工数量, 0), @是否加工中 = ISNULL(是否加工中, 0) FROM dbo.车间生产管理工艺_零件工序_任务分配 WITH (UPDLOCK, HOLDLOCK) WHERE 工艺任务流水号 = @工艺任务流水号 AND 工序流水号 = @工序流水号; IF @任务数 量 IS NULL BEGIN RAISERROR(N'派工任务不存在或已取消', 16, 1); END; IF @加工数量 > 0 OR @是否加工中 > 0 BEGIN RAISERROR(N'零件已加工或加工中,不能取消派工', 16, 1); END; IF ISNULL(@任务数量, 0) <= 0 BEGIN RAISERROR(N'派工数量异常,不能取消派工', 16, 1); END; SELECT @工艺计划流水号 = 工艺计划流水号 FROM dbo.车间生产管理工艺_零件工序 WHERE 工序流水号 = @工序流水号; SELECT @图号 = RTRIM(LTRIM(零件图号)) + N'MP', @物料名称 = 零件名称 + N'MP' FROM dbo.车间生产管理_零件工艺计划_视图 WHERE 工艺计划流水号 = @工艺计划流水号; SELECT @物料流水号 = 物料流水号 FROM dbo.库存管理_物料主文件_基本 WHERE RTRIM(LTRIM(代号)) = @图号 AND RTRIM(LTRIM(名称)) = @物料名称 AND ISNULL(是否禁用, 0) = 0; IF @物料流水号 IS NOT N ULL BEGIN SELECT @匹配出库记录数 = COUNT(*), @出库记录流水号 = MAX(出库记录流水号) FROM dbo.库存管理_物料出库_出库记录 WITH (UPDLOCK, HOLDLOCK) WHERE 物料流水号 = @物料流水号 AND 订单流水号 = @订单流水号 AND ISNULL(出库数量, 0) - ISNULL(退料数量, 0) >= @任务数量; IF ISNULL(@匹配出库记录数, 0) > 1 BEGIN RAISERROR(N'同一订单同一毛坯存在多条可退出库记录,请先人工确认出库记录', 16, 1); END; IF ISNULL(@匹配出库记录数, 0) = 1 BEGIN EXEC dbo.仓储管理_退料入库_执行 @出库记录流水号 = @出库记录流水号, @退料数量 = @任务数量, @退料人 = @退货人; END; END; UPDATE dbo.车间生产管理工艺_零件工序 SET 已分配数 = ISNULL(已分配数, 0) - @任务数量 WHERE 工序流水号 = @工序流水号 AND ISNULL(已分配数, 0) >= @任务数量; IF @@ROWCOUNT = 0 BEGIN RAISERROR(N'工序已分配数不足,取消派工失败', 16, 1); END; DELETE FROM dbo.车间生产管理工艺_零件工序_任务分配 WHERE 工艺任务流水号 = @工艺任务流水号 AN D 工序流水号 = @工序流水号; IF @@ROWCOUNT = 0 BEGIN RAISERROR(N'派工任务删除失败', 16, 1); END; SELECT @n = COUNT(*) FROM dbo.车间生产管理工艺_零件工序_任务分配 WHERE 工序流水号 IN ( SELECT 工序流水号 FROM dbo.车间生产管理工艺_零件工序 WHERE 工艺计划流水号 = @工艺计划流水号 ); IF @n = 0 BEGIN UPDATE dbo.车间生产管理工艺_零件工艺计划 SET 分配日期 = NULL WHERE 工艺计划流水号 = @工艺计划流水号; END; COMMIT TRANSACTION; SELECT '1' AS result; END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; SELECT '0' AS result, ERROR_MESSAGE() AS msg; END CATCH; END;