SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[技术中心_改制订单_发起改制]
    @原订单流水号 int = null,
    @原组件流水号 int = null,
    @改制零件名称 nvarchar(50) = null,
    @改制零件图号 nvarchar(50) = null,
    @改制数量 int = null,
    @精工期限 date = null,
    @发起人 int = null,
    @原零件名称 nvarchar(50) = null,
    @原零件图号 nvarchar(50) = null,
    @原基本件流水号 int = null
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @工艺计划流水号 int;
    DECLARE @改制订单流水号 int;
    DECLARE @改制订单编号 varchar(100);
    DECLARE @改制工艺编号 int;
    DECLARE @工序流水号 int;
    DECLARE @改制物料流水号 int;

    DECLARE @单号排序代码 varchar(100);
    DECLARE @年份 varchar(100);
    DECLARE @n int;

    IF ISNULL(LTRIM(RTRIM(@原零件图号)), '') <> ''
       AND ISNULL(LTRIM(RTRIM(@改制零件图号)), '') <> ''
       AND LTRIM(RTRIM(@原零件图号)) = LTRIM(RTRIM(@改制零件图号))
    BEGIN
        SELECT '0' AS result, '改制零件图号不能与原零件图号相同' AS msg;
        RETURN;
    END;

    IF @原订单流水号 IS NULL OR @原组件流水号 IS NULL
    BEGIN
        SELECT '0' AS result, '原订单流水号或原组件流水号不能为空' AS msg;
        RETURN;
    END;

    IF ISNULL(@改制零件名称, '') = '' OR ISNULL(@改制零件图号, '') = ''
    BEGIN
        SELECT '0' AS result, '改制零件名称或改制零件图号不能为空' AS msg;
        RETURN;
    END;

    IF ISNULL(@改制数量, 0) <= 0
    BEGIN
        SELECT '0' AS result, '改制数量必须大于0' AS msg;
        RETURN;
    END;

    -- 修改人:Ld 修改时间:2026-07-01 14:45:00; 优先使用前端点击行传入的原基本件流水号，避免同组件内重复零件或历史流水号导致改制记录回显错位。
    IF @原基本件流水号 IS NULL
    BEGIN
        SELECT TOP 1
            @原基本件流水号 = B.流水号
        FROM dbo.PDM_零件明细表_所有视图 AS B
        WHERE B.订单流水号 = @原订单流水号
          AND B.组件流水号 = @原组件流水号
          AND (ISNULL(@原零件名称, '') = '' OR B.零件名称 = @原零件名称)
          AND (ISNULL(@原零件图号, '') = '' OR B.[图号或型号] = @原零件图号)
        ORDER BY B.流水号 DESC;
    END;

    IF @原基本件流水号 IS NULL
    BEGIN
        SELECT TOP 1
            @原基本件流水号 = 基本件流水号
        FROM dbo.PDM_零件明细表_基本件
        WHERE 组件流水号 = @原组件流水号
        ORDER BY 基本件流水号 DESC;
    END;

    IF @原基本件流水号 IS NULL
    BEGIN
        SELECT '0' AS result, '未找到原零件基本件流水号' AS msg;
        RETURN;
    END;

    SELECT TOP 1
        @改制物料流水号 = 物料流水号
    FROM dbo.库存管理_物料主文件_基本
    WHERE LTRIM(RTRIM(名称)) = LTRIM(RTRIM(@改制零件名称))
      AND LTRIM(RTRIM(代号)) = LTRIM(RTRIM(@改制零件图号))
      AND ISNULL(是否禁用, 0) = 0
    ORDER BY 物料流水号 DESC;

    IF @改制物料流水号 IS NULL
    BEGIN
        SELECT '0' AS result, '未找到改制零件对应的新物料，请先维护物料信息' AS msg;
        RETURN;
    END;

    IF @精工期限 IS NULL
        SET @精工期限 = CONVERT(date, GETDATE());

    BEGIN TRY
        BEGIN TRAN;

        SELECT @n = COUNT(*)
        FROM dbo.技术中心_改制订单排序
        WHERE 年份 = CONVERT(varchar(4), GETDATE(), 23);

        IF @n = 0
        BEGIN
            SET @年份 = CONVERT(varchar(4), GETDATE(), 23);

            INSERT INTO dbo.技术中心_改制订单排序(年份, 数量)
            VALUES(@年份, 1);

            SET @单号排序代码 = 1;
        END
        ELSE
        BEGIN
            UPDATE dbo.技术中心_改制订单排序
            SET 数量 = 数量 + 1
            WHERE 年份 = CONVERT(varchar(4), GETDATE(), 23);

            SELECT @单号排序代码 = 数量
            FROM dbo.技术中心_改制订单排序
            WHERE 年份 = CONVERT(varchar(4), GETDATE(), 23);
        END;

        SET @单号排序代码 = RIGHT(10000 + CONVERT(varchar(100), @单号排序代码), 4);

        SET @改制订单编号 =
            'BHGZ' + '-'
            + DATENAME(year, GETDATE())
            + DATENAME(month, GETDATE())
            + RIGHT(100 + DAY(GETDATE()), 2)
            + CONVERT(varchar, @单号排序代码);

        INSERT INTO dbo.技术中心_改制订单记录
        (
            改制订单编号,
            原订单流水号,
            原组件流水号,
            原基本件流水号,
            原零件名称,
            原零件图号,
            改制零件名称,
            改制零件图号,
            改制物料流水号,
            改制数量,
            精工期限,
            状态,
            发起人,
            发起时间,
            是否删除
        )
        VALUES
        (
            @改制订单编号,
            @原订单流水号,
            @原组件流水号,
            @原基本件流水号,
            @原零件名称,
            @原零件图号,
            @改制零件名称,
            @改制零件图号,
            @改制物料流水号,
            @改制数量,
            @精工期限,
            N'待生成任务',
            @发起人,
            GETDATE(),
            0
        );

        SET @改制订单流水号 = SCOPE_IDENTITY();

        INSERT INTO dbo.车间生产管理工艺_零件工艺计划
        (
            基本件流水号,
            零件图号,
            批次数量,
            操作日期,
            考核状态,
            工艺更新时间,
            工艺员编号,
            计划完成
        )
        VALUES
        (
            @原基本件流水号,
            @改制零件图号,
            @改制数量,
            GETDATE(),
            2,
            GETDATE(),
            @发起人,
            @精工期限
        );

        SET @工艺计划流水号 = SCOPE_IDENTITY();

        UPDATE dbo.技术中心_改制订单记录
        SET 工艺计划流水号 = @工艺计划流水号,
            状态 = N'工艺完成'
        WHERE 改制订单流水号 = @改制订单流水号;

        SELECT TOP 1
            @改制工艺编号 = 工艺编号
        FROM dbo.车间生产管理工艺_基础表_工艺名称
        WHERE 工艺名称 = N'改制'
          AND ISNULL(是否启用, 1) = 1;

        IF @改制工艺编号 IS NULL
        BEGIN
            INSERT INTO dbo.车间生产管理工艺_基础表_工艺名称(工艺名称, 是否启用)
            VALUES(N'改制', 1);

            SET @改制工艺编号 = SCOPE_IDENTITY();
        END;

        SELECT TOP 1
            @工序流水号 = 工序流水号
        FROM dbo.车间生产管理工艺_零件工序
        WHERE 工艺计划流水号 = @工艺计划流水号
        ORDER BY 工序顺序;

        IF @工序流水号 IS NOT NULL
        BEGIN
            UPDATE dbo.车间生产管理工艺_零件工序
            SET 工艺编号 = @改制工艺编号,
                工序顺序 = 1,
                工艺要求 = N'改制',
                工序间是否外协 = 0,
                外协数量 = 0,
                是否最后一序 = 1,
                定额工时 = 0,
                准结工时 = 0,
                已分配数 = 0,
                已外协数 = 0,
                是否允许变更 = 1
            WHERE 工序流水号 = @工序流水号;
        END
        ELSE
        BEGIN
            INSERT INTO dbo.车间生产管理工艺_零件工序
            (
                工艺计划流水号,
                工艺编号,
                工序顺序,
                工艺要求,
                工序间是否外协,
                外协数量,
                是否最后一序,
                定额工时,
                准结工时,
                已分配数,
                已外协数,
                是否允许变更
            )
            VALUES
            (
                @工艺计划流水号,
                @改制工艺编号,
                1,
                N'改制',
                0,
                0,
                1,
                0,
                0,
                0,
                0,
                1
            );
        END;

        EXEC dbo.精工车间_工艺保存_派工
            @工艺计划流水号 = @工艺计划流水号,
            @人员编号 = @发起人;

        UPDATE dbo.PDM_组件名称
        SET 组件精工车间 = 1,
            是否分配 = 1
        WHERE 组件流水号 = @原组件流水号;

        UPDATE dbo.合同管理_订单信息_基础表
        SET 精工车间 = 1,
            是否下达 = 1,
            技术审核 = 0,
            下达人 = @发起人,
            下达日期 = GETDATE(),
            精工期限 = @精工期限
        WHERE 订单流水号 = @原订单流水号;

        COMMIT TRAN;

        SELECT
            '1' AS result,
            '改制订单已生成' AS msg,
            @改制订单流水号 AS 改制订单流水号,
            @改制订单编号 AS 改制订单编号,
            @工艺计划流水号 AS 工艺计划流水号,
            @改制物料流水号 AS 改制物料流水号;
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRAN;

        SELECT
            '0' AS result,
            ERROR_MESSAGE() AS msg;
    END CATCH;
END;
GO
