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

Binary file not shown.

Binary file not shown.

View File

@@ -1165,3 +1165,455 @@ pm run build通过仅有既有警告。
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md` - `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md` - `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md` - `gptlog-process/gpdlog.md`
### 验证结果
- 查询过程发布成功。
- `@订单号=2007`:一级主数据完整,外购缺件生产订单号不再等于 `2007`
- `@订单号=7321`:外购缺件按到货草稿 `11209` 显示缺件生产订单号,质检状态来自采购入库检口径。
- 默认查询统计:总行数 198产品编码/产品名称为空行数 0缺件生产订单号等于主订单号行数 0非外购质检状态非空行数 0。
- `npm run build` 通过,仅有项目既有资源体积过大和 Browserslist/caniuse-lite 过期警告。
## 2026-06-30 修正及时齐套跟踪结果库存数量、采购员和工艺路线样式
### 用户反馈
1. `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 页面二级数据需要在缺件数量后增加库存数量字段,库存数量在 SAP 里有。
2. 去掉拼接的采购员字段。
3. 工艺路线需要左对齐,当前间隔偏大。
4. 工艺路线颜色参考生产计划跟踪页面,使用红、蓝、绿,不使用橙色。
5. 所有改动按昨日方式维护 01-06 文档、README 索引、推进台账、任务矩阵、验收证据、决策记录,并追加总日志。
### 执行过程
1. 读取目标页面 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`,确认二级明细已有缺件数量、采购员列,以及本页自定义工艺路线样式。
2. 读取参考页面 `src/views/ProductionManagement/ProductionPlanTrack/index.vue`,确认生产计划跟踪的工艺路线为左对齐、紧凑间距、红/蓝/绿文字配色。
3. 修改前端页面:
- 在二级明细“缺件数量”后新增“库存数量”列。
-`mergeRows` 中新增 `库存数量: this.formatQuantity(row.库存数量)`
- 删除二级明细“采购员”列和 `采购员` 映射。
- 工艺路线名称只显示工序名称,不再拼接指派对象。
- 删除橙色状态判断和橙色样式。
- 调整 `.process-route` 相关样式为左对齐、缩小箭头和单元格间距、红/蓝/绿三色。
4. 连接数据库 `192.168.2.92 / YL_MESDB`,读取 SAP 视图字段列表,确认 `[SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc]` 包含 `库存量` 字段。
5. 新增数据库增量脚本 `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`,不覆盖 20260629 历史脚本。
6. 修改增量脚本:
-`SAP缺件源` 中增加 `ISNULL(s.[库存量], 0) AS 库存数量`
- 在查询结果中输出 `sap.[库存数量] AS [库存数量]`
- 最终 SELECT 输出 `[库存数量]`
- 删除 `sap.[采购员]` 输出。
- 外购采购状态文本从 `采购员 + 未清数量 + 到货草稿 + 质检状态` 改为 `未清数量 + 到货草稿 + 质检状态`
7. 执行 `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql` 发布过程,发布成功。
8. 验证 `@订单号=2007`,返回缺件 `24112-011-HY-WF50L`,缺件数量 `78`,库存数量 `27`,结果列不再包含采购员。
9. 验证 `@订单号=7321`,返回缺件 `XX-YG01013990`,缺件数量 `6`,库存数量 `2`,外购采购状态不再包含采购员。
10. 执行过程定义检查,结果为“有库存数量 / 未拼接采购员”。
11. 曾尝试用 `OPENQUERY([LOCALSERVER], ...)` 做辅助落表验证,但数据库未配置 `LOCALSERVER` linked server该无效命令不作为验收证据已用过程样例和定义检查替代。
12. 执行 `npm run build`,构建通过,仅有项目既有资源体积过大和 Browserslist/caniuse-lite 过期警告。
13. 更新 README、01-06 文档、推进台账、任务矩阵、验收证据、决策记录,并追加本日志。
### 修改文件
- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`
- `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`
- `work/PlanManagement/TimelyKitTrackingResult/README.md`
- `work/PlanManagement/TimelyKitTrackingResult/01-项目功能内容.md`
- `work/PlanManagement/TimelyKitTrackingResult/02-项目程序开发详细步骤.md`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- SAP 视图字段确认:`VIEW_Jijiankukc` 包含 `库存量`
- SAP 视图取样:`DocEntry=2007``ItemCode=24112-011-HY-WF50L``未发货数量=78``库存量=27`
- 查询过程发布成功。
- `@订单号=2007` 返回 `库存数量=27`
- `@订单号=7321` 返回 `库存数量=2`
- 过程定义检查:有 `库存数量`,未拼接 `采购员:`
- `npm run build` 通过,仅有项目既有 warning。
### 下一步
- 登录系统人工验收“及时齐套跟踪结果”展开行,确认库存数量位置、外购采购状态文本、工艺路线左对齐和红/蓝/绿颜色符合现场预期。
## 2026-06-30 修正及时齐套跟踪结果 7134 工艺路线判色
### 用户反馈
- 当前页二级数据 `7134` 的工艺路线颜色仍有问题:当前页显示一个蓝色两个红色,生产计划跟踪显示两个蓝色一个红色。
### 执行过程
1. 对比当前页 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 和生产计划跟踪 `src/views/ProductionManagement/ProductionPlanTrack/index.vue` 的工艺路线判色函数。
2. 查询数据库确认 `7134` 工艺数据:
- 打磨:加工状态 `6`,收检合格数 `6`
- 打压检测:加工状态为空,收检合格数 `6`
- 喷塑:外协,收检合格数 `0`
3. 确认差异原因:当前页旧逻辑按进度、计划数量、完成数量或收检数量达到计划数量判蓝;生产计划跟踪按加工状态 `6/3``收检合格数 > 0` 判蓝。
4. 修改当前页判色逻辑:
- 新增 `isBlueProcess`,与生产计划跟踪一致。
- 新增 `isGreenProcess`,与生产计划跟踪外协绿色口径一致。
- 新增 `getProcessBaseClass``getOutsourceGroupClassState`,复用生产计划跟踪的外协连续分组判色口径。
- `formatProcessRoute` 改为基于 `outsourceGroupClasses` 获取颜色。
5. 本地模拟 `7134` 判色结果:`step1:process-route-blue,step2:process-route-blue,step3:process-route-red`
6. 执行 `npm run build`,构建通过,仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。
7. 更新推进台账、任务矩阵、验收证据、决策记录和总日志。
### 修改文件
- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- SQL 验证 `7134` 的第二道工序“打压检测”有 `收检合格数=6`
- 本地判色模拟结果为两个蓝色、一个红色。
- 当前页无 `process-route-orange`
- `npm run build` 通过,仅有项目既有 warning。
### 下一步
- 登录页面展开 `7134`,确认当前页工艺路线颜色与生产计划跟踪一致。
## 2026-06-30 恢复外购采购状态采购员拼接
### 用户反馈
- 还原字段拼接采购员部分。
- 不要单独的采购员列。
### 执行过程
1. 确认前端 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 当前没有单独采购员列。
2. 修改最新过程脚本 `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql`
-`SAP缺件源` 中重新读取 `s.[采购员] COLLATE DATABASE_DEFAULT AS 采购员`
- 外购 `工艺路线/采购状态` 文本改为 `采购员:xxx / 未清数量:xxx / 到货草稿:xxx / 质检状态:xxx`
- 不在最终 SELECT 中输出单独 `采购员` 字段。
3. 发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。
4. 查询 `@订单号=7321` 验证:
- 缺件生产订单号为 `4111`,来自 SAP `在制采购`
- 工艺路线/采购状态为 `采购员:张丹 / 未清数量:50 / 到货草稿:11209 / 质检状态:未完成`
- 预计完成时间为 `2026-06-25`,来自 SAP `采购预计交货日期`
5. 使用 `sys.dm_exec_describe_first_result_set_for_object` 检查结果集列,确认没有单独 `采购员` 列。
6. 使用 `Select-String` 检查前端页面,确认没有 `label="采购员"``prop="采购员"`
7. 执行 `npm run build`,构建通过,仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。
8. 更新推进台账、任务矩阵、验收证据、决策记录和总日志。
### 修改文件
- `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- 查询过程发布成功。
- `@订单号=7321` 外购采购状态已包含 `采购员:张丹`
- 结果集无单独 `采购员` 列。
- 前端无单独采购员列。
- `npm run build` 通过,仅有项目既有 warning。
### 下一步
- 登录页面确认外购采购状态文本显示采购员,且二级表没有单独采购员列。
## 2026-06-30 自制缺件显示所有匹配生产订单
### 用户反馈
- 同一个生产订单号不要出现重复。
- 同一缺件物料所有匹配生产订单都显示。
### 执行过程
1. 排查 `@订单号=4222` 当前结果,确认旧过程只返回二级生产订单 `5960``7142` 中的一条。
2. 查询 SAP 缺件视图,确认 `4222` 的缺件物料为 `22-103-060-YDZF-20V1.0-4.1``DocNum=5960`
3. 查询 MES 生产订单,确认同一缺件物料同时存在 `5960``7142` 两个生产订单。
4. 定位旧逻辑问题:`detail_order` 使用 `SELECT TOP (1)`,天然只能显示一个匹配生产订单。
5. 新增脚本 `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`
6. 修改 `detail_order`
- 去掉自制件匹配的 `TOP (1)` 单行限制。
- 使用 `ROW_NUMBER() OVER (PARTITION BY m.[订单编号] ORDER BY m.[订单行号])`,确保同一生产订单号只保留一条代表行。
- 同一缺件物料匹配到的多个不同生产订单全部返回。
7. 发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。
8. 验证 `@订单号=4222` 返回两条二级数据:`5960``7142`,且同一生产订单号不重复。
9. 更新 README、推进台账、任务矩阵、验收证据、决策记录和总日志。
### 修改文件
- `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`
- `work/PlanManagement/TimelyKitTrackingResult/README.md`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- 查询过程发布成功。
- `@订单号=4222` 二级数据返回 `5960``7142`
- 同一生产订单号没有重复。
- `5960` 显示 13 道工艺路线,`7142` 显示 4 道工艺路线。
### 下一步
- 登录页面展开 `4222`,确认二级数据同时显示所有匹配生产订单且不重复。
## 2026-06-30 11:47:54 复核同缺件物料多生产订单显示
### 复核内容
- 按用户最新口径确认:同一个生产订单号不要出现重复,同一缺件物料所有匹配生产订单都显示。
### 验证结果
- 执行 `EXEC dbo.[生产管理_及时齐套跟踪结果_查询] @订单号 = 4222`
- 二级数据中缺件物料 `22-103-060-YDZF-20V1.0-4.1` 当前同时返回生产订单 `5960``7142`
- 同一生产订单号未重复出现。
## 2026-06-30 生产订单关闭无工时可关闭处理
### 用户反馈
- `dbo.计划排产_生产订单关闭_查询全部订单` 的“可关闭”查询以工时为基准。
- 当前只能查出全部校验的工时再筛选。
- 特殊情况:没有工时记录,但满足其他条件的订单也需要进入可关闭处理。
### 执行过程
1. 读取线上过程定义,确认“可关闭”分支以 `dbo.View_生产工时视图` 为主表。
2. 核对页面 `src/views/PlanManagement/PlannOrderClose/index.vue`,确认默认查询为“可关闭 + 机加”。
3. 核对 `MES_接口_生产计划``View_生产工时视图` 字段,确认可从生产计划补充无工时订单。
4. 查询样例,确认 `7410` 无工时,但计划数量、入库数量、终检合格数均为 `1`,单据状态为空,属性为机加件。
5. 新增脚本 `db_backups/update_plan_order_close_no_work_hours_20260630.sql`
6. 将“可关闭”分支调整为有工时订单和无工时满足条件订单合并:
- 有工时订单继续要求全部工时校验。
- 无工时订单免工时校验,但保留原可关闭条件。
7. 初版全量查询超时后,改为先写入 `#工时订单` 临时表,再判断无工时,避免重复展开复杂视图。
8. 发布存储过程成功。
9. 验证 `@订单号=7410, @单据状态=可关闭, @属性=机加` 可返回。
10. 验证默认“可关闭 + 机加”查询约 `0.56` 秒返回,并命中 `7280``7409``7410`
### 修改文件
- `db_backups/update_plan_order_close_no_work_hours_20260630.sql`
- `work/PlanManagement/PlannOrderClose/README.md`
- `work/PlanManagement/PlannOrderClose/01-项目功能内容.md`
- `work/PlanManagement/PlannOrderClose/02-项目程序开发详细步骤.md`
- `work/PlanManagement/PlannOrderClose/03-推进台账.md`
- `work/PlanManagement/PlannOrderClose/04-任务矩阵.md`
- `work/PlanManagement/PlannOrderClose/05-验收证据.md`
- `work/PlanManagement/PlannOrderClose/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- 数据库过程发布成功。
- 无工时订单 `7410` 可进入可关闭结果。
- 默认“可关闭 + 机加”查询未超时,约 `0.56` 秒返回。
## 2026-06-30 新增产品合格率(工位)页面
### 用户反馈
- 查看 `doc/新增产品合格率.docx`
- 根据文档新增页面 `产品合格率(工位)`
### 执行过程
1. 解包并读取 `doc/新增产品合格率.docx`,确认页面放在生产管理下。
2. 读取文档截图和文字,确认一级字段为关闭日期、生产订单号、物料名称、物料编码、计划数量、完成数量、不良数量、合格率。
3. 确认二级字段为工序、工序号、工位、完工数量、不良数量、合格率、检验说明。
4. 查询 `dbo.YL_质量检验_质检记录` 字段,确认生产订单号为 `计划号`,订单行号为 `行号`,工位字段为 `工位名称`
5. 查询 SAP 视图 `SBO_YL.dbo.UBT_OWOR`,确认关闭日期字段为 `实际结算日期`,已关闭口径为 `单据状态 IS NOT NULL`
6. 新增查询脚本 `db_backups/create_product_pass_rate_workstation_20260630.sql`
7. 初版四段名跨库查询较慢,改为 `OPENQUERY([SAP], ...)` 将 SAP 已关闭订单先取到本地临时表。
8. 新增菜单脚本 `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`,写入生产管理下 `产品合格率(工位)` 菜单。
9. 新增前端页面 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`,实现查询区、主表、展开二级明细和合格率颜色。
10. 发布查询过程和菜单脚本。
11. 验证样例 `@生产订单号=7649` 返回一级汇总和二级明细。
12. 执行 `npm run build`,构建通过。
### 修改文件
- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`
- `work/ProductionManagement/ProductPassRateWorkstation/README.md`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- 查询过程 `dbo.生产管理_产品合格率工位_查询` 发布成功,修改时间 `2026-06-30 14:31:00.690`
- 菜单写入 `12` 条角色记录ID 范围 `236-247`
- 近 7 天查询返回 `175` 行,耗时约 `0.37` 秒。
- 空条件查询自动限定近 30 天,返回 `1420` 行,耗时约 `1.17` 秒。
- `npm run build` 通过,仅有项目既有 warning。
## 2026-06-30 产品合格率(工位)默认不查询和合格状态筛选
### 用户反馈
- 默认进来不查询数据。
- 增加合格和不合格筛选。
- 主数据合格率小于 `100` 的为不合格。
- 默认不合格。
### 执行过程
1. 修改 `db_backups/create_product_pass_rate_workstation_20260630.sql`,新增 `@合格状态` 参数。
2. 查询结果按主数据合格率过滤:`合格` 为大于等于 `100``不合格` 为小于 `100``全部` 不过滤。
3. 修改 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`,删除页面创建时自动查询。
4. 查询区新增“合格状态”下拉,默认值为 `不合格`
5. 查询时向过程传入 `合格状态`
6. 发布查询过程成功。
7. 验证近 30 天筛选结果:不合格 `50` 行,合格 `1370` 行,全部 `1420` 行。
8. 执行 `npm run build`,构建通过。
### 修改文件
- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `work/ProductionManagement/ProductPassRateWorkstation/README.md`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- 页面进入不再自动查询。
- 合格状态默认 `不合格`
- 不合格筛选最高合格率为 `99.99`,符合小于 `100` 的判定。
- `npm run build` 通过,仅有项目既有 warning。
## 2026-06-30 产品合格率(工位)关闭日期拆分
### 用户反馈
- 关闭日期筛选拆成两个筛选。
- 客户不习惯一次选两个日期。
### 执行过程
1. 修改 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
2. 将原 `daterange` 日期范围选择器拆成两个独立 `date` 日期选择器。
3. 前端字段改为 `searchForm.closeDateStart``searchForm.closeDateEnd`
4. 查询参数仍然使用 `关闭日期_Start``关闭日期_End`,数据库过程无需修改。
5. 执行 `npm run build`,构建通过。
6. 更新产品合格率 README/01-05 文档和总日志。
### 修改文件
- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- `npm run build` 通过,仅有项目既有 warning。
- 数据库过程无需重新发布。
## 2026-06-30 产品合格率(工位)修正工序号来源
### 用户反馈
- 工序号为什么都是空。
- 工序号应取 `dbo.MES_接口_生产计划_生产任务.订单行号`
- 该表中订单行号肯定不会为空。
### 执行过程
1. 查询 `dbo.MES_接口_生产计划_生产任务` 字段,确认存在 `AID``订单编号``订单行号``工序名称``指派对象`
2. 查询样例数据,确认 `订单行号` 在生产任务表中有值。
3. 定位原脚本中工序号来源为 `COALESCE(View_生产订单_MES.订单行号, 质检记录.行号)`
4. 确认质检记录的 `TaskAID` 对应生产任务表的 `AID`
5. 修改 `db_backups/create_product_pass_rate_workstation_20260630.sql`
- 明细关联表改为 `dbo.MES_接口_生产计划_生产任务`
- 关联条件改为 `q.TaskAID = t.AID`
- 工序号改为 `COALESCE(t.订单行号, q.行号)`
- 工序和工位补值也改为优先使用生产任务表的 `工序名称``指派对象`
6. 发布 `dbo.生产管理_产品合格率工位_查询` 成功。
7. 验证 `7649` 二级明细工序号为 `1``2``3`
8. 验证近 30 天 `3281` 条二级明细中空工序号为 `0`
### 修改文件
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- 查询过程修改时间:`2026-06-30 15:12:24.840`
- `7649` 返回:领料 1、数车 2、打磨 3。
- 近 30 天明细行数 `3281`,空工序号行数 `0`
## 2026-06-30 AGV执行中任务改为已完成
### 用户反馈
- 处理页面 `ProductionManagement/AGVtask/index` 里面任务状态为执行中的数据。
- 所有执行中任务都改为已完成。
### 执行过程
1. 读取页面 `src/views/ProductionManagement/AGVtask/index.vue`,确认页面中 `RUNNING` 显示为执行中,`FINISHED` 显示为已完成。
2. 查询数据库对象,确认实时数据来自 `dbo.AGV_实时数据`,历史完成数据写入 `dbo.AGV_历史数据`
3. 处理前统计实时表状态:`PENDING 1``RUNNING 35`
4. 按完成任务口径处理 `RUNNING` 数据:插入历史表时 `TaskStatus` 写为 `FINISHED`,并设置 `EndTime``Duration`,随后从实时表删除这些执行中任务。
5. 处理完成后,调用页面实时查询过程验证 `RUNNING` 无数据。
6. 验证实时表仅剩 `PENDING 1`,最近 5 分钟历史表新增 `FINISHED 35`
7. 新增 AGVtask README 和 01-06 文档,记录功能内容、执行步骤、推进台账、任务矩阵、验收证据和决策记录。
### 修改文件
- `work/ProductionManagement/AGVtask/README.md`
- `work/ProductionManagement/AGVtask/01-项目功能内容.md`
- `work/ProductionManagement/AGVtask/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/AGVtask/03-推进台账.md`
- `work/ProductionManagement/AGVtask/04-任务矩阵.md`
- `work/ProductionManagement/AGVtask/05-验收证据.md`
- `work/ProductionManagement/AGVtask/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证结果
- 已转历史数量:`35`
- 页面实时查询过程按 `RUNNING` 查询返回空结果。
- 实时表剩余状态:`PENDING 1`
- 历史表最近 5 分钟状态:`FINISHED 35`
## 2026-06-30 设计报工任务模块方案文档修订
### 用户反馈
- 读取 `doc/设计报工任务模块.docx`,梳理方案。
- 项目号具体取哪个 SAP 视图字段后续提供。
- 完成要求已有结束时间,未结束不能完成。
- 删除任务时,如果已经有报工记录,不能删除。
- 不参与之前任何生产/SAP/工时报表流程,整体独立。
- 修改文档。
### 执行过程
1. 解析 `doc/设计报工任务模块.docx` 正文,确认原始需求包含设计任务、设计报工、设计工时校验、设计工时报表四个页面。
2. 对照参考页面:
- `ProcessManagement/PartDrawlook/index.vue`
- `PlanManagement/SelfMakePlando/index.vue`
- `ProductionManagement/WorkHoursCheck/index.vue`
- `ProductionManagement/Workhours/index.vue`
3. 新增 `work/ProductionManagement/DesignReportTask/` 文档目录。
4. 写入 README 和 01-06 文档,记录功能内容、开发步骤、推进台账、任务矩阵、验收证据和决策记录。
5. 将 Word 文档正文整理为确认版方案。
6. 解析更新后的 Word 文档,验证关键口径已写入。
### 修改文件
- `doc/设计报工任务模块.docx`
- `work/ProductionManagement/DesignReportTask/README.md`
- `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`
- `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/DesignReportTask/03-推进台账.md`
- `work/ProductionManagement/DesignReportTask/04-任务矩阵.md`
- `work/ProductionManagement/DesignReportTask/05-验收证据.md`
- `work/ProductionManagement/DesignReportTask/06-决策记录.md`

View File

@@ -79,6 +79,7 @@
<el-table-column align="center" label="物料编码" prop="缺件物料编码" min-width="180" show-overflow-tooltip /> <el-table-column align="center" label="物料编码" prop="缺件物料编码" min-width="180" show-overflow-tooltip />
<el-table-column align="center" label="物料名称" prop="缺件物料名称" width="150" show-overflow-tooltip /> <el-table-column align="center" label="物料名称" prop="缺件物料名称" width="150" show-overflow-tooltip />
<el-table-column align="center" label="缺件数量" prop="缺件数量" width="90" /> <el-table-column align="center" label="缺件数量" prop="缺件数量" width="90" />
<el-table-column align="center" label="库存数量" prop="库存数量" width="90" />
<el-table-column align="center" label="属性" prop="缺件属性" width="90" /> <el-table-column align="center" label="属性" prop="缺件属性" width="90" />
<el-table-column align="center" label="生产订单号" prop="缺件生产订单号" width="100" /> <el-table-column align="center" label="生产订单号" prop="缺件生产订单号" width="100" />
<el-table-column align="center" label="进度" prop="进度" width="130" show-overflow-tooltip /> <el-table-column align="center" label="进度" prop="进度" width="130" show-overflow-tooltip />
@@ -93,7 +94,6 @@
<el-table-column align="center" label="预计完成时间" width="130"> <el-table-column align="center" label="预计完成时间" width="130">
<template slot-scope="detail">{{ formatDate(detail.row.预计完成时间) }}</template> <template slot-scope="detail">{{ formatDate(detail.row.预计完成时间) }}</template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="采购员" prop="采购员" width="90" show-overflow-tooltip />
<el-table-column align="center" label="采购未清数量" prop="采购未清数量" width="110" /> <el-table-column align="center" label="采购未清数量" prop="采购未清数量" width="110" />
<el-table-column align="center" label="到货草稿" prop="到货草稿" width="90" /> <el-table-column align="center" label="到货草稿" prop="到货草稿" width="90" />
<el-table-column align="center" label="质检状态" width="90"> <el-table-column align="center" label="质检状态" width="90">
@@ -269,13 +269,13 @@ export default {
缺件物料编码: row.缺件物料编码, 缺件物料编码: row.缺件物料编码,
缺件物料名称: row.缺件物料名称, 缺件物料名称: row.缺件物料名称,
缺件数量: this.formatQuantity(row.缺件数量), 缺件数量: this.formatQuantity(row.缺件数量),
库存数量: this.formatQuantity(row.库存数量),
缺件属性: row.缺件属性, 缺件属性: row.缺件属性,
缺件生产订单号: row.缺件生产订单号, 缺件生产订单号: row.缺件生产订单号,
进度: row.进度, 进度: row.进度,
工艺路线: row.工艺路线, 工艺路线: row.工艺路线,
工艺路线明细: this.parseRouteDetails(row.工艺路线明细), 工艺路线明细: this.parseRouteDetails(row.工艺路线明细),
预计完成时间: row.预计完成时间, 预计完成时间: row.预计完成时间,
采购员: row.采购员,
采购未清数量: this.formatQuantity(row.采购未清数量), 采购未清数量: this.formatQuantity(row.采购未清数量),
到货草稿: row.到货草稿, 到货草稿: row.到货草稿,
质检状态: row.质检状态, 质检状态: row.质检状态,
@@ -315,39 +315,88 @@ export default {
辅助结束: 3, 辅助结束: 3,
开始加工: 4, 开始加工: 4,
暂停: 5, 暂停: 5,
报工: 6 报工: 6,
装配加工: 4
} }
return statusMap[value] || 0 return statusMap[value] || 0
}, },
isProcessComplete(process) { isOutsourceProcess(process) {
const progress = this.toProcessNumber(process.进度) return process.指派对象 === '外协' ||
const planCount = this.toProcessNumber(process.计划数量) String(process.工序名称 || '').includes('(外协)') ||
const finishCount = this.toProcessNumber(process.完成数量) String(process.工序名称 || '').includes('(外协)')
const checkedCount = this.toProcessNumber(process.收检合格数) + this.toProcessNumber(process.收检不合格数)
return progress >= 100 ||
(planCount > 0 && finishCount >= planCount) ||
(planCount > 0 && checkedCount >= planCount)
}, },
getProcessClass(process, index, processes) { isBlueProcess(process) {
if (this.isProcessComplete(process)) {
return 'process-route-blue'
}
const statusNum = this.getProcessStatusNum(process.加工状态) const statusNum = this.getProcessStatusNum(process.加工状态)
if (this.isValidProcessDate(process.开工时间) || [2, 4].includes(statusNum) || this.toProcessNumber(process.进度) > 0) { const countNum = parseInt(process.收检合格数)
return statusNum === 6 || statusNum === 3 || countNum > 0
},
isGreenProcess(process) {
return this.isOutsourceProcess(process) &&
this.toProcessNumber(process.收料数量) > this.toProcessNumber(process.收检合格数) + this.toProcessNumber(process.收检不合格数)
},
getProcessBaseClass(process) {
if (this.isGreenProcess(process)) {
return 'process-route-green' return 'process-route-green'
} }
if (index > 0 && this.isProcessComplete(processes[index - 1])) {
return 'process-route-orange' if (this.isBlueProcess(process)) {
return 'process-route-blue'
} }
const statusNum = this.getProcessStatusNum(process.加工状态)
if (statusNum === 2 || statusNum === 4) {
return 'process-route-green'
}
return 'process-route-red' return 'process-route-red'
}, },
getRouteProcessName(process) { getOutsourceGroupClassState(processes) {
const name = String(process.工序名称 || '') const classes = new Map()
const assignee = String(process.指派对象 || '') let currentIndexes = []
if (!assignee || name.includes(`(${assignee})`) || name.includes(`${assignee}`)) { let lastProcess = null
return name
const flushOutsourceRun = () => {
if (currentIndexes.length > 0 && lastProcess) {
const className = this.getProcessBaseClass(lastProcess)
currentIndexes.forEach(index => classes.set(index, className))
}
currentIndexes = []
lastProcess = null
} }
return `${name}(${assignee})`
const isSameContinuousGroup = process => {
if (!lastProcess) {
return true
}
const lineNo = this.toProcessNumber(process.订单行号)
const lastLineNo = this.toProcessNumber(lastProcess.订单行号)
return lineNo === lastLineNo + 1 &&
String(process.外协分组 || '') === String(lastProcess.外协分组 || '')
}
processes.forEach((process, index) => {
if (!this.isOutsourceProcess(process)) {
flushOutsourceRun()
return
}
if (!isSameContinuousGroup(process)) {
flushOutsourceRun()
}
currentIndexes.push(index)
lastProcess = process
})
flushOutsourceRun()
return classes
},
getProcessClass(process, index, outsourceGroupClasses) {
if (this.isOutsourceProcess(process)) {
return outsourceGroupClasses.get(index) || this.getProcessBaseClass(process)
}
return this.getProcessBaseClass(process)
},
getRouteProcessName(process) {
return String(process.工序名称 || '')
}, },
escapeProcessHtml(value) { escapeProcessHtml(value) {
return String(value == null ? '' : value) return String(value == null ? '' : value)
@@ -365,6 +414,7 @@ export default {
const maxPerRow = 8 const maxPerRow = 8
const rows = Math.ceil(processes.length / maxPerRow) const rows = Math.ceil(processes.length / maxPerRow)
const outsourceGroupClasses = this.getOutsourceGroupClassState(processes)
let html = '<div class="process-route-wrap"><table class="process-route-table"><tbody>' let html = '<div class="process-route-wrap"><table class="process-route-table"><tbody>'
for (let rowIndex = 0; rowIndex < rows; rowIndex++) { for (let rowIndex = 0; rowIndex < rows; rowIndex++) {
@@ -376,20 +426,20 @@ export default {
html += '<tr>' html += '<tr>'
rowProcesses.forEach((process, index) => { rowProcesses.forEach((process, index) => {
const className = this.getProcessClass(process, startIndex + index, processes) const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses)
const date = this.formatDate(process.计划开始时间 || process.计划完成时间) const date = this.formatDate(process.计划开始时间 || process.计划完成时间)
html += `<td class="process-route-date ${className}">${this.escapeProcessHtml(date)}</td>` html += `<td class="process-route-date ${className}">${this.escapeProcessHtml(date)}</td>`
if (index < rowProcesses.length - 1) html += '<td class="process-route-arrow-hidden"></td>' if (index < rowProcesses.length - 1) html += '<td class="process-route-arrow-hidden"></td>'
}) })
html += '</tr><tr>' html += '</tr><tr>'
rowProcesses.forEach((process, index) => { rowProcesses.forEach((process, index) => {
const className = this.getProcessClass(process, startIndex + index, processes) const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses)
html += `<td class="${className}">${this.escapeProcessHtml(this.getRouteProcessName(process))}</td>` html += `<td class="${className}">${this.escapeProcessHtml(this.getRouteProcessName(process))}</td>`
if (index < rowProcesses.length - 1) html += '<td class="process-route-arrow">→</td>' if (index < rowProcesses.length - 1) html += '<td class="process-route-arrow">→</td>'
}) })
html += '</tr><tr>' html += '</tr><tr>'
rowProcesses.forEach((process, index) => { rowProcesses.forEach((process, index) => {
const className = this.getProcessClass(process, startIndex + index, processes) const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses)
const count = this.formatQuantity(process.收检合格数) const count = this.formatQuantity(process.收检合格数)
html += `<td class="process-route-count ${className}">合格${this.escapeProcessHtml(count)}</td>` html += `<td class="process-route-count ${className}">合格${this.escapeProcessHtml(count)}</td>`
if (index < rowProcesses.length - 1) html += '<td class="process-route-arrow-hidden"></td>' if (index < rowProcesses.length - 1) html += '<td class="process-route-arrow-hidden"></td>'
@@ -473,39 +523,53 @@ export default {
.process-route { .process-route {
overflow-x: auto; overflow-x: auto;
padding: 2px 0; padding: 0;
text-align: left;
} }
::v-deep .process-route-wrap { ::v-deep .process-route-wrap {
min-width: 480px; min-width: 480px;
text-align: left;
} }
::v-deep .process-route-table { ::v-deep .process-route-table {
border-collapse: separate; border-collapse: collapse;
border-spacing: 0; margin: 0;
margin: 0 auto; text-align: left;
table-layout: auto;
} }
::v-deep .process-route-table td { ::v-deep .process-route-table td {
border-radius: 2px; line-height: 1.4;
line-height: 20px; min-width: 35px;
min-width: 72px; padding: 2px 2px;
padding: 2px 5px; text-align: left;
text-align: center;
white-space: nowrap; white-space: nowrap;
} }
::v-deep .process-route-date, ::v-deep .process-route-date {
color: #8899aa !important;
font-size: 10px !important;
padding: 2px 2px !important;
}
::v-deep .process-route-count { ::v-deep .process-route-count {
font-size: 12px; font-size: 12px !important;
font-weight: 700;
} }
::v-deep .process-route-arrow, ::v-deep .process-route-arrow,
::v-deep .process-route-arrow-hidden { ::v-deep .process-route-arrow-hidden {
background: transparent; background: transparent;
color: #606266; min-width: 8px;
min-width: 18px; padding: 2px 0 !important;
width: 18px; width: 8px;
}
::v-deep .process-route-arrow {
color: rgba(0, 164, 255, 0.6) !important;
font-size: 10px !important;
text-align: center !important;
} }
::v-deep .process-route-arrow-hidden { ::v-deep .process-route-arrow-hidden {
@@ -513,29 +577,24 @@ export default {
} }
::v-deep .process-route-spacer td { ::v-deep .process-route-spacer td {
height: 6px; height: 4px;
line-height: 6px; line-height: 1 !important;
padding: 0; padding: 0 !important;
} }
::v-deep .process-route-green { ::v-deep .process-route-green {
background: #f0f9eb; color: #28d961;
color: #67c23a; font-weight: 700;
} }
::v-deep .process-route-blue { ::v-deep .process-route-blue {
background: #ecf5ff; color: #09a8ff;
color: #409eff; font-weight: 700;
}
::v-deep .process-route-orange {
background: #fdf6ec;
color: #e6a23c;
} }
::v-deep .process-route-red { ::v-deep .process-route-red {
background: #fef0f0; color: #ff3f37;
color: #f56c6c; font-weight: 700;
} }
::v-deep .detail-row td { ::v-deep .detail-row td {

View File

@@ -0,0 +1,283 @@
<template>
<div class="app-container product-pass-rate-page">
<el-card>
<div class="search-container" @keyup.enter="searchTable">
<span class="show-text">关闭日期:</span>
<el-date-picker
v-model="searchForm.closeDateStart"
type="date"
value-format="yyyy-MM-dd"
placeholder="开始日期"
clearable
size="small"
style="width: 140px; margin-right: 6px"
/>
<span class="date-separator"></span>
<el-date-picker
v-model="searchForm.closeDateEnd"
type="date"
value-format="yyyy-MM-dd"
placeholder="结束日期"
clearable
size="small"
style="width: 140px; margin-right: 10px"
/>
<span class="show-text">生产订单:</span>
<el-input
v-model="searchForm.orderNo"
clearable
placeholder="生产订单"
size="small"
style="width: 120px; margin-right: 10px"
/>
<span class="show-text">物料编码:</span>
<el-input
v-model="searchForm.itemCode"
clearable
placeholder="物料编码"
size="small"
style="width: 170px; margin-right: 10px"
/>
<span class="show-text">物料名称:</span>
<el-input
v-model="searchForm.itemName"
clearable
placeholder="物料名称"
size="small"
style="width: 150px; margin-right: 10px"
/>
<span class="show-text">工序:</span>
<el-input
v-model="searchForm.process"
clearable
placeholder="工序"
size="small"
style="width: 110px; margin-right: 10px"
/>
<span class="show-text">工位:</span>
<el-input
v-model="searchForm.station"
clearable
placeholder="工位"
size="small"
style="width: 110px; margin-right: 10px"
/>
<span class="show-text">合格状态:</span>
<el-select
v-model="searchForm.passStatus"
clearable
placeholder="合格状态"
size="small"
style="width: 110px; margin-right: 10px"
>
<el-option label="不合格" value="不合格" />
<el-option label="合格" value="合格" />
<el-option label="全部" value="全部" />
</el-select>
<el-button
:disabled="loading"
icon="el-icon-search"
plain
size="small"
type="primary"
@click="searchTable"
>查询</el-button>
</div>
<el-table
v-loading="loading"
:data="tableData"
border
element-loading-background="rgba(0, 0, 0, 0.2)"
element-loading-spinner="el-icon-loading"
height="76vh"
highlight-current-row
size="mini"
style="width: 100%; margin-top: 12px"
tooltip-effect="dark"
>
<el-table-column type="expand" width="44">
<template slot-scope="scope">
<div class="detail-wrapper">
<el-table
:data="scope.row.children"
border
class="detail-table"
empty-text="无二级数据"
size="mini"
>
<el-table-column align="center" label="工序" prop="工序" min-width="110" show-overflow-tooltip />
<el-table-column align="center" label="工序号" prop="工序号" width="80" />
<el-table-column align="center" label="工位(指派对象)" prop="工位" min-width="130" show-overflow-tooltip />
<el-table-column align="right" label="完工数量" prop="完成数量" width="100" />
<el-table-column align="right" label="不良数量" prop="不良数量" width="100" />
<el-table-column align="center" label="合格率" width="100">
<template slot-scope="childScope">
<span :class="getRateClass(childScope.row.合格率)">
{{ formatRate(childScope.row.合格率) }}
</span>
</template>
</el-table-column>
<el-table-column align="left" label="检验说明" prop="检测说明" min-width="220" show-overflow-tooltip />
</el-table>
</div>
</template>
</el-table-column>
<el-table-column align="center" fixed label="序号" type="index" width="50" />
<el-table-column align="center" label="关闭日期" width="120">
<template slot-scope="scope">{{ formatDate(scope.row.关闭日期) }}</template>
</el-table-column>
<el-table-column align="center" label="生产订单号" prop="生产订单号" width="100" />
<el-table-column align="left" label="物料名称" prop="物料名称" min-width="220" show-overflow-tooltip />
<el-table-column align="left" label="物料编码" prop="物料编码" min-width="190" show-overflow-tooltip />
<el-table-column align="right" label="计划数量" prop="计划数量" width="100" />
<el-table-column align="right" label="完成数量" prop="完成数量" width="100" />
<el-table-column align="right" label="不良数量" prop="不良数量" width="100" />
<el-table-column align="center" label="合格率" width="100">
<template slot-scope="scope">
<span :class="getRateClass(scope.row.合格率)">
{{ formatRate(scope.row.合格率) }}
</span>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script>
export default {
name: 'ProductPassRateWorkstation',
data() {
return {
loading: false,
searchForm: {
closeDateStart: this.getDefaultDateStart(),
closeDateEnd: this.getDefaultDateEnd(),
orderNo: '',
itemCode: '',
itemName: '',
process: '',
station: '',
passStatus: '不合格'
},
tableData: []
}
},
methods: {
async searchTable() {
this.loading = true
this.tableData = []
const param = []
param.push(['生产订单号', this.searchForm.orderNo || ''])
param.push(['物料编码', this.searchForm.itemCode || ''])
param.push(['物料名称', this.searchForm.itemName || ''])
param.push(['关闭日期_Start', this.searchForm.closeDateStart || ''])
param.push(['关闭日期_End', this.searchForm.closeDateEnd || ''])
param.push(['工序', this.searchForm.process || ''])
param.push(['工位', this.searchForm.station || ''])
param.push(['合格状态', this.searchForm.passStatus || ''])
const data = this.CreateData('11', '生产管理_产品合格率工位_查询', param)
try {
const response = await this.ExecDatabase(data)
const list = response.data || []
this.tableData = list.map(row => ({
...row,
children: this.parseDetails(row.明细JSON)
}))
} catch (error) {
console.error('产品合格率查询失败:', error)
this.$message.error('查询失败')
} finally {
this.loading = false
}
},
parseDetails(value) {
if (!value) return []
try {
const details = JSON.parse(value)
return Array.isArray(details) ? details : []
} catch (error) {
console.error('产品合格率明细解析失败:', error)
return []
}
},
getDefaultDateStart() {
const start = new Date()
start.setDate(start.getDate() - 30)
return this.formatPickerDate(start)
},
getDefaultDateEnd() {
return this.formatPickerDate(new Date())
},
formatPickerDate(date) {
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
},
formatDate(value) {
if (!value) return ''
return String(value).split('T')[0].split(' ')[0]
},
formatRate(value) {
if (value === null || value === undefined || value === '') return ''
const numberValue = Number(value)
if (Number.isNaN(numberValue)) return ''
return `${numberValue.toFixed(2)}%`
},
getRateClass(value) {
const numberValue = Number(value)
if (Number.isNaN(numberValue)) return ''
if (numberValue >= 100) return 'rate-good'
if (numberValue >= 90) return 'rate-warning'
return 'rate-danger'
}
}
}
</script>
<style scoped>
.product-pass-rate-page {
padding: 12px;
}
.search-container {
line-height: 32px;
}
.show-text {
margin-right: 5px;
}
.date-separator {
margin-right: 6px;
color: #606266;
}
.detail-wrapper {
padding: 8px 28px 10px 58px;
background: #f7fbff;
}
.detail-table {
width: 100%;
}
.rate-good {
color: #67c23a;
font-weight: 600;
}
.rate-warning {
color: #409eff;
font-weight: 600;
}
.rate-danger {
color: #f56c6c;
font-weight: 600;
}
</style>

View File

@@ -221,18 +221,7 @@
width="80" width="80"
prop="工位名称" prop="工位名称"
/> />
<el-table-column
align="center"
label="供应商"
width="80"
prop="供应商"
/>
<el-table-column
align="center"
label="采购收货单"
width="100"
prop="采购收货单"
/>
<el-table-column <el-table-column
align="center" align="center"
label="加急数量" label="加急数量"
@@ -285,6 +274,18 @@
width="180" width="180"
prop="检测说明" prop="检测说明"
/> />
<el-table-column
align="center"
label="供应商"
width="80"
prop="供应商"
/>
<el-table-column
align="center"
label="采购收货单"
width="100"
prop="采购收货单"
/>
<el-table-column label="操作" align="center" width="350" fixed="right"> <el-table-column label="操作" align="center" width="350" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
@@ -396,7 +397,7 @@
style="width: 200px" style="width: 200px"
@change="handleQualifiedChange" @change="handleQualifiedChange"
/> />
</div> </div>
<div class="info-item"> <div class="info-item">
<span class="info-label"> 检验人</span> <span class="info-label"> 检验人</span>
@@ -445,7 +446,7 @@
</div> </div>
</div> </div>
<div> <div>
<div class="info-container"> <div class="info-container">
<div class="info-item"> <div class="info-item">
<span class="info-label"> 检测说明</span> <span class="info-label"> 检测说明</span>
@@ -576,7 +577,7 @@ export default {
Urgentarr: {}, Urgentarr: {},
seeVisible:false, seeVisible:false,
downPDF:MESDownFile, downPDF:MESDownFile,
submitLoading: false, submitLoading: false,
}; };
}, },
created() { created() {
@@ -604,7 +605,7 @@ export default {
this.$message.error('未上传图纸'); this.$message.error('未上传图纸');
} }
}) })
}, },
getitemdraw2(row) { getitemdraw2(row) {
var param = []; var param = [];
@@ -620,7 +621,7 @@ export default {
this.$message.error('未上传图纸'); this.$message.error('未上传图纸');
} }
}) })
}, },
Urgent(row){ Urgent(row){
var param = [] var param = []
@@ -702,7 +703,7 @@ export default {
param.push(["检测类别", this.type]); param.push(["检测类别", this.type]);
param.push(["检测状态", this.checkstatus]); param.push(["检测状态", this.checkstatus]);
param.push(["属性", this.attribute]); param.push(["属性", this.attribute]);
// 调用封装方法生成请求数据 - 使用新的存储过程名称 // 调用封装方法生成请求数据 - 使用新的存储过程名称
var Data = this.CreateData( var Data = this.CreateData(
"11", "11",
@@ -799,14 +800,14 @@ export default {
this.$message.warning("数量输入错误"); this.$message.warning("数量输入错误");
return; return;
} }
// 调用存储过程保存数据 // 调用存储过程保存数据
this.saveReceiveCheck(); this.saveReceiveCheck();
}, },
async saveReceiveCheck() { async saveReceiveCheck() {
// 设置提交状态为true防止重复提交 // 设置提交状态为true防止重复提交
this.submitLoading = true; this.submitLoading = true;
var param = []; var param = [];
param.push(["TaskAID", this.receiveCheckData.TaskAID || ""]); param.push(["TaskAID", this.receiveCheckData.TaskAID || ""]);
param.push(["检测类型编号", 6]); param.push(["检测类型编号", 6]);
@@ -825,14 +826,14 @@ export default {
param.push(["放行数量", this.receiveCheckData.放行数量]); param.push(["放行数量", this.receiveCheckData.放行数量]);
param.push(["工位名称", this.receiveCheckData.工位名称]); param.push(["工位名称", this.receiveCheckData.工位名称]);
console.log(param); console.log(param);
try { try {
if(this.receiveCheckData.工位名称 == '外协' && this.receiveCheckData.合格数 > 0){ if(this.receiveCheckData.工位名称 == '外协' && this.receiveCheckData.合格数 > 0){
var result = await postB1("/QueryService_PostQuery",{ var result = await postB1("/QueryService_PostQuery",{
"QueryPath": "$crossjoin(PurchaseOrders,PurchaseOrders/DocumentLines)", "QueryPath": "$crossjoin(PurchaseOrders,PurchaseOrders/DocumentLines)",
"QueryOption": "$expand=PurchaseOrders($select=DocEntry, DocNum,CardCode,CardName),PurchaseOrders/DocumentLines($select=ItemCode,LineNum,Price,U_WWOworID,U_WWOrstHS,LineStatus)&$filter=PurchaseOrders/DocEntry eq PurchaseOrders/DocumentLines/DocEntry and PurchaseOrders/DocumentLines/U_WWOworID eq "+this.receiveCheckData.计划号+"" "QueryOption": "$expand=PurchaseOrders($select=DocEntry, DocNum,CardCode,CardName),PurchaseOrders/DocumentLines($select=ItemCode,LineNum,Price,U_WWOworID,U_WWOrstHS,LineStatus)&$filter=PurchaseOrders/DocEntry eq PurchaseOrders/DocumentLines/DocEntry and PurchaseOrders/DocumentLines/U_WWOworID eq "+this.receiveCheckData.计划号+""
}) })
if (result.success) { if (result.success) {
if(result.data.value.length>0){ if(result.data.value.length>0){
let processed = false; let processed = false;
@@ -842,13 +843,13 @@ export default {
console.log(element['PurchaseOrders/DocumentLines'].U_WWOrstHS) console.log(element['PurchaseOrders/DocumentLines'].U_WWOrstHS)
console.log(element['PurchaseOrders/DocumentLines'].LineStatus) console.log(element['PurchaseOrders/DocumentLines'].LineStatus)
console.log(this.receiveCheckData.工序名称 == element['PurchaseOrders/DocumentLines'].U_WWOrstHS & element['PurchaseOrders/DocumentLines'].LineStatus == 'O') console.log(this.receiveCheckData.工序名称 == element['PurchaseOrders/DocumentLines'].U_WWOrstHS & element['PurchaseOrders/DocumentLines'].LineStatus == 'O')
if( this.receiveCheckData.工序名称 == element['PurchaseOrders/DocumentLines'].U_WWOrstHS && element['PurchaseOrders/DocumentLines'].LineStatus == 'O' ){ if( this.receiveCheckData.工序名称 == element['PurchaseOrders/DocumentLines'].U_WWOrstHS && element['PurchaseOrders/DocumentLines'].LineStatus == 'O' ){
var CardCode = element.PurchaseOrders.CardCode var CardCode = element.PurchaseOrders.CardCode
var CardName = element.PurchaseOrders.Cardname var CardName = element.PurchaseOrders.Cardname
var DocEntry = element.PurchaseOrders.DocEntry var DocEntry = element.PurchaseOrders.DocEntry
var LineNum = element['PurchaseOrders/DocumentLines'].LineNum var LineNum = element['PurchaseOrders/DocumentLines'].LineNum
// 创建采购收货单 // 创建采购收货单
const deliveryResult = await postB1( const deliveryResult = await postB1(
"/PurchaseDeliveryNotes", "/PurchaseDeliveryNotes",
@@ -879,7 +880,7 @@ export default {
} }
if (!processed) { if (!processed) {
const errorElement = failedElement || (result.data.value.length > 0 ? result.data.value[0] : null); const errorElement = failedElement || (result.data.value.length > 0 ? result.data.value[0] : null);
if (errorElement) { if (errorElement) {
const docEntry = errorElement['PurchaseOrders'].DocEntry; const docEntry = errorElement['PurchaseOrders'].DocEntry;
const processName = errorElement['PurchaseOrders/DocumentLines'].U_WWOrstHS; const processName = errorElement['PurchaseOrders/DocumentLines'].U_WWOrstHS;
@@ -904,11 +905,11 @@ export default {
throw new Error('外协订单查询失败'); throw new Error('外协订单查询失败');
} }
} }
// 执行收检操作 // 执行收检操作
var Data = this.CreateData("12", "质量管理_序检收检_新增", param); var Data = this.CreateData("12", "质量管理_序检收检_新增", param);
const response = await this.ExecDatabase(Data); const response = await this.ExecDatabase(Data);
if ( if (
response.data && response.data &&
response.data[0] && response.data[0] &&
@@ -950,8 +951,8 @@ export default {
// param.push(["放行数量", this.receiveCheckData.放行数量]); // param.push(["放行数量", this.receiveCheckData.放行数量]);
// console.log(param); // console.log(param);
// if(this.receiveCheckData.工位名称 == '外协'){ // if(this.receiveCheckData.工位名称 == '外协'){
// var result = await postB1("/QueryService_PostQuery",{ // var result = await postB1("/QueryService_PostQuery",{
// "QueryPath": "$crossjoin(PurchaseOrders,PurchaseOrders/DocumentLines)", // "QueryPath": "$crossjoin(PurchaseOrders,PurchaseOrders/DocumentLines)",
// "QueryOption": "$expand=PurchaseOrders($select=DocEntry, DocNum,CardCode,CardName),PurchaseOrders/DocumentLines($select=ItemCode,LineNum,Price,U_WWOworID,U_WWOrstHS,LineStatus)&$filter=PurchaseOrders/DocEntry eq PurchaseOrders/DocumentLines/DocEntry and PurchaseOrders/DocumentLines/U_WWOworID eq "+this.receiveCheckData.计划号+"" // "QueryOption": "$expand=PurchaseOrders($select=DocEntry, DocNum,CardCode,CardName),PurchaseOrders/DocumentLines($select=ItemCode,LineNum,Price,U_WWOworID,U_WWOrstHS,LineStatus)&$filter=PurchaseOrders/DocEntry eq PurchaseOrders/DocumentLines/DocEntry and PurchaseOrders/DocumentLines/U_WWOworID eq "+this.receiveCheckData.计划号+""
// }) // })
// }else{ // }else{
@@ -1027,14 +1028,14 @@ export default {
// }); // });
// } // }
// }); // });
// } else { // } else {
// this.$message.error('质检失败:外协采购订单未创建'); // this.$message.error('质检失败:外协采购订单未创建');
// } // }
// } // }
// }, // },
formatDateTime(date) { formatDateTime(date) {
@@ -1207,4 +1208,4 @@ export default {
display: flex; display: flex;
align-items: center; align-items: center;
} }
</style> </style>

View File

@@ -0,0 +1,26 @@
# 01-项目功能内容
## 页面
- 页面路径:`src/views/PlanManagement/PlannOrderClose/index.vue`
- 页面功能:生产订单关闭查询、确认、关闭、批量确认、批量关闭。
- 查询过程:`dbo.计划排产_生产订单关闭_查询全部订单`
## 原有口径
1. “可关闭”查询以 `dbo.View_生产工时视图` 为基准。
2. 有工时记录的订单必须全部工时校验完成。
3. 同时满足原有可关闭条件:
- 单据状态为空。
- 终检合格数 + 收检不合格数 = 计划数量,或计划数量 = 入库数量,或收检不合格数 = 计划数量。
- 入库数量 = 终检合格数。
4. 按属性过滤机加或装配。
## 2026-06-30 补充口径
1. 特殊情况:订单没有工时记录,但入库、终检、计划数量等其他条件已经满足。
2. 处理方式:可关闭查询改为“有工时订单 + 无工时满足条件订单”合并。
3. 有工时订单继续要求全部工时校验。
4. 无工时订单不做工时校验,但必须满足原有可关闭条件。
5. 为避免页面默认查询变慢,先将 `View_生产工时视图` 的订单号汇总到临时表,再判断生产计划订单是否无工时。

View File

@@ -0,0 +1,44 @@
# 02-项目程序开发详细步骤
## 1. 需求解析
1. 用户反馈生产订单关闭“可关闭”查询以工时为基准,导致没有工时记录但满足其他条件的订单查不出来。
2. 确认不能简单放开所有无工时订单,否则会把未完工的新订单带入可关闭列表。
3. 确定口径:无工时订单只免除“全部工时校验”,仍必须满足原有可关闭条件。
## 2. 数据库开发
1. 新增脚本 `db_backups/update_plan_order_close_no_work_hours_20260630.sql`
2. 修改 `dbo.计划排产_生产订单关闭_查询全部订单``@单据状态 = N'可关闭'` 分支。
3. 使用 CTE 汇总收检数量和终检数量。
4. 第一段查询保留原有 `View_生产工时视图` 逻辑:
- 订单有工时。
- `MIN(CASE WHEN v.Expr1 IS NULL THEN 0 ELSE 1 END) = 1`,确保全部工时已校验。
- 保留原有计划数量、入库数量、终检和收检条件。
5. 第二段查询从 `MES_接口_生产计划` 补充无工时订单:
- `#工时订单` 临时表中不存在该订单号。
- 单据状态为空。
- 属性匹配。
- 满足原有计划数量、入库数量、终检和收检条件。
6. 两段结果使用 `UNION ALL` 合并。
7. 非“可关闭”分支改为参数化静态 SQL保留原输出字段。
## 3. 发布
1. 使用 `sqlcmd` 发布脚本到 `YL_MESDB`
2. 发布命令使用环境变量传入密码,不写入脚本和文档。
## 4. 验证
1. 验证无工时样例 `7410`
- `View_生产工时视图` 中无工时。
- `MES_接口_生产计划` 中计划数量 `1`、入库数量 `1`、单据状态为空、属性为机加件。
- 终检合格数 `1`、终检不合格数 `0`
- 查询 `@单据状态=N'可关闭', @属性=N'机加'` 能返回。
2. 验证默认可关闭机加查询:
- 查询耗时约 `0.56` 秒。
- 返回无工时样例 `7280``7409``7410`
3. 验证非可关闭分支可执行:
- `@单据状态=N'未关闭'`
- `@单据状态=N'已关闭'`

