feat: update MES tracking and reporting workflows

This commit is contained in:
2026-06-30 17:41:40 +08:00
parent e0e1b5d2bb
commit 1399b9a80a
47 changed files with 4465 additions and 90 deletions

View File

@@ -0,0 +1,147 @@
USE [YL_MESDB]
GO
SET NOCOUNT ON;
DECLARE @Title nvarchar(100) = N'产品合格率(工位)';
DECLARE @Path nvarchar(300) = N'ProductPassRateWorkstation/index';
DECLARE @Component nvarchar(300) = N'/ProductionManagement/ProductPassRateWorkstation/index';
DECLARE @Name nvarchar(100) = N'ProductPassRateWorkstation';
DECLARE @SourcePath nvarchar(300) = N'ProductionPlanTrack/index';
DECLARE @SourceComponent nvarchar(300) = N'/ProductionManagement/ProductionPlanTrack/index';
DECLARE @TargetRole int = NULL;
IF OBJECT_ID(N'dbo.登录基础数据_二级菜单', N'U') IS NULL
BEGIN
RAISERROR(N'未找到表 dbo.登录基础数据_二级菜单。', 16, 1);
RETURN;
END;
DECLARE @IdIsIdentity bit = ISNULL(COLUMNPROPERTY(OBJECT_ID(N'dbo.登录基础数据_二级菜单'), N'id', 'IsIdentity'), 0);
IF @IdIsIdentity = 1
BEGIN
;WITH SourceRows AS
(
SELECT
src.[账号代码],
COALESCE(prodParent.[id], src.[pid]) AS [pid],
src.[icon],
src.[AddData],
src.[DeleteData],
src.[EditData],
src.[SearchData]
FROM [dbo].[登录基础数据_二级菜单] AS src
OUTER APPLY
(
SELECT TOP (1) rp.[id]
FROM [dbo].[登录基础数据_二级菜单] AS rp
WHERE rp.[账号代码] = src.[账号代码]
AND rp.[是否启用] = 1
AND rp.[title] = N'生产管理'
ORDER BY rp.[id]
) AS prodParent
WHERE src.[是否启用] = 1
AND (@TargetRole IS NULL OR src.[账号代码] = @TargetRole)
AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'生产计划跟踪')
AND NOT EXISTS
(
SELECT 1
FROM [dbo].[登录基础数据_二级菜单] AS existing
WHERE existing.[账号代码] = src.[账号代码]
AND (existing.[path] = @Path OR existing.[componet] = @Component OR existing.[title] = @Title)
)
)
INSERT INTO [dbo].[登录基础数据_二级菜单]
([pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [是否启用], [AddData], [DeleteData], [EditData], [SearchData])
SELECT
[pid],
@Path,
@Component,
NULL,
@Name,
@Title,
[icon],
[账号代码],
1,
[AddData],
[DeleteData],
[EditData],
[SearchData]
FROM SourceRows;
END
ELSE
BEGIN
;WITH SourceRows AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY src.[账号代码], src.[id]) AS rn,
src.[账号代码],
COALESCE(prodParent.[id], src.[pid]) AS [pid],
src.[icon],
src.[AddData],
src.[DeleteData],
src.[EditData],
src.[SearchData]
FROM [dbo].[登录基础数据_二级菜单] AS src
OUTER APPLY
(
SELECT TOP (1) rp.[id]
FROM [dbo].[登录基础数据_二级菜单] AS rp
WHERE rp.[账号代码] = src.[账号代码]
AND rp.[是否启用] = 1
AND rp.[title] = N'生产管理'
ORDER BY rp.[id]
) AS prodParent
WHERE src.[是否启用] = 1
AND (@TargetRole IS NULL OR src.[账号代码] = @TargetRole)
AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'生产计划跟踪')
AND NOT EXISTS
(
SELECT 1
FROM [dbo].[登录基础数据_二级菜单] AS existing
WHERE existing.[账号代码] = src.[账号代码]
AND (existing.[path] = @Path OR existing.[componet] = @Component OR existing.[title] = @Title)
)
),
BaseId AS
(
SELECT ISNULL(MAX([id]), 0) AS maxId
FROM [dbo].[登录基础数据_二级菜单]
)
INSERT INTO [dbo].[登录基础数据_二级菜单]
([id], [pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [是否启用], [AddData], [DeleteData], [EditData], [SearchData])
SELECT
BaseId.maxId + SourceRows.rn,
SourceRows.[pid],
@Path,
@Component,
NULL,
@Name,
@Title,
SourceRows.[icon],
SourceRows.[账号代码],
1,
SourceRows.[AddData],
SourceRows.[DeleteData],
SourceRows.[EditData],
SourceRows.[SearchData]
FROM SourceRows
CROSS JOIN BaseId;
END;
UPDATE [dbo].[登录基础数据_二级菜单]
SET
[path] = @Path,
[componet] = @Component,
[name] = @Name,
[title] = @Title,
[模块代码] = [id],
[是否启用] = 1
WHERE [title] = @Title OR [componet] = @Component OR [path] = @Path;
SELECT [id], [pid], [path], [componet], [name], [title], [icon], [账号代码], [是否启用], [SearchData]
FROM [dbo].[登录基础数据_二级菜单]
WHERE [path] = @Path OR [componet] = @Component OR [title] = @Title
ORDER BY [账号代码], [id];

View File

@@ -0,0 +1,172 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID(N'dbo.生产管理_产品合格率工位_查询', N'P') IS NULL
BEGIN
EXEC(N'CREATE PROCEDURE [dbo].[生产管理_产品合格率工位_查询] AS BEGIN SET NOCOUNT ON; END');
END
GO
ALTER PROCEDURE [dbo].[生产管理_产品合格率工位_查询]
@生产订单号 nvarchar(100) = N'',
@物料编码 nvarchar(200) = N'',
@物料名称 nvarchar(200) = N'',
@关闭日期_Start nvarchar(50) = N'',
@关闭日期_End nvarchar(50) = N'',
@工序 nvarchar(100) = N'',
@工位 nvarchar(100) = N'',
@合格状态 nvarchar(20) = N'不合格'
AS
BEGIN
SET NOCOUNT ON;
DECLARE @开始日期 date = TRY_CONVERT(date, NULLIF(@关闭日期_Start, N''));
DECLARE @结束日期 date = TRY_CONVERT(date, NULLIF(@关闭日期_End, N''));
IF @开始日期 IS NULL AND @结束日期 IS NULL AND @生产订单号 = N''
BEGIN
SET @开始日期 = DATEADD(day, -30, CONVERT(date, GETDATE()));
SET @结束日期 = CONVERT(date, GETDATE());
END;
CREATE TABLE #已关闭订单
(
[生产订单号] nvarchar(100) NOT NULL PRIMARY KEY,
[关闭日期] datetime NULL,
[物料名称] nvarchar(200) NULL,
[物料编码] nvarchar(50) NULL,
[计划数量] decimal(18, 4) NULL
);
DECLARE @SapSql nvarchar(max) =
N'SELECT 生产订单号, 实际结算日期, 产品名称, 产品编码, 产品计划数量, 单据状态 FROM SBO_YL.dbo.UBT_OWOR WHERE 单据状态 IS NOT NULL';
IF @生产订单号 <> N''
SET @SapSql += N' AND 生产订单号 = ''' + REPLACE(@生产订单号, N'''', N'''''') + N'''';
IF @开始日期 IS NOT NULL
SET @SapSql += N' AND 实际结算日期 >= ''' + CONVERT(nvarchar(10), @开始日期, 120) + N'''';
IF @结束日期 IS NOT NULL
SET @SapSql += N' AND 实际结算日期 < ''' + CONVERT(nvarchar(10), DATEADD(day, 1, @结束日期), 120) + N'''';
DECLARE @OpenQuerySql nvarchar(max) =
N'INSERT INTO #已关闭订单
([生产订单号], [关闭日期], [物料名称], [物料编码], [计划数量])
SELECT CONVERT(nvarchar(100), [生产订单号]) AS [生产订单号],
[实际结算日期] AS [关闭日期],
[产品名称] AS [物料名称],
[产品编码] AS [物料编码],
CAST(ISNULL([产品计划数量], 0) AS decimal(18, 4)) AS [计划数量]
FROM OPENQUERY([SAP], ''' + REPLACE(@SapSql, N'''', N'''''') + N''')
WHERE (@物料编码 = N'''' OR [产品编码] LIKE N''%'' + @物料编码 + N''%'')
AND (@物料名称 = N'''' OR [产品名称] LIKE N''%'' + @物料名称 + N''%'')';
EXEC sp_executesql
@OpenQuerySql,
N'@物料编码 nvarchar(200), @物料名称 nvarchar(200)',
@物料编码 = @物料编码,
@物料名称 = @物料名称;
CREATE TABLE #明细汇总
(
[生产订单号] nvarchar(100) NOT NULL,
[工序号] int NULL,
[工序] nvarchar(200) NOT NULL,
[工位] nvarchar(200) NOT NULL,
[完成数量] decimal(18, 4) NOT NULL,
[不良数量] decimal(18, 4) NOT NULL,
[合格率] decimal(18, 2) NULL,
[检测说明] nvarchar(max) NULL
);
;WITH 明细基础 AS
(
SELECT
o.[生产订单号],
COALESCE(t.[订单行号], q.[行号]) AS [工序号],
COALESCE(NULLIF(q.[工序名称], N''), NULLIF(t.[工序名称], N''), N'') AS [工序],
COALESCE(NULLIF(q.[工位名称], N''), NULLIF(t.[指派对象], N''), N'空白') AS [工位],
CAST(ISNULL(q.[检验数量], ISNULL(q.[合格数], 0) + ISNULL(q.[不合格数], 0)) AS decimal(18, 4)) AS [完成数量],
CAST(ISNULL(q.[不合格数], 0) AS decimal(18, 4)) AS [不良数量],
NULLIF(LTRIM(RTRIM(CONVERT(nvarchar(max), q.[检测说明]))), N'') AS [检测说明]
FROM #已关闭订单 AS o
INNER JOIN [dbo].[YL_质量检验_质检记录] AS q
ON CONVERT(nvarchar(100), q.[计划号]) = o.[生产订单号]
LEFT JOIN [dbo].[MES_接口_生产计划_生产任务] AS t
ON q.[TaskAID] = t.[AID]
WHERE q.[质检类型] = N'收检'
AND (@工序 = N'' OR COALESCE(NULLIF(q.[工序名称], N''), NULLIF(t.[工序名称], N''), N'') LIKE N'%' + @工序 + N'%')
AND (@工位 = N'' OR COALESCE(NULLIF(q.[工位名称], N''), NULLIF(t.[指派对象], N''), N'空白') LIKE N'%' + @工位 + N'%')
)
INSERT INTO #明细汇总
([生产订单号], [工序号], [工序], [工位], [完成数量], [不良数量], [合格率], [检测说明])
SELECT
[生产订单号],
[工序号],
[工序],
[工位],
SUM([完成数量]) AS [完成数量],
SUM([不良数量]) AS [不良数量],
CAST(
CASE
WHEN SUM([完成数量]) = 0 THEN NULL
ELSE (SUM([完成数量]) - SUM([不良数量])) * 100.0 / SUM([完成数量])
END AS decimal(18, 2)
) AS [合格率],
STRING_AGG(CONVERT(nvarchar(max), [检测说明]), N';') AS [检测说明]
FROM 明细基础
GROUP BY [生产订单号], [工序号], [工序], [工位];
;WITH 一级汇总 AS
(
SELECT
[生产订单号],
SUM([完成数量]) AS [完成数量],
SUM([不良数量]) AS [不良数量],
CAST(
CASE
WHEN SUM([完成数量]) = 0 THEN NULL
ELSE (SUM([完成数量]) - SUM([不良数量])) * 100.0 / SUM([完成数量])
END AS decimal(18, 2)
) AS [合格率]
FROM #明细汇总
GROUP BY [生产订单号]
)
SELECT
o.[关闭日期],
o.[生产订单号],
o.[物料名称],
o.[物料编码],
o.[计划数量],
a.[完成数量],
a.[不良数量],
a.[合格率],
(
SELECT
d.[工序],
d.[工序号],
d.[工位],
d.[完成数量],
d.[不良数量],
d.[合格率],
ISNULL(d.[检测说明], N'') AS [检测说明]
FROM #明细汇总 AS d
WHERE d.[生产订单号] = o.[生产订单号]
ORDER BY d.[工序号], d.[工序], d.[工位]
FOR JSON PATH
) AS [明细JSON]
FROM #已关闭订单 AS o
INNER JOIN 一级汇总 AS a
ON o.[生产订单号] = a.[生产订单号]
WHERE (@合格状态 = N'' OR @合格状态 = N'全部'
OR (@合格状态 = N'合格' AND ISNULL(a.[合格率], 0) >= 100)
OR (@合格状态 = N'不合格' AND ISNULL(a.[合格率], 0) < 100))
ORDER BY o.[关闭日期] DESC, TRY_CONVERT(int, o.[生产订单号]) DESC, o.[生产订单号] DESC;
END
GO

View File

@@ -0,0 +1,188 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
2026-06-30
生产订单关闭查询:可关闭订单补充“无工时但满足其他可关闭条件”的特殊情况。
规则:
1. 有工时订单:继续要求 View_生产工时视图 中所有工时记录已校验。
2. 无工时订单:必须在 MES_接口_生产计划 中存在,且 View_生产工时视图 中没有任何工时记录。
3. 无工时订单不做工时全部校验,但仍必须满足原有可关闭条件:
- 单据状态为空;
- 终检/收检/计划数量/入库数量满足原过程 HAVING 条件;
- 入库数量等于终检合格数。
*/
ALTER PROCEDURE [dbo].[计划排产_生产订单关闭_查询全部订单]
@订单号 nvarchar(100) = N'',
@单据状态 nvarchar(100) = N'', -- 可选值:'已关闭'、'未关闭'、'可关闭'
@属性 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
IF (@单据状态 = N'可关闭')
BEGIN
CREATE TABLE #工时订单
(
订单号 nvarchar(100) NOT NULL PRIMARY KEY
);
INSERT INTO #工时订单 (订单号)
SELECT DISTINCT CONVERT(nvarchar(100), 订单号)
FROM dbo.View_生产工时视图
WHERE 订单号 IS NOT NULL;
;WITH 收检数量 AS
(
SELECT
计划号,
SUM(ISNULL(合格数, 0)) AS 合格数合计,
SUM(ISNULL(不合格数, 0)) AS 不合格数合计
FROM dbo.YL_质量检验_质检记录
WHERE 质检类型 = N'收检'
GROUP BY 计划号
),
终检数量 AS
(
SELECT
计划号,
SUM(ISNULL(合格数, 0)) AS 终检合格数合计,
SUM(ISNULL(不合格数, 0)) AS 终检不合格数合计
FROM dbo.YL_质量检验_质检记录
WHERE 质检类型 = N'终检'
GROUP BY 计划号
),
可关闭订单 AS
(
SELECT
v.订单号 AS 订单编号,
MAX(v.产品名称) AS 产品名称,
MAX(v.产品编码) AS 产品编码,
MAX(v.入库数量) AS 入库数量,
MAX(v.订单合同号) AS 合同号,
MAX(终检数量.终检不合格数合计) AS 终检不合格数合计,
MAX(终检数量.终检合格数合计) AS 终检合格数合计,
MAX(v.计划数量) AS 计划数量,
MAX(v.确认状态) AS 确认状态,
MAX(v.单据状态) AS 单据状态,
MAX(收检数量.不合格数合计) AS 不合格数合计,
MIN(CASE WHEN v.Expr1 IS NULL THEN 0 ELSE 1 END) AS 是否全部校验
FROM dbo.View_生产工时视图 AS v
LEFT JOIN 收检数量 ON v.订单号 = 收检数量.计划号
LEFT JOIN 终检数量 ON v.订单号 = 终检数量.计划号
WHERE v.单据状态 IS NULL
AND (@订单号 = N'' OR v.订单号 = @订单号)
AND (
@属性 NOT IN (N'机加', N'装配')
OR (@属性 = N'机加' AND v.自制件属性 = N'机加件')
OR (@属性 = N'装配' AND v.自制件属性 LIKE N'%装配%')
)
GROUP BY v.订单号
HAVING
MIN(CASE WHEN v.Expr1 IS NULL THEN 0 ELSE 1 END) = 1
AND (
MAX(终检数量.终检合格数合计) + MAX(收检数量.不合格数合计) = MAX(v.计划数量)
OR MAX(v.计划数量) = MAX(v.入库数量)
OR MAX(收检数量.不合格数合计) = MAX(v.计划数量)
)
AND MAX(ISNULL(v.入库数量, 0)) = MAX(ISNULL(终检数量.终检合格数合计, 0))
UNION ALL
SELECT
CONVERT(nvarchar(100), p.订单编号) AS 订单编号,
MAX(p.物料描述) AS 产品名称,
MAX(p.物料编号) AS 产品编码,
MAX(p.入库数量) AS 入库数量,
MAX(p.合同号) AS 合同号,
MAX(终检数量.终检不合格数合计) AS 终检不合格数合计,
MAX(终检数量.终检合格数合计) AS 终检合格数合计,
MAX(p.计划数量) AS 计划数量,
MAX(p.确认状态) AS 确认状态,
MAX(p.单据状态) AS 单据状态,
MAX(收检数量.不合格数合计) AS 不合格数合计,
1 AS 是否全部校验
FROM dbo.MES_接口_生产计划 AS p
LEFT JOIN 收检数量 ON CONVERT(nvarchar(100), p.订单编号) = CONVERT(nvarchar(100), 收检数量.计划号)
LEFT JOIN 终检数量 ON CONVERT(nvarchar(100), p.订单编号) = CONVERT(nvarchar(100), 终检数量.计划号)
LEFT JOIN #工时订单 AS wh ON wh.订单号 = CONVERT(nvarchar(100), p.订单编号)
WHERE p.单据状态 IS NULL
AND wh.订单号 IS NULL
AND (@订单号 = N'' OR CONVERT(nvarchar(100), p.订单编号) = @订单号)
AND (
@属性 NOT IN (N'机加', N'装配')
OR (@属性 = N'机加' AND p.自制件属性 = N'机加件')
OR (@属性 = N'装配' AND p.自制件属性 LIKE N'%装配%')
)
GROUP BY p.订单编号
HAVING
(
MAX(终检数量.终检合格数合计) + MAX(收检数量.不合格数合计) = MAX(p.计划数量)
OR MAX(p.计划数量) = MAX(p.入库数量)
OR MAX(收检数量.不合格数合计) = MAX(p.计划数量)
)
AND MAX(ISNULL(p.入库数量, 0)) = MAX(ISNULL(终检数量.终检合格数合计, 0))
)
SELECT
订单编号,
产品名称,
产品编码,
入库数量,
合同号,
终检不合格数合计,
终检合格数合计,
计划数量,
确认状态,
单据状态,
不合格数合计,
是否全部校验
FROM 可关闭订单
ORDER BY 订单编号;
RETURN;
END
SELECT TOP 100
v.订单编号,
MAX(v.物料描述) AS 产品名称,
MAX(v.物料编号) AS 产品编码,
MAX(v.入库数量) AS 入库数量,
MAX(v.合同号) AS 合同号,
MAX(zj_终检数量.终检不合格数合计) AS 终检不合格数合计,
MAX(zj_终检数量.终检合格数合计) AS 终检合格数合计,
MAX(v.计划数量) AS 计划数量,
MAX(v.确认状态) AS 确认状态,
MAX(v.单据状态) AS 单据状态
FROM dbo.MES_接口_生产计划 AS v
LEFT JOIN
(
SELECT
计划号,
SUM(ISNULL(合格数, 0)) AS 终检合格数合计,
SUM(ISNULL(不合格数, 0)) AS 终检不合格数合计
FROM dbo.YL_质量检验_质检记录
WHERE 质检类型 = N'终检'
GROUP BY 计划号
) AS zj_终检数量 ON v.订单编号 = zj_终检数量.计划号
WHERE 1 = 1
AND (@订单号 = N'' OR CONVERT(nvarchar(100), v.订单编号) = @订单号)
AND (
@单据状态 NOT IN (N'SAP未关闭', N'已关闭', N'未关闭')
OR (@单据状态 = N'SAP未关闭' AND v.单据状态 = N'已关闭')
OR (@单据状态 = N'已关闭' AND (v.单据状态 = N'已关闭' OR v.单据状态 = N'已取消'))
OR (@单据状态 = N'未关闭' AND v.单据状态 IS NULL)
)
AND (
@属性 NOT IN (N'机加', N'装配')
OR (@属性 = N'机加' AND v.自制件属性 = N'机加件')
OR (@属性 = N'装配' AND v.自制件属性 LIKE N'%装配%')
)
GROUP BY v.订单编号;
END
GO

View File

@@ -0,0 +1,409 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询', N'P') IS NULL
BEGIN
EXEC(N'CREATE PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] AS BEGIN SET NOCOUNT ON; END');
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询]
@订单号 int = 0,
@物料类型 nvarchar(50) = N'',
@合同号 nvarchar(50) = N'',
@产品编码 nvarchar(50) = N'',
@产品名称 nvarchar(50) = N'',
@工序名称 nvarchar(50) = N'',
@计划开始 nvarchar(50) = N'',
@计划完成 nvarchar(50) = N'',
@排产状态 nvarchar(50) = N'全部',
@指派对象 nvarchar(50) = N'全部',
@计划号 nvarchar(50) = N'',
@发货状态 nvarchar(50) = N'全部',
@齐套 nvarchar(50) = N'全部',
@检验状态 nvarchar(50) = N'',
@发料状态 nvarchar(50) = N'全部',
@自制件属性 nvarchar(50) = N'全部'
AS
BEGIN
SET NOCOUNT ON;
;WITH SAP缺件源 AS (
SELECT
s.DocEntry,
s.Project COLLATE DATABASE_DEFAULT AS Project,
s.[行号],
s.ItemCode COLLATE DATABASE_DEFAULT AS ItemCode,
s.U_Name COLLATE DATABASE_DEFAULT AS U_Name,
ISNULL(s.[属性] COLLATE DATABASE_DEFAULT, N'') AS 属性,
ISNULL(s.[未发货数量], 0) AS 未发货数量,
ISNULL(s.[库存量], 0) AS 库存数量,
ISNULL(s.[在制采购], 0) AS 在制采购,
s.[采购预计交货日期],
ISNULL(s.[采购未清数量], 0) AS 采购未清数量,
ISNULL(s.[到货草稿], 0) AS 到货草稿
FROM [SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc] AS s
WHERE ISNULL(s.[未发货数量], 0) > 0
),
SAP缺件 AS (
SELECT TOP (2000)
src.*
FROM (
SELECT
SAP缺件源.*,
ROW_NUMBER() OVER (
PARTITION BY
SAP缺件源.DocEntry,
SAP缺件源.Project,
SAP缺件源.ItemCode,
SAP缺件源.属性
ORDER BY
SAP缺件源.[未发货数量] DESC,
SAP缺件源.[行号]
) AS rn
FROM SAP缺件源
) AS src
WHERE src.rn = 1
),
查询结果 AS (
SELECT
ISNULL(v.[计划号], N'') AS [计划号],
ISNULL(v.[合同号], N'') AS [合同号],
v.[订单编号] AS [订单号],
v.[物料编号] AS [产品编码],
v.[物料描述] AS [产品名称],
v.[计划数量订单],
v.[入库数量],
v.[计划完成] AS [要求完工日期],
v.[要求发货日期],
CASE
WHEN ISNULL(v.[发货状态], 0) = 1 THEN N'已发货'
ELSE N'未发货'
END AS [发货状态],
CASE
WHEN ISNULL(v.[齐套], 0) = 1 THEN N'是'
ELSE N'否'
END AS [齐套],
CASE
WHEN ISNULL(v.[拣配状态], 0) = 1 THEN N'已拣配'
ELSE N'未拣配'
END AS [拣配状态],
CASE
WHEN ISNULL(v.[发料状态], N'') = N'1' THEN N'发料齐套'
WHEN ISNULL(v.[发料状态], N'') = N'2' THEN N'发料缺件'
ELSE N'未发料'
END AS [发料状态],
CASE
WHEN ISNULL(v.[任务状态], 0) IN (2, 4) OR v.[开工时间] > '1900-01-01' THEN N'已开工'
ELSE N'待执行'
END AS [装配开工],
v.[完成数量],
CASE
WHEN final_check.[计划号] IS NOT NULL THEN N'是'
ELSE N'否'
END AS [终检],
CASE WHEN ISNULL(v.[生产工艺], 0) = 1 THEN N'是' ELSE N'否' END AS [生产工艺],
CASE WHEN ISNULL(v.[排产状态], 0) = 1 THEN N'已排产' ELSE N'未排产' END AS [排产状态],
ISNULL(v.[自制件属性], N'') AS [自制件属性],
v.[计划开始时间] AS [预计齐套时间],
sap.ItemCode AS [缺件物料编码],
sap.U_Name AS [缺件物料名称],
sap.[未发货数量] AS [缺件数量],
sap.[库存数量] AS [库存数量],
CASE WHEN sap.[属性] = N'' THEN N'外购' ELSE sap.[属性] END AS [缺件属性],
CASE
WHEN sap.[属性] = N'' THEN ISNULL(CONVERT(nvarchar(50), NULLIF(sap.[到货草稿], 0)), N'')
ELSE ISNULL(CONVERT(nvarchar(50), detail_order.[订单编号]), N'')
END AS [缺件生产订单号],
CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(current_step.[当前序], N'') END AS [进度],
CASE
WHEN sap.[属性] = N'' THEN
N'未清数量:' + CONVERT(nvarchar(30), sap.[采购未清数量]) +
N' / 到货草稿:' + CONVERT(nvarchar(30), sap.[到货草稿]) +
N' / 质检状态:' + ISNULL(purchase_check.[质检状态], N'未完成')
ELSE ISNULL(route.[工艺路线], N'')
END AS [工艺路线],
CASE
WHEN sap.[属性] = N'' THEN sap.[采购预计交货日期]
ELSE route.[预计完成时间]
END AS [预计完成时间],
CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(route.[工艺路线明细], N'[]') END AS [工艺路线明细],
sap.[采购未清数量],
sap.[到货草稿],
ISNULL(purchase_check.[质检状态], CASE WHEN sap.[属性] = N'' THEN N'未完成' ELSE N'' END) AS [质检状态],
sap.DocEntry AS [SAP单据],
sap.[行号] AS [SAP行号]
FROM SAP缺件 AS sap
OUTER APPLY (
SELECT TOP (1) m.*
FROM [dbo].[View_生产订单_MES] AS m
WHERE m.[物料类型] = N'pit_Resource'
AND ISNULL(m.[排产状态], 0) = 1
AND m.[订单编号] = sap.DocEntry
ORDER BY m.[订单行号]
) AS v
OUTER APPLY (
SELECT TOP (1) m.*
FROM [dbo].[View_生产订单_MES] AS m
WHERE m.[物料类型] = N'pit_Resource'
AND ISNULL(m.[排产状态], 0) = 1
AND m.[订单编号] <> v.[订单编号]
AND (
(sap.[属性] = N'机加件' AND m.[物料编号] = sap.ItemCode)
OR (sap.[属性] LIKE N'%装配%' AND m.[物料编号] = sap.ItemCode AND ISNULL(m.[合同号], N'') = ISNULL(sap.Project, N''))
)
ORDER BY m.[订单编号] DESC, m.[订单行号]
) AS detail_order
OUTER APPLY (
SELECT TOP (1) q.[计划号]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[质检类型] = N'终检'
AND q.[计划号] = v.[订单编号]
) AS final_check
OUTER APPLY (
SELECT
MAX(p.[计划完成时间]) AS [预计完成时间],
STUFF((
SELECT N'、' + p2.[工序名称] +
CASE WHEN ISNULL(p2.[指派对象], N'') = N'' THEN N'' ELSE N'(' + p2.[指派对象] + N')' END
FROM [dbo].[View_生产订单_MES] AS p2
WHERE p2.[订单编号] = detail_order.[订单编号]
AND p2.[物料类型] = N'pit_Resource'
ORDER BY p2.[订单行号]
FOR XML PATH(N''), TYPE
).value(N'.', N'nvarchar(max)'), 1, 1, N'') AS [工艺路线],
(
SELECT
p2.[订单行号],
p2.[工序名称],
p2.[指派对象],
p2.[计划开始时间],
p2.[计划完成时间],
ISNULL(p2.[进度], 0) AS [进度],
ISNULL(p2.[完成数量], 0) AS [完成数量],
ISNULL(p2.[收料数量], 0) AS [收料数量],
ISNULL(p2.[加工状态], 0) AS [加工状态],
p2.[开工时间],
ISNULL(check_qty.[收检合格数], 0) AS [收检合格数],
ISNULL(check_qty.[收检不合格数], 0) AS [收检不合格数]
FROM [dbo].[View_生产订单_MES] AS p2
OUTER APPLY (
SELECT
SUM(ISNULL(q.[合格数], 0)) AS [收检合格数],
SUM(ISNULL(q.[不合格数], 0)) AS [收检不合格数]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[TaskAID] = p2.[TaskAID]
AND q.[质检类型] = N'收检'
) AS check_qty
WHERE p2.[订单编号] = detail_order.[订单编号]
AND p2.[物料类型] = N'pit_Resource'
ORDER BY p2.[订单行号]
FOR JSON PATH
) AS [工艺路线明细]
FROM [dbo].[View_生产订单_MES] AS p
WHERE p.[订单编号] = detail_order.[订单编号]
AND p.[物料类型] = N'pit_Resource'
) AS route
OUTER APPLY (
SELECT TOP (1)
pending.[订单行号],
pending.[工序名称],
pending.[加工状态],
pending.[进度],
pending.[完成数量],
pending.[计划数量],
pending.[开工时间]
FROM [dbo].[View_生产订单_MES] AS pending
WHERE pending.[订单编号] = detail_order.[订单编号]
AND pending.[物料类型] = N'pit_Resource'
AND NOT (
ISNULL(pending.[进度], 0) >= 100
OR (ISNULL(pending.[计划数量], 0) > 0 AND ISNULL(pending.[完成数量], 0) >= ISNULL(pending.[计划数量], 0))
)
ORDER BY pending.[订单行号]
) AS pending
OUTER APPLY (
SELECT TOP (1) prev.[工序名称]
FROM [dbo].[View_生产订单_MES] AS prev
WHERE prev.[订单编号] = detail_order.[订单编号]
AND prev.[物料类型] = N'pit_Resource'
AND prev.[订单行号] < pending.[订单行号]
ORDER BY prev.[订单行号] DESC
) AS prev_step
OUTER APPLY (
SELECT TOP (1) last_step.[工序名称]
FROM [dbo].[View_生产订单_MES] AS last_step
WHERE last_step.[订单编号] = detail_order.[订单编号]
AND last_step.[物料类型] = N'pit_Resource'
ORDER BY last_step.[订单行号] DESC
) AS last_step
OUTER APPLY (
SELECT
CASE
WHEN detail_order.[订单编号] IS NULL THEN N''
WHEN pending.[订单行号] IS NULL THEN ISNULL(last_step.[工序名称], N'') + N'毕'
WHEN ISNULL(pending.[进度], 0) > 0
OR ISNULL(pending.[完成数量], 0) > 0
OR ISNULL(pending.[加工状态], 0) IN (2, 3, 4, 5, 6)
OR pending.[开工时间] > '1900-01-01'
THEN ISNULL(pending.[工序名称], N'') + N'中'
WHEN prev_step.[工序名称] IS NULL THEN N''
ELSE prev_step.[工序名称] + N'毕待' + ISNULL(pending.[工序名称], N'')
END AS [当前序]
) AS current_step
OUTER APPLY (
SELECT
CASE
WHEN sap.[属性] <> N'' THEN N''
WHEN EXISTS (
SELECT 1
FROM [dbo].[质量检验_质检任务_SAP] AS task
OUTER APPLY (
SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[检测类型编号] = 5
AND q.[计划号] = task.[订单编号]
AND q.[行号] = task.[行号]
AND q.[订单类型] = task.[订单类型]
) AS checked_qty
WHERE sap.[到货草稿] > 0
AND task.[订单类型] = N'20'
AND task.[订单编号] = sap.[到货草稿]
AND ISNULL(task.[入库数量], 0) > 0
)
AND NOT EXISTS (
SELECT 1
FROM [dbo].[质量检验_质检任务_SAP] AS task
OUTER APPLY (
SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[检测类型编号] = 5
AND q.[计划号] = task.[订单编号]
AND q.[行号] = task.[行号]
AND q.[订单类型] = task.[订单类型]
) AS checked_qty
WHERE sap.[到货草稿] > 0
AND task.[订单类型] = N'20'
AND task.[订单编号] = sap.[到货草稿]
AND (
ISNULL(task.[入库数量], 0) <= 0
OR ISNULL(checked_qty.[已检验数量], 0) < ISNULL(task.[入库数量], 0)
)
) THEN N'已完成'
ELSE N'未完成'
END AS [质检状态]
) AS purchase_check
WHERE
v.[订单编号] IS NOT NULL
AND (@订单号 <= 0 OR v.[订单编号] = @订单号)
AND (@计划号 = N'' OR ISNULL(v.[计划号], N'') = @计划号)
AND (@合同号 = N'' OR ISNULL(v.[合同号], N'') LIKE N'%' + @合同号 + N'%')
AND (@产品编码 = N'' OR ISNULL(v.[物料编号], N'') LIKE N'%' + @产品编码 + N'%')
AND (@产品名称 = N'' OR ISNULL(v.[物料描述], N'') LIKE N'%' + @产品名称 + N'%')
AND (@工序名称 = N'' OR EXISTS (
SELECT 1
FROM [dbo].[View_生产订单_MES] AS fp
WHERE fp.[订单编号] = v.[订单编号]
AND fp.[工序名称] = @工序名称
))
AND (@计划开始 = N'' OR v.[计划开始时间] >= TRY_CONVERT(datetime, @计划开始))
AND (@计划完成 = N'' OR v.[计划开始时间] <= TRY_CONVERT(datetime, @计划完成))
AND (@排产状态 = N'全部' OR @排产状态 = N'' OR
(@排产状态 = N'已完成' AND ISNULL(v.[排产状态], 0) = 1) OR
(@排产状态 = N'未完成' AND ISNULL(v.[排产状态], 0) = 0)
)
AND (@指派对象 = N'全部' OR @指派对象 = N'' OR EXISTS (
SELECT 1
FROM [dbo].[View_生产订单_MES] AS ap
WHERE ap.[订单编号] = v.[订单编号]
AND ap.[指派对象] IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@指派对象, N','))
))
AND (@发货状态 = N'全部' OR @发货状态 = N'' OR
(@发货状态 = N'已发货' AND ISNULL(v.[发货状态], N'0') = N'1') OR
(@发货状态 = N'未发货' AND ISNULL(v.[发货状态], N'0') <> N'1')
)
AND (@齐套 = N'全部' OR @齐套 = N'' OR
(@齐套 = N'是' AND ISNULL(v.[齐套], 0) = 1) OR
(@齐套 = N'否' AND ISNULL(v.[齐套], 0) <> 1)
)
AND (@发料状态 = N'全部' OR @发料状态 = N'' OR
(@发料状态 = N'发料齐套' AND ISNULL(v.[发料状态], N'0') = N'1') OR
(@发料状态 = N'发料缺件' AND ISNULL(v.[发料状态], N'0') = N'2') OR
(@发料状态 = N'未发料' AND ISNULL(v.[发料状态], N'0') NOT IN (N'1', N'2'))
)
AND (@自制件属性 = N'全部' OR @自制件属性 = N'' OR
(@自制件属性 = N'机加' AND (sap.[属性] = N'机加件' OR v.[自制件属性] = N'机加件')) OR
(@自制件属性 = N'装配' AND (sap.[属性] LIKE N'%装配%' OR v.[自制件属性] LIKE N'%装配%'))
)
AND (@检验状态 = N'' OR (sap.[属性] = N'' AND ISNULL(purchase_check.[质检状态], N'') = @检验状态))
)
SELECT TOP (1000)
[计划号],
[合同号],
[订单号],
[产品编码],
[产品名称],
[计划数量订单],
[入库数量],
[要求完工日期],
[要求发货日期],
[发货状态],
[齐套],
[拣配状态],
[发料状态],
[装配开工],
[完成数量],
[终检],
[生产工艺],
[排产状态],
[自制件属性],
[预计齐套时间],
[缺件物料编码],
[缺件物料名称],
[缺件数量],
[库存数量],
[缺件属性],
[缺件生产订单号],
[进度],
[工艺路线],
[预计完成时间],
[工艺路线明细],
[采购未清数量],
[到货草稿],
[质检状态],
[SAP单据],
[SAP行号]
FROM (
SELECT
查询结果.*,
ROW_NUMBER() OVER (
PARTITION BY
[订单号],
CASE
WHEN ISNULL([缺件生产订单号], N'') <> N'' THEN [缺件生产订单号]
ELSE [缺件物料编码] + N':' + CONVERT(nvarchar(30), [SAP行号])
END
ORDER BY [缺件数量] DESC, [SAP单据], [SAP行号]
) AS rn
FROM 查询结果
) AS dedup
WHERE rn = 1
ORDER BY
[预计齐套时间],
[订单号],
[缺件生产订单号],
[缺件物料编码];
END
GO

