feat: update production reporting workflows

This commit is contained in:
2026-07-07 17:30:12 +08:00
parent 1399b9a80a
commit c4a2f6e42e
24 changed files with 3713 additions and 35 deletions

View File

@@ -0,0 +1,773 @@
/*
设计报工任务模块
说明:
1. 新建独立设计报工表和独立存储过程。
2. 不写入现有生产报工表。
3. 不上传 SAP。
4. 不新增菜单权限,不写入菜单表和角色权限表。
*/
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_设计报工_任务]
(
[DID] int IDENTITY(1,1) NOT NULL PRIMARY KEY,
[项目号] nvarchar(100) NULL,
[物料编码] nvarchar(100) NULL,
[物料名称] nvarchar(200) NULL,
[图号] nvarchar(100) NULL,
[任务描述] nvarchar(500) NULL,
[关联父件物料编码] nvarchar(100) NULL,
[关联父件物料名称] nvarchar(200) NULL,
[设计要求] nvarchar(max) NULL,
[研发立项号] nvarchar(100) NULL,
[研发目的] nvarchar(500) NULL,
[指派对象ID] nvarchar(1000) NULL,
[指派对象] nvarchar(1000) NULL,
[预计开始时间] datetime NULL,
[预计结束时间] datetime NULL,
[单据状态] nvarchar(50) NOT NULL CONSTRAINT [DF_MES_设计报工_任务_单据状态] DEFAULT (N'待开始'),
[创建日期] datetime NOT NULL CONSTRAINT [DF_MES_设计报工_任务_创建日期] DEFAULT (GETDATE()),
[创建人] nvarchar(100) NULL,
[最后编辑人] nvarchar(100) NULL,
[最后编辑时间] datetime NULL,
[备注] nvarchar(500) NULL
);
END
GO
IF OBJECT_ID(N'[dbo].[MES_设计报工_记录]', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[MES_设计报工_记录]
(
[RID] int IDENTITY(1,1) NOT NULL PRIMARY KEY,
[DID] int NOT NULL,
[操作人ID] nvarchar(100) NULL,
[操作人] nvarchar(100) NULL,
[开始时间] datetime NULL,
[结束时间] datetime NULL,
[工时秒数] int NULL,
[报工状态] nvarchar(50) NOT NULL CONSTRAINT [DF_MES_设计报工_记录_报工状态] DEFAULT (N'执行中'),
[已校验] bit NOT NULL CONSTRAINT [DF_MES_设计报工_记录_已校验] DEFAULT (0),
[校验人ID] nvarchar(100) NULL,
[校验人] nvarchar(100) NULL,
[校验时间] datetime NULL,
[创建时间] datetime NOT NULL CONSTRAINT [DF_MES_设计报工_记录_创建时间] DEFAULT (GETDATE()),
[备注] nvarchar(500) NULL,
CONSTRAINT [FK_MES_设计报工_记录_任务] FOREIGN KEY ([DID]) REFERENCES [dbo].[MES_设计报工_任务]([DID])
);
END
GO
IF OBJECT_ID(N'[dbo].[MES_设计报工_校验记录]', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[MES_设计报工_校验记录]
(
[VID] int IDENTITY(1,1) NOT NULL PRIMARY KEY,
[RID] int NOT NULL,
[DID] int NOT NULL,
[校验前开始时间] datetime NULL,
[校验前结束时间] datetime NULL,
[校验后开始时间] datetime NULL,
[校验后结束时间] datetime NULL,
[校验后工时秒数] int NULL,
[校验人ID] nvarchar(100) NULL,
[校验人] nvarchar(100) NULL,
[校验时间] datetime NOT NULL CONSTRAINT [DF_MES_设计报工_校验记录_校验时间] DEFAULT (GETDATE()),
[校验备注] nvarchar(500) NULL
);
END
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_MES_设计报工_任务_查询' AND object_id = OBJECT_ID(N'[dbo].[MES_设计报工_任务]'))
CREATE INDEX [IX_MES_设计报工_任务_查询] ON [dbo].[MES_设计报工_任务]([单据状态], [项目号], [物料编码], [预计开始时间], [预计结束时间]);
GO
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_MES_设计报工_记录_DID' AND object_id = OBJECT_ID(N'[dbo].[MES_设计报工_记录]'))
CREATE INDEX [IX_MES_设计报工_记录_DID] ON [dbo].[MES_设计报工_记录]([DID], [开始时间], [结束时间], [已校验]);
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_物料查询]
@过滤 nvarchar(200) = N''
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP 100
CAST([物料编码] AS nvarchar(100)) AS [物料编码],
ISNULL(
NULLIF(CAST([物料名称] AS nvarchar(200)), N''),
CAST([物料描述] AS nvarchar(200))
) AS [物料名称],
CAST([物料描述] AS nvarchar(500)) AS [物料描述],
CAST([规格型号] AS nvarchar(200)) AS [规格型号],
CAST([自制件属性] AS nvarchar(100)) AS [自制件属性]
FROM [SAP].[SBO_YL].[dbo].[UBT_OITM]
WHERE
ISNULL(@过滤, N'') = N''
OR CAST([物料编码] AS nvarchar(100)) LIKE N'%' + @过滤 + N'%'
OR CAST([物料名称] AS nvarchar(200)) LIKE N'%' + @过滤 + N'%'
OR CAST([物料描述] AS nvarchar(500)) LIKE N'%' + @过滤 + N'%'
ORDER BY CAST([物料编码] AS nvarchar(100));
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_人员查询]
@过滤 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @人员 table
(
[人员编号] int NULL,
[人员姓名] nvarchar(100) NULL,
[账号] nvarchar(100) NULL,
[角色] nvarchar(100) NULL,
[部门名称] nvarchar(100) NULL
);
INSERT INTO @人员
EXEC [dbo].[系统管理_人员管理_所有有效人员查询];
SELECT TOP 200
CAST([人员编号] AS nvarchar(50)) AS [人员编号],
[人员姓名],
[账号],
[角色],
[部门名称]
FROM @人员
WHERE
ISNULL(@过滤, N'') = N''
OR CAST([人员编号] AS nvarchar(50)) LIKE N'%' + @过滤 + N'%'
OR [人员姓名] LIKE N'%' + @过滤 + N'%'
OR [账号] LIKE N'%' + @过滤 + N'%'
ORDER BY [人员姓名];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_项目查询]
@过滤 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
SELECT DISTINCT TOP 100
[项目号]
FROM [dbo].[MES_设计报工_任务]
WHERE
ISNULL([项目号], N'') <> N''
AND (ISNULL(@过滤, N'') = N'' OR [项目号] LIKE N'%' + @过滤 + N'%')
ORDER BY [项目号];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_查询]
@DID int = NULL,
@项目号 nvarchar(100) = N'',
@物料编码 nvarchar(100) = N'',
@图号 nvarchar(100) = N'',
@关联父件物料编码 nvarchar(100) = N'',
@预计开始时间_Start nvarchar(30) = N'',
@预计开始时间_End nvarchar(30) = N'',
@预计结束时间_Start nvarchar(30) = N'',
@预计结束时间_End nvarchar(30) = N'',
@单据状态 nvarchar(50) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @预计开始日期1 datetime = TRY_CONVERT(datetime, NULLIF(@预计开始时间_Start, N''));
DECLARE @预计开始日期2 datetime = TRY_CONVERT(datetime, NULLIF(@预计开始时间_End, N''));
DECLARE @预计结束日期1 datetime = TRY_CONVERT(datetime, NULLIF(@预计结束时间_Start, N''));
DECLARE @预计结束日期2 datetime = TRY_CONVERT(datetime, NULLIF(@预计结束时间_End, N''));
SELECT TOP 1000
t.[DID],
t.[项目号],
t.[物料编码],
t.[物料名称],
t.[图号],
t.[任务描述],
t.[关联父件物料编码],
t.[关联父件物料名称],
t.[设计要求],
t.[研发立项号],
t.[研发目的],
t.[指派对象ID],
t.[指派对象],
CONVERT(varchar(19), t.[预计开始时间], 120) AS [预计开始时间],
CONVERT(varchar(19), t.[预计结束时间], 120) AS [预计结束时间],
t.[单据状态],
CONVERT(varchar(19), t.[创建日期], 120) AS [创建日期],
t.[创建人],
t.[最后编辑人],
CONVERT(varchar(19), t.[最后编辑时间], 120) AS [最后编辑时间],
t.[备注],
ISNULL(r.[报工次数], 0) AS [报工次数],
ISNULL(r.[未结束报工数], 0) AS [未结束报工数],
CONVERT(varchar(19), r.[最后开始时间], 120) AS [最后开始时间],
CONVERT(varchar(19), r.[最后结束时间], 120) AS [最后结束时间]
FROM [dbo].[MES_设计报工_任务] AS t
OUTER APPLY
(
SELECT
COUNT(1) AS [报工次数],
SUM(CASE WHEN rr.[结束时间] IS NULL THEN 1 ELSE 0 END) AS [未结束报工数],
MAX(rr.[开始时间]) AS [最后开始时间],
MAX(rr.[结束时间]) AS [最后结束时间]
FROM [dbo].[MES_设计报工_记录] AS rr
WHERE rr.[DID] = t.[DID]
) AS r
WHERE
(@DID IS NULL OR @DID = 0 OR t.[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 t.[关联父件物料编码] LIKE N'%' + @关联父件物料编码 + N'%')
AND (ISNULL(@单据状态, N'') = N'' OR @单据状态 = N'全部' OR t.[单据状态] = @单据状态)
AND (@预计开始日期1 IS NULL OR t.[预计开始时间] >= @预计开始日期1)
AND (@预计开始日期2 IS NULL OR t.[预计开始时间] < DATEADD(day, 1, @预计开始日期2))
AND (@预计结束日期1 IS NULL OR t.[预计结束时间] >= @预计结束日期1)
AND (@预计结束日期2 IS NULL OR t.[预计结束时间] < DATEADD(day, 1, @预计结束日期2))
ORDER BY t.[DID] DESC;
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_新增]
@项目号 nvarchar(100) = N'',
@物料编码 nvarchar(100) = N'',
@物料名称 nvarchar(200) = N'',
@图号 nvarchar(100) = N'',
@任务描述 nvarchar(500) = N'',
@关联父件物料编码 nvarchar(100) = N'',
@关联父件物料名称 nvarchar(200) = N'',
@设计要求 nvarchar(max) = N'',
@研发立项号 nvarchar(100) = N'',
@研发目的 nvarchar(500) = N'',
@指派对象ID nvarchar(1000) = N'',
@指派对象 nvarchar(1000) = N'',
@预计开始时间 nvarchar(30) = N'',
@预计结束时间 nvarchar(30) = N'',
@创建人 nvarchar(100) = N'',
@备注 nvarchar(500) = N''
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[MES_设计报工_任务]
(
[项目号], [物料编码], [物料名称], [图号], [任务描述],
[关联父件物料编码], [关联父件物料名称], [设计要求],
[研发立项号], [研发目的], [指派对象ID], [指派对象],
[预计开始时间], [预计结束时间], [单据状态],
[创建人], [最后编辑人], [最后编辑时间], [备注]
)
VALUES
(
NULLIF(@项目号, N''), NULLIF(@物料编码, N''), NULLIF(@物料名称, N''), NULLIF(@图号, N''), NULLIF(@任务描述, N''),
NULLIF(@关联父件物料编码, N''), NULLIF(@关联父件物料名称, N''), NULLIF(@设计要求, N''),
NULLIF(@研发立项号, N''), NULLIF(@研发目的, N''), NULLIF(@指派对象ID, N''), NULLIF(@指派对象, N''),
TRY_CONVERT(datetime, NULLIF(@预计开始时间, N'')), TRY_CONVERT(datetime, NULLIF(@预计结束时间, N'')), N'待开始',
NULLIF(@创建人, N''), NULLIF(@创建人, N''), GETDATE(), NULLIF(@备注, N'')
);
SELECT CAST(1 AS int) AS [result], N'新增成功' AS [message], SCOPE_IDENTITY() AS [DID];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_编辑]
@DID int,
@项目号 nvarchar(100) = N'',
@物料编码 nvarchar(100) = N'',
@物料名称 nvarchar(200) = N'',
@图号 nvarchar(100) = N'',
@任务描述 nvarchar(500) = N'',
@关联父件物料编码 nvarchar(100) = N'',
@关联父件物料名称 nvarchar(200) = N'',
@设计要求 nvarchar(max) = N'',
@研发立项号 nvarchar(100) = N'',
@研发目的 nvarchar(500) = N'',
@指派对象ID nvarchar(1000) = N'',
@指派对象 nvarchar(1000) = N'',
@预计开始时间 nvarchar(30) = N'',
@预计结束时间 nvarchar(30) = N'',
@最后编辑人 nvarchar(100) = N'',
@备注 nvarchar(500) = N''
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID)
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
RETURN;
END
UPDATE [dbo].[MES_设计报工_任务]
SET
[项目号] = NULLIF(@项目号, N''),
[物料编码] = NULLIF(@物料编码, N''),
[物料名称] = NULLIF(@物料名称, N''),
[图号] = NULLIF(@图号, N''),
[任务描述] = NULLIF(@任务描述, N''),
[关联父件物料编码] = NULLIF(@关联父件物料编码, N''),
[关联父件物料名称] = NULLIF(@关联父件物料名称, N''),
[设计要求] = NULLIF(@设计要求, N''),
[研发立项号] = NULLIF(@研发立项号, N''),
[研发目的] = NULLIF(@研发目的, N''),
[指派对象ID] = NULLIF(@指派对象ID, N''),
[指派对象] = NULLIF(@指派对象, N''),
[预计开始时间] = TRY_CONVERT(datetime, NULLIF(@预计开始时间, N'')),
[预计结束时间] = TRY_CONVERT(datetime, NULLIF(@预计结束时间, N'')),
[最后编辑人] = NULLIF(@最后编辑人, N''),
[最后编辑时间] = GETDATE(),
[备注] = NULLIF(@备注, N'')
WHERE [DID] = @DID;
SELECT CAST(1 AS int) AS [result], N'编辑成功' AS [message];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_删除]
@DID int
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID)
BEGIN
SELECT CAST(0 AS int) AS [result], N'该任务已有设计报工记录,不能删除' AS [message];
RETURN;
END
DELETE FROM [dbo].[MES_设计报工_任务]
WHERE [DID] = @DID;
SELECT CAST(1 AS int) AS [result], N'删除成功' AS [message];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_开始]
@DID int,
@操作人ID nvarchar(100) = N'',
@操作人 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID)
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
RETURN;
END
IF EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID AND [单据状态] = N'已完成')
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务已完成,不能开始' AS [message];
RETURN;
END
IF EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NULL)
BEGIN
SELECT CAST(0 AS int) AS [result], N'该任务存在未结束的报工记录' AS [message];
RETURN;
END
INSERT INTO [dbo].[MES_设计报工_记录]([DID], [操作人ID], [操作人], [开始时间], [报工状态])
VALUES(@DID, NULLIF(@操作人ID, N''), NULLIF(@操作人, N''), GETDATE(), N'执行中');
UPDATE [dbo].[MES_设计报工_任务]
SET [单据状态] = N'执行中', [最后编辑人] = NULLIF(@操作人, N''), [最后编辑时间] = GETDATE()
WHERE [DID] = @DID;
SELECT CAST(1 AS int) AS [result], N'开始成功' AS [message], SCOPE_IDENTITY() AS [RID];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_结束]
@DID int,
@操作人ID nvarchar(100) = N'',
@操作人 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @RID int;
SELECT TOP 1 @RID = [RID]
FROM [dbo].[MES_设计报工_记录]
WHERE [DID] = @DID AND [结束时间] IS NULL
ORDER BY [开始时间] DESC, [RID] DESC;
IF @RID IS NULL
BEGIN
SELECT CAST(0 AS int) AS [result], N'没有未结束的报工记录' AS [message];
RETURN;
END
UPDATE [dbo].[MES_设计报工_记录]
SET
[结束时间] = GETDATE(),
[工时秒数] = DATEDIFF(second, [开始时间], GETDATE()),
[报工状态] = N'已结束'
WHERE [RID] = @RID;
UPDATE [dbo].[MES_设计报工_任务]
SET [单据状态] = N'已结束', [最后编辑人] = NULLIF(@操作人, N''), [最后编辑时间] = GETDATE()
WHERE [DID] = @DID AND [单据状态] <> N'已完成';
SELECT CAST(1 AS int) AS [result], N'结束成功' AS [message], @RID AS [RID];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_完成]
@DID int,
@操作人 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID)
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
RETURN;
END
IF EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NULL)
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务存在未结束报工,不能完成' AS [message];
RETURN;
END
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NOT NULL)
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务未产生已结束报工,不能完成' AS [message];
RETURN;
END
UPDATE [dbo].[MES_设计报工_任务]
SET [单据状态] = N'已完成', [最后编辑人] = NULLIF(@操作人, N''), [最后编辑时间] = GETDATE()
WHERE [DID] = @DID;
SELECT CAST(1 AS int) AS [result], N'完成成功' AS [message];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_记录_查询]
@DID int = NULL,
@项目号 nvarchar(100) = N'',
@物料编码 nvarchar(100) = N'',
@操作人 nvarchar(100) = N'',
@开始日期 nvarchar(30) = N'',
@结束日期 nvarchar(30) = N'',
@校验状态 nvarchar(50) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @开始 datetime = TRY_CONVERT(datetime, NULLIF(@开始日期, N''));
DECLARE @结束 datetime = TRY_CONVERT(datetime, NULLIF(@结束日期, N''));
SELECT TOP 1000
r.[RID],
r.[DID],
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.[备注],
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 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)
)
ORDER BY r.[RID] DESC;
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_工时校验_查询]
@DID int = NULL,
@项目号 nvarchar(100) = N'',
@物料编码 nvarchar(100) = N'',
@操作人 nvarchar(100) = N'',
@开始日期 nvarchar(30) = N'',
@结束日期 nvarchar(30) = N'',
@校验状态 nvarchar(50) = N'未校验'
AS
BEGIN
SET NOCOUNT ON;
EXEC [dbo].[设计报工_记录_查询]
@DID = @DID,
@项目号 = @项目号,
@物料编码 = @物料编码,
@操作人 = @操作人,
@开始日期 = @开始日期,
@结束日期 = @结束日期,
@校验状态 = @校验状态;
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_工时校验_保存]
@RID int,
@开始时间 nvarchar(30),
@结束时间 nvarchar(30),
@校验人ID nvarchar(100) = N'',
@校验人 nvarchar(100) = N'',
@校验备注 nvarchar(500) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @开始 datetime = TRY_CONVERT(datetime, NULLIF(@开始时间, N''));
DECLARE @结束 datetime = TRY_CONVERT(datetime, NULLIF(@结束时间, N''));
DECLARE @DID int;
DECLARE @旧开始 datetime;
DECLARE @旧结束 datetime;
SELECT @DID = [DID], @旧开始 = [开始时间], @旧结束 = [结束时间]
FROM [dbo].[MES_设计报工_记录]
WHERE [RID] = @RID;
IF @DID IS NULL
BEGIN
SELECT CAST(0 AS int) AS [result], N'报工记录不存在' AS [message];
RETURN;
END
IF @开始 IS NULL OR @结束 IS NULL OR @结束 <= @开始
BEGIN
SELECT CAST(0 AS int) AS [result], N'开始时间和结束时间不合法' AS [message];
RETURN;
END
INSERT INTO [dbo].[MES_设计报工_校验记录]
(
[RID], [DID], [校验前开始时间], [校验前结束时间],
[校验后开始时间], [校验后结束时间], [校验后工时秒数],
[校验人ID], [校验人], [校验时间], [校验备注]
)
VALUES
(
@RID, @DID, @旧开始, @旧结束,
@开始, @结束, DATEDIFF(second, @开始, @结束),
NULLIF(@校验人ID, N''), NULLIF(@校验人, N''), GETDATE(), NULLIF(@校验备注, N'')
);
UPDATE [dbo].[MES_设计报工_记录]
SET
[开始时间] = @开始,
[结束时间] = @结束,
[工时秒数] = DATEDIFF(second, @开始, @结束),
[报工状态] = N'已结束',
[已校验] = 1,
[校验人ID] = NULLIF(@校验人ID, N''),
[校验人] = NULLIF(@校验人, N''),
[校验时间] = GETDATE(),
[备注] = NULLIF(@校验备注, N'')
WHERE [RID] = @RID;
SELECT CAST(1 AS int) AS [result], N'校验成功' AS [message];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_工时校验_批量保存]
@RIDs nvarchar(max),
@校验人ID nvarchar(100) = N'',
@校验人 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @RID表 table([RID] int PRIMARY KEY);
DECLARE @xml xml;
SET @xml = TRY_CONVERT(xml, N'<r><i>' + REPLACE(ISNULL(@RIDs, N''), N',', N'</i><i>') + N'</i></r>');
INSERT INTO @RID表([RID])
SELECT DISTINCT TRY_CONVERT(int, T.c.value(N'.', N'nvarchar(30)'))
FROM @xml.nodes(N'/r/i') AS T(c)
WHERE TRY_CONVERT(int, T.c.value(N'.', N'nvarchar(30)')) IS NOT NULL;
IF NOT EXISTS (SELECT 1 FROM @RID表)
BEGIN
SELECT CAST(0 AS int) AS [result], N'没有可校验记录' AS [message];
RETURN;
END
INSERT INTO [dbo].[MES_设计报工_校验记录]
(
[RID], [DID], [校验前开始时间], [校验前结束时间],
[校验后开始时间], [校验后结束时间], [校验后工时秒数],
[校验人ID], [校验人], [校验时间], [校验备注]
)
SELECT
r.[RID], r.[DID], r.[开始时间], r.[结束时间],
r.[开始时间], r.[结束时间], r.[工时秒数],
NULLIF(@校验人ID, N''), NULLIF(@校验人, N''), GETDATE(), N'批量校验'
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN @RID表 AS ids ON r.[RID] = ids.[RID]
WHERE r.[开始时间] IS NOT NULL AND r.[结束时间] IS NOT NULL;
UPDATE r
SET
[已校验] = 1,
[校验人ID] = NULLIF(@校验人ID, N''),
[校验人] = NULLIF(@校验人, N''),
[校验时间] = GETDATE()
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN @RID表 AS ids ON r.[RID] = ids.[RID]
WHERE r.[开始时间] IS NOT NULL AND r.[结束时间] IS NOT NULL;
SELECT CAST(1 AS int) AS [result], N'批量校验成功' AS [message], @@ROWCOUNT AS [count];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_工时报表_作业者工时_查询]
@开始日期 nvarchar(30) = N'',
@结束日期 nvarchar(30) = N'',
@操作人 nvarchar(100) = N'',
@项目号 nvarchar(100) = N'',
@物料编码 nvarchar(100) = N'',
@DID int = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @开始 datetime = TRY_CONVERT(datetime, NULLIF(@开始日期, N''));
DECLARE @结束 datetime = TRY_CONVERT(datetime, NULLIF(@结束日期, N''));
;WITH base AS
(
SELECT
r.[RID],
r.[DID],
ISNULL(r.[操作人], N'') AS [操作人],
CONVERT(varchar(10), r.[开始时间], 120) AS [工作日期],
t.[项目号],
t.[物料编码],
t.[物料名称],
t.[图号],
t.[任务描述],
r.[开始时间],
r.[结束时间],
ISNULL(r.[工时秒数], 0) AS [工时秒数],
r.[已校验],
r.[备注]
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID]
WHERE
r.[开始时间] IS NOT NULL
AND r.[结束时间] IS NOT NULL
AND (@开始 IS NULL OR r.[开始时间] >= @开始)
AND (@结束 IS NULL OR r.[开始时间] < DATEADD(day, 1, @结束))
AND (ISNULL(@操作人, N'') = N'' OR r.[操作人] LIKE N'%' + @操作人 + N'%')
AND (ISNULL(@项目号, N'') = N'' OR t.[项目号] LIKE N'%' + @项目号 + N'%')
AND (ISNULL(@物料编码, N'') = N'' OR t.[物料编码] LIKE N'%' + @物料编码 + N'%')
AND (@DID IS NULL OR @DID = 0 OR r.[DID] = @DID)
),
result AS
(
SELECT
1 AS [Level],
N'p-' + [操作人] AS [id],
CAST(N'' AS nvarchar(100)) AS [parentId],
[操作人],
CAST(N'' AS nvarchar(20)) AS [工作日期],
CAST(NULL AS int) AS [RID],
CAST(NULL AS int) AS [DID],
CAST(N'' AS nvarchar(100)) AS [项目号],
CAST(N'' AS nvarchar(100)) AS [物料编码],
CAST(N'' AS nvarchar(200)) AS [物料名称],
CAST(N'' AS nvarchar(100)) AS [图号],
CAST(N'' AS nvarchar(500)) AS [任务描述],
CAST(N'' AS varchar(19)) AS [开始时间],
CAST(N'' AS varchar(19)) AS [结束时间],
COUNT(1) AS [报工次数],
CAST(SUM([工时秒数]) / 3600.0 AS decimal(18, 2)) AS [工时小时],
CAST(N'' AS nvarchar(20)) AS [校验状态],
CAST(N'' AS nvarchar(500)) AS [备注]
FROM base
GROUP BY [操作人]
UNION ALL
SELECT
2 AS [Level],
N'd-' + [操作人] + N'-' + [工作日期] AS [id],
N'p-' + [操作人] AS [parentId],
[操作人],
[工作日期],
CAST(NULL AS int) AS [RID],
CAST(NULL AS int) AS [DID],
CAST(N'' AS nvarchar(100)) AS [项目号],
CAST(N'' AS nvarchar(100)) AS [物料编码],
CAST(N'' AS nvarchar(200)) AS [物料名称],
CAST(N'' AS nvarchar(100)) AS [图号],
CAST(N'' AS nvarchar(500)) AS [任务描述],
CAST(N'' AS varchar(19)) AS [开始时间],
CAST(N'' AS varchar(19)) AS [结束时间],
COUNT(1) AS [报工次数],
CAST(SUM([工时秒数]) / 3600.0 AS decimal(18, 2)) AS [工时小时],
CAST(N'' AS nvarchar(20)) AS [校验状态],
CAST(N'' AS nvarchar(500)) AS [备注]
FROM base
GROUP BY [操作人], [工作日期]
UNION ALL
SELECT
3 AS [Level],
N'r-' + CAST([RID] AS nvarchar(20)) AS [id],
N'd-' + [操作人] + N'-' + [工作日期] AS [parentId],
[操作人],
[工作日期],
[RID],
[DID],
ISNULL([项目号], N'') AS [项目号],
ISNULL([物料编码], N'') AS [物料编码],
ISNULL([物料名称], N'') AS [物料名称],
ISNULL([图号], N'') AS [图号],
ISNULL([任务描述], N'') AS [任务描述],
CONVERT(varchar(19), [开始时间], 120) AS [开始时间],
CONVERT(varchar(19), [结束时间], 120) AS [结束时间],
1 AS [报工次数],
CAST([工时秒数] / 3600.0 AS decimal(18, 2)) AS [工时小时],
CASE WHEN [已校验] = 1 THEN N'已校验' ELSE N'未校验' END AS [校验状态],
ISNULL([备注], N'') AS [备注]
FROM base
)
SELECT *
FROM result
ORDER BY [操作人], [工作日期], [Level], [RID];
END
GO