View File

@@ -0,0 +1,46 @@
# 03-推进台账
## 第1轮无工时订单纳入可关闭查询
### 用户反馈
- 生产订单关闭查询以工时为基准。
- 当前只能查出全部校验的工时再筛选。
- 特殊情况:没有工时,但满足其他条件的订单也需要处理。
### 执行过程
1. 读取线上过程 `dbo.计划排产_生产订单关闭_查询全部订单`
2. 核对页面 `src/views/PlanManagement/PlannOrderClose/index.vue`,确认页面默认查询为“可关闭 + 机加”。
3. 查询字段结构,确认 `MES_接口_生产计划``View_生产工时视图` 字段可支撑补充逻辑。
4. 查询样例,确认存在无工时但满足条件订单,例如 `7410`
5. 新增数据库脚本 `db_backups/update_plan_order_close_no_work_hours_20260630.sql`
6. 第一次发布后发现默认全量可关闭查询超时。
7. 优化为先将 `View_生产工时视图` 的订单号写入 `#工时订单` 临时表,再判断无工时订单。
8. 重新发布成功。
9. 验证 `7410` 可按“可关闭 + 机加”查出。
10. 验证默认“可关闭 + 机加”约 `0.56` 秒返回,并命中 `7280``7409``7410`
### 修改文件
- `db_backups/update_plan_order_close_no_work_hours_20260630.sql`
- `work/PlanManagement/PlannOrderClose/README.md`
- `work/PlanManagement/PlannOrderClose/01-项目功能内容.md`
- `work/PlanManagement/PlannOrderClose/02-项目程序开发详细步骤.md`
- `work/PlanManagement/PlannOrderClose/03-推进台账.md`
- `work/PlanManagement/PlannOrderClose/04-任务矩阵.md`
- `work/PlanManagement/PlannOrderClose/05-验收证据.md`
- `work/PlanManagement/PlannOrderClose/06-决策记录.md`
- `gptlog-process/gpdlog.md`
- `C:\gptlog-process\gpdlog.md`
### 验证结果
- 数据库过程发布成功。
- 无工时样例 `7410` 可查询。
- 默认“可关闭 + 机加”查询未超时,约 `0.56` 秒返回。
### 下一步
- 页面上用默认条件确认无工时但满足条件的订单可参与确认和关闭流程。

