feat: 完善设计报工及生产管理功能

This commit is contained in:
2026-07-22 14:50:28 +08:00
parent 8fdd0b6803
commit f16fb81ed8
15 changed files with 1977 additions and 33 deletions

View File

@@ -0,0 +1,92 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_工时校验_查询]
@DID int = NULL,
@项目号 nvarchar(100) = N'',
@物料编码 nvarchar(100) = N'',
@类别 nvarchar(100) = N'',
@操作人 nvarchar(100) = N'',
@开始日期 nvarchar(30) = N'',
@结束日期 nvarchar(30) = N'',
@校验状态 nvarchar(50) = N'未校验',
@当前操作人 nvarchar(100) = N'',
@角色编号 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @开始 datetime = TRY_CONVERT(datetime, NULLIF(@开始日期, N''));
DECLARE @结束 datetime = TRY_CONVERT(datetime, NULLIF(@结束日期, N''));
DECLARE @当前用户 nvarchar(100) = LTRIM(RTRIM(ISNULL(@当前操作人, N'')));
DECLARE @可查看全部 bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[登录基础数据_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @角色编号
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
SELECT TOP (1000)
r.[RID],
r.[DID],
t.[项目号],
t.[物料编码],
t.[物料名称],
t.[图号],
t.[类别],
t.[任务描述],
t.[指派对象],
r.[操作人ID],
r.[操作人],
CONVERT(varchar(19), r.[开始时间], 120) AS [开始时间],
CONVERT(varchar(19), r.[结束时间], 120) AS [结束时间],
r.[工时秒数],
CAST(CAST(ISNULL(r.[工时秒数], 0) / 3600.0 AS decimal(18, 2)) AS varchar(30)) AS [工时小时],
r.[报工状态],
r.[已校验],
CASE WHEN r.[已校验] = 1 THEN N'已校验' ELSE N'未校验' END AS [校验状态],
r.[校验人],
CONVERT(varchar(19), r.[校验时间], 120) AS [校验时间],
r.[进度说明],
r.[备注],
t.[单据状态]
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID]
WHERE
(@DID IS NULL OR @DID = 0 OR r.[DID] = @DID)
AND (ISNULL(@项目号, N'') = N'' OR t.[项目号] LIKE N'%' + @项目号 + N'%')
AND (ISNULL(@物料编码, N'') = N'' OR t.[物料编码] LIKE N'%' + @物料编码 + N'%')
AND (ISNULL(@类别, N'') = N'' OR t.[类别] LIKE N'%' + @类别 + N'%')
AND (ISNULL(@操作人, N'') = N'' OR r.[操作人] LIKE N'%' + @操作人 + N'%')
AND (@开始 IS NULL OR r.[开始时间] >= @开始)
AND (@结束 IS NULL OR r.[开始时间] < DATEADD(day, 1, @结束))
AND
(
ISNULL(@校验状态, N'') = N''
OR @校验状态 = N'全部'
OR (@校验状态 = N'已校验' AND r.[已校验] = 1)
OR (@校验状态 = N'未校验' AND r.[已校验] = 0)
)
AND
(
@可查看全部 = 1
OR
(
NULLIF(@当前用户, N'') IS NOT NULL
AND
(
LTRIM(RTRIM(ISNULL(t.[创建人], N''))) = @当前用户
OR LTRIM(RTRIM(ISNULL(r.[操作人], N''))) = @当前用户
)
)
)
ORDER BY r.[RID] DESC;
END
GO

View File

@@ -0,0 +1,68 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID(N'[dbo].[MES_设计报工_附件]', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[MES_设计报工_附件]
(
[id] int IDENTITY(1,1) NOT NULL CONSTRAINT [PK_MES_设计报工_附件] PRIMARY KEY,
[num] nvarchar(200) NOT NULL,
[uid] nvarchar(200) NULL,
[name] nvarchar(500) NULL,
[suffix] nvarchar(100) NULL,
[是否启用] int NULL,
[worker] nvarchar(200) NULL,
[uploadTime] nvarchar(200) NULL
);
END
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE [object_id] = OBJECT_ID(N'[dbo].[MES_设计报工_附件]')
AND [name] = N'IX_MES_设计报工_附件_任务'
)
BEGIN
CREATE INDEX [IX_MES_设计报工_附件_任务]
ON [dbo].[MES_设计报工_附件]([num], [是否启用], [id] DESC);
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_附件_查询]
@DID int
AS
BEGIN
SET NOCOUNT ON;
SELECT
a.[id] AS [附件ID],
TRY_CONVERT(int, a.[num]) AS [DID],
CASE
WHEN CHARINDEX(N'__', ISNULL(a.[name], N'')) > 0
THEN SUBSTRING(a.[name], CHARINDEX(N'__', a.[name]) + 2, 500)
ELSE ISNULL(a.[name], N'')
END + CASE
WHEN NULLIF(LTRIM(RTRIM(ISNULL(a.[suffix], N''))), N'') IS NULL THEN N''
ELSE N'.' + a.[suffix]
END AS [原文件名],
ISNULL(a.[name], N'') + CASE
WHEN NULLIF(LTRIM(RTRIM(ISNULL(a.[suffix], N''))), N'') IS NULL THEN N''
ELSE N'.' + a.[suffix]
END AS [存储文件名],
LOWER(ISNULL(a.[suffix], N'')) AS [文件类型],
ISNULL(a.[worker], N'') AS [上传人],
ISNULL(a.[uploadTime], N'') AS [上传时间]
FROM [dbo].[MES_设计报工_附件] AS a
WHERE TRY_CONVERT(int, a.[num]) = @DID
AND ISNULL(a.[是否启用], 1) = 1
ORDER BY a.[id] DESC;
END
GO

