IF OBJECT_ID(N'dbo.仓储管理_入库记录_退货入库_验证', N'P') IS NOT NULL
    DROP PROCEDURE dbo.仓储管理_入库记录_退货入库_验证
GO

CREATE PROCEDURE dbo.仓储管理_入库记录_退货入库_验证
    @物料流水号 INT = NULL,
    @退货数量 FLOAT = NULL,
    @是否采购 INT = NULL,
    @采购合同明细流水号 INT = NULL,
    @批号 INT = NULL,
    @入库时间 DATETIME = NULL,
    @入库记录流水号 INT = NULL
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @货位存量 FLOAT;
    DECLARE @图号 NVARCHAR(50);
    DECLARE @名称 NVARCHAR(50);
    DECLARE @库位 NVARCHAR(50);
    DECLARE @货位流水号 INT;

    SELECT
        @名称 = 名称,
        @图号 = 代号,
        @库位 = 库位
    FROM dbo.库存管理_物料主文件_基本
    WHERE 物料流水号 = @物料流水号;

    SELECT @货位流水号 = 货位流水号
    FROM dbo.库存管理_外购件_入库记录
    WHERE 入库记录流水号 = @入库记录流水号;

    SET @图号 = RIGHT(ISNULL(@图号, N''), 2);
    SET @名称 = LEFT(ISNULL(@名称, N''), 2);

    IF @名称 = N'主轴'
    BEGIN
        SELECT @货位存量 = ISNULL(MAX(货位存量), 0)
        FROM dbo.库存管理_物料与货位对照表
        WHERE 物料流水号 = @物料流水号
          AND 采购合同明细流水号 = @采购合同明细流水号
          AND 是否采购 = @是否采购
          AND (@货位流水号 IS NULL OR 货位流水号 = @货位流水号)
          AND (@批号 IS NULL OR 批号 = @批号);
    END
    ELSE
    BEGIN
        SELECT @货位存量 = ISNULL(MAX(货位存量), 0)
        FROM dbo.库存管理_物料与货位对照表
        WHERE 物料流水号 = @物料流水号
          AND 采购合同明细流水号 = @采购合同明细流水号
          AND 是否采购 = @是否采购
          AND (@货位流水号 IS NULL OR 货位流水号 = @货位流水号);

        IF ISNULL(@货位存量, 0) < ISNULL(@退货数量, 0)
           AND (@图号 = N'MP' OR @库位 = N'毛坯库')
        BEGIN
            SELECT @货位存量 = ISNULL(MAX(货位存量), 0)
            FROM dbo.库存管理_物料与货位对照表
            WHERE 物料流水号 = @物料流水号
              AND 采购合同明细流水号 IS NULL
              AND 是否采购 IS NULL
              AND (@货位流水号 IS NULL OR 货位流水号 = @货位流水号);
        END;
    END;

    IF ISNULL(@退货数量, 0) > ISNULL(@货位存量, 0)
        SELECT 0 AS 数值;
    ELSE
        SELECT 1 AS 数值;
END
GO

IF OBJECT_ID(N'dbo.仓储管理_入库记录_退货入库', N'P') IS NOT NULL
    DROP PROCEDURE dbo.仓储管理_入库记录_退货入库
GO