View File

@@ -0,0 +1,423 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询', N'P') IS NULL
BEGIN
EXEC(N'CREATE PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] AS BEGIN SET NOCOUNT ON; END');
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询]
@订单号 int = 0,
@物料类型 nvarchar(50) = N'',
@合同号 nvarchar(50) = N'',
@产品编码 nvarchar(50) = N'',
@产品名称 nvarchar(50) = N'',
@工序名称 nvarchar(50) = N'',
@计划开始 nvarchar(50) = N'',
@计划完成 nvarchar(50) = N'',
@排产状态 nvarchar(50) = N'全部',
@指派对象 nvarchar(50) = N'全部',
@计划号 nvarchar(50) = N'',
@发货状态 nvarchar(50) = N'全部',
@齐套 nvarchar(50) = N'全部',
@检验状态 nvarchar(50) = N'',
@发料状态 nvarchar(50) = N'全部',
@自制件属性 nvarchar(50) = N'全部'
AS
BEGIN
SET NOCOUNT ON;
;WITH SAP缺件源 AS (
SELECT
s.DocEntry,
s.Project COLLATE DATABASE_DEFAULT AS Project,
s.[行号],
s.ItemCode COLLATE DATABASE_DEFAULT AS ItemCode,
s.U_Name COLLATE DATABASE_DEFAULT AS U_Name,
ISNULL(s.[属性] COLLATE DATABASE_DEFAULT, N'') AS 属性,
ISNULL(s.[未发货数量], 0) AS 未发货数量,
ISNULL(s.[库存量], 0) AS 库存数量,
ISNULL(s.[在制采购], 0) AS 在制采购,
ISNULL(s.DocNum, 0) AS DocNum,
s.[采购员] COLLATE DATABASE_DEFAULT AS 采购员,
s.[采购预计交货日期],
ISNULL(s.[采购未清数量], 0) AS 采购未清数量,
ISNULL(s.[到货草稿], 0) AS 到货草稿
FROM [SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc] AS s
WHERE ISNULL(s.[未发货数量], 0) > 0
),
SAP缺件 AS (
SELECT TOP (2000)
src.*
FROM (
SELECT
SAP缺件源.*,
ROW_NUMBER() OVER (
PARTITION BY
SAP缺件源.DocEntry,
SAP缺件源.Project,
SAP缺件源.ItemCode,
SAP缺件源.属性
ORDER BY
SAP缺件源.[未发货数量] DESC,
SAP缺件源.[行号]
) AS rn
FROM SAP缺件源
) AS src
WHERE src.rn = 1
),
查询结果 AS (
SELECT
ISNULL(v.[计划号], N'') AS [计划号],
ISNULL(v.[合同号], N'') AS [合同号],
v.[订单编号] AS [订单号],
v.[物料编号] AS [产品编码],
v.[物料描述] AS [产品名称],
v.[计划数量订单],
v.[入库数量],
v.[计划完成] AS [要求完工日期],
v.[要求发货日期],
CASE
WHEN ISNULL(v.[发货状态], 0) = 1 THEN N'已发货'
ELSE N'未发货'
END AS [发货状态],
CASE
WHEN ISNULL(v.[齐套], 0) = 1 THEN N'是'
ELSE N'否'
END AS [齐套],
CASE
WHEN ISNULL(v.[拣配状态], 0) = 1 THEN N'已拣配'
ELSE N'未拣配'
END AS [拣配状态],
CASE
WHEN ISNULL(v.[发料状态], N'') = N'1' THEN N'发料齐套'
WHEN ISNULL(v.[发料状态], N'') = N'2' THEN N'发料缺件'
ELSE N'未发料'
END AS [发料状态],
CASE
WHEN ISNULL(v.[任务状态], 0) IN (2, 4) OR v.[开工时间] > '1900-01-01' THEN N'已开工'
ELSE N'待执行'
END AS [装配开工],
v.[完成数量],
CASE
WHEN final_check.[计划号] IS NOT NULL THEN N'是'
ELSE N'否'
END AS [终检],
CASE WHEN ISNULL(v.[生产工艺], 0) = 1 THEN N'是' ELSE N'否' END AS [生产工艺],
CASE WHEN ISNULL(v.[排产状态], 0) = 1 THEN N'已排产' ELSE N'未排产' END AS [排产状态],
ISNULL(v.[自制件属性], N'') AS [自制件属性],
v.[计划开始时间] AS [预计齐套时间],
sap.ItemCode AS [缺件物料编码],
sap.U_Name AS [缺件物料名称],
sap.[未发货数量] AS [缺件数量],
sap.[库存数量] AS [库存数量],
CASE WHEN sap.[属性] = N'' THEN N'外购' ELSE sap.[属性] END AS [缺件属性],
CASE
WHEN sap.[属性] = N'' THEN ISNULL(CONVERT(nvarchar(50), NULLIF(sap.[在制采购], 0)), N'')
ELSE ISNULL(CONVERT(nvarchar(50), detail_order.[订单编号]), N'')
END AS [缺件生产订单号],
CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(current_step.[当前序], N'') END AS [进度],
CASE
WHEN sap.[属性] = N'' THEN
N'采购员:' + ISNULL(NULLIF(sap.[采购员], N''), N'-') +
N' / 未清数量:' + CONVERT(nvarchar(30), sap.[采购未清数量]) +
N' / 到货草稿:' + CONVERT(nvarchar(30), sap.[到货草稿]) +
N' / 质检状态:' + ISNULL(purchase_check.[质检状态], N'未完成')
ELSE ISNULL(route.[工艺路线], N'')
END AS [工艺路线],
CASE
WHEN sap.[属性] = N'' THEN sap.[采购预计交货日期]
ELSE route.[预计完成时间]
END AS [预计完成时间],
CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(route.[工艺路线明细], N'[]') END AS [工艺路线明细],
sap.[采购未清数量],
sap.[到货草稿],
ISNULL(purchase_check.[质检状态], CASE WHEN sap.[属性] = N'' THEN N'未完成' ELSE N'' END) AS [质检状态],
sap.DocEntry AS [SAP单据],
sap.[行号] AS [SAP行号]
FROM SAP缺件 AS sap
OUTER APPLY (
SELECT TOP (1) m.*
FROM [dbo].[View_生产订单_MES] AS m
WHERE m.[物料类型] = N'pit_Resource'
AND ISNULL(m.[排产状态], 0) = 1
AND m.[订单编号] = sap.DocEntry
ORDER BY m.[订单行号]
) AS v
OUTER APPLY (
SELECT m.*
FROM (
SELECT
m.*,
ROW_NUMBER() OVER (
PARTITION BY m.[订单编号]
ORDER BY m.[订单行号]
) AS rn
FROM [dbo].[View_生产订单_MES] AS m
WHERE m.[物料类型] = N'pit_Resource'
AND ISNULL(m.[排产状态], 0) = 1
AND m.[订单编号] <> v.[订单编号]
AND (
(sap.[属性] = N'机加件' AND (
m.[物料编号] = sap.ItemCode
OR (sap.DocNum > 0 AND m.[订单编号] = sap.DocNum)
))
OR (sap.[属性] LIKE N'%装配%' AND m.[物料编号] = sap.ItemCode AND ISNULL(m.[合同号], N'') = ISNULL(sap.Project, N''))
)
) AS m
WHERE m.rn = 1
) AS detail_order
OUTER APPLY (
SELECT TOP (1) q.[计划号]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[质检类型] = N'终检'
AND q.[计划号] = v.[订单编号]
) AS final_check
OUTER APPLY (
SELECT
MAX(p.[计划完成时间]) AS [预计完成时间],
STUFF((
SELECT N'、' + p2.[工序名称] +
CASE WHEN ISNULL(p2.[指派对象], N'') = N'' THEN N'' ELSE N'(' + p2.[指派对象] + N')' END
FROM [dbo].[View_生产订单_MES] AS p2
WHERE p2.[订单编号] = detail_order.[订单编号]
AND p2.[物料类型] = N'pit_Resource'
ORDER BY p2.[订单行号]
FOR XML PATH(N''), TYPE
).value(N'.', N'nvarchar(max)'), 1, 1, N'') AS [工艺路线],
(
SELECT
p2.[订单行号],
p2.[工序名称],
p2.[指派对象],
p2.[计划开始时间],
p2.[计划完成时间],
ISNULL(p2.[进度], 0) AS [进度],
ISNULL(p2.[完成数量], 0) AS [完成数量],
ISNULL(p2.[收料数量], 0) AS [收料数量],
ISNULL(p2.[加工状态], 0) AS [加工状态],
p2.[开工时间],
ISNULL(check_qty.[收检合格数], 0) AS [收检合格数],
ISNULL(check_qty.[收检不合格数], 0) AS [收检不合格数]
FROM [dbo].[View_生产订单_MES] AS p2
OUTER APPLY (
SELECT
SUM(ISNULL(q.[合格数], 0)) AS [收检合格数],
SUM(ISNULL(q.[不合格数], 0)) AS [收检不合格数]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[TaskAID] = p2.[TaskAID]
AND q.[质检类型] = N'收检'
) AS check_qty
WHERE p2.[订单编号] = detail_order.[订单编号]
AND p2.[物料类型] = N'pit_Resource'
ORDER BY p2.[订单行号]
FOR JSON PATH
) AS [工艺路线明细]
FROM [dbo].[View_生产订单_MES] AS p
WHERE p.[订单编号] = detail_order.[订单编号]
AND p.[物料类型] = N'pit_Resource'
) AS route
OUTER APPLY (
SELECT TOP (1)
pending.[订单行号],
pending.[工序名称],
pending.[加工状态],
pending.[进度],
pending.[完成数量],
pending.[计划数量],
pending.[开工时间]
FROM [dbo].[View_生产订单_MES] AS pending
WHERE pending.[订单编号] = detail_order.[订单编号]
AND pending.[物料类型] = N'pit_Resource'
AND NOT (
ISNULL(pending.[进度], 0) >= 100
OR (ISNULL(pending.[计划数量], 0) > 0 AND ISNULL(pending.[完成数量], 0) >= ISNULL(pending.[计划数量], 0))
)
ORDER BY pending.[订单行号]
) AS pending
OUTER APPLY (
SELECT TOP (1) prev.[工序名称]
FROM [dbo].[View_生产订单_MES] AS prev
WHERE prev.[订单编号] = detail_order.[订单编号]
AND prev.[物料类型] = N'pit_Resource'
AND prev.[订单行号] < pending.[订单行号]
ORDER BY prev.[订单行号] DESC
) AS prev_step
OUTER APPLY (
SELECT TOP (1) last_step.[工序名称]
FROM [dbo].[View_生产订单_MES] AS last_step
WHERE last_step.[订单编号] = detail_order.[订单编号]
AND last_step.[物料类型] = N'pit_Resource'
ORDER BY last_step.[订单行号] DESC
) AS last_step
OUTER APPLY (
SELECT
CASE
WHEN detail_order.[订单编号] IS NULL THEN N''
WHEN pending.[订单行号] IS NULL THEN ISNULL(last_step.[工序名称], N'') + N'毕'
WHEN ISNULL(pending.[进度], 0) > 0
OR ISNULL(pending.[完成数量], 0) > 0
OR ISNULL(pending.[加工状态], 0) IN (2, 3, 4, 5, 6)
OR pending.[开工时间] > '1900-01-01'
THEN ISNULL(pending.[工序名称], N'') + N'中'
WHEN prev_step.[工序名称] IS NULL THEN N''
ELSE prev_step.[工序名称] + N'毕待' + ISNULL(pending.[工序名称], N'')
END AS [当前序]
) AS current_step
OUTER APPLY (
SELECT
CASE
WHEN sap.[属性] <> N'' THEN N''
WHEN EXISTS (
SELECT 1
FROM [dbo].[质量检验_质检任务_SAP] AS task
OUTER APPLY (
SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[检测类型编号] = 5
AND q.[计划号] = task.[订单编号]
AND q.[行号] = task.[行号]
AND q.[订单类型] = task.[订单类型]
) AS checked_qty
WHERE sap.[到货草稿] > 0
AND task.[订单类型] = N'20'
AND task.[订单编号] = sap.[到货草稿]
AND ISNULL(task.[入库数量], 0) > 0
)
AND NOT EXISTS (
SELECT 1
FROM [dbo].[质量检验_质检任务_SAP] AS task
OUTER APPLY (
SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[检测类型编号] = 5
AND q.[计划号] = task.[订单编号]
AND q.[行号] = task.[行号]
AND q.[订单类型] = task.[订单类型]
) AS checked_qty
WHERE sap.[到货草稿] > 0
AND task.[订单类型] = N'20'
AND task.[订单编号] = sap.[到货草稿]
AND (
ISNULL(task.[入库数量], 0) <= 0
OR ISNULL(checked_qty.[已检验数量], 0) < ISNULL(task.[入库数量], 0)
)
) THEN N'已完成'
ELSE N'未完成'
END AS [质检状态]
) AS purchase_check
WHERE
v.[订单编号] IS NOT NULL
AND (@订单号 <= 0 OR v.[订单编号] = @订单号)
AND (@计划号 = N'' OR ISNULL(v.[计划号], N'') = @计划号)
AND (@合同号 = N'' OR ISNULL(v.[合同号], N'') LIKE N'%' + @合同号 + N'%')
AND (@产品编码 = N'' OR ISNULL(v.[物料编号], N'') LIKE N'%' + @产品编码 + N'%')
AND (@产品名称 = N'' OR ISNULL(v.[物料描述], N'') LIKE N'%' + @产品名称 + N'%')
AND (@工序名称 = N'' OR EXISTS (
SELECT 1
FROM [dbo].[View_生产订单_MES] AS fp
WHERE fp.[订单编号] = v.[订单编号]
AND fp.[工序名称] = @工序名称
))
AND (@计划开始 = N'' OR v.[计划开始时间] >= TRY_CONVERT(datetime, @计划开始))
AND (@计划完成 = N'' OR v.[计划开始时间] <= TRY_CONVERT(datetime, @计划完成))
AND (@排产状态 = N'全部' OR @排产状态 = N'' OR
(@排产状态 = N'已完成' AND ISNULL(v.[排产状态], 0) = 1) OR
(@排产状态 = N'未完成' AND ISNULL(v.[排产状态], 0) = 0)
)
AND (@指派对象 = N'全部' OR @指派对象 = N'' OR EXISTS (
SELECT 1
FROM [dbo].[View_生产订单_MES] AS ap
WHERE ap.[订单编号] = v.[订单编号]
AND ap.[指派对象] IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@指派对象, N','))
))
AND (@发货状态 = N'全部' OR @发货状态 = N'' OR
(@发货状态 = N'已发货' AND ISNULL(v.[发货状态], N'0') = N'1') OR
(@发货状态 = N'未发货' AND ISNULL(v.[发货状态], N'0') <> N'1')
)
AND (@齐套 = N'全部' OR @齐套 = N'' OR
(@齐套 = N'是' AND ISNULL(v.[齐套], 0) = 1) OR
(@齐套 = N'否' AND ISNULL(v.[齐套], 0) <> 1)
)
AND (@发料状态 = N'全部' OR @发料状态 = N'' OR
(@发料状态 = N'发料齐套' AND ISNULL(v.[发料状态], N'0') = N'1') OR
(@发料状态 = N'发料缺件' AND ISNULL(v.[发料状态], N'0') = N'2') OR
(@发料状态 = N'未发料' AND ISNULL(v.[发料状态], N'0') NOT IN (N'1', N'2'))
)
AND (@自制件属性 = N'全部' OR @自制件属性 = N'' OR
(@自制件属性 = N'机加' AND (sap.[属性] = N'机加件' OR v.[自制件属性] = N'机加件')) OR
(@自制件属性 = N'装配' AND (sap.[属性] LIKE N'%装配%' OR v.[自制件属性] LIKE N'%装配%'))
)
AND (@检验状态 = N'' OR (sap.[属性] = N'' AND ISNULL(purchase_check.[质检状态], N'') = @检验状态))
)
SELECT TOP (1000)
[计划号],
[合同号],
[订单号],
[产品编码],
[产品名称],
[计划数量订单],
[入库数量],
[要求完工日期],
[要求发货日期],
[发货状态],
[齐套],
[拣配状态],
[发料状态],
[装配开工],
[完成数量],
[终检],
[生产工艺],
[排产状态],
[自制件属性],
[预计齐套时间],
[缺件物料编码],
[缺件物料名称],
[缺件数量],
[库存数量],
[缺件属性],
[缺件生产订单号],
[进度],
[工艺路线],
[预计完成时间],
[工艺路线明细],
[采购未清数量],
[到货草稿],
[质检状态],
[SAP单据],
[SAP行号]
FROM (
SELECT
查询结果.*,
ROW_NUMBER() OVER (
PARTITION BY
[订单号],
CASE
WHEN ISNULL([缺件生产订单号], N'') <> N'' THEN [缺件生产订单号]
ELSE [缺件物料编码] + N':' + CONVERT(nvarchar(30), [SAP行号])
END
ORDER BY [缺件数量] DESC, [SAP单据], [SAP行号]
) AS rn
FROM 查询结果
) AS dedup
WHERE rn = 1
ORDER BY
[预计齐套时间],
[订单号],
[缺件生产订单号],
[缺件物料编码];
END
GO