View File

@@ -0,0 +1,225 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[发货任务堵点_看板查询]
@看板类型 nvarchar(20)
AS
BEGIN
SET NOCOUNT ON;
IF @看板类型 NOT IN (N'大厅', N'仓库', N'装配', N'质检')
BEGIN
THROW 50001, N'看板类型必须是大厅、仓库、装配或质检', 1;
END;
;WITH 当前加工操作人 AS
(
SELECT
d.[TaskAID],
STRING_AGG(CONVERT(nvarchar(max), d.[操作人]), N',')
WITHIN GROUP (ORDER BY d.[操作人]) AS [操作人]
FROM
(
SELECT DISTINCT
[TaskAID],
NULLIF(LTRIM(RTRIM([操作人])), N'') AS [操作人]
FROM [dbo].[YL_加工中心_操作记录表]
WHERE [操作类别] = N'开始加工'
AND [结束时间] IS NULL
AND [工位名称] LIKE N'%装配%'
AND [操作数值] IS NOT NULL
AND NULLIF(LTRIM(RTRIM([操作人])), N'') IS NOT NULL
) AS d
GROUP BY d.[TaskAID]
),
质检汇总 AS
(
SELECT
[TaskAID],
SUM(CASE WHEN [质检类型] = N'终检' THEN ISNULL([合格数], 0) ELSE 0 END) AS [终检合格数量],
SUM(CASE WHEN [质检类型] = N'收检' THEN ISNULL([不合格数], 0) ELSE 0 END) AS [收检不合格数量],
SUM(CASE WHEN [检测类型编号] = 6 THEN ISNULL([检验数量], 0) ELSE 0 END) AS [序检检验数量]
FROM [dbo].[View_质量检验_质检记录]
WHERE [质检类型] IN (N'收检', N'终检')
GROUP BY [TaskAID]
),
合同装配工时 AS
(
SELECT
gs.[合同号],
SUM(gs.[总时长]) AS [合同装配工时]
FROM [dbo].[View_生产工时视图] AS gs
INNER JOIN [dbo].[登录基础数据_人员信息] AS ry
ON gs.[操作人] = ry.[Personnel_Name]
WHERE ry.[班组] = N'装配'
GROUP BY gs.[合同号]
),
发货来源 AS
(
SELECT
CAST(N'SAP' AS nvarchar(20)) AS [来源],
c.[DocStatus] AS [发货单状态],
CONVERT(nvarchar(200), c.[项目号]) AS [项目号],
CONVERT(nvarchar(500), c.[物料编号]) AS [物料编号],
CONVERT(nvarchar(4000), c.[物料名称]) AS [物料描述],
c.[交货数量],
c.[要求发货时间],
c.[生产单号],
a.[TaskAID],
COALESCE(a.[订单编号], c.[生产单号]) AS [订单编号],
COALESCE(
NULLIF(CONVERT(nvarchar(200), a.[合同号]), N''),
NULLIF(CONVERT(nvarchar(200), c.[项目号]), N'')
) AS [合同号],
a.[计划数量],
a.[齐套],
a.[派工时间],
a.[发料状态],
a.[任务状态],
a.[发货状态],
c.[要求发货时间] AS [要求发货日期],
a.[加急总数],
a.[加急数量],
a.[入库数量],
a.[完成数量],
op.[操作人],
ISNULL(hours.[合同装配工时], 0) AS [合同装配工时],
ISNULL(quality.[终检合格数量], 0) AS [终检合格数量],
ISNULL(quality.[收检不合格数量], 0) AS [收检不合格数量],
ISNULL(quality.[序检检验数量], 0) AS [序检检验数量]
FROM [SAP].[SBO_YL].[dbo].[UBT_ODRF_ODLNMES] AS c
LEFT JOIN [dbo].[View_生产订单_MES] AS a
ON c.[生产单号] = a.[订单编号]
LEFT JOIN 当前加工操作人 AS op ON a.[TaskAID] = op.[TaskAID]
LEFT JOIN 质检汇总 AS quality ON a.[TaskAID] = quality.[TaskAID]
LEFT JOIN 合同装配工时 AS hours ON a.[合同号] = hours.[合同号]
UNION ALL
SELECT
CAST(N'MES优先' AS nvarchar(20)) AS [来源],
CAST(NULL AS char(1)) AS [发货单状态],
CONVERT(nvarchar(200), a.[项目代码]) AS [项目号],
CONVERT(nvarchar(500), a.[物料编号]) AS [物料编号],
CONVERT(nvarchar(4000), a.[物料描述]) AS [物料描述],
CAST(NULL AS numeric(19, 6)) AS [交货数量],
CAST(NULL AS datetime) AS [要求发货时间],
CAST(NULL AS int) AS [生产单号],
a.[TaskAID],
a.[订单编号],
CONVERT(nvarchar(200), a.[合同号]) AS [合同号],
a.[计划数量],
a.[齐套],
a.[派工时间],
a.[发料状态],
a.[任务状态],
a.[发货状态],
a.[要求发货日期],
a.[加急总数],
a.[加急数量],
a.[入库数量],
a.[完成数量],
op.[操作人],
ISNULL(hours.[合同装配工时], 0) AS [合同装配工时],
ISNULL(quality.[终检合格数量], 0) AS [终检合格数量],
ISNULL(quality.[收检不合格数量], 0) AS [收检不合格数量],
ISNULL(quality.[序检检验数量], 0) AS [序检检验数量]
FROM [dbo].[View_生产订单_MES] AS a
LEFT JOIN 当前加工操作人 AS op ON a.[TaskAID] = op.[TaskAID]
LEFT JOIN 质检汇总 AS quality ON a.[TaskAID] = quality.[TaskAID]
LEFT JOIN 合同装配工时 AS hours ON a.[合同号] = hours.[合同号]
WHERE a.[优先级] = N'是'
AND a.[自制件属性] LIKE N'%装配%'
AND NOT EXISTS
(
SELECT 1
FROM [SAP].[SBO_YL].[dbo].[UBT_ODRF_ODLNMES] AS c
WHERE c.[生产单号] = a.[订单编号]
)
),
发货堵点 AS
(
SELECT
source.*,
CONVERT(date, source.[派工时间]) AS [派发],
CASE
WHEN source.[物料编号] LIKE N'%3420-YT%'
OR source.[物料编号] LIKE N'%3420-HT%'
OR source.[物料编号] LIKE N'%3420-YF%'
THEN N'见子任务'
WHEN ISNULL(source.[齐套], 0) = 0 THEN N'齐套'
WHEN source.[派工时间] IS NULL THEN N'派发'
WHEN ISNULL(source.[发料状态], N'') <> N'1' THEN N'发料'
WHEN ISNULL(source.[任务状态], 0) <= 1 THEN N'开工'
WHEN ISNULL(source.[完成数量], 0) < source.[计划数量] THEN N'装配'
WHEN source.[终检合格数量] + source.[收检不合格数量] < source.[计划数量] THEN N'质检'
WHEN ISNULL(source.[入库数量], 0) + source.[收检不合格数量] < source.[计划数量] THEN N'待入库'
ELSE N''
END AS [堵点]
FROM 发货来源 AS source
)
SELECT
[来源],
[发货单状态],
[项目号],
[物料编号],
[物料描述],
[交货数量],
[要求发货时间],
[生产单号],
[TaskAID],
[订单编号],
[合同号],
[计划数量],
[齐套],
[派发],
[发料状态],
[任务状态],
[发货状态],
[要求发货日期],
[加急总数],
[加急数量],
[入库数量],
[完成数量],
[操作人],
[合同装配工时],
[终检合格数量],
[收检不合格数量],
[序检检验数量],
[堵点]
FROM 发货堵点
WHERE
(@看板类型 = N'仓库' AND [来源] = N'SAP')
OR
(
@看板类型 = N'大厅'
AND
(
[TaskAID] IS NULL
OR [计划数量] IS NULL
OR [终检合格数量] + [收检不合格数量] <> [计划数量]
)
)
OR
(
@看板类型 = N'质检'
AND [序检检验数量] < ISNULL([完成数量], 0)
)
OR
(
@看板类型 = N'装配'
AND ISNULL([完成数量], 0) < ISNULL([计划数量], 0)
)
ORDER BY
CASE WHEN [要求发货日期] IS NULL THEN 1 ELSE 0 END,
[要求发货日期],
[派发],
[订单编号],
[物料编号];
END;
GO

View File

@@ -407,6 +407,7 @@ BEGIN
PARTITION BY
[订单号],
CASE
WHEN [缺件属性] = N'外购' THEN [缺件物料编码] + N':' + CONVERT(nvarchar(30), [SAP行号])
WHEN ISNULL([缺件生产订单号], N'') <> N'' THEN [缺件生产订单号]
ELSE [缺件物料编码] + N':' + CONVERT(nvarchar(30), [SAP行号])
END