View File

@@ -0,0 +1,11 @@
# 04-任务矩阵
| 任务编号 | 任务名称 | 状态 | 验收标准 |
| --- | --- | --- | --- |
| POC-001 | 排查可关闭查询基准 | 已完成 | 确认原过程以 `View_生产工时视图` 为主表,导致无工时订单无法出现 |
| POC-002 | 无工时可关闭口径设计 | 已完成 | 无工时订单只免工时校验,仍满足原有可关闭条件 |
| POC-003 | 存储过程脚本开发 | 已完成 | 新增 `update_plan_order_close_no_work_hours_20260630.sql` 并发布成功 |
| POC-004 | 性能优化 | 已完成 | 默认“可关闭 + 机加”查询约 `0.56` 秒返回 |
| POC-005 | 样例验证 | 已完成 | `7410` 无工时但满足条件,可被可关闭查询返回 |
| POC-006 | 文档与日志 | 已完成 | README、01-06 文档和两处 `gpdlog.md` 已更新 |

View File

@@ -0,0 +1,74 @@
# 05-验收证据
## 数据库发布
```powershell
$env:SQLCMDPASSWORD='******'
sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -C -l 30 -b -f 65001 -i 'db_backups\update_plan_order_close_no_work_hours_20260630.sql'
Remove-Item Env:SQLCMDPASSWORD
```
结果:
```text
已将数据库上下文更改为 "YL_MESDB"。
```
## 无工时样例验证
命令:
```sql
EXEC dbo.[_生产订单关闭_查询全部订单]
@=N'7410',
@=N'可关闭',
@=N'机加';
```
结果要点:
| 订单编号 | 产品名称 | 产品编码 | 入库数量 | 终检合格数合计 | 计划数量 | 单据状态 | 是否全部校验 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 7410 | 数码管显示屏 | 24415-MS1808-S | 1.000000 | 1.0000 | 1.000000 | NULL | 1 |
## 样例来源验证
```sql
SELECT CASE WHEN EXISTS
(
SELECT 1 FROM dbo.View_生产工时视图 WHERE =N'7410'
)
THEN N'有工时' ELSE N'无工时' END AS ;
```
结果:
```text
无工时
```
生产计划和终检条件:
```text
计划数量=1.00,入库数量=1.000000,单据状态=NULL自制件属性=机加件。
终检合格数合计=1.0000,终检不合格数合计=0.0000。
```
## 默认查询性能验证
命令:
```sql
EXEC dbo.[_生产订单关闭_查询全部订单]
@=N'',
@=N'可关闭',
@=N'机加';
```
结果要点:
```text
ElapsedSeconds=0.56
命中无工时样例7280、7409、7410。
```