CREATE PROCEDURE dbo.仓储管理_入库记录_退货入库
    @物料流水号 INT = NULL,
    @退货数量 FLOAT = NULL,
    @退货原因 NVARCHAR(500) = NULL,
    @入库记录流水号 INT = NULL,
    @退货人 INT = NULL,
    @采购合同流水号 INT = NULL,
    @供应商流水号 INT = NULL,
    @是否采购 INT = NULL,
    @采购合同明细流水号 INT = NULL,
    @批号 INT = NULL,
    @组件流水号 INT = NULL,
    @采购合同 NVARCHAR(50) = NULL,
    @供应商 NVARCHAR(500) = NULL,
    @物料名称 NVARCHAR(500) = NULL,
    @图号或型号 NVARCHAR(500) = NULL,
    @物料编码 NVARCHAR(50) = NULL,
    @单位 NVARCHAR(50) = NULL,
    @类型 NVARCHAR(50) = NULL,
    @入库时间 DATETIME,
    @库存 FLOAT = NULL
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;

    DECLARE @图号 NVARCHAR(50);
    DECLARE @名称 NVARCHAR(50);
    DECLARE @入库货位流水号 INT;
    DECLARE @影响行数 INT;

    BEGIN TRY
        BEGIN TRANSACTION;

        SELECT @入库货位流水号 = 货位流水号
        FROM dbo.库存管理_外购件_入库记录
        WHERE 入库记录流水号 = @入库记录流水号;

        INSERT INTO dbo.仓储管理_入库记录_退货记录表
            (退货数量, 退货原因, 供应商流水号, 退货人流水号, 退货时间, 采购合同流水号, 入库记录流水号, 是否采购, 采购合同, 供应商, 类型, 物料名称, 图号或型号, 物料编码, 单位)
        VALUES
            (@退货数量, @退货原因, @供应商流水号, @退货人, GETDATE(), @采购合同流水号, @入库记录流水号, @是否采购, @采购合同, @供应商, @类型, @物料名称, @图号或型号, @物料编码, @单位);

        UPDATE dbo.库存管理_外购件累计库存
        SET 累计库存 = ISNULL(累计库存, 0) - @退货数量
        WHERE 物料流水号 = @物料流水号;

        SELECT @名称 = 名称, @图号 = 代号
        FROM dbo.库存管理_物料主文件_基本
        WHERE 物料流水号 = @物料流水号;

        SET @图号 = LEFT(ISNULL(@图号, N''), 2);
        SET @名称 = LEFT(ISNULL(@名称, N''), 2);
        SET @影响行数 = 0;

        IF @名称 = N'主轴'
        BEGIN
            UPDATE dbo.库存管理_物料与货位对照表
            SET 货位存量 = 货位存量 - @退货数量
            WHERE 物料流水号 = @物料流水号
              AND 采购合同明细流水号 = @采购合同明细流水号
              AND 是否采购 = @是否采购
              AND (@入库货位流水号 IS NULL OR 货位流水号 = @入库货位流水号)
              AND CONVERT(VARCHAR(10), @入库时间, 23) = CONVERT(VARCHAR(10), 操作日期, 23)
              AND 批号 = @批号
              AND ISNULL(货位存量, 0) >= @退货数量;

            SET @影响行数 = @@ROWCOUNT;
        END
        ELSE
        BEGIN
            IF @图号 = N'MP'
            BEGIN
                UPDATE dbo.库存管理_物料与货位对照表
                SET 货位存量 = 货位存量 - @退货数量
                WHERE 物料流水号 = @物料流水号
                  AND (@入库货位流水号 IS NULL OR 货位流水号 = @入库货位流水号)
                  AND 采购合同明细流水号 IS NULL
                  AND 是否采购 IS NULL
                  AND ISNULL(货位存量, 0) >= @退货数量;

                SET @影响行数 = @@ROWCOUNT;
            END
            ELSE
            BEGIN
                UPDATE dbo.库存管理_物料与货位对照表
                SET 货位存量 = 货位存量 - @退货数量
                WHERE 物料流水号 = @物料流水号
                  AND 采购合同明细流水号 = @采购合同明细流水号
                  AND 是否采购 = @是否采购
                  AND (@入库货位流水号 IS NULL OR 货位流水号 = @入库货位流水号)
                  AND CONVERT(VARCHAR(10), @入库时间, 23) = CONVERT(VARCHAR(10), 操作日期, 23)
                  AND ISNULL(货位存量, 0) >= @退货数量;

                SET @影响行数 = @@ROWCOUNT;
            END;
        END;

        IF @影响行数 = 0
        BEGIN
            RAISERROR(N'库存盘点对应库位库存不足或未找到对应库存记录', 16, 1);
        END;

        UPDATE dbo.库存管理_外购件_入库记录
        SET 实际到货数量 = 实际到货数量 - @退货数量,
            退货数量 = ISNULL(退货数量, 0) + @退货数量
        WHERE 入库记录流水号 = @入库记录流水号;

        IF @名称 = N'主轴'
            UPDATE dbo.采购管理_采购批次
            SET 已到数 = 已到数 - @退货数量
            WHERE 采购合同明细流水号 = @采购合同明细流水号
              AND 批号 = @批号;

        IF @是否采购 = 1
        BEGIN
            UPDATE dbo.采购管理_采购合同明细
            SET 已到货数量 = 已到货数量 - @退货数量,
                到货日期 = NULL
            WHERE 采购合同明细流水号 = @采购合同明细流水号;

            UPDATE dbo.采购管理_采购合同
            SET 是否到货 = 1
            WHERE 采购合同流水号 = @采购合同流水号;
        END
        ELSE
        BEGIN
            UPDATE dbo.采购管理_耗材采购合同明细
            SET 已到货数量 = ISNULL(已到货数量, 0) - @退货数量,
                到货日期 = NULL
            WHERE 采购合同明细流水号 = @采购合同明细流水号;

            UPDATE dbo.采购管理_采购合同
            SET 是否到货 = 1
            WHERE 采购合同流水号 = @采购合同流水号;
        END;

        DECLARE @订单类型 INT;
        DECLARE @订单流水号 INT;
        DECLARE @组件采购 INT;

        SELECT
            @订单流水号 = 订单流水号,
            @订单类型 = 订单类型,
            @组件采购 = 组件采购
        FROM dbo.PDM_组件名称_视图
        WHERE 组件流水号 = @组件流水号;

        IF @订单类型 = 3
        BEGIN
            UPDATE dbo.合同管理_订单信息_基础表
            SET 是否提交 = 3,
                入库日期 = NULL
            WHERE 订单流水号 = @订单流水号;

            UPDATE dbo.库存管理_外购件累计库存
            SET 补货中 = ISNULL(补货中, 0) + @退货数量
            WHERE 物料流水号 = @物料流水号;
        END;

        IF @订单类型 = 1 AND @组件采购 = 1
        BEGIN
            UPDATE dbo.PDM_组件名称
            SET 产品状态 = 2
            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
