feat: 完善设计任务与工时维护

This commit is contained in:
2026-07-17 18:27:47 +08:00
parent 5b7397237e
commit e31027aa9d
7 changed files with 1228 additions and 108 deletions

View File

@@ -0,0 +1,409 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
IF COL_LENGTH(N'[dbo].[MES_设计报工_任务]', N'任务来源') IS NULL
BEGIN
ALTER TABLE [dbo].[MES_设计报工_任务] ADD [任务来源] nvarchar(200) NULL;
END
GO
DECLARE @说明类型约束 sysname;
DECLARE @删除约束SQL nvarchar(max);
SELECT TOP (1) @说明类型约束 = cc.[name]
FROM sys.check_constraints AS cc
WHERE cc.[parent_object_id] = OBJECT_ID(N'[dbo].[MES_设计报工_任务说明]')
AND cc.[definition] LIKE N'%说明类型%';
IF @说明类型约束 IS NOT NULL
BEGIN
SET @删除约束SQL = N'ALTER TABLE [dbo].[MES_设计报工_任务说明] DROP CONSTRAINT '
+ QUOTENAME(@说明类型约束) + N';';
EXEC sys.sp_executesql @删除约束SQL;
END
GO
ALTER TABLE [dbo].[MES_设计报工_任务说明] WITH CHECK
ADD CONSTRAINT [CK_MES_设计报工_任务说明_类型]
CHECK ([说明类型] IN (N'领导批示', N'异常说明', N'奇思妙想'));
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_领导批示权限_查询]
@角色编号 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
SELECT CAST(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 AS int) AS [有批示权限];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务说明_新增]
@DID int,
@说明类型 nvarchar(20),
@说明内容 nvarchar(2000),
@操作人ID nvarchar(100) = N'',
@操作人 nvarchar(100) = N'',
@角色编号 nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
SET @说明类型 = LTRIM(RTRIM(ISNULL(@说明类型, N'')));
SET @说明内容 = LTRIM(RTRIM(ISNULL(@说明内容, N'')));
IF @说明类型 NOT IN (N'领导批示', N'异常说明', N'奇思妙想')
BEGIN
SELECT CAST(0 AS int) AS [result], N'说明类型不正确' AS [message];
RETURN;
END
IF @说明内容 = N''
BEGIN
SELECT CAST(0 AS int) AS [result], N'说明内容不能为空' AS [message];
RETURN;
END
IF @说明类型 = N'领导批示'
AND NOT EXISTS
(
SELECT 1
FROM [dbo].[登录基础数据_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @角色编号
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
)
BEGIN
SELECT CAST(0 AS int) AS [result], N'当前角色无领导批示权限' AS [message];
RETURN;
END
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID)
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''));
SELECT CAST(1 AS int) AS [result], N'保存成功' AS [message], CONVERT(int, SCOPE_IDENTITY()) AS [SID];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_查询]
@DID int = NULL,
@项目号 nvarchar(100) = N'',
@物料编码 nvarchar(100) = N'',
@图号 nvarchar(100) = N'',
@类别 nvarchar(100) = N'',
@任务来源 nvarchar(200) = N'',
@关联父件物料编码 nvarchar(100) = N'',
@预计开始时间_Start nvarchar(30) = N'',
@预计开始时间_End nvarchar(30) = N'',
@预计结束时间_Start nvarchar(30) = N'',
@预计结束时间_End nvarchar(30) = N'',
@单据状态 nvarchar(50) = N'',
@当前操作人ID nvarchar(100) = N'',
@当前操作人 nvarchar(100) = 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
ISNULL(task_notes.[领导批示], N'') AS [领导批示],
t.[DID],
t.[项目号],
t.[物料编码],
t.[物料名称],
t.[图号],
t.[类别],
t.[任务来源],
t.[任务描述],
t.[关联父件物料编码],
t.[关联父件物料名称],
t.[设计要求],
t.[研发立项号],
t.[研发目的],
t.[对齐可见ID],
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 [未结束报工数],
ISNULL(r.[当前用户未结束报工数], 0) AS [当前用户未结束报工数],
ISNULL(p.[未结束报工人员], N'') AS [未结束报工人员],
CONVERT(varchar(19), r.[最后开始时间], 120) AS [最后开始时间],
CONVERT(varchar(19), r.[最后结束时间], 120) AS [最后结束时间],
ISNULL(progress_notes.[进度说明], N'') AS [进度说明],
ISNULL(task_notes.[异常说明], N'') AS [异常说明],
ISNULL(task_notes.[奇思妙想], N'') AS [奇思妙想]
FROM [dbo].[MES_设计报工_任务] AS t
OUTER APPLY
(
SELECT
COUNT(1) AS [报工次数],
SUM(CASE WHEN rr.[结束时间] IS NULL THEN 1 ELSE 0 END) AS [未结束报工数],
SUM(CASE
WHEN rr.[结束时间] IS NULL
AND (
(NULLIF(@当前操作人ID, N'') IS NOT NULL AND ISNULL(rr.[操作人ID], N'') = @当前操作人ID)
OR (NULLIF(@当前操作人ID, N'') IS NULL AND NULLIF(@当前操作人, N'') IS NOT NULL AND ISNULL(rr.[操作人], N'') = @当前操作人)
)
THEN 1 ELSE 0 END) AS [当前用户未结束报工数],
MAX(rr.[开始时间]) AS [最后开始时间],
MAX(rr.[结束时间]) AS [最后结束时间]
FROM [dbo].[MES_设计报工_记录] AS rr
WHERE rr.[DID] = t.[DID]
) AS r
OUTER APPLY
(
SELECT STRING_AGG(CONVERT(nvarchar(max), x.[操作人标识]), N'、') AS [未结束报工人员]
FROM
(
SELECT DISTINCT COALESCE(NULLIF(rr2.[操作人], N''), NULLIF(rr2.[操作人ID], N''), N'未填写操作人') AS [操作人标识]
FROM [dbo].[MES_设计报工_记录] AS rr2
WHERE rr2.[DID] = t.[DID]
AND rr2.[结束时间] IS NULL
) AS x
) AS p
OUTER APPLY
(
SELECT STRING_AGG(
CONVERT(nvarchar(max),
CONVERT(nvarchar(19), rr3.[结束时间], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(rr3.[操作人])), N''), NULLIF(LTRIM(RTRIM(rr3.[操作人ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ rr3.[进度说明]),
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY rr3.[结束时间] DESC, rr3.[RID] DESC) AS [进度说明]
FROM [dbo].[MES_设计报工_记录] AS rr3
WHERE rr3.[DID] = t.[DID]
AND NULLIF(LTRIM(RTRIM(rr3.[进度说明])), N'') IS NOT NULL
) AS progress_notes
OUTER APPLY
(
SELECT
STRING_AGG(
CASE WHEN n.[说明类型] = N'领导批示'
THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[录入时间], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(n.[操作人])), N''), NULLIF(LTRIM(RTRIM(n.[操作人ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ n.[说明内容]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[录入时间] DESC, n.[SID] DESC) AS [领导批示],
STRING_AGG(
CASE WHEN n.[说明类型] = N'异常说明'
THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[录入时间], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(n.[操作人])), N''), NULLIF(LTRIM(RTRIM(n.[操作人ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ n.[说明内容]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[录入时间] DESC, n.[SID] DESC) AS [异常说明],
STRING_AGG(
CASE WHEN n.[说明类型] = N'奇思妙想'
THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[录入时间], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(n.[操作人])), N''), NULLIF(LTRIM(RTRIM(n.[操作人ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ n.[说明内容]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[录入时间] DESC, n.[SID] DESC) AS [奇思妙想]
FROM [dbo].[MES_设计报工_任务说明] AS n
WHERE n.[DID] = t.[DID]
) AS task_notes
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 t.[任务来源] LIKE N'%' + @任务来源 + N'%')
AND (ISNULL(@关联父件物料编码, N'') = N'' OR t.[关联父件物料编码] LIKE N'%' + @关联父件物料编码 + N'%')
AND
(
ISNULL(@单据状态, N'') = N''
OR @单据状态 = N'全部'
OR (@单据状态 = N'未完成' AND ISNULL(t.[单据状态], N'') <> N'已完成')
OR (@单据状态 <> N'未完成' AND 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))
AND
(
(NULLIF(@当前操作人ID, N'') IS NULL AND NULLIF(@当前操作人, N'') IS NULL)
OR (NULLIF(@当前操作人, N'') IS NOT NULL AND ISNULL(t.[创建人], N'') = @当前操作人)
OR
(
NULLIF(@当前操作人ID, N'') IS NOT NULL
AND CHARINDEX(N',' + @当前操作人ID + N',', N',' + ISNULL(t.[对齐可见ID], N'') + N',') > 0
)
OR
(
NULLIF(@当前操作人, N'') IS NOT NULL
AND CHARINDEX(N',' + @当前操作人 + N',', N',' + ISNULL(t.[对齐可见], N'') + N',') > 0
)
OR
(
NULLIF(@当前操作人ID, N'') IS NOT NULL
AND CHARINDEX(N',' + @当前操作人ID + N',', N',' + ISNULL(t.[指派对象ID], N'') + N',') > 0
)
OR
(
NULLIF(@当前操作人, N'') IS NOT NULL
AND CHARINDEX(N',' + @当前操作人 + N',', N',' + ISNULL(t.[指派对象], N'') + N',') > 0
)
)
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(100) = N'',
@任务来源 nvarchar(200) = 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'',
@对齐可见ID nvarchar(1000) = N'',
@对齐可见 nvarchar(1000) = N''
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[MES_设计报工_任务]
(
[项目号], [物料编码], [物料名称], [图号], [类别], [任务来源], [任务描述],
[关联父件物料编码], [关联父件物料名称], [设计要求],
[研发立项号], [研发目的], [对齐可见ID], [对齐可见], [指派对象ID], [指派对象],
[预计开始时间], [预计结束时间], [单据状态],
[创建人], [最后编辑人], [最后编辑时间], [备注]
)
VALUES
(
NULLIF(@项目号, N''), NULLIF(@物料编码, N''), 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''),
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(100) = N'',
@任务来源 nvarchar(200) = 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'',
@对齐可见ID nvarchar(1000) = N'',
@对齐可见 nvarchar(1000) = 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''),
[任务描述] = CASE
WHEN NULLIF(@最后编辑人, N'') IS NOT NULL AND ISNULL([创建人], N'') = @最后编辑人
THEN NULLIF(@任务描述, N'')
ELSE [任务描述]
END,
[关联父件物料编码] = NULLIF(@关联父件物料编码, N''),
[关联父件物料名称] = NULLIF(@关联父件物料名称, N''),
[设计要求] = CASE
WHEN NULLIF(@最后编辑人, N'') IS NOT NULL AND ISNULL([创建人], N'') = @最后编辑人
THEN NULLIF(@设计要求, N'')
ELSE [设计要求]
END,
[研发立项号] = NULLIF(@研发立项号, N''),
[研发目的] = NULLIF(@研发目的, N''),
[对齐可见ID] = NULLIF(@对齐可见ID, 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