View File

@@ -0,0 +1,20 @@
# 06-决策记录
## DR-001 无工时订单不直接全部放开
- 日期2026-06-30
- 决策:无工时订单只免除工时全部校验,仍必须满足单据未关闭、计划数量、入库数量、终检和收检等原有可关闭条件。
- 原因:数据库中存在大量无工时的新订单,计划数量和终检数量尚未满足。如果全部放开,会误进入可关闭列表。
## DR-002 保留有工时订单的全部校验要求
- 日期2026-06-30
- 决策:有工时记录的订单继续使用 `MIN(CASE WHEN v.Expr1 IS NULL THEN 0 ELSE 1 END) = 1` 判断全部校验。
- 原因:这是原有关闭风险控制点,不能因为补充无工时场景而降低已有工时订单的关闭门槛。
## DR-003 使用临时表优化无工时判断
- 日期2026-06-30
- 决策:在可关闭分支先将 `View_生产工时视图` 中的订单号写入 `#工时订单`,再判断生产计划订单是否无工时。
- 原因:直接在每条生产计划记录上 `NOT EXISTS` 查询复杂视图会导致默认页面查询超时;临时表方案验证约 `0.56` 秒返回。

View File

@@ -0,0 +1,18 @@
# 生产订单关闭 README 索引
## 文档清单
- `01-项目功能内容.md`:记录生产订单关闭查询功能范围和本次无工时可关闭补充口径。
- `02-项目程序开发详细步骤.md`:记录数据库脚本、发布和验证步骤。
- `03-推进台账.md`:记录每轮做了什么、改了哪些文件、验证了什么、下一步是什么。
- `04-任务矩阵.md`:记录任务编号、状态和验收标准。
- `05-验收证据.md`:记录命令、数据库对象、样例订单和验证输出。
- `06-决策记录.md`:记录关键口径,避免后续重复争论。
## 当前状态
- 查询过程:`dbo.计划排产_生产订单关闭_查询全部订单`
- 当前脚本:`db_backups/update_plan_order_close_no_work_hours_20260630.sql`
- 已发布环境:`YL_MESDB`
- 当前口径:可关闭查询仍以工时校验为主要规则;没有工时记录的订单,如果满足单据未关闭、入库数量、终检合格数、计划数量等原有可关闭条件,也进入可关闭列表。

View File

@@ -16,12 +16,21 @@
- 物料编码:`SAP.SBO_YL.dbo.VIEW_Jijiankukc.ItemCode` - 物料编码:`SAP.SBO_YL.dbo.VIEW_Jijiankukc.ItemCode`
- 物料名称:`SAP.SBO_YL.dbo.VIEW_Jijiankukc.U_Name` - 物料名称:`SAP.SBO_YL.dbo.VIEW_Jijiankukc.U_Name`
- 缺件数量:`SAP.SBO_YL.dbo.VIEW_Jijiankukc.未发货数量` - 缺件数量:`SAP.SBO_YL.dbo.VIEW_Jijiankukc.未发货数量`
- 库存数量:`SAP.SBO_YL.dbo.VIEW_Jijiankukc.库存量`
- 属性:`SAP.SBO_YL.dbo.VIEW_Jijiankukc.属性`,属性为空时显示为外购 - 属性:`SAP.SBO_YL.dbo.VIEW_Jijiankukc.属性`,属性为空时显示为外购
- 生产订单号:机加件按 SAP 物料编码匹配 MES 生产计划;装配按 SAP 物料编码 + 销售订单匹配 MES 生产计划;外购取 SAP `在制采购` - 生产订单号:机加件按 SAP 物料编码匹配 MES 生产计划;装配按 SAP 物料编码 + 销售订单匹配 MES 生产计划;外购取 SAP `在制采购`
- 进度:属性不为空时参考生产计划跟踪当前序;外购为空 - 进度:属性不为空时参考生产计划跟踪当前序;外购为空
- 工艺路线:属性不为空时参考生产计划跟踪工艺路线;外购拼接采购员、采购未清数量、到货草稿、质检状态 - 工艺路线:属性不为空时参考生产计划跟踪工艺路线;外购拼接采购员、采购未清数量、到货草稿、质检状态
- 预计完成时间:属性不为空时取 MES 任务最大计划完成时间;外购取 SAP 采购预计交货时间 - 预计完成时间:属性不为空时取 MES 任务最大计划完成时间;外购取 SAP 采购预计交货时间
## 2026-06-30 页面修正范围
1. 二级缺件明细在“缺件数量”后新增“库存数量”。
2. 二级明细去掉单独“采购员”列。
3. 外购采购状态文本保留采购员拼接。
4. 二级工艺路线改为左对齐、缩小间距,并按生产计划跟踪的红/蓝/绿配色展示,不使用橙色。
5. 自制缺件同一物料匹配到多个生产订单时全部显示;同一个缺件生产订单号只显示一次,避免重复行。
## 数据库对象 ## 数据库对象
- 查询过程:`dbo.生产管理_及时齐套跟踪结果_查询` - 查询过程:`dbo.生产管理_及时齐套跟踪结果_查询`
@@ -32,3 +41,6 @@
- 增量脚本: - 增量脚本:
- `db_backups/create_timely_kit_tracking_result_20260629.sql` - `db_backups/create_timely_kit_tracking_result_20260629.sql`
- `db_backups/add_timely_kit_tracking_result_menu_20260629.sql` - `db_backups/add_timely_kit_tracking_result_menu_20260629.sql`
- `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`
- `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql`
- `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`

View File