GO

IF OBJECT_ID(N'dbo.仓储管理_自制件入库记录_退货入库', N'P') IS NOT NULL
    DROP PROCEDURE dbo.仓储管理_自制件入库记录_退货入库
GO

CREATE PROCEDURE dbo.仓储管理_自制件入库记录_退货入库
    @物料流水号 INT = NULL,
    @退货数量 FLOAT = NULL,
    @退货原因 NVARCHAR(500) = NULL,
    @入库记录流水号 INT = NULL,
    @退货人 INT = NULL,
    @组件流水号 INT = NULL,
    @入库时间 DATETIME,
    @批号 NVARCHAR(50)
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;

    DECLARE @工艺计划流水号 INT;
    DECLARE @名称 NVARCHAR(50);
    DECLARE @入库货位流水号 INT;
    DECLARE @影响行数 INT;

    BEGIN TRY
        BEGIN TRANSACTION;

        SELECT
            @工艺计划流水号 = 工艺计划流水号,
            @入库货位流水号 = 货位流水号
        FROM dbo.库存管理_自制件_入库记录
        WHERE 入库记录流水号 = @入库记录流水号;

        INSERT INTO dbo.仓储管理_自制件入库记录_退货记录表
            (退货数量, 退货原因, 退货人流水号, 退货时间, 入库记录流水号)
        VALUES
            (@退货数量, @退货原因, @退货人, GETDATE(), @入库记录流水号);

        UPDATE dbo.库存管理_外购件累计库存
        SET 累计库存 = ISNULL(累计库存, 0) - @退货数量
        WHERE 物料流水号 = @物料流水号;

        SELECT @名称 = 名称
        FROM dbo.库存管理_物料主文件_基本
        WHERE 物料流水号 = @物料流水号;

        SET @名称 = LEFT(ISNULL(@名称, N''), 2);

        IF @名称 = N'主轴'
        BEGIN
            UPDATE dbo.库存管理_物料与货位对照表
            SET 货位存量 = 货位存量 - @退货数量
            WHERE 物料流水号 = @物料流水号
              AND 工艺计划流水号 = @工艺计划流水号
              AND (@入库货位流水号 IS NULL OR 货位流水号 = @入库货位流水号)
              AND CONVERT(VARCHAR(10), @入库时间, 23) = CONVERT(VARCHAR(10), 操作日期, 23)
              AND 批号 = @批号
              AND ISNULL(货位存量, 0) >= @退货数量;
        END
        ELSE
        BEGIN
            UPDATE dbo.库存管理_物料与货位对照表
            SET 货位存量 = 货位存量 - @退货数量
            WHERE 物料流水号 = @物料流水号
              AND 工艺计划流水号 = @工艺计划流水号
              AND (@入库货位流水号 IS NULL OR 货位流水号 = @入库货位流水号)
              AND CONVERT(VARCHAR(10), @入库时间, 23) = CONVERT(VARCHAR(10), 操作日期, 23)
              AND ISNULL(货位存量, 0) >= @退货数量;
        END;

        SET @影响行数 = @@ROWCOUNT;

        IF @影响行数 = 0
        BEGIN
            RAISERROR(N'库存盘点对应库位库存不足或未找到对应库存记录', 16, 1);
        END;

        UPDATE dbo.库存管理_自制件_入库记录
        SET 实际到货数量 = 实际到货数量 - @退货数量,
            退货数量 = ISNULL(退货数量, 0) + @退货数量
        WHERE 入库记录流水号 = @入库记录流水号;

        IF @名称 = N'主轴'
            UPDATE dbo.车间生产工艺管理_零件批次
            SET 入库数 = 入库数 - @退货数量
            WHERE 工艺计划流水号 = @工艺计划流水号
              AND 批号 = @批号;

        UPDATE dbo.车间生产管理工艺_零件工艺计划
        SET 考核状态 = 3,
            入库数量 = 入库数量 - @退货数量
        WHERE 工艺计划流水号 = @工艺计划流水号;

        DECLARE @订单类型 INT;
        DECLARE @订单流水号 INT;
        DECLARE @组件车间 INT;

        SELECT
            @订单流水号 = 订单流水号,
            @订单类型 = 订单类型,
            @组件车间 = 组件精工车间
        FROM dbo.PDM_组件名称_视图
        WHERE 组件流水号 = @组件流水号;

        IF @订单类型 = 3
        BEGIN
            UPDATE dbo.合同管理_订单信息_基础表
            SET 是否提交 = 3,
                入库日期 = NULL
            WHERE 订单流水号 = @订单流水号;

            UPDATE dbo.库存管理_外购件累计库存
            SET 补货中 = ISNULL(补货中, 0) + @退货数量
            WHERE 物料流水号 = @物料流水号;
        END;

        IF @订单类型 = 1 AND @组件车间 = 1
        BEGIN
            UPDATE dbo.PDM_组件名称
            SET 产品状态 = 2
            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
GO