View File

@@ -0,0 +1,210 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
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
CONVERT(nvarchar(100), t.订单编号) AS 订单编号
FROM dbo.YL_加工中心_操作记录表 AS t
WHERE t.操作类别 = N'开始加工'
AND t.结束时间 IS NULL
AND t.工位名称 LIKE N'%装配%'
AND t.操作数值 IS NOT NULL
GROUP BY CONVERT(nvarchar(100), t.订单编号)
),
收检数量 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
c.订单编号,
c.产品名称,
c.产品编码,
c.入库数量,
c.合同号,
c.终检不合格数合计,
c.终检合格数合计,
c.计划数量,
c.确认状态,
c.单据状态,
c.不合格数合计,
c.是否全部校验
FROM 可关闭订单 AS c
WHERE NOT EXISTS
(
SELECT 1
FROM 未结束装配订单 AS u
WHERE u.订单编号 = CONVERT(nvarchar(100), c.订单编号)
)
ORDER BY c.订单编号;
RETURN;
END
;WITH 未结束装配订单 AS
(
SELECT
CONVERT(nvarchar(100), t.订单编号) AS 订单编号
FROM dbo.YL_加工中心_操作记录表 AS t
WHERE t.操作类别 = N'开始加工'
AND t.结束时间 IS NULL
AND t.工位名称 LIKE N'%装配%'
AND t.操作数值 IS NOT NULL
GROUP BY CONVERT(nvarchar(100), t.订单编号)
)
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 EXISTS
(
SELECT 1
FROM 未结束装配订单 AS u
WHERE u.订单编号 = 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,280 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[生产管理_结算工时_查询]
@合同号 NVARCHAR(50) = NULL,
@产品编码 NVARCHAR(100) = NULL,
@订单号 NVARCHAR(50) = NULL,
@工位 NVARCHAR(50) = NULL,
@开始日期 DATE = NULL,
@结束日期 DATE = NULL,
@数据条数 INT = 100
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TopCount INT = CASE WHEN ISNULL(@数据条数, 0) <= 0 THEN 100 ELSE @数据条数 END;
CREATE TABLE #基础数据
(
RowID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
TaskAID BIGINT NULL,
开始时间 DATETIME NULL,
操作内容 NVARCHAR(1000) NULL,
操作类别 NVARCHAR(100) NULL,
操作人 NVARCHAR(100) NULL,
加工工时 INT NULL,
操作数值 INT NULL,
订单合同号 NVARCHAR(100) NULL,
订单号 INT NOT NULL,
订单行号 INT NULL,
产品编码 NVARCHAR(1000) NULL,
产品名称 NVARCHAR(1000) NULL,
工序名称 NVARCHAR(100) NULL,
工位名称 NVARCHAR(100) NULL,
物料编号 NVARCHAR(1000) NULL,
物料描述 NVARCHAR(1000) NULL
);
INSERT INTO #基础数据
(
TaskAID,
开始时间,
操作内容,
操作类别,
操作人,
加工工时,
操作数值,
订单合同号,
订单号,
订单行号,
产品编码,
产品名称,
工序名称,
工位名称,
物料编号,
物料描述
)
SELECT TOP (@TopCount)
v.TaskAID,
v.开始时间,
v.操作内容,
v.操作类别,
v.操作人,
v.加工工时,
v.操作数值,
v.订单合同号,
q.订单编号 AS 订单号,
q.订单行号,
q.物料编码 AS 产品编码,
q.物料名称 AS 产品名称,
q.工序名称,
COALESCE(NULLIF(q.指派对象, N''), v.工位名称) AS 工位名称,
p.物料编号,
p.物料描述
FROM dbo.MES_接口_生产计划 AS p
INNER JOIN dbo.MES_接口_生产计划_生产任务 AS q
ON q.订单编号 = p.订单编号
AND q.物料类型 = N'pit_Resource'
INNER JOIN dbo.View_生产工时视图 AS v
ON v.TaskAID = q.AID
WHERE p.单据状态 IS NOT NULL
AND p.订单编号 > 6000
AND (@开始日期 IS NULL OR @开始日期 = N'' OR v.开始时间 >= @开始日期)
AND (@结束日期 IS NULL OR @结束日期 = N'' OR v.开始时间 < DATEADD(DAY, 1, @结束日期))
AND (@合同号 IS NULL OR @合同号 = N'' OR v.订单合同号 LIKE N'%' + @合同号 + N'%')
AND (@产品编码 IS NULL OR @产品编码 = N'' OR q.物料编码 LIKE N'%' + @产品编码 + N'%')
AND (@订单号 IS NULL OR @订单号 = N'' OR CONVERT(NVARCHAR(50), q.订单编号) = @订单号)
AND (@工位 IS NULL OR @工位 = N'' OR COALESCE(NULLIF(q.指派对象, N''), v.工位名称) LIKE N'%' + @工位 + N'%')
ORDER BY q.订单编号 DESC, q.订单行号, v.开始时间 DESC;
CREATE INDEX IX_基础数据_TaskStart ON #基础数据 (TaskAID, 开始时间);
CREATE TABLE #操作人拼接
(
TaskAID BIGINT NOT NULL,
开始时间 VARCHAR(19) NOT NULL,
操作人 NVARCHAR(MAX) NULL,
PRIMARY KEY (TaskAID, 开始时间)
);
INSERT INTO #操作人拼接 (TaskAID, 开始时间, 操作人)
SELECT
TaskAID,
开始时间,
STRING_AGG(CONVERT(NVARCHAR(MAX), 操作人), N',') AS 操作人
FROM
(
SELECT DISTINCT
k.TaskAID,
k.开始时间,
LTRIM(RTRIM(s.value)) AS 操作人
FROM
(
SELECT DISTINCT
TaskAID,
CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间
FROM #基础数据
WHERE TaskAID IS NOT NULL
AND 开始时间 IS NOT NULL
) AS k
INNER JOIN dbo.View_生产工时视图全部 AS v2
ON v2.TaskAID = k.TaskAID
AND v2.开始时间 >= CONVERT(DATETIME, k.开始时间, 120)
AND v2.开始时间 < DATEADD(SECOND, 1, CONVERT(DATETIME, k.开始时间, 120))
CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(ISNULL(v2.操作人, N''), N',', N','), N'、', N','), N',') AS s
WHERE ISNULL(v2.加工工时, 0) <= 0
AND NULLIF(LTRIM(RTRIM(s.value)), N'') IS NOT NULL
) AS x
GROUP BY TaskAID, 开始时间;
;WITH 结算明细 AS
(
SELECT
ISNULL(b.物料编号, b.产品编码) AS 物料编号,
ISNULL(b.物料描述, b.产品名称) AS 物料描述,
b.订单号,
b.工位名称,
b.TaskAID,
b.工序名称,
b.订单行号,
ISNULL(o.操作人, N'') AS 操作人,
CASE
WHEN ISNULL(b.操作内容, N'') LIKE N'%辅助%' OR ISNULL(b.操作类别, N'') LIKE N'%辅助%' THEN N'辅助结束'
ELSE N'报工'
END AS 操作类型,
CAST(ISNULL(b.加工工时, 0) / 60.0 / 60.0 AS DECIMAL(18, 4)) AS 工时小时,
ISNULL(b.操作数值, 0) AS 完成数
FROM #基础数据 AS b
LEFT JOIN #操作人拼接 AS o
ON o.TaskAID = b.TaskAID
AND o.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120)
),
订单工位汇总基础 AS
(
SELECT
物料编号,
物料描述,
订单号,
工位名称,
MAX(工序名称) AS 工序名称,
订单行号 AS 工序顺序,
COUNT(*) AS 记录数,
SUM(CASE WHEN 操作类型 = N'报工' THEN 工时小时 ELSE 0 END) AS 报工工时,
SUM(CASE WHEN 操作类型 = N'辅助结束' THEN 工时小时 ELSE 0 END) AS 主辅工时,
SUM(CASE WHEN 操作类型 = N'报工' THEN 完成数 ELSE 0 END) AS 报工完成数,
SUM(CASE WHEN 操作类型 = N'辅助结束' THEN 完成数 ELSE 0 END) AS 辅助完成数,
SUM(工时小时) AS 合计工时
FROM 结算明细
GROUP BY 物料编号, 物料描述, 订单号, 工位名称, 订单行号
),
订单工位操作人 AS
(
SELECT
物料编号,
订单号,
ISNULL(工位名称, N'') AS 工位名称,
STRING_AGG(CONVERT(NVARCHAR(MAX), 操作人), N',') AS 操作人
FROM
(
SELECT DISTINCT
j.物料编号,
j.订单号,
ISNULL(j.工位名称, N'') AS 工位名称,
LTRIM(RTRIM(s.value)) AS 操作人
FROM 结算明细 AS j
CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(ISNULL(j.操作人, N''), N',', N','), N'、', N','), N',') AS s
WHERE NULLIF(LTRIM(RTRIM(s.value)), N'') IS NOT NULL
) AS x
GROUP BY 物料编号, 订单号, ISNULL(工位名称, N'')
),
订单工位汇总 AS
(
SELECT
b.物料编号,
b.物料描述,
b.订单号,
b.工位名称,
b.工序名称,
b.工序顺序,
b.记录数,
b.报工工时,
b.主辅工时,
b.报工完成数,
b.辅助完成数,
b.合计工时,
ISNULL(o.操作人, N'') AS 操作人
FROM 订单工位汇总基础 AS b
LEFT JOIN 订单工位操作人 AS o
ON o.物料编号 = b.物料编号
AND o.订单号 = b.订单号
AND o.工位名称 = ISNULL(b.工位名称, N'')
),
物料汇总 AS
(
SELECT
物料编号,
物料描述,
SUM(记录数) AS 记录数,
SUM(报工工时) AS 报工工时,
SUM(主辅工时) AS 主辅工时,
SUM(报工完成数) AS 报工完成数,
SUM(辅助完成数) AS 辅助完成数,
SUM(合计工时) AS 合计工时
FROM 订单工位汇总
GROUP BY 物料编号, 物料描述
)
SELECT
1 AS [Level],
物料编号 AS materialCode,
物料描述 AS materialDesc,
ISNULL(物料描述, N'') + N' ' + ISNULL(物料编号, N'') AS taskDescription,
CAST(0 AS INT) AS productionOrderNo,
N'' AS station,
CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours,
CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours,
CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty,
CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty,
CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours,
CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime,
CAST(0 AS VARCHAR(20)) AS programTime,
CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours,
CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours,
N'' AS operatorNames,
CAST(记录数 AS VARCHAR(20)) AS recordCount,
CAST(0 AS INT) AS 工序顺序
FROM 物料汇总
UNION ALL
SELECT
2 AS [Level],
物料编号 AS materialCode,
物料描述 AS materialDesc,
ISNULL(物料描述, N'') + N' ' + ISNULL(物料编号, N'')
+ CASE WHEN NULLIF(ISNULL(工序名称, N''), N'') IS NULL THEN N'' ELSE N' ' + 工序名称 END
+ CASE WHEN 工序顺序 IS NULL THEN N'' ELSE N' 序' + CAST(工序顺序 AS VARCHAR(20)) END AS taskDescription,
订单号 AS productionOrderNo,
ISNULL(工位名称, N'') AS station,
CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours,
CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours,
CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty,
CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty,
CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours,
CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime,
CAST(0 AS VARCHAR(20)) AS programTime,
CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours,
CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours,
ISNULL(操作人, N'') AS operatorNames,
CAST(记录数 AS VARCHAR(20)) AS recordCount,
工序顺序
FROM 订单工位汇总
ORDER BY productionOrderNo, 工序顺序, materialCode, [Level], station;
END
GO