@@ -16,6 +16,10 @@
5. 使用 `View_生产订单_MES` 匹配 MES 计划、任务状态、工艺路线和预计完成时间。 5. 使用 `View_生产订单_MES` 匹配 MES 计划、任务状态、工艺路线和预计完成时间。
6. 使用 `YL_质量检验_质检记录` 判断终检和外购到货草稿对应的来料检验状态。 6. 使用 `YL_质量检验_质检记录` 判断终检和外购到货草稿对应的来料检验状态。
7. 脚本补充 `SET ANSI_NULLS ON``SET QUOTED_IDENTIFIER ON`,避免 XML `.value()` 和索引视图相关 SET 选项错误。 7. 脚本补充 `SET ANSI_NULLS ON``SET QUOTED_IDENTIFIER ON`,避免 XML `.value()` 和索引视图相关 SET 选项错误。
8. 2026-06-30 新增 `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`,在不覆盖历史脚本的前提下更新查询过程。
9. 2026-06-30 查询过程从 SAP 视图 `库存量` 读取并输出为页面字段 `库存数量`
10. 2026-06-30 外购采购状态文本保留采购员、采购未清数量、到货草稿、质检状态,不单独输出采购员列。
11. 2026-06-30 新增 `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`,去掉自制缺件生产订单匹配处的单行限制,同一缺件物料匹配到的多个生产订单全部返回,并按缺件生产订单号去重。
## 3. 菜单开发 ## 3. 菜单开发
@@ -35,6 +39,9 @@
4. 使用 `el-table-column type="expand"` 展示缺件二级明细。 4. 使用 `el-table-column type="expand"` 展示缺件二级明细。
5. 二级行使用浅绿色背景,贴合原文档“绿色部分二级数据”的表达。 5. 二级行使用浅绿色背景,贴合原文档“绿色部分二级数据”的表达。
6. 状态字段使用与既有页面一致的绿色/橙色标签样式。 6. 状态字段使用与既有页面一致的绿色/橙色标签样式。
7. 2026-06-30 二级缺件明细在“缺件数量”后增加“库存数量”列。
8. 2026-06-30 二级缺件明细去掉单独“采购员”列,采购员仅在外购采购状态文本中显示。
9. 2026-06-30 二级工艺路线样式参考 `src/views/ProductionManagement/ProductionPlanTrack/index.vue`,调整为左对齐、缩小间距、红/蓝/绿三色,不使用橙色。
## 5. 验证 ## 5. 验证
@@ -43,3 +50,6 @@
3. 直接执行 `dbo.生产管理_及时齐套跟踪结果_查询`,确认 SAP linked server 可访问并返回数据。 3. 直接执行 `dbo.生产管理_及时齐套跟踪结果_查询`,确认 SAP linked server 可访问并返回数据。
4. 执行 `npm run build`,确认前端构建通过。 4. 执行 `npm run build`,确认前端构建通过。
5. 复制原始 docx 到 `work/PlanManagement/TimelyKitTrackingResult` 并补齐 README、01-06 文档。 5. 复制原始 docx 到 `work/PlanManagement/TimelyKitTrackingResult` 并补齐 README、01-06 文档。
6. 2026-06-30 执行线上过程定义检查,确认包含 `库存数量`;最新口径为外购采购状态文本包含 `采购员:`,但结果集和页面均无单独采购员列。
7. 2026-06-30 查询 SAP 视图 `VIEW_Jijiankukc`,确认 `库存量` 字段存在且样例有库存值。
8. 2026-06-30 执行 `EXEC dbo.[生产管理_及时齐套跟踪结果_查询] @订单号 = 4222`,确认缺件物料 `22-103-060-YDZF-20V1.0-4.1` 同时返回生产订单 `5960``7142`,且同一生产订单号未重复。

View File

@@ -103,3 +103,146 @@
### 下一步 ### 下一步
- 在页面刷新后检查前 1-10 行和第 32 行 `2007`,确认主数据、二级缺件、外购采购状态展示符合业务预期。 - 在页面刷新后检查前 1-10 行和第 32 行 `2007`,确认主数据、二级缺件、外购采购状态展示符合业务预期。
## 2026-06-30 第 4 轮:补库存数量并调整采购员和工艺路线展示
### 做了什么
- 根据反馈在二级缺件明细“缺件数量”后增加“库存数量”字段。
- 连接 `YL_MESDB`,确认 `[SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc]` 已存在 `库存量` 字段。
- 新增 `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`,从 SAP `库存量` 输出为过程字段 `库存数量`
- 去掉页面二级明细“采购员”列,并从前端合并数据中移除 `采购员` 映射。
- 修改存储过程外购采购状态文本,去掉 `采购员:` 拼接,保留未清数量、到货草稿、质检状态。
- 二级工艺路线参考生产计划跟踪页面调整为左对齐、缩小间距、红/蓝/绿三色,删除橙色逻辑和样式。
- 更新 README、01-06 文档,并将完整执行过程追加到总日志。
### 改了哪些文件
- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`
- `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`
- `work/PlanManagement/TimelyKitTrackingResult/README.md`
- `work/PlanManagement/TimelyKitTrackingResult/01-项目功能内容.md`
- `work/PlanManagement/TimelyKitTrackingResult/02-项目程序开发详细步骤.md`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证了什么
- `VIEW_Jijiankukc` 字段列表包含 `库存量`
- SAP 视图取样:`DocEntry=2007``ItemCode=24112-011-HY-WF50L``库存量=27`
- 发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。
- 查询 `@订单号=2007`,结果返回 `库存数量=27`,且结果列不再包含 `采购员`
- 查询 `@订单号=7321`,结果返回 `库存数量=2`,外购采购状态文本不再包含采购员。
- 线上过程定义检查显示:包含 `库存数量`,未拼接 `采购员:`
- `npm run build` 通过,仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。
### 下一步
- 登录页面人工验收展开明细,确认“库存数量”位置、外购采购状态文本、工艺路线颜色和左对齐效果符合现场使用预期。
## 2026-06-30 第 5 轮:修正 7134 工艺路线判色口径
### 做了什么
- 根据反馈核对二级数据 `7134` 的工艺路线颜色差异。
- 查询 `View_生产订单_MES``YL_质量检验_质检记录`,确认 `7134` 三道工序为:
- 打磨:加工状态 `6`,收检合格数 `6`
- 打压检测:加工状态为空,收检合格数 `6`
- 喷塑:外协,收检合格数 `0`
- 对比生产计划跟踪页面判色逻辑,确认其蓝色口径为:加工状态 `6``3`,或 `收检合格数 > 0`
- 将当前页二级工艺路线判色逻辑改为与生产计划跟踪一致。
- 保留外协连续分组逻辑,外协工序按生产计划跟踪的 `getOutsourceGroupClassState` 口径继承同组末道工序颜色。
### 改了哪些文件
- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证了什么
- SQL 验证 `7134`
- 打磨:`收检合格数=6`
- 打压检测:`收检合格数=6`
- 喷塑:`收检合格数=0`
- 本地判色模拟结果:`step1:process-route-blue,step2:process-route-blue,step3:process-route-red`
- `rg` 检查当前页无 `process-route-orange`
- `npm run build` 通过,仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。
### 下一步
- 登录页面展开 `7134`,确认当前页显示两个蓝色、一个红色,与生产计划跟踪一致。
## 2026-06-30 第 6 轮:恢复外购采购员拼接但不恢复采购员列
### 做了什么
- 根据最新反馈恢复外购 `工艺路线/采购状态` 中的采购员拼接。
- 保持页面二级明细不增加单独“采购员”列。
- 在最新过程脚本 `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql` 中读取 SAP `采购员`,仅用于拼接外购采购状态文本。
- 外购采购状态格式恢复为:`采购员:xxx / 未清数量:xxx / 到货草稿:xxx / 质检状态:xxx`
- 继续保留外购缺件生产订单号按 SAP `在制采购` 取值、预计完成时间按 SAP `采购预计交货日期` 取值。
### 改了哪些文件
- `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证了什么
- 发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。
- 查询 `@订单号=7321`,外购采购状态显示:`采购员:张丹 / 未清数量:50 / 到货草稿:11209 / 质检状态:未完成`
- 查询 `@订单号=7321`,二级缺件生产订单号为 SAP `在制采购=4111`,预计完成时间为 SAP `采购预计交货日期=2026-06-25`
- 结果集元数据检查:无单独 `采购员` 结果列。
- 前端页面检查:无 `label="采购员"``prop="采购员"`
- `npm run build` 通过,仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。
### 下一步
- 登录页面确认外购采购状态中可见采购员,同时二级表没有单独采购员列。
## 2026-06-30 第 7 轮:自制缺件显示所有匹配生产订单
### 做了什么
- 根据反馈调整自制缺件二级匹配口径:同一缺件物料匹配到的所有生产订单都显示,同一个生产订单号不重复。
- 排查 `4222`
- SAP 缺件物料为 `22-103-060-YDZF-20V1.0-4.1`
- SAP 视图 `DocNum=5960`
- MES 中同物料存在生产订单 `5960``7142`
- 旧过程在 `detail_order` 中使用 `TOP (1)`,只能显示其中一个。
- 新增 `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`
- 将自制件 `detail_order``TOP (1)` 改为按 `订单编号` 分组去重后返回多条。
- 保留 SQL 最终层按 `订单号 + 缺件生产订单号` 去重,避免同一生产订单号重复。
### 改了哪些文件
- `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`
- `work/PlanManagement/TimelyKitTrackingResult/README.md`
- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md`
- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md`
- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md`
- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md`
- `gptlog-process/gpdlog.md`
### 验证了什么
- 发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。
- 查询 `@订单号=4222`,二级数据返回 `5960``7142` 两条生产订单。
- `5960` 使用完整的 13 道工艺路线。
- `7142` 仍显示其 4 道工艺路线。
- 同一生产订单号没有重复出现。
### 下一步
- 登录页面展开 `4222`,确认二级数据同时显示 `5960``7142`,且没有重复生产订单号。

View File

@@ -16,5 +16,12 @@
| TKR-014 | 一级主数据禁止 SAP 兜底 | 已完成 | 默认查询中产品编码/产品名称为空行数为 0不出现只有 SAP 缺件字段的假主数据 | | TKR-014 | 一级主数据禁止 SAP 兜底 | 已完成 | 默认查询中产品编码/产品名称为空行数为 0不出现只有 SAP 缺件字段的假主数据 |
| TKR-015 | 外购二级生产订单号修正 | 已完成 | 外购缺件不再显示主生产订单号,有到货草稿时显示采购入库检生产订单 | | TKR-015 | 外购二级生产订单号修正 | 已完成 | 外购缺件不再显示主生产订单号,有到货草稿时显示采购入库检生产订单 |
| TKR-016 | 外购质检状态按采购入库检口径 | 已完成 | 外购按 `到货草稿 -> 质量检验_质检任务_SAP -> YL_质量检验_质检记录` 判断未完成/已完成 | | TKR-016 | 外购质检状态按采购入库检口径 | 已完成 | 外购按 `到货草稿 -> 质量检验_质检任务_SAP -> YL_质量检验_质检记录` 判断未完成/已完成 |
| TKR-017 | 二级新增库存数量 | 已完成 | SAP `VIEW_Jijiankukc.库存量` 已通过过程输出为 `库存数量`,页面在缺件数量后显示 |
| TKR-018 | 去掉单独采购员列 | 已完成 | 页面二级明细无单独采购员列,采购员仅在外购采购状态文本中拼接显示 |
| TKR-019 | 工艺路线样式调整 | 已完成 | 二级工艺路线左对齐、间距收紧、只使用红/蓝/绿三色,无橙色 |
| TKR-020 | 2026-06-30 增量脚本归档 | 已完成 | `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql` 已创建并发布成功 |
| TKR-021 | 工艺路线判色对齐生产计划跟踪 | 已完成 | 7134 二级工艺路线按生产计划跟踪口径显示两个蓝色、一个红色 |
| TKR-022 | 外购采购员恢复为拼接文本 | 已完成 | 外购采购状态包含 `采购员:`,页面和过程结果集均无单独采购员列 |
| TKR-023 | 自制缺件多生产订单显示 | 已完成 | 同一缺件物料匹配到的所有生产订单都显示,且同一生产订单号不重复 |
| TKR-009 | 页面人工验收 | 待办 | 登录系统确认菜单可见、查询成功、展开行字段与业务一致 | | TKR-009 | 页面人工验收 | 待办 | 登录系统确认菜单可见、查询成功、展开行字段与业务一致 |
| TKR-010 | 采购质检匹配口径复核 | 观察 | 如业务确认到货草稿不是 `YL_质量检验_质检记录.计划号`,需调整质检状态匹配规则 | | TKR-010 | 采购质检匹配口径复核 | 观察 | 如业务确认到货草稿不是 `YL_质量检验_质检记录.计划号`,需调整质检状态匹配规则 |

View File

@@ -198,3 +198,293 @@ npm run build
- 构建通过。 - 构建通过。
- webpack compiled with 2 warnings。 - webpack compiled with 2 warnings。
- 警告为项目既有资源体积过大和 Browserslist/caniuse-lite 数据过期。 - 警告为项目既有资源体积过大和 Browserslist/caniuse-lite 数据过期。
## 第 4 轮修正验证
### SAP 库存字段确认
命令:
```powershell
sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -C -Q "SELECT c.name FROM [SAP].[SBO_YL].sys.columns c JOIN [SAP].[SBO_YL].sys.objects o ON c.object_id=o.object_id WHERE o.name=N'VIEW_Jijiankukc' ORDER BY c.column_id;"
```
结果:
- `[SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc]` 包含 `库存量` 字段。
取样命令:
```powershell
sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -C -Q "SELECT TOP (5) s.DocEntry, s.ItemCode, s.[未发货数量], s.[库存量] FROM [SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc] AS s WHERE ISNULL(s.[未发货数量],0)>0 AND ISNULL(s.[库存量],0)>0 ORDER BY s.DocEntry;"
```
样例结果:
```text
DocEntry ItemCode 未发货数量 库存量
2007 24112-011-HY-WF50L 78 27
2011 213-YGLQ-DTFC20C-210 107 85
2248 213-YGLQ-DTFC20C-100 102 85
```
### 查询过程发布
命令:
```powershell
sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -C -b -f 65001 -i db_backups\update_timely_kit_tracking_result_inventory_20260630.sql
```
结果:
- 执行成功。
- 过程 `dbo.生产管理_及时齐套跟踪结果_查询` 已输出 `库存数量`
- 外购采购状态不再拼接 `采购员:`
### 样例过程验证
命令:
```sql
EXEC dbo.[_及时齐套跟踪结果_查询] @=2007;
EXEC dbo.[_及时齐套跟踪结果_查询] @=7321;
```
结果:
- `@订单号=2007` 返回缺件 `24112-011-HY-WF50L`,缺件数量 `78`,库存数量 `27`
- `@订单号=7321` 返回缺件 `XX-YG01013990`,缺件数量 `6`,库存数量 `2`
- 结果列不再包含 `采购员`
- 外购工艺路线/采购状态示例:`未清数量:50 / 到货草稿:11209 / 质检状态:未完成`
### 过程定义检查
命令:
```powershell
sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -C -Q "SELECT CASE WHEN CHARINDEX(N'[库存数量]', OBJECT_DEFINITION(OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询'))) > 0 THEN N'有库存数量' ELSE N'缺库存数量' END AS 库存字段, CASE WHEN CHARINDEX(N'采购员:', OBJECT_DEFINITION(OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询'))) > 0 THEN N'仍拼接采购员' ELSE N'未拼接采购员' END AS 采购员拼接;"
```
结果:
```text
库存字段 采购员拼接
有库存数量 未拼接采购员
```
### 前端构建
命令:
```powershell
npm run build
```
结果:
- 构建通过。
- `webpack 5.103.0 compiled with 2 warnings`
- 警告仍为项目既有资源体积过大和 Browserslist/caniuse-lite 数据过期。
### 无效验证命令说明
- 曾尝试使用 `OPENQUERY([LOCALSERVER], ...)` 做辅助结果集落表验证。
- 数据库未配置 `LOCALSERVER` linked server返回“在 sys.servers 中找不到服务器 'LOCALSERVER'”。
- 该命令不作为验收证据,已用 SAP 取样、过程样例查询和过程定义检查替代。
## 第 5 轮修正验证
### 7134 工艺数据验证
命令:
```sql
SELECT [],[],[],[],[],[],[],[],[],[],[]
FROM dbo.[View_生产订单_MES]
WHERE []=7134 AND []=N'pit_Resource'
ORDER BY [];
SELECT p.[], p.[],
SUM(ISNULL(q.[],0)) AS ,
SUM(ISNULL(q.[],0)) AS
FROM dbo.[View_生产订单_MES] p
LEFT JOIN dbo.[YL_质量检验_质检记录] q
ON q.[TaskAID]=p.[TaskAID] AND q.[]=N'收检'
WHERE p.[]=7134 AND p.[]=N'pit_Resource'
GROUP BY p.[], p.[]
ORDER BY p.[];
```
结果:
```text
订单行号 工序名称 指派对象 加工状态 收检合格数
1 打磨 走手续 6 6
2 打压检测 机械装配 NULL 6
3 喷塑 外协 NULL 0
```
### 判色口径验证
- 生产计划跟踪页面蓝色口径:`加工状态``6``3`,或 `收检合格数 > 0`
- 当前页已改为同口径。
- 本地模拟结果:
```text
step1:process-route-blue,step2:process-route-blue,step3:process-route-red
```
### 构建验证
命令:
```powershell
npm run build
```
结果:
- 构建通过。
- `webpack 5.103.0 compiled with 2 warnings`
- 警告为项目既有资源体积过大和 Browserslist/caniuse-lite 数据过期。
## 第 7 轮修正验证
### 4222 数据来源验证
命令:
```sql
SELECT DocEntry, Project, [], ItemCode, U_Name, [],
[], [], DocNum, []
FROM [SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc]
WHERE DocEntry=4222;
SELECT [], [], [], [], [], []
FROM dbo.[View_生产订单_MES]
WHERE [] IN (5960,7142)
ORDER BY [], [];
```
结果:
- SAP 缺件物料:`22-103-060-YDZF-20V1.0-4.1`
- SAP `DocNum=5960`
- MES 同物料存在生产订单 `5960``7142`
### 查询过程发布
命令:
```powershell
sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -C -b -f 65001 -i db_backups\update_timely_kit_tracking_result_multi_detail_orders_20260630.sql
```
结果:
- 执行成功。
- 自制件 `detail_order` 改为按订单编号去重后返回多条,不再只取 `TOP (1)`
### 4222 查询验证
命令:
```sql
EXEC dbo.[_及时齐套跟踪结果_查询] @=4222;
```
结果:
```text
缺件物料编码 缺件生产订单号
22-103-060-YDZF-20V1.0-4.1 5960
22-103-060-YDZF-20V1.0-4.1 7142
```
- `5960``7142` 均显示。
- 同一生产订单号未重复。
- `5960` 显示完整 13 道工艺路线,`7142` 显示 4 道工艺路线。
## 第 6 轮修正验证
### 查询过程发布
命令:
```powershell
sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -P ****** -C -b -f 65001 -i db_backups\update_timely_kit_tracking_result_purchase_order_20260630.sql
```
结果:
- 执行成功。
- 外购采购状态恢复采购员拼接。
- 未恢复单独采购员结果列。
### 样例验证
命令:
```sql
EXEC dbo.[_及时齐套跟踪结果_查询] @=7321;
```
结果:
- 缺件物料:`XX-YG01013990`
- 缺件属性:`外购`
- 缺件生产订单号:`4111`,来自 SAP `在制采购`
- 工艺路线/采购状态:`采购员:张丹 / 未清数量:50 / 到货草稿:11209 / 质检状态:未完成`
- 预计完成时间:`2026-06-25`,来自 SAP `采购预计交货日期`
### 结果集列验证
命令:
```sql
SELECT column_ordinal, name
FROM sys.dm_exec_describe_first_result_set_for_object(
OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询'), 0
)
WHERE name LIKE N'%采购员%'
OR name IN (N'工艺路线', N'缺件生产订单号', N'预计完成时间');
```
结果:
```text
column_ordinal name
26 缺件生产订单号
28 工艺路线
29 预计完成时间
```
说明:结果集中无单独 `采购员` 列。
### 前端列验证
命令:
```powershell
Select-String -Path src\views\PlanManagement\TimelyKitTrackingResult\index.vue -Pattern '采购员|label="采购员"|prop="采购员"'
```
结果:
- 无匹配。
- 页面不包含单独采购员列。
### 构建验证
命令:
```powershell
npm run build
```
结果:
- 构建通过。
- `webpack 5.103.0 compiled with 2 warnings`
- 警告为项目既有资源体积过大和 Browserslist/caniuse-lite 数据过期。

