feat: 完善设计报工、质检及齐套跟踪
This commit is contained in:
@@ -0,0 +1,528 @@
|
||||
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(500) NULL;
|
||||
END
|
||||
GO
|
||||
|
||||
IF COL_LENGTH(N'[dbo].[MES_设计报工_任务]', N'对齐可见ID') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[MES_设计报工_任务] ADD [对齐可见ID] nvarchar(1000) NULL;
|
||||
END
|
||||
GO
|
||||
|
||||
IF COL_LENGTH(N'[dbo].[MES_设计报工_任务]', N'对齐可见') IS NULL
|
||||
BEGIN
|
||||
ALTER TABLE [dbo].[MES_设计报工_任务] ADD [对齐可见] nvarchar(1000) NULL;
|
||||
END
|
||||
GO
|
||||
|
||||
IF OBJECT_ID(N'[dbo].[MES_设计报工_任务说明]', N'U') IS NULL
|
||||
BEGIN
|
||||
CREATE TABLE [dbo].[MES_设计报工_任务说明]
|
||||
(
|
||||
[SID] int IDENTITY(1,1) NOT NULL CONSTRAINT [PK_MES_设计报工_任务说明] PRIMARY KEY,
|
||||
[DID] int NOT NULL,
|
||||
[说明类型] nvarchar(20) NOT NULL,
|
||||
[说明内容] nvarchar(2000) NOT NULL,
|
||||
[操作人ID] nvarchar(100) NULL,
|
||||
[操作人] nvarchar(100) NULL,
|
||||
[录入时间] datetime NOT NULL CONSTRAINT [DF_MES_设计报工_任务说明_录入时间] DEFAULT (GETDATE()),
|
||||
CONSTRAINT [FK_MES_设计报工_任务说明_任务] FOREIGN KEY ([DID])
|
||||
REFERENCES [dbo].[MES_设计报工_任务]([DID]) ON DELETE CASCADE,
|
||||
CONSTRAINT [CK_MES_设计报工_任务说明_类型] CHECK ([说明类型] IN (N'异常说明', N'奇思妙想'))
|
||||
);
|
||||
|
||||
CREATE INDEX [IX_MES_设计报工_任务说明_DID_类型_时间]
|
||||
ON [dbo].[MES_设计报工_任务说明]([DID], [说明类型], [录入时间], [SID]);
|
||||
END
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务说明_新增]
|
||||
@DID int,
|
||||
@说明类型 nvarchar(20),
|
||||
@说明内容 nvarchar(2000),
|
||||
@操作人ID 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'奇思妙想')
|
||||
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 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(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
|
||||
t.[DID],
|
||||
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) + NCHAR(13) + NCHAR(10) + rr3.[进度说明]),
|
||||
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
|
||||
) WITHIN GROUP (ORDER BY rr3.[结束时间], rr3.[RID]) 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) + NCHAR(13) + NCHAR(10) + n.[说明内容]) END,
|
||||
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
|
||||
) WITHIN GROUP (ORDER BY n.[录入时间], n.[SID]) AS [异常说明],
|
||||
STRING_AGG(
|
||||
CASE WHEN n.[说明类型] = N'奇思妙想'
|
||||
THEN CONVERT(nvarchar(max), CONVERT(nvarchar(19), n.[录入时间], 120) + NCHAR(13) + NCHAR(10) + n.[说明内容]) END,
|
||||
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
|
||||
) WITHIN GROUP (ORDER BY n.[录入时间], n.[SID]) 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 @单据状态 = 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))
|
||||
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(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(@对齐可见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(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''),
|
||||
[关联父件物料编码] = NULLIF(@关联父件物料编码, N''),
|
||||
[关联父件物料名称] = NULLIF(@关联父件物料名称, N''),
|
||||
[设计要求] = NULLIF(@设计要求, N''),
|
||||
[研发立项号] = 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
|
||||
|
||||
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_开始]
|
||||
@DID int,
|
||||
@操作人ID nvarchar(100) = N'',
|
||||
@操作人 nvarchar(100) = N''
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT OFF;
|
||||
|
||||
DECLARE @当前操作人ID nvarchar(100) = NULLIF(@操作人ID, N'');
|
||||
DECLARE @当前操作人 nvarchar(100) = NULLIF(@操作人, N'');
|
||||
DECLARE @人员锁标识 nvarchar(255);
|
||||
DECLARE @锁定结果 int;
|
||||
DECLARE @未结束DID int;
|
||||
DECLARE @未结束任务 nvarchar(500);
|
||||
DECLARE @RID int;
|
||||
DECLARE @初始事务数 int = @@TRANCOUNT;
|
||||
DECLARE @保存点名称 sysname = N'DRT_Task_Start';
|
||||
|
||||
IF @当前操作人ID IS NULL AND @当前操作人 IS NULL
|
||||
BEGIN
|
||||
SELECT CAST(0 AS int) AS [result], N'未获取到当前操作人,不能开始' AS [message];
|
||||
RETURN;
|
||||
END
|
||||
|
||||
SET @人员锁标识 = N'DesignReportTask:' + COALESCE(@当前操作人ID, N'NAME:' + @当前操作人);
|
||||
|
||||
BEGIN TRY
|
||||
IF @初始事务数 = 0 BEGIN TRANSACTION;
|
||||
ELSE SAVE TRANSACTION @保存点名称;
|
||||
|
||||
EXEC @锁定结果 = sys.sp_getapplock
|
||||
@Resource = @人员锁标识,
|
||||
@LockMode = N'Exclusive',
|
||||
@LockOwner = N'Transaction',
|
||||
@LockTimeout = 10000;
|
||||
|
||||
IF @锁定结果 < 0
|
||||
BEGIN
|
||||
IF @初始事务数 = 0 ROLLBACK TRANSACTION;
|
||||
ELSE ROLLBACK TRANSACTION @保存点名称;
|
||||
SELECT CAST(0 AS int) AS [result], N'开始校验繁忙,请稍后重试' AS [message];
|
||||
RETURN;
|
||||
END
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WITH (UPDLOCK, HOLDLOCK) WHERE [DID] = @DID)
|
||||
BEGIN
|
||||
IF @初始事务数 = 0 ROLLBACK TRANSACTION;
|
||||
ELSE ROLLBACK TRANSACTION @保存点名称;
|
||||
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
|
||||
RETURN;
|
||||
END
|
||||
|
||||
SELECT TOP 1
|
||||
@未结束DID = r.[DID],
|
||||
@未结束任务 = t.[任务描述]
|
||||
FROM [dbo].[MES_设计报工_记录] AS r WITH (UPDLOCK, HOLDLOCK)
|
||||
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON t.[DID] = r.[DID]
|
||||
WHERE r.[结束时间] IS NULL
|
||||
AND (
|
||||
(@当前操作人ID IS NOT NULL AND ISNULL(r.[操作人ID], N'') = @当前操作人ID)
|
||||
OR (@当前操作人ID IS NULL AND @当前操作人 IS NOT NULL AND ISNULL(r.[操作人], N'') = @当前操作人)
|
||||
)
|
||||
ORDER BY r.[开始时间] DESC, r.[RID] DESC;
|
||||
|
||||
IF @未结束DID IS NOT NULL
|
||||
BEGIN
|
||||
IF @初始事务数 = 0 ROLLBACK TRANSACTION;
|
||||
ELSE ROLLBACK TRANSACTION @保存点名称;
|
||||
SELECT
|
||||
CAST(0 AS int) AS [result],
|
||||
N'任务 DID ' + CONVERT(nvarchar(20), @未结束DID)
|
||||
+ CASE WHEN NULLIF(@未结束任务, N'') IS NULL THEN N'' ELSE N'(' + @未结束任务 + N')' END
|
||||
+ N' 尚未关闭,请先结束该任务' AS [message],
|
||||
@未结束DID AS [未结束DID];
|
||||
RETURN;
|
||||
END
|
||||
|
||||
INSERT INTO [dbo].[MES_设计报工_记录]([DID], [操作人ID], [操作人], [开始时间], [报工状态])
|
||||
VALUES(@DID, @当前操作人ID, @当前操作人, GETDATE(), N'执行中');
|
||||
|
||||
SET @RID = CONVERT(int, SCOPE_IDENTITY());
|
||||
|
||||
UPDATE [dbo].[MES_设计报工_任务]
|
||||
SET [单据状态] = N'执行中', [最后编辑人] = @当前操作人, [最后编辑时间] = GETDATE()
|
||||
WHERE [DID] = @DID;
|
||||
|
||||
IF @初始事务数 = 0 COMMIT TRANSACTION;
|
||||
SELECT CAST(1 AS int) AS [result], N'开始成功' AS [message], @RID AS [RID];
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF XACT_STATE() <> 0
|
||||
BEGIN
|
||||
IF @初始事务数 = 0 ROLLBACK TRANSACTION;
|
||||
ELSE IF XACT_STATE() = 1 ROLLBACK TRANSACTION @保存点名称;
|
||||
END
|
||||
SELECT CAST(0 AS int) AS [result], ERROR_MESSAGE() AS [message];
|
||||
END CATCH
|
||||
END
|
||||
GO
|
||||
|
||||
CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_结束]
|
||||
@DID int,
|
||||
@操作人ID nvarchar(100) = N'',
|
||||
@操作人 nvarchar(100) = N'',
|
||||
@进度说明 nvarchar(500) = N''
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON;
|
||||
SET XACT_ABORT OFF;
|
||||
|
||||
DECLARE @当前操作人ID nvarchar(100) = NULLIF(@操作人ID, N'');
|
||||
DECLARE @当前操作人 nvarchar(100) = NULLIF(@操作人, N'');
|
||||
DECLARE @RID int;
|
||||
DECLARE @初始事务数 int = @@TRANCOUNT;
|
||||
DECLARE @保存点名称 sysname = N'DRT_Task_End';
|
||||
|
||||
IF @当前操作人ID IS NULL AND @当前操作人 IS NULL
|
||||
BEGIN
|
||||
SELECT CAST(0 AS int) AS [result], N'未获取到当前操作人,不能结束' AS [message];
|
||||
RETURN;
|
||||
END
|
||||
|
||||
BEGIN TRY
|
||||
IF @初始事务数 = 0 BEGIN TRANSACTION;
|
||||
ELSE SAVE TRANSACTION @保存点名称;
|
||||
|
||||
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WITH (UPDLOCK, HOLDLOCK) WHERE [DID] = @DID)
|
||||
BEGIN
|
||||
IF @初始事务数 = 0 ROLLBACK TRANSACTION;
|
||||
ELSE ROLLBACK TRANSACTION @保存点名称;
|
||||
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
|
||||
RETURN;
|
||||
END
|
||||
|
||||
SELECT TOP 1 @RID = [RID]
|
||||
FROM [dbo].[MES_设计报工_记录] WITH (UPDLOCK, HOLDLOCK)
|
||||
WHERE [DID] = @DID
|
||||
AND [结束时间] IS NULL
|
||||
AND (
|
||||
(@当前操作人ID IS NOT NULL AND ISNULL([操作人ID], N'') = @当前操作人ID)
|
||||
OR (@当前操作人ID IS NULL AND @当前操作人 IS NOT NULL AND ISNULL([操作人], N'') = @当前操作人)
|
||||
)
|
||||
ORDER BY [开始时间] DESC, [RID] DESC;
|
||||
|
||||
IF @RID IS NULL
|
||||
BEGIN
|
||||
IF @初始事务数 = 0 ROLLBACK TRANSACTION;
|
||||
ELSE ROLLBACK TRANSACTION @保存点名称;
|
||||
SELECT CAST(0 AS int) AS [result], N'当前人员没有未结束的报工记录' AS [message];
|
||||
RETURN;
|
||||
END
|
||||
|
||||
UPDATE [dbo].[MES_设计报工_记录]
|
||||
SET
|
||||
[结束时间] = GETDATE(),
|
||||
[工时秒数] = DATEDIFF(second, [开始时间], GETDATE()),
|
||||
[报工状态] = N'已结束',
|
||||
[进度说明] = NULLIF(LTRIM(RTRIM(@进度说明)), N'')
|
||||
WHERE [RID] = @RID;
|
||||
|
||||
UPDATE [dbo].[MES_设计报工_任务]
|
||||
SET
|
||||
[单据状态] = CASE
|
||||
WHEN EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NULL) THEN N'执行中'
|
||||
ELSE N'已结束'
|
||||
END,
|
||||
[最后编辑人] = @当前操作人,
|
||||
[最后编辑时间] = GETDATE()
|
||||
WHERE [DID] = @DID;
|
||||
|
||||
IF @初始事务数 = 0 COMMIT TRANSACTION;
|
||||
SELECT CAST(1 AS int) AS [result], N'结束成功' AS [message], @RID AS [RID];
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
IF XACT_STATE() <> 0
|
||||
BEGIN
|
||||
IF @初始事务数 = 0 ROLLBACK TRANSACTION;
|
||||
ELSE IF XACT_STATE() = 1 ROLLBACK TRANSACTION @保存点名称;
|
||||
END
|
||||
SELECT CAST(0 AS int) AS [result], ERROR_MESSAGE() AS [message];
|
||||
END CATCH
|
||||
END
|
||||
GO
|
||||
@@ -203,6 +203,7 @@ BEGIN
|
||||
p2.[订单行号],
|
||||
p2.[工序名称],
|
||||
p2.[指派对象],
|
||||
p2.[外协分组],
|
||||
p2.[计划开始时间],
|
||||
p2.[计划完成时间],
|
||||
ISNULL(p2.[进度], 0) AS [进度],
|
||||
|
||||
@@ -3186,3 +3186,259 @@ pm run build:通过,仅有既有警告。
|
||||
|
||||
### 结论
|
||||
- 当前工作区内的设计工时报表导出、产品合格率工位菜单迁移、旧菜单脚本修正和对应中文日志已全部提交并上传到远程。
|
||||
- 功能提交号为 `0784746`。
|
||||
|
||||
### 验证结果
|
||||
- `git diff --check` 通过。
|
||||
- `git diff --cached --check` 通过。
|
||||
- 凭据特征扫描结果为 0。
|
||||
- 上传前本地与远端分叉为 `0 0`。
|
||||
- 推送后本地与远端同步,工作区无未提交修改。
|
||||
|
||||
## 2026-07-15 设计报工限制、重复报工及多类说明功能
|
||||
|
||||
### 用户提问
|
||||
- 修改 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`:一个人不能同时开始多个任务,点击开始时提示哪个任务未关闭。
|
||||
- 任务点击完成后仍允许再次开始和结束,第二次开始、结束后也可以再次完成。
|
||||
- 增加“异常说明”和“奇思妙想”功能,允许随时多次录入文字;列表按“时间换行内容”的格式显示,多次录入显示多条。
|
||||
- “进度说明”采用与异常说明相同的列表显示格式。
|
||||
- 将“未结束人员”改名为“设计正在对应”。
|
||||
- 在设计任务页面同时显示异常说明、奇思妙想、进度说明和设计正在对应字段。
|
||||
|
||||
### 执行过程
|
||||
1. 读取仓库根目录 `AGENTS.md`,确认本次执行结束后必须将提问、结论和完整执行过程以中文追加到 `gptlog-process/gpdlog.md`。
|
||||
2. 检查目标报工页、设计任务页、校验页、工时报表页、相关 SQL 增量脚本、项目命令和 Git 工作区状态。
|
||||
3. 确认报工页原有逻辑只校验当前行的 `当前用户未结束报工数`,无法可靠阻止同一人员跨任务同时开始;前后端还把“已完成”作为禁止重新开始的终态。
|
||||
4. 确认原有结束弹窗已经可以录入进度说明,数据库报工记录也已有对应字段,但任务查询和两个任务列表尚未聚合显示进度历史。
|
||||
5. 确认异常说明和奇思妙想没有独立数据表及保存过程,不能仅靠前端完成持久化和多条历史展示,因此确定增加幂等数据库增量脚本。
|
||||
6. 检查工作区已有改动,发现设计任务页存在用户未提交的表单布局调整,质量检验页面也存在无关修改;本次保留所有已有改动,只在设计任务页追加所需列表字段,并对该页原有布局改动做必要的空格格式整理。
|
||||
7. 修改报工页列表:
|
||||
- 将“未结束人员”列标题改为“设计正在对应”,继续使用原有 `未结束报工人员` 返回字段。
|
||||
- 新增进度说明、异常说明和奇思妙想三列。
|
||||
- 三列使用保留换行的样式展示历史内容。
|
||||
8. 修改报工页操作区:
|
||||
- “开始”按钮不再因任务已完成而禁用。
|
||||
- 新增“异常说明”和“奇思妙想”两个文字按钮。
|
||||
- 新增通用说明录入弹窗,显示 DID 和任务描述,内容必填,最多 2000 字。
|
||||
- 保存时调用新增存储过程,并携带当前操作人 ID 和姓名。
|
||||
9. 增加开始前全任务实时查询:如果当前人员已有任何未结束记录,提示“任务 DID + 任务描述尚未关闭,请先结束该任务”;查询失败时阻止开始,避免绕过校验。
|
||||
10. 保留结束按钮仅在当前任务存在本人未结束记录时启用;已完成任务重新开始后状态变为执行中,结束后变为已结束,因此可以再次点击完成。
|
||||
11. 修改设计任务页列表,新增“设计正在对应”、进度说明、异常说明和奇思妙想四列,展示格式与报工页一致。
|
||||
12. 新增 `db_backups/update_design_report_task_notes_and_restart_20260715.sql`:
|
||||
- 幂等补齐报工记录的进度说明字段。
|
||||
- 新建 `MES_设计报工_任务说明` 表,保存异常说明和奇思妙想的多条记录、操作人及录入时间。
|
||||
- 新建 `设计报工_任务说明_新增` 保存过程,校验任务、说明类型和非空内容。
|
||||
- 重建 `设计报工_任务_查询`,聚合进度说明、异常说明和奇思妙想,单条格式为“时间 + 换行 + 内容”,多条之间留空行。
|
||||
- 重建设计报工开始过程,取消已完成任务禁止开始的限制。
|
||||
- 开始过程使用按人员标识生成的 `sp_getapplock` 事务锁,防止两个页面并发点击时同时产生两条未结束记录。
|
||||
- 开始过程跨全部任务检查当前人员的未结束记录,返回未关闭 DID 和任务描述。
|
||||
- 重建设计报工结束过程,允许重新开始后的任务结束,并按现有方式保存本轮进度说明。
|
||||
13. 首次执行两目标页面 ESLint 时,报工页无错误;设计任务页报告用户原有布局调整中的多余空格、空行和异步箭头函数格式问题。
|
||||
14. 对设计任务页做最小格式整理后,再次执行两目标页面 ESLint,检查通过;仅输出项目依赖的 Browserslist 和 Baseline 数据过期提示。
|
||||
15. 对三个目标文件执行 `git diff --check`,检查通过;全工作区检查仍能看到无关的 `OtherInbound.vue` 原有尾随空格,本次没有修改该文件。
|
||||
16. 执行 `npm run build`,webpack 生产构建成功;仅有项目原有的大资源体积警告和浏览器兼容数据过期提示,构建没有留下受版本控制的 `dist` 改动。
|
||||
17. 尝试使用当前 Windows 集成身份对目标数据库 `192.168.2.92 / YL_MESDB` 做只读连通性检查,服务器拒绝 Guest 身份登录;未猜测或查找数据库凭据,也未向目标数据库发布脚本。
|
||||
18. 检查本地开发服务,确认进程来自当前仓库,访问 `https://localhost:1997/` 返回 HTTP 200。
|
||||
19. 为验证 SQL,在独立 LocalDB 测试实例中创建最小基础表。前两次使用 PowerShell 标准输入传递中文 SQL 时发生代码页解析错误,均未进入增量脚本有效验证;每次都在 `finally` 中删除测试实例,随后核对并清理由第一次测试生成的 MDF/LDF 文件。
|
||||
20. 改用 UTF-8 SQL 测试夹具和 `sqlcmd -i -f 65001` 重跑隔离测试,增量脚本编译及业务场景验证通过:
|
||||
- 状态为已完成的任务可以重新开始。
|
||||
- 同一人员未结束第一项任务时开始第二项任务,被正确拦截并返回第一项任务的 DID 和描述。
|
||||
- 第一项任务可以正常结束并保存进度说明,状态回到已结束。
|
||||
- 连续保存两条异常说明和一条奇思妙想均成功。
|
||||
- 任务查询按要求返回进度说明、两条异常说明和奇思妙想的“时间换行内容”历史。
|
||||
21. 验证结束后删除临时 SQL 测试夹具、LocalDB 实例及测试数据文件,确认不保留测试数据。
|
||||
22. 最终检查目标文件状态和差异,确认未修改用户无关的质量检验页面,未提交或推送任何文件。
|
||||
|
||||
### 修改文件
|
||||
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
|
||||
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
|
||||
- `db_backups/update_design_report_task_notes_and_restart_20260715.sql`
|
||||
- `gptlog-process/gpdlog.md`
|
||||
|
||||
### 结论
|
||||
- 同一人员只能保留一个未结束的设计报工任务,前端会提示具体未关闭任务,数据库事务锁同时保证并发场景不会绕过限制。
|
||||
- 已完成任务可以重新开始、结束,并在新一轮结束后再次完成。
|
||||
- 异常说明和奇思妙想支持在任意任务状态下多次录入;进度说明、异常说明和奇思妙想均按“时间换行内容”显示多条历史。
|
||||
- 报工页和设计任务页都已显示进度说明、异常说明、奇思妙想和“设计正在对应”。
|
||||
- 前端代码和数据库增量脚本均已在本机验证;由于当前身份没有目标 SQL Server 登录权限,增量脚本尚未发布到目标数据库,目标环境启用新功能前必须执行该脚本。
|
||||
|
||||
### 验证结果
|
||||
- 两目标页面 ESLint 检查通过。
|
||||
- 三个目标文件 `git diff --check` 通过。
|
||||
- `npm run build` 生产构建通过。
|
||||
- 隔离 LocalDB 中增量脚本编译通过,重新开始、跨任务拦截、结束及多条说明聚合场景验证通过。
|
||||
- `https://localhost:1997/` 返回 HTTP 200,本地开发服务保持运行。
|
||||
|
||||
## 2026-07-15 发布设计报工增量脚本到目标数据库
|
||||
|
||||
### 用户提问
|
||||
- 用户提供目标数据库地址 `192.168.2.92`、数据库管理员账号及密码,要求继续完成数据库发布。
|
||||
- 按安全要求,本日志不记录数据库明文密码。
|
||||
|
||||
### 执行过程
|
||||
1. 使用用户提供的 SQL Server 凭据连接 `192.168.2.92 / YL_MESDB`,先执行只读预检。
|
||||
2. 预检确认目标数据库为 `YL_MESDB`,服务器为 `YLLT-MES`,数据库兼容级别为 150。
|
||||
3. 确认 `MES_设计报工_任务`、`MES_设计报工_记录` 和记录表的 `进度说明` 字段已经存在;`MES_设计报工_任务说明` 表和 `设计报工_任务说明_新增` 过程尚不存在。
|
||||
4. 确认设计报工查询、开始、结束、完成过程均存在,其中查询和开始过程仍为本次修改前的旧版本。
|
||||
5. 使用 `sqlcmd` 的失败即退出模式和 UTF-8 输入模式执行 `db_backups/update_design_report_task_notes_and_restart_20260715.sql`,脚本发布成功。
|
||||
6. 发布后检查数据库对象定义,确认:
|
||||
- 任务说明表已创建。
|
||||
- 任务说明保存过程已创建。
|
||||
- 开始过程已包含 `sp_getapplock` 人员并发锁。
|
||||
- 查询过程已包含异常说明、奇思妙想和进度说明聚合。
|
||||
- 开始过程已移除“任务已完成,不能开始”的旧限制。
|
||||
7. 在目标数据库外层事务中插入两条临时设计任务,执行完整业务验证:
|
||||
- 状态为已完成的第一条任务开始成功。
|
||||
- 同一测试人员在第一条任务未结束时开始第二条任务,被正确拦截,返回第一条任务 DID 和任务描述。
|
||||
- 第一条任务结束成功并保存第一轮进度,随后完成成功。
|
||||
- 第一条任务第二次开始、结束并保存第二轮进度,随后再次完成成功。
|
||||
- 连续新增两条异常说明和一条奇思妙想,三次保存均成功。
|
||||
- 任务查询返回两次报工记录、最终已完成状态、两轮进度说明、两条异常说明和一条奇思妙想;显示内容符合“时间换行内容”的多条格式。
|
||||
8. 回滚外层测试事务,并查询确认名称以 `Codex发布验证_` 开头的测试任务数量为 0,没有向正式库遗留测试任务、报工记录或说明记录。
|
||||
9. 检查本地工作区,数据库发布没有生成新的临时文件或构建产物;保留用户原有的无关工作区修改。
|
||||
|
||||
### 结论
|
||||
- `update_design_report_task_notes_and_restart_20260715.sql` 已成功发布到 `192.168.2.92 / YL_MESDB`。
|
||||
- 同一人员跨任务同时开始限制、未关闭任务提示、已完成任务重新开始和再次完成、进度说明历史、异常说明及奇思妙想多条录入功能均已在目标数据库验证通过。
|
||||
- 验证数据已全部回滚,正式数据库无测试数据残留。
|
||||
|
||||
### 验证结果
|
||||
- 数据库对象和过程定义检查通过。
|
||||
- 两轮“开始、结束、完成”验证通过。
|
||||
- 跨任务重复开始拦截验证通过。
|
||||
- 多条进度、异常说明和奇思妙想聚合验证通过。
|
||||
- 回滚后测试任务数量为 0。
|
||||
|
||||
## 2026-07-15 设计报工按钮、说明悬停及任务可见范围调整
|
||||
|
||||
### 用户提问
|
||||
- 设计报工点击开始后,当前任务的开始按钮应变为灰色且不可点击。
|
||||
- 进度说明、异常说明和奇思妙想在列表正常显示时应单行省略,避免撑高行高;鼠标悬停对应字段时显示完整内容。
|
||||
- 设计任务新建弹窗需在指派对象前增加“对齐可见”字段,并使用与指派对象相同的人员多选方式。
|
||||
- 设计报工页面根据登录账号限制任务范围,只显示本人创建、对齐可见包含本人以及指派对象包含本人的任务。
|
||||
|
||||
### 执行过程
|
||||
1. 重新检查报工页和设计任务页现有模板、数据模型、人员查询、任务新增/编辑参数及目标数据库过程结构。
|
||||
2. 检查登录流程和 Vuex 用户状态,确认登录态 `id` 来源于 `Personnel_Number`,与设计任务人员选择器使用的 `人员编号`一致,可以直接用于对齐可见和指派对象精确匹配。
|
||||
3. 调整设计报工开始按钮:
|
||||
- 恢复 `canStart` 行级判断。
|
||||
- 当前行 `当前用户未结束报工数` 大于 0 时开始按钮禁用并显示为灰色。
|
||||
- 其他任务的开始按钮仍可点击,继续保留提示具体未关闭任务的逻辑。
|
||||
4. 调整报工页和设计任务页的三类说明展示:
|
||||
- 进度说明、异常说明和奇思妙想正常状态使用单行、溢出隐藏和省略号,不再撑高表格行。
|
||||
- 每个字段外层增加 Element UI Tooltip,非空内容悬停时显示完整历史。
|
||||
- Tooltip 内容保留原有换行,设置最大宽度、最大高度、自动纵向滚动和长文本换行。
|
||||
5. 在设计任务列表增加“对齐可见”列,便于维护人员直接确认任务可见范围。
|
||||
6. 在设计任务新增/编辑弹窗的“指派对象”之前增加“对齐可见”多选人员字段:
|
||||
- 使用独立的远程人员选项集合,避免与指派对象搜索互相覆盖。
|
||||
- 保存人员编号列表到 `对齐可见ID`,保存人员姓名列表到 `对齐可见`。
|
||||
- 编辑时还原已选人员,并补齐当前远程列表中不存在的已选项。
|
||||
- 每次打开新建弹窗时刷新对齐可见人员列表。
|
||||
7. 扩展数据库增量脚本:
|
||||
- 幂等增加任务表 `对齐可见ID` 和 `对齐可见` 两个字段。
|
||||
- 查询过程返回两个新字段。
|
||||
- 重建任务新增和编辑过程,支持保存及修改对齐可见人员。
|
||||
- 仅当查询传入当前登录人员时应用报工页可见范围;不传人员的设计任务维护页继续返回全部任务。
|
||||
8. 第一版可见范围按用户最初要求实现为“本人创建或对齐可见包含本人”。用户随后补充“指派对象的任务也可见”,立即终止正在进行的旧版本构建,避免把不完整版本作为最终验证结果。
|
||||
9. 将查询可见范围扩展为三种关系的并集:
|
||||
- 当前人员姓名等于创建人。
|
||||
- 当前人员编号或姓名存在于对齐可见列表。
|
||||
- 当前人员编号或姓名存在于指派对象列表。
|
||||
10. 使用隔离 LocalDB 对第一版字段和查询规则进行验证:
|
||||
- 不传当前人员时维护页返回全部三条任务。
|
||||
- 创建人只能看到本人创建任务。
|
||||
- 同时具有创建和对齐关系的人员返回两条任务。
|
||||
- 仅对齐可见人员返回对应任务。
|
||||
- 无任何关系人员返回 0 条。
|
||||
- 编辑对齐可见后,新人员立即能查询到任务,并返回对齐可见字段。
|
||||
11. 用户补充指派对象规则后,再次使用隔离 LocalDB 验证:
|
||||
- 指派对象列表包含当前人员时能返回对应任务。
|
||||
- 无创建、对齐或指派关系的人员返回 0 条。
|
||||
12. 两次 LocalDB 验证均使用独立临时实例;验证后删除 SQL 测试夹具、实例及 MDF/LDF 文件,没有遗留测试资源。
|
||||
13. 执行两目标页面 ESLint,检查通过;仅输出项目依赖的 Browserslist 和 Baseline 数据过期提示。
|
||||
14. 对目标前端文件和数据库脚本执行 `git diff --check`,检查通过。
|
||||
15. 执行 `npm run build`;用户补充指派对象规则前的构建被主动终止,补齐最终规则后重新执行生产构建并成功通过,仅有项目原有的大资源体积及浏览器数据过期警告。
|
||||
16. 使用用户此前提供的数据库凭据,将扩展后的幂等脚本重新发布到 `192.168.2.92 / YL_MESDB`,发布成功;日志不记录明文密码。
|
||||
17. 在目标数据库检查确认:
|
||||
- 两个对齐可见字段已经存在。
|
||||
- 查询过程包含指派对象可见逻辑。
|
||||
- 新增和编辑过程均包含对齐可见参数。
|
||||
18. 在目标数据库外层事务中执行正式环境验证:
|
||||
- 本人创建任务查询返回 1 条。
|
||||
- 对齐可见任务查询返回 1 条。
|
||||
- 指派对象任务查询返回 1 条。
|
||||
- 无关系人员查询返回 0 条。
|
||||
- 不传人员的设计任务维护查询仍返回指定任务。
|
||||
19. 回滚目标数据库测试事务,确认 `Codex可见验证_` 测试任务残留数量为 0。
|
||||
20. 最终再次执行 ESLint、生产构建、目标文件空白检查和本地开发服务访问检查,全部通过;`https://localhost:1997/` 返回 HTTP 200。
|
||||
|
||||
### 修改文件
|
||||
- `src/views/ProductionManagement/DesignReportTask/Report/index.vue`
|
||||
- `src/views/ProductionManagement/DesignReportTask/Task/index.vue`
|
||||
- `db_backups/update_design_report_task_notes_and_restart_20260715.sql`
|
||||
- `gptlog-process/gpdlog.md`
|
||||
|
||||
### 结论
|
||||
- 当前人员开始任务后,该任务行的开始按钮会立即在刷新后变灰并不可点击;其他任务仍可点击并提示未关闭任务。
|
||||
- 三类说明列表保持单行省略,悬停可查看保留换行的完整内容,不再导致表格行高过高。
|
||||
- 设计任务新增和编辑弹窗已支持“对齐可见”人员多选,并在列表显示选中人员。
|
||||
- 设计报工页面只显示本人创建、对齐可见包含本人或指派对象包含本人的任务;设计任务维护页仍显示全部任务。
|
||||
- 数据库字段和过程已发布到目标库,正式环境事务验证通过且无测试数据残留。
|
||||
|
||||
### 验证结果
|
||||
- 两目标页面 ESLint 检查通过。
|
||||
- 目标文件 `git diff --check` 通过。
|
||||
- 最终 `npm run build` 生产构建通过。
|
||||
- 隔离 LocalDB 的新增、编辑、创建人可见、对齐可见和指派可见场景通过。
|
||||
- 目标数据库三类可见关系及维护页全量查询验证通过。
|
||||
- 目标数据库回滚后测试任务数量为 0。
|
||||
- `https://localhost:1997/` 返回 HTTP 200。
|
||||
|
||||
## 2026-07-15 修复及时齐套生产订单 7912 工艺路线颜色
|
||||
|
||||
### 用户提问
|
||||
- 修改 `PlanManagement/TimelyKitTrackingResult/index`。
|
||||
- 搜索销售订单 `261079` 后展开子项,生产订单 `7912` 的工艺路线状态不正确。
|
||||
- 第 4 序已经完成 5 个,应显示蓝色;第 5 序已经发料,应显示绿色。
|
||||
- 要求参考“生产计划跟踪”页面搜索生产订单 `7912` 时的工艺路线。
|
||||
|
||||
### 执行过程
|
||||
1. 检查 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`、参考页面 `src/views/ProductionManagement/ProductionPlanTrack/index.vue`、及时齐套查询脚本和原项目验收文档。
|
||||
2. 对比两页的工艺路线前端算法,确认蓝色、绿色、红色判断和连续外协分组处理逻辑完全一致:
|
||||
- 收检合格数大于 0、报工或辅助结束显示蓝色。
|
||||
- 外协工序收料数大于收检合格数与不合格数之和时显示绿色。
|
||||
- 连续且 `外协分组` 相同的工序统一采用该组最后一道工序的颜色。
|
||||
3. 确认及时齐套页面不直接计算数据库状态,而是解析 `生产管理_及时齐套跟踪结果_查询` 返回的 `工艺路线明细` JSON 后着色。
|
||||
4. 查询目标数据库过程参数和生产订单 `7912` 的 `View_生产订单_MES` 原始工序数据。首次查询误用了视图不存在的 `开始时间` 字段而失败,删除该字段后重新查询成功。
|
||||
5. 原始数据确认:
|
||||
- 第 4 序数铣,计划数 5、完成数 5、收料数 5、收检合格数 5,任务状态为已完成,应显示蓝色。
|
||||
- 第 5 序调质,收料数 5、收检数 0、任务状态为已开工,应显示绿色。
|
||||
- 第 6 序喷砂尚未开始,应显示红色。
|
||||
6. 执行参考过程 `生产管理_生产计划跟踪` 查询订单 `7912`,确认参考数据包含 `外协分组`:
|
||||
- 第 2 至第 4 序的外协分组为空,属于同一连续组,跟随第 4 序显示蓝色。
|
||||
- 第 5 序外协分组为 2,独立显示绿色。
|
||||
- 第 6 序外协分组为 3,独立显示红色。
|
||||
7. 执行及时齐套查询过程查询销售订单 `261079`。首次命令同时使用了互斥的 `sqlcmd -W` 与 `-y` 选项而失败,修正选项后重新执行成功。
|
||||
8. 检查及时齐套对生产订单 `7912` 的实际返回 JSON,确认完成数、收料数、收检数均正确,但每道工序都缺少 `外协分组` 字段。
|
||||
9. 定位根因:前端把缺少分组字段的第 2 至第 6 序全部视为同一个连续外协组,最终全部跟随第 6 序显示红色;因此不是页面蓝绿基础判断错误,而是后端 JSON 字段缺失。
|
||||
10. 修改当前最新及时齐套过程脚本 `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`,在 `工艺路线明细` JSON 中增加 `p2.[外协分组]`。
|
||||
11. 发布前执行差异和空白检查,确认脚本只增加一个返回字段,不改变筛选、缺件匹配或其他统计口径;目标库当前过程定义检查结果为确实缺少该字段。
|
||||
12. 使用用户此前提供的数据库凭据,将修改后的过程脚本发布到 `192.168.2.92 / YL_MESDB`;日志不记录明文密码。
|
||||
13. 发布后重新执行销售订单 `261079` 的及时齐套查询,从实际过程输出中提取生产订单 `7912` 的工艺路线 JSON,并按页面当前算法复算:
|
||||
- 第 4 序数铣:外协第一组,收检合格 5,最终颜色为蓝色。
|
||||
- 第 5 序调质:外协分组 2,收料 5、收检 0,最终颜色为绿色。
|
||||
- 第 6 序喷砂:外协分组 3,未收料未收检,最终颜色为红色。
|
||||
14. 检查目标数据库过程定义,确认 `p2.[外协分组]` 已发布。
|
||||
15. 执行及时齐套页面 ESLint,检查无错误,仅保留页面原有 `v-html` 安全规则警告和项目依赖数据过期提示。
|
||||
16. 执行数据库脚本 `git diff --check`,检查通过;访问本地开发服务 `https://localhost:1997/` 返回 HTTP 200。
|
||||
17. 保留工作区中用户已有的设计报工和质量检验相关修改,本次未改动或回退这些无关文件。
|
||||
|
||||
### 修改文件
|
||||
- `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`
|
||||
- `gptlog-process/gpdlog.md`
|
||||
|
||||
### 结论
|
||||
- `TimelyKitTrackingResult/index.vue` 的现有颜色算法与生产计划跟踪一致,无需重复修改前端算法。
|
||||
- 实际问题是及时齐套查询返回的工艺路线 JSON 漏掉 `外协分组`,导致多个不同外协组被错误合并并统一显示红色。
|
||||
- 字段已补齐并发布到目标数据库;销售订单 `261079`、生产订单 `7912` 现在第 4 序显示蓝色,第 5 序显示绿色,第 6 序显示红色,与生产计划跟踪一致。
|
||||
|
||||
|
||||
@@ -98,16 +98,42 @@
|
||||
<el-table-column align="center" label="预计结束" prop="预计结束时间" width="150" />
|
||||
<el-table-column align="center" label="报工次数" prop="报工次数" width="90" />
|
||||
<el-table-column align="center" label="未结束" prop="未结束报工数" width="80" />
|
||||
<el-table-column align="left" label="未结束人员" prop="未结束报工人员" width="150" show-overflow-tooltip />
|
||||
<el-table-column align="left" label="设计正在对应" prop="未结束报工人员" width="150" show-overflow-tooltip />
|
||||
<el-table-column align="left" label="进度说明" prop="进度说明" width="240">
|
||||
<template slot-scope="scope">
|
||||
<el-tooltip :disabled="!scope.row.进度说明" effect="dark" placement="top" :open-delay="300">
|
||||
<div slot="content" class="note-tooltip-content">{{ scope.row.进度说明 }}</div>
|
||||
<div class="note-history">{{ scope.row.进度说明 }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="left" label="异常说明" prop="异常说明" width="240">
|
||||
<template slot-scope="scope">
|
||||
<el-tooltip :disabled="!scope.row.异常说明" effect="dark" placement="top" :open-delay="300">
|
||||
<div slot="content" class="note-tooltip-content">{{ scope.row.异常说明 }}</div>
|
||||
<div class="note-history">{{ scope.row.异常说明 }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="left" label="奇思妙想" prop="奇思妙想" width="240">
|
||||
<template slot-scope="scope">
|
||||
<el-tooltip :disabled="!scope.row.奇思妙想" effect="dark" placement="top" :open-delay="300">
|
||||
<div slot="content" class="note-tooltip-content">{{ scope.row.奇思妙想 }}</div>
|
||||
<div class="note-history">{{ scope.row.奇思妙想 }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="最后开始" prop="最后开始时间" width="150" />
|
||||
<el-table-column align="center" label="最后结束" prop="最后结束时间" width="150" />
|
||||
<el-table-column align="left" label="设计要求" prop="设计要求" width="220" show-overflow-tooltip />
|
||||
<el-table-column align="center" fixed="right" label="操作" width="210">
|
||||
<el-table-column align="center" fixed="right" label="操作" width="330">
|
||||
<template slot-scope="scope">
|
||||
<div class="design-action-buttons">
|
||||
<el-button type="text" size="mini" :disabled="!canStart(scope.row)" @click="startTask(scope.row)">开始</el-button>
|
||||
<el-button type="text" size="mini" :disabled="actionLoading || !canStart(scope.row)" @click="startTask(scope.row)">开始</el-button>
|
||||
<el-button type="text" size="mini" :disabled="!canEnd(scope.row)" @click="endTask(scope.row)">结束</el-button>
|
||||
<el-button type="text" size="mini" :disabled="!canComplete(scope.row)" @click="completeTask(scope.row)">完成</el-button>
|
||||
<el-button type="text" size="mini" @click="openNoteDialog(scope.row, '异常说明')">异常说明</el-button>
|
||||
<el-button type="text" size="mini" @click="openNoteDialog(scope.row, '奇思妙想')">奇思妙想</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -150,6 +176,37 @@
|
||||
<el-button type="primary" :loading="actionLoading" @click="confirmEndTask">确认</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<el-dialog
|
||||
:visible.sync="noteDialogVisible"
|
||||
:title="noteForm.说明类型"
|
||||
width="620px"
|
||||
center
|
||||
:close-on-click-modal="false"
|
||||
>
|
||||
<el-form :model="noteForm" label-width="100px" size="small">
|
||||
<el-form-item label="DID">
|
||||
<el-input v-model="noteForm.DID" disabled />
|
||||
</el-form-item>
|
||||
<el-form-item label="任务描述">
|
||||
<el-input v-model="noteForm.任务描述" type="textarea" :rows="2" disabled />
|
||||
</el-form-item>
|
||||
<el-form-item :label="noteForm.说明类型">
|
||||
<el-input
|
||||
v-model="noteForm.说明内容"
|
||||
type="textarea"
|
||||
:rows="5"
|
||||
maxlength="2000"
|
||||
show-word-limit
|
||||
:placeholder="`请输入${noteForm.说明类型}`"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer">
|
||||
<el-button @click="noteDialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" :loading="actionLoading" @click="confirmNote">保存</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -161,6 +218,7 @@ export default {
|
||||
loading: false,
|
||||
actionLoading: false,
|
||||
endDialogVisible: false,
|
||||
noteDialogVisible: false,
|
||||
tableData: [],
|
||||
projectOptions: [],
|
||||
materialOptions: [],
|
||||
@@ -172,6 +230,12 @@ export default {
|
||||
任务描述: '',
|
||||
进度说明: ''
|
||||
},
|
||||
noteForm: {
|
||||
DID: '',
|
||||
任务描述: '',
|
||||
说明类型: '',
|
||||
说明内容: ''
|
||||
},
|
||||
searchForm: {
|
||||
did: '',
|
||||
projectNo: '',
|
||||
@@ -258,28 +322,26 @@ export default {
|
||||
this.parentMaterialOptions = []
|
||||
}
|
||||
},
|
||||
canStart(row) {
|
||||
return row.单据状态 !== '已完成' && Number(row.当前用户未结束报工数 || 0) === 0
|
||||
},
|
||||
canEnd(row) {
|
||||
return Number(row.当前用户未结束报工数 || 0) > 0
|
||||
},
|
||||
canStart(row) {
|
||||
return Number(row.当前用户未结束报工数 || 0) === 0
|
||||
},
|
||||
canComplete(row) {
|
||||
return row.单据状态 !== '已完成' && Number(row.报工次数 || 0) > 0
|
||||
},
|
||||
async startTask(row) {
|
||||
const openTask = await this.getCurrentOpenTask()
|
||||
if (openTask === false) return
|
||||
if (openTask) {
|
||||
const description = openTask.任务描述 ? `(${openTask.任务描述})` : ''
|
||||
this.$message.warning(`任务 DID ${openTask.DID}${description} 尚未关闭,请先结束该任务`)
|
||||
return
|
||||
}
|
||||
const latest = await this.getLatestTask(row.DID)
|
||||
if (!latest) return
|
||||
Object.assign(row, latest)
|
||||
if (latest.单据状态 === '已完成') {
|
||||
this.$message.error('任务已完成,不能开始')
|
||||
this.searchTable()
|
||||
return
|
||||
}
|
||||
if (Number(latest.当前用户未结束报工数 || 0) > 0) {
|
||||
this.$message.warning('当前人员已存在未结束的报工记录')
|
||||
return
|
||||
}
|
||||
this.runAction('设计报工_任务_开始', [
|
||||
['DID', latest.DID],
|
||||
['操作人ID', this.currentUserId()],
|
||||
@@ -316,6 +378,30 @@ export default {
|
||||
this.endDialogVisible = false
|
||||
}
|
||||
},
|
||||
openNoteDialog(row, type) {
|
||||
this.noteForm = {
|
||||
DID: row.DID,
|
||||
任务描述: row.任务描述 || '',
|
||||
说明类型: type,
|
||||
说明内容: ''
|
||||
}
|
||||
this.noteDialogVisible = true
|
||||
},
|
||||
async confirmNote() {
|
||||
const content = String(this.noteForm.说明内容 || '').trim()
|
||||
if (!content) {
|
||||
this.$message.warning(`请输入${this.noteForm.说明类型}`)
|
||||
return
|
||||
}
|
||||
const success = await this.runAction('设计报工_任务说明_新增', [
|
||||
['DID', this.noteForm.DID],
|
||||
['说明类型', this.noteForm.说明类型],
|
||||
['说明内容', content],
|
||||
['操作人ID', this.currentUserId()],
|
||||
['操作人', this.currentUserName()]
|
||||
], '保存成功')
|
||||
if (success) this.noteDialogVisible = false
|
||||
},
|
||||
async completeTask(row) {
|
||||
const latest = await this.getLatestTask(row.DID)
|
||||
if (!latest) return
|
||||
@@ -375,6 +461,32 @@ export default {
|
||||
return null
|
||||
}
|
||||
},
|
||||
async getCurrentOpenTask() {
|
||||
const params = [
|
||||
['DID', 0],
|
||||
['项目号', ''],
|
||||
['物料编码', ''],
|
||||
['图号', ''],
|
||||
['类别', ''],
|
||||
['关联父件物料编码', ''],
|
||||
['预计开始时间_Start', ''],
|
||||
['预计开始时间_End', ''],
|
||||
['预计结束时间_Start', ''],
|
||||
['预计结束时间_End', ''],
|
||||
['单据状态', ''],
|
||||
['当前操作人ID', this.currentUserId()],
|
||||
['当前操作人', this.currentUserName()]
|
||||
]
|
||||
const data = this.CreateData('11', '设计报工_任务_查询', params)
|
||||
try {
|
||||
const response = await this.ExecDatabase(data)
|
||||
return (response.data || []).find(item => Number(item.当前用户未结束报工数 || 0) > 0) || null
|
||||
} catch (error) {
|
||||
console.error('当前人员未结束任务查询失败:', error)
|
||||
this.$message.error('开始前校验失败')
|
||||
return false
|
||||
}
|
||||
},
|
||||
async runAction(procedure, params, defaultMessage) {
|
||||
if (this.actionLoading) return
|
||||
this.actionLoading = true
|
||||
@@ -458,4 +570,22 @@ export default {
|
||||
.design-action-buttons ::v-deep .el-button + .el-button {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.note-history {
|
||||
width: 100%;
|
||||
min-height: 20px;
|
||||
line-height: 20px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.note-tooltip-content {
|
||||
max-width: 520px;
|
||||
max-height: 60vh;
|
||||
line-height: 20px;
|
||||
white-space: pre-line;
|
||||
overflow-y: auto;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -130,11 +130,37 @@
|
||||
<el-table-column align="left" label="设计要求" prop="设计要求" width="220" show-overflow-tooltip />
|
||||
<el-table-column align="left" label="研发立项号" prop="研发立项号" width="130" show-overflow-tooltip />
|
||||
<el-table-column align="left" label="研发目的" prop="研发目的" width="200" show-overflow-tooltip />
|
||||
<el-table-column align="left" label="对其可见" prop="对齐可见" width="180" show-overflow-tooltip />
|
||||
<el-table-column align="left" label="指派对象" prop="指派对象" width="180" show-overflow-tooltip />
|
||||
<el-table-column align="center" label="预计开始" prop="预计开始时间" width="150" />
|
||||
<el-table-column align="center" label="预计结束" prop="预计结束时间" width="150" />
|
||||
<el-table-column align="center" label="报工次数" prop="报工次数" width="90" />
|
||||
<el-table-column align="center" label="未结束" prop="未结束报工数" width="80" />
|
||||
<el-table-column align="left" label="设计正在对应" prop="未结束报工人员" width="150" show-overflow-tooltip />
|
||||
<el-table-column align="left" label="进度说明" prop="进度说明" width="240">
|
||||
<template slot-scope="scope">
|
||||
<el-tooltip :disabled="!scope.row.进度说明" effect="dark" placement="top" :open-delay="300">
|
||||
<div slot="content" class="note-tooltip-content">{{ scope.row.进度说明 }}</div>
|
||||
<div class="note-history">{{ scope.row.进度说明 }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="left" label="异常说明" prop="异常说明" width="240">
|
||||
<template slot-scope="scope">
|
||||
<el-tooltip :disabled="!scope.row.异常说明" effect="dark" placement="top" :open-delay="300">
|
||||
<div slot="content" class="note-tooltip-content">{{ scope.row.异常说明 }}</div>
|
||||
<div class="note-history">{{ scope.row.异常说明 }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="left" label="奇思妙想" prop="奇思妙想" width="240">
|
||||
<template slot-scope="scope">
|
||||
<el-tooltip :disabled="!scope.row.奇思妙想" effect="dark" placement="top" :open-delay="300">
|
||||
<div slot="content" class="note-tooltip-content">{{ scope.row.奇思妙想 }}</div>
|
||||
<div class="note-history">{{ scope.row.奇思妙想 }}</div>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="创建日期" prop="创建日期" width="150" />
|
||||
<el-table-column align="left" label="创建人" prop="创建人" width="110" show-overflow-tooltip />
|
||||
<el-table-column align="left" label="备注" prop="备注" width="180" show-overflow-tooltip />
|
||||
@@ -168,6 +194,73 @@
|
||||
<el-input v-model="formData.创建日期" disabled />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="类别">
|
||||
<el-input v-model="formData.类别" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="任务描述" prop="任务描述">
|
||||
<el-input v-model="formData.任务描述" type="textarea" :rows="2" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="设计要求">
|
||||
<el-input v-model="formData.设计要求" type="textarea" :rows="3" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="对其可见">
|
||||
<el-select
|
||||
v-model="formData.visibilityIds"
|
||||
clearable
|
||||
filterable
|
||||
multiple
|
||||
remote
|
||||
:remote-method="queryVisibilityPersonnel"
|
||||
style="width: 100%"
|
||||
@change="handleVisibilityChange"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in visibilityPersonnelOptions"
|
||||
:key="item.人员编号"
|
||||
:label="formatPersonLabel(item)"
|
||||
:value="item.人员编号"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="指派对象" prop="assigneeIds">
|
||||
<el-select
|
||||
v-model="formData.assigneeIds"
|
||||
clearable
|
||||
filterable
|
||||
multiple
|
||||
remote
|
||||
:remote-method="queryPersonnel"
|
||||
style="width: 100%"
|
||||
@change="handleAssigneeChange"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in personnelOptions"
|
||||
:key="item.人员编号"
|
||||
:label="formatPersonLabel(item)"
|
||||
:value="item.人员编号"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="预计开始时间">
|
||||
<el-date-picker v-model="formData.预计开始时间" type="date" value-format="yyyy-MM-dd" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="预计结束时间">
|
||||
<el-date-picker v-model="formData.预计结束时间" type="date" value-format="yyyy-MM-dd" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="项目号">
|
||||
<el-select
|
||||
@@ -215,16 +308,7 @@
|
||||
<el-input v-model="formData.图号" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="类别">
|
||||
<el-input v-model="formData.类别" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="任务描述" prop="任务描述">
|
||||
<el-input v-model="formData.任务描述" type="textarea" :rows="2" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12">
|
||||
<el-form-item label="父件物料编码">
|
||||
<el-select
|
||||
@@ -260,42 +344,7 @@
|
||||
<el-input v-model="formData.研发目的" type="textarea" :rows="2"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="指派对象" prop="assigneeIds">
|
||||
<el-select
|
||||
v-model="formData.assigneeIds"
|
||||
clearable
|
||||
filterable
|
||||
multiple
|
||||
remote
|
||||
:remote-method="queryPersonnel"
|
||||
style="width: 100%"
|
||||
@change="handleAssigneeChange"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in personnelOptions"
|
||||
:key="item.人员编号"
|
||||
:label="formatPersonLabel(item)"
|
||||
:value="item.人员编号"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="预计开始时间">
|
||||
<el-date-picker v-model="formData.预计开始时间" type="date" value-format="yyyy-MM-dd" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="预计结束时间">
|
||||
<el-date-picker v-model="formData.预计结束时间" type="date" value-format="yyyy-MM-dd" style="width: 100%" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="设计要求">
|
||||
<el-input v-model="formData.设计要求" type="textarea" :rows="3" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注">
|
||||
<el-input v-model="formData.备注" type="textarea" :rows="2" />
|
||||
@@ -325,6 +374,7 @@ export default {
|
||||
materialOptions: [],
|
||||
parentMaterialOptions: [],
|
||||
personnelOptions: [],
|
||||
visibilityPersonnelOptions: [],
|
||||
searchForm: {
|
||||
did: '',
|
||||
projectNo: '',
|
||||
@@ -347,6 +397,7 @@ export default {
|
||||
created() {
|
||||
this.loadDefaultProjectOptions()
|
||||
this.queryPersonnel('')
|
||||
this.queryVisibilityPersonnel('')
|
||||
this.loadDefaultMaterialOptions()
|
||||
this.searchTable()
|
||||
},
|
||||
@@ -365,6 +416,9 @@ export default {
|
||||
设计要求: '',
|
||||
研发立项号: '',
|
||||
研发目的: '',
|
||||
对齐可见ID: '',
|
||||
对齐可见: '',
|
||||
visibilityIds: [],
|
||||
指派对象ID: '',
|
||||
指派对象: '',
|
||||
assigneeIds: [],
|
||||
@@ -407,28 +461,24 @@ export default {
|
||||
this.formData = this.getEmptyForm()
|
||||
this.loadDefaultProjectOptions()
|
||||
this.loadDefaultMaterialOptions()
|
||||
this.queryVisibilityPersonnel('')
|
||||
this.dialogVisible = true
|
||||
this.$nextTick(() => this.$refs.taskForm && this.$refs.taskForm.clearValidate())
|
||||
},
|
||||
openEdit(row) {
|
||||
this.isEdit = true
|
||||
const assigneeIds = row.指派对象ID ? String(row.指派对象ID).split(',').filter(Boolean) : []
|
||||
const visibilityIds = row.对齐可见ID ? String(row.对齐可见ID).split(',').filter(Boolean) : []
|
||||
this.formData = {
|
||||
...this.getEmptyForm(),
|
||||
...row,
|
||||
assigneeIds,
|
||||
visibilityIds,
|
||||
预计开始时间: this.toDate(row.预计开始时间),
|
||||
预计结束时间: this.toDate(row.预计结束时间)
|
||||
}
|
||||
if (row.指派对象ID || row.指派对象) {
|
||||
const ids = assigneeIds
|
||||
const names = row.指派对象 ? String(row.指派对象).split(',') : []
|
||||
ids.forEach((id, index) => {
|
||||
if (!this.personnelOptions.some(item => item.人员编号 === id)) {
|
||||
this.personnelOptions.push({ 人员编号: id, 人员姓名: names[index] || id })
|
||||
}
|
||||
})
|
||||
}
|
||||
this.ensurePersonnelOptions(this.personnelOptions, assigneeIds, row.指派对象)
|
||||
this.ensurePersonnelOptions(this.visibilityPersonnelOptions, visibilityIds, row.对齐可见)
|
||||
this.loadDefaultProjectOptions()
|
||||
this.loadDefaultMaterialOptions()
|
||||
this.dialogVisible = true
|
||||
@@ -485,6 +535,8 @@ export default {
|
||||
params.push(['设计要求', this.formData.设计要求 || ''])
|
||||
params.push(['研发立项号', this.formData.研发立项号 || ''])
|
||||
params.push(['研发目的', this.formData.研发目的 || ''])
|
||||
params.push(['对齐可见ID', this.formData.对齐可见ID || ''])
|
||||
params.push(['对齐可见', this.formData.对齐可见 || ''])
|
||||
params.push(['指派对象ID', this.formData.指派对象ID || ''])
|
||||
params.push(['指派对象', this.formData.指派对象 || ''])
|
||||
params.push(['预计开始时间', this.formData.预计开始时间 || ''])
|
||||
@@ -594,6 +646,15 @@ export default {
|
||||
this.personnelOptions = []
|
||||
}
|
||||
},
|
||||
async queryVisibilityPersonnel(query) {
|
||||
const data = this.CreateData('11', '设计报工_人员查询', [['过滤', query || '']])
|
||||
try {
|
||||
const response = await this.ExecDatabase(data)
|
||||
this.visibilityPersonnelOptions = response.data || []
|
||||
} catch (error) {
|
||||
this.visibilityPersonnelOptions = []
|
||||
}
|
||||
},
|
||||
handleMaterialChange(value) {
|
||||
const selected = this.materialOptions.find(item => item.物料编码 === value)
|
||||
this.formData.物料名称 = selected ? selected.物料名称 : ''
|
||||
@@ -607,6 +668,19 @@ export default {
|
||||
this.formData.指派对象ID = values.join(',')
|
||||
this.formData.指派对象 = selected.map(item => item.人员姓名).join(',')
|
||||
},
|
||||
handleVisibilityChange(values) {
|
||||
const selected = this.visibilityPersonnelOptions.filter(item => values.includes(item.人员编号))
|
||||
this.formData.对齐可见ID = values.join(',')
|
||||
this.formData.对齐可见 = selected.map(item => item.人员姓名).join(',')
|
||||
},
|
||||
ensurePersonnelOptions(options, ids, namesValue) {
|
||||
const names = namesValue ? String(namesValue).split(',') : []
|
||||
ids.forEach((id, index) => {
|
||||
if (!options.some(item => item.人员编号 === id)) {
|
||||
options.push({ 人员编号: id, 人员姓名: names[index] || id })
|
||||
}
|
||||
})
|
||||
},
|
||||
formatMaterialLabel(item) {
|
||||
return item.物料名称 ? `${item.物料编码} | ${item.物料名称}` : item.物料编码
|
||||
},
|
||||
@@ -680,4 +754,22 @@ export default {
|
||||
.danger-action {
|
||||
color: #f56c6c;
|
||||
}
|
||||
|
||||
.note-history {
|
||||
width: 100%;
|
||||
min-height: 20px;
|
||||
line-height: 20px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.note-tooltip-content {
|
||||
max-width: 520px;
|
||||
max-height: 60vh;
|
||||
line-height: 20px;
|
||||
white-space: pre-line;
|
||||
overflow-y: auto;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -80,7 +80,16 @@
|
||||
|
||||
<br />
|
||||
<br />
|
||||
|
||||
<span class="show-text">检测状态</span>
|
||||
<el-select
|
||||
v-model="checkstatus"
|
||||
style="width: 150px; margin-right: 10px"
|
||||
filterable
|
||||
>
|
||||
<el-option label="全部" value="2" />
|
||||
<el-option label="已完成" value="1" />
|
||||
<el-option label="未完成" value="0" />
|
||||
</el-select>
|
||||
<span class="show-text">检测结果</span>
|
||||
<el-select
|
||||
v-model="inspectionResult"
|
||||
@@ -221,7 +230,7 @@
|
||||
width="150"
|
||||
prop="备注"
|
||||
/>
|
||||
<el-table-column label="操作" align="center" width="250">
|
||||
<el-table-column label="操作" align="center" width="400">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
class="operation-btn"
|
||||
@@ -230,6 +239,20 @@
|
||||
@click="receiveCheck(scope.row)"
|
||||
>入库检</el-button
|
||||
>
|
||||
<el-button
|
||||
class="operation-btn"
|
||||
type="primary"
|
||||
size="mini"
|
||||
@click="getitemdraw(scope.row)"
|
||||
>零件图纸</el-button
|
||||
>
|
||||
<el-button
|
||||
class="operation-btn"
|
||||
type="primary"
|
||||
size="mini"
|
||||
@click="getitemdraw2(scope.row)"
|
||||
>工艺图纸</el-button
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -376,7 +399,7 @@
|
||||
<script>
|
||||
// 引入xlsx库
|
||||
import * as XLSX from "xlsx";
|
||||
|
||||
import { MESDownFile } from '@/utils/request'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
@@ -415,6 +438,9 @@ export default {
|
||||
检测时间: "",
|
||||
检测说明: "",
|
||||
},
|
||||
checkstatus:'0',
|
||||
downPDF:MESDownFile,
|
||||
|
||||
};
|
||||
},
|
||||
created() {
|
||||
@@ -474,6 +500,7 @@ export default {
|
||||
this.inspectionDate ? this.inspectionDate[1] : "",
|
||||
]);
|
||||
param.push(["检测结果", this.inspectionResult]);
|
||||
param.push(["状态", this.checkstatus]);
|
||||
const selectedChecker = this.checkerList.find(
|
||||
(item) => item.value === this.checker
|
||||
);
|
||||
@@ -504,7 +531,38 @@ export default {
|
||||
this.$message.error("查询失败");
|
||||
});
|
||||
},
|
||||
getitemdraw(row) {
|
||||
var param = [];
|
||||
param[0] = ['物料编号', row.物料编码];
|
||||
var Data = this.CreateData('11', '工艺管理_图纸维护_查看图纸', param);
|
||||
this.ExecDatabase(Data).then(response => {
|
||||
console.log(response)
|
||||
if (response.data.length > 0) {
|
||||
var pdfSrc =""+this.downPDF+""+ response.data[0].uid+".pdf"
|
||||
|
||||
window.open(pdfSrc,'_blank')
|
||||
}else {
|
||||
this.$message.error('未上传图纸');
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
getitemdraw2(row) {
|
||||
var param = [];
|
||||
param[0] = ['物料编号', row.物料编码];
|
||||
var Data = this.CreateData('11', '工艺管理_工艺维护_查看图纸', param);
|
||||
this.ExecDatabase(Data).then(response => {
|
||||
console.log(response)
|
||||
if (response.data.length > 0) {
|
||||
var pdfSrc =""+this.downPDF+""+ response.data[0].uid+".pdf"
|
||||
|
||||
window.open(pdfSrc,'_blank')
|
||||
}else {
|
||||
this.$message.error('未上传图纸');
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
receiveCheck(row) {
|
||||
// 打开收检对话框并填充数据
|
||||
this.receiveCheckVisible = true;
|
||||
|
||||
@@ -80,7 +80,16 @@
|
||||
|
||||
<br />
|
||||
<br />
|
||||
|
||||
<span class="show-text">检测状态</span>
|
||||
<el-select
|
||||
v-model="checkstatus"
|
||||
style="width: 150px; margin-right: 10px"
|
||||
filterable
|
||||
>
|
||||
<el-option label="全部" value="2" />
|
||||
<el-option label="已完成" value="1" />
|
||||
<el-option label="未完成" value="0" />
|
||||
</el-select>
|
||||
<span class="show-text">检测结果</span>
|
||||
<el-select
|
||||
v-model="inspectionResult"
|
||||
@@ -221,7 +230,7 @@
|
||||
width="150"
|
||||
prop="备注"
|
||||
/>
|
||||
<el-table-column label="操作" align="center" width="250">
|
||||
<el-table-column label="操作" align="center" width="400">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
class="operation-btn"
|
||||
@@ -230,6 +239,19 @@
|
||||
@click="receiveCheck(scope.row)"
|
||||
>退货检</el-button
|
||||
>
|
||||
<el-button
|
||||
class="operation-btn"
|
||||
type="primary"
|
||||
size="mini"
|
||||
@click="getitemdraw(scope.row)"
|
||||
>零件图纸</el-button
|
||||
>
|
||||
<el-button
|
||||
class="operation-btn"
|
||||
type="primary"
|
||||
size="mini"
|
||||
@click="getitemdraw2(scope.row)"
|
||||
>工艺图纸</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -362,7 +384,7 @@
|
||||
<script>
|
||||
// 引入xlsx库
|
||||
import * as XLSX from "xlsx";
|
||||
|
||||
import { MESDownFile } from '@/utils/request'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
@@ -401,6 +423,8 @@ export default {
|
||||
检测时间: "",
|
||||
检测说明: "",
|
||||
},
|
||||
checkstatus:'0',
|
||||
downPDF:MESDownFile,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
@@ -416,6 +440,38 @@ export default {
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
getitemdraw(row) {
|
||||
var param = [];
|
||||
param[0] = ['物料编号', row.物料编码];
|
||||
var Data = this.CreateData('11', '工艺管理_图纸维护_查看图纸', param);
|
||||
this.ExecDatabase(Data).then(response => {
|
||||
console.log(response)
|
||||
if (response.data.length > 0) {
|
||||
var pdfSrc =""+this.downPDF+""+ response.data[0].uid+".pdf"
|
||||
|
||||
window.open(pdfSrc,'_blank')
|
||||
}else {
|
||||
this.$message.error('未上传图纸');
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
getitemdraw2(row) {
|
||||
var param = [];
|
||||
param[0] = ['物料编号', row.物料编码];
|
||||
var Data = this.CreateData('11', '工艺管理_工艺维护_查看图纸', param);
|
||||
this.ExecDatabase(Data).then(response => {
|
||||
console.log(response)
|
||||
if (response.data.length > 0) {
|
||||
var pdfSrc =""+this.downPDF+""+ response.data[0].uid+".pdf"
|
||||
|
||||
window.open(pdfSrc,'_blank')
|
||||
}else {
|
||||
this.$message.error('未上传图纸');
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
getTypeList() {
|
||||
this.typeList = [];
|
||||
var Data = this.CreateData("11", "查询字典");
|
||||
@@ -467,7 +523,7 @@ export default {
|
||||
(item) => item.value === this.checker
|
||||
);
|
||||
param.push(["检测人", selectedChecker ? selectedChecker.label : ""]);
|
||||
|
||||
param.push(["状态", this.checkstatus]);
|
||||
// 调用封装方法生成请求数据 - 使用新的存储过程名称
|
||||
var Data = this.CreateData(
|
||||
"11",
|
||||
|
||||
Reference in New Issue
Block a user