﻿-- 方案一补货关联合同测试库增量脚本；修改人:Ld 修改时间:2026-08-03 16:06:00;
USE [ERPTOOL_JY_20250826Back];
GO

IF OBJECT_ID(N'[dbo].[仓储管理_补货关联合同_查询数据]', N'P') IS NOT NULL
    DROP PROCEDURE [dbo].[仓储管理_补货关联合同_查询数据];
GO

-- 补货创建时查询可关联的销售合同/订单；修改人:Ld 修改时间:2026-08-03 16:06:00;
CREATE PROCEDURE [dbo].[仓储管理_补货关联合同_查询数据]
    @关键字 NVARCHAR(100) = NULL,
    @合同编号 NVARCHAR(100) = NULL,
    @客户 NVARCHAR(100) = NULL,
    @订单编号 NVARCHAR(100) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    SELECT TOP 50
        p.项目流水号,
        p.合同编号,
        ISNULL(c.客户名称, N'') AS 客户名称,
        ISNULL(c.简称, c.客户名称) AS 客户简称,
        o.订单流水号,
        o.订单编号,
        CONVERT(VARCHAR(10), p.签订日期, 23) AS 签订日期,
        CONVERT(VARCHAR(10), ISNULL(o.完成期限, p.交货日期), 23) AS 交货日期
    FROM dbo.PDM_项目名称 AS p
        LEFT JOIN dbo.客户关系管理系统_客户名称 AS c
            ON p.客户流水号 = c.客户流水号
        LEFT JOIN dbo.合同管理_订单信息_基础表 AS o
            ON p.项目流水号 = o.项目流水号
    WHERE ISNULL(p.是否启用, 1) = 1
      AND ISNULL(p.合同编号, N'') <> N''
      AND (ISNULL(@关键字, N'') = N''
           OR p.合同编号 LIKE N'%' + @关键字 + N'%'
           OR ISNULL(c.客户名称, N'') LIKE N'%' + @关键字 + N'%'
           OR ISNULL(c.简称, N'') LIKE N'%' + @关键字 + N'%'
           OR ISNULL(o.订单编号, N'') LIKE N'%' + @关键字 + N'%')
      AND (ISNULL(@合同编号, N'') = N'' OR p.合同编号 LIKE N'%' + @合同编号 + N'%')
      AND (ISNULL(@客户, N'') = N'' OR ISNULL(c.客户名称, N'') LIKE N'%' + @客户 + N'%' OR ISNULL(c.简称, N'') LIKE N'%' + @客户 + N'%')
      AND (ISNULL(@订单编号, N'') = N'' OR ISNULL(o.订单编号, N'') LIKE N'%' + @订单编号 + N'%')
    ORDER BY p.项目流水号 DESC, o.订单流水号 DESC;
END;
GO

IF OBJECT_ID(N'[dbo].[报缺补货_提交_关联合同]', N'P') IS NOT NULL
    DROP PROCEDURE [dbo].[报缺补货_提交_关联合同];
GO

-- 补货提交时挂到选定销售合同/订单或仓库备货合同；不改原报缺补货_提交；修改人:Ld 修改时间:2026-08-03 16:06:00;
-- 仓库备货提交时自动生成CKBH前缀合同号，并写入仓库补货合同明细；修改人:Ld 修改时间:2026-08-04 08:29:13;
CREATE PROCEDURE [dbo].[报缺补货_提交_关联合同]
    @是否外购 INT = NULL,
    @操作者 INT = NULL,
    @订单备注 NVARCHAR(200) = NULL,
    @补货期限 DATETIME = NULL,
    @来源类型 NVARCHAR(20) = NULL,
    @项目流水号 INT = NULL,
    @订单流水号 INT = NULL