View File

@@ -71,3 +71,39 @@
- 决策:外购质检状态按 `SAP.到货草稿 -> 质量检验_质检任务_SAP.订单编号 -> YL_质量检验_质检记录` 判断。 - 决策:外购质检状态按 `SAP.到货草稿 -> 质量检验_质检任务_SAP.订单编号 -> YL_质量检验_质检记录` 判断。
- 原因:采购入库检页面的生产订单字段来自 `质量检验_质检任务_SAP.订单编号`,状态由入库数量与来料检验数量决定。 - 原因:采购入库检页面的生产订单字段来自 `质量检验_质检任务_SAP.订单编号`,状态由入库数量与来料检验数量决定。
- 影响:有到货草稿的外购缺件能展示采购入库检口径的未完成/已完成;非外购不显示采购质检状态。 - 影响:有到货草稿的外购缺件能展示采购入库检口径的未完成/已完成;非外购不显示采购质检状态。
## DR-013 库存数量直接来自 SAP 缺件视图
- 决策:二级缺件明细的 `库存数量` 直接取 `[SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc].[库存量]`,过程输出别名为 `库存数量`
- 原因:用户确认“库存数量字段在 SAP 里面有”,实际字段列表也显示缺件视图已有 `库存量`,不需要再 join 其他库存表。
- 影响:库存口径与 SAP 缺件视图保持一致;如果 SAP 后续调整 `库存量` 口径,页面同步变化。
## DR-014 本轮数据库调整使用新日期增量脚本
- 决策:新增 `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`,不覆盖 `create_timely_kit_tracking_result_20260629.sql`
- 原因:昨天的脚本已经作为历史交付和验收证据,新增日期脚本更利于追踪本轮库存字段和采购员拼接变更。
- 影响:后续继续修改过程时优先新增日期脚本或在最新脚本基础上演进,保留历史过程版本。
## DR-015 外购采购状态不再拼接采购员(已废止)
- 决策:外购 `工艺路线/采购状态` 文本只保留采购未清数量、到货草稿、质检状态,不再拼接采购员。
- 原因:用户明确要求“去掉拼接的采购员字段”,且页面已单独去掉采购员列。
- 影响:该决策已被 DR-017 替代。最新口径为恢复采购员拼接,但不恢复单独采购员列。
## DR-016 工艺路线判色与生产计划跟踪一致
- 决策:及时齐套跟踪结果二级工艺路线判色复用生产计划跟踪口径:`加工状态``6``3`,或 `收检合格数 > 0` 时为蓝色;外协在收料数量大于已收检数量时为绿色;`加工状态``2``4` 时为绿色;否则为红色。
- 原因:用户指出 `7134` 在当前页显示一个蓝色两个红色,而生产计划跟踪显示两个蓝色一个红色。差异来自当前页旧逻辑需要进度/完成量满足条件才判蓝,而生产计划跟踪只要有收检合格数就判蓝。
- 影响:`7134` 的“打磨、打压检测、喷塑”将显示为蓝、蓝、红;后续颜色争议以生产计划跟踪页面口径为准。
## DR-017 外购采购员只作为采购状态拼接文本
- 决策:外购 `工艺路线/采购状态` 文本恢复拼接采购员,格式为 `采购员:xxx / 未清数量:xxx / 到货草稿:xxx / 质检状态:xxx`;页面和过程结果集都不提供单独 `采购员` 列。
- 原因:用户明确最新口径为“还原字段拼接采购员部分,不要单独的采购员列”。
- 影响:前端无需新增列;外购采购状态里能看到采购员,导出/接口结果集仍不会出现独立采购员字段。
## DR-018 自制缺件显示所有匹配生产订单
- 决策:属性不为空的自制缺件按 SAP 缺件物料匹配 MES 生产订单时,不再只取 `TOP (1)`;同一缺件物料匹配到的所有生产订单都显示,但同一生产订单号只保留一条。
- 原因用户明确要求“同一个生产订单号不要出现重复同一缺件物料所有匹配生产订单都显示”。4222 的缺件物料同时匹配到 5960 和 7142`TOP (1)` 只能显示其中一个。
- 影响4222 这类同物料多生产订单场景会显示多条二级明细页面已有前端去重SQL 最终层也按 `订单号 + 缺件生产订单号` 去重。

View File

@@ -11,7 +11,17 @@
| `04-任务矩阵.md` | 任务编号、状态、验收标准 | | `04-任务矩阵.md` | 任务编号、状态、验收标准 |
| `05-验收证据.md` | 命令、页面、SQL、构建等证据 | | `05-验收证据.md` | 命令、页面、SQL、构建等证据 |
| `06-决策记录.md` | 关键实现决策与原因 | | `06-决策记录.md` | 关键实现决策与原因 |
| `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql` | 2026-06-30 库存数量和采购员拼接修正增量脚本 |
| `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql` | 2026-06-30 外购生产订单号和采购员拼接当前有效增量脚本 |
| `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql` | 2026-06-30 自制缺件多生产订单显示当前有效增量脚本 |
## 后续推进方式 ## 后续推进方式
后续继续该任务时,先看 `04-任务矩阵.md` 中状态为“待办”或“观察”的任务,再按 `03-推进台账.md` 追加新轮次。涉及数据库口径调整时,新增 `db_backups` 增量脚本,不直接覆盖历史脚本。 后续继续该任务时,先看 `04-任务矩阵.md` 中状态为“待办”或“观察”的任务,再按 `03-推进台账.md` 追加新轮次。涉及数据库口径调整时,新增 `db_backups` 增量脚本,不直接覆盖历史脚本。
## 当前状态
- 2026-06-30 已完成二级缺件明细“库存数量”字段。
- 2026-06-30 已去掉页面单独采购员列;外购采购状态文本保留采购员拼接。
- 2026-06-30 已将二级工艺路线调整为左对齐、红/蓝/绿三色、无橙色。
- 2026-06-30 自制缺件同物料匹配到多个生产订单时全部显示,同一生产订单号只显示一次。

View File

@@ -0,0 +1,27 @@
# 01-项目功能内容
## 页面
- 页面路径:`src/views/ProductionManagement/AGVtask/index.vue`
- 页面模块:生产管理
- 页面功能AGV 任务创建、实时任务查看、历史记录、点位管理。
## 数据来源
- 实时列表:`dbo.生产管理_物料机器人_查询实时数据`
- 实时表:`dbo.AGV_实时数据`
- 历史列表:`dbo.生产管理_物料机器人_查询历史数据`
- 历史表:`dbo.AGV_历史数据`
## 状态口径
- `PENDING`:待执行
- `RUNNING`:执行中
- `FINISHED`:已完成
- `CANCELED`:已取消
## 2026-06-30 处理内容
- 将页面中实时任务状态为 `RUNNING` 的任务全部改为已完成。
- 处理方式不是前端显示替换,而是按现有完成任务口径,将实时任务转入历史表,状态写为 `FINISHED`,并从实时表删除。

View File

@@ -0,0 +1,32 @@
# 02-项目程序开发详细步骤
## 1. 排查页面
1. 读取 `src/views/ProductionManagement/AGVtask/index.vue`
2. 确认实时任务调用 `生产管理_物料机器人_查询实时数据`
3. 确认页面状态映射:`RUNNING` 显示为“执行中”,`FINISHED` 显示为“已完成”。
## 2. 排查数据库
1. 查询 AGV 相关对象。
2. 确认实时表为 `dbo.AGV_实时数据`
3. 确认历史表为 `dbo.AGV_历史数据`
4. 确认完成任务过程 `dbo.生产管理_物料机器人_完成任务` 的逻辑为:
- 插入历史表。
- 从实时表删除。
## 3. 数据处理
1. 查询处理前实时任务状态分布:
- `PENDING`1 条
- `RUNNING`35 条
2. 使用事务将 `RUNNING` 任务写入 `AGV_历史数据`,状态为 `FINISHED`
3.`AGV_实时数据` 删除这些 `RUNNING` 任务。
4. 不处理 `PENDING` 待执行任务。
## 4. 验证
1. 执行 `生产管理_物料机器人_查询实时数据 @状态='RUNNING'`,结果为空。
2. 执行 `生产管理_物料机器人_查询实时数据 @状态=''`,实时表只剩 1 条 `PENDING`
3. 查询最近 5 分钟历史记录,确认新增 `FINISHED` 35 条。

View File

@@ -0,0 +1,44 @@
# 03-推进台账
## 第1轮执行中任务改为已完成
### 用户反馈
- 处理页面 `ProductionManagement/AGVtask/index` 里面任务状态为执行中的数据。
- 都改为已完成。
### 执行过程
1. 读取 `src/views/ProductionManagement/AGVtask/index.vue`
2. 确认实时查询过程为 `dbo.生产管理_物料机器人_查询实时数据`
3. 确认实时表为 `dbo.AGV_实时数据`,历史表为 `dbo.AGV_历史数据`
4. 查询处理前状态分布:`RUNNING` 35 条,`PENDING` 1 条。
5. 使用事务将 `RUNNING` 任务插入 `AGV_历史数据`,状态设为 `FINISHED`
6. 删除实时表中的 `RUNNING` 任务。
7. 验证实时查询 `RUNNING` 为空。
8. 验证实时表仅剩 1 条 `PENDING`
9. 验证历史表最近 5 分钟新增 `FINISHED` 35 条。
### 修改文件
- `work/ProductionManagement/AGVtask/README.md`
- `work/ProductionManagement/AGVtask/01-项目功能内容.md`
- `work/ProductionManagement/AGVtask/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/AGVtask/03-推进台账.md`
- `work/ProductionManagement/AGVtask/04-任务矩阵.md`
- `work/ProductionManagement/AGVtask/05-验收证据.md`
- `work/ProductionManagement/AGVtask/06-决策记录.md`
- `gptlog-process/gpdlog.md`
- `C:\gptlog-process\gpdlog.md`
### 验证结果
- 已转历史数量35。
- `RUNNING` 实时任务0。
- 实时表剩余:`PENDING` 1 条。
- 历史表最近 5 分钟 `FINISHED`35 条。
### 下一步
- 页面刷新实时任务,确认执行中列表为空。

View File

@@ -0,0 +1,11 @@
# 04-任务矩阵
| 任务编号 | 任务名称 | 状态 | 验收标准 |
| --- | --- | --- | --- |
| AGV-001 | 定位页面数据来源 | 已完成 | 确认实时列表使用 `生产管理_物料机器人_查询实时数据` |
| AGV-002 | 定位状态表 | 已完成 | 确认实时表 `AGV_实时数据`、历史表 `AGV_历史数据` |
| AGV-003 | 执行中转已完成 | 已完成 | 35 条 `RUNNING` 任务转为历史 `FINISHED` |
| AGV-004 | 保留待执行 | 已完成 | `PENDING` 任务未处理,实时表仍保留 1 条 |
| AGV-005 | 验证实时列表 | 已完成 | 查询 `RUNNING` 为空 |
| AGV-006 | 文档和日志 | 已完成 | README、01-06 文档和两处 `gpdlog.md` 已更新 |

View File

@@ -0,0 +1,58 @@
# 05-验收证据
## 处理前状态
```sql
SELECT TaskStatus, COUNT(*) AS
FROM dbo.AGV_实时数据
GROUP BY TaskStatus;
```
结果:
```text
PENDING 1
RUNNING 35
```
## 执行处理
处理方式:
```text
将 dbo.AGV_实时数据 中 TaskStatus='RUNNING' 的任务插入 dbo.AGV_历史数据TaskStatus 写为 FINISHED
随后删除实时表中的 RUNNING 任务。
```
结果:
```text
已转历史数量 = 35
```
## 处理后验证
实时查询:
```sql
EXEC dbo.[_物料机器人_查询实时数据] @AGV编号=N'', @=N'RUNNING';
```
结果:
```text
无 RUNNING 数据。
```
实时表剩余:
```text
PENDING 1
```
历史表最近 5 分钟:
```text
FINISHED 35
```

View File

@@ -0,0 +1,14 @@
# 06-决策记录
## DR-001 执行中任务按完成流程转入历史表
- 日期2026-06-30
- 决策:将 `AGV_实时数据.TaskStatus='RUNNING'` 的任务插入 `AGV_历史数据`,状态写为 `FINISHED`,然后从实时表删除。
- 原因:页面已有完成任务过程也是“写历史表 + 删除实时表”的口径,直接把实时表状态改成 `FINISHED` 会让已完成任务继续出现在实时列表中,不符合页面现有设计。
## DR-002 不处理待执行任务
- 日期2026-06-30
- 决策:只处理 `RUNNING`,不处理 `PENDING`
- 原因:用户要求处理“执行中”的数据,待执行任务不属于本次范围。

View File

@@ -0,0 +1,19 @@
# AGV任务 README 索引
## 文档清单
- `01-项目功能内容.md`:记录页面、数据来源和状态口径。
- `02-项目程序开发详细步骤.md`:记录本次数据处理步骤。
- `03-推进台账.md`:记录每轮做了什么、改了哪些文件、验证了什么、下一步是什么。
- `04-任务矩阵.md`:记录任务编号、状态、验收标准。
- `05-验收证据.md`:记录命令、表、过程和结果证据。
- `06-决策记录.md`:记录关键处理口径。
## 当前状态
- 页面路径:`src/views/ProductionManagement/AGVtask/index.vue`
- 实时数据过程:`dbo.生产管理_物料机器人_查询实时数据`
- 实时表:`dbo.AGV_实时数据`
- 历史表:`dbo.AGV_历史数据`
- 本次处理:将实时表中 `TaskStatus='RUNNING'` 的 35 条任务转入历史表,状态改为 `FINISHED`