View File

@@ -0,0 +1,418 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询', N'P') IS NULL
BEGIN
EXEC(N'CREATE PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] AS BEGIN SET NOCOUNT ON; END');
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询]
@订单号 int = 0,
@物料类型 nvarchar(50) = N'',
@合同号 nvarchar(50) = N'',
@产品编码 nvarchar(50) = N'',
@产品名称 nvarchar(50) = N'',
@工序名称 nvarchar(50) = N'',
@计划开始 nvarchar(50) = N'',
@计划完成 nvarchar(50) = N'',
@排产状态 nvarchar(50) = N'全部',
@指派对象 nvarchar(50) = N'全部',
@计划号 nvarchar(50) = N'',
@发货状态 nvarchar(50) = N'全部',
@齐套 nvarchar(50) = N'全部',
@检验状态 nvarchar(50) = N'',
@发料状态 nvarchar(50) = N'全部',
@自制件属性 nvarchar(50) = N'全部'
AS
BEGIN
SET NOCOUNT ON;
;WITH SAP缺件源 AS (
SELECT
s.DocEntry,
s.Project COLLATE DATABASE_DEFAULT AS Project,
s.[行号],
s.ItemCode COLLATE DATABASE_DEFAULT AS ItemCode,
s.U_Name COLLATE DATABASE_DEFAULT AS U_Name,
ISNULL(s.[属性] COLLATE DATABASE_DEFAULT, N'') AS 属性,
ISNULL(s.[未发货数量], 0) AS 未发货数量,
ISNULL(s.[库存量], 0) AS 库存数量,
ISNULL(s.[在制采购], 0) AS 在制采购,
ISNULL(s.DocNum, 0) AS DocNum,
s.[采购员] COLLATE DATABASE_DEFAULT AS 采购员,
s.[采购预计交货日期],
ISNULL(s.[采购未清数量], 0) AS 采购未清数量,
ISNULL(s.[到货草稿], 0) AS 到货草稿
FROM [SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc] AS s
WHERE ISNULL(s.[未发货数量], 0) > 0
),
SAP缺件 AS (
SELECT TOP (2000)
src.*
FROM (
SELECT
SAP缺件源.*,
ROW_NUMBER() OVER (
PARTITION BY
SAP缺件源.DocEntry,
SAP缺件源.Project,
SAP缺件源.ItemCode,
SAP缺件源.属性
ORDER BY
SAP缺件源.[未发货数量] DESC,
SAP缺件源.[行号]
) AS rn
FROM SAP缺件源
) AS src
WHERE src.rn = 1
),
查询结果 AS (
SELECT
ISNULL(v.[计划号], N'') AS [计划号],
ISNULL(v.[合同号], N'') AS [合同号],
v.[订单编号] AS [订单号],
v.[物料编号] AS [产品编码],
v.[物料描述] AS [产品名称],
v.[计划数量订单],
v.[入库数量],
v.[计划完成] AS [要求完工日期],
v.[要求发货日期],
CASE
WHEN ISNULL(v.[发货状态], 0) = 1 THEN N'已发货'
ELSE N'未发货'
END AS [发货状态],
CASE
WHEN ISNULL(v.[齐套], 0) = 1 THEN N'是'
ELSE N'否'
END AS [齐套],
CASE
WHEN ISNULL(v.[拣配状态], 0) = 1 THEN N'已拣配'
ELSE N'未拣配'
END AS [拣配状态],
CASE
WHEN ISNULL(v.[发料状态], N'') = N'1' THEN N'发料齐套'
WHEN ISNULL(v.[发料状态], N'') = N'2' THEN N'发料缺件'
ELSE N'未发料'
END AS [发料状态],
CASE
WHEN ISNULL(v.[任务状态], 0) IN (2, 4) OR v.[开工时间] > '1900-01-01' THEN N'已开工'
ELSE N'待执行'
END AS [装配开工],
v.[完成数量],
CASE
WHEN final_check.[计划号] IS NOT NULL THEN N'是'
ELSE N'否'
END AS [终检],
CASE WHEN ISNULL(v.[生产工艺], 0) = 1 THEN N'是' ELSE N'否' END AS [生产工艺],
CASE WHEN ISNULL(v.[排产状态], 0) = 1 THEN N'已排产' ELSE N'未排产' END AS [排产状态],
ISNULL(v.[自制件属性], N'') AS [自制件属性],
v.[计划开始时间] AS [预计齐套时间],
sap.ItemCode AS [缺件物料编码],
sap.U_Name AS [缺件物料名称],
sap.[未发货数量] AS [缺件数量],
sap.[库存数量] AS [库存数量],
CASE WHEN sap.[属性] = N'' THEN N'外购' ELSE sap.[属性] END AS [缺件属性],
CASE
WHEN sap.[属性] = N'' THEN ISNULL(CONVERT(nvarchar(50), NULLIF(sap.[在制采购], 0)), N'')
ELSE ISNULL(CONVERT(nvarchar(50), detail_order.[订单编号]), N'')
END AS [缺件生产订单号],
CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(current_step.[当前序], N'') END AS [进度],
CASE
WHEN sap.[属性] = N'' THEN
N'采购员:' + ISNULL(NULLIF(sap.[采购员], N''), N'-') +
N' / 未清数量:' + CONVERT(nvarchar(30), sap.[采购未清数量]) +
N' / 到货草稿:' + CONVERT(nvarchar(30), sap.[到货草稿]) +
N' / 质检状态:' + ISNULL(purchase_check.[质检状态], N'未完成')
ELSE ISNULL(route.[工艺路线], N'')
END AS [工艺路线],
CASE
WHEN sap.[属性] = N'' THEN sap.[采购预计交货日期]
ELSE route.[预计完成时间]
END AS [预计完成时间],
CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(route.[工艺路线明细], N'[]') END AS [工艺路线明细],
sap.[采购未清数量],
sap.[到货草稿],
ISNULL(purchase_check.[质检状态], CASE WHEN sap.[属性] = N'' THEN N'未完成' ELSE N'' END) AS [质检状态],
sap.DocEntry AS [SAP单据],
sap.[行号] AS [SAP行号]
FROM SAP缺件 AS sap
OUTER APPLY (
SELECT TOP (1) m.*
FROM [dbo].[View_生产订单_MES] AS m
WHERE m.[物料类型] = N'pit_Resource'
AND ISNULL(m.[排产状态], 0) = 1
AND m.[订单编号] = sap.DocEntry
ORDER BY m.[订单行号]
) AS v
OUTER APPLY (
SELECT TOP (1) m.*
FROM [dbo].[View_生产订单_MES] AS m
WHERE m.[物料类型] = N'pit_Resource'
AND ISNULL(m.[排产状态], 0) = 1
AND m.[订单编号] <> v.[订单编号]
AND (
(sap.[属性] = N'机加件' AND (
(sap.DocNum > 0 AND m.[订单编号] = sap.DocNum)
OR (sap.DocNum <= 0 AND m.[物料编号] = sap.ItemCode)
))
OR (sap.[属性] LIKE N'%装配%' AND m.[物料编号] = sap.ItemCode AND ISNULL(m.[合同号], N'') = ISNULL(sap.Project, N''))
)
ORDER BY
CASE WHEN sap.DocNum > 0 AND m.[订单编号] = sap.DocNum THEN 0 ELSE 1 END,
m.[订单编号] DESC,
m.[订单行号]
) AS detail_order
OUTER APPLY (
SELECT TOP (1) q.[计划号]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[质检类型] = N'终检'
AND q.[计划号] = v.[订单编号]
) AS final_check
OUTER APPLY (
SELECT
MAX(p.[计划完成时间]) AS [预计完成时间],
STUFF((
SELECT N'、' + p2.[工序名称] +
CASE WHEN ISNULL(p2.[指派对象], N'') = N'' THEN N'' ELSE N'(' + p2.[指派对象] + N')' END
FROM [dbo].[View_生产订单_MES] AS p2
WHERE p2.[订单编号] = detail_order.[订单编号]
AND p2.[物料类型] = N'pit_Resource'
ORDER BY p2.[订单行号]
FOR XML PATH(N''), TYPE
).value(N'.', N'nvarchar(max)'), 1, 1, N'') AS [工艺路线],
(
SELECT
p2.[订单行号],
p2.[工序名称],
p2.[指派对象],
p2.[计划开始时间],
p2.[计划完成时间],
ISNULL(p2.[进度], 0) AS [进度],
ISNULL(p2.[完成数量], 0) AS [完成数量],
ISNULL(p2.[收料数量], 0) AS [收料数量],
ISNULL(p2.[加工状态], 0) AS [加工状态],
p2.[开工时间],
ISNULL(check_qty.[收检合格数], 0) AS [收检合格数],
ISNULL(check_qty.[收检不合格数], 0) AS [收检不合格数]
FROM [dbo].[View_生产订单_MES] AS p2
OUTER APPLY (
SELECT
SUM(ISNULL(q.[合格数], 0)) AS [收检合格数],
SUM(ISNULL(q.[不合格数], 0)) AS [收检不合格数]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[TaskAID] = p2.[TaskAID]
AND q.[质检类型] = N'收检'
) AS check_qty
WHERE p2.[订单编号] = detail_order.[订单编号]
AND p2.[物料类型] = N'pit_Resource'
ORDER BY p2.[订单行号]
FOR JSON PATH
) AS [工艺路线明细]
FROM [dbo].[View_生产订单_MES] AS p
WHERE p.[订单编号] = detail_order.[订单编号]
AND p.[物料类型] = N'pit_Resource'
) AS route
OUTER APPLY (
SELECT TOP (1)
pending.[订单行号],
pending.[工序名称],
pending.[加工状态],
pending.[进度],
pending.[完成数量],
pending.[计划数量],
pending.[开工时间]
FROM [dbo].[View_生产订单_MES] AS pending
WHERE pending.[订单编号] = detail_order.[订单编号]
AND pending.[物料类型] = N'pit_Resource'
AND NOT (
ISNULL(pending.[进度], 0) >= 100
OR (ISNULL(pending.[计划数量], 0) > 0 AND ISNULL(pending.[完成数量], 0) >= ISNULL(pending.[计划数量], 0))
)
ORDER BY pending.[订单行号]
) AS pending
OUTER APPLY (
SELECT TOP (1) prev.[工序名称]
FROM [dbo].[View_生产订单_MES] AS prev
WHERE prev.[订单编号] = detail_order.[订单编号]
AND prev.[物料类型] = N'pit_Resource'
AND prev.[订单行号] < pending.[订单行号]
ORDER BY prev.[订单行号] DESC
) AS prev_step
OUTER APPLY (
SELECT TOP (1) last_step.[工序名称]
FROM [dbo].[View_生产订单_MES] AS last_step
WHERE last_step.[订单编号] = detail_order.[订单编号]
AND last_step.[物料类型] = N'pit_Resource'
ORDER BY last_step.[订单行号] DESC
) AS last_step
OUTER APPLY (
SELECT
CASE
WHEN detail_order.[订单编号] IS NULL THEN N''
WHEN pending.[订单行号] IS NULL THEN ISNULL(last_step.[工序名称], N'') + N'毕'
WHEN ISNULL(pending.[进度], 0) > 0
OR ISNULL(pending.[完成数量], 0) > 0
OR ISNULL(pending.[加工状态], 0) IN (2, 3, 4, 5, 6)
OR pending.[开工时间] > '1900-01-01'
THEN ISNULL(pending.[工序名称], N'') + N'中'
WHEN prev_step.[工序名称] IS NULL THEN N''
ELSE prev_step.[工序名称] + N'毕待' + ISNULL(pending.[工序名称], N'')
END AS [当前序]
) AS current_step
OUTER APPLY (
SELECT
CASE
WHEN sap.[属性] <> N'' THEN N''
WHEN EXISTS (
SELECT 1
FROM [dbo].[质量检验_质检任务_SAP] AS task
OUTER APPLY (
SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[检测类型编号] = 5
AND q.[计划号] = task.[订单编号]
AND q.[行号] = task.[行号]
AND q.[订单类型] = task.[订单类型]
) AS checked_qty
WHERE sap.[到货草稿] > 0
AND task.[订单类型] = N'20'
AND task.[订单编号] = sap.[到货草稿]
AND ISNULL(task.[入库数量], 0) > 0
)
AND NOT EXISTS (
SELECT 1
FROM [dbo].[质量检验_质检任务_SAP] AS task
OUTER APPLY (
SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量]
FROM [dbo].[YL_质量检验_质检记录] AS q
WHERE q.[检测类型编号] = 5
AND q.[计划号] = task.[订单编号]
AND q.[行号] = task.[行号]
AND q.[订单类型] = task.[订单类型]
) AS checked_qty
WHERE sap.[到货草稿] > 0
AND task.[订单类型] = N'20'
AND task.[订单编号] = sap.[到货草稿]
AND (
ISNULL(task.[入库数量], 0) <= 0
OR ISNULL(checked_qty.[已检验数量], 0) < ISNULL(task.[入库数量], 0)
)
) THEN N'已完成'
ELSE N'未完成'
END AS [质检状态]
) AS purchase_check
WHERE
v.[订单编号] IS NOT NULL
AND (@订单号 <= 0 OR v.[订单编号] = @订单号)
AND (@计划号 = N'' OR ISNULL(v.[计划号], N'') = @计划号)
AND (@合同号 = N'' OR ISNULL(v.[合同号], N'') LIKE N'%' + @合同号 + N'%')
AND (@产品编码 = N'' OR ISNULL(v.[物料编号], N'') LIKE N'%' + @产品编码 + N'%')
AND (@产品名称 = N'' OR ISNULL(v.[物料描述], N'') LIKE N'%' + @产品名称 + N'%')
AND (@工序名称 = N'' OR EXISTS (
SELECT 1
FROM [dbo].[View_生产订单_MES] AS fp
WHERE fp.[订单编号] = v.[订单编号]
AND fp.[工序名称] = @工序名称
))
AND (@计划开始 = N'' OR v.[计划开始时间] >= TRY_CONVERT(datetime, @计划开始))
AND (@计划完成 = N'' OR v.[计划开始时间] <= TRY_CONVERT(datetime, @计划完成))
AND (@排产状态 = N'全部' OR @排产状态 = N'' OR
(@排产状态 = N'已完成' AND ISNULL(v.[排产状态], 0) = 1) OR
(@排产状态 = N'未完成' AND ISNULL(v.[排产状态], 0) = 0)
)
AND (@指派对象 = N'全部' OR @指派对象 = N'' OR EXISTS (
SELECT 1
FROM [dbo].[View_生产订单_MES] AS ap
WHERE ap.[订单编号] = v.[订单编号]
AND ap.[指派对象] IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@指派对象, N','))
))
AND (@发货状态 = N'全部' OR @发货状态 = N'' OR
(@发货状态 = N'已发货' AND ISNULL(v.[发货状态], N'0') = N'1') OR
(@发货状态 = N'未发货' AND ISNULL(v.[发货状态], N'0') <> N'1')
)
AND (@齐套 = N'全部' OR @齐套 = N'' OR
(@齐套 = N'是' AND ISNULL(v.[齐套], 0) = 1) OR
(@齐套 = N'否' AND ISNULL(v.[齐套], 0) <> 1)
)
AND (@发料状态 = N'全部' OR @发料状态 = N'' OR
(@发料状态 = N'发料齐套' AND ISNULL(v.[发料状态], N'0') = N'1') OR
(@发料状态 = N'发料缺件' AND ISNULL(v.[发料状态], N'0') = N'2') OR
(@发料状态 = N'未发料' AND ISNULL(v.[发料状态], N'0') NOT IN (N'1', N'2'))
)
AND (@自制件属性 = N'全部' OR @自制件属性 = N'' OR
(@自制件属性 = N'机加' AND (sap.[属性] = N'机加件' OR v.[自制件属性] = N'机加件')) OR
(@自制件属性 = N'装配' AND (sap.[属性] LIKE N'%装配%' OR v.[自制件属性] LIKE N'%装配%'))
)
AND (@检验状态 = N'' OR (sap.[属性] = N'' AND ISNULL(purchase_check.[质检状态], N'') = @检验状态))
)
SELECT TOP (1000)
[计划号],
[合同号],
[订单号],
[产品编码],
[产品名称],
[计划数量订单],
[入库数量],
[要求完工日期],
[要求发货日期],
[发货状态],
[齐套],
[拣配状态],
[发料状态],
[装配开工],
[完成数量],
[终检],
[生产工艺],
[排产状态],
[自制件属性],
[预计齐套时间],
[缺件物料编码],
[缺件物料名称],
[缺件数量],
[库存数量],
[缺件属性],
[缺件生产订单号],
[进度],
[工艺路线],
[预计完成时间],
[工艺路线明细],
[采购未清数量],
[到货草稿],
[质检状态],
[SAP单据],
[SAP行号]
FROM (
SELECT
查询结果.*,
ROW_NUMBER() OVER (
PARTITION BY
[订单号],
CASE
WHEN ISNULL([缺件生产订单号], N'') <> N'' THEN [缺件生产订单号]
ELSE [缺件物料编码] + N':' + CONVERT(nvarchar(30), [SAP行号])
END
ORDER BY [缺件数量] DESC, [SAP单据], [SAP行号]
) AS rn
FROM 查询结果
) AS dedup
WHERE rn = 1
ORDER BY
[预计齐套时间],
[订单号],
[缺件生产订单号],
[缺件物料编码];
END
GO