AS
BEGIN
    SET NOCOUNT ON;
    SET XACT_ABORT ON;

    DECLARE @单号 VARCHAR(100);
    DECLARE @单号前缀 VARCHAR(20);
    DECLARE @序号 INT;
    DECLARE @机床流水号 INT;
    DECLARE @组件流水号 INT;
    DECLARE @仓库备货合同编号 NVARCHAR(50);
    DECLARE @补货类型名称 NVARCHAR(50);
    DECLARE @订单类型 INT = 3;

    IF @补货期限 IS NULL
    BEGIN
        SELECT '0' AS result, N'请选择补货期限' AS message;
        RETURN;
    END;

    IF ISNULL(@来源类型, N'') = N''
    BEGIN
        SELECT '0' AS result, N'请选择补货来源' AS message;
        RETURN;
    END;

    IF @是否外购 = 1
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM dbo.外购件补货明细中间表)
        BEGIN
            SELECT '0' AS result, N'外购补货单为空' AS message;
            RETURN;
        END;
        SET @单号前缀 = 'BHWG-';
        SET @补货类型名称 = N'外购补货';
    END
    ELSE
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM dbo.自制件补货明细中间表)
        BEGIN
            SELECT '0' AS result, N'自制补货单为空' AS message;
            RETURN;
        END;
        SET @单号前缀 = 'BHZZ-';
        SET @补货类型名称 = N'自制补货';
    END;

    BEGIN TRY
        BEGIN TRANSACTION;

        IF @来源类型 = N'仓库备货'
        BEGIN
            -- 仓库备货每次创建独立CKBH合同，编号规则按补货单日期+三位序号生成；修改人:Ld 修改时间:2026-08-04 08:29:13;
            SET @序号 = 1;
            SET @仓库备货合同编号 = N'CKBH-' + CONVERT(VARCHAR(8), GETDATE(), 112) + RIGHT('000' + CONVERT(VARCHAR(10), @序号), 3);

            WHILE EXISTS (SELECT 1 FROM dbo.PDM_项目名称 WITH (UPDLOCK, HOLDLOCK) WHERE 合同编号 = @仓库备货合同编号)
            BEGIN
                SET @序号 = @序号 + 1;
                SET @仓库备货合同编号 = N'CKBH-' + CONVERT(VARCHAR(8), GETDATE(), 112) + RIGHT('000' + CONVERT(VARCHAR(10), @序号), 3);
            END;

            INSERT INTO dbo.PDM_项目名称(合同编号, 合同类型, 操作者, 税率, 签订日期, 交货日期, 是否生成订单, 提交日期, 客户流水号, 是否审核, 合同备注, 是否启用, 收货人员, 合同金额, 未收款项)
            VALUES(@仓库备货合同编号, 3, @操作者, 0.13, GETDATE(), @补货期限, 1, GETDATE(), 8, 1, N'仓库发起备货补货合同', 1, N'仓库', 0, 0);

            SET @项目流水号 = SCOPE_IDENTITY();

            -- 合同明细视图规格品名来源于机床名称+详情，此处写入仓库补货、单价0；修改人:Ld 修改时间:2026-08-04 08:29:13;
            INSERT INTO dbo.PDM_机床名称(项目流水号, 机床名称, 数量, 单价, 单位)
            VALUES(@项目流水号, N'仓库补货', 1, 0, N'项');
            SET @机床流水号 = SCOPE_IDENTITY();
        END;
        ELSE
        BEGIN
            IF @项目流水号 IS NULL
            BEGIN
                SELECT '0' AS result, N'请选择关联销售合同' AS message;
                ROLLBACK TRANSACTION;
                RETURN;
            END;

            IF NOT EXISTS (SELECT 1 FROM dbo.PDM_项目名称 WHERE 项目流水号 = @项目流水号 AND ISNULL(是否启用, 1) = 1)
            BEGIN
                SELECT '0' AS result, N'关联销售合同不存在或已停用' AS message;
                ROLLBACK TRANSACTION;
                RETURN;
            END;
        END;

        SET @序号 = 1;
        SET @单号 = @单号前缀 + CONVERT(VARCHAR(8), GETDATE(), 112) + RIGHT('000' + CONVERT(VARCHAR(10), @序号), 3);

        WHILE EXISTS (SELECT 1 FROM dbo.合同管理_订单信息_基础表 WHERE 订单编号 = @单号)
        BEGIN
            SET @序号 = @序号 + 1;
            SET @单号 = @单号前缀 + CONVERT(VARCHAR(8), GETDATE(), 112) + RIGHT('000' + CONVERT(VARCHAR(10), @序号), 3);
        END;

        IF @机床流水号 IS NULL
        BEGIN
            INSERT INTO dbo.PDM_机床名称(项目流水号)
            VALUES(@项目流水号);
            SET @机床流水号 = SCOPE_IDENTITY();
        END;

        INSERT INTO dbo.PDM_组件名称(机床流水号, 是否合同创建, 产品名称, 产品流水号, 数量, 配置数)
        VALUES(@机床流水号, 1, @补货类型名称, 0, 1, 1);
        SET @组件流水号 = SCOPE_IDENTITY();

        IF @是否外购 = 1
        BEGIN
            INSERT INTO dbo.合同管理_订单信息_基础表(项目流水号, 订单编号, 订单类型, 是否提交, 下单人, 下单日期, 采购期限, 订单备注)
            VALUES(@项目流水号, @单号, @订单类型, 1, @操作者, GETDATE(), @补货期限,
                   ISNULL(@订单备注, N'') + CASE WHEN ISNULL(@来源类型, N'') <> N'' THEN N'；补货来源：' + @来源类型 ELSE N'' END);

            INSERT INTO dbo.PDM_零件明细表_标准件和外购件(组件流水号, 物料流水号, 零件数量, 零件类型, 材料流水号, 导入人员编号)
            SELECT @组件流水号, 物料流水号, 补货数量, 2, 材料流水号, @操作者
            FROM dbo.外购件补货明细中间表;

            INSERT INTO dbo.外购件补货单_图片(标准件和外购件流水号, [文件标识], [文件名称], [文件后缀], [是否启用], [文件内容])
            SELECT 标准件和外购件流水号, [文件标识], [文件名称], [文件后缀], 补货单_图片.[是否启用], [文件内容]
            FROM dbo.补货单_图片
                INNER JOIN dbo.外购件补货明细中间表
                    ON dbo.补货单_图片.补货单明细中间表流水号 = dbo.外购件补货明细中间表.补货单明细中间表流水号
                INNER JOIN dbo.PDM_零件明细表_标准件和外购件
                    ON dbo.外购件补货明细中间表.物料流水号 = dbo.PDM_零件明细表_标准件和外购件.物料流水号
            WHERE 组件流水号 = @组件流水号
              AND 是否外购 = 1;

            DELETE FROM dbo.外购件补货明细中间表;
            DELETE FROM dbo.补货单_图片 WHERE 是否外购 = 1;
        END;
        ELSE
        BEGIN
            INSERT INTO dbo.合同管理_订单信息_基础表(项目流水号, 订单编号, 订单类型, 是否提交, 下单人, 下单日期, 精工期限, 订单备注)
            VALUES(@项目流水号, @单号, @订单类型, 1, @操作者, GETDATE(), @补货期限,
                   ISNULL(@订单备注, N'') + CASE WHEN ISNULL(@来源类型, N'') <> N'' THEN N'；补货来源：' + @来源类型 ELSE N'' END);

            INSERT INTO dbo.PDM_零件明细表_基本件(组件流水号, 物料流水号, 零件数量, 零件类型, 材料流水号, 导入人员编号, 是否投产, 投产数)
            SELECT @组件流水号, 物料流水号, 补货数量, 3, 材料流水号, @操作者, 1, 补货数量
            FROM dbo.自制件补货明细中间表;

            INSERT INTO dbo.自制件补货单_图片(基本件流水号, [文件标识], [文件名称], [文件后缀], [是否启用], [文件内容])
            SELECT 基本件流水号, [文件标识], [文件名称], [文件后缀], [是否启用], [文件内容]
            FROM dbo.补货单_图片
                INNER JOIN dbo.自制件补货明细中间表
                    ON dbo.补货单_图片.补货单明细中间表流水号 = dbo.自制件补货明细中间表.补货单明细中间表流水号
                INNER JOIN dbo.PDM_零件明细表_基本件
                    ON dbo.自制件补货明细中间表.物料流水号 = dbo.PDM_零件明细表_基本件.物料流水号
            WHERE 组件流水号 = @组件流水号
              AND 是否外购 = 0;

            DELETE FROM dbo.自制件补货明细中间表;
            DELETE FROM dbo.补货单_图片 WHERE 是否外购 = 0;
        END;

        COMMIT TRANSACTION;

        SELECT '1' AS result, @单号 AS 订单编号, @项目流水号 AS 项目流水号, @仓库备货合同编号 AS 合同编号, N'提交成功' AS message;
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;

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