View File

@@ -0,0 +1,154 @@
# 01-项目功能内容
## 一、模块目标
新增一套独立的设计报工任务模块,用于记录研发/设计类任务、人员报工、工时校验和工时报表。
该模块不参与现有生产报工体系,不上传 SAP不影响现有工时校验、生产计划、装配中心、机加工、作业者工时等既有功能。
## 二、页面范围
### 1. 设计任务页面
功能:
- 查询过滤。
- 新建任务。
- 编辑任务。
- 删除任务。
查询条件:
- 任务ID。
- 项目号。
- 物料编码。
- 图号。
- 关联父件物料编码。
- 预计开始时间。
- 预计结束时间。
- 单据状态。
字段:
- DID唯一序号自增新建时不可见编辑时不可修改。
- 项目号:下拉选择,可搜索;具体 SAP 视图字段后续提供。
- 物料编码:下拉选择,可搜索,参考 `ProcessManagement/PartDrawlook/index.vue` 的物料编码过滤。
- 图号:文本框输入。
- 任务描述:文本框输入。
- 关联父件物料编码:下拉选择,可搜索,参考 `ProcessManagement/PartDrawlook/index.vue` 的物料编码过滤。
- 设计要求:文本框输入。
- 研发立项号:文本框输入。
- 研发目的:文本框输入。
- 指派对象:按二次派工口径支持多人员选择,参考 `PlanManagement/SelfMakePlando/index.vue`落库保存人员ID列表和人员名称列表。
- 预计开始时间:日期选择器。
- 预计结束时间:日期选择器。
- 创建日期:系统创建时间;新建时不可见,编辑时不可修改。
- 单据状态:待开始、执行中、已结束、已完成。
删除约束:
- 如果任务已经存在设计报工记录,不能删除。
- 如果任务没有报工记录,允许删除。
### 2. 设计报工页面
字段显示和设计任务页面基本一致。
过滤条件和设计任务页面基本一致。
页面功能:
- 开始。
- 结束。
- 完成。
业务规则:
- 开始:生成设计报工记录,记录开始时间、操作人和任务状态。
- 结束:补写结束时间,计算本次设计工时。
- 完成:必须已有结束时间;未结束不能完成。
- 完成后代表设计任务完成,任务状态变更为已完成。
- 已完成任务不允许再次开始或结束。
### 3. 设计工时校验页面
参考页面:`ProductionManagement/WorkHoursCheck/index.vue`
业务规则:
- 数据来源只取设计报工记录。
- 校验后只写入设计报工独立表或独立校验记录表。
- 不上传 SAP。
- 不调用现有生产工时校验的 SAP 上传逻辑。
### 4. 设计工时报表页面
参考页面:`ProductionManagement/Workhours/index.vue` 的作业者工时/工序工时展示方式。
业务规则:
- 数据来源只取设计报工记录。
- 可按人员、任务、项目号、物料编码、日期汇总设计工时。
- 不合并到现有作业者工时统计。
## 三、建议数据表
### 1. `MES_设计报工_任务`
用途:存储设计任务主数据。
建议字段:
- DID。
- 项目号。
- 物料编码。
- 图号。
- 任务描述。
- 关联父件物料编码。
- 设计要求。
- 研发立项号。
- 研发目的。
- 指派对象ID。
- 指派对象。
- 预计开始时间。
- 预计结束时间。
- 单据状态。
- 创建日期。
- 创建人。
- 最后编辑人。
- 最后编辑时间。
### 2. `MES_设计报工_记录`
用途:存储设计报工开始、结束和工时数据。
建议字段:
- RID。
- DID。
- 操作人ID。
- 操作人。
- 开始时间。
- 结束时间。
- 工时秒数。
- 报工状态。
- 已校验。
- 校验人。
- 校验时间。
- 创建时间。
- 备注。
### 3. `MES_设计报工_校验记录`
用途:保留校验动作流水,便于审计。
建议字段:
- VID。
- RID。
- DID。
- 校验前开始时间。
- 校验前结束时间。
- 校验后开始时间。
- 校验后结束时间。
- 校验后工时秒数。
- 校验人。
- 校验时间。
- 校验备注。
## 四、独立性要求
- 不写入现有生产报工表。
- 不写入现有生产工时校验表。
- 不上传 SAP。
- 不参与现有生产工时报表。
- 不影响装配中心、机加工、自制件排产、生产订单关闭逻辑。

View File

@@ -0,0 +1,55 @@
# 02-项目程序开发详细步骤
## 一、数据库开发
1. 新建独立数据表:
- `MES_设计报工_任务`
- `MES_设计报工_记录`
- 可选 `MES_设计报工_校验记录`
2. 新建设计任务增删改查存储过程:
- `设计报工_任务_查询`
- `设计报工_任务_新增`
- `设计报工_任务_编辑`
- `设计报工_任务_删除`
3. 删除过程增加约束:
- 存在 `MES_设计报工_记录` 时禁止删除。
4. 新建设计报工过程:
- `设计报工_任务_开始`
- `设计报工_任务_结束`
- `设计报工_任务_完成`
5. 完成过程增加约束:
- 必须存在结束时间。
- 未结束不能完成。
6. 新建设计工时校验过程:
- `设计报工_工时校验_查询`
- `设计报工_工时校验_保存`
- `设计报工_工时校验_批量保存`
7. 新建设计工时报表过程:
- `设计报工_工时报表_作业者工时_查询`
- 可按后续页面需要增加导出过程。
## 二、前端开发
1. 新建设计任务页面。
2. 新建设计报工页面。
3. 新建设计工时校验页面。
4. 新建设计工时报表页面。
5. 按系统菜单权限新增菜单记录。
6. 物料编码、关联父件物料编码下拉查询参考 `ProcessManagement/PartDrawlook/index.vue`
7. 指派对象多人员选择参考 `PlanManagement/SelfMakePlando/index.vue` 的二次派工。
8. 工时校验布局参考 `ProductionManagement/WorkHoursCheck/index.vue`,但移除 SAP 上传相关逻辑。
9. 工时报表布局参考 `ProductionManagement/Workhours/index.vue`,但查询独立设计报工表。
## 三、验证步骤
1. 新建一条设计任务,确认 DID 和创建日期自动生成。
2. 编辑设计任务,确认 DID 和创建日期不可修改。
3. 未报工任务可删除。
4. 已存在报工记录任务不可删除。
5. 点击开始后生成报工记录。
6. 未结束时点击完成,应提示不能完成。
7. 点击结束后生成结束时间和工时秒数。
8. 已结束后点击完成,任务变为已完成。
9. 已完成任务不能再次开始或结束。
10. 校验页面只更新设计报工数据,不触发 SAP 上传。
11. 报表页面只展示设计报工工时,不混入现有生产报工数据。

View File

@@ -0,0 +1,36 @@
# 03-推进台账
## 2026-06-30 方案梳理
### 做了什么
- 读取 `doc/设计报工任务模块.docx`
- 梳理设计任务、设计报工、设计工时校验、设计工时报表四个页面。
- 对照参考页面:
- `ProcessManagement/PartDrawlook/index.vue`
- `PlanManagement/SelfMakePlando/index.vue`
- `ProductionManagement/WorkHoursCheck/index.vue`
- `ProductionManagement/Workhours/index.vue`
### 改了哪些文件
- `doc/设计报工任务模块.docx`
- `work/ProductionManagement/DesignReportTask/README.md`
- `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`
- `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/DesignReportTask/03-推进台账.md`
- `work/ProductionManagement/DesignReportTask/04-任务矩阵.md`
- `work/ProductionManagement/DesignReportTask/05-验收证据.md`
- `work/ProductionManagement/DesignReportTask/06-决策记录.md`
- `gptlog-process/gpdlog.md`
- `C:\gptlog-process\gpdlog.md`
### 验证了什么
- 文档中明确要求新建独立设计报工体系。
- 用户确认:
- 项目号 SAP 视图字段后续提供。
- 完成必须已有结束时间,未结束不能完成。
- 已有报工记录的任务不能删除。
- 不参与之前任何生产/SAP/工时报表流程,完全独立。
### 下一步
- 等待项目号 SAP 视图字段。
- 开始数据库脚本和页面开发。

View File

@@ -0,0 +1,14 @@
# 04-任务矩阵
| 任务编号 | 任务内容 | 状态 | 验收标准 |
| --- | --- | --- | --- |
| DRT-001 | 读取原始 Word 文档 | 已完成 | 已提取字段、页面和业务要求 |
| DRT-002 | 梳理设计任务页面方案 | 已完成 | 字段、查询、新建、编辑、删除规则明确 |
| DRT-003 | 梳理设计报工页面方案 | 已完成 | 开始、结束、完成规则明确 |
| DRT-004 | 梳理设计工时校验方案 | 已完成 | 明确不上传 SAP只校验独立数据 |
| DRT-005 | 梳理设计工时报表方案 | 已完成 | 明确只查询设计报工数据 |
| DRT-006 | 确认完成规则 | 已完成 | 必须已有结束时间,未结束不能完成 |
| DRT-007 | 确认删除规则 | 已完成 | 有报工记录不能删除 |
| DRT-008 | 确认独立性 | 已完成 | 不参与现有任何生产/SAP/工时报表流程 |
| DRT-009 | 确认项目号来源 | 待确认 | 业务提供 SAP 视图和字段 |
| DRT-010 | 数据库和页面开发 | 待开始 | 表、过程、页面、菜单发布并验证 |

View File

@@ -0,0 +1,41 @@
# 05-验收证据
## 文档读取
来源:
```text
doc/设计报工任务模块.docx
```
读取结果摘要:
```text
新增设计任务页面。
新建设计报工界面。
新建设计工时校验。
新建设计工时报表。
新建表存储设计报工信息,和其他报工不产生影响。
```
## 用户确认口径
```text
项目号具体取哪个 SAP 视图字段后续提供。
完成要求已有结束时间,未结束不能完成。
删除任务时,如果已经有报工记录,不能删除。
不参与之前的任何东西,独立的。
```
## 参考页面
```text
src/views/ProcessManagement/PartDrawlook/index.vue
src/views/PlanManagement/SelfMakePlando/index.vue
src/views/ProductionManagement/WorkHoursCheck/index.vue
src/views/ProductionManagement/Workhours/index.vue
```
## 验收结论
当前为方案文档阶段,尚未开发代码和数据库脚本。
方案可进入开发,但需要先补齐项目号 SAP 视图字段来源。

View File

@@ -0,0 +1,54 @@
# 06-决策记录
## DDR-001 独立设计报工体系
决策:设计任务、设计报工记录、设计工时校验、设计工时报表全部使用独立表和独立存储过程。
原因:用户明确要求“和其他报工不产生影响”“不参与之前的任何东西,独立的”。
影响:
- 不写入现有生产报工表。
- 不上传 SAP。
- 不参与现有工时报表。
- 不影响生产订单关闭、装配中心、机加工等既有逻辑。
## DDR-002 完成必须先结束
决策:设计任务点击完成前,必须已有结束时间。
原因:完成代表任务闭环,未结束时无法计算完整工时。
影响:
- 未结束点击完成时,页面提示不能完成。
- 后端过程也必须校验,不能只依赖前端。
## DDR-003 有报工记录不能删除任务
决策:设计任务如果已经有报工记录,禁止删除。
原因:避免删除主任务造成工时记录失去归属。
影响:
- 删除过程需要先检查设计报工记录表。
- 后续如需撤销,只能增加作废状态,不做物理删除。
## DDR-004 项目号来源待业务提供
决策项目号字段暂保留为可搜索下拉SAP 视图和字段来源后续补充。
原因:用户确认项目号具体 SAP 视图字段后续提供。
影响:
- 开发时可先预留过程参数和前端控件。
- 项目号下拉过程需等字段来源明确后实现。
## DDR-005 指派对象按多人派工预留
决策:指派对象按 `PlanManagement/SelfMakePlando/index.vue` 二次派工口径支持多人员选择保存人员ID列表和名称列表。
原因:原文要求参考二次派工,且设计任务常见多人协作。
影响:
- 前端使用多选人员下拉。
- 数据库建议同时保存人员ID列表和人员名称列表。
- 如果后续业务确认只允许单人,可收窄为单选,不影响表结构扩展。

View File

@@ -0,0 +1,17 @@
# 设计报工任务模块 README 索引
## 文档清单
- `01-项目功能内容.md`:记录模块目标、页面范围、字段和业务口径。
- `02-项目程序开发详细步骤.md`:记录后续开发落地步骤。
- `03-推进台账.md`:记录每轮做了什么、改了哪些文件、验证了什么、下一步是什么。
- `04-任务矩阵.md`:记录任务编号、状态和验收标准。
- `05-验收证据.md`:记录文档读取、方案确认和后续开发验证证据。
- `06-决策记录.md`:记录已确认的关键设计决策。
## 当前状态
- 来源文档:`doc/设计报工任务模块.docx`
- 当前阶段:方案梳理与文档修订。
- 核心原则设计报工任务、设计报工记录、设计工时校验、设计工时报表全部独立不参与现有生产报工、SAP 上传、生产工时校验和既有工时报表。
- 待确认项:`项目号` 的 SAP 视图和字段来源由业务后续提供。

View File

