/* 采购合同明细跟随PDM标准外购件源流水号变更（测试库）
   修改人:Ld 修改时间:2026-07-24 10:48:00;
*/
SET NOCOUNT ON;

IF OBJECT_ID(N'dbo.GPT_采购明细PDM跟随变更_待处理', N'U') IS NULL
BEGIN
    CREATE TABLE dbo.GPT_采购明细PDM跟随变更_待处理
    (
        ID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
        项目流水号 int NULL,
        订单流水号 int NULL,
        机床流水号 int NULL,
        旧组件流水号 int NULL,
        旧产品名称 nvarchar(200) NULL,
        采购合同流水号 int NULL,
        采购合同明细流水号 int NOT NULL,
        旧标准件和外购件流水号 int NOT NULL,
        物料流水号 int NOT NULL,
        旧零件数量 int NULL,
        新组件流水号 int NULL,
        新标准件和外购件流水号 int NULL,
        处理状态 int NOT NULL CONSTRAINT DF_GPT_采购明细PDM跟随变更_待处理_处理状态 DEFAULT(0),
        处理说明 nvarchar(400) NULL,
        创建时间 datetime NOT NULL CONSTRAINT DF_GPT_采购明细PDM跟随变更_待处理_创建时间 DEFAULT(GETDATE()),
        处理时间 datetime NULL,
        修改人 nvarchar(50) NULL,
        修改时间 datetime NULL
    );
END;
GO

IF OBJECT_ID(N'dbo.GPT_采购明细PDM跟随变更_执行', N'P') IS NOT NULL
    DROP PROCEDURE dbo.GPT_采购明细PDM跟随变更_执行;
GO

CREATE PROCEDURE dbo.GPT_采购明细PDM跟随变更_执行
@新组件流水号 int
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @项目流水号 int;
    DECLARE @订单流水号 int;
    DECLARE @机床流水号 int;

    SELECT TOP 1
        @项目流水号 = v.项目流水号,
        @订单流水号 = v.订单流水号,
        @机床流水号 = c.机床流水号
    FROM dbo.PDM_组件名称 c
    LEFT JOIN dbo.PDM_组件名称_视图 v ON v.组件流水号 = c.组件流水号
    WHERE c.组件流水号 = @新组件流水号;

    DECLARE @Map TABLE
    (
        ID int PRIMARY KEY,
        采购合同明细流水号 int NOT NULL,
        新标准件和外购件流水号 int NOT NULL
    );

    ;WITH MatchRows AS
    (
        SELECT
            p.ID,
            p.采购合同明细流水号,
            n.标准件和外购件流水号 AS 新标准件和外购件流水号,
            ROW_NUMBER() OVER(PARTITION BY p.ID ORDER BY n.标准件和外购件流水号) AS rn
        FROM dbo.GPT_采购明细PDM跟随变更_待处理 p
        INNER JOIN dbo.采购管理_采购合同明细 d
            ON d.采购合同明细流水号 = p.采购合同明细流水号
           AND d.标准件和外购件流水号 = p.旧标准件和外购件流水号
        INNER JOIN dbo.PDM_零件明细表_标准件和外购件 n
            ON n.组件流水号 = @新组件流水号
           AND n.物料流水号 = p.物料流水号
        WHERE p.处理状态 = 0
          AND ISNULL(p.项目流水号, 0) = ISNULL(@项目流水号, 0)
          AND ISNULL(p.订单流水号, 0) = ISNULL(@订单流水号, 0)
          AND ISNULL(p.机床流水号, 0) = ISNULL(@机床流水号, 0)
          AND ISNULL(d.已到货数量, 0) = 0
          AND NOT EXISTS (SELECT 1 FROM dbo.库存管理_外购件_入库记录 r WHERE r.采购合同明细流水号 = d.采购合同明细流水号)
          AND NOT EXISTS (SELECT 1 FROM dbo.质检管理_质检记录_主表 q WHERE q.零部件流水号 = d.采购合同明细流水号 AND ISNULL(q.是否禁用, 0) = 0)
          AND NOT EXISTS (SELECT 1 FROM dbo.采购管理_采购批次 b WHERE b.采购合同明细流水号 = d.采购合同明细流水号 AND (ISNULL(b.是否入库, 0) <> 0 OR ISNULL(b.已到数, 0) <> 0))
          AND NOT EXISTS (SELECT 1 FROM dbo.采购管理_采购合同明细 d2 WHERE d2.采购合同流水号 = d.采购合同流水号 AND d2.标准件和外购件流水号 = n.标准件和外购件流水号 AND d2.采购合同明细流水号 <> d.采购合同明细流水号)
    )
    INSERT INTO @Map(ID, 采购合同明细流水号, 新标准件和外购件流水号)
    SELECT ID, 采购合同明细流水号, 新标准件和外购件流水号
    FROM MatchRows
    WHERE rn = 1;

    -- 采购明细未发生到货、入库、质检时，允许跟随到同项目同机床同物料的新PDM源流水号；修改人:Ld 修改时间:2026-07-24 10:48:00;
    UPDATE d
       SET d.标准件和外购件流水号 = m.新标准件和外购件流水号
    FROM dbo.采购管理_采购合同明细 d
    INNER JOIN @Map m ON m.采购合同明细流水号 = d.采购合同明细流水号;

    UPDATE p
       SET p.新组件流水号 = @新组件流水号,
           p.新标准件和外购件流水号 = m.新标准件和外购件流水号,
           p.处理状态 = 1,
           p.处理说明 = N'已按同项目同机床同物料自动跟随到新PDM标准外购件流水号',
           p.处理时间 = GETDATE(),
           p.修改人 = N'Ld',
           p.修改时间 = GETDATE()
    FROM dbo.GPT_采购明细PDM跟随变更_待处理 p
    INNER JOIN @Map m ON m.ID = p.ID;