View File

@@ -0,0 +1,378 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[生产管理_结算工时_查询]
@合同号 NVARCHAR(50) = NULL,
@产品编码 NVARCHAR(100) = NULL,
@订单号 NVARCHAR(50) = NULL,
@工位 NVARCHAR(50) = NULL,
@开始日期 DATE = NULL,
@结束日期 DATE = NULL,
@数据条数 INT = 100
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TopCount INT = CASE WHEN ISNULL(@数据条数, 0) <= 0 THEN 100 ELSE @数据条数 END;
CREATE TABLE #任务
(
TaskAID BIGINT NOT NULL PRIMARY KEY,
订单编号 INT NOT NULL,
订单行号 INT NULL,
产品编码 NVARCHAR(1000) NULL,
产品名称 NVARCHAR(1000) NULL,
工序名称 NVARCHAR(100) NULL,
工位名称 NVARCHAR(100) NULL,
物料编号 NVARCHAR(1000) NULL,
物料描述 NVARCHAR(1000) NULL,
合同号 NVARCHAR(100) NULL
);
INSERT INTO #任务
(
TaskAID,
订单编号,
订单行号,
产品编码,
产品名称,
工序名称,
工位名称,
物料编号,
物料描述,
合同号
)
SELECT TOP (@TopCount)
q.AID AS TaskAID,
q.订单编号,
q.订单行号,
q.物料编码 AS 产品编码,
q.物料名称 AS 产品名称,
q.工序名称,
q.指派对象 AS 工位名称,
p.物料编号,
p.物料描述,
p.合同号
FROM dbo.MES_接口_生产计划 AS p
INNER JOIN dbo.MES_接口_生产计划_生产任务 AS q
ON q.订单编号 = p.订单编号
AND q.物料类型 = N'pit_Resource'
WHERE p.单据状态 IS NOT NULL
AND p.订单编号 > 6000
AND (@合同号 IS NULL OR @合同号 = N'' OR p.合同号 LIKE N'%' + @合同号 + N'%')
AND (@产品编码 IS NULL OR @产品编码 = N'' OR q.物料编码 LIKE N'%' + @产品编码 + N'%')
AND (@订单号 IS NULL OR @订单号 = N'' OR CONVERT(NVARCHAR(50), q.订单编号) = @订单号)
AND (@工位 IS NULL OR @工位 = N'' OR q.指派对象 LIKE N'%' + @工位 + N'%')
ORDER BY q.订单编号 DESC, q.订单行号;
CREATE TABLE #基础数据
(
TaskAID BIGINT NULL,
开始时间 DATETIME NULL,
操作内容 NVARCHAR(1000) NULL,
操作类别 NVARCHAR(100) NULL,
操作人 NVARCHAR(100) NULL,
加工工时 INT NULL,
操作数值 INT NULL,
订单合同号 NVARCHAR(100) NULL,
订单号 INT NOT NULL,
订单行号 INT NULL,
产品编码 NVARCHAR(1000) NULL,
产品名称 NVARCHAR(1000) NULL,
工序名称 NVARCHAR(100) NULL,
工位名称 NVARCHAR(100) NULL,
物料编号 NVARCHAR(1000) NULL,
物料描述 NVARCHAR(1000) NULL
);
INSERT INTO #基础数据
(
TaskAID,
开始时间,
操作内容,
操作类别,
操作人,
加工工时,
操作数值,
订单合同号,
订单号,
订单行号,
产品编码,
产品名称,
工序名称,
工位名称,
物料编号,
物料描述
)
SELECT
t.TaskAID,
v.开始时间,
v.操作内容,
v.操作类别,
v.操作人,
v.加工工时,
v.操作数值,
t.合同号 AS 订单合同号,
t.订单编号 AS 订单号,
t.订单行号,
t.产品编码,
t.产品名称,
t.工序名称,
t.工位名称,
t.物料编号,
t.物料描述
FROM #任务 AS t
OUTER APPLY
(
SELECT
ISNULL(c.操作类别, o.操作类别) AS 操作类别,
ISNULL(c.操作人, o.操作人) AS 操作人,
ISNULL(c.操作数值, o.操作数值) AS 操作数值,
ISNULL(c.操作内容, o.操作内容) AS 操作内容,
ISNULL(c.开始时间, o.开始时间) AS 开始时间,
ISNULL(c.结束时间, o.结束时间) AS 结束时间,
ISNULL(c.工时, o.实际工时) AS 加工工时
FROM dbo.YL_加工中心_操作记录表 AS o
LEFT JOIN dbo.生产管理_工时校验_校验工时表 AS c
ON o.AID = c.报工记录id
WHERE o.TaskAID = t.TaskAID
AND o.工位名称 <> N'外协'
AND (o.操作类别 <> N'报工' OR ISNULL(c.结束时间, o.结束时间) IS NOT NULL)
AND (c.AID IS NOT NULL OR o.操作类别 <> N'收料')
AND (
c.AID IS NOT NULL
OR o.操作内容 NOT IN (N'开始加工', N'辅助开始')
OR o.结束时间 IS NOT NULL
OR NOT EXISTS
(
SELECT 1
FROM dbo.YL_加工中心_操作记录表 AS t2
WHERE t2.操作内容 IN (N'报工', N'辅助结束')
AND t2.TaskAID = o.TaskAID
AND t2.开始时间 = o.开始时间
)
)
AND (
o.操作内容 NOT IN (N'辅助结束')
OR NOT EXISTS
(
SELECT 1
FROM dbo.YL_加工中心_操作记录表 AS p
WHERE p.操作内容 = N'辅助结束'
AND p.TaskAID = o.TaskAID
AND p.结束时间 IS NULL
)
)
AND (
o.操作内容 NOT IN (N'开始加工', N'辅助开始')
OR NOT EXISTS
(
SELECT 1
FROM dbo.YL_加工中心_操作记录表 AS p
WHERE p.操作内容 = N'暂停'
AND p.TaskAID = o.TaskAID
AND p.结束时间 = o.开始时间
AND p.操作人 = o.操作人
)
)
AND (
o.操作数值 IS NOT NULL
OR (o.操作内容 IN (N'开始加工', N'辅助开始') AND o.结束时间 IS NULL)
OR o.操作描述 <> N''
)
) AS v
WHERE (@开始日期 IS NULL OR @开始日期 = N'' OR v.开始时间 >= @开始日期)
AND (@结束日期 IS NULL OR @结束日期 = N'' OR v.开始时间 < DATEADD(DAY, 1, @结束日期));
CREATE INDEX IX_基础数据_TaskStart ON #基础数据 (TaskAID, 开始时间);
CREATE TABLE #操作人拼接
(
TaskAID BIGINT NOT NULL,
开始时间 VARCHAR(19) NOT NULL,
操作人 NVARCHAR(MAX) NULL,
PRIMARY KEY (TaskAID, 开始时间)
);
INSERT INTO #操作人拼接 (TaskAID, 开始时间, 操作人)
SELECT
TaskAID,
开始时间,
STRING_AGG(CONVERT(NVARCHAR(MAX), 操作人), N',') AS 操作人
FROM
(
SELECT DISTINCT
k.TaskAID,
k.开始时间,
LTRIM(RTRIM(s.value)) AS 操作人
FROM
(
SELECT DISTINCT
TaskAID,
CONVERT(VARCHAR(19), 开始时间, 120) AS 开始时间
FROM #基础数据
WHERE TaskAID IS NOT NULL
AND 开始时间 IS NOT NULL
) AS k
INNER JOIN dbo.YL_加工中心_操作记录表 AS o
ON o.TaskAID = k.TaskAID
AND o.开始时间 >= CONVERT(DATETIME, k.开始时间, 120)
AND o.开始时间 < DATEADD(SECOND, 1, CONVERT(DATETIME, k.开始时间, 120))
LEFT JOIN dbo.生产管理_工时校验_校验工时表 AS c
ON o.AID = c.报工记录id
CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(ISNULL(ISNULL(c.操作人, o.操作人), N''), N',', N','), N'、', N','), N',') AS s
WHERE ISNULL(ISNULL(c.工时, o.实际工时), 0) <= 0
AND NULLIF(LTRIM(RTRIM(s.value)), N'') IS NOT NULL
) AS x
GROUP BY TaskAID, 开始时间;
;WITH 结算明细 AS
(
SELECT
ISNULL(b.物料编号, b.产品编码) AS 物料编号,
ISNULL(b.物料描述, b.产品名称) AS 物料描述,
b.订单号,
b.工位名称,
b.TaskAID,
b.工序名称,
b.订单行号,
ISNULL(o.操作人, N'') AS 操作人,
CASE
WHEN ISNULL(b.操作内容, N'') LIKE N'%辅助%' OR ISNULL(b.操作类别, N'') LIKE N'%辅助%' THEN N'辅助结束'
ELSE N'报工'
END AS 操作类型,
CAST(ISNULL(b.加工工时, 0) / 60.0 / 60.0 AS DECIMAL(18, 4)) AS 工时小时,
ISNULL(b.操作数值, 0) AS 完成数
FROM #基础数据 AS b
LEFT JOIN #操作人拼接 AS o
ON o.TaskAID = b.TaskAID
AND o.开始时间 = CONVERT(VARCHAR(19), b.开始时间, 120)
),
订单工位汇总基础 AS
(
SELECT
物料编号,
物料描述,
订单号,
工位名称,
MAX(工序名称) AS 工序名称,
订单行号 AS 工序顺序,
COUNT(*) AS 记录数,
SUM(CASE WHEN 操作类型 = N'报工' THEN 工时小时 ELSE 0 END) AS 报工工时,
SUM(CASE WHEN 操作类型 = N'辅助结束' THEN 工时小时 ELSE 0 END) AS 主辅工时,
SUM(CASE WHEN 操作类型 = N'报工' THEN 完成数 ELSE 0 END) AS 报工完成数,
SUM(CASE WHEN 操作类型 = N'辅助结束' THEN 完成数 ELSE 0 END) AS 辅助完成数,
SUM(工时小时) AS 合计工时
FROM 结算明细
GROUP BY 物料编号, 物料描述, 订单号, 工位名称, 订单行号
),
订单工位操作人 AS
(
SELECT
物料编号,
订单号,
ISNULL(工位名称, N'') AS 工位名称,
STRING_AGG(CONVERT(NVARCHAR(MAX), 操作人), N',') AS 操作人
FROM
(
SELECT DISTINCT
j.物料编号,
j.订单号,
ISNULL(j.工位名称, N'') AS 工位名称,
LTRIM(RTRIM(s.value)) AS 操作人
FROM 结算明细 AS j
CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(ISNULL(j.操作人, N''), N',', N','), N'、', N','), N',') AS s
WHERE NULLIF(LTRIM(RTRIM(s.value)), N'') IS NOT NULL
) AS x
GROUP BY 物料编号, 订单号, ISNULL(工位名称, N'')
),
订单工位汇总 AS
(
SELECT
b.物料编号,
b.物料描述,
b.订单号,
b.工位名称,
b.工序名称,
b.工序顺序,
b.记录数,
b.报工工时,
b.主辅工时,
b.报工完成数,
b.辅助完成数,
b.合计工时,
ISNULL(o.操作人, N'') AS 操作人
FROM 订单工位汇总基础 AS b
LEFT JOIN 订单工位操作人 AS o
ON o.物料编号 = b.物料编号
AND o.订单号 = b.订单号
AND o.工位名称 = ISNULL(b.工位名称, N'')
),
物料汇总 AS
(
SELECT
物料编号,
物料描述,
SUM(记录数) AS 记录数,
SUM(报工工时) AS 报工工时,
SUM(主辅工时) AS 主辅工时,
SUM(报工完成数) AS 报工完成数,
SUM(辅助完成数) AS 辅助完成数,
SUM(合计工时) AS 合计工时
FROM 订单工位汇总
GROUP BY 物料编号, 物料描述
)
SELECT
1 AS [Level],
物料编号 AS materialCode,
物料描述 AS materialDesc,
ISNULL(物料描述, N'') + N' ' + ISNULL(物料编号, N'') AS taskDescription,
CAST(0 AS INT) AS productionOrderNo,
N'' AS station,
CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours,
CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours,
CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty,
CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty,
CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours,
CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime,
CAST(0 AS VARCHAR(20)) AS programTime,
CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours,
CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours,
N'' AS operatorNames,
CAST(记录数 AS VARCHAR(20)) AS recordCount,
CAST(0 AS INT) AS 工序顺序
FROM 物料汇总
UNION ALL
SELECT
2 AS [Level],
物料编号 AS materialCode,
物料描述 AS materialDesc,
ISNULL(物料描述, N'') + N' ' + ISNULL(物料编号, N'')
+ CASE WHEN NULLIF(ISNULL(工序名称, N''), N'') IS NULL THEN N'' ELSE N' ' + 工序名称 END
+ CASE WHEN 工序顺序 IS NULL THEN N'' ELSE N' 序' + CAST(工序顺序 AS VARCHAR(20)) END AS taskDescription,
订单号 AS productionOrderNo,
ISNULL(工位名称, N'') AS station,
CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours,
CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours,
CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty,
CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty,
CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours,
CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime,
CAST(0 AS VARCHAR(20)) AS programTime,
CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours,
CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours,
ISNULL(操作人, N'') AS operatorNames,
CAST(记录数 AS VARCHAR(20)) AS recordCount,
工序顺序
FROM 订单工位汇总
ORDER BY productionOrderNo, 工序顺序, materialCode, [Level], station;
END
GO