@@ -0,0 +1,55 @@
# 01-项目功能内容
## 页面
- 页面名称:产品合格率(工位)
- 页面路径:`src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- 菜单模块:生产管理
## 数据范围
1. 只统计生产订单已关闭的数据。
2. 已关闭判断来自 SAP 视图 `[SAP].[SBO_YL].[dbo].[UBT_OWOR]``单据状态 IS NOT NULL`
3. 关闭日期取 `[SAP].[SBO_YL].[dbo].[UBT_OWOR].[实际结算日期]`
4. 生产过程质检明细取 `dbo.YL_质量检验_质检记录`
5. 二级明细按生产订单、工序号、工序、工位汇总。
## 一级字段
- 关闭日期
- 生产订单号
- 物料名称
- 物料编码
- 计划数量
- 完成数量:二级完成数量合计
- 不良数量:二级不良数量合计
- 合格率:按截图口径计算为 `(完成数量 - 不良数量) / 完成数量`
## 二级字段
- 工序
- 工序号:`dbo.MES_接口_生产计划_生产任务.订单行号`
- 工位:质检记录 `工位名称`,为空时补 `View_生产订单_MES.指派对象`,仍为空显示 `空白`
- 完成数量:按订单行号、工序、工位汇总 `检验数量`
- 不良数量:按订单行号、工序、工位汇总 `不合格数`
- 合格率:`(完成数量 - 不良数量) / 完成数量`
- 检验说明:同组多条说明用 `` 并列显示
## 查询条件
- 关闭日期范围,页面默认近 30 天
- 生产订单号
- 物料编码
- 物料名称
- 工序
- 工位
- 合格状态:不合格、合格、全部;页面默认不合格
## 2026-06-30 补充口径
1. 页面进入时默认不查询数据,避免打开页面直接加载报表。
2. 查询条件新增“合格状态”。
3. 合格状态默认值为“不合格”。
4. 主数据合格率小于 `100` 判定为“不合格”,大于等于 `100` 判定为“合格”。
5. 关闭日期筛选拆成“关闭日期起”和“关闭日期止”两个独立日期框,降低误操作。
6. 二级工序号固定从 `dbo.MES_接口_生产计划_生产任务.订单行号` 读取,关联关系为 `YL_质量检验_质检记录.TaskAID = MES_接口_生产计划_生产任务.AID`

View File

@@ -0,0 +1,51 @@
# 02-项目程序开发详细步骤
## 1. 需求解析
1. 解包并读取 `doc/新增产品合格率.docx`
2. 确认新增页面为“产品合格率(工位)”,放在生产管理模块下。
3. 确认一级数据只计算已关闭生产订单。
4. 确认二级数据按订单行号、工序、工位汇总完成数量、不良数量和检验说明。
## 2. 数据库开发
1. 新增 `db_backups/create_product_pass_rate_workstation_20260630.sql`
2. 创建或更新查询过程 `dbo.生产管理_产品合格率工位_查询`
3. 参数包括生产订单号、物料编码、物料名称、关闭日期起止、工序、工位。
4. 使用 `OPENQUERY([SAP], ...)` 读取 `SBO_YL.dbo.UBT_OWOR`,将 SAP 已关闭订单先写入本地临时表。
5. 使用 `YL_质量检验_质检记录` 汇总生产过程质检数据。
6. 使用 `View_生产订单_MES` 补齐订单行号、工序和指派对象。
7. 输出一级汇总和 `明细JSON`,前端展开行解析 JSON 展示二级数据。
8. 空条件查询自动限定近 30 天,避免页面默认打开时全量扫描。
9. 2026-06-30 按用户反馈修正工序号来源:改为连接 `dbo.MES_接口_生产计划_生产任务`,通过 `YL_质量检验_质检记录.TaskAID = MES_接口_生产计划_生产任务.AID` 读取 `订单行号`
## 3. 菜单开发
1. 新增 `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`
2. 菜单标题:`产品合格率(工位)`
3. 路由:`ProductPassRateWorkstation/index`
4. 组件:`/ProductionManagement/ProductPassRateWorkstation/index`
5. 权限来源参考已有“生产计划跟踪”,写入生产管理模块下。
## 4. 前端开发
1. 新增页面 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
2. 查询区提供关闭日期、生产订单、物料编码、物料名称、工序、工位。
3. 主表展示一级汇总字段。
4. 使用展开行展示二级明细。
5. 合格率按 100%、90%-99.99%、低于 90% 显示不同颜色。
6. 默认关闭日期范围为近 30 天。
7. 2026-06-30 页面去掉 `created()` 自动查询,进入页面后先显示空表。
8. 2026-06-30 查询区新增“合格状态”,默认 `不合格`,查询时传入存储过程参数 `合格状态`
9. 2026-06-30 将关闭日期范围控件拆成两个独立日期控件,分别传入 `关闭日期_Start``关闭日期_End`
## 5. 验证
1. 发布查询过程成功。
2. 发布菜单脚本成功,写入 `12` 条角色菜单记录。
3. 验证 `@生产订单号=N'7649'` 能返回一级汇总和二级明细。
4. 验证近 7 天查询返回 `175` 行,耗时约 `0.37` 秒。
5. 验证空条件自动限定近 30 天,返回 `1420` 行,耗时约 `1.17` 秒。
6. 执行 `npm run build`,构建通过,只有项目既有资源体积和 browserslist 警告。
7. 2026-06-30 验证近 30 天 `不合格` 返回 `50` 行,最高合格率 `99.99``合格` 返回 `1370` 行;`全部` 返回 `1420` 行。
8. 2026-06-30 拆分关闭日期控件后执行 `npm run build`,构建通过。

View File

@@ -0,0 +1,176 @@
# 03-推进台账
## 第1轮新增产品合格率(工位)页面
### 用户反馈
- 查看 `doc/新增产品合格率.docx`
- 根据文档新增页面“产品合格率(工位)”。
### 执行过程
1. 解包 `doc/新增产品合格率.docx`,读取文字和截图。
2. 确认页面放在生产管理下面。
3. 确认 SAP 关闭日期来源为 `SBO_YL.dbo.UBT_OWOR.实际结算日期`
4. 查询 `YL_质量检验_质检记录` 字段,确认生产订单号为 `计划号`,订单行号为 `行号`,工位字段为 `工位名称`
5. 新增查询过程脚本 `db_backups/create_product_pass_rate_workstation_20260630.sql`
6. 初版跨库四段名查询较慢,改为 `OPENQUERY([SAP], ...)` 先取 SAP 已关闭订单到本地临时表。
7. 新增菜单脚本 `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`
8. 新增前端页面 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
9. 发布查询过程和菜单脚本。
10. 执行数据库样例验证和 `npm run build`
### 修改文件
- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`
- `work/ProductionManagement/ProductPassRateWorkstation/README.md`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md`
- `gptlog-process/gpdlog.md`
- `C:\gptlog-process\gpdlog.md`
### 验证结果
- 查询过程发布成功。
- 菜单脚本发布成功,生产管理下新增 `产品合格率(工位)`
- 样例 `7649` 返回一级汇总和二级明细。
- `npm run build` 通过。
### 下一步
- 登录页面确认菜单可见,并检查展开行明细展示是否符合现场习惯。
## 第2轮默认不查询并新增合格状态筛选
### 用户反馈
- 默认进来不查询数据。
- 增加“合格”和“不合格”筛选。
- 主数据合格率小于 `100` 的为不合格。
- 默认不合格。
### 执行过程
1. 修改 `db_backups/create_product_pass_rate_workstation_20260630.sql`,新增参数 `@合格状态`,默认 `不合格`
2. 查询过程最终输出前按主数据合格率筛选:
- `合格`:合格率大于等于 `100`
- `不合格`:合格率小于 `100`
- `全部`:不过滤。
3. 修改 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- 删除页面 `created()` 自动查询。
- 查询区新增“合格状态”下拉。
- 默认值设为 `不合格`
- 查询时传入 `合格状态` 参数。
4. 发布查询过程成功。
5. 验证近 30 天 `不合格``合格``全部` 三种筛选。
6. 执行 `npm run build`,构建通过。
### 修改文件
- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `work/ProductionManagement/ProductPassRateWorkstation/README.md`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md`
- `gptlog-process/gpdlog.md`
- `C:\gptlog-process\gpdlog.md`
### 验证结果
- 近 30 天 `不合格` 返回 `50` 行,合格率范围 `66.67``99.99`
- 近 30 天 `合格` 返回 `1370` 行,合格率均为 `100.00`
- 近 30 天 `全部` 返回 `1420` 行。
- `npm run build` 通过,仅有项目既有 warning。
### 下一步
- 登录页面确认初始为空表,点击查询后按默认不合格返回数据。
## 第3轮关闭日期筛选拆分
### 用户反馈
- 关闭日期筛选拆成两个筛选。
- 客户不习惯一次选两个日期。
### 执行过程
1. 修改 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
2. 将原 `daterange` 日期范围控件拆成两个 `date` 日期控件。
3. 新增 `searchForm.closeDateStart``searchForm.closeDateEnd`
4. 查询时仍传入原有参数 `关闭日期_Start``关闭日期_End`,数据库过程无需修改。
5. 执行 `npm run build`,构建通过。
### 修改文件
- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `gptlog-process/gpdlog.md`
- `C:\gptlog-process\gpdlog.md`
### 验证结果
- `npm run build` 通过,仅有项目既有 warning。
- 前端继续使用 `关闭日期_Start``关闭日期_End` 参数,数据库过程无需重新发布。
### 下一步
- 登录页面确认两个日期框更符合客户操作习惯。
## 第4轮修正二级工序号来源
### 用户反馈
- 工序号为什么都是空。
- 工序号应取表 `dbo.MES_接口_生产计划_生产任务.订单行号`
- 该表中订单行号肯定不会为空。
### 执行过程
1. 查询 `dbo.MES_接口_生产计划_生产任务` 字段,确认存在 `AID``订单编号``订单行号``工序名称``指派对象`
2. 查询样例 `7649``7002``7280``7410`,确认 `MES_接口_生产计划_生产任务.订单行号` 有值。
3. 定位原脚本中工序号来源为 `COALESCE(View_生产订单_MES.订单行号, 质检记录.行号)`
4. 确认质检记录的 `TaskAID` 对应生产任务表的 `AID`
5. 修改 `db_backups/create_product_pass_rate_workstation_20260630.sql`
- 将明细补充表从 `View_生产订单_MES` 改为 `MES_接口_生产计划_生产任务`
- 关联条件改为 `q.TaskAID = t.AID`
- 工序号改为 `COALESCE(t.订单行号, q.行号)`
6. 发布查询过程成功。
7. 验证 `7649` 二级工序号为 `1``2``3`
8. 验证近 30 天 `3281` 条二级明细中空工序号为 `0`
### 修改文件
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md`
- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md`
- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md`
- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md`
- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md`
- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md`
- `gptlog-process/gpdlog.md`
- `C:\gptlog-process\gpdlog.md`
### 验证结果
- 过程 `dbo.生产管理_产品合格率工位_查询` 发布成功,修改时间 `2026-06-30 15:12:24.840`
- 样例 `7649` 返回:领料 1、数车 2、打磨 3。
- 近 30 天二级明细空工序号行数为 `0`
### 下一步
- 页面展开二级明细确认工序号列不再为空。

View File

@@ -0,0 +1,15 @@
# 04-任务矩阵
| 任务编号 | 任务名称 | 状态 | 验收标准 |
| --- | --- | --- | --- |
| PPRW-001 | 需求文档解析 | 已完成 | 读取 docx 文字和截图,确认字段和数据源 |
| PPRW-002 | 查询过程开发 | 已完成 | `dbo.生产管理_产品合格率工位_查询` 发布成功 |
| PPRW-003 | 查询性能优化 | 已完成 | SAP 数据通过 `OPENQUERY` 下推过滤,近 7 天查询约 `0.37` 秒 |
| PPRW-004 | 菜单脚本开发 | 已完成 | 生产管理下新增 `产品合格率(工位)`,写入 12 条角色菜单记录 |
| PPRW-005 | 前端页面开发 | 已完成 | 页面新增主表、展开二级明细和查询条件 |
| PPRW-006 | 构建验证 | 已完成 | `npm run build` 通过 |
| PPRW-007 | 文档与日志 | 已完成 | README、01-06 文档和两处 `gpdlog.md` 已更新 |
| PPRW-008 | 默认不自动查询 | 已完成 | 页面进入后不调用查询过程,表格初始为空 |
| PPRW-009 | 合格状态筛选 | 已完成 | 默认不合格,合格率小于 `100` 为不合格,大于等于 `100` 为合格 |
| PPRW-010 | 关闭日期拆分 | 已完成 | 页面使用“关闭日期起”和“关闭日期止”两个独立日期框 |
| PPRW-011 | 修正工序号来源 | 已完成 | 二级工序号从 `MES_接口_生产计划_生产任务.订单行号` 读取,近 30 天空工序号为 0 |

View File

@@ -0,0 +1,137 @@
# 05-验收证据
## 数据库发布
```powershell
$env:SQLCMDPASSWORD='******'
sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -C -l 30 -b -f 65001 -i 'db_backups\create_product_pass_rate_workstation_20260630.sql'
sqlcmd -S 192.168.2.92 -d YL_MESDB -U sa -C -l 30 -b -f 65001 -i 'db_backups\add_product_pass_rate_workstation_menu_20260630.sql'
Remove-Item Env:SQLCMDPASSWORD
```
结果:
```text
已将数据库上下文更改为 "YL_MESDB"。
```
## 存储过程验证
```sql
SELECT OBJECT_NAME(object_id) AS procedure_name, modify_date
FROM sys.objects
WHERE object_id=OBJECT_ID(N'dbo.生产管理_产品合格率工位_查询');
```
结果:
```text
生产管理_产品合格率工位_查询 2026-06-30 14:31:00.690
```
## 样例订单
```sql
EXEC dbo.[_产品合格率工位_查询] @=N'7649';
```
结果要点:
| 生产订单号 | 关闭日期 | 物料编码 | 计划数量 | 完成数量 | 不良数量 | 合格率 |
| --- | --- | --- | --- | --- | --- | --- |
| 7649 | 2026-06-30 | 22-100-021-YQZF-20V2.0-8-08 | 10.0000 | 30.0000 | 0.0000 | 100.00 |
二级明细包括:
- 打磨 / 打磨 / 完成数量 10
- 领料 / 空白 / 完成数量 10
- 数车 / 空白 / 完成数量 10
## 性能验证
```text
近 7 天查询175 行ElapsedSeconds=0.37。
空条件查询:自动限定近 30 天1420 行ElapsedSeconds=1.17。
```
## 前端构建
```powershell
npm run build
```
结果:
```text
webpack 5.103.0 compiled with 2 warnings
```
说明warnings 为项目既有资源体积和 browserslist/caniuse-lite 过期提示。
## 工序号来源修正验证
工序号来源:
```text
dbo.YL_质量检验_质检记录.TaskAID = dbo.MES_接口_生产计划_生产任务.AID
工序号 = dbo.MES_接口_生产计划_生产任务.订单行号
```
样例 `7649`
| 生产订单号 | 工序 | 工序号 | 工位 | 完成数量 | 不良数量 | 合格率 |
| --- | --- | --- | --- | --- | --- | --- |
| 7649 | 领料 | 1 | 领料 | 10.0000 | 0.0000 | 100.00 |
| 7649 | 数车 | 2 | 数2 | 10.0000 | 0.0000 | 100.00 |
| 7649 | 打磨 | 3 | 打磨 | 10.0000 | 0.0000 | 100.00 |
近 30 天检查:
```text
明细行数=3281空工序号行数=0。
```
## 合格状态筛选验证
```sql
EXEC dbo.[_产品合格率工位_查询]
@_Start=N'2026-06-01',
@_End=N'2026-06-30',
@=N'不合格';
```
结果要点:
```text
不合格50 行,最低合格率 66.67,最高合格率 99.99。
合格1370 行,最低合格率 100.00,最高合格率 100.00。
全部1420 行,最低合格率 66.67,最高合格率 100.00。
```
页面验证点:
- 页面进入时不自动调用查询,表格初始为空。
- 合格状态下拉默认值为 `不合格`
## 关闭日期拆分验证
页面调整:
```text
关闭日期范围控件已拆成两个独立日期框:开始日期、结束日期。
查询参数仍为 关闭日期_Start 和 关闭日期_End。
```
构建:
```powershell
npm run build
```
结果:
```text
webpack 5.103.0 compiled with 2 warnings
```
说明warnings 为项目既有资源体积和 browserslist/caniuse-lite 过期提示。

View File

@@ -0,0 +1,44 @@
# 06-决策记录
## DR-001 合格率按截图口径计算
- 日期2026-06-30
- 决策:合格率按 `(完成数量 - 不良数量) / 完成数量` 计算。
- 原因:文档文字写“合格率:不良数量/完成数量”,但截图中 `完成数量=6``不良数量=1` 显示 `83.33%`,实际对应 `(6-1)/6`
## DR-002 二级只统计生产过程质检
- 日期2026-06-30
- 决策:二级明细当前统计 `质检类型 = 收检` 的生产过程记录,不混入来料检验和退库检验。
- 原因:同一生产订单号可能存在来料检验记录,例如样例数据中来料检验数量远大于生产计划数量,混入会导致产品工位合格率失真。
## DR-003 使用 OPENQUERY 优化 SAP 视图读取
- 日期2026-06-30
- 决策:查询过程通过 `OPENQUERY([SAP], ...)` 读取 `SBO_YL.dbo.UBT_OWOR`,并将日期、生产订单条件下推到 SAP。
- 原因:直接四段名查询在日期范围内仍然约 44 秒;改为 `OPENQUERY` 后近 7 天约 0.37 秒。
## DR-004 空条件自动限定近 30 天
- 日期2026-06-30
- 决策:当未传关闭日期且未传生产订单号时,存储过程自动查询近 30 天。
- 原因:避免页面默认打开触发历史全量扫描,同时前端也默认近 30 天,前后端口径一致。
## DR-005 页面进入不自动查询
- 日期2026-06-30
- 决策:前端页面删除 `created()` 自动查询,进入页面先显示空表。
- 原因:用户明确要求默认进来不查询数据。
## DR-006 合格状态按主数据合格率判断
- 日期2026-06-30
- 决策:主数据合格率小于 `100` 判定为不合格,大于等于 `100` 判定为合格。
- 原因用户明确要求“主数据合格率小于100的为不合格”默认筛选不合格。
## DR-007 工序号以生产任务表为准
- 日期2026-06-30
- 决策:二级工序号从 `dbo.MES_接口_生产计划_生产任务.订单行号` 读取。
- 关联:`dbo.YL_质量检验_质检记录.TaskAID = dbo.MES_接口_生产计划_生产任务.AID`
- 原因:用户确认生产任务表的 `订单行号` 是明确来源,原逻辑依赖视图和质检记录行号,部分记录会为空。

View File

@@ -0,0 +1,22 @@
# 产品合格率(工位) README 索引
## 文档清单
- `01-项目功能内容.md`:记录页面、字段、数据源和计算口径。
- `02-项目程序开发详细步骤.md`:记录数据库、菜单、前端开发和验证步骤。
- `03-推进台账.md`:记录每轮做了什么、改了哪些文件、验证了什么、下一步是什么。
- `04-任务矩阵.md`:记录任务编号、状态、验收标准。
- `05-验收证据.md`:记录命令、页面、数据库对象和样例输出。
- `06-决策记录.md`:记录关键口径和原因,避免后续重复争论。
## 当前状态
- 页面路径:`src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`
- 菜单标题:`产品合格率(工位)`
- 菜单模块:生产管理
- 查询过程:`dbo.生产管理_产品合格率工位_查询`
- 数据库脚本:
- `db_backups/create_product_pass_rate_workstation_20260630.sql`
- `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`
- 原始需求文档:`doc/新增产品合格率.docx`
- 当前补充口径:页面进入时不自动查询;合格状态默认 `不合格`,主数据合格率小于 `100` 判定为不合格。