END;
GO

DECLARE @def nvarchar(max);

SELECT @def = OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_确认更改新'));
IF @def NOT LIKE N'%GPT_采购明细PDM跟随变更_待处理%'
BEGIN
    SET @def = REPLACE(@def, N'CREATE PROCEDURE [dbo].[PDM_组件名称_确认更改新]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_确认更改新]');
    SET @def = REPLACE(@def, N'CREATE     PROCEDURE [dbo].[PDM_组件名称_确认更改新]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_确认更改新]');
    SET @def = REPLACE(@def, N'CREATE        PROCEDURE [dbo].[PDM_组件名称_确认更改新]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_确认更改新]');

    SET @def = REPLACE(@def,
N'     if @产品流水号临时 <> @产品流水号
     begin
         update dbo.PDM_组件名称 set 修改状态 = 2,是否分配 = 0 where 组件流水号 = @orderN',
N'     if @产品流水号临时 <> @产品流水号
     begin
         -- 记录被产品替换影响且已加入采购合同的PDM标准外购件，后续新BOM生成后自动跟随；修改人:Ld 修改时间:2026-07-24 10:48:00;
         INSERT INTO dbo.GPT_采购明细PDM跟随变更_待处理(项目流水号,订单流水号,机床流水号,旧组件流水号,旧产品名称,采购合同流水号,采购合同明细流水号,旧标准件和外购件流水号,物料流水号,旧零件数量,修改人,修改时间)
         SELECT DISTINCT @项目流水号,@订单流水号,@机床流水号,@orderN,@产品名称,d.采购合同流水号,d.采购合同明细流水号,s.标准件和外购件流水号,s.物料流水号,s.零件数量,N''Ld'',GETDATE()
         FROM dbo.PDM_零件明细表_标准件和外购件 s
         INNER JOIN dbo.采购管理_采购合同明细 d ON d.标准件和外购件流水号 = s.标准件和外购件流水号
         WHERE s.组件流水号 = @orderN
           AND NOT EXISTS (SELECT 1 FROM dbo.GPT_采购明细PDM跟随变更_待处理 p WHERE p.处理状态 = 0 AND p.采购合同明细流水号 = d.采购合同明细流水号 AND p.旧标准件和外购件流水号 = s.标准件和外购件流水号);

         update dbo.PDM_组件名称 set 修改状态 = 2,是否分配 = 0 where 组件流水号 = @orderN');

    SET @def = REPLACE(@def,
N'delete from 车间装配管理_装配任务 where 组件流水号 in (select 组件流水号 from PDM_组件名称 where 组件流水号 not in (select 组件流水号 from PDM_组件名称_修改记录_临时表 where 机床流水号=@机床流水号 and 组件流水号 is not null) and 机床流水号=@机床流水号 and 是否合同创建 = 1 and 产品状态 = 0)',
N'-- 记录删除组件影响且已加入采购合同的PDM标准外购件，后续新BOM生成后自动跟随；修改人:Ld 修改时间:2026-07-24 10:48:00;
insert into dbo.GPT_采购明细PDM跟随变更_待处理(项目流水号,订单流水号,机床流水号,旧组件流水号,旧产品名称,采购合同流水号,采购合同明细流水号,旧标准件和外购件流水号,物料流水号,旧零件数量,修改人,修改时间)
select distinct @项目流水号,@订单流水号,@机床流水号,c.组件流水号,c.产品名称,d.采购合同流水号,d.采购合同明细流水号,s.标准件和外购件流水号,s.物料流水号,s.零件数量,N''Ld'',GETDATE()
from dbo.PDM_组件名称 c
inner join dbo.PDM_零件明细表_标准件和外购件 s on s.组件流水号 = c.组件流水号
inner join dbo.采购管理_采购合同明细 d on d.标准件和外购件流水号 = s.标准件和外购件流水号
where c.组件流水号 not in (select 组件流水号 from PDM_组件名称_修改记录_临时表 where 机床流水号=@机床流水号 and 组件流水号 is not null)
  and c.机床流水号=@机床流水号 and c.是否合同创建 = 1 and c.产品状态 = 0
  and not exists (select 1 from dbo.GPT_采购明细PDM跟随变更_待处理 p where p.处理状态 = 0 and p.采购合同明细流水号 = d.采购合同明细流水号 and p.旧标准件和外购件流水号 = s.标准件和外购件流水号);

delete from 车间装配管理_装配任务 where 组件流水号 in (select 组件流水号 from PDM_组件名称 where 组件流水号 not in (select 组件流水号 from PDM_组件名称_修改记录_临时表 where 机床流水号=@机床流水号 and 组件流水号 is not null) and 机床流水号=@机床流水号 and 是否合同创建 = 1 and 产品状态 = 0)');

    EXEC(@def);
END;
GO

DECLARE @def2 nvarchar(max);

SELECT @def2 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.技术确认_刷新BOM'));
IF @def2 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
BEGIN
    SET @def2 = REPLACE(@def2, N'CREATE      PROCEDURE [dbo].[技术确认_刷新BOM]', N'ALTER PROCEDURE [dbo].[技术确认_刷新BOM]');
    SET @def2 = REPLACE(@def2, N'CREATE        PROCEDURE [dbo].[技术确认_刷新BOM]', N'ALTER PROCEDURE [dbo].[技术确认_刷新BOM]');
    SET @def2 = @def2 + N'

-- 新BOM标准外购件生成后，回填采购合同明细PDM源流水号；修改人:Ld 修改时间:2026-07-24 10:48:00;
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号
';
    EXEC(@def2);
END;
GO

DECLARE @def3 nvarchar(max);

SELECT @def3 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_老组件_增加数据_批量零件'));
IF @def3 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
BEGIN
    SET @def3 = REPLACE(@def3, N'CREATE        PROCEDURE [dbo].[PDM_组件名称_老组件_增加数据_批量零件]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_老组件_增加数据_批量零件]');
    SET @def3 = @def3 + N'

-- 批量新增标准外购件后，回填采购合同明细PDM源流水号；修改人:Ld 修改时间:2026-07-24 10:48:00;
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号
';
    EXEC(@def3);
END;
GO

DECLARE @def4 nvarchar(max);

SELECT @def4 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.PDM_组件名称_增加数据_批量零件'));
IF @def4 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
BEGIN
    SET @def4 = REPLACE(@def4, N'CREATE        PROCEDURE [dbo].[PDM_组件名称_增加数据_批量零件]', N'ALTER PROCEDURE [dbo].[PDM_组件名称_增加数据_批量零件]');
    SET @def4 = @def4 + N'

-- 新组件批量新增标准外购件后，回填采购合同明细PDM源流水号；修改人:Ld 修改时间:2026-07-24 10:48:00;
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号
';
    EXEC(@def4);
END;
GO

DECLARE @def5 nvarchar(max);

SELECT @def5 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.物料管理_专机_新增物料'));
IF @def5 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
BEGIN
    SET @def5 = REPLACE(@def5, N'CREATE        PROCEDURE [dbo].[物料管理_专机_新增物料]', N'ALTER PROCEDURE [dbo].[物料管理_专机_新增物料]');
    SET @def5 = @def5 + N'

-- 专机新增标准外购件后，回填采购合同明细PDM源流水号；修改人:Ld 修改时间:2026-07-24 10:48:00;
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号
';
    EXEC(@def5);
END;
GO

DECLARE @def6 nvarchar(max);

SELECT @def6 = OBJECT_DEFINITION(OBJECT_ID(N'dbo.订单信息_下达订单'));
IF @def6 NOT LIKE N'%GPT_采购明细PDM跟随变更_执行%'
BEGIN
    SET @def6 = REPLACE(@def6, N'CREATE        PROCEDURE [dbo].[订单信息_下达订单]', N'ALTER PROCEDURE [dbo].[订单信息_下达订单]');
    SET @def6 = REPLACE(@def6,
N'insert into PDM_零件明细表_标准件和外购件(组件流水号,物料流水号,零件数量,零件类型,材料流水号)
select @组件流水号,物料流水号,零件数量,零件类型,材料流水号 from 产品信息_外购件_基础表 where 产品流水号=@产品流水号

set @id = @id + 1',
N'insert into PDM_零件明细表_标准件和外购件(组件流水号,物料流水号,零件数量,零件类型,材料流水号)
select @组件流水号,物料流水号,零件数量,零件类型,材料流水号 from 产品信息_外购件_基础表 where 产品流水号=@产品流水号

-- 下达订单生成标准外购件后，回填采购合同明细PDM源流水号；修改人:Ld 修改时间:2026-07-24 10:48:00;
EXEC dbo.GPT_采购明细PDM跟随变更_执行 @新组件流水号 = @组件流水号

set @id = @id + 1');
    EXEC(@def6);
END;
GO
