ALTER PROCEDURE [dbo].[车间生产管理工艺_零件工序_取消派工]
    @工艺任务流水号 INT = NULL,
    @工序流水号 INT = NULL,
    @数量 INT = NULL,
    @退货人 INT = NULL,
    @订单流水号 INT = NULL
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;

    DECLARE @工艺计划流水号 INT;
    DECLARE @任务数量 FLOAT;
    DECLARE @加工数量 INT;
    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 工序流水号 = @工序流水号;

        IF @工序顺序 = 1
        BEGIN
            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 NULL
            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;
        END;

        UPDATE dbo.车间生产管理工艺_零件工序
        SET 已分配数 = ISNULL(已分配数, 0) - @任务数量
        WHERE 工序流水号 = @工序流水号
          AND ISNULL(已分配数, 0) >= @任务数量;

        IF @@ROWCOUNT = 0
        BEGIN
            RAISERROR(N'工序已分配数不足，取消派工失败', 16, 1);
        END;

        DELETE FROM dbo.车间生产管理工艺_零件工序_任务分配
        WHERE 工艺任务流水号 = @工艺任务流水号
          AND 工序流水号 = @工序流水号;

        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;
