chore: save local MES snapshot

This commit is contained in:
2026-06-25 15:49:15 +08:00
parent 4f6a16fb2e
commit f6dce5daa8
102 changed files with 45101 additions and 218 deletions

View File

@@ -0,0 +1,188 @@
USE [YL_MESDB]
GO
ALTER PROCEDURE [dbo].[_项目工时_查询_导出]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT '项目工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype
SELECT 256*20 AS , 256*20 AS , 256*30 AS , 256*40 AS , 256*15 AS , 256*12 AS ,
256*12 AS , 256*12 AS , 256*12 AS , 256*10 AS , 256*15 AS , 256*15 AS , 256*12 AS '工时(h)'
SELECT 0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS ,
0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS '工时(h)'
SELECT
v. AS ,
v.,
v.,
v.,
v.,
v.,
ISNULL(v., '') AS ,
CASE WHEN v. IS NULL THEN '' WHEN v. = FLOOR(v.) THEN CAST(CAST(v. AS INT) AS VARCHAR(20)) ELSE CAST(CAST(v. AS DECIMAL(10,1)) AS VARCHAR(20)) END AS ,
CASE WHEN v. IS NULL THEN '' WHEN v. = FLOOR(v.) THEN CAST(CAST(v. AS INT) AS VARCHAR(20)) ELSE CAST(CAST(v. AS DECIMAL(10,1)) AS VARCHAR(20)) END AS ,
CASE WHEN v. IN ('报工', '辅助结束') THEN CAST(v. AS VARCHAR(20)) ELSE '0' END AS ,
CONVERT(VARCHAR(10), v., 120) AS ,
CONVERT(VARCHAR(10), v., 120) AS ,
CAST(CAST(v. / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)'
FROM View_生产工时视图 v
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
ORDER BY v., v., v., v., v.
END
GO
ALTER PROCEDURE [dbo].[_作业者工时_查询_导出]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT '作业者工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype
SELECT 256*12 AS , 256*15 AS , 256*20 AS , 256*12 AS , 256*40 AS ,
256*25 AS , 256*15 AS , 256*12 AS , 256*10 AS , 256*20 AS , 256*20 AS , 256*12 AS '工时(h)'
SELECT 0 AS , 0 AS , 0 AS , 0 AS , 0 AS ,
0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS '工时(h)'
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
CASE WHEN IN ('报工', '辅助结束', '加班', '异常', '开始加工') THEN CAST( AS VARCHAR(20)) ELSE '0' END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST(CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)'
FROM [dbo].[View_生产工时视图]
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) != -1
ORDER BY ,
END
GO
ALTER PROCEDURE [dbo].[_任务工时_查询_导出]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT '任务工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype
SELECT 256*20 AS , 256*12 AS , 256*40 AS , 256*25 AS , 256*15 AS ,
256*12 AS , 256*12 AS , 256*12 AS , 256*12 AS , 256*10 AS , 256*20 AS , 256*20 AS , 256*12 AS '工时(h)'
SELECT 0 AS , 0 AS , 0 AS , 0 AS , 0 AS ,
0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS '工时(h)'
SELECT
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
CASE WHEN IS NULL THEN '' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS ,
CASE WHEN IS NULL THEN '' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS ,
CASE WHEN IN ('报工', '辅助结束') THEN CAST( AS VARCHAR(20)) ELSE '0' END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST(CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)'
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
ORDER BY , , , ,
END
GO
ALTER PROCEDURE [dbo].[_设备工时_查询_导出]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT '设备工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype
SELECT 256*12 AS , 256*15 AS , 256*20 AS , 256*12 AS , 256*40 AS ,
256*25 AS , 256*15 AS , 256*12 AS , 256*10 AS , 256*20 AS , 256*20 AS , 256*12 AS '工时(h)'
SELECT 0 AS , 0 AS , 0 AS , 0 AS , 0 AS ,
0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS '工时(h)'
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
CASE WHEN IN ('报工', '辅助结束') THEN CAST( AS VARCHAR(20)) ELSE '0' END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST(CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)'
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
ORDER BY ,
END
GO

View File

@@ -0,0 +1,492 @@
USE [YL_MESDB]
GO
ALTER PROCEDURE [dbo].[_项目工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
v. AS ,
v.,
v.,
MAX(v.) AS ,
MAX(v.) AS ,
SUM(CASE WHEN v. IN ('报工', '辅助结束') THEN v. ELSE 0 END) AS ,
MIN(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(CONVERT(VARCHAR(10), v., 120)) AS ,
CAST(SUM(v.) / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图 v
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
GROUP BY v., v., v.
),
AS (
SELECT
v. AS ,
v.,
v.,
v.,
MAX(v.) AS ,
v.,
SUM(CASE WHEN v. IN ('报工', '辅助结束') THEN v. ELSE 0 END) AS ,
CAST(SUM(v.) / 60.0 / 60.0 AS DECIMAL(10,1)) AS ,
MIN(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(CONVERT(VARCHAR(10), v., 120)) AS
FROM View_生产工时视图 v
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
GROUP BY v., v., v., v., v.
)
SELECT
1 AS [Level],
AS contractNo,
AS materialDesc,
AS materialCode,
'' AS processName,
'' AS operator,
'' AS ,
CASE WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END + '/' +
CASE WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS planStart,
ISNULL(, '') AS planEnd,
CAST( AS VARCHAR(20)) AS workHours,
'' AS
FROM
UNION ALL
SELECT
2 AS [Level],
d. AS contractNo,
'' AS materialDesc,
d. AS materialCode,
d. AS processName,
d. AS operator,
ISNULL(d., '') AS ,
'' AS qty,
CAST(d. AS VARCHAR(20)) AS reportQty,
d. AS planStart,
d. AS planEnd,
CAST(d. AS VARCHAR(20)) AS workHours,
d. AS
FROM d
ORDER BY contractNo, materialCode, [Level], processName
END
GO
ALTER PROCEDURE [dbo].[_作业者工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
,
COUNT(*) AS ,
SUM(CASE
WHEN NOT IN ('异常') THEN
WHEN = '异常' THEN -
ELSE 0
END) AS ,
CAST(SUM(CASE
WHEN = '异常' THEN -
ELSE
END) / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM [dbo].[View_生产工时视图]
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) != -1
GROUP BY
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
COUNT(*) AS ,
SUM(CASE
WHEN NOT IN ('异常') THEN
WHEN = '异常' THEN -
ELSE 0
END) AS ,
CAST(SUM(CASE
WHEN = '异常' THEN -
ELSE
END) / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM [dbo].[View_生产工时视图]
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) != -1
GROUP BY , CONVERT(VARCHAR(10), , 120)
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
AS ,
,
,
,
,
AS ,
CASE
WHEN NOT IN ('异常') THEN
WHEN = '异常' THEN -
ELSE 0
END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST(CASE
WHEN = '异常' THEN -
ELSE
END / 60.0 / 60.0 AS DECIMAL(10,2)) AS ,
,
,
FROM [dbo].[View_生产工时视图]
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) != -1
)
SELECT
1 AS [Level],
AS operator,
'' AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS ,
'' AS startTime,
'' AS endTime,
'' AS ,
'' AS ,
'' AS ,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
2 AS [Level],
AS operator,
AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS ,
'' AS startTime,
'' AS endTime,
'' AS ,
'' AS ,
'' AS ,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
3 AS [Level],
AS operator,
AS dateLabel,
'' AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
ISNULL(, '') AS ,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
CAST( AS VARCHAR(20)) AS workHours
FROM
ORDER BY operator, dateLabel, [Level]
END
GO
ALTER PROCEDURE [dbo].[_任务工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
AS ,
,
,
,
,
,
MAX() AS ,
MAX() AS ,
SUM(CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
GROUP BY , , , , ,
),
AS (
SELECT
AS ,
,
,
,
,
AS ,
,
CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
)
SELECT
1 AS [Level],
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
'' AS operator,
'' AS ,
CASE WHEN IS NULL THEN '0' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END + '/' +
CASE WHEN IS NULL THEN '0' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours,
FROM
UNION ALL
SELECT
2 AS [Level],
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
'' AS productName,
ISNULL(, '') AS processName,
ISNULL(, '') AS operator,
ISNULL(, '') AS ,
'' AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
CAST( AS VARCHAR(20)) AS workHours,
FROM
ORDER BY contractNo, orderNo, productCode, processName, [Level], startTime
END
GO
ALTER PROCEDURE [dbo].[_设备工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
,
COUNT(*) AS ,
SUM(CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
GROUP BY
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
COUNT(*) AS ,
SUM(CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
GROUP BY , CONVERT(VARCHAR(10), , 120)
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
AS ,
,
,
,
,
AS ,
CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
)
SELECT
1 AS [Level],
AS operator,
'' AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS ,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
2 AS [Level],
AS operator,
AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS ,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
3 AS [Level],
AS operator,
AS dateLabel,
'' AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
ISNULL(, '') AS ,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
ORDER BY operator, dateLabel, [Level]
END
GO

View File

@@ -0,0 +1,186 @@
USE [YL_MESDB]
GO
ALTER PROCEDURE [dbo].[_生产计划跟踪]
@ int = 0,
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@1 nvarchar(50) = '',
@2 nvarchar(50) = '',
@1 nvarchar(50) = '',
@2 nvarchar(50) = '',
@1 nvarchar(50) = '',
@2 nvarchar(50) = '',
@ nvarchar(50) = '全部',
@ nvarchar(50) = '全部',
@ nvarchar(50) = '全部',
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(50) = ''
AS
BEGIN
DECLARE @selectStr NVARCHAR(MAX)
DECLARE @selectStrWhere NVARCHAR(4000) = ' WHERE [物料类型] = ''pit_Resource'' '
SET @selectStr = N'
SELECT top 500
v.计划号,
加急总数,
拣配状态,
自制件属性,
入库数量,
外协分组,
case
when isnull(任务状态,0)=4 then ''已完成''
when isnull(任务状态,0)=2 then ''已开工''
when isnull(任务状态,0)=0 then ''待执行''
when isnull(任务状态,0)=1 then ''可执行''
else ''''
end as [任务状态],
case
when isnull(加工状态,0)=2 then ''辅助开始''
when isnull(加工状态,0)=3 then ''辅助结束''
when isnull(加工状态,0)=4 then ''开始加工''
when isnull(加工状态,0)=5 then ''暂停''
when isnull(加工状态,0)=6 then ''报工''
else ''''
end as [加工状态],
[计划数量订单],
ISNULL(开工时间, 0) AS 开工时间,
ISNULL(进度, 0) AS 进度,
v.[TaskAID],
[合同号],
v.[订单编号] AS 订单号,
[订单行号],
[订单拆分内码] AS 拆分内码,
[物料编号] AS 产品编码,
[物料描述] AS 产品名称,
TRIM(''.'' FROM TRIM(''0'' FROM CAST([计划数量] AS VARCHAR(30)))) AS 计划数量,
ISNULL(gy.标准工时, 0) AS 标准工时,
[计划完成] AS 要求完工日期,
[工序名称],
完成数量,
收料数量,
CASE
WHEN [加急状态] = 1 THEN ''加急''
ELSE ''''
END AS 加急状态,
加急数量,
性质,
ISNULL(总工时, 0) AS 总工时,
[占用情况],
[排产状态],
[工序计划数量],
指派对象编号,
指派对象,
TRIM(''.'' FROM TRIM(''0'' FROM CAST([指派数量] AS VARCHAR(30)))) AS 指派数量,
计划开始时间,
计划完成时间,
最晚开始时间,
[派工状态],
[外协通知],
[优先级],
[未完成说明],
[派工特殊说明],
[最后编辑人],
[最后编辑时间],
[二次派工],
CASE
WHEN zj_终检.计划号 IS NOT NULL THEN ''''
ELSE ''''
END AS 终检,
ISNULL(zj_收检.合格数合计, 0) AS 收检合格数,
ISNULL(zj_收检.不合格数合计, 0) AS 收检不合格数,
ISNULL(zj_收检.合格数合计, 0) + ISNULL(zj_收检.不合格数合计, 0) AS 收检总数,
ISNULL(jl.开始时间, 0) AS 开始时间,
ISNULL(jl.结束时间, 0) AS 结束时间,
ISNULL(jl.外协结束时间, 0) AS 外协结束时间,
STUFF((
SELECT '','' + d2.工序名称
FROM [dbo].[View_生产订单_MES] d2
WHERE d2.订单编号 = v.订单编号 order by d2.订单行号
FOR XML PATH('''')
), 1, 1, '''') AS 工艺路线
FROM [dbo].[View_生产订单全部包括已关闭] v
LEFT JOIN (
SELECT DISTINCT 计划号
FROM dbo.YL_质量检验_质检记录
WHERE 质检类型 = ''终检''
) zj_终检 ON v.[订单编号] = zj_终检.计划号
LEFT JOIN (
SELECT
TaskAID,
SUM(ISNULL(合格数, 0)) AS 合格数合计,
SUM(ISNULL(不合格数, 0)) AS 不合格数合计
FROM dbo.YL_质量检验_质检记录
WHERE 质检类型 = ''收检''
GROUP BY TaskAID
) zj_收检 ON v.[TaskAID] = zj_收检.TaskAID
LEFT JOIN (
SELECT
TaskAID,
min(ISNULL(开始时间, 0)) AS 开始时间,
MAX(CASE WHEN 操作类别 = ''报工'' THEN ISNULL(开始时间, 0) ELSE NULL END) AS 外协结束时间,
MAX(CASE WHEN 操作类别 = ''报工'' THEN ISNULL(结束时间, 0) ELSE NULL END) AS 结束时间
FROM [dbo].[YL_加工中心_操作记录表]
GROUP BY TaskAID
) jl ON v.[TaskAID] = jl.TaskAID
LEFT JOIN (
SELECT
订单编号,
工艺顺序,
MAX(ISNULL(标准工时, 0)) AS 标准工时
FROM dbo.[车间生产管理工艺_零件生产工艺_工艺库]
GROUP BY 订单编号, 工艺顺序
) gy ON v.[订单编号] = gy.[订单编号] AND v.[订单行号] = gy.[工艺顺序]'
IF (@ > 0)
SET @selectStrWhere = @selectStrWhere + ' AND v.[订单编号] = ' + CONVERT(VARCHAR(10), @)
IF (@ > 0)
SET @selectStrWhere = @selectStrWhere + ' AND v.[计划号] = '''+@+''''
IF (@ <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [合同号] LIKE ''%' + @ + '%'''
IF (@ <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [物料编号] LIKE ''%' + @ + '%'''
IF (@ <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [物料描述] LIKE ''%' + @ + '%'''
IF (@ <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [工序名称] = ''' + @ + ''''
IF (@1 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划完成] >= ''' + @1 + ''''
IF (@2 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划完成] <= ''' + @2 + ''''
IF (@1 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划开始时间] >= ''' + @1 + ''''
IF (@2 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划开始时间] <= ''' + @2 + ''''
IF (@1 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划完成时间] >= ''' + @1 + ''''
IF (@2 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划完成时间] <= ''' + @2 + ''''
IF (@ = '未完成')
SET @selectStrWhere = @selectStrWhere + ' AND ISNULL([排产状态], 0) = 0'
ELSE IF (@ = '已完成')
SET @selectStrWhere = @selectStrWhere + ' AND [排产状态] = 1'
IF (@ = '机加')
SET @selectStrWhere = @selectStrWhere + ' AND [自制件属性] = ''机加件'''
ELSE IF (@ = '装配')
SET @selectStrWhere = @selectStrWhere + ' AND [自制件属性] LIKE ''%装配'''
IF (@ = '加急')
SET @selectStrWhere = @selectStrWhere + ' AND [加急状态] = 1'
IF (@ = '正常')
SET @selectStrWhere = @selectStrWhere + ' AND [单据状态] is null'
ELSE IF (@ = '关闭')
SET @selectStrWhere = @selectStrWhere + ' AND [单据状态] is not null'
IF (@ <> '全部')
SET @selectStrWhere = @selectStrWhere + ' AND [指派对象] IN (SELECT value FROM STRING_SPLIT(''' + @ + ''', '',''))'
SET @selectStrWhere = @selectStrWhere + ' ORDER BY v.[计划完成] ASC, v.[订单编号] ASC'
SET @selectStr = @selectStr + @selectStrWhere
PRINT @selectStr
EXEC sp_executesql @selectStr
END
GO

View File

@@ -0,0 +1,81 @@
ALTER PROCEDURE [dbo].[_质检明细_查询]
@ nvarchar(4000) = '10',
@ datetime = NULL,
@ datetime = NULL,
@ nvarchar(4000) = '0',
@ nvarchar(4000) = '0',
@ nvarchar(4000) = '0',
@ nvarchar(4000) = '0',
@PageCurrent int = 1,
@PageSize int = 20,
@PageCount int OUTPUT,
@ItemCount int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @tbname sysname = ' [dbo].[View_质检明细] '
DECLARE @fieldkey sysname = 'QT_AID'
DECLARE @where nvarchar(4000)
DECLARE @fieldshow nvarchar(1000)
DECLARE @fieldOrder nvarchar(1000) = ' 检测时间 DESC, QT_AID DESC '
SET @where = ' (1=1) '
IF @ = '10'
SET @where = @where + ' AND (1=1) '
ELSE IF @ = '0'
SET @where = @where + ' AND 质检类型 = ''收检'' '
ELSE IF @ = '1'
SET @where = @where + ' AND 质检类型 = ''终检'' '
ELSE IF @ = '2'
SET @where = @where + ' AND 质检类型 = ''来料检验'' '
ELSE IF @ = '3'
SET @where = @where + ' AND 质检类型 = ''退库检验'' '
IF @ <> '0'
SET @where = @where + ' AND 计划号 LIKE ''%' + @ + '%'' '
--IF @ <> '0'
-- SET @where = @where + ' AND 内部合同号 LIKE ''%' + @合同号 + '%'' '
IF @ <> '0'
SET @where = @where + ' AND 零件编码 LIKE ''%' + @ + '%'' '
IF @ <> '0'
SET @where = @where + ' AND 零件名称 LIKE ''%' + @ + '%'' '
IF @ IS NOT NULL
SET @where = @where + ' AND 检测时间 >= ''' + CONVERT(nvarchar(30), @, 120) + ''' '
IF @ IS NOT NULL
SET @where = @where + ' AND 检测时间 <= ''' + CONVERT(nvarchar(30), @, 120) + ''' '
SET @fieldshow = '
[QT_AID]
,[质检类型]
,[零件编码]
,[零件名称]
,[内部合同号]
,[计划号]
,[工序名称]
,[检验数量]
,[合格数]
,[不合格数]
,[检测人]
,[检测时间]
,[检测说明]
,[工位名称]
,[订单类型]'
EXEC [dbo].[sp_xt_pagesplit]
@tbname,
@fieldkey,
@where,
@fieldshow,
@fieldOrder,
@PageCurrent,
@PageSize,
@PageCount OUTPUT,
@ItemCount OUTPUT
END

View File

@@ -0,0 +1,426 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[_设备工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
IF @ = CONVERT(DATE, '19000101', 112) SET @ = NULL;
IF @ = CONVERT(DATE, '19000101', 112) SET @ = NULL;
;WITH AS (
SELECT
,
COUNT(*) AS ,
SUM(CASE WHEN IN (N'报工', N'辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图全部
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
GROUP BY
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
COUNT(*) AS ,
SUM(CASE WHEN IN (N'报工', N'辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图全部
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
GROUP BY , CONVERT(VARCHAR(10), , 120)
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
AS ,
,
,
,
CAST( AS DECIMAL(19,6)) AS ,
,
AS ,
CASE
WHEN LIKE N'%白班%' THEN N'白班'
WHEN LIKE N'%夜班%' THEN N'夜班'
ELSE N''
END AS ,
AS ,
CASE WHEN IN (N'报工', N'辅助结束') THEN ELSE 0 END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS
FROM View_生产工时视图全部
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
)
SELECT
1 AS [Level],
AS operator,
'' AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
CAST(NULL AS DECIMAL(19,6)) AS ,
'' AS processName,
'' AS ,
'' AS ,
'' AS ,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
2 AS [Level],
AS operator,
AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
CAST(NULL AS DECIMAL(19,6)) AS ,
'' AS processName,
'' AS ,
'' AS ,
'' AS ,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
3 AS [Level],
AS operator,
AS dateLabel,
'' AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
AS ,
ISNULL(, '') AS processName,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
ORDER BY operator, dateLabel, [Level]
END
GO
ALTER PROCEDURE [dbo].[_项目工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
IF @ = CONVERT(DATE, '19000101', 112) SET @ = NULL;
IF @ = CONVERT(DATE, '19000101', 112) SET @ = NULL;
;WITH AS (
SELECT
LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name,
MAX(NULLIF(LTRIM(RTRIM()), '')) AS
FROM [YL_MESDB].[dbo].[_人员信息]
WHERE Personnel_Name IS NOT NULL
GROUP BY LTRIM(RTRIM(Personnel_Name))
),
AS (
SELECT
v.*,
ISNULL(p., '未分类') AS ,
CASE
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 AND ISNULL(v., 0) = 0 THEN ISNULL(v., 0)
WHEN v. LIKE '%加班%' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. = '开始加工' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
ELSE 0
END AS
FROM View_生产工时视图全部 v
LEFT JOIN p ON LTRIM(RTRIM(v.)) = p.Personnel_Name
),
AS (
SELECT
v. AS ,
v.,
v.,
MAX(v.) AS ,
MAX(v.) AS ,
SUM(CASE WHEN v. IN ('报工', '辅助结束') THEN v. ELSE 0 END) AS ,
MIN(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(CONVERT(VARCHAR(10), v., 120)) AS ,
CAST(SUM(v.) / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM v
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. = @)
GROUP BY v., v., v.
),
AS (
SELECT
v. AS ,
v.,
v.,
MAX(v.) AS ,
v.,
v.,
MAX(v.) AS ,
v.,
SUM(CASE WHEN v. IN ('报工', '辅助结束') THEN v. ELSE 0 END) AS ,
CAST(SUM(v.) / 60.0 / 60.0 AS DECIMAL(10,1)) AS ,
MIN(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(v.) AS
FROM v
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. = @)
GROUP BY v., v., v., v., v., v.
)
SELECT
1 AS [Level],
AS contractNo,
AS materialDesc,
AS materialCode,
CAST(NULL AS DECIMAL(19,6)) AS ,
'' AS processName,
'' AS ,
'' AS ,
'' AS operator,
'' AS ,
CASE WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END + '/' +
CASE WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS planStart,
ISNULL(, '') AS planEnd,
CAST( AS VARCHAR(20)) AS workHours,
'' AS
FROM
UNION ALL
SELECT
2 AS [Level],
d. AS contractNo,
'' AS materialDesc,
d. AS materialCode,
d. AS ,
d. AS processName,
ISNULL(d., '') AS ,
d. AS ,
d. AS operator,
ISNULL(d., '') AS ,
'' AS qty,
CAST(d. AS VARCHAR(20)) AS reportQty,
d. AS planStart,
d. AS planEnd,
CAST(d. AS VARCHAR(20)) AS workHours,
d. AS
FROM d
ORDER BY contractNo, materialCode, [Level], processName,
END
GO
ALTER PROCEDURE [dbo].[_任务工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
IF @ = CONVERT(DATE, '19000101', 112) SET @ = NULL;
IF @ = CONVERT(DATE, '19000101', 112) SET @ = NULL;
;WITH AS (
SELECT
LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name,
MAX(NULLIF(LTRIM(RTRIM()), '')) AS
FROM [YL_MESDB].[dbo].[_人员信息]
WHERE Personnel_Name IS NOT NULL
GROUP BY LTRIM(RTRIM(Personnel_Name))
),
AS (
SELECT
v.*,
ISNULL(p., '未分类') AS ,
CASE
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 AND ISNULL(v., 0) = 0 THEN ISNULL(v., 0)
WHEN v. LIKE '%加班%' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. = '开始加工' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
ELSE 0
END AS
FROM View_生产工时视图全部 v
LEFT JOIN p ON LTRIM(RTRIM(v.)) = p.Personnel_Name
),
AS (
SELECT
AS ,
,
,
,
,
MAX() AS ,
,
,
MAX() AS ,
MAX() AS ,
SUM(CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR = @)
GROUP BY , , , , , ,
),
AS (
SELECT
AS ,
,
,
,
,
,
AS ,
,
,
,
CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS
FROM
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR = @)
)
SELECT
1 AS [Level],
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
ISNULL(, '') AS ,
CAST( AS DECIMAL(19,6)) AS ,
ISNULL(, '') AS ,
'' AS operator,
'' AS ,
CASE WHEN IS NULL THEN '0' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END + '/' +
CASE WHEN IS NULL THEN '0' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours,
FROM
UNION ALL
SELECT
2 AS [Level],
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
'' AS productName,
ISNULL(, '') AS processName,
ISNULL(, '') AS ,
CAST( AS DECIMAL(19,6)) AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS operator,
ISNULL(, '') AS ,
'' AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
CAST( AS VARCHAR(20)) AS workHours,
FROM
ORDER BY contractNo, orderNo, productCode, processName, [Level], startTime
END
GO

View File

@@ -0,0 +1,328 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[_作业者工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name,
MAX(NULLIF(LTRIM(RTRIM()), '')) AS
FROM [YL_MESDB].[dbo].[_人员信息]
WHERE Personnel_Name IS NOT NULL
GROUP BY LTRIM(RTRIM(Personnel_Name))
),
AS (
SELECT
v.*,
ISNULL(p., '未分类') AS ,
CASE
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 AND ISNULL(v., 0) = 0 THEN ISNULL(v., 0)
WHEN v. LIKE '%加班%' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. = '开始加工' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. = '异常' THEN -ISNULL(v., 0)
ELSE 0
END AS
FROM [dbo].[View_生产工时视图] v
LEFT JOIN p ON LTRIM(RTRIM(v.)) = p.Personnel_Name
),
AS (
SELECT
,
COUNT(*) AS ,
SUM(CASE
WHEN NOT IN ('异常') THEN
WHEN = '异常' THEN -
ELSE 0
END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR = @)
AND ISNULL(, 0) != -1
GROUP BY
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
COUNT(*) AS ,
SUM(CASE
WHEN NOT IN ('异常') THEN
WHEN = '异常' THEN -
ELSE 0
END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR = @)
AND ISNULL(, 0) != -1
GROUP BY , CONVERT(VARCHAR(10), , 120)
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
AS ,
,
,
,
,
,
,
AS ,
CASE
WHEN NOT IN ('异常') THEN
WHEN = '异常' THEN -
ELSE 0
END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS ,
,
,
FROM
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR = @)
AND ISNULL(, 0) != -1
)
SELECT
1 AS [Level],
AS operator,
'' AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
CAST(NULL AS DECIMAL(19,6)) AS ,
'' AS ,
'' AS ,
'' AS startTime,
'' AS endTime,
'' AS ,
'' AS ,
'' AS ,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
2 AS [Level],
AS operator,
AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
CAST(NULL AS DECIMAL(19,6)) AS ,
'' AS ,
'' AS ,
'' AS startTime,
'' AS endTime,
'' AS ,
'' AS ,
'' AS ,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
3 AS [Level],
AS operator,
AS dateLabel,
'' AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
CAST( AS VARCHAR(20)) AS workHours
FROM
ORDER BY operator, dateLabel, [Level]
END
GO
ALTER PROCEDURE [dbo].[_任务工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name,
MAX(NULLIF(LTRIM(RTRIM()), '')) AS
FROM [YL_MESDB].[dbo].[_人员信息]
WHERE Personnel_Name IS NOT NULL
GROUP BY LTRIM(RTRIM(Personnel_Name))
),
AS (
SELECT
v.*,
ISNULL(p., '未分类') AS ,
CASE
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 AND ISNULL(v., 0) = 0 THEN ISNULL(v., 0)
WHEN v. LIKE '%加班%' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. = '开始加工' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
ELSE 0
END AS
FROM View_生产工时视图 v
LEFT JOIN p ON LTRIM(RTRIM(v.)) = p.Personnel_Name
),
AS (
SELECT
AS ,
,
,
,
,
,
,
MAX() AS ,
MAX() AS ,
SUM(CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR = @)
GROUP BY , , , , , ,
),
AS (
SELECT
AS ,
,
,
,
,
AS ,
,
,
,
CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS
FROM
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR = @)
)
SELECT
1 AS [Level],
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
CAST( AS DECIMAL(19,6)) AS ,
ISNULL(, '') AS ,
'' AS operator,
'' AS ,
CASE WHEN IS NULL THEN '0' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END + '/' +
CASE WHEN IS NULL THEN '0' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours,
FROM
UNION ALL
SELECT
2 AS [Level],
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
'' AS productName,
ISNULL(, '') AS processName,
CAST( AS DECIMAL(19,6)) AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS operator,
ISNULL(, '') AS ,
'' AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
CAST( AS VARCHAR(20)) AS workHours,
FROM
ORDER BY contractNo, orderNo, productCode, processName, [Level], startTime
END
GO

View File

@@ -0,0 +1,152 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[_设备工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
,
COUNT(*) AS ,
SUM(CASE WHEN IN (N'报工', N'辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
GROUP BY
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
COUNT(*) AS ,
SUM(CASE WHEN IN (N'报工', N'辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
GROUP BY , CONVERT(VARCHAR(10), , 120)
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
AS ,
,
,
,
,
AS ,
CASE
WHEN LIKE N'%白班%' THEN N'白班'
WHEN LIKE N'%夜班%' THEN N'夜班'
ELSE N''
END AS ,
AS ,
CASE WHEN IN (N'报工', N'辅助结束') THEN ELSE 0 END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR >= @)
AND (@ IS NULL OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND ISNULL(, 0) = -1
)
SELECT
1 AS [Level],
AS operator,
'' AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS ,
'' AS ,
'' AS ,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
2 AS [Level],
AS operator,
AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS ,
'' AS ,
'' AS ,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
3 AS [Level],
AS operator,
AS dateLabel,
'' AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
ORDER BY operator, dateLabel, [Level]
END
GO

View File

@@ -0,0 +1,132 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[_项目工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
LTRIM(RTRIM(Personnel_Name)) AS Personnel_Name,
MAX(NULLIF(LTRIM(RTRIM()), '')) AS
FROM [YL_MESDB].[dbo].[_人员信息]
WHERE Personnel_Name IS NOT NULL
GROUP BY LTRIM(RTRIM(Personnel_Name))
),
AS (
SELECT
v.*,
ISNULL(p., '未分类') AS ,
CASE
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. IN ('报工', '辅助结束') AND ISNULL(v., 0) > 0 AND ISNULL(v., 0) = 0 THEN ISNULL(v., 0)
WHEN v. LIKE '%加班%' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
WHEN v. = '开始加工' AND ISNULL(v., 0) > 0 THEN ISNULL(v., 0)
ELSE 0
END AS
FROM View_生产工时视图 v
LEFT JOIN p ON LTRIM(RTRIM(v.)) = p.Personnel_Name
),
AS (
SELECT
v. AS ,
v.,
v.,
MAX(v.) AS ,
MAX(v.) AS ,
SUM(CASE WHEN v. IN ('报工', '辅助结束') THEN v. ELSE 0 END) AS ,
MIN(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(CONVERT(VARCHAR(10), v., 120)) AS ,
CAST(SUM(v.) / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM v
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. = @)
GROUP BY v., v., v.
),
AS (
SELECT
v. AS ,
v.,
v.,
v.,
v.,
MAX(v.) AS ,
v.,
SUM(CASE WHEN v. IN ('报工', '辅助结束') THEN v. ELSE 0 END) AS ,
CAST(SUM(v.) / 60.0 / 60.0 AS DECIMAL(10,1)) AS ,
MIN(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(v.) AS
FROM v
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. = @)
GROUP BY v., v., v., v., v., v.
)
SELECT
1 AS [Level],
AS contractNo,
AS materialDesc,
AS materialCode,
CAST(NULL AS DECIMAL(19,6)) AS ,
'' AS processName,
'' AS ,
'' AS operator,
'' AS ,
CASE WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END + '/' +
CASE WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS planStart,
ISNULL(, '') AS planEnd,
CAST( AS VARCHAR(20)) AS workHours,
'' AS
FROM
UNION ALL
SELECT
2 AS [Level],
d. AS contractNo,
'' AS materialDesc,
d. AS materialCode,
d. AS ,
d. AS processName,
d. AS ,
d. AS operator,
ISNULL(d., '') AS ,
'' AS qty,
CAST(d. AS VARCHAR(20)) AS reportQty,
d. AS planStart,
d. AS planEnd,
CAST(d. AS VARCHAR(20)) AS workHours,
d. AS
FROM d
ORDER BY contractNo, materialCode, [Level], processName,
END
GO

View File

@@ -0,0 +1,94 @@
CREATE PROCEDURE [dbo].[sp_xt_pagesplit]
@tbname sysname,
@fieldkey sysname,
@where nvarchar(1000),
@fieldshow nvarchar(max),
@fieldOrder nvarchar(1000),
@PageCurrent int=1,
@PageSize int=30,
@PageCount int OUTPUT,
@ItemCount int output
AS
BEGIN
SET NOCOUNT ON
-- 参数检查
IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
IF ISNULL(@PageSize,0)<1 SET @PageSize=10
IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
-- 处理排序
DECLARE @OrderBy nvarchar(1000)
IF ISNULL(@FieldOrder,N'')=N''
SET @OrderBy = N''
ELSE
SET @OrderBy = N'ORDER BY ' + LTRIM(@FieldOrder)
-- 处理条件 - 重要去掉WHERE关键字只保留条件内容
DECLARE @WhereCondition nvarchar(1000)
IF ISNULL(@Where,N'')=N''
SET @WhereCondition = N''
ELSE
SET @WhereCondition = @Where -- 只保存条件内容不加WHERE
-- 清理字段名
SET @fieldkey = LTRIM(RTRIM(@fieldkey))
DECLARE @quotedKey NVARCHAR(128) = QUOTENAME(@fieldkey)
-- 计算总记录数
DECLARE @sql nvarchar(MAX)
IF @WhereCondition = N''
SET @sql = N'SELECT @ItemCount = COUNT(*) FROM ' + @tbname
ELSE
SET @sql = N'SELECT @ItemCount = COUNT(*) FROM ' + @tbname + N' WHERE ' + @WhereCondition
EXEC sp_executesql @sql, N'@ItemCount int OUTPUT', @ItemCount OUTPUT
-- 计算总页数
SET @PageCount = CEILING((@ItemCount + 0.0) / @PageSize)
IF @PageCount = 0 SET @PageCount = 1
-- 返回当前页数据
DECLARE @TopRows INT = (@PageCurrent - 1) * @PageSize
IF @PageCurrent = 1
BEGIN
-- 第一页
IF @WhereCondition = N''
SET @sql = N'SELECT TOP ' + CONVERT(NVARCHAR, @PageSize) + N' ' + @FieldShow + N'
FROM ' + @tbname + N' ' + @OrderBy
ELSE
SET @sql = N'SELECT TOP ' + CONVERT(NVARCHAR, @PageSize) + N' ' + @FieldShow + N'
FROM ' + @tbname + N' WHERE ' + @WhereCondition + N' ' + @OrderBy
END
ELSE
BEGIN
-- 其他页
IF @WhereCondition = N''
BEGIN
-- 无条件的情况
SET @sql = N'SELECT TOP ' + CONVERT(NVARCHAR, @PageSize) + N' ' + @FieldShow + N'
FROM ' + @tbname + N'
WHERE ' + @quotedKey + N' NOT IN (
SELECT TOP ' + CONVERT(NVARCHAR, @TopRows) + N' ' + @quotedKey + N'
FROM ' + @tbname + N' ' + @OrderBy + N'
) ' + @OrderBy
END
ELSE
BEGIN
-- 有条件的情况
SET @sql = N'SELECT TOP ' + CONVERT(NVARCHAR, @PageSize) + N' ' + @FieldShow + N'
FROM ' + @tbname + N'
WHERE ' + @quotedKey + N' NOT IN (
SELECT TOP ' + CONVERT(NVARCHAR, @TopRows) + N' ' + @quotedKey + N'
FROM ' + @tbname + N' WHERE ' + @WhereCondition + N' ' + @OrderBy + N'
) AND ' + @WhereCondition + N' ' + @OrderBy
END
END
-- 调试用,可以注释掉
-- PRINT @sql
-- 执行
EXEC(@sql)
END

View File

@@ -0,0 +1,94 @@
CREATE PROCEDURE [dbo].[_任务工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
AS ,
,
,
,
,
,
MAX() AS ,
MAX() AS ,
SUM(CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
GROUP BY , , , , ,
),
AS (
SELECT
AS ,
,
,
,
,
,
CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
)
SELECT
1 AS [Level],
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
'' AS operator,
CASE WHEN IS NULL THEN '0' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END + '/' +
CASE WHEN IS NULL THEN '0' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours,
FROM
UNION ALL
SELECT
2 AS [Level],
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
'' AS productName,
ISNULL(, '') AS processName,
ISNULL(, '') AS operator,
'' AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
CAST( AS VARCHAR(20)) AS workHours,
FROM
ORDER BY contractNo, orderNo, productCode, processName, [Level], startTime
END

View File

@@ -0,0 +1,49 @@
CREATE PROCEDURE [dbo].[_任务工时_查询_导出]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 导出文件名和类型
SELECT '任务工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype
-- 字段宽度
SELECT 256*20 AS , 256*12 AS , 256*40 AS , 256*25 AS , 256*15 AS ,
256*12 AS , 256*12 AS , 256*12 AS , 256*10 AS , 256*20 AS , 256*20 AS , 256*12 AS '工时(h)'
-- 是否计算列
SELECT 0 AS , 0 AS , 0 AS , 0 AS , 0 AS ,
0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS '工时(h)'
-- 导出数据:每行都填满完整信息
SELECT
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
CASE WHEN IS NULL THEN '' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS ,
CASE WHEN IS NULL THEN '' WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS ,
CASE WHEN IN ('报工', '辅助结束') THEN CAST( AS VARCHAR(20)) ELSE '0' END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST(CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)'
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
ORDER BY , , , ,
END

View File

@@ -0,0 +1,164 @@
CREATE PROCEDURE [dbo].[_作业者工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
,
COUNT(*) AS ,
SUM(CASE
--WHEN IN ('报工', '辅助结束', '加班', '开始加工') THEN
WHEN NOT IN ('异常') THEN
WHEN = '异常' THEN - -- 异常工时记为负数
ELSE 0
END) AS ,
CAST(SUM(CASE
WHEN = '异常' THEN - -- 异常时长记为负数
ELSE
END) / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM [dbo].[View_生产工时视图]
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
and isNull(,0) != -1
GROUP BY
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
COUNT(*) AS ,
SUM(CASE
--WHEN IN ('报工', '辅助结束', '加班', '开始加工') THEN
WHEN NOT IN ('异常') THEN
WHEN = '异常' THEN - -- 异常工时记为负数
ELSE 0
END) AS ,
CAST(SUM(CASE
WHEN = '异常' THEN - -- 异常时长记为负数
ELSE
END) / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM [dbo].[View_生产工时视图]
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
and isNull(,0) != -1
GROUP BY , CONVERT(VARCHAR(10), , 120)
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
AS ,
,
,
,
,
CASE
--WHEN IN ('报工', '辅助结束', '加班', '开始加工') THEN
WHEN NOT IN ('异常') THEN
WHEN = '异常' THEN - -- 异常数量记为负数
ELSE 0
END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST(CASE
WHEN = '异常' THEN - -- 异常时长记为负数
ELSE
END / 60.0 / 60.0 AS DECIMAL(10,2)) AS ,
,
,
FROM [dbo].[View_生产工时视图]
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
and isNull(,0) != -1
)
SELECT
1 AS [Level],
AS operator,
'' AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS startTime,
'' AS endTime,
'' AS ,
'' AS ,
'' AS ,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
2 AS [Level],
AS operator,
AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS startTime,
'' AS endTime,
'' AS ,
'' AS ,
'' AS ,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
3 AS [Level],
AS operator,
AS dateLabel,
'' AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
CAST( AS VARCHAR(20)) AS workHours
FROM
ORDER BY operator, dateLabel, [Level]
END

View File

@@ -0,0 +1,50 @@
CREATE PROCEDURE [dbo].[_作业者工时_查询_导出]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 导出文件名和类型
SELECT '作业者工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype
-- 字段宽度
SELECT 256*12 AS , 256*15 AS , 256*20 AS , 256*12 AS , 256*40 AS ,
256*25 AS , 256*15 AS , 256*10 AS , 256*20 AS , 256*20 AS , 256*12 AS '工时(h)'
-- 是否计算列
SELECT 0 AS , 0 AS , 0 AS , 0 AS , 0 AS ,
0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS '工时(h)'
-- 导出数据:每行都填满完整信息
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
CASE WHEN IN ('报工', '辅助结束','加班','异常','开始加工') THEN CAST( AS VARCHAR(20)) ELSE '0' END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST(CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)'
FROM [dbo].[View_生产工时视图]
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
and isNull(,0) != -1
ORDER BY ,
END

View File

@@ -0,0 +1,129 @@
CREATE PROCEDURE [dbo].[_设备工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
,
COUNT(*) AS ,
SUM(CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
and isNull(,0) = -1
GROUP BY
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
COUNT(*) AS ,
SUM(CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END) AS ,
CAST(SUM() / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
and isNull(,0) = -1
GROUP BY , CONVERT(VARCHAR(10), , 120)
),
AS (
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
AS ,
,
,
,
,
CASE WHEN IN ('报工', '辅助结束') THEN ELSE 0 END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
and isNull(,0) = -1
)
SELECT
1 AS [Level],
AS operator,
'' AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
2 AS [Level],
AS operator,
AS dateLabel,
CAST( AS VARCHAR(20)) AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
'' AS contractNo,
'' AS orderNo,
'' AS productCode,
'' AS productName,
'' AS processName,
'' AS startTime,
'' AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
UNION ALL
SELECT
3 AS [Level],
AS operator,
AS dateLabel,
'' AS reportCount,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS contractNo,
ISNULL(, '') AS orderNo,
ISNULL(, '') AS productCode,
ISNULL(, '') AS productName,
ISNULL(, '') AS processName,
ISNULL(, '') AS startTime,
ISNULL(, '') AS endTime,
CAST( AS VARCHAR(20)) AS workHours
FROM
ORDER BY operator, dateLabel, [Level]
END

View File

@@ -0,0 +1,50 @@
CREATE PROCEDURE [dbo].[_设备工时_查询_导出]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 导出文件名和类型
SELECT '设备工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype
-- 字段宽度
SELECT 256*12 AS , 256*15 AS , 256*20 AS , 256*12 AS , 256*40 AS ,
256*25 AS , 256*15 AS , 256*10 AS , 256*20 AS , 256*20 AS , 256*12 AS '工时(h)'
-- 是否计算列
SELECT 0 AS , 0 AS , 0 AS , 0 AS , 0 AS ,
0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS '工时(h)'
-- 导出数据:每行都填满完整信息
SELECT
,
CONVERT(VARCHAR(10), , 120) AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
ISNULL(, '') AS ,
CASE WHEN IN ('报工', '辅助结束') THEN CAST( AS VARCHAR(20)) ELSE '0' END AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CONVERT(VARCHAR(19), , 120) AS ,
CAST(CAST( / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)'
FROM View_生产工时视图
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND IS NOT NULL AND != ''
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR LIKE '%' + @ + '%')
and isNull(,0) = -1
ORDER BY ,
END

View File

@@ -0,0 +1,90 @@
CREATE PROCEDURE [dbo].[_项目工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
v. AS ,
v.,
v.,
MAX(v.) AS ,
MAX(v.) AS ,
SUM(CASE WHEN v. IN ('报工', '辅助结束') THEN v. ELSE 0 END) AS ,
MIN(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(CONVERT(VARCHAR(10), v., 120)) AS ,
CAST(SUM(v.) / 60.0 / 60.0 AS DECIMAL(10,1)) AS
FROM View_生产工时视图 v
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
GROUP BY v., v., v.
),
AS (
SELECT
v. AS ,
v.,
v.,
v.,
v.,
SUM(CASE WHEN v. IN ('报工', '辅助结束') THEN v. ELSE 0 END) AS ,
CAST(SUM(v.) / 60.0 / 60.0 AS DECIMAL(10,1)) AS ,
MIN(CONVERT(VARCHAR(10), v., 120)) AS ,
MAX(CONVERT(VARCHAR(10), v., 120)) AS
FROM View_生产工时视图 v
WHERE (@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
GROUP BY v., v., v., v.,v.
)
SELECT
1 AS [Level],
AS contractNo,
AS materialDesc,
AS materialCode,
'' AS processName,
'' AS operator,
CASE WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END + '/' +
CASE WHEN = FLOOR() THEN CAST(CAST( AS INT) AS VARCHAR(20)) ELSE CAST(CAST( AS DECIMAL(10,1)) AS VARCHAR(20)) END AS qty,
CAST( AS VARCHAR(20)) AS reportQty,
ISNULL(, '') AS planStart,
ISNULL(, '') AS planEnd,
CAST( AS VARCHAR(20)) AS workHours,
'' AS
FROM
UNION ALL
SELECT
2 AS [Level],
d. AS contractNo,
'' AS materialDesc,
d. AS materialCode,
d. AS processName,
d. AS operator,
'' AS qty,
CAST(d. AS VARCHAR(20)) AS reportQty,
d. AS planStart,
d. AS planEnd,
CAST(d. AS VARCHAR(20)) AS workHours,
d. AS
FROM d
ORDER BY contractNo, materialCode, [Level], processName
END

View File

@@ -0,0 +1,48 @@
CREATE PROCEDURE [dbo].[_项目工时_查询_导出]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
-- 导出文件名和类型
SELECT '项目工时统计_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype
-- 字段宽度
SELECT 256*20 AS , 256*20 AS ,256*30 AS , 256*40 AS , 256*15 AS , 256*12 AS ,
256*12 AS , 256*12 AS , 256*10 AS , 256*15 AS , 256*15 AS , 256*12 AS '工时(h)'
-- 是否计算列
SELECT 0 AS , 0 AS ,0 AS , 0 AS , 0 AS , 0 AS ,
0 AS , 0 AS , 0 AS , 0 AS , 0 AS , 0 AS '工时(h)'
-- 导出数据:每行都填满完整信息
SELECT
v. AS ,
v.,
v.,
v.,
v.,
v.,
CASE WHEN v. IS NULL THEN '' WHEN v. = FLOOR(v.) THEN CAST(CAST(v. AS INT) AS VARCHAR(20)) ELSE CAST(CAST(v. AS DECIMAL(10,1)) AS VARCHAR(20)) END AS ,
CASE WHEN v. IS NULL THEN '' WHEN v. = FLOOR(v.) THEN CAST(CAST(v. AS INT) AS VARCHAR(20)) ELSE CAST(CAST(v. AS DECIMAL(10,1)) AS VARCHAR(20)) END AS ,
CASE WHEN v. IN ('报工', '辅助结束') THEN CAST(v. AS VARCHAR(20)) ELSE '0' END AS ,
CONVERT(VARCHAR(10), v., 120) AS ,
CONVERT(VARCHAR(10), v., 120) AS ,
CAST(CAST(v. / 60.0 / 60.0 AS DECIMAL(10,2)) AS VARCHAR(20)) AS '工时(h)'
FROM View_生产工时视图 v
WHERE(@ IS NULL OR @ = '' OR >= @)
AND (@ IS NULL OR @ = '' OR <= @)
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
AND (@ IS NULL OR @ = '' OR v. LIKE '%' + @ + '%')
ORDER BY v., v., v., v.,v.
END

View File

@@ -0,0 +1,196 @@
CREATE PROCEDURE [dbo].[_生产计划跟踪]
@ int = 0,
@ nvarchar(50) = '', --
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@1 nvarchar(50) = '',
@2 nvarchar(50) = '',
@1 nvarchar(50) = '',
@2 nvarchar(50) = '',
@1 nvarchar(50) = '',
@2 nvarchar(50) = '',
@ nvarchar(50) = '全部', --
@ nvarchar(50) = '全部',
@ nvarchar(50) = '全部',
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(50) = ''
AS
BEGIN
DECLARE @selectStr NVARCHAR(MAX)
DECLARE @selectStrWhere NVARCHAR(4000) = ' WHERE [物料类型] = ''pit_Resource'' '
SET @selectStr = N'
SELECT top 500
v.计划号,
加急总数,
拣配状态,
自制件属性,
入库数量,
外协分组,
case
when isnull(任务状态,0)=4 then ''已完成''
when isnull(任务状态,0)=2 then ''已开工''
when isnull(任务状态,0)=0 then ''待执行''
when isnull(任务状态,0)=1 then ''可执行''
else ''''
end as [任务状态],
case
when isnull(加工状态,0)=2 then ''辅助开始''
when isnull(加工状态,0)=3 then ''辅助结束''
when isnull(加工状态,0)=4 then ''开始加工''
when isnull(加工状态,0)=5 then ''暂停''
when isnull(加工状态,0)=6 then ''报工''
else ''''
end as [加工状态],
[计划数量订单],
ISNULL(开工时间, 0) AS 开工时间,
ISNULL(进度, 0) AS 进度,
v.[TaskAID],
[合同号],
v.[订单编号] AS 订单号,
[订单行号],
[订单拆分内码] AS 拆分内码,
[物料编号] AS 产品编码,
[物料描述] AS 产品名称,
TRIM(''.'' FROM TRIM(''0'' FROM CAST([计划数量] AS VARCHAR(30)))) AS 计划数量,
[计划完成] AS 要求完工日期,
[工序名称],
完成数量,
收料数量,
CASE
WHEN [加急状态] = 1 THEN ''加急''
ELSE ''''
END AS 加急状态,
加急数量,
性质,
ISNULL(总工时, 0) AS 总工时,
[占用情况],
[排产状态],
[工序计划数量],
指派对象编号,
指派对象,
TRIM(''.'' FROM TRIM(''0'' FROM CAST([指派数量] AS VARCHAR(30)))) AS 指派数量,
计划开始时间,
计划完成时间,
最晚开始时间,
[派工状态],
[外协通知],
[优先级],
[未完成说明],
[派工特殊说明],
[最后编辑人],
[最后编辑时间],
[二次派工],
CASE
WHEN zj_终检.计划号 IS NOT NULL THEN ''''
ELSE ''''
END AS 终检,
-- 新增收检相关字段
ISNULL(zj_收检.合格数合计, 0) AS 收检合格数,
ISNULL(zj_收检.不合格数合计, 0) AS 收检不合格数,
ISNULL(zj_收检.合格数合计, 0) + ISNULL(zj_收检.不合格数合计, 0) AS 收检总数,
ISNULL(jl.开始时间, 0) AS 开始时间,
ISNULL(jl.结束时间, 0) AS 结束时间,
ISNULL(jl.外协结束时间, 0) AS 外协结束时间,
STUFF((
SELECT '','' + d2.工序名称
FROM [dbo].[View_生产订单_MES] d2
WHERE d2.订单编号 = v.订单编号 order by d2.订单行号
FOR XML PATH('''')
), 1, 1, '''') AS 工艺路线
FROM [dbo].[View_生产订单全部包括已关闭] v
-- 终检判断
LEFT JOIN (
SELECT DISTINCT 计划号
FROM dbo.YL_质量检验_质检记录
WHERE 质检类型 = ''终检''
) zj_终检 ON v.[订单编号] = zj_终检.计划号
-- 收检数量统计
LEFT JOIN (
SELECT
TaskAID,
SUM(ISNULL(合格数, 0)) AS 合格数合计,
SUM(ISNULL(不合格数, 0)) AS 不合格数合计
FROM dbo.YL_质量检验_质检记录
WHERE 质检类型 = ''收检''
GROUP BY TaskAID
) zj_收检 ON v.[TaskAID] = zj_收检.TaskAID
LEFT JOIN (
SELECT
TaskAID,
min(ISNULL(开始时间, 0)) AS 开始时间,
MAX(CASE WHEN 操作类别 = ''报工'' THEN ISNULL(开始时间, 0) ELSE NULL END) AS 外协结束时间,
MAX(CASE WHEN 操作类别 = ''报工'' THEN ISNULL(结束时间, 0) ELSE NULL END) AS 结束时间
FROM [dbo].[YL_加工中心_操作记录表]
GROUP BY TaskAID
) jl ON v.[TaskAID] = jl.TaskAID'
-- 添加筛选条件
IF (@ > 0)
SET @selectStrWhere = @selectStrWhere + ' AND [订单编号] = ' + CONVERT(VARCHAR(10), @)
IF (@ > 0)
SET @selectStrWhere = @selectStrWhere + ' AND v.[计划号] = '''+@+''''
IF (@ <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [合同号] LIKE ''%' + @ + '%'''
IF (@ <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [物料编号] LIKE ''%' + @ + '%'''
IF (@ <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [物料描述] LIKE ''%' + @ + '%'''
IF (@ <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [工序名称] = ''' + @ + ''''
IF (@1 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划完成] >= ''' + @1 + ''''
IF (@2 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划完成] <= ''' + @2 + ''''
IF (@1 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划开始时间] >= ''' + @1 + ''''
IF (@2 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划开始时间] <= ''' + @2 + ''''
IF (@1 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划完成时间] >= ''' + @1 + ''''
IF (@2 <> '')
SET @selectStrWhere = @selectStrWhere + ' AND [计划完成时间] <= ''' + @2 + ''''
IF (@ = '未完成')
SET @selectStrWhere = @selectStrWhere + ' AND ISNULL([排产状态], 0) = 0'
ELSE IF (@ = '已完成')
SET @selectStrWhere = @selectStrWhere + ' AND [排产状态] = 1'
IF (@ = '机加')
SET @selectStrWhere = @selectStrWhere + ' AND [自制件属性] = ''机加件'''
ELSE IF (@ = '装配')
SET @selectStrWhere = @selectStrWhere + ' AND [自制件属性] LIKE ''%装配'''
IF (@ = '加急')
SET @selectStrWhere = @selectStrWhere + ' AND [加急状态] = 1'
IF (@ = '正常')
SET @selectStrWhere = @selectStrWhere + ' AND [单据状态] is null'
ELSE IF (@ = '关闭')
SET @selectStrWhere = @selectStrWhere + ' AND [单据状态] is not null'
IF (@ <> '全部')
SET @selectStrWhere = @selectStrWhere + ' AND [指派对象] IN (SELECT value FROM STRING_SPLIT(''' + @ + ''', '',''))'
-- 添加排序
SET @selectStrWhere = @selectStrWhere + ' ORDER BY [计划完成] ASC, [订单编号] ASC'
-- 合并SQL
SET @selectStr = @selectStr + @selectStrWhere
-- 打印SQL调试用
PRINT @selectStr
-- 执行查询
EXEC sp_executesql @selectStr
END

View File

@@ -0,0 +1,94 @@
-- 质量管理_质检明细_查询
CREATE PROCEDURE [dbo].[_质检明细_查询]
@ nvarchar(4000) = '10', -- 修改为字符串类型,因为传入的是字符串
@ datetime = NULL,
@ datetime = NULL,
@ nvarchar(4000) = '0', -- 修改为字符串类型,避免类型转换问题
@ nvarchar(4000) = '0',
@ nvarchar(4000) = '0',
@ nvarchar(4000) = '0',
@PageCurrent int = 1, -- 要显示的页码
@PageSize int = 20, -- 每页的大小(记录数)
@PageCount int OUTPUT, -- 总页数
@ItemCount int OUTPUT -- 数据总数
AS
BEGIN
SET NOCOUNT ON;
DECLARE @tbname sysname = ' [dbo].[View_质检明细] ' -- 要分页显示的表名
DECLARE @fieldkey sysname = ' ' -- 用于定位记录的主键(惟一键)字段
DECLARE @where nvarchar(4000) -- 查询条件
DECLARE @fieldshow nvarchar(1000) -- 要显示的字段列表
DECLARE @fieldOrder nvarchar(1000) = ' 检测时间 DESC ' -- 排序字段
-- 构建查询条件使用参数化方式避免SQL注入
SET @where = ' (1=1) '
-- 质检类型过滤
IF @ = '10' -- 全部
SET @where = @where + ' AND (1=1) '
ELSE IF @ = '0'
SET @where = @where + ' AND 质检类型 = ''收检'' '
ELSE IF @ = '1'
SET @where = @where + ' AND 质检类型 = ''终检'' '
ELSE IF @ = '2'
SET @where = @where + ' AND 质检类型 = ''来料检验'' '
ELSE IF @ = '3'
SET @where = @where + ' AND 质检类型 = ''退库检验'' '
-- 订单号过滤条件修正使用LIKE时加引号
IF @ <> '0'
SET @where = @where + ' AND 计划号 LIKE ''%' + @ + '%'' '
-- 合同号过滤条件
--IF @ <> '0'
-- SET @where = @where + ' AND 内部合同号 LIKE ''%' + @合同号 + '%'' '
-- 零件编码过滤条件
IF @ <> '0'
SET @where = @where + ' AND 零件编码 LIKE ''%' + @ + '%'' '
-- 零件名称过滤条件
IF @ <> '0'
SET @where = @where + ' AND 零件名称 LIKE ''%' + @ + '%'' '
-- 日期范围过滤(如果提供了日期参数)
IF @ IS NOT NULL
SET @where = @where + ' AND 检测时间 >= ''' + CONVERT(nvarchar(30), @, 120) + ''' '
IF @ IS NOT NULL
SET @where = @where + ' AND 检测时间 <= ''' + CONVERT(nvarchar(30), @, 120) + ''' '
SET @fieldshow = '
[QT_AID]
,[质检类型]
,[零件编码]
,[零件名称]
,[内部合同号]
,[计划号]
,[工序名称]
,[检验数量]
,[合格数]
,[不合格数]
,[检测人]
,[检测时间]
,[检测说明]
,[工位名称]
,[订单类型]'
-- 调试用(可以注释掉)
PRINT @where
-- 执行分页存储过程
EXEC [dbo].[sp_xt_pagesplit]
@tbname,
@fieldkey,
@where,
@fieldshow,
@fieldOrder,
@PageCurrent,
@PageSize,
@PageCount OUTPUT,
@ItemCount OUTPUT
END

View File

@@ -0,0 +1,7 @@
{
"folders": [
{
"path": ".."
}
]
}

View File

@@ -0,0 +1,69 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[_加急任务查询]
AS
BEGIN
SET NOCOUNT ON;
SELECT
[]
,[]
,[]
,[]
,[]
,[]
,[]
,[]
,[]
,[]
,[]
,[]
, as
,
,
,
,REPLACE(STUFF((
SELECT
' -> ' + ISNULL(d2., '') + '(' + ISNULL(d2., '') + ')'
+ '|' + ISNULL(CAST(d2. AS VARCHAR(10)), '0')
+ '|' + ISNULL(CAST(CAST(ISNULL((
SELECT SUM()
FROM [dbo].[YL_质量检验_质检记录]
WHERE TaskAID = d2.TaskAID
), 0) AS INT) AS VARCHAR(10)), '0')
+ '|' + ISNULL(CONVERT(VARCHAR(2), MONTH(d2.)) + '' + CONVERT(VARCHAR(2), DAY(d2.)) + '', '')
+ '|' + ISNULL(CAST(d2. AS VARCHAR(10)), '')
+ '|' + ISNULL(CAST(d2. AS NVARCHAR(50)), '')
+ '|' + ISNULL(CAST(CAST(ISNULL((
SELECT SUM()
FROM [dbo].[YL_加工中心_操作记录表]
WHERE TaskAID = d2.TaskAID
AND = '收料'
), 0) AS INT) AS VARCHAR(10)), '0')
+ '|' + ISNULL(CAST(CAST(ISNULL((
SELECT SUM()
FROM [dbo].[YL_质量检验_质检记录]
WHERE TaskAID = d2.TaskAID
), 0) AS INT) AS VARCHAR(10)), '0')
FROM [dbo].[View_生产订单_MES] d2
WHERE d2. = v.
ORDER BY d2.
FOR XML PATH('')
), 1, 6, ''), '&gt;', '>') AS
,(SELECT COUNT(DISTINCT ) FROM [YL_MESDB].[dbo].[View_生产订单_MES] WHERE > 0 AND NOT LIKE '%装配%') AS []
FROM [YL_MESDB].[dbo].[View_生产订单_MES] v
WHERE > 0
AND NOT LIKE '%装配%'
AND = (
SELECT MIN()
FROM [YL_MESDB].[dbo].[View_生产订单_MES]
WHERE = v.
)
END

16
doc_old/index.html Normal file
View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title><%= htmlWebpackPlugin.options.title %></title>
<link rel="icon" href="favicon.ico">
</head>
<body style="background-color: #eeeeee">
<script src="./static/config.js"></script>
<script src="./static/jsQR.js"></script>
<div id="app"></div>
<script></script>
<!-- built files will be auto injected -->
</body>
</html>

View File

@@ -0,0 +1,81 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE [dbo].[_装配及时送检_查询]
@ int = 0,
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'不含'
AS
BEGIN
SET NOCOUNT ON;
;WITH AS (
SELECT
CASE WHEN v.[] LIKE N'%系统%' THEN N'系统类' ELSE N'阀类' END AS ,
v.[],
v.[] AS ,
v.[] AS ,
v.[] AS ,
TRIM('.' FROM TRIM('0' FROM CAST(v.[] AS varchar(30)))) AS ,
v.[],
v.[],
v.[],
v.[],
v.[],
v.[],
CASE
WHEN v.[] LIKE N'%系统%'
THEN ISNULL(v.[], DATEADD(DAY, 3, v.[]))
ELSE ISNULL(v.[], DATEADD(DAY, 3, v.[]))
END AS ,
CASE WHEN ISNULL(v.[], 0) = 1 THEN N'加急' ELSE N'' END AS
FROM [dbo].[View_生产订单_MES] v
WHERE v.[] = 'pit_Resource'
AND v.[] LIKE N'%装配%'
AND ISNULL(v.[], 0) < 4
AND (@ <= 0 OR v.[] = @)
AND (@ = N'' OR v.[] LIKE N'%' + @ + N'%')
AND (@ = N'' OR v.[] LIKE N'%' + @ + N'%')
AND (@ = N'' OR v.[] LIKE N'%' + @ + N'%')
AND (@ = N'' OR v.[] = @)
AND (
@ <> N'不含'
OR (
v.[] NOT LIKE N'%软管总成%'
AND v.[] NOT LIKE N'%发货部件%'
)
)
AND v.[] <> N''
)
SELECT
,
,
,
,
,
,
,
,
,
,
,
,
,
FROM
WHERE IS NOT NULL
AND CONVERT(date, ) <= CONVERT(date, GETDATE())
ORDER BY
CONVERT(date, ),
CASE WHEN = N'加急' THEN 0 ELSE 1 END,
;
END
GO

View File

@@ -0,0 +1,77 @@
# 今后开发计划与新增需求分析记录
生成日期2026-05-27
项目MES_Manage_View_V20
## 一、排期口径
- 按“最终调整”数字从小到大排序。
- 从 2026-05-28 开始排期。
- 按工作日递推,跳过周六、周日。
- 跳过端午节、中秋节、国庆节法定放假日期。
- 调休日按工作日处理。
- 暂按单开发线串行排期。
节假日口径:
- 端午节2026-06-19 至 2026-06-21。
- 中秋节2026-09-25 至 2026-09-27。
- 国庆节2026-10-01 至 2026-10-07。
- 调休上班日2026-09-20、2026-10-10。
## 二、开发计划排期
| 顺序 | 需求 | 预估 | 开始 | 结束 | 备注 |
|---:|---|---:|---|---|---|
| 1 | 及时开工报表 | 1天 | 5.28 | 5.29 | 增加正选/反选查询 |
| 2 | 机加件排产-表单 | 4天 | 5.29 | 6.04 | 日期筛选优化 + 历史工时查询SAP新增字段不算MES开发 |
| 3 | 装配已排产需求 | 12天 | 6.04 | 6.23 | 大需求,建议分阶段交付 |
| 4 | 生产日报-送检(机加/装配) | 3天 | 6.23 | 6.26 | 建议统一报表,部门做筛选维度 |
| 5 | 及时齐套跟踪结果报表 | 5天 | 6.26 | 7.03 | 依赖SAP缺件明细实时接口 |
| 6 | 生产计划跟踪 | 3天 | 7.03 | 7.08 | 工序状态、颜色、标准工时、订单状态 |
| 7 | 外协任务检验 | 3天 | 7.08 | 7.13 | 增加指派对象、供应商、SAP采购收货单号 |
| 8 | 异常管控 | 5天 | 7.13 | 7.20 | 报工页面直接报异常,多审批人可见一人处理 |
| 9 | 机加班次产量表 | 3天 | 7.20 | 7.23 | 新增报表 |
| 10 | 发货通知列表 | 1天 | 7.23 | 7.24 | SAP数据已提供可新增查询报表 |
| 11 | 质检任务早知道 | 1天 | 7.24 | 7.27 | 依赖“装配已排产需求”的装配完成时间 |
| 12 | 生产工艺 | 2天 | 7.27 | 7.29 | 无生产工艺时自动带出标准工艺 |
| 13 | 工时报表 + 备注类小改 | 2天 | 7.29 | 7.31 | 指派对象、机加领料备注、机加/装配退库备注、保存提示等合并处理 |
| 14 | 生产订单关闭 | 4天 | 7.31 | 8.06 | 批量更新SAP订单状态风险较高 |
| 15 | 及时检验报表 | 4天 | 8.06 | 8.12 | 报工超过2天未检验 |
| 16 | 工序流转卡 | 1天 | 8.12 | 8.13 | 增加打印原料编码 |
| 17 | 一楼质检大屏幕 | 4天 | 8.13 | 8.19 | 及时率、关键工序 |
| 18 | 机加现场大屏幕 | 3天 | 8.19 | 8.24 | 缺勤、关键工序 |
| 19 | 装配现场大屏幕 | 4天 | 8.24 | 8.28 | 缺勤、及时送检 |
| 20 | 编程任务清单 | 4天 | 8.28 | 9.03 | 按装配类似逻辑做编程报工 |
| 21 | 设备档案管理 | 2天 | 9.03 | 9.07 | 需先确认字段归属 |
| 22 | 设备数据采集 | 8天 | 9.07 | 9.17 | 采集接口、落库、状态汇总 |
| 23 | 设备指标/OEE | 6天 | 9.17 | 9.24 | 依赖设备采集和标准工时口径 |
| 24 | 工时查询-设备采集联动 | 2天 | 9.24 | 9.29 | 程序工时字段对接采集数据 |
| 25 | 手续确认报表 | 3天 | 9.29 | 10.09 | 装配/电气齐套列表 + 手续确认 |
| 26 | 产品合格率(工位) | 3天 | 10.09 | 10.13 | 需确认良品/总产量口径 |
| 27 | 让步接收记录 | 2天 | 10.13 | 10.15 | 新增查询页面 |
| 28 | 设计任务报工模块 | 6天 | 10.15 | 10.23 | MES自建设计任务、设计工时 |
| 29 | 工时异常报表 | 2天 | 10.23 | 10.27 | 依赖标准工时和实际单件工时 |
| 30 | 正在加工状态 | 1天 | 10.27 | 10.28 | 机加正在进行中状态 |
## 三、暂不直接排期 / 需等前置条件
| 需求 | 原因 |
|---|---|
| 及时拣配机加MES | 等SAP数据、条码规则、状态写回规则 |
| 及时拣配装配MES | 等SAP数据、条码规则、状态写回规则 |
| 及时送检报表 | 需确认发料齐套时间/SAP字段是否稳定若SAP数据已到可插入0.5天 |
| 工艺内容修改 | 已开工任务怎么处理未定 |
| 标牌打印操作 | 需求未确定 |
| 首检、巡检 | 需求内容为空,无法估时 |
| 外协采购订单收检结果 | 需求内容为空,无法估时 |
| 不合格品单据打印 | 需求内容为空,无法估时 |
## 四、排期结论
按以上单线工作日计划,已明确可做事项预计到 2026-10-28 完成。
实际执行建议先做 5.28 到 6.23 的前三项,因为它们优先级最高,且“装配已排产需求”会影响后面的质检早知道、日计划、及时送检等需求。
## 五、新增需求分析与开发记录原文

View File

@@ -0,0 +1,137 @@
今日工作汇报
日期2026年5月23日
一、今日已处理问题
1. 修复采购收货检备注问题
已处理采购收货检验相关备注字段异常,保证备注信息能够正常记录、查询和展示。
2. 查询序检因已入库导致质检失败的原因
已排查序检过程中因生产订单或物料已入库导致质检失败的问题,明确该类失败与当前入库状态校验逻辑有关,后续如需优化,需要结合入库状态、质检状态和业务允许范围进一步确认处理规则。
3. 修改生产任务看板未按期齐套任务数据
已调整生产任务看板中“未按期齐套任务”相关数据逻辑,修正看板展示数据与实际业务状态不一致的问题。
二、今日需求分析记录
1. 工艺内容修改
已分析该需求。由于涉及已开工任务,当前结论是不允许直接修改。后续如要支持,需要设计工艺版本、任务快照和已开工任务处理规则,目前暂不开发。
2. 机加件排产-表单
已分析计划开始时间、计划完成时间筛选逻辑,后续改为按单日期查询。
同时分析新增历史工时查询:在机加件已排产页面增加总工时字段,点击后弹窗查看明细,按设备、日期分组显示生产任务和工时合计,查询方式参考工时查询页面。
3. 工序流转卡
已确认打印内容需要增加原料编码开发周期约0.2天。
4. 生产计划跟踪
已分析当前序展示逻辑。后续需要在当前序中显示完整工艺路线,并根据任务状态判断哪道序正在加工、哪些序等待加工。
进度显示规则示例:当前工序加工中显示“打磨中”,当前工序完成后显示“打磨毕待喷漆”。
括号内容为指派对象,外协工序括号中也显示指派对象。
同时需要增加标准工时和订单状态字段。
5. 设计任务报工模块
已分析该模块为MES自建任务不依赖生产订单不上传SAP。
设计工时单独记录,后续用于报表和工时统计。
质量、装配、机加工时分别来自各自业务模块,后续可按系统角色权限区分。
6. 工时报表
已确认作业者工时新增指派对象字段开发周期约0.1天。
作业者工时一对多计算问题当前暂不修改,因为当前版本已不再按旧逻辑计算,需要后续重新确认规则。
7. 工时查询
程序工时字段需要结合设备数据采集计算,后续可能新增设备信息。目前等待设备采集数据,不进入开发。
8. 生产领料(补充)-机加
已确认领料单需要新增备注字段开发周期约0.2天。
9. 生产退库-机加
已确认按照装配退库方式增加备注字段开发周期约0.2天。
10. 生产退库-装配
已确认需要增加备注字段开发周期约0.1天。
11. 机加班次产量表
已分析为新增报表,按设备分组,设备下按日期、班次展示每天每班次干了哪些任务,支持时间和班次筛选。
12. 外协任务报表(采购)
已确认增加采购到货期说明字段开发周期约0.1天。
13. 外协任务检验 / 序检
已分析需要记录指派对象、供应商、SAP采购收货单号。
当前表中没有记录设备,只记录工序,所以后续如果要做设备合格率暂时无法实现;增加供应商后,可以支持外协供应商合格率相关统计。
14. 手续确认报表
已分析为新增页面。装配、电气发料齐套时间列表合并显示,展示内容参考装配中心。
新增“手续确认”字段,点击选择已完成后消失。
消失条件包括:手续确认已完成、生产订单取消/关闭、整单已入库。
15. 及时检验报表
已分析为新增报表。统计生产报工完成后超过2天未检验的任务。
数据依据为[YL_加工中心_操作记录表]条件包括操作类别为报工、操作数值大于0并以结束时间作为起算时间。
16. 及时齐套跟踪结果报表
已分析为新增报表。缺件明细为实时数据来源SAP通过生产订单号查询加急件明细。
缺料物料的生产订单号需要绑定主生产订单号,支持多个子订单包含关系。
页面需要支持展开查看缺件明细,并显示当前进度、排序、预计完成时间、预计可执行时间等信息。
17. 及时送检报表
已确认为新需求基于发料齐套时间SAP数据已到预计开发周期约0.5天。
18. 生产日报-送检(机加 / 装配)
已分析后续可能根据多个部门拆分多个报表,也可以先按部门筛选方式设计,避免重复开发。
19. 编程任务清单
已分析本质为编程报工,类似装配中心的任务列表算法。
后续需要按设备展示任务清单,并支持编程开始、结束、工时统计等功能。
20. 标牌打印操作
当前需求未确定,暂不排开发周期。
21. 发货通知列表
SAP已提供数据大屏已显示后续需要新增报表页面预计开发周期约0.5天。
22. 生产订单关闭
已分析需要新增批量更新SAP订单状态功能。
后续开发时需要支持批量选择、调用SAP、记录成功失败结果并防止重复关闭。
23. 制定标准工艺
已确认点击保存时增加提示信息开发周期约0.1天。
24. 生产工艺
已分析编辑时如果没有生产工艺,需要自动带出标准工艺。
带出内容作为编辑草稿,不应直接覆盖保存,避免误改生产工艺。
25. 异常管控
已分析报工页面需要支持选择任务后直接报异常,不再进入异常页面后重新选择任务。
审批人改为多选,一人处理即可,其他被选审批人也能看到任务。
审批人来源不固定,可能来自部门、角色、组织层级或任意人员,因此都需要支持。
26. 及时开工报表
已分析当前是指派对象反选查询,客户还需要正选查询页面。
后续需要支持指派对象正选和反选两种查询方式。
27. 让步接收记录
已分析为新增查询页面。数据来源为质检记录中让步接收字段不为空的数据。
28. 装配已排产需求
已完成重点分析。该需求需要新增装配已排产需求界面,增加系统/非系统筛选。
高压单元为系统,阀类为非系统,判断方式暂按物料名称关键字。
新增装配完成时间来源为发料齐套时间加3天可手动修改字段落库到生产计划表。
还需要显示SAP派工时间、合同交货期增加钣金预达、钣金到达、泵、当前对应人员、当前对应内容、累计工时、预计总工时、合同工时汇总、合同进度参考、预计剩余工时、生产异常等字段。
工时按装配、质量、设计分类,装配来自装配报工,质量来自质检报工,设计来自新设计任务报工模块。
同步需要做日计划报表,按装配完成时间分组,支持导出和打印。
29. 质检任务早知道
已分析为新增页面,基于装配已排产需求中的装配完成时间,去掉已完成任务后,按装配完成时间分组展示。
三、今日分析结论
今日除已处理的三个问题外主要完成了新增需求的逐项梳理明确了哪些可以直接开发、哪些依赖SAP、哪些依赖设备采集、哪些需求暂不明确、哪些当前无法修改。
其中可直接进入开发的小项包括:工序流转卡原料编码、工时报表指派对象、领料/退库备注、外协采购到货期说明、发货通知列表、标准工艺保存提示等。
需要重点设计后再开发的需求包括:装配已排产需求、生产计划跟踪、及时齐套跟踪结果报表、设计任务报工、异常管控、手续确认报表。
依赖外部数据的需求包括SAP派工时间、合同交货期、发料齐套时间、及时齐套缺件明细、设备数据采集工时。

View File

@@ -0,0 +1,151 @@
# 元利 MES 项目 — 今日工作汇报
日期2026-05-25
项目MES_Manage_View_V20
## 一、今日主要工作
### 1. 完成 `src/views` 页面与 SAP 交互分析整理
基于 `元利项目详细分析.md`,对主系统 `src/views` 中涉及 SAP 的页面调用进行了梳理,明确了 SAP 交互主要集中在以下业务链路:
| 业务链路 | 涉及页面 | SAP 交互内容 |
|---|---|---|
| 机加/装配排产 | `SelfMakePlan``SelfMakePlando``SelfMakePlandone``InstallMakePlan``InstallMakePlanDo` | 回写 SAP 生产订单计划日期、派工信息、优先级、未完成说明 |
| 生产订单关闭 | `PlannOrderClose` | 更新 SAP 生产订单关闭状态 |
| 工序基础数据 | `ProcedureManagement` | 新增、查询、修改 SAP RouteStages |
| 工位资源维护 | `WorkstationManagement` | 新增、修改 SAP Resources |
| 外协业务 | `OutsourceMange``SaleOutsourceMange`、装配排产相关页面 | 创建 SAP 采购申请 |
| 工时校验/投料 | `WorkHoursCheck` | 查询 SAP 生产订单、更新工序资源、提交 InventoryGenExits |
| 质检/收货 | `processReceive``materialReturn``QualityCenter` | 查询 SAP 订单、创建采购收货单、生成库存任务 |
分析结论:
- 当前系统不是单点 SAP 对接,而是计划、工艺、工位、生产、外协、质检、工时多个模块共同对接 SAP。
- SAP 写操作失败会造成 MES 与 SAP 状态不一致,需要在后续开发中保留失败原因、同步状态和重试依据。
- 生产订单关闭、工时校验、外协采购申请、采购收货是高风险操作,需要重点检查重复提交和半成功问题。
### 2. 生成元利项目详细流程图
已根据 `元利项目详细分析.md` 生成:
- `元利项目详细流程图.md`
内容包括:
- 系统总体架构流程
- 登录、菜单、权限流程
- 基础资料维护流程
- 标准工艺/生产工艺流程
- 机加排产与 SAP 回写流程
- 装配排产与采购申请流程
- 机加生产执行流程
- 装配中心执行流程
- 质检流程
- 外协流程
- 工时校验与 SAP 投料流程
- 异常管控流程
- 生产订单关闭与 SAP 状态同步流程
- 看板数据汇总流程
- 新增需求与维护入口判断流程
### 3. 生成新增需求界面原型设计
已根据 `新增需求分析与开发记录_2026-05-23.md` 生成:
- `新增需求界面原型设计_2026-05-25.md`
主要覆盖以下页面原型:
- 设计任务报工
- 机加班次产量表
- 手续确认报表
- 及时检验报表
- 及时齐套跟踪结果报表
- 生产日报-送检
- 编程任务清单/编程报工
- 让步接收记录
- 装配已排产需求
- 质检任务早知道
- 及时送检报表
- 发货通知列表
- 工时异常报表
同时补充了现有页面改造说明,包括机加已排产、生产计划跟踪、序检收检、生产订单关闭、生产工艺、异常管控、及时开工报表、工时报表、领料/退库/外协小字段等。
### 4. 生成元利项目详细用户使用说明书
已根据 `元利项目详细分析.md` 生成:
- `元利项目详细用户使用说明书.md`
内容覆盖:
- 登录与通用操作
- 基础资料维护
- 工艺与图纸管理
- 计划排产管理
- 生产执行管理
- 外协业务
- 质检管理
- 工时与报表
- 异常管控
- 设备管理与采集
- 看板使用
- 销售与交付查询
- 新增需求相关页面使用
- 系统维护
- 常见问题和名词解释
### 5. 修正新增需求分析口径
对前期新增需求分析进行了补充修正,重点明确不能只判断“是否新增页面”,还必须判断:
1. 数据来源是什么。
2. 字段在哪里维护。
3. 是否已有业务页面承载。
4. 是否需要新增维护页面。
5. 是否影响历史任务、报表和看板。
已补充的关键结论:
- 缺勤人员不能从“没有报工”反推,必须有应到人员和实到人员来源。
- 关键工序应在标准工艺和生产工艺中维护,任务下发时做快照。
- 看板只读取缺勤、关键工序、OEE、及时率等指标不作为主维护入口。
## 二、今日修改工作
### 1. 工时校验报工培训
今日进行了工时校验和报工相关培训,重点说明:
- 报工数据与工时校验之间的关系。
- MES 工时与 SAP 工时提交的关系。
- 工时校验页面中 SAP 订单、工序、资源、投料的核对方式。
- SAP 提交失败时需要查看失败原因,避免重复提交。
### 2. 质检历史数据修复
已处理质检历史数据修复工作,重点围绕历史质检记录、任务状态和相关查询口径进行校正,减少历史数据对当前质检查询和报表统计的影响。
### 3. 修改生产订单关闭判断条件
已修改生产订单关闭相关判断条件,调整关闭前校验逻辑,避免不符合条件的订单被错误关闭,同时减少已完成、已入库、已取消等状态判断不一致带来的问题。
### 4. 修复休息日加班和法定加班计算 Bug
已修复休息日加班和法定加班计算异常问题,调整加班类型对应的计算逻辑,避免休息日加班和法定加班工时统计错误。
## 三、今日产出文档
| 文档 | 说明 |
|---|---|
| `元利项目详细流程图.md` | 根据详细分析生成系统级和业务级流程图 |
| `新增需求界面原型设计_2026-05-25.md` | 根据新增需求生成界面原型和页面说明 |
| `元利项目详细用户使用说明书.md` | 根据详细分析生成面向用户的完整操作说明 |
| `新增需求分析与开发记录_2026-05-23.md` | 补充数据来源、维护入口、是否新建页面等分析 |
| `隐性需求综合分析_2026-05-25.md` | 补充维护入口和隐性需求判断规则 |
| `MES_Manage_View_V20_src_views_逐页面详细分析.md` | 补充页面归属、缺勤、关键工序、看板维护边界说明 |
## 四、当前结论
1. 元利 MES 与 SAP 的交互范围较广,后续所有涉及 SAP 写操作的功能都需要补同步状态、失败原因和重试机制。
2. 新增需求不能简单按“新增页面”评估,要同步判断维护入口、数据来源、历史数据和看板影响。
3. 工时、质检、订单关闭、加班计算属于当前重点稳定性工作,已完成培训和部分修复。
4. 后续开发建议优先处理低风险、小范围功能,再推进装配已排产需求、及时齐套、设计/编程报工、OEE 等跨模块功能。

View File

@@ -0,0 +1,143 @@
# 元利 MES 项目 — 今日工作汇报
日期2026-05-26
项目MES_Manage_View_V20
## 一、今日主要工作
### 1. 丰富并修改元利项目详细流程图
今日继续完善 `元利项目详细流程图.md`,在原有系统级流程基础上,进一步补充页面级、业务级流程说明。
重点补充内容:
- 登录、菜单权限、动态路由生成流程。
- 工艺、图纸、生产订单、排产、生产执行、质检、外协、工时校验、生产订单关闭等模块之间的衔接关系。
- 机加排产、装配排产、机加中心、装配中心、质量中心、工时校验等关键页面的详细业务流。
- SAP 回写、SAP 查询、WMS/库存任务、MES 存储过程之间的数据流转关系。
- 将流程图尽量调整为“框 + 箭头 + 文字”的形式,减少字母节点指引,便于培训和现场讲解。
本次调整后,流程图更适合用于:
- 给客户讲解整体 MES 业务闭环。
- 给实施人员定位页面与数据流关系。
- 给开发人员判断新增需求影响范围。
### 2. 工时校验数据对接梳理
今日继续梳理工时校验页面与 MES/SAP 数据之间的对接关系,重点围绕 `ProductionManagement/WorkHoursCheck`
已梳理内容:
- 对接数据时发现装配人员工时数据错误,经检查由于用户重复提交导致的问题
- 在排查过程中发现装配人员报工加班时,同时生成了正常报工的工时
### 3. 生产订单关闭培训与相关数据处理
今日进行了生产订单关闭相关培训和数据处理,重点说明生产订单关闭页面的使用边界。
培训内容:
- 生产订单关闭前需要先确认订单在 MES 中的任务完成情况。
- 关闭前需要核对生产订单状态、入库情况、报工情况和 SAP 状态。
- 批量关闭时要区分已成功关闭、关闭失败、不能关闭三类结果。
- SAP 关闭失败时不应重复点击,应先确认 SAP 返回原因。
数据处理内容:
- 协助检查生产订单关闭相关数据。
- 梳理关闭条件与当前订单状态之间的关系。
- 对异常数据进行核对,避免误关或重复关闭。
### 4. 沟通报工结果数据上传到 SAP 的影响
今日围绕报工结果上传 SAP 的影响进行了沟通和确认。
沟通重点:
- 超过班次工作时间部分的工时 如果不选择加班,系统自动记录这段工时
- 这段工时如果上次到SAP会导致其他生成订单工时不准确的问题,因为计算方法核算的是当日总报工时间记为8小时
- 这段时间如果上传,就会导致其他工时减少
- 休息日/法定时选择不加班工时记录的问题讨论结果是MES正常记录 但是不传输给SAP
### 5. 修改装配报工数据重复问题
今日处理装配报工数据重复问题。
处理重点:
- 排查装配报工过程中可能重复写入的数据链路。
- 核对装配任务、报工记录、质检/送检记录之间的关联关系。
- 调整重复数据产生场景,避免同一任务重复形成报工结果。
- 修改后重点关注装配中心报工、送检、任务完成状态的回显是否一致。
处理结果:
- 已针对装配报工重复问题进行修正。
- 后续需要继续观察现场报工数据,确认是否仍存在重复写入或重复统计。
### 6. 丰富并修改用户使用说明书
今日重点丰富 `元利项目详细用户使用说明书.md`
主要修改内容:
- 将第 21 章逐页说明整体扩展,不再只写笼统功能说明。
- 对 78 个页面按源码逐页补充:
- 页面用途
- 具体操作步骤
- 查询条件/输入项
- 结果表重点列
- 页面按钮/状态/页签
- 弹窗/表单重点项
- 后台处理/外部接口
- 操作注意事项
- 将第 21 章页面标题从英文页面名改为中文页面名,例如:
- `WorkHoursCheck` 改为 `工时校验`
- `SelfMakePlandone` 改为 `机加已排产`
- `MachiningCenter` 改为 `机加中心`
- `QualityCenter` 改为 `质量中心`
-`机加已排产` 章节进行了重点细化补充日程拖拽、指派数量、拆分派工、二次派工、原料状态、图纸、外协分组、最晚开始、红色加急排序、SAP 日期同步等操作。
说明书修改后更适合:
- 现场用户培训。
- 新员工快速熟悉页面。
- 实施人员按页面排查问题。
- 后续新增需求评审时对照现有功能。
### 7. 修改原料退库检,增加加急显示
今日处理原料退库检页面加急显示需求。
涉及页面:
- `QualityManagement/CheckTask/materialReturn.vue`
处理内容:
- 在原料退库检任务中增加加急状态/加急信息显示。
- 方便质检人员优先识别加急退库检任务。
- 便于后续按加急任务排序、提醒或优先处理。
业务影响:
- 质检人员在原料退库检页面可以更直观看到加急任务。
- 加急退库检任务可优先处理,减少对生产或后续流程的影响。
## 二、今日产出与修改文件
| 文件 | 今日处理内容 |
|---|---|
| `元利项目详细流程图.md` | 丰富业务流程图,补充多页面、多模块数据流 |
| `元利项目详细用户使用说明书.md` | 扩展第 21 章逐页操作说明,标题改为中文页面名 |
| `ProductionManagement/WorkHoursCheck` | 梳理工时校验与 SAP 上传关系 |
| `PlanManagement/PlannOrderClose` | 生产订单关闭培训与数据处理 |
| 装配报工相关页面/数据 | 修正装配报工重复数据问题 |
| `QualityManagement/CheckTask/materialReturn.vue` | 原料退库检增加加急显示 |
## 三、今日沟通事项
1. 与相关人员沟通工时校验数据上传 SAP 的影响明确报工结果、工时、SAP 工序资源之间的关系。
2. 对生产订单关闭进行培训,说明关闭前校验、关闭失败处理和数据风险。
3. 结合装配报工重复问题,沟通现场报工操作和后台数据写入逻辑。
4. 结合用户说明书和流程图,明确后续培训资料需要按页面逐步讲解,不能只写功能概述。
## 四、当前风险与注意事项
| 风险点 | 影响 | 处理建议 |
|---|---|---|
| 工时上传 SAP 重复提交 | 可能造成 SAP 工时或库存单据重复 | 上传失败时先查失败原因,不要连续重复提交 |
| 生产订单关闭条件不一致 | 可能误关订单或关闭失败 | 关闭前核对 MES 任务、入库、报工和 SAP 状态 |
| 装配报工重复 | 影响工时、任务进度、质检/送检统计 | 修复后继续观察现场数据 |
| 加急任务未突出显示 | 质检处理优先级不明确 | 原料退库检已增加加急显示,后续可扩展排序 |
| 用户手册仍需继续细化 | 培训时可能仍有页面操作细节不足 | 后续按重点业务页面继续逐页补强 |

View File

@@ -137,34 +137,6 @@
---
## 五、明日工作计划(建议)
### 上午
| 优先级 | 事项 |
|:--:|------|
| 🔴 | 与甲方沟通 GM-01已开工任务工艺修改方案 |
| 🔴 | 与甲方沟通 BG-01~04设计任务报工模块详细需求 |
| 🟠 | 启动 RP-01手续确认报表存储过程开发 |
| 🟠 | 启动 BG-08工位任务汇总表— 见《需求分析_自制件与工位汇总表》 |
### 下午
| 优先级 | 事项 |
|:--:|------|
| 🟠 | JH-01~04 生产计划跟踪(颜色/状态/字段)前端改动 |
| 🟡 | LL-01~03 领料退库备注字段添加 |
| 🟡 | BG-05~06 工时报表字段修改 |
| 🟡 | WX-01 外协报表增加采购到货期说明 |
### 需SAP协调
| 事项 | 对接人 |
|------|:--:|
| PC-01 SAP增加字段 | SAP顾问 |
| RP-04/05/06/07 SAP数据接口 | SAP顾问 |
---
> 📅 日期: 2026-05-22
> 📊 需求总数: 34项 | 已修复: 9项 | 待处理: 25项

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,551 @@
# 元利 MES 项目详细流程图
生成日期2026-05-25
依据文档:`元利项目详细分析.md`
说明:
- 本文把 `元利项目详细分析.md` 中的页面、存储过程、SAP 调用、看板和新增隐性需求整理为可维护的 Mermaid 流程图。
- 图中页面路径以 `src/views/...` 为主,过程名称以文档分析到的 `CreateData(type, name, params)` 调用为主。
- `type=11` 通常表示查询/读取或通用执行,`type=12` 通常表示写入/业务动作,具体仍以后端实现为准。
## 1. 系统总体架构流程
```mermaid
flowchart TD
U[用户/班组/计划/质检/设备/管理层] --> FE[Vue 2.7 前端页面]
FE --> ROUTE[动态菜单/路由/权限]
ROUTE --> PAGE[src/views 业务页面]
PAGE --> CD[CreateData type + procedure + params]
CD --> ED[ExecDatabase 统一后端接口]
ED --> SP[SQL Server 存储过程]
SP --> DB[(YL_MESDB)]
PAGE --> B1[src/api/b1s.js]
B1 --> SAP[SAP B1 Service Layer]
SP --> SAPDB[(SAP.SBO_YL 跨库/同步表)]
PAGE --> TM[tm 仓储/条码任务接口]
TM --> WMS[库存/条码任务服务]
DB --> VIEW[业务视图/报表视图]
VIEW --> PAGE
VIEW --> DASH[生产/装配/质检/机加/综合看板]
SAPDB --> VIEW
SAP --> PAGE
WMS --> PAGE
```
关键链路:
- 前端页面不直接写 SQL而是通过 `CreateData` 组装过程名和参数。
- SAP 既有前端直接调用 B1 Service Layer也有 SQL 跨库或同步表读取。
- 看板主要读存储过程和视图,本身通常不维护业务数据。
## 2. 登录、菜单、权限与页面访问流程
```mermaid
flowchart TD
A[进入登录页 src/views/login] --> B[输入工号/密码]
B --> C[登录基础数据_人员信息_登陆检查密码]
C --> D{校验通过?}
D -- 否 --> E[提示登录失败]
D -- 是 --> F[写入 Token/用户信息]
F --> G[加载用户角色/菜单权限]
G --> H[登录基础数据_二级菜单/角色权限]
H --> I[生成动态路由]
I --> J[进入 Layout]
J --> K[侧边栏/标签页/AppMain]
K --> L[打开具体业务页面]
```
涉及页面:
- `src/views/login/index.vue`
- `src/views/layout/Layout.vue`
- `src/views/layout/components/Sidebar`
- `src/views/SystemMaintenance/MenuManagement`
- `src/views/SystemMaintenance/SystemRrolemaintenance`
## 3. 基础资料维护总流程
```mermaid
flowchart TD
A[系统基础资料] --> B[人员/组织/角色]
A --> C[工位/设备/SAP Resource]
A --> D[班次/人员绑定]
A --> E[工序/物料/图纸/产品结构]
B --> B1[PersonnelManagement/OrgManagement/SystemRole]
B1 --> B2[人员、岗位、班组、权限]
C --> C1[WorkstationManagement]
C1 --> C2[维护工位]
C2 --> C3{是否同步 SAP Resource?}
C3 -- 是 --> C4[POST/PATCH /Resources]
C3 -- 否 --> C5[仅 MES 保存]
C4 --> C6[记录同步状态/失败原因]
C5 --> C6
C --> C7[DeviceInformation]
C7 --> C8[设备名称/型号/类型/工位/点检/能力]
D --> D1[ShiftManagement/PersonnelBinding]
D1 --> D2[班次规则/人员工位绑定]
E --> E1[ProcedureManagement]
E1 --> E2[工序基础数据]
E2 --> E3{是否同步 SAP RouteStages?}
E3 -- 是 --> E4[POST/PATCH /RouteStages]
E3 -- 否 --> E5[MES 本地维护]
```
维护口径:
- 缺勤人员不能由看板维护,必须来自班次/排班、人员工位绑定和实到来源。
- 设备 OEE 基础数据应分散在设备档案、工位、工艺、采集配置中维护,不应只靠看板公式。
## 4. 工艺、图纸、标准工艺、生产工艺流程
```mermaid
flowchart TD
A[产品/物料/图纸基础] --> B[产品结构维护 CraftMaintain]
A --> C[零件图纸 PartDrawing]
A --> D[工艺图纸 ProcessDrawing]
A --> E[工序基础 ProcedureManagement]
B --> F[制定标准工艺 ProcessesDevelop]
C --> F
D --> F
E --> F
F --> G[标准工艺库]
G --> G1[工序顺序]
G --> G2[标准工时/准备工时]
G --> G3[是否关键工序]
G --> H[生产工艺 ProcessProduct]
H --> I{订单是否已有生产工艺?}
I -- 是 --> J[编辑订单级生产工艺]
I -- 否 --> K[按物料带出标准工艺草稿]
K --> L{用户保存?}
L -- 否 --> M[不写入生产工艺]
L -- 是 --> N[写入生产工艺库]
J --> O[启用/下发生产工艺]
N --> O
O --> P[生成任务可用工艺快照]
P --> Q[排产/报工/质检/看板读取]
```
关键结论:
- `关键工序` 应在标准工艺和生产工艺维护。
- 生产任务下发时应快照关键工序和标准工时,避免后续改标准工艺影响历史任务。
- 质检大屏、机加大屏只读取关键工序,不作为维护入口。
## 5. 生产订单、机加排产与 SAP 回写流程
```mermaid
flowchart TD
A[SAP/MES 生产订单同步] --> B[MES_接口_生产计划]
B --> C[待排产 SelfMakePlan]
C --> D[选择订单/工序/设备/工位/时间]
D --> E[排产保存]
E --> F[MES_接口_生产计划_生产任务]
F --> G[任务排产状态=已排产]
E --> H{是否回写 SAP 生产订单日期?}
H -- 是 --> I[PATCH /ProductionOrders]
I --> J{SAP 回写成功?}
J -- 是 --> K[记录同步成功]
J -- 否 --> L[记录失败原因/待重试]
H -- 否 --> M[仅 MES 排产]
G --> N[已排产 SelfMakePlando/SelfMakePlandone]
N --> O[生产计划跟踪/及时开工/机加中心]
```
涉及页面:
- `PlanManagement/SelfMakePlan`
- `PlanManagement/SelfMakePlando`
- `PlanManagement/SelfMakePlandone`
- `ProductionManagement/ProductionPlanTrack`
- `AnomalousManagement/PunctualWork`
风险点:
- MES 排产成功但 SAP 回写失败时,需要保留同步状态和失败原因。
- 已排产页面新增历史工时、总工时后,必须明确工时来源是生产报工、质检、异常还是设备采集。
## 6. 装配排产、外购申请与 SAP 流程
```mermaid
flowchart TD
A[装配/电气/系统相关订单] --> B[InstallMakePlan 待排产]
B --> C[选择装配任务/计划时间/优先级]
C --> D[保存装配排产]
D --> E[生成装配生产任务]
C --> F{需要采购申请?}
F -- 是 --> G[POST /PurchaseRequests]
G --> H{SAP 采购申请成功?}
H -- 是 --> I[记录 SAP 采购请求号]
H -- 否 --> J[记录失败/允许重试]
F -- 否 --> K[不生成采购申请]
D --> L{是否回写 SAP 生产订单?}
L -- 是 --> M[PATCH /ProductionOrders]
M --> N[同步派工/日期/说明]
L -- 否 --> O[仅 MES 保存]
E --> P[InstallMakePlanDo/装配中心/装配看板]
```
涉及页面:
- `PlanManagement/InstallMakePlan`
- `PlanManagement/InstallMakePlanDo`
- `ProductionManagement/AssemblyCenter`
- `装配任务看板`
新增需求影响:
- 发料齐套时间、装配完成时间、手续确认、送检状态会反向要求装配排产和装配中心补字段。
## 7. 机加生产执行流程
```mermaid
flowchart TD
A[已排产机加任务] --> B[MachiningCenter 机加中心]
B --> C{任务是否可开工?}
C -- 否 --> C1[显示不可操作原因: 未齐套/上序未合格/异常/编程未完成/设备占用]
C -- 是 --> D[开始加工/开工]
D --> E[操作记录表写入开始时间/人员/设备]
E --> F[加工过程]
F --> G{是否异常?}
G -- 是 --> H[直接报异常]
H --> I[AbnormalControl 异常管控]
I --> F
F --> J[结束报工]
J --> K[写入 YL_加工中心_操作记录表]
K --> L[更新完成数量/工时/任务状态]
L --> M{是否需要质检?}
M -- 是 --> N[进入质检任务/序检/首检/终检]
M -- 否 --> O[进入下序或完成]
O --> P{是否入库/转序/外协?}
P -- 转序 --> A
P -- 入库 --> Q[入库/库存任务]
P -- 外协 --> R[外协流程]
```
涉及对象:
- `YL_加工中心_操作记录表`
- `MES_接口_生产计划_生产任务`
- `View_生产订单_MES`
- `ProductionManagement/MachiningCenter`
新增需求影响:
- 编程任务完成状态可能成为开工前置条件。
- 设备采集工时、程序工时、人工报工工时需要区分。
- 条码拣配会影响齐套、发料、可开工状态。
## 8. 装配中心执行流程
```mermaid
flowchart TD
A[已排产装配任务] --> B[AssemblyCenter 装配中心]
B --> C[查询 SAP/MES 订单、物料、发料、齐套]
C --> D{发料/齐套是否满足?}
D -- 否 --> E[缺件/待发料/不可开工]
E --> F[缺件明细/预计可执行时间]
D -- 是 --> G[开始装配]
G --> H[装配报工/工时记录]
H --> I{是否产生异常?}
I -- 是 --> J[直接报异常 -> AbnormalControl]
I -- 否 --> K[继续装配]
K --> L[装配完成/更新任务状态]
L --> M{是否需要送检?}
M -- 是 --> N[送检/质检任务]
M -- 否 --> O[入库/发货/后续确认]
L --> P[手续确认报表]
P --> Q{手续确认完成?}
Q -- 否 --> R[待办保留]
Q -- 是 --> S[从待办消失]
O --> T[装配看板/生产任务看板]
```
关键新增字段:
- 发料齐套时间
- 装配完成时间
- 送检状态/送检时间
- 手续确认、确认人、确认时间
- 当前对应人员/当前对应内容
## 9. 质检业务流程
```mermaid
flowchart TD
A[质检任务来源] --> A1[机加报工后待检]
A --> A2[装配送检]
A --> A3[采购入库检]
A --> A4[序检收检/外协收检]
A --> A5[退库/销售退货/其他入库]
A1 --> B[QualityCenter/CheckTask]
A2 --> B
A3 --> B
A4 --> B
A5 --> B
B --> C[录入检验结果]
C --> D{合格?}
D -- 是 --> E[合格数量/质检完成]
D -- 否 --> F[不合格处理 Unqualified]
F --> G{处置方式}
G -- 返工 --> H[回生产/返修]
G -- 报废 --> I[报废记录]
G -- 让步接收 --> J[让步接收字段]
G -- 复检 --> K[生成复检/再次检验]
E --> L{是否 SAP 收货/库存动作?}
L -- 是 --> M[PurchaseDeliveryNotes 或库存任务]
L -- 否 --> N[MES 本地完成]
J --> O[让步接收记录查询页]
E --> P[质检看板/及时检验/生产日报]
```
涉及页面:
- `QualityManagement/QualityCenter`
- `QualityManagement/CheckTask/processReceive`
- `QualityManagement/CheckTask/purchaseIncoming`
- `QualityManagement/CheckTask/final`
- `QualityManagement/Unqualified`
- `QualityManagement/QualityDetails`
新增需求影响:
- 及时检验要以生产完成/报工完成时间为起点。
- 关键工序要从工艺/任务快照读取。
- 让步接收记录页只查询,不应成为维护入口。
## 10. 外协业务流程
```mermaid
flowchart TD
A[生产任务指派对象=外协] --> B[OutsourceMange 外协管理]
B --> C[生成外协任务/采购申请]
C --> D{是否提交 SAP 采购申请?}
D -- 是 --> E[POST /PurchaseRequests]
E --> F{SAP 成功?}
F -- 是 --> G[记录采购请求/单据关系]
F -- 否 --> H[记录失败/重试]
D -- 否 --> I[MES 本地外协任务]
G --> J[外协加工/供应商交付]
I --> J
J --> K[序检收检/外协收货]
K --> L[记录供应商/SAP采购收货单号/指派对象]
L --> M{质检合格?}
M -- 是 --> N[SAP PurchaseDeliveryNotes/入库]
M -- 否 --> O[不合格/返修/让步]
N --> P[外协报表/供应商质量统计]
O --> P
```
涉及页面:
- `ProductionManagement/OutsourceMange`
- `ProductionManagement/OutsourceSheet`
- `ProductionManagement/SaleOutsourceMange`
- `QualityManagement/CheckTask/processReceive`
关键修正:
- 供应商、SAP 采购收货单号、指派对象应在外协/序检收检链路维护,报表只消费这些字段。
## 11. 工时、SAP 工时校验与投料流程
```mermaid
flowchart TD
A[报工/设备采集/质检/装配] --> B[工时来源汇总]
B --> B1[人工报工工时]
B --> B2[设备运行工时]
B --> B3[程序工时]
B --> B4[质检/装配/设计/编程工时]
B1 --> C[Workhours/Timesheet/WorkHoursCheck]
B2 --> C
B3 --> C
B4 --> C
C --> D[工时校验]
D --> E{是否提交 SAP?}
E -- 否 --> F[MES 工时报表/绩效]
E -- 是 --> G[GET /ProductionOrders]
G --> H[匹配 SAP 工序/资源]
H --> I[POST /InventoryGenExits 投料]
H --> J[PATCH /ProductionOrders 更新工序资源/工时]
I --> K{SAP 成功?}
J --> K
K -- 是 --> L[记录提交成功]
K -- 否 --> M[记录失败原因/允许重试]
```
涉及页面:
- `ProductionManagement/WorkHoursCheck`
- `ProductionManagement/WorkhoursEdit`
- `ProductionManagement/Workhours`
- `ProductionManagement/Timesheet`
风险点:
- 程序工时、设备工时、人工工时不是同一口径。
- 上 SAP 的工时要明确是否包含设计、编程、质检、装配、异常。
## 12. 异常管控流程
```mermaid
flowchart TD
A[报工/质检/外协/装配/设计/编程页面] --> B[选择任务]
B --> C[点击报异常]
C --> D[带出任务/订单/工序/人员信息]
D --> E[填写异常类型/说明/附件]
E --> F[选择审批人 多选]
F --> G[保存异常]
G --> H[AbnormalControl 异常管控]
H --> I[审批人待办可见]
I --> J{任一审批人处理?}
J -- 否 --> K[异常未关闭]
J -- 是 --> L[记录实际处理人]
L --> M[异常进入下一状态/关闭]
K --> N[影响任务可操作性/及时开工/看板]
M --> O[任务恢复或结束]
```
关键规则:
- 多审批人不是会签,是多人可见、一人处理。
- 异常需要带业务域、任务、工序、责任部门,否则看板异常数会混淆。
## 13. 生产订单关闭与 SAP 状态同步流程
```mermaid
flowchart TD
A[生产订单关闭 PlannOrderClose] --> B[查询可关闭订单]
B --> C[选择单个或批量订单]
C --> D[二次确认]
D --> E[逐单 PATCH /ProductionOrders]
E --> F{单据关闭成功?}
F -- 是 --> G[记录成功/更新 MES 状态]
F -- 否 --> H[记录失败原因]
H --> I[失败项重试]
G --> J[刷新关闭页]
H --> J
J --> K[影响排产页/生产中心/手续确认/看板]
```
要求:
- 批量关闭不应“一条失败全批失败”,应逐单记录成功/失败。
- 关闭结果要被排产、生产中心、装配看板、手续确认报表识别。
## 14. 看板数据汇总流程
```mermaid
flowchart TD
A[主系统业务数据] --> B[统一视图/存储过程]
C[SAP 同步表/跨库表] --> B
D[设备采集缓存/历史] --> B
E[质检记录/报工记录] --> B
B --> P[生产任务看板]
B --> Q[装配任务看板]
B --> R[质检任务看板]
B --> S[机加设备生产运营看板]
B --> T[TableTV 工位监控]
B --> U[board_view 综合大屏]
P --> P1[齐套率/待排产/未及时开工/加急/未入库]
Q --> Q1[装配任务/发货状态/缺件/异常/缺勤]
R --> R1[未清/及时率/关键工序/当天完成]
S --> S1[设备状态/在制/关键工序/缺勤/OEE]
U --> U1[合同进度/工时/采购/库存/OEE]
```
看板治理规则:
- 看板只展示和钻取,不作为主维护入口。
- SAP 类指标必须有同步时间和同步状态。
- `GETDATE()` 型实时指标如要做日报/历史回看,应补统计日期或日快照。
- `board_view` 中 OEE、采购、库存等占位指标上线前必须接真实数据或隐藏。
## 15. 新增需求与维护入口判断流程
```mermaid
flowchart TD
A[收到新增需求/新增字段] --> B{字段性质是什么?}
B -- 主数据 --> C[找基础维护页: 人员/班次/工位/设备/工序/工艺]
B -- 订单过程数据 --> D[找业务页: 计划/排产/装配/机加/质检]
B -- SAP 同步数据 --> E[找 SAP 同步表/接口/同步时间]
B -- 设备采集数据 --> F[找采集原始表/设备状态历史/任务绑定]
B -- 人工确认 --> G[待办页维护并记录确认人时间]
B -- 计算指标 --> H[统一视图/过程/快照]
C --> I{现有页面能承载?}
D --> I
E --> I
F --> I
G --> I
H --> I
I -- 是 --> J[扩展现有页面/过程]
I -- 否 --> K[新增维护页或业务页]
J --> L[同步菜单/权限/日志/历史策略]
K --> L
L --> M[检查影响看板/报表/SAP/历史数据]
M --> N[开发排期]
```
典型判断:
- 缺勤人员:先确认排班/应到和实到来源;没有维护入口则新增或扩展排班/出勤维护。
- 关键工序:在标准工艺和生产工艺维护,任务下发快照,看板只读取。
- 让步接收:质检中心维护,记录页只查询。
- OEE设备采集、报工、质检、工艺标准工时共同计算不是人工维护字段。
## 16. 端到端生产业务主流程
```mermaid
flowchart TD
A[SAP/MES 生产订单] --> B[工艺准备]
B --> B1[标准工艺]
B1 --> B2[生产工艺]
B2 --> B3[任务工艺快照]
A --> C[计划排产]
C --> C1[机加排产]
C --> C2[装配排产]
C1 --> D[生产执行]
C2 --> E[装配执行]
D --> F[报工/工时/设备采集]
E --> G[装配报工/发料/齐套/送检]
F --> H[质检]
G --> H
H --> I{质量结果}
I -- 合格 --> J[入库/转序/交付]
I -- 不合格 --> K[返工/报废/让步接收/复检]
K --> D
J --> L[工时校验/SAP 投料/订单状态]
L --> M[订单关闭]
M --> N[报表/看板/日报]
D --> O[异常管控]
E --> O
H --> O
O --> N
N --> P[管理层 KPI/现场大屏/追溯查询]
```
这个主流程是后续所有新增需求的评估底图任何新增字段都要判断它落在工艺准备、计划排产、生产执行、质检、入库交付、SAP 回写、看板报表中的哪一环。

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,524 @@
# 新增需求界面原型设计
生成日期2026-05-25
依据文档:`新增需求分析与开发记录_2026-05-23.md`
说明:本文只描述界面原型、字段、按钮、弹窗和交互,不涉及代码修改。
## 一、界面设计总原则
1. 报表页只负责查询、展示、导出、钻取;不把基础字段维护塞进报表页。
2. 待办页可以承担确认动作,例如手续确认、异常处理。
3. 工艺、关键工序、标准工时仍在标准工艺/生产工艺页面维护。
4. 缺勤、班次、人员、工位类数据需要来源于班次/排班/人员工位绑定,不在大屏直接维护。
5. 所有新增页面保留系统现有风格:顶部查询区、右侧操作按钮、下方表格、必要时弹窗明细。
## 二、新增页面总览
| 页面名称 | 页面类型 | 菜单建议 | 是否新增页面 | 是否维护数据 |
|---|---|---|---|---|
| 设计任务报工 | 业务操作页 | 生产管理/报工管理 | 是 | 是 |
| 机加班次产量表 | 报表页 | 报表中心/生产报表 | 是 | 否 |
| 手续确认报表 | 待办确认页 | 报表中心/装配报表 | 是 | 是,确认状态 |
| 及时检验报表 | 催办报表页 | 报表中心/质检报表 | 是 | 否 |
| 及时齐套跟踪结果报表 | 查询 + 部分维护页 | 报表中心/齐套报表 | 是 | 可维护预计可执行时间 |
| 生产日报-送检 | 日报页 | 报表中心/生产日报 | 是或扩展 | 否 |
| 编程任务清单/编程报工 | 业务操作页 | 生产管理/报工管理 | 是 | 是 |
| 让步接收记录 | 查询追溯页 | 质量管理/质量报表 | 是 | 否 |
| 装配已排产需求 | 交付进度页 | 生产管理/装配管理 | 是 | 部分字段可维护 |
| 质检任务早知道 | 预告报表页 | 质量管理/质量报表 | 是 | 否 |
| 及时送检报表 | 催办报表页 | 报表中心/质检报表 | 是或扩展 | 否 |
| 发货通知列表 | SAP 查询页 | 销售/交付报表 | 是 | 否 |
| 工时异常报表 | 异常分析页 | 报表中心/工时报表 | 是或扩展 | 可增加异常确认 |
## 三、页面原型
### 1. 设计任务报工
定位MES 自建设计任务和设计工时,不关联生产订单,不上传 SAP。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 设计任务报工 │
├────────────────────────────────────────────────────────────────────┤
│ 查询区 │
│ 任务名称 [________] 设计人员 [____] 状态 [全部▼] 日期 [____至____] │
│ [查询] [重置] [新增设计任务] │
├────────────────────────────────────────────────────────────────────┤
│ 任务列表 │
│ □ 任务编号 | 任务名称 | 设计人员 | 状态 | 开始时间 | 结束时间 | 工时 │
│ | 工作内容 | 结束说明 | 创建人 | 创建时间 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[开始报工] [结束报工] [工时记录] [编辑] [删除] │
└────────────────────────────────────────────────────────────────────┘
```
弹窗:
| 弹窗 | 字段/按钮 |
|---|---|
| 新增设计任务 | 任务名称、设计人员、计划开始、计划完成、任务说明、保存、取消 |
| 开始报工 | 任务信息只读、开始时间默认当前、工作内容、确认开始 |
| 结束报工 | 任务信息只读、结束时间默认当前、结束说明、确认结束 |
| 工时记录 | 开始时间、结束时间、工时、工作内容、操作人 |
状态:
- 未开始
- 进行中
- 已完成
- 已取消
### 2. 机加班次产量表
定位:报表页,查看每天每台设备每班次干了什么活。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 机加班次产量表 │
├────────────────────────────────────────────────────────────────────┤
│ 日期 [____至____] 班次 [全部▼] 设备 [全部▼] 操作人 [____] │
│ [查询] [重置] [导出] │
├────────────────────────────────────────────────────────────────────┤
│ 汇总卡:设备数 班次数 总数量 总工时 │
├────────────────────────────────────────────────────────────────────┤
│ 分组表 │
│ ▶ 设备CNC-01 合计数量 合计工时 │
│ ▶ 日期2026-05-25 班次:白班 小计数量 小计工时 │
│ 生产订单 | 物料编码 | 物料名称 | 工序 | 开始 | 结束 | 工时 | 数量 | 操作人 │
└────────────────────────────────────────────────────────────────────┘
```
字段:
- 设备名称
- 日期
- 班次
- 生产订单
- 物料编码
- 物料名称
- 工序名称
- 开始时间
- 结束时间
- 工时
- 数量
- 操作人
说明:
- 班次规则来自班次管理。
- 该页面不维护班次,只读取班次和报工记录。
### 3. 手续确认报表
定位:装配、电气发料齐套后的待办确认页。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 手续确认报表 │
├────────────────────────────────────────────────────────────────────┤
│ 生产订单 [____] 合同号 [____] 物料 [____] 指派对象 [全部▼] │
│ 发料齐套日期 [____至____] 手续确认 [未完成▼] │
│ [查询] [重置] [导出] [批量确认完成] │
├────────────────────────────────────────────────────────────────────┤
│ □ 生产订单 | 合同号 | 物料编码 | 物料名称 | 指派对象 | 发料齐套时间 │
│ 装配完成时间 | 当前状态 | 手续确认 | 确认人 | 确认时间 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[确认完成] [查看装配明细] [查看异常] │
└────────────────────────────────────────────────────────────────────┘
```
消失条件:
- 手续确认 = 已完成
- 生产订单取消
- 生产订单关闭
- 整单已入库
确认弹窗:
- 生产订单
- 物料名称
- 当前发料齐套时间
- 确认备注
- 确认完成
- 取消
### 4. 及时检验报表
定位:生产报工完成超过 2 天仍未检验的催办报表。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 及时检验报表 │
├────────────────────────────────────────────────────────────────────┤
│ 生产订单 [____] 物料 [____] 工序 [全部▼] 指派对象 [全部▼] │
│ 报工结束日期 [____至____] 超期天数 [>= 2] │
│ [查询] [重置] [导出] │
├────────────────────────────────────────────────────────────────────┤
│ 生产订单 | 物料编码 | 物料名称 | 工序 | 指派对象 | 报工数量 │
│ 已检数量 | 未检数量 | 报工结束时间 | 超期天数 | 责任人 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[查看报工] [查看质检记录] [生成催办] │
└────────────────────────────────────────────────────────────────────┘
```
字段:
- 生产订单
- 物料编码
- 物料名称
- 工序名称
- 指派对象
- 报工数量
- 已检数量
- 未检数量
- 报工结束时间
- 超期天数
### 5. 及时齐套跟踪结果报表
定位:主订单齐套跟踪,支持展开查看 SAP 缺件明细。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 及时齐套跟踪结果报表 │
├────────────────────────────────────────────────────────────────────┤
│ 主生产订单 [____] 合同号 [____] 物料 [____] 齐套状态 [全部▼] │
│ 预计可执行时间 [____至____] SAP同步时间 [____至____] │
│ [查询] [重置] [导出] │
├────────────────────────────────────────────────────────────────────┤
│ ▶ 主生产订单 | 合同号 | 物料编码 | 物料名称 | 计划数量 | 齐套状态 │
│ 缺件数 | 当前进度 | 预计可执行时间 | SAP同步时间 | 操作 │
│ ------------------------------------------------------------------ │
│ 展开明细: │
│ 缺料物料 | 名称 | 缺件数量 | 属性 | 对应单据号 | 当前进度 │
│ 全序展示 | 单条预计完成时间 | 预计可执行时间 | 操作 │
└────────────────────────────────────────────────────────────────────┘
```
可维护字段:
- 预计可执行时间
- 预计可执行说明
- 主订单与缺料子订单人工绑定关系
弹窗:
- 编辑预计可执行时间
- 查看 SAP 缺件明细
- 主子订单关系维护
### 6. 生产日报-送检
定位:机加/装配送检日报,建议一个页面两个页签。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 生产日报-送检 │
├────────────────────────────────────────────────────────────────────┤
│ 页签:[机加送检日报] [装配送检日报] │
├────────────────────────────────────────────────────────────────────┤
│ 日期 [____] 部门 [全部▼] 生产订单 [____] 物料 [____] │
│ [查询] [重置] [导出日报] │
├────────────────────────────────────────────────────────────────────┤
│ 日汇总:送检数量 已检数量 合格数量 不合格数量 未检数量 │
├────────────────────────────────────────────────────────────────────┤
│ 日期 | 部门 | 生产订单 | 物料编码 | 物料名称 | 工序 | 送检数量 │
│ 已检数量 | 合格数量 | 不合格数量 | 送检时间 | 检验时间 | 状态 │
└────────────────────────────────────────────────────────────────────┘
```
说明:
- 部门归属规则需确认。
- 该页面不维护送检和检验结果。
### 7. 编程任务清单 / 编程报工
定位:编程任务和编程工时管理。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 编程任务清单 │
├────────────────────────────────────────────────────────────────────┤
│ 设备 [全部▼] 工位 [全部▼] 程序员 [____] 状态 [全部▼] │
│ 生产订单 [____] 日期 [____至____] │
│ [查询] [重置] [新增编程任务] [导出] │
├────────────────────────────────────────────────────────────────────┤
│ 任务编号 | 生产订单 | 物料编码 | 物料名称 | 工序 | 设备/工位 │
│ 程序号 | 编程人员 | 状态 | 开始时间 | 结束时间 | 工时 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[开始编程] [结束编程] [编辑程序号] [工时记录] [报异常] │
└────────────────────────────────────────────────────────────────────┘
```
弹窗:
- 新增编程任务
- 开始编程
- 结束编程
- 工时记录
- 程序号维护
状态:
- 未开始
- 编程中
- 已完成
- 已取消
- 异常中
### 8. 让步接收记录
定位:查询质检记录中让步接收字段不为空的数据。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 让步接收记录 │
├────────────────────────────────────────────────────────────────────┤
│ 生产订单 [____] 物料 [____] 检验人 [____] 检验日期 [____至____] │
│ 让步接收类型 [全部▼] │
│ [查询] [重置] [导出] │
├────────────────────────────────────────────────────────────────────┤
│ 生产订单 | 物料编码 | 物料名称 | 工序 | 检验数量 | 不合格数量 │
│ 让步接收 | 检验人 | 检验时间 | 处置说明 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[查看质检记录] [查看不合格处置] │
└────────────────────────────────────────────────────────────────────┘
```
说明:
- 页面只查询,不维护让步接收。
- 让步接收仍在质检中心或不合格处置维护。
### 9. 装配已排产需求
定位:装配交付进度中心,整合 SAP 字段、MES 报工、工时、异常、齐套和日计划。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 装配已排产需求 │
├────────────────────────────────────────────────────────────────────┤
│ 系统分类 [全部▼] 合同号 [____] 生产订单 [____] 物料 [____] │
│ 发料齐套时间 [____至____] 装配完成时间 [____至____] 状态 [全部▼] │
│ [查询] [重置] [导出] [批量维护] │
├────────────────────────────────────────────────────────────────────┤
│ 生产订单 | 合同号 | 物料编码 | 物料名称 | 系统/非系统 | 派工时间 │
│ 合同交货期 | 发料齐套时间 | 装配完成时间 | 当前人员 | 当前内容 │
│ 累计工时 | 异常数 | 钣金预达 | 钣金到达 | 泵预达 | 泵到达 | 备注 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[查看工时] [查看异常] [查看缺件] [维护字段] [生成日计划] │
└────────────────────────────────────────────────────────────────────┘
```
字段分组:
- SAP 字段:派工时间、合同交货期
- MES 计算字段:装配完成时间、累计工时、异常数
- 手工维护字段:钣金预达、钣金到达、泵预达、泵到达、备注、当前对应内容
弹窗:
- 工时明细
- 异常明细
- 缺件明细
- 手工字段维护
- 日计划预览
### 10. 质检任务早知道
定位:根据装配已排产需求预测即将进入质检的任务。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 质检任务早知道 │
├────────────────────────────────────────────────────────────────────┤
│ 装配完成时间 [____至____] 合同号 [____] 生产订单 [____] │
│ 物料 [____] 状态 [待质检▼] │
│ [查询] [重置] [导出] │
├────────────────────────────────────────────────────────────────────┤
│ 预计质检日期 | 生产订单 | 合同号 | 物料编码 | 物料名称 | 装配完成时间 │
│ 当前人员 | 当前内容 | 累计工时 | 异常状态 | 质检状态 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[查看装配进度] [查看异常] [查看质检记录] │
└────────────────────────────────────────────────────────────────────┘
```
说明:
- 强依赖装配已排产需求。
- 不直接维护质检结果。
### 11. 及时送检报表
定位:发料齐套后超过规则时间未送检的任务催办。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 及时送检报表 │
├────────────────────────────────────────────────────────────────────┤
│ 生产订单 [____] 合同号 [____] 物料 [____] 指派对象 [全部▼] │
│ 发料齐套时间 [____至____] 送检状态 [未送检▼] 超期天数 [>= 2] │
│ [查询] [重置] [导出] │
├────────────────────────────────────────────────────────────────────┤
│ 生产订单 | 合同号 | 物料编码 | 物料名称 | 指派对象 | 发料齐套时间 │
│ 是否送检 | 送检时间 | 超期天数 | 加急 | 当前状态 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[查看装配任务] [查看质检任务] [生成催办] │
└────────────────────────────────────────────────────────────────────┘
```
### 12. 发货通知列表
定位SAP 已提供数据,大屏已展示,新增普通报表查询页。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 发货通知列表 │
├────────────────────────────────────────────────────────────────────┤
│ 发货通知号 [____] 合同号 [____] 客户 [____] 状态 [全部▼] │
│ 要求发货日期 [____至____] SAP同步时间 [____至____] │
│ [查询] [重置] [导出] │
├────────────────────────────────────────────────────────────────────┤
│ 发货通知号 | 合同号 | 客户 | 物料编码 | 物料名称 | 数量 │
│ 要求发货日期 | 发货状态 | SAP同步时间 | 备注 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[查看明细] [查看关联生产订单] │
└────────────────────────────────────────────────────────────────────┘
```
说明:
- 默认只读 SAP 或 SAP 同步表。
- 如需 MES 备注,建议单独建本地备注扩展字段。
### 13. 工时异常报表
定位:单件实际工时大于标准单件工时的异常分析。
```text
┌────────────────────────────────────────────────────────────────────┐
│ 工时异常报表 │
├────────────────────────────────────────────────────────────────────┤
│ 日期 [____至____] 设备 [全部▼] 工位 [全部▼] 操作人 [____] │
│ 物料 [____] 工序 [全部▼] 超出比例 [>=____%] 状态 [全部▼] │
│ [查询] [重置] [导出] │
├────────────────────────────────────────────────────────────────────┤
│ 设备/工位 | 生产订单 | 物料编码 | 物料名称 | 工序 | 操作人 │
│ 标准单件工时 | 实际单件工时 | 超出时长 | 超出比例 | 班次 | 状态 | 操作 │
│ ------------------------------------------------------------------ │
│ 操作:[查看工时明细] [确认异常] [填写原因] │
└────────────────────────────────────────────────────────────────────┘
```
异常确认弹窗:
- 异常原因
- 责任部门
- 处理说明
- 确认人
- 确认时间
## 四、现有页面改造界面说明
### 1. 机加件已排产页面
改造点:
- `计划开始时间` 改为单日期选择。
- `计划完成时间` 改为单日期选择。
- 表格增加 `总工时` 列。
- 点击总工时打开历史工时明细弹窗。
```text
查询区:计划开始日期 [____] 计划完成日期 [____]
表格列:... | 总工时 | 操作
总工时点击弹窗:设备 -> 日期 -> 任务明细
```
### 2. 生产计划跟踪
改造点:
- 当前序展示完整工艺路线。
- 工序按状态变色。
- 增加标准工时、订单状态。
```text
工艺路线:打磨(张三) -> 淬火(外协) -> 精磨(李四)
状态颜色:进行中高亮、已完成置灰、待加工普通色、异常红色
```
### 3. 序检收检/外协任务检验
改造点:
- 增加指派对象。
- 增加供应商。
- 增加 SAP 采购收货单号。
建议在检验记录表格和检验详情弹窗中同时展示。
### 4. 生产订单关闭
改造点:
- 表格增加多选。
- 增加 `批量关闭 SAP 订单` 按钮。
- 增加批量关闭结果弹窗。
结果弹窗字段:
- 生产订单
- SAP 单据号
- 执行结果
- 失败原因
- 是否可重试
### 5. 生产工艺
改造点:
- 点击编辑时,若无生产工艺,弹窗提示“未找到生产工艺,是否带出标准工艺作为草稿?”
- 带出后不自动保存。
- 保存后才写入生产工艺。
### 6. 异常管控 + 全部报工页面
改造点:
- 所有报工页面增加 `报异常` 按钮。
- 选中任务后打开统一异常弹窗。
- 异常弹窗支持多选审批人。
异常弹窗字段:
- 异常类型
- 异常说明
- 附件
- 审批人,多选
- 关联订单/任务/工序,只读
### 7. 及时开工报表
改造点:
- 指派对象查询增加模式选择。
```text
指派对象 [多选] 查询模式 [包含▼ / 排除▼]
```
### 8. 工时报表
改造点:
- 增加指派对象字段。
- 后续支持工时类型和来源模块。
### 9. 领料/退库/外协报表小字段
| 页面 | 界面改造 |
|---|---|
| 生产领料(机加) | 增加备注输入/备注列 |
| 生产退库(机加) | 增加备注输入/备注列 |
| 生产退库(装配) | 增加备注输入/备注列 |
| 外协任务报表(采购) | 增加采购到货期说明列 |
| 工序流转卡 | 打印模板增加原料编码 |
| 制定标准工艺 | 保存成功/失败提示明确化 |
## 五、优先原型顺序
| 优先级 | 页面 |
|---|---|
| P0 | 手续确认报表、及时检验报表、发货通知列表、生产订单关闭批量 SAP |
| P0 | 生产工艺自动带出标准工艺、异常管控直接报异常 |
| P1 | 装配已排产需求、及时齐套跟踪结果报表、质检任务早知道 |
| P1 | 设计任务报工、编程任务清单/编程报工 |
| P1 | 机加班次产量表、生产日报-送检、及时送检报表 |
| P2 | 工时异常报表、OEE/设备采集相关界面、现场大屏缺勤/关键工序 |
## 六、客户确认清单
1. 新增页面菜单位置是否按本文建议放置。
2. 手续确认、预计可执行时间、装配已排产需求中的手工字段是否允许页面维护。
3. 设计任务、编程任务是否需要审批或只做报工。
4. 缺勤人员是否已有排班/考勤来源。
5. 关键工序是否确认在标准工艺和生产工艺维护。
6. 及时检验、及时送检的超期天数是否统一为 2 天。
7. 发货通知列表是否只读 SAP 数据,是否需要 MES 备注。
8. 工时异常是否需要确认闭环,还是只做查询。

View File

@@ -0,0 +1,860 @@
# MES_Manage_View_V20 新增需求后的整体影响与隐性需求综合分析
生成日期2026-05-25
分析依据:
- `新增需求分析与开发记录_2026-05-23.md`
- `今日工作汇报_2026-05-23.txt`
- `需求分析_自制件与工位汇总表.md`
- `MES_Manage_View_V20_src_views_逐页面详细分析.md`
## 一、分析视角调整
本文不单纯从“客户后续可能要什么”出发,而是从系统整体出发,分析这些新增需求如果逐步落地,会对现有 MES 产生什么连锁影响:
1. 会新增哪些业务数据。
2. 会改变哪些原有统计口径。
3. 会冲击哪些已完成页面、报表、看板。
4. 会让哪些现有字段含义变得不够用。
5. 会产生哪些必须补做的隐性能力。
6. 客户基于新数据和新功能,后续还可能继续提出什么。
核心判断:
这些需求不是孤立新增页面。它们会把系统从“生产任务执行系统”推向“生产进度、质量、工时、齐套、异常、SAP 状态一体化追踪系统”。一旦新增字段、报表、SAP 回写、设计/编程报工、装配已排产需求进入系统,很多已完成页面也要重新解释和调整。
## 二、总体连锁影响
| 新增能力 | 直接新增数据 | 产生的问题 | 隐性需求 | 已完成页面/报表是否需要改 |
|---|---|---|---|---|
| 设计任务报工 | 设计任务、设计工时、工作内容、开始/结束时间 | 原有工时只覆盖生产/质检/装配,合同总工时会漏设计 | 工时分类、合同工时汇总、设计任务权限、设计工时报表 | 装配已排产需求、工时报表、合同进度、日报需要纳入设计工时 |
| 编程任务清单/编程报工 | 编程任务、编程工时、设备/工位、人员、说明 | 编程是否影响生产任务可开工不明确 | 编程完成状态、编程工时独立统计、任务前置条件 | 机加中心、生产计划跟踪、工时报表、及时开工可能需要增加编程状态 |
| 装配已排产需求 | 发料齐套时间、装配完成时间、SAP 派工时间、合同交货期、钣金/泵、当前人员、累计工时、异常 | 原装配排产页只管排产,新页面会变成交付进度中心 | 装配进度模型、日计划、合同进度、异常汇总、手工字段维护历史 | `InstallMakePlan``AssemblyCenter`、生产任务看板、质检任务早知道、日报都要联动 |
| 历史工时查询 | 任务总工时、设备/日期分组明细 | 原列表只显示任务状态,新总工时会引出明细追溯 | 汇总到明细钻取、工时来源标识、重复报工处理 | `SelfMakePlandone`、工时查询、班次产量表、合同工时汇总要统一口径 |
| 机加班次产量表 | 班次、设备、日期、任务、数量、工时 | 原工时和产量按任务查,现在要按班次归属 | 班次日历、跨天班次规则、设备日合计、人员归属 | 设备看板、工位汇总表、工时报表、生产日报需要统一班次口径 |
| 外协检验字段增强 | 指派对象、供应商、SAP 采购收货单号 | 原质检记录只到工序,供应商/单据链不完整 | 供应商合格率、SAP 单据追溯、外协质检报表 | 外协报表、质检记录、供应商统计、序检收检页面需要补字段 |
| 手续确认报表 | 手续确认状态、确认人、确认时间 | 原任务消失规则依赖已入库/关闭,现在又增加人工确认维度 | 待办清单、确认日志、取消/关闭/入库同步规则 | 装配中心、发料齐套列表、生产任务看板、订单关闭后状态需要同步 |
| 及时检验报表 | 报工完成时间、未检数量、超期天数 | 原质检任务是业务操作,新报表要求按时间催办 | 质检责任人、催办、超期规则、已检数量核算 | 质检中心、生产日报、异常提醒、看板需要展示未检/超期 |
| 及时齐套跟踪结果报表 | 主订单与缺料子订单关系、SAP 缺件明细、预计可执行时间 | SAP 实时数据和 MES 落库数据会不一致 | SAP 缓存、展开加载、主子订单关系维护 | 生产任务看板、装配已排产、及时开工、发料齐套报表需要统一缺件状态 |
| 生产日报-送检 | 送检、已检、合格、不合格、部门 | 原质检记录按任务查,现在要按部门/日报统计 | 部门归属规则、日报快照、合计口径 | 质检报表、工位汇总、日报、看板需要改统计维度 |
| 生产订单批量关闭 SAP | SAP 关闭结果、失败原因、操作日志 | MES/SAP 状态可能部分成功、重复关闭 | 批量结果表、重试机制、二次确认、权限 | 订单关闭页、排产页、生产中心、手续确认报表都要识别 SAP 关闭 |
| 异常管控入口统一 | 异常关联任务、审批人多选、附件、处理状态 | 原异常页面独立,新增入口后所有报工页都要联动 | 异常状态流转、待办、任务暂停规则、异常统计 | 机加/装配/质检/外协/设计/编程报工页面都要加入口和状态 |
| 生产工艺自动带出标准工艺 | 标准工艺草稿、生产工艺映射 | 原工艺一旦生成就被任务使用,修改会影响历史 | 工艺版本、任务快照、字段映射 | 生产计划跟踪、排产、流转卡、工时报表都要按任务快照而非最新工艺 |
| 发货通知列表 | SAP 发货通知数据、状态、单据号 | 原大屏展示变为报表查询后要支持筛选和追溯 | SAP 数据同步/实时查询、导出、状态解释 | 大屏、销售/生产交付类报表可能要统一发货状态 |
## 三、最主要的问题不是新增页面,而是口径被改变
### 1. 工时口径会被重构
新增需求之前,系统主要工时来源集中在生产执行和质检相关记录,典型对象包括:
- `YL_加工中心_操作记录表`
- `生产管理_工时校验_校验工时表`
- 装配报工记录
- 质检记录或质检报工
新增需求之后,工时会被拆成更多类别:
- 机加工时
- 装配工时
- 质检工时
- 设计工时
- 编程工时
- 设备运行工时
- 程序工时
- 人员工时
- 合同工时
- 预计总工时
- 剩余工时
会产生的问题:
1. 原来“总工时”字段含义不够用了。
- `SelfMakePlandone` 要加总工时。
- 装配已排产需求要显示生产订单累计工时、合同工时汇总。
- 班次产量表要按设备、日期、班次汇总工时。
- 工时报表要加指派对象。
- 如果都叫“总工时”,但来源不一致,页面数字会对不上。
2. 合同进度会和生产任务工时产生冲突。
- 装配已排产需求提出“合同进度 = 累计工时 / 预计总工时”。
- 但累计工时是否包含设计、质检、编程、装配、返工、异常工时,需要明确。
- 如果不明确,合同进度会成为争议字段。
3. 已完成报表需要增加工时分类。
- 原工时报表只要显示工时即可。
- 新增设计/编程后,必须能区分工时类型。
- 否则设计工时可能被误算进生产工时,或者合同总工时漏算。
需要跟着调整的已完成页面/报表:
| 页面/报表 | 需要调整原因 | 建议调整 |
|---|---|---|
| `ProductionManagement/Timesheet` | 作业者工时新增指派对象,后续还会受到设计/编程工时影响 | 增加工时类型、来源模块、指派对象 |
| `ProductionManagement/WorkHoursCheck` | SAP 工时/投料校验与 MES 工时会产生差异 | 显示本次提交、历史提交、SAP 返回结果 |
| `PlanManagement/SelfMakePlandone` | 新增总工时和明细弹窗 | 总工时必须注明来源,仅统计生产报工还是包含质检/异常 |
| `ProductionManagement/AssemblyCenter` | 装配工时要进入装配已排产需求和合同进度 | 输出可复用的装配工时汇总字段 |
| 工位汇总表 | 新增班次、设备、人员、程序工时后口径变化 | 增加班次维度,区分设备工时/人工工时 |
| 自制件汇总表 | 合同工时和订单工时可能要求纳入新工时类型 | 增加工时类型过滤和明细钻取 |
产生的隐性需求:
- 统一工时事实视图或工时汇总表。
- 工时来源字段:生产、装配、质检、设计、编程、设备采集。
- 工时单位统一:秒、分钟、小时。
- 工时快照:报表发布后是否允许历史数据随新规则变化。
- 工时差异解释人工工时、设备工时、SAP 工时不一致时显示差异原因。
客户可能继续要:
- 合同维度工时明细。
- 人员维度工时排名。
- 设备维度利用率。
- 设计/装配/质检工时占比。
- 超预算工时预警。
### 2. 状态口径会被重新拉通
现有系统中已经出现很多状态:
- 排产状态
- 派工状态
- 任务状态
- 加工状态
- 收料状态
- 发料状态
- 质检状态
- 入库状态
- 加急状态
- 外协通知
- SAP 订单状态
- 手续确认状态
- 异常状态
- 编程完成状态
- 设计任务状态
会产生的问题:
1. 一个任务在不同页面可能显示成不同状态。
- 排产页面看 `排产状态``派工状态`
- 生产中心看 `任务状态``加工状态`
- 质检页面看检验记录。
- 手续确认报表看手续确认、入库、关闭。
- SAP 订单关闭后MES 任务可能仍显示未完成。
2. 新增状态会影响原来的“消失条件”。
- 手续确认报表中,已完成、取消、关闭、整单已入库都要消失。
- 质检任务早知道也要排除已入库、关闭、取消任务。
- 及时检验报表要排除已检足数量的任务。
- 如果状态判断不统一,会出现同一任务在 A 页面消失,在 B 页面仍提醒。
3. 异常状态会打断原流程。
- 报异常后是否允许继续报工?
- 异常未关闭时是否允许质检?
- 异常是否影响及时开工/及时检验/齐套报表?
- 这些都不是当前页面能单独决定的。
需要跟着调整的已完成页面/报表:
| 页面/报表 | 受影响点 | 建议调整 |
|---|---|---|
| `AnomalousManagement/PunctualWork` | 及时开工按任务状态筛选,新增异常/编程/齐套后可能影响可执行判断 | 增加异常、编程、齐套条件说明 |
| `PlanManagement/InstallMakePlan` | 排产完成后还要看 SAP 订单状态、发料齐套、装配完成时间 | 查询结果补 SAP/齐套相关状态 |
| `PlanManagement/PlannOrderClose` | 批量关闭 SAP 后MES 页面必须识别关闭结果 | 增加 SAP 关闭状态、失败原因、重试入口 |
| `ProductionManagement/MachiningCenter` | 异常入口、编程完成、设备占用都会影响可开工 | 增加任务不可操作原因 |
| `ProductionManagement/AssemblyCenter` | 装配完成时间、手续确认、异常都会影响任务显示 | 增加装配进度状态 |
| `QualityManagement/QualityCenter` | 已入库/关闭/异常/让步接收会影响质检操作 | 增加质检可操作性判断 |
| 生产任务看板 | 新增齐套、及时检验、手续确认、异常后看板指标会变化 | 重算指标口径 |
产生的隐性需求:
- 生产任务状态总表。
- 页面状态与数据库状态映射表。
- 状态优先级规则:关闭 > 入库 > 异常 > 未检 > 未开工 等。
- “不可操作原因”统一返回,而不是前端各页面自己判断。
- 批量状态校验接口。
客户可能继续要:
- 任务状态流转图。
- 状态变更历史。
- 状态异常看板。
- 一键修复状态不一致。
- 已关闭/已入库任务仍可查询但不可操作。
### 3. SAP 与 MES 数据一致性问题会放大
今天逐页面分析中SAP 相关调用已经覆盖多个核心流程:
- 排产确认:`PATCH /ProductionOrders(...)`
- 订单关闭:`PATCH /ProductionOrders(...)`
- 工时校验/发料:`GET /ProductionOrders``POST /InventoryGenExits``PATCH ProductionOrders(...)`
- 外协采购申请:`POST /PurchaseRequests`
- 外协采购收货:`POST /PurchaseDeliveryNotes`
- 工位资源:`POST /Resources``PATCH /Resources(...)`
- 工序:`POST /RouteStages``PATCH /RouteStages(...)`
新增需求后SAP 相关数据还会增加:
- SAP 派工时间
- 合同交货期
- 发料齐套时间
- 缺件明细
- 发货通知
- 采购收货单号
- SAP 订单取消/关闭状态
会产生的问题:
1. 实时查 SAP 和 MES 落库字段会不一致。
- 及时齐套缺件明细要求 SAP 实时查询。
- 装配已排产需求要求 SAP 派工时间、合同交货期。
- 发货通知列表来源 SAP。
- 如果某些页面读 SAP 实时,某些页面读 MES 同步表,数字和状态可能不同。
2. SAP 写操作失败会产生半成功数据。
- MES 排产已完成,但 SAP 生产订单未更新。
- MES 工时校验已保存,但 `InventoryGenExits` 失败。
- 批量关闭 SAP 订单时,部分成功部分失败。
- 外协采购请求成功,但 MES 未记录单号。
3. 新增报表会追问 SAP 数据更新时间。
- 合同交货期什么时候同步?
- 发料齐套时间是否最新?
- 缺件明细是否实时?
- 发货通知状态是否已更新?
需要跟着调整的已完成页面/报表:
| 页面/报表 | 受影响点 | 建议调整 |
|---|---|---|
| `PlanManagement/SelfMakePlan/SelfMakePlando/SelfMakePlandone` | 排产同步 SAP 后缺少同步结果留痕 | 增加 SAP 同步状态、失败提示、重试依据 |
| `PlanManagement/InstallMakePlan/InstallMakePlanDo` | 装配新增 SAP 派工时间、合同交货期、发料齐套时间 | 查询和导出补 SAP 字段来源 |
| `ProductionManagement/WorkHoursCheck` | 已有 SAP 工序、资源、发料操作 | 增加 SAP 请求/返回日志和失败重试 |
| `QualityManagement/CheckTask/processReceive` | SAP 采购收货单号成为后续统计字段 | 保存 SAP 单号、行号、供应商 |
| `ProductionManagement/OutsourceMange` | 外协采购请求后要追踪 SAP 单据 | 记录采购请求号/采购订单关系 |
| `SystemMaintenance/WorkstationManagement` | 工位资源同步 SAP 后要防重复 | 增加 SAP 资源编码校验 |
| 发货通知大屏/新增报表 | 大屏已有数据,新增报表要求查询/导出 | 明确实时或同步数据源 |
产生的隐性需求:
- SAP 调用日志表。
- SAP 同步状态字段。
- SAP 失败重试页面。
- SAP 单据关系表MES 任务 -> SAP 生产订单/采购请求/收货单/发货通知。
- 数据更新时间展示。
- 批量操作结果明细。
客户可能继续要:
- SAP 同步失败列表。
- 手工重推 SAP。
- SAP 与 MES 差异对账。
- 每张 SAP 单据反查 MES 来源任务。
- 批量关闭/批量回写的成功失败导出。
### 4. 报表会从结果展示变成数据追溯
新增需求中报表很多:
- 机加班次产量表
- 手续确认报表
- 及时检验报表
- 及时齐套跟踪结果报表
- 生产日报-送检
- 让步接收记录
- 及时送检报表
- 发货通知列表
- 质检任务早知道
- 设计工时报表
- 自制件汇总表
- 工位汇总表
会产生的问题:
1. 报表之间会互相引用同一批数据。
- 及时检验依赖报工记录和质检记录。
- 生产日报-送检依赖送检和质检记录。
- 质检任务早知道依赖装配完成时间。
- 装配已排产需求依赖工时、异常、齐套、SAP 字段。
- 如果每个报表各写一套 SQL口径会分裂。
2. 报表新增字段会要求历史数据补齐。
- 外协检验新增供应商后,历史质检记录没有供应商。
- 发料齐套时间新增后,历史生产计划没有该字段。
- 手续确认新增后,历史任务默认是否“未确认”需要确定。
- 设计/编程工时新增后,历史合同进度是否重算需要确定。
3. 报表会反向要求修改业务页面。
- 报表要统计供应商合格率,就要求质检页面必须保存供应商。
- 报表要统计及时检验,就要求报工结束时间必须准确。
- 报表要统计手续确认,就要求业务页面维护确认状态。
- 报表要统计合同进度,就要求所有工时都有合同号。
需要跟着调整的已完成页面/报表:
| 已完成页面/报表 | 因新增需求需要调整什么 |
|---|---|
| 生产任务看板 | 增加及时齐套、及时检验、手续确认、装配完成时间等新指标或修正原指标 |
| 机加设备/生产运营看板 | 班次产量、设备工时、程序工时进入后,需要重算设备利用和产量口径 |
| 装配任务看板 | 装配完成时间、发料齐套、合同交货期、质检任务早知道会影响待办和逾期 |
| 质检任务看板 | 新增及时检验、质检任务早知道、让步接收后,待检数量口径要改 |
| 自制件汇总表 | 新增历史工时、设计/编程/质检工时后,总工时口径要扩展 |
| 工位汇总表 | 班次和设备采集数据进入后,按工位+日期的统计需要支持班次和设备维度 |
| 外协任务报表 | 增加供应商、采购到货期说明、SAP 收货单号后,导出和统计都要改 |
| 工时报表 | 指派对象、工时分类、设计/编程工时进入后,需要新增字段和筛选 |
产生的隐性需求:
- 报表数据口径说明。
- 报表明细钻取。
- 报表导出字段配置。
- 报表历史快照。
- 历史数据补录/默认值策略。
- 跨报表公共视图。
客户可能继续要:
- 每个报表点击数字看明细。
- 报表导出与页面一致。
- 报表按部门、班组、班次、人员、设备切换。
- 报表定时推送。
- 历史报表锁定,不随后续数据变化。
## 四、已完成页面/报表需要关注的改造清单
### 1. 计划排产相关页面
| 页面 | 需要关注的新增影响 | 是否需要修改 |
|---|---|---|
| `PlanManagement/SelfMakePlan` | SAP 回写状态、排产字段、计划时间口径、总工时 | 需要,至少补同步状态和字段口径 |
| `PlanManagement/SelfMakePlando` | 待排产转已排产后,装配/机加新字段是否继承 | 需要,确认新增字段默认值 |
| `PlanManagement/SelfMakePlandone` | 单日期筛选、总工时、历史明细、SAP 状态 | 已明确需要改 |
| `PlanManagement/InstallMakePlan` | 装配已排产需求会复用其数据,新增 SAP 派工时间、合同交货期、发料齐套 | 需要,至少 SQL 返回字段要扩展 |
| `PlanManagement/InstallMakePlanDo` | 同上,且涉及采购请求/SAP 回写 | 需要,补 SAP 单据和失败处理 |
| `PlanManagement/PlannOrderClose` | 批量关闭 SAP 后影响所有任务显示 | 需要,增加批量结果、失败原因、日志 |
### 2. 生产执行相关页面
| 页面 | 需要关注的新增影响 | 是否需要修改 |
|---|---|---|
| `ProductionManagement/MachiningCenter` | 编程状态、异常入口、设备工时、程序工时、及时检验起算 | 需要,新增入口和不可操作原因 |
| `ProductionManagement/AssemblyCenter` | 装配完成时间、手续确认、装配工时、异常、发料任务状态 | 需要,作为装配已排产需求的数据来源 |
| `ProductionManagement/ProductionTaskManage` | 生产任务状态增加异常/齐套/质检/关闭维度 | 需要,查询字段和状态说明要扩展 |
| `ProductionManagement/AssembleTaskManage` | 装配任务将进入日计划和质检任务早知道 | 需要,补装配完成时间和任务排除规则 |
| `ProductionManagement/WorkHoursCheck` | SAP 工时校验、发料、订单工序资源更新风险扩大 | 需要,补 SAP 日志、重试、差异说明 |
| `ProductionManagement/Timesheet` | 指派对象、设计/编程工时、工时分类 | 需要,补字段和筛选 |
### 3. 质检相关页面
| 页面 | 需要关注的新增影响 | 是否需要修改 |
|---|---|---|
| `QualityManagement/QualityCenter` | 及时检验、让步接收、外协供应商、已入库限制 | 需要,补状态和字段 |
| `QualityManagement/CheckTask/processReceive` | SAP 采购收货单号、供应商、外协指派对象 | 需要,新增保存和查询字段 |
| `QualityManagement/CheckTask/purchaseIncoming` | 采购检验备注、供应商统计、到货期说明 | 需要,至少补导出字段 |
| `QualityManagement/CheckTask/materialReturn` | 退库备注、库存任务状态 | 可能需要,跟退库备注和库存任务联动 |
| `QualityManagement/Unqualified` | 供应商合格率、让步接收、不合格统计口径 | 需要,补供应商/让步接收字段 |
| 质检任务看板 | 质检任务早知道和及时检验会改变待检数量 | 需要,重算待检/超期口径 |
### 4. 外协相关页面
| 页面 | 需要关注的新增影响 | 是否需要修改 |
|---|---|---|
| `ProductionManagement/OutsourceMange` | 外协采购请求、供应商、发料/收料/质检闭环 | 需要,补 SAP 单据关系 |
| `ProductionManagement/OutsourceSheet` | 采购到货期说明、供应商、SAP 收货单号、外协质检 | 需要,查询和导出都要补 |
| `ProductionManagement/SaleOutsourceMange` | 销售外协同样受采购请求和供应商统计影响 | 需要,保持与外协管理一致 |
### 5. 工艺和基础数据页面
| 页面 | 需要关注的新增影响 | 是否需要修改 |
|---|---|---|
| `ProcessManagement/ProcessProduct` | 自动带出标准工艺后,生产任务快照问题变明显 | 需要,避免覆盖已开工任务 |
| `CraftManagement/CraftMaintain` | 工艺版本、标准工艺字段映射 | 需要,补版本/草稿概念 |
| `ProcessManagement/ProcedureManagement` | SAP `RouteStages` 同步后要防止 MES/SAP 工序不一致 | 需要,补同步状态 |
| `SystemMaintenance/WorkstationManagement` | SAP `Resources` 新增/修改后要防重复和同步失败 | 需要,补资源同步状态 |
### 6. 已完成看板和报表
| 看板/报表 | 新增功能导致的新数据 | 需要调整 |
|---|---|---|
| 生产任务看板 | 发料齐套、及时齐套、装配完成时间、及时检验、异常 | 指标口径需要重算 |
| 装配任务看板 | 装配完成时间、合同交货期、质检预告、手续确认 | 新增逾期和待办指标 |
| 质检任务看板 | 及时检验、质检任务早知道、让步接收 | 待检、超期、预告分开 |
| 机加设备生产运营看板 | 班次产量、程序工时、设备采集 | 设备利用率和产量来源需要统一 |
| 自制件汇总表 | 总工时、设计/编程/质检分类 | 工时口径要扩展 |
| 工位汇总表 | 班次、设备、人员、程序工时 | 增加班次/设备维度或说明不支持 |
## 五、新增数据会带来的数据治理问题
### 1. 新字段放哪里
容易新增到生产计划/任务表的字段:
- 发料齐套时间
- 装配完成时间
- 手续确认
- 当前对应人员
- 当前对应内容
- 钣金预达
- 钣金到达
-
- 生产异常标记
问题:
- 这些字段有些是 SAP 来的,有些是手工维护,有些是计算结果。
- 全部塞进 `MES_接口_生产计划``MES_接口_生产计划_生产任务` 会让主表越来越混乱。
- 手工维护字段还需要修改历史,否则无法解释是谁改了装配完成时间。
建议:
- SAP 同步字段、手工维护字段、计算字段分开存。
- 手工维护字段建议用扩展表。
- 计算字段优先用视图或报表过程生成。
### 2. 历史数据怎么处理
新增字段会导致历史数据为空:
- 历史外协质检没有供应商。
- 历史质检没有 SAP 收货单号。
- 历史生产计划没有发料齐套时间。
- 历史任务没有手续确认。
- 历史任务没有设计/编程工时。
问题:
- 报表默认查全部时,历史数据会被算成未完成、未确认、未齐套。
- 用户可能认为系统数据异常。
建议:
- 每个新增字段定义历史默认规则。
- 报表上区分“无数据”和“未完成”。
- 对考核类报表增加启用日期。
### 3. 新增数据是否参与已完成报表
例如:
- 设计工时是否参与合同进度?
- 编程工时是否参与生产订单累计工时?
- 让步接收是否算合格?
- 外协供应商合格率是否包含历史无供应商数据?
- 已入库补检是否进入及时检验统计?
这些会直接影响已完成报表。
建议:
- 新增需求上线前,同步输出“影响报表清单”。
- 每个报表明确是否纳入新数据。
- 如果纳入,是否重算历史。
## 六、系统级隐性需求清单
这些不是客户一开始直接说的需求,但只要新增功能落地,基本会被迫出现。
| 隐性需求 | 触发原因 | 不做的后果 |
|---|---|---|
| 字段来源字典 | 新字段来自 MES、SAP、手工、设备采集 | 联调时无法解释字段来源,报表口径反复变 |
| 状态总字典 | 状态分散在排产、生产、质检、入库、SAP | 同一任务不同页面显示不同状态 |
| SAP 调用日志 | 多页面写 SAP且可能失败 | 无法排查 MES/SAP 不一致 |
| SAP 失败重试 | 批量关闭、工时校验、外协采购都可能部分失败 | 人工只能改库或重复操作 |
| 工时统一视图 | 新增设计、编程、设备、合同工时 | 各报表总工时对不上 |
| 报表明细钻取 | 汇总类报表越来越多 | 客户无法核对数字,只能反复查 SQL |
| 报表历史快照 | 报表用于日报/周报/考核 | 历史报表随数据变化,无法对账 |
| 手工字段维护历史 | 装配完成时间、钣金、泵、手续确认等可人工维护 | 无法追溯谁改了关键交期字段 |
| 批量操作结果表 | 批量关闭 SAP、批量排产、批量确认 | 部分成功/失败无法恢复 |
| 异常统一入口组件 | 所有报工页都要报异常 | 每页重复开发,状态不一致 |
| 任务追溯详情页 | 报表要解释数字来源 | 每个报表都要临时加明细 |
| 菜单/权限自动配置规范 | 新增页面很多 | 页面上线后权限、菜单容易漏 |
| 数据启用日期配置 | 新字段历史为空 | 历史数据被误算为异常 |
| 不可操作原因接口 | 关闭、入库、异常、未齐套都影响操作 | 前端提示不一致,用户不知道为什么不能点 |
## 七、客户可能继续提出的需求
保留从客户使用角度推导出的后续需求,但这些需求都是由前面的整体影响引出来的。
### 1. 围绕工时
- 合同总工时明细。
- 设计/编程/装配/质检/机加工时占比。
- 按人员、设备、班次统计工时。
- 工时超预算预警。
- 工时与 SAP 上传差异对比。
- 一键查看某订单所有工时来源。
### 2. 围绕状态和进度
- 生产任务全流程状态图。
- 每个状态变更历史。
- 为什么任务不可开工/不可质检/不可关闭的原因说明。
- 已关闭/已入库任务仍可查询但禁止操作。
- 任务异常状态看板。
### 3. 围绕 SAP
- SAP 同步失败清单。
- 手工重推 SAP。
- SAP 与 MES 状态对账。
- SAP 单据号反查 MES 任务。
- 批量 SAP 操作结果导出。
- SAP 数据最后同步时间展示。
### 4. 围绕质检
- 供应商合格率。
- 设备合格率。
- 让步接收审批。
- 质检超期催办。
- 已入库补检。
- 质检记录按订单、供应商、人员、工序多维分析。
### 5. 围绕报表
- 所有汇总数字可点开明细。
- 报表导出字段自定义。
- 报表按部门/班组/班次拆分。
- 报表定时推送。
- 日报/周报历史锁定。
### 6. 围绕异常
- 所有报工页面直接报异常。
- 异常审批待办。
- 异常处理超期提醒。
- 异常关闭后自动恢复任务。
- 异常原因统计。
## 八、建议的开发控制策略
### 1. 每个新增需求都必须补“四张表”
不是数据库表,而是分析表:
1. 字段影响表:新增字段来自哪里,写到哪里,哪些页面显示。
2. 状态影响表:是否改变排产/派工/任务/质检/入库/SAP 状态。
3. 报表影响表:哪些已完成报表要纳入新数据。
4. SAP 影响表:是否读 SAP、写 SAP、是否需要日志和重试。
### 2. 不建议继续只按页面单点开发
原因:
- 新增页面会越来越多,但数据源高度重叠。
- 如果每个页面单独写 SQL口径很快分裂。
- 新增字段一旦被报表引用,历史数据和导出口径都会受影响。
建议:
- 工时类先建统一视图。
- 状态类先建统一解释。
- SAP 类先建日志。
- 报表类先建公共明细查询。
### 3. 新增字段优先走扩展表
适合放扩展表的字段:
- 手工维护字段。
- SAP 同步字段。
- 报表补充字段。
- 后续可能继续变动的字段。
不建议直接塞入主任务表的字段:
- 钣金预达、钣金到达、泵、当前对应内容。
- 手续确认说明。
- SAP 同步状态明细。
- 合同级汇总字段。
### 4. 报表先定口径,再开发页面
尤其是:
- 及时检验。
- 及时送检。
- 生产日报-送检。
- 机加班次产量。
- 装配已排产需求。
- 合同工时汇总。
这些报表一旦上线,后续就是管理依据,不能边用边改口径。
## 九、结论
新增需求真正带来的影响不是“多几个页面”,而是会改变现有系统的数据结构和统计口径。
最需要提前处理的是:
1. 工时统一,否则总工时、合同进度、班次产量、日报都会互相对不上。
2. 状态统一,否则排产、生产、质检、入库、关闭、异常在不同页面显示不一致。
3. SAP 日志和重试,否则批量关闭、工时校验、外协采购、质检收货都会出现无法排查的半成功状态。
4. 报表影响清单,否则新增字段上线后已完成报表会漏算或错算。
5. 历史数据策略,否则新增字段为空会被误判为未完成、未确认、未齐套。
因此后续评估新增需求时应先问一个问题这个需求新增的数据会不会改变现有页面、报表、看板、SAP 状态和历史统计。如果会,就必须同步改受影响页面,而不是只开发新页面。
## 十、同级项目数据看板带来的额外连锁影响
这次补充分析的同级看板包括:`生产任务看板``装配任务看板``质检任务看板``机加设备生产运营看板``机加设备生产运营看板二``TableTV``board_view``新建文件夹`。这些项目不是普通查询页,而是管理层和车间现场会持续观看的大屏。它们把 MES、SAP、设备采集、质检和工时数据压缩成几个关键数字因此新增需求影响到看板时问题会比普通页面更明显不是某个按钮不可用而是管理层看到的 KPI 可能直接变错。
### 1. 新增功能会让现有看板指标失真的位置
| 看板指标 | 当前主要来源 | 新增需求/功能变化 | 可能失真结果 | 必须同步改造 |
|---|---|---|---|---|
| 生产任务看板“按期齐套率” | `生产任务综合看板_按期齐套率`,按 `View_生产订单_MES.齐套` 汇总 | 及时齐套跟踪、SAP 缺件明细、部分齐套、预计齐套时间 | 只有“齐套/未齐套”会掩盖部分齐套和预计可执行状态 | 增加齐套状态字典、缺件明细、预计齐套日期、SAP 同步时间 |
| 生产任务看板“未及时开工” | `计划开始时间、开工时间、加工状态、合格数` | 设计/编程前置、异常暂停、二次派工、手续确认 | 被设计/编程/异常卡住的任务仍被算作生产未及时开工 | 增加未开工原因维度,区分“计划原因、前置原因、异常原因、人员/设备原因” |
| 生产任务看板“加急件” | SAP `ubt_OPKL_UrgentMaterials_ALL` + MES 计划 | 加急从订单级变为物料/工序/质检级 | 加急总数与页面明细、装配缺件、质检加急互相对不上 | 建统一加急来源视图,明确订单级/工序级/物料级 |
| 装配看板“发货状态” | `View_生产订单_MES.发货状态` + SAP `UBT_ODRF_ODLNMES` | 发货通知列表、仓库出库、SAP 发货回写 | 页面显示“发货状态”但可能混合通知、待出库、已出库、已交货 | 增加发货状态分层通知、备货、出库、交货、SAP 回写 |
| 装配看板“在制缺件” | SAP 缺件表 + MES 装配计划 | 及时齐套跟踪、替代料、部分到货 | 只能看到缺件,无法知道是否已经采购、何时可恢复 | 增加缺件原因、预计到货、替代料、主子订单关系 |
| 装配看板“异常未关闭” | `流程表.完成人 is null` | 异常管控入口统一,机加/质检/外协都能发异常 | 未限定装配范围时,装配看板可能统计到其他部门异常 | 异常流程必须带业务域、任务、工序、责任部门 |
| 质检看板“未清任务” | `质量任务看板_未完成统计/明细` | 及时检验、复检、返工、让步接收、免检 | 未清数量会把复检/返工/免检混为同一类待检 | 增加质检状态流转、复检批次、处置结果、免检标识 |
| 质检看板“当天完成” | `View_质量检验_质检记录` 当天检测时间 | 生产日报-送检、部门日报、班次统计 | 当天完成按自然日统计,日报/班次按业务日统计会不一致 | 增加班次/日报快照口径 |
| 机加看板“设备运行状态” | `CaChe_Var` 当前缓存 | 机加班次产量、真实 OEE、设备运行工时 | 设备运行与任务报工可能不同步OEE 无法解释 | 统一设备状态、任务状态、报工状态的时间轴 |
| 机加看板“当天完成/合格率” | 复用质检完成汇总 | 生产完成、质检完成、入库完成都被要求展示 | “完成”可能被理解成生产完成,但实际是质检完成 | 页面标题和过程改名,或新增生产完成口径 |
| `TableTV` 当前工位任务 | `设备管理_设备状态_查询` | 班次维护、人员绑定、二次派工 | 班次阈值写死后,人员归属与班次管理不一致 | 过程改读班次表,不再硬编码 7.5/16.5 |
| `board_view` 合同/项目进度 | `看板_*`,采购/库存/OEE 多处为 0 或样例 | 发货通知、采购到货、合同工时、真实 OEE | 综合大屏展示为“项目全貌”但采购、库存、OEE 仍不真实 | 优先补真实数据源,否则不要作为经营口径 |
### 2. 已完成页面、报表、看板必须同步修改的清单
| 变更来源 | 必须同步修改的看板/报表 | 原因 |
|---|---|---|
| 设计任务报工、编程任务报工 | `board_view` 工时消耗、未完工工时;工时报表;合同进度类报表 | 当前大屏工时主要来自生产工时,新增设计/编程后合同总工时会漏算 |
| 装配已排产需求 | `生产任务看板``装配任务看板``board_view` 装配进度 | 装配计划、齐套、发货、异常、累计工时都会进入交付进度 |
| 及时检验报表 | `质检任务看板``机加设备生产运营看板`、生产日报-送检 | 质检及时率必须从静态/占位指标变成真实过程 |
| 及时齐套跟踪 | `生产任务看板` 齐套率/未齐套任务、`装配任务看板` 缺件、`board_view` 合同进度 | 缺件从单一状态变成主子订单、SAP 缺料、预计可执行时间 |
| 发货通知列表 | `装配任务看板` 发货状态、`board_view` 合同/交付区域 | 发货状态需要区分 SAP 通知、仓库出库、MES 任务完成 |
| 机加班次产量表 | `TableTV`、机加运营看板、设备工时报表 | 班次、设备、人员、产量、工时必须按同一业务日归属 |
| 异常管控入口统一 | 装配看板异常数、机加看板未及时开工、生产任务看板风险数 | 异常暂停不应被误算为未及时开工或未完成 |
| SAP 生产订单批量关闭 | 生产任务看板、装配看板、计划关闭页、手续确认报表 | SAP 部分成功/失败会造成 MES 任务仍显示在看板上 |
| 外协检验字段增强 | 质检看板、外协报表、供应商质量统计 | 质检任务要按供应商、采购收货单、指派对象追溯 |
### 3. 看板暴露出的系统级隐性需求
1. **统一指标口径层**
现在不同看板各自写存储过程:`生产任务综合看板_*``装配中心任务看板_*``质量任务看板_*``机加设备生产运营看板_*``看板_*`。这些过程大量重复读取 `View_生产订单_MES``YL_质量检验_质检记录``YL_加工中心_操作记录表`。后续应建立统一口径视图,例如:
- `View_MES_任务状态统一口径`
- `View_MES_齐套缺件统一口径`
- `View_MES_质检待办统一口径`
- `View_MES_工时统一口径`
- `View_MES_设备任务运行统一口径`
2. **统一状态字典**
当前看板内同时出现 `任务状态``加工状态``排产状态``齐套``发料状态``拣配状态``发货状态``加急状态``质检状态``设备状态`。这些状态来自不同表,且有的前端再次转换。必须补一张状态解释表或统一视图,避免同一个 `0/1/2/4` 在不同页面含义不同。
3. **SAP 同步状态与时间戳**
看板不是实时调用 B1 Service Layer而是通过 SQL 读取 SAP 跨库表或 SAP 同步落地表,例如 `ubt_OPKL_UrgentMaterials_ALL``UBT_ODRF_ODLNMES``质量检验_质检任务_SAP`。因此大屏上所有 SAP 相关指标都应该显示或记录同步时间、同步结果、失败原因。否则用户看到缺件、发货、加急时无法判断是 SAP 最新状态还是 MES 缓存状态。
4. **指标钻取能力**
`board_view` 已经有中央订单点击钻取明细,其他看板多数只有汇总和滚动表。新增需求上线后,客户很可能要求点击“未及时开工、未清质检、缺件、异常、加急、未齐套”直接看到来源明细。不能只返回总数,过程应统一支持“汇总 + 明细 + 字段来源”。
5. **历史快照**
大屏是实时结果,但日报、周报、月报需要历史定版。当前很多过程使用 `GETDATE()` 实时计算,例如当天完成、近 3 天装配合格率、当月计划执行率。新增管理报表后,必须保存日快照或允许传入统计日期,否则第二天无法复现昨天看板上的数字。
6. **占位指标清理**
`board_view` 中 OEE、环境、水电气、采购部进度、库存/在购字段存在样例或占位;生产任务看板中采购未及时到货、质检及时率、未及时入库也有静态值或未完整接入。上线前必须清理占位指标:要么接真实过程,要么隐藏,不要和真实指标混放。
### 4. 统一改造建议
| 优先级 | 改造项 | 解决的问题 |
|---|---|---|
| P0 | 给所有看板指标补“口径说明 + 来源过程 + 来源字段” | 防止管理层把不同含义的“完成、齐套、加急、在制”混用 |
| P0 | 把 `GETDATE()` 型过程改造为可传统计日期,实时看板默认当天 | 让日报/历史回看能复现 |
| P0 | 为 SAP 相关看板补同步时间和同步状态 | 判断数据新旧,排查 SAP/MES 不一致 |
| P1 | 统一质检待办过程,覆盖未清、及时率、关键工序、当天完成 | 避免 `质量任务看板_*``Visualization_QcTask_*` 两套接口并行 |
| P1 | 统一机加任务/设备状态过程,区分任务在制、设备运行、报工完成 | 防止设备状态与任务状态互相替代 |
| P1 | 统一装配发货/缺件过程,串起 SAP 发货通知、缺件、齐套、仓库出库 | 让装配看板真正反映交付风险 |
| P2 | 将 `board_view` 的占位采购、库存、OEE 接入真实数据或移除 | 避免综合大屏成为混合真实/样例数据的经营看板 |
### 5. 客户可能继续提出的看板类需求
这些不是主分析角度,但从现有看板形态看,客户后续很可能继续要求:
- 点击任意 KPI 下钻明细,例如未齐套、加急、未及时开工、未清质检、装配缺件。
- 看板按项目、合同、车间、班组、设备筛选。
- 看板显示 SAP 同步时间和异常提示。
- 看板支持历史日期回看,而不是只能看当前实时数据。
- 质检看板增加及时率趋势和超期责任人。
- 装配看板增加预计发货、预计齐套、缺件到货日期。
- 机加看板增加真实 OEE、设备利用率、程序运行时长、班次产量。
- 生产任务综合看板增加“设计/编程是否完成”作为开工前置条件。
- 大屏数据定时快照,日报/周报自动引用同一口径。
## 十一、设备数据采集与现场大屏专项影响分析
本次新增的设备档案、设备数据采集、OEE、工时异常、条码拣配和一楼/机加/装配现场大屏需求,会把系统从“任务报工驱动”进一步推向“设备实时数据 + MES 任务 + 质检结果 + 现场人员 + SAP 物料状态”的综合分析系统。它的影响不只在新增几个看板,而是会改变工时、产量、合格率、齐套、送检、缺勤、设备状态的基础口径。
### 1. 总体影响链路
```mermaid
flowchart TD
A[设备档案/主要设备/标准工时] --> B[设备数据采集]
B --> C[设备状态时长]
B --> D[程序工时/单件工时]
C --> E[设备利用率]
D --> F[性能开动率]
G[MES 报工/计划产量] --> H[产能利用率]
I[质检记录/良品不良品] --> J[产品合格率]
E --> K[OEE]
F --> K
J --> K
D --> L[工时异常报表]
M[条码拣配] --> N[齐套/发料/拣配状态]
N --> O[生产/装配看板]
P[关键工序标识] --> Q[质检/机加关键任务大屏]
R[班次/岗位/工位/考勤] --> S[缺勤人员大屏]
```
### 2. 对现有数据模型的冲击
| 新需求 | 新增或必须明确的数据 | 冲击对象 | 主要问题 |
|---|---|---|---|
| 设备档案管理 | 主要设备、参与 OEE、设备/工位关系、标准工时来源 | 设备档案、工位管理、工艺维护 | 标准工时放设备、工艺还是设备+工序能力表必须明确 |
| 设备数据采集 | 程序工时、单件工时、设备状态时长、程序号、采集时间 | `CaChe_Var`、历史设备数据、设备状态记录、工时报表 | 当前多为当前缓存或历史状态,缺少可直接算单件工时的任务绑定 |
| OEE 指标 | 计划产量、实际产量、设备工时、标准工时、标准单件工时、实际单件工时、良品数 | 机加看板、`board_view`、设备报表 | OEE 三个组成指标必须同设备、同日期、同班次,否则乘出来没有管理意义 |
| 工时异常报表 | 实际单件工时、标准单件工时、超出比例、异常原因 | 工时查询、工时校验、异常管控 | 设备采集工时与人工报工工时不一致时,谁作为异常依据需要确定 |
| 条码拣配 | 条码、物料、批次、任务、拣配人、拣配时间、状态写回 | 机加中心、装配中心、齐套看板 | 条码扫描会改变 `拣配状态/齐套/发料状态`,看板和生产任务必须同步 |
| 质检及时率 | 最后一次生产完成时间、报检时间、检验完成时间、超期天数 | 质检看板、生产日报-送检 | 以生产完成时间作为起算点,会改变现有“未清任务”定义 |
| 关键工序 | 工艺关键标识、任务快照、关键工序应检/未检/在制 | 工艺维护、生产任务、质检/机加大屏 | 关键工序如果只存在工艺库,会影响历史任务重算 |
| 缺勤人员 | 岗位、工位、人员、应到、实到、班次 | 班次管理、人员绑定、机加/装配大屏 | 不能从“没有报工”直接判断缺勤,必须有排班和考勤/上岗数据 |
| 装配及时送检 | 发料齐套时间、送检状态、送检时间、超期天数 | 装配中心、装配看板、质检任务 | 发料齐套后 2 天未送检会新增一种介于“可开工/待检”之间的风险状态 |
### 3. OEE 不是一个单独公式,而是一组口径治理
当前讨论公式为:
- 产能利用率(单台)= 实际产量 / 计划产量 * 100%
- 设备利用率(单台)= 设备工时 / 标准工时
- 设备性能开动率(单台)= 标准单件工时 / 实际单件工时
- 产品合格率(工位)= 良品数 / 总产量
- OEE = 设备利用率 * 开动率 * 合格率
这些公式看起来简单,但真正的隐性需求是统一统计边界:
1. **设备边界**:只算主要设备,还是所有设备都算。辅助设备、测试设备、维修设备是否排除。
2. **时间边界**:自然日、班次日、订单周期、计划周期不能混用。
3. **产量边界**:实际产量来自 MES 报工、设备计数还是质检数量。三者时间上可能不一致。
4. **合格率边界**:良品数来自报工良品还是质检合格数。若质检晚于生产,日合格率会滞后。
5. **标准工时边界**:标准工时可能来自工艺标准工时、设备能力标准、班次可用工时。三个字段不能都叫标准工时。
6. **实际单件工时边界**:设备采集循环时间、设备运行时间/产量、人工报工工时/产量是不同口径。
因此 OEE 不能只在大屏上增加几个公式。必须先建立设备指标明细层,至少包含设备、工位、日期、班次、任务、物料、工序、计划产量、实际产量、良品、不良、标准工时、设备运行工时、标准单件工时、实际单件工时和采集质量标识。
### 4. 对已完成页面和看板的必要改造
| 页面/看板 | 必须新增或调整 | 原因 |
|---|---|---|
| `DeviceManagement/DeviceInformation` | 主要设备、是否参与 OEE、采集点位、标准工时来源 | 设备档案是设备采集和 OEE 的基础 |
| `SystemMaintenance/WorkstationManagement` | 工位与设备、人员、岗位的一对多关系 | 缺勤人员要显示岗位、工位、姓名,多工位需合并 |
| `ProcessManagement/ProcessProduct` / 工艺维护 | 是否关键工序、标准单件工时 | 质检和机加大屏需要关键工序汇总和明细 |
| `PlanManagement/SelfMakePlan/SelfMakePlandone` | 任务设备绑定、计划产量、标准工时字段确认 | 单台设备产能利用率需要按任务落到设备 |
| `ProductionManagement/MachiningCenter` | 条码拣配入口、拣配状态写回、设备采集任务绑定 | 机加及时拣配和设备采集都要关联生产任务 |
| `ProductionManagement/AssemblyCenter` | 条码拣配入口、发料齐套时间、送检状态 | 装配及时拣配和及时送检都要从这里进入 |
| `ProductionManagement/WorkHoursCheck` | 程序工时、设备工时、人工工时差异、异常确认 | 工时异常报表会反向要求工时校验解释差异 |
| `QualityManagement/QualityCenter` | 最后生产完成时间、报检时间、超期天数、关键工序 | 质检及时率和关键工序任务必须有来源 |
| `质检任务看板` | 质检及时率真实过程、超 2 天未检明细、关键工序汇总/明细 | 当前看板未完整实现及时率真实口径 |
| `机加设备生产运营看板` | OEE、设备利用率、开动率、合格率、关键工序任务、缺勤人员 | 现有设备状态和 OEE 仍不足以支撑新指标 |
| `装配任务看板` | 缺勤人员、及时送检任务颜色/排序、发料齐套后 2 天未送检 | 新需求直接改变装配现场大屏列表逻辑 |
| `TableTV` | 设备采集状态、单件工时、异常颜色 | 现场卡片应展示设备真实状态和工时风险 |
| `board_view` | 真实 OEE 替换样例、设备/产能/质量指标统一 | 综合大屏不能继续使用固定 OEE 样例 |
### 5. 工时异常报表会反向推动工时体系重构
工时异常条件是“单件工时 > 标准工时”。这会带来三个隐性问题:
1. **异常来源不只设备**
单件工时超标可能来自设备状态异常、程序问题、刀具/工装、人员操作、物料质量、等待质检、等待发料。报表如果只列超标,不记录原因,会变成无法闭环的告警列表。
2. **需要区分程序工时和人工工时**
程序工时用于判断设备加工效率;人工工时用于人工绩效和 SAP 工时上传。两者差异本身就是一个分析点,不能用程序工时直接覆盖人工报工。
3. **需要异常确认流程**
如果报表用于管理考核,就必须支持确认:是否真实异常、原因分类、责任部门、处理说明、确认人、确认时间。否则数据会被质疑。
### 6. 条码拣配会改变齐套和开工状态
及时拣配(机加/装配)表面是扫码需求,实际会改动任务状态链:
```mermaid
flowchart LR
A[条码扫描] --> B[识别物料/任务]
B --> C[更新拣配记录]
C --> D[更新拣配状态]
D --> E[计算齐套]
E --> F[影响发料状态]
F --> G[影响是否可开工]
G --> H[影响生产/装配看板]
```
如果扫码只记录日志,不写回 `拣配状态/齐套/发料状态`,看板仍然显示未齐套;如果扫码直接写回状态,但没有 SAP 库存校验,又可能造成 MES 显示已齐套、SAP 库存不足。因此需要明确 MES 与 SAP 谁作为库存和发料主口径。
### 7. 三类大屏的新增字段影响
| 大屏 | 新增指标 | 需要的新增字段/过程 |
|---|---|---|
| 一楼质检大屏 | 质检及时率、超 2 天未检、关键工序检验汇总/明细 | 最后生产完成时间、报检时间、检验完成时间、是否关键工序、超期天数 |
| 机加现场大屏 | 缺勤人员、关键工序任务汇总/明细、设备 OEE | 岗位、工位、姓名、应到/实到、是否关键工序、设备运行工时、单件工时 |
| 装配现场大屏 | 缺勤人员、及时送检任务列表、加急后排序、颜色区分 | 岗位、工位、姓名、发料齐套时间、送检状态、送检时间、超期天数 |
### 8. 需要优先确认的问题
1. 设备采集数据由谁写入 MES接口频率是多少。
2. 设备采集如何绑定到 MES 任务,是靠设备+时间段、程序号、条码,还是人工绑定。
3. 标准单件工时来自生产工艺,还是设备能力表。
4. 实际产量以 MES 报工、设备计数、质检数量中的哪一个为准。
5. 良品数以报工良品还是质检合格数为准。
6. 质检及时率的“最后一次生产完成时间”取操作记录的报工、辅助结束,还是任务完成时间。
7. 关键工序标识是否影响历史任务,建议只影响新下发任务或做任务快照。
8. 缺勤人员的“应到”来源是班次绑定、排班表还是岗位配置。
9. 装配“发料齐套后 2 天未送检”的发料齐套时间来自哪个表。
10. 条码拣配是否需要 SAP 库存校验和失败重试。
## 十二、补充修正:新增需求必须同时判断“维护入口”
前面的分析已经覆盖了工时、状态、SAP、报表、看板的连锁影响但还需要补一个更基础的判断客户提出一个报表或看板字段时不等于只新增一个展示页面。必须同时判断这个字段从哪里来、由谁维护、在哪个页面维护。
如果不先确认维护入口,会出现三类问题:
1. 报表页面有字段,但没有地方录入,最终只能写死、手工改库或长期为空。
2. 看板显示了 KPI但基础字段散落在多个页面用户不知道该去哪里修正。
3. 同一个字段在标准数据、订单数据、任务快照、SAP 同步表中重复维护,导致历史统计和当前查询对不上。
### 1. 判断框架
| 判断项 | 需要回答的问题 | 典型结论 |
|---|---|---|
| 字段性质 | 是主数据、订单过程数据、任务执行数据、外部同步数据、计算结果,还是人工确认结果 | 主数据进基础维护页;过程数据进业务页;计算结果进视图/报表 |
| 数据来源 | MES、SAP、设备采集、考勤/排班、人工维护,还是多来源融合 | 多来源字段必须记录来源和更新时间 |
| 维护责任人 | 工艺、计划、生产、质检、仓库、设备、班组长、系统管理员谁维护 | 决定页面权限和菜单归属 |
| 维护入口 | 现有页面能否承载,还是必须新建页面 | 优先扩展现有业务页面,缺口大时才新建维护页 |
| 历史影响 | 修改后是否影响已下发任务和历史报表 | 影响历史的字段要做任务快照或维护历史 |
| 看板影响 | 是否会改变已有 KPI 口径 | 看板过程必须同步改,不只改主系统页面 |
### 2. 按字段类型划分维护位置
| 字段/能力类型 | 应优先维护的位置 | 不建议的做法 |
|---|---|---|
| 人员、岗位、班次、排班、出勤 | 人员管理、班次管理、工位人员绑定,必要时新增排班/出勤维护页 | 在机加/装配大屏里直接维护缺勤 |
| 工序、关键工序、标准工时、准备工时 | 标准工艺、生产工艺、工序基础数据 | 单独做一个脱离工艺的关键工序表但不和任务快照同步 |
| 设备、工位、采集点位、是否参与 OEE | 设备档案、工位管理、设备采集配置 | 把设备标准工时简单塞进设备档案并用于所有零件 |
| 生产订单过程字段 | 生产计划、排产、装配已排产需求、生产工艺 | 只在报表页维护,不写回业务主链路 |
| 质检处置字段 | 质检中心、不合格处置、序检收检 | 让步接收记录页反向维护质检结果 |
| SAP 同步字段 | SAP 同步表或 MES 扩展表,只读展示同步时间和状态 | 前端手工覆盖 SAP 字段但不留来源 |
| 人工确认字段 | 待办类页面维护,例如手续确认报表,同时记录确认人和时间 | 把确认状态隐藏在 SQL 过滤里,没有操作日志 |
| 统计/看板指标 | 统一视图、存储过程、日报快照 | 每个看板各写一套 SQL 重新定义口径 |
### 3. 典型字段修正结论
| 需求点 | 修正结论 |
|---|---|
| 缺勤人员 | 必须先有“应到人员”和“实到人员”来源。应到来自班次/排班/岗位工位人员绑定,实到来自考勤/上岗/登录/报工。若现有系统没有排班入口,需要新增或扩展排班/出勤维护页;看板只查询缺勤结果。 |
| 关键工序 | 属于工艺属性,应在标准工艺和生产工艺维护。生产任务下发时快照 `是否关键工序`,质检和机加大屏读取快照。不能只在大屏或质检报表里临时标记。 |
| 标准单件工时 | 优先来自标准工艺/生产工艺,必要时增加设备+工序能力表。设备档案只维护设备能力参数和 OEE 参与属性。 |
| 发料齐套时间 | 如果来自 SAP必须同步到 MES 并记录同步时间;如果允许人工修正,应放在生产计划/装配排产业务链路或装配已排产需求页,并保留维护历史。 |
| 装配完成时间 | 规则计算字段可以在装配已排产需求中显示;人工调整时要作为订单过程字段保存,不应只存在前端。 |
| 预计可执行时间 | 依赖 SAP 缺件、主子订单关系和人工判断。可以在及时齐套跟踪页维护,但要记录维护人、维护时间和依据。 |
| 让步接收 | 质检结果字段应在质检中心或不合格处置维护;让步接收记录页只做查询、导出和追溯。 |
| 外协供应商/SAP 收货单号 | 应在外协任务、序检收检或外协收货链路补字段;供应商质量报表只消费这些字段。 |
| OEE | OEE 是计算结果不是人工维护字段。基础数据分别来自设备采集、MES 报工、质检记录、工艺标准工时和班次规则。 |
### 4. 对已完成页面的新增影响
| 现有页面 | 新增维护责任 |
|---|---|
| `ProcessManagement/ProcessProduct` 生产工艺 | 维护订单级关键工序、标准工时、标准工艺带出后的生产工艺草稿;保存时形成任务可用快照 |
| `ProcessManagement/ProcessesDevelop` 制定标准工艺 | 维护标准关键工序、标准单件工时、准备工时,作为生产工艺默认来源 |
| `SystemMaintenance/WorkstationManagement` | 补工位与设备、岗位、人员关系,支持缺勤和 OEE 维度 |
| `BasicData/ShiftManagement` 或现有班次管理 | 支持班次时间、跨天规则、应到人员或排班规则 |
| `BasicData/PersonnelManagement`、人员角色绑定 | 支持人员岗位、班组、工位范围,为缺勤和权限提供来源 |
| `ProductionManagement/AssemblyCenter` | 维护/展示装配执行、发料、送检、异常、手续确认相关过程字段 |
| `ProductionManagement/MachiningCenter` | 维护/展示机加扫码、设备绑定、报工、异常、关键工序执行状态 |
| `QualityManagement/QualityCenter` | 维护质检结果、让步接收、送检/已检数量、关键工序质检状态 |
| `DeviceManagement/DeviceInformation` | 维护主要设备、采集点位、OEE 参与标识,不独立承担所有标准工时 |
### 5. 后续评估新增需求的强制问题
后续每个新需求都要在开发前回答:
1. 这个字段是展示、维护、确认,还是计算。
2. 如果要维护,是否已有页面可以维护。
3. 如果新增页面,它是查询页、待办页,还是主数据维护页。
4. 数据是否需要修改历史;如果需要,是否留维护日志。
5. 是否需要任务快照,避免标准数据变化影响历史任务。
6. 是否影响生产任务看板、装配看板、质检看板、机加看板或 `board_view`
只有这六个问题明确后,才能判断是“新增页面”、 “扩展现有页面”、 “新增维护页”,还是“只改 SQL/视图/看板口径”。

View File

@@ -0,0 +1,942 @@
# MES 主系统与看板项目综合分析报告
生成日期2026-05-22
分析范围:
- 主系统:`MES_Manage_View_V20`
- 同级看板项目:`board_view``TableTV``机加设备生产运营看板``机加设备生产运营看板二``生产任务看板``装配任务看板``质检任务看板`
- 数据库脚本:更新后的 `MES_Manage_View_V20/script.sql`,最后修改时间为 2026-05-22 13:23:04
排除范围:
- 所有 `.7z``.zip` 压缩包和备份包
- `dist/``node_modules/` 构建产物和依赖目录
- 同级旧版主系统副本 `MacroinfManage_MES``test``新建文件夹` 未纳入本轮业务分析
## 1. 总体结论
当前目录不是单一前端项目,而是一组围绕同一 MES 数据库和 `.ashx` 网关运行的前端应用:
- `MES_Manage_View_V20` 是主业务系统,覆盖计划、工艺、生产、质量、设备、外协、工时、系统权限等完整 MES 功能。
- 上一层目录中的多个项目是看板端,用于大屏展示生产、机加设备、装配、质检、设备状态等实时指标。
- 主系统和新版看板共用同一个后端入口:`https://192.168.2.92:10101/submit/MESCommonBase.ashx`
- 主系统和看板项目都采用“前端传入存储过程名 + 参数,后端 `.ashx` 执行 SQL Server 存储过程”的协议。
- 更新后的 `script.sql` 已包含看板端依赖的关键存储过程,尤其是 `机加设备生产运营看板_*``生产任务综合看板_*``装配中心任务看板_*``质量任务看板_*` 等。
- 但主系统页面仍有 16 个前端调用过程未在当前 `script.sql` 中找到,主要集中在产品结构、摄像头/设备查看权限、点检类型、设备重复校验等非看板功能。
数据库对象统计以更新后的 `script.sql` 为准:
| 对象类型 | 数量 |
| --- | ---: |
| 表 | 50 |
| 视图 | 26 |
| 存储过程 | 345 |
| 函数 | 至少 1 个:`计算班次重叠秒数` |
## 2. 项目组成
### 2.1 主系统 `MES_Manage_View_V20`
技术栈:
- Vue 2.7.16
- Vue Router 3.6.5
- Vuex 3.6.2
- Element UI 2.15.14
- Webpack 5
- Axios 0.21.4
- ECharts、FullCalendar、TinyMCE、xlsx、pdfjs、mqtt 等
定位:
主系统是管理端和业务操作端,面向计划员、工艺人员、生产现场、质检人员、设备管理人员、系统管理员。
核心目录:
| 路径 | 说明 |
| --- | --- |
| `src/views` | 业务页面,共 76 个 `.vue`,业务页面约 67 个 |
| `src/utils/request.js` | 主 Axios 实例,读取 `window.dt_Config.serverAddress` |
| `src/utils/curd.js` | `CreateData``ExecDatabase`、表单/表格通用方法、设备 API |
| `src/router` | 固定路由、动态路由、数据库菜单组件映射 |
| `src/store` | 登录、角色、路由、标签页等状态 |
| `static/config.js` | 运行时服务地址配置 |
| `script.sql` | SQL Server 表、视图、存储过程 |
主系统接口地址:
```js
window.dt_Config = {
serverAddress: 'https://192.168.2.92:10101/submit/MESCommonBase.ashx',
baseURL: 'https://192.168.2.92:10101',
baseURLB1: 'https://192.168.2.92:9996/b1s',
baseURLtm: 'https://192.168.2.92:9996/openapi'
}
```
### 2.2 旧版综合看板 `board_view`
技术栈:
- Vue 2.5
- Webpack 3
- `@jiaminghi/data-view`
- ECharts 5
- `vue-seamless-scroll`
- Axios
- `speak-tts`
定位:
旧版综合生产监控大屏,页面主体为 `src/views/left.vue`。它展示订单看板、装配看板、未完成工序、环境/水电气、OEE、质量等综合信息。
配置:
```js
window.ConnectConfig = {
url2: 'https://192.168.2.92:10101',
requestConfig: '/submit/MESCommonBase.ashx',
zonePageInterval: 10000,
iframeUrl: 'http://192.168.2.92:10008'
}
```
注意:`request.js` 里仍保留 `window.ConnectConfig.url` 的实例,但当前配置只启用了 `url2`,实际可用的是 `instance2`
主要调用过程:
- `看板_主页六个关键数据_查询`
- `看板_左上订单看板_表格_查询`
- `看板_左中装配看板_表格_查询`
- `看板_左下未完成看板_表格_查询`
- `看板_右上合同看板_表格_查询`
- `看板_右下质量看板_表格_查询`
- `看板_右下质量看板_饼图_查询`
- `看板_中间主体订单_表格_查询`
- `看板_中间主体订单详情_表格_查询`
- `看板_中间实时OEE数据展示_查询`
- `看板_左上计划执行情况_曲线_查询`
- `Event_CaChe_Var_看板查询`
- `设备管理_设备状态_查询`
### 2.3 通用表格看板 `TableTV`
技术栈:
- Vue 3.5
- Vite 5
- Element Plus
- TDesign Vue Next
- Pinia
- Axios
定位:
通用工位/任务卡片式滚动看板。`public/config.js` 中配置了标题和目标 SQL
```js
window.g = {
API_WEB_URL: 'https://192.168.2.92:10101',
TV_TITLE: '元利流体 · 生产计划看板',
TV_SQL: 'TV_视图看板_查询'
}
```
实际代码观察:
- `src/views/index.vue` 当前直接调用 `设备管理_设备状态_查询`
- `TV_SQL` 当前未在页面取数逻辑中使用。
- 页面每 5 秒刷新一次数据。
这是一个配置与实现不一致的点:如果设计目标是可配置 SQL 看板,应把 `window.g.TV_SQL` 接入 `fetchData`
### 2.4 机加设备生产运营看板一
路径:`../机加设备生产运营看板`
技术栈:
- Vue 3.5
- Vite 5
- Element Plus
- TDesign Vue Next
- `@kjgl77/datav-vue3`
- ECharts 6
- Axios
- Pinia
定位:
机加设备生产运营看板一,展示设备运行状态、计划执行率、未及时开工、不良品、当天完成、设备任务与明细。
配置:
```js
window.g = {
API_WEB_URL: 'https://192.168.2.92:10101'
}
```
主要调用过程:
- `机加设备生产运营看板_设备任务查询`
- `机加设备生产运营看板_不良品查询`
- `质量任务看板_当天已完成汇总`
- `机加设备生产运营看板_当天已完成明细`
- `机加设备生产运营看板_设备运行状态查询`
- `机加设备生产运营看板_未及时开工查询`
- `机加设备生产运营看板_计划执行率`
### 2.5 机加设备生产运营看板二
路径:`../机加设备生产运营看板二`
技术栈与看板一基本一致。
定位:
机加设备生产运营看板二,侧重加急任务、机加在制任务及机加在制扩展视图。
主要调用过程:
- `机加设备生产运营看板_加急任务查询`
- `机加设备生产运营看板_机加在制查询`
- `机加设备生产运营看板_机加在制查询2`
### 2.6 生产任务看板
路径:`../生产任务看板`
技术栈:
- Vue 3.5
- Vite 5
- Element Plus
- TDesign Vue Next
- ECharts 6
- Axios
定位:
生产任务综合看板,关注齐套、无工艺未排产、加急任务、未及时开工、未按期齐套等生产计划执行风险。
主要调用过程:
- `生产任务综合看板_按期齐套率`
- `生产任务综合看板_未排产无工艺查询`
- `生产任务综合看板_加急任务查询`
- `生产任务综合看板_未及时开工查询`
- `生产任务综合看板_未按期齐套任务`
### 2.7 装配任务看板
路径:`../装配任务看板`
技术栈:
- Vue 3.5
- Vite 5
- Element Plus
- TDesign Vue Next
- `datav-vue3`
- ECharts 6
定位:
装配中心任务大屏,展示异常未关闭、发货状态、在制品缺件、加急任务、装配任务、装配合格率、已完成任务等。
主要调用过程:
- `装配中心任务看板_异常未关闭总数`
- `装配中心任务看板_发货状态查询`
- `装配中心任务看板_在制品缺件查询`
- `装配中心任务看板_加急任务总数查询`
- `装配中心任务看板_装配任务查询`
- `装配中心任务看板_装配合格率`
- `装配中心任务看板_已完成任务`
补充:
该项目内还有 `ProductionTaskDashboard.vue`,复用了生产任务综合看板的 5 个过程,说明装配看板项目中包含生产任务综合看板的备用或切换页面。
### 2.8 质检任务看板
路径:`../质检任务看板`
技术栈:
- Vue 3.5
- Vite 5
- Element Plus
- TDesign Vue Next
- ECharts 6
定位:
质量任务看板,关注未完成质检任务、不同类型任务统计、未完成明细、当天已完成汇总与明细。
主要调用过程:
- `质量任务看板_未完成统计`
- `质量任务看板_未完成明细查询`
- `质量任务看板_当天已完成汇总`
- `质量任务看板_当天已完成明细`
## 3. 统一接口协议
### 3.1 主系统 Vue2 协议
主系统通过 `src/utils/curd.js` 提供全局方法:
```text
业务页面
-> this.CreateData(type, procedureName, params, pageSize, pageList)
-> this.ExecDatabase(data)
-> axios POST window.dt_Config.serverAddress
-> MESCommonBase.ashx
-> SQL Server 存储过程
```
请求对象主要字段:
| 字段 | 说明 |
| --- | --- |
| `type` | 操作类型。常见为 `11` 查询、`12` 写入/更新、`2001` 导出。准确语义由后端 `.ashx` 定义。 |
| `name` | 存储过程名 |
| `param` | 参数 JSON 字符串,数组项包含 `name/value/type/output` |
| `pageSize` | 分页大小 |
| `pageList` | 页码或分页参数 |
| `UserID` | 当前用户 ID |
| `UserName` | 当前用户姓名 |
| `ModularID` | 当前路由路径 |
### 3.2 新版 Vue3 看板协议
Vite/Vue3 看板项目通过 `src/utils/curdVue3.js``src/utils/curd.js` 注入:
- `CreateData`
- `ExecDatabase`
- `ExecDatabaseByParam`
接口地址统一为:
```js
window.g.API_WEB_URL + '/submit/MESCommonBase.ashx'
```
大多数新版看板请求超时时间为 5 秒,明显短于主系统的 25 分钟超时,更适合大屏定时刷新,但也要求看板查询过程必须足够快。
### 3.3 旧版 `board_view` 协议
旧版看板使用 `window.ConnectConfig.url2 + requestConfig` 访问同一 `.ashx` 网关,通过自定义 `CreateData1` 调用 `看板_*` 过程。
## 4. 主系统业务功能
### 4.1 系统维护
页面:
- 人员管理
- 角色维护
- 菜单管理
- 工位管理
- 组织管理
- 操作日志
核心数据:
- `登录基础数据_人员信息`
- `登录基础数据_角色信息`
- `登录基础数据_人员权限角色`
- `登录基础数据_二级菜单`
- `登录基础数据_部门`
- `工位人员绑定表`
- `MES_资源主数据`
- `_日志`
功能:
- 登录、人员、角色、菜单、权限配置。
- 数据库菜单驱动动态路由。
- 工位基础信息和工位人员绑定。
- 操作日志查询。
### 4.2 计划排产
页面:
- 自制件计划
- 自制件排产
- 自制件已排产
- 装配计划
- 装配执行计划
- 优先级排产
- 计划外壳
- 生产订单关闭
核心数据:
- `MES_接口_生产计划`
- `MES_接口_生产计划_生产任务`
- `计划任务视图`
- `View_生产订单_MES`
- `View_生产订单全部包括已关闭`
功能:
- 查询生产订单和任务。
- 按自制件属性区分机加、装配。
- 派工、二次派工、单任务派工。
- 计划时间调整、说明维护、优先级管理。
- 订单关闭与 SAP B1 状态协同。
### 4.3 工艺管理
页面:
- 工序管理
- 标准工艺维护
- 生产工艺维护
- 工艺查询
- 生产订单工艺下发
- 零件图纸、工艺图纸、采购图纸查看/上传/删除
核心数据:
- `基础表_工序`
- `车间生产管理工艺_零件工序_工艺库`
- `车间生产管理工艺_零件生产工艺_工艺库`
- `物料基础数据_零件图纸`
- `物料基础数据_工艺图纸`
- `物料基础数据_零件图纸删除记录`
- `View_标准工艺视图`
- `View_生产工艺视图`
- `View_图纸视图`
功能:
- 标准工艺制定和复制。
- 生产工艺按订单生成、调整、排序、启用。
- 图纸上传下载与删除记录。
- 生产任务下发前的工艺准备。
### 4.4 生产管理
核心页面:
- 加工中心
- 装配中心
- 生产任务管理
- 装配任务管理
- 生产任务汇总
- 装配任务汇总
- 生产计划跟踪
- 外协管理
- 外协报表
- 工时查询
- 工时统计
- 工时校验
- 工时编辑
- 加急件
- 拣配任务
- 班次管理
- 过程异常管控
核心数据:
- `MES_接口_生产计划`
- `MES_接口_生产计划_生产任务`
- `YL_加工中心_操作记录表`
- `YL_加工中心_报工记录`
- `生产管理_工时校验_校验工时表`
- `班次表`
- `班次人员绑定表`
- `设备信息缓存表`
- `View_生产工时视图`
- `View_校验后的生产工时`
- `View_外协报表视图`
功能:
- 现场开工、暂停、继续、报工、送检、完工。
- 工位/人员/任务绑定。
- 外协发料、收料、打印、备注、历史和质检记录。
- 工时校验、批量校验、异常工时录入。
- 加急、拣配、任务跟踪和汇总。
### 4.5 质量管理
页面:
- 质量中心
- 质检明细
- 检验标准
- 不合格品处置
- 来料检验
- 序检收检
- 终检
- 销售退货检
- 其他入库检验
- 原材料退库检验
核心数据:
- `YL_质量检验_质检记录`
- `YL_质量检验_检测标准`
- `YL_质量检验_量具信息`
- `YL_质量检验_质检记录_检测零件`
- `YL_质量检验_质检记录_检测数据`
- `YL_质量检验_不合格品处理`
- `质量检验_质检任务_SAP`
- `View_质检明细`
- `View_质量检验_质检记录`
- `View_终检状态`
功能:
- 质检任务查询和处理。
- 检测标准维护。
- 多零件、多项目检测数据记录。
- 合格、不合格、让步放行、报废统计。
- 不合格品处理流程。
- 与 SAP B1/TM 接口协同。
### 4.6 设备管理
页面:
- 设备信息
- 设备实时数据
- 设备历史数据
- 设备状态
核心数据:
- `YL_设备管理_设备台账`
- `YL_设备管理_维修记录`
- `YL_设备管理_工时记录`
- `历史_工位设备状态每分钟记录`
- `历史_设备数据_定时`
- `CaChe_Var`
- `报警_记录_历史`
- `报警_记录_历史_缓存`
功能:
- 设备台账维护。
- 设备运行状态和历史采集数据查询。
- 报警、缓存变量、OEE/状态看板支撑。
## 5. 数据库结构
### 5.1 表清单
更新后的 `script.sql` 包含 50 张表:
- `_日志`
- `Attachments`
- `BOM数据`
- `CaChe_Var`
- `MES_接口_工艺路线主数据`
- `MES_接口_生产计划`
- `MES_接口_生产计划_生产任务`
- `MES_资源主数据`
- `YL_基础表_数据字典`
- `YL_加工中心_报工记录`
- `YL_加工中心_操作记录表`
- `YL_设备管理_工时记录`
- `YL_设备管理_设备台账`
- `YL_设备管理_维修记录`
- `YL_质量检验_不合格品处理`
- `YL_质量检验_不合格品处理_处理节点`
- `YL_质量检验_检测标准`
- `YL_质量检验_量具信息`
- `YL_质量检验_质检记录`
- `YL_质量检验_质检记录_检测零件`
- `YL_质量检验_质检记录_检测数据`
- `班次表`
- `班次人员绑定表`
- `报警_记录_历史`
- `报警_记录_历史_缓存`
- `车间生产管理工艺_零件工序_工艺库`
- `车间生产管理工艺_零件生产工艺_工艺库`
- `登录基础数据_部门`
- `登录基础数据_二级菜单`
- `登录基础数据_角色信息`
- `登录基础数据_人员权限角色`
- `登录基础数据_人员信息`
- `工位人员绑定表`
- `基础表_工序`
- `基础数据_设备工位点检表`
- `记录_日志_项目运行日志`
- `历史_工位设备状态每分钟记录`
- `历史_设备数据_定时`
- `流程表`
- `流程节点表`
- `流程完成记录表`
- `流程转办表`
- `设备信息缓存表`
- `审批记录表`
- `生产管理_工时校验_校验工时表`
- `物料基础数据_工艺图纸`
- `物料基础数据_零件图纸`
- `物料基础数据_零件图纸删除记录`
- `物料数据`
- `质量检验_质检任务_SAP`
### 5.2 视图清单
更新后的 `script.sql` 包含 26 个视图:
- `v_CurrentProductionStatus`
- `View_报工人员`
- `View_标准工艺视图`
- `View_工位人员绑定数`
- `View_基础数据_工位`
- `View_设备工位人员`
- `View_生产订单_MES`
- `View_生产订单Temp_ERP`
- `View_生产订单全部包括已关闭`
- `View_生产订单完工`
- `View_生产工时视图`
- `View_生产工艺视图`
- `View_生产计划零件图纸视图`
- `View_图纸视图`
- `View_外协报表视图`
- `View_外协质检`
- `View_校验后的生产工时`
- `View_账号权限信息`
- `View_质检明细`
- `View_质量检验_不合格品处理`
- `View_质量检验_质检记录`
- `View_质量检验_质检记录_外协收检`
- `View_终检状态`
- `View_装配信息`
- `登录基础数据_管理人员权限视图`
- `计划任务视图`
### 5.3 存储过程分布
| 前缀/业务域 | 数量 |
| --- | ---: |
| `MES_` | 70 |
| `生产管理_` | 39 |
| `工艺管理_` | 38 |
| `质量管理_` | 21 |
| `工时...` | 20 |
| `计划排产_` | 17 |
| `sp_` 审批/流程/分页类 | 13 |
| `看板_` 旧版综合看板 | 11 |
| `设备管理_` | 10 |
| `Event_` 采集/报警/日志事件 | 10 |
| `机加设备生产运营看板_` | 9 |
| `菜单...` | 9 |
| `人员管理_` | 7 |
| `usp_` 工时计算/校验辅助 | 7 |
| `装配中心任务看板_` | 7 |
| `生产任务综合看板_` | 6 |
| `质量任务看板_` | 4 |
| `TV_` | 3 |
| `WEB_` | 2 |
| 其他 | 42 |
### 5.4 看板过程清单
旧版综合看板:
- `看板_主页六个关键数据_查询`
- `看板_左上订单看板_表格_查询`
- `看板_左上计划执行情况_曲线_查询`
- `看板_左中装配看板_表格_查询`
- `看板_左下未完成看板_表格_查询`
- `看板_右上合同看板_表格_查询`
- `看板_右下质量看板_表格_查询`
- `看板_右下质量看板_饼图_查询`
- `看板_中间主体订单_表格_查询`
- `看板_中间主体订单详情_表格_查询`
- `看板_中间实时OEE数据展示_查询`
机加设备生产运营看板:
- `机加设备生产运营看板_设备任务查询`
- `机加设备生产运营看板_不良品查询`
- `机加设备生产运营看板_当天已完成明细`
- `机加设备生产运营看板_设备运行状态查询`
- `机加设备生产运营看板_未及时开工查询`
- `机加设备生产运营看板_计划执行率`
- `机加设备生产运营看板_加急任务查询`
- `机加设备生产运营看板_机加在制查询`
- `机加设备生产运营看板_机加在制查询2`
生产任务综合看板:
- `生产任务综合看板_按期齐套率`
- `生产任务综合看板_未排产无工艺查询`
- `生产任务综合看板_加急任务查询`
- `生产任务综合看板_未及时开工查询`
- `生产任务综合看板_未及时开工查询_Count`
- `生产任务综合看板_未按期齐套任务`
装配中心任务看板:
- `装配中心任务看板_异常未关闭总数`
- `装配中心任务看板_发货状态查询`
- `装配中心任务看板_在制品缺件查询`
- `装配中心任务看板_加急任务总数查询`
- `装配中心任务看板_装配任务查询`
- `装配中心任务看板_装配合格率`
- `装配中心任务看板_已完成任务`
质量任务看板:
- `质量任务看板_未完成统计`
- `质量任务看板_未完成明细查询`
- `质量任务看板_当天已完成汇总`
- `质量任务看板_当天已完成明细`
TV/设备看板:
- `TV_视图看板_查询`
- `TV_视图看板2楼_查询`
- `TV_视图看板仓库_查询`
- `设备管理_设备状态_查询`
- `Event_CaChe_Var_看板查询`
本轮核对结果:看板端 36 个关键调用过程在更新后的 `script.sql` 中全部存在。
## 6. 核心业务数据流
### 6.1 计划到执行
```text
SAP/ERP 生产计划
-> MES_接口_生产计划
-> MES_接口_生产计划_生产任务
-> 工艺维护/生产工艺下发
-> 计划排产/派工
-> 加工中心/装配中心执行
-> 报工/质检/入库/订单关闭
```
关键字段:
- `订单编号`
- `合同号`
- `计划号`
- `TaskAID`
- `阶段标识`
- `工序名称`
- `指派对象`
- `计划开始时间`
- `计划完成时间`
- `任务状态`
- `完成数量`
- `合格数量`
- `不合格数量`
### 6.2 工艺到任务
```text
基础表_工序
-> 标准工艺库
-> 生产工艺库
-> 生产订单工艺任务下发
-> MES_接口_生产计划_生产任务
```
关键表:
- `基础表_工序`
- `车间生产管理工艺_零件工序_工艺库`
- `车间生产管理工艺_零件生产工艺_工艺库`
### 6.3 生产工时
```text
现场开工/暂停/继续/报工
-> YL_加工中心_操作记录表
-> YL_加工中心_报工记录
-> 工时校验
-> 生产管理_工时校验_校验工时表
-> 工时统计/导出/上传
```
关键过程:
- `usp_ValidateWorkTime`
- `usp_BatchValidateWorkTime`
- `usp_CalculateShiftTime`
- `usp_CalculateUploadMinutes`
- `工时统计_任务工时_查询`
- `工时统计_设备工时_查询`
- `工时统计_项目工时_查询`
- `工时统计_作业者工时_查询`
### 6.4 质量检验
```text
生产任务/质检任务
-> YL_质量检验_质检记录
-> YL_质量检验_质检记录_检测零件
-> YL_质量检验_质检记录_检测数据
-> 合格/不合格/让步/报废
-> 不合格品处置或 SAP/TM 回写
```
关键表:
- `YL_质量检验_检测标准`
- `YL_质量检验_质检记录`
- `YL_质量检验_质检记录_检测零件`
- `YL_质量检验_质检记录_检测数据`
- `质量检验_质检任务_SAP`
### 6.5 看板数据流
```text
MES 主业务表/视图
-> 看板专用存储过程
-> MESCommonBase.ashx
-> Vue2/Vue3 看板定时刷新
-> 大屏指标、滚动表格、图表
```
看板常用数据来源:
- `View_生产订单_MES`
- `View_生产工时视图`
- `View_生产工艺视图`
- `View_质检明细`
- `v_CurrentProductionStatus`
- `MES_接口_生产计划`
- `MES_接口_生产计划_生产任务`
- `YL_加工中心_操作记录表`
- `YL_质量检验_质检记录`
- `历史_设备数据_定时`
- `CaChe_Var`
## 7. 主系统与看板关系
| 维度 | 主系统 | 看板端 |
| --- | --- | --- |
| 主要使用者 | 计划、工艺、生产、质检、设备、管理员 | 车间、管理层、现场展示屏 |
| 操作方式 | 表单、表格、弹窗、日历、文件上传下载 | 只读大屏、自动刷新、滚动列表、图表 |
| 技术栈 | Vue2 + Webpack + Element UI | Vue2/Webpack/DataV 或 Vue3/Vite/Element Plus/TDesign |
| 接口 | `window.dt_Config.serverAddress` | `window.g.API_WEB_URL``window.ConnectConfig.url2` |
| 数据协议 | `CreateData + ExecDatabase` | 同协议或简化封装 |
| 主要过程 | 计划/生产/质量/设备/系统管理过程 | `看板_*``*_任务看板_*``机加设备生产运营看板_*` |
| 数据权限 | 登录、角色、动态菜单 | 多数看板不走完整登录权限,直接读接口 |
## 8. 当前风险与问题
1. 主系统仍有 16 个前端调用过程未包含在当前 `script.sql`
缺失清单:
- `Prog_MES_SingleTaskPlanned`
- `WEB_报警查询_未读报警记录_查询`
- `WEB_报警查询_未读报警记录_未读条数查询`
- `WEB_基本表_产品结构_查询`
- `WEB_基本表_产品结构_删除`
- `WEB_基本表_产品结构_新增`
- `WEB_基本表_产品结构_修改`
- `WEB_人员设备查看权限_查询`
- `WEB_人员设备查看权限_权限切换`
- `WEB_人员摄像头查看权限_权限切换`
- `WEB_摄像头查看权限_查询`
- `产品关系_变更节点排序`
- `登录基础数据_人员信息_切换是否用户`
- `点检类型_查询`
- `工艺名称_查询`
- `设备管理_设备信息_验证工位号是否重复`
2. 看板 SQL 已补齐,但刷新压力要评估
新版看板多数 5 秒刷新一次。如果多个大屏同时打开,`MESCommonBase.ashx` 和 SQL Server 会承受周期性查询压力。看板过程应避免重 JOIN、避免全表扫描必要时用缓存表或汇总表。
3. `TableTV` 配置与实现不一致
`public/config.js` 配置了 `TV_SQL: 'TV_视图看板_查询'`,但当前页面直接调用 `设备管理_设备状态_查询`。如果希望“一套 TableTV 通过配置切换不同 SQL”需要修正实现。
4. 编码问题仍然存在
主系统和旧版 `board_view` 中大量中文在默认 PowerShell 输出为乱码。用 `-Encoding UTF8` 可正常读取部分文件,但历史文件可能混有不同编码。维护过程名和中文字段时要格外谨慎。
5. 认证与权限边界薄弱
主系统 Cookie 中的 `Admin-Token` 更像角色编号新版看板多数直接读接口不走完整登录权限。如果看板部署在内网之外需要后端加白名单、token 或网关控制。
6. 多项目重复代码明显
多个 Vite 看板项目复制了相同的:
- `src/utils/request.js`
- `src/utils/curd.js`
- `src/utils/curdVue3.js`
- `src/router`
- `src/store`
- 静态资源和配置结构
后续维护时容易出现一个看板修了协议,其他看板未同步的问题。
7. 主系统超时时间过长,看板超时时间偏短
- 主系统1500000ms约 25 分钟。
- 新版看板5000ms约 5 秒。
建议对接口分层配置:普通业务、导出、看板查询分别设置合理超时。
## 9. 建议技术路线
### 9.1 短期
- 以更新后的 `script.sql` 为基础,补齐主系统缺失的 16 个过程。
- 为看板过程建立清单和刷新频率表,确认每个过程的平均耗时。
- 修正 `TableTV``TV_SQL` 未生效问题,或者删除无效配置避免误导。
- 保留当前 `.ashx + 存储过程` 架构,先稳定生产。
- 将看板项目部署说明补全:端口、访问路径、`public/config.js`、构建命令、后端地址。
### 9.2 中期
- 抽取 Vue3 看板公共模板,统一 `request/curdVue3/router/store`
- 对看板 SQL 建立缓存或中间汇总表,降低实时查询压力。
- 主系统建立“页面-过程-表/视图”映射文档,优先覆盖加工中心、质量中心、外协、工时校验、排产。
-`.ashx` 返回结构、错误码、超时、登录失效做统一拦截。
- 清理乱码和历史备份文件,确认源码统一 UTF-8。
### 9.3 长期
- 后端从“前端直接传过程名”逐步演进为明确业务 API。
- 建立数据库版本管理机制,按版本维护增量 SQL 和回滚脚本。
- 看板数据进入独立只读 API 或缓存服务,避免大屏直接冲击业务库。
- SAP B1、TM、设备/PLC 接口统一收敛到后端服务层。
- 建立权限模型:主系统、看板、设备接口分层授权。
## 10. 接手排查路径
主系统页面问题:
1. 找页面:`MES_Manage_View_V20/src/views/<模块>/<页面>/index.vue`
2. 搜索 `CreateData(`,确认存储过程名。
3.`script.sql` 搜索该过程。
4. 检查过程返回列名是否与前端表格字段一致。
5. 检查 `static/config.js` 服务地址。
看板页面问题:
1. 找同级看板目录。
2. 查看 `public/config.js``static/config.js`
3. 搜索 `queryDashboardData(``CreateData(``ExecDatabaseByParam(`
4.`script.sql` 中定位对应看板过程。
5. 检查过程耗时、返回字段、刷新频率。
6. 若是 `TableTV`,注意当前代码没有使用 `TV_SQL`
数据库问题:
1. 先确认 `script.sql` 版本。
2. 看过程是否存在。
3. 看过程依赖的视图和表是否存在。
4. 看字段名是否与前端一致。
5. 看看板过程是否有全表扫描或复杂排序。

Binary file not shown.

View File

@@ -0,0 +1,267 @@
<template>
<div class="assembly-punctual-inspection">
<el-card>
<div class="search-container">
<span class="show-text">生产订单:</span>
<el-input
v-model="productionOrder"
placeholder="请输入生产订单"
clearable
style="width: 150px; margin-right: 10px"
@keyup.enter.native="searchTable"
/>
<span class="show-text">销售订单:</span>
<el-input
v-model="salesOrder"
placeholder="请输入销售订单"
clearable
style="width: 150px; margin-right: 10px"
@keyup.enter.native="searchTable"
/>
<span class="show-text">物料编码:</span>
<el-input
v-model="materialCode"
placeholder="请输入物料编码"
clearable
style="width: 180px; margin-right: 10px"
@keyup.enter.native="searchTable"
/>
<span class="show-text">物料名称:</span>
<el-input
v-model="materialName"
placeholder="请输入物料名称"
clearable
style="width: 180px; margin-right: 10px"
@keyup.enter.native="searchTable"
/>
<span class="show-text">工序名称:</span>
<el-input
v-model="processName"
placeholder="请输入工序名称"
clearable
style="width: 150px; margin-right: 10px"
@keyup.enter.native="searchTable"
/>
<el-button :disabled="loading" icon="el-icon-search" plain type="primary" @click="searchTable">查询</el-button>
<el-button :disabled="loading || tableData.length === 0" icon="el-icon-download" plain type="success" @click="exportToExcel">导出</el-button>
</div>
<div class="table-tip">
仅显示预计送检日期小于等于今天的数据
</div>
<el-table
v-loading="loading"
:data="tableData"
:height="'70vh'"
:row-class-name="tableRowClassName"
border
element-loading-background="rgba(0, 0, 0, 0.2)"
element-loading-spinner="el-icon-loading"
highlight-current-row
size="mini"
style="width: 100%; margin-top: 16px"
tooltip-effect="dark"
>
<el-table-column align="center" label="序号" type="index" width="60" fixed />
<el-table-column align="center" prop="任务类型" label="任务类型" width="90" fixed />
<el-table-column align="center" prop="预计送检日期" label="预计送检日期" width="120" fixed show-overflow-tooltip>
<template slot-scope="scope">
{{ formatDate(scope.row.预计送检日期) }}
</template>
</el-table-column>
<el-table-column align="center" prop="订单号" label="生产订单" width="100" fixed />
<el-table-column align="center" prop="合同号" label="销售订单" width="120" fixed show-overflow-tooltip />
<el-table-column align="center" prop="产品编码" label="物料编码" width="180" show-overflow-tooltip />
<el-table-column align="center" prop="产品名称" label="物料名称" width="220" show-overflow-tooltip />
<el-table-column align="center" prop="工序名称" label="工序名称" width="120" show-overflow-tooltip />
<el-table-column align="center" prop="计划数量" label="计划数量" width="100" />
<el-table-column align="center" prop="指派对象" label="指派对象" width="140" show-overflow-tooltip />
<el-table-column align="center" prop="计划开始时间" label="计划开始时间" width="120">
<template slot-scope="scope">
{{ formatDate(scope.row.计划开始时间) }}
</template>
</el-table-column>
<el-table-column align="center" prop="计划完成时间" label="计划完成时间" width="120">
<template slot-scope="scope">
{{ formatDate(scope.row.计划完成时间) }}
</template>
</el-table-column>
<el-table-column align="center" prop="齐套时间" label="齐套时间" width="120">
<template slot-scope="scope">
{{ formatDate(scope.row.齐套时间) }}
</template>
</el-table-column>
<el-table-column align="center" prop="钣金预达时间" label="钣金预达时间" width="120">
<template slot-scope="scope">
{{ formatDate(scope.row.钣金预达时间) }}
</template>
</el-table-column>
<el-table-column align="center" prop="加急状态" label="加急状态" width="90" />
</el-table>
</el-card>
</div>
</template>
<script>
import * as XLSX from 'xlsx'
export default {
name: 'AssemblyPunctualInspection',
data() {
return {
productionOrder: '',
salesOrder: '',
materialCode: '',
materialName: '',
processName: '',
loading: false,
tableData: []
}
},
mounted() {
this.searchTable()
},
methods: {
formatDate(value) {
if (!value) return ''
return String(value).split(' ')[0]
},
tableRowClassName({ row }) {
if (this.isOverdue(row.预计送检日期)) {
return 'overdue-row'
}
if (this.isToday(row.预计送检日期)) {
return 'today-row'
}
return ''
},
async searchTable() {
this.loading = true
try {
const param = []
param.push(['订单号', this.productionOrder || 0])
param.push(['合同号', this.salesOrder])
param.push(['产品编码', this.materialCode])
param.push(['产品名称', this.materialName])
param.push(['工序名称', this.processName])
param.push(['辅助配件', '不含'])
const data = this.CreateData('11', '异常提醒_装配及时送检_查询', param)
const response = await this.ExecDatabase(data)
this.tableData = response.data || []
} catch (error) {
this.$message.error('查询失败: ' + error.message)
this.tableData = []
} finally {
this.loading = false
}
},
isOverdue(value) {
const targetTime = this.getDateTime(value)
if (targetTime === Infinity) {
return false
}
return targetTime < this.getTodayTime()
},
isToday(value) {
const targetTime = this.getDateTime(value)
if (targetTime === Infinity) {
return false
}
return targetTime === this.getTodayTime()
},
getTodayTime() {
const now = new Date()
now.setHours(0, 0, 0, 0)
return now.getTime()
},
getDateTime(value) {
if (!value) {
return Infinity
}
const dateText = this.formatDate(value).replace(/-/g, '/')
const date = new Date(dateText)
if (Number.isNaN(date.getTime())) {
return Infinity
}
date.setHours(0, 0, 0, 0)
return date.getTime()
},
exportToExcel() {
const exportData = this.tableData.map((item, index) => ({
序号: index + 1,
任务类型: item.任务类型,
预计送检日期: item.预计送检日期,
生产订单: item.订单号,
销售订单: item.合同号,
物料编码: item.产品编码,
物料名称: item.产品名称,
工序名称: item.工序名称,
计划数量: item.计划数量,
指派对象: item.指派对象,
计划开始时间: this.formatDate(item.计划开始时间),
计划完成时间: this.formatDate(item.计划完成时间),
齐套时间: this.formatDate(item.齐套时间),
钣金预达时间: this.formatDate(item.钣金预达时间),
加急状态: item.加急状态
}))
const wb = XLSX.utils.book_new()
const ws = XLSX.utils.json_to_sheet(exportData)
ws['!cols'] = [
{ wch: 8 },
{ wch: 10 },
{ wch: 14 },
{ wch: 14 },
{ wch: 14 },
{ wch: 22 },
{ wch: 28 },
{ wch: 14 },
{ wch: 10 },
{ wch: 14 },
{ wch: 14 },
{ wch: 14 },
{ wch: 14 },
{ wch: 14 },
{ wch: 10 }
]
XLSX.utils.book_append_sheet(wb, ws, '装配及时送检')
XLSX.writeFile(wb, '装配及时送检.xlsx')
this.$message.success('导出成功')
}
}
}
</script>
<style scoped>
.assembly-punctual-inspection {
padding: 10px;
}
.search-container {
display: flex;
align-items: center;
flex-wrap: wrap;
}
.show-text {
font-size: 14px;
margin-right: 6px;
}
.table-tip {
margin-top: 12px;
color: #909399;
font-size: 13px;
}
::v-deep .overdue-row > td {
background-color: #fde2e2 !important;
}
::v-deep .today-row > td {
background-color: #faecd8 !important;
}
</style>

View File

@@ -0,0 +1,489 @@
<template>
<div class="app-container">
<el-card style="height: 850px">
<div style="margin-top: 7px; margin-bottom: 7px">
<span class="show-text">生产订单:</span>
<el-input
v-model="orderNo"
placeholder="请输入生产订单"
clearable
style="width: 150px; margin-right: 10px"
@change="searchTable()"
/>
<span class="show-text">计划号:</span>
<el-input
v-model="plannum"
placeholder="请输入生产订单"
clearable
style="width: 150px; margin-right: 10px"
/>
<span class="show-text">物料编码:</span>
<el-input
v-model="productCode"
placeholder="请输入物料编码"
clearable
style="width: 150px; margin-right: 10px"
/>
<span class="show-text">物料名称:</span>
<el-input
v-model="itemName"
placeholder="请输入物料名称"
clearable
style="width: 150px; margin-right: 10px"
/>
<span class="show-text">工序名称:</span>
<el-input
v-model="processName"
placeholder="请输入工序名称"
clearable
style="width: 150px; margin-right: 10px"
/>
<span class="show-text">执行状态:</span>
<el-select v-model="dostate" placeholder="请选择">
<el-option
v-for="item in dostateoptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-button
icon="el-icon-search"
plain
type="primary"
@click="searchTable()"
>查询</el-button
>
</div>
<el-table
:data="mergedTableData"
highlight-current-row
border
size="small"
style="margin-top: 10px"
height="75vh"
@selection-change="handleSelectionChange"
@row-click="handleRowClick">
<el-table-column type="selection" width="50"></el-table-column>
<el-table-column label="序号" type="index" align="center" width="50"/>
<el-table-column label="生产订单" align="center" prop="订单号" width="80" />
<el-table-column label="计划号" align="center" prop="计划号" width="80" />
<el-table-column label="工序名称" align="center" prop="工序名称" width="120"/>
<el-table-column label="物料名称" align="center" prop="产品名称" width="200"/>
<el-table-column label="同步状态" align="center" width="100">
<template slot-scope="scope">
{{scope.row.派工状态 === 1 ? '已同步':'未同步'}}
</template>
</el-table-column>
<el-table-column label="上序合格数" align="center" prop="上序合格数" width="100"/>
<el-table-column label="指派数量" align="center" prop="指派数量" width="80"/>
<el-table-column label="打印数量" align="center" prop="打印数量" width="80"/>
<el-table-column label="发料数量" align="center" prop="收料数量" width="80"/>
<el-table-column label="收货数量" align="center" prop="完成数量" width="80"/>
<el-table-column label="备注" align="center" prop="外协备注" width="200"/>
<el-table-column label="单重" align="center" prop="单重" width="80"/>
<el-table-column label="物料编码" align="center" prop="产品编码" width="200"/>
<el-table-column label="打印次数" align="center" prop="外协打印次数" width="120"/>
<el-table-column label="计划开始时间" align="center" prop="计划开始时间" width="120">
<template slot-scope="scope">
{{formatDate(scope.row.计划开始时间)}}
</template>
</el-table-column>
<el-table-column label="计划完成时间" align="center" prop="计划完成时间" width="120">
<template slot-scope="scope">
{{formatDate(scope.row.计划完成时间)}}
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { postB1 } from '@/api/b1s';
import $ from 'jquery'
import QRCode from 'qrcode'
import { set } from 'nprogress';
import { MESDownFile } from '@/utils/request'
import { seepdf, initPDFKeyboardShortcuts, setZoom } from '@/utils/pdf';
export default {
data() {
return {
downPDF:MESDownFile,
seeVisible:false,
qrCodeDataUrl:'',
printDataList2:[],
historyVisible:false,
printdata2:[],
historydata:[],
dialogFormVisible1: false,
tableData: [], // 原始数据
mergedTableData: [], // 合并后的数据
selectedRow:'',
selectedRow2:'',
productCode:'',
orderNo:'',
plannum:'',
processName:'',
itemName:'',
sessionId:'',
currentTime:'',
receiveVisible:false,
receiveData: {},
receiveNum: 0,
doVisible:false,
doData: {},
doNum: 0,
// 新增:存储合并数据的原始信息
mergedDataMap: new Map(), // 用于存储合并数据对应的原始数据组
workstate:0,
orderstate:0,
dostate:1,
workstateoptions:[{
value: 0,
label: '未同步'
}, {
value: 1,
label: '已同步',
disabled: true
}],
stateoptions:[{
value: 0,
label: '未完成',
disabled: true
}, {
value: 1,
label: '已完成',
}],
dostateoptions:[{
value: 0,
label: '全部',
disabled: true
}, {
value: 1,
label: '可执行',
},{
value: 2,
label: '不可执行',
}],
multipleSelection: [],
printDataList: [] ,// 新增:存储多个打印数据
numname:'',
textweight:'',
textsum:'',
textcontent:'',
textData:{},
textVisible:false,
qrCodeCache: new Map(),
qrCodeUrl: '',
}
},
computed: {
...mapGetters([
'id',
'token'
]),
},
created() {
this.searchTable()
setInterval(this.getCurrentTime, 1000);
},
methods: {
handleSelectionChange(val) {
this.multipleSelection = val;
},
getCurrentTime() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, "0");
const day = String(now.getDate()).padStart(2, "0");
const hours = String(now.getHours()).padStart(2, "0");
const minutes = String(now.getMinutes()).padStart(2, "0");
const seconds = String(now.getSeconds()).padStart(2, "0");
this.currentTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
handleRowClick(row) {
this.selectedRow = row
},
handleRowClick2(row) {
this.selectedRow2 = row
},
searchTable() {
this.loading = true
var param = []
param.push(["订单号",this.orderNo])
param.push(["产品编码",this.productCode])
param.push(["产品名称",this.itemName])
param.push(["工序名称",this.processName])
param.push(["计划号",this.plannum])
var Data = this.CreateData('11', '异常提醒_外协及时开工_查询',param)
this.ExecDatabase(Data).then(response => {
this.tableData = response.data
this.mergeTableData() // 处理数据合并
})
},
// 合并表格数据的方法
mergeTableData() {
if (!this.tableData || this.tableData.length === 0) {
this.mergedTableData = [];
this.mergedDataMap.clear();
return;
}
const groupedByOrder = {};
this.tableData.forEach(item => {
const groupKey = `${item.订单号}_${item.拆分内码}`;
if (!groupedByOrder[groupKey]) {
groupedByOrder[groupKey] = [];
}
groupedByOrder[groupKey].push(item);
});
const mergedData = [];
this.mergedDataMap.clear();
Object.keys(groupedByOrder).forEach(orderNo => {
const orderItems = groupedByOrder[orderNo];
orderItems.sort((a, b) => a.订单行号 - b.订单行号);
let currentGroup = [orderItems[0]];
for (let i = 1; i < orderItems.length; i++) {
const currentItem = orderItems[i];
const lastItem = orderItems[i - 1];
if (currentItem.订单行号 === lastItem.订单行号 + 1 && currentItem.外协分组 === lastItem.外协分组 && currentItem.拆分内码 === lastItem.拆分内码) {
currentGroup.push(currentItem);
} else {
// 检查组内最小计划开始时间是否小于今天
if (this.checkGroupPlanStartValid(currentGroup)) {
if (this.checkGroupAllZero(currentGroup)) {
const mergedItem = this.mergeGroup(currentGroup);
if (this.shouldIncludeByExecutionStatus(mergedItem)) {
mergedData.push(mergedItem);
this.mergedDataMap.set(mergedItem.uniqueKey, currentGroup);
}
}
}
currentGroup = [currentItem];
}
}
// 处理最后一组
if (currentGroup.length > 0) {
if (this.checkGroupPlanStartValid(currentGroup)) {
if (this.checkGroupAllZero(currentGroup)) {
const mergedItem = this.mergeGroup(currentGroup);
if (this.shouldIncludeByExecutionStatus(mergedItem)) {
mergedData.push(mergedItem);
this.mergedDataMap.set(mergedItem.uniqueKey, currentGroup);
}
}
}
}
});
this.mergedTableData = mergedData;
},
// 新增:检查组内最小计划开始时间是否小于今天
checkGroupPlanStartValid(group) {
const today = new Date();
today.setHours(0, 0, 0, 0);
// 获取组内最小的计划开始时间
const minPlanStart = group.reduce((min, item) => {
if (!item.计划开始时间) return min;
const planDate = new Date(item.计划开始时间);
planDate.setHours(0, 0, 0, 0);
return planDate < min ? planDate : min;
}, new Date('2099-12-31'));
return minPlanStart < today;
},
// 新增检查组内所有数据的收料数量是否都为0
checkGroupAllZero(group) {
// 只有组内所有数据的收料数量都等于0才返回true
return group.every(item => {
const 收料数量 = Number(item.收料数量) || 0;
return 收料数量 === 0;
});
},
// 新增:根据执行状态筛选数据(纯前端筛选)
shouldIncludeByExecutionStatus(mergedItem) {
const 执行状态 = this.dostate; // 0=全部, 1=可执行, 2=不可执行
if (执行状态 === 0) {
return true; // 全部,不筛选
}
const itemExecutionStatus = mergedItem.执行状态 || 1; // 默认可执行
if (执行状态 === 1) {
return itemExecutionStatus === 1; // 只显示可执行
} else if (执行状态 === 2) {
return itemExecutionStatus === 2; // 只显示不可执行
}
return true;
},
// 合并单个组的数据
mergeGroup(group) {
if (group.length === 1) {
const item = group[0];
item.uniqueKey = `${item.订单号}_${item.订单行号}_${item.TaskAID}`;
// 确保TaskAID是字符串类型
item.TaskAID = String(item.TaskAID);
// 计算单条记录的执行状态
const 上序合格数 = item.上序合格数 || 0;
const 订单行号 = item.订单行号;
item.执行状态 = (订单行号 === 1 || 上序合格数 > 0) ? 1 : 2;
return item;
}
const mergedItem = { ...group[0] };
// 生成唯一标识key
mergedItem.uniqueKey = group.map(item => `${item.订单号}_${item.订单行号}_${item.TaskAID}`).join('|');
// 拼接工序名称(逗号间隔)
const processNames = group.map(item => item.工序名称);
mergedItem.工序名称 = processNames.join(',');
// 拼接TaskAID逗号间隔
const taskAIDs = [...new Set(group.map(item => String(item.TaskAID)))];
mergedItem.TaskAID = taskAIDs.join(',');
// 取计划开始时间的最小值
const startTimes = group.map(item => new Date(item.计划开始时间));
mergedItem.计划开始时间 = new Date(Math.min(...startTimes)).toISOString().slice(0, 19).replace('T', ' ');
// 取计划完成时间的最大值
const endTimes = group.map(item => new Date(item.计划完成时间));
mergedItem.计划完成时间 = new Date(Math.max(...endTimes)).toISOString().slice(0, 19).replace('T', ' ');
// 取最大值
const wcnum = group.map(item => item.完成数量);
mergedItem.完成数量 = Math.max(...wcnum);
const printnum = group.map(item => item.外协打印次数);
mergedItem.外协打印次数 = Math.max(...printnum);
const slnum = group.map(item => item.收料数量);
mergedItem.收料数量 = Math.max(...slnum);
// 计算上序合格数(取组内最大值)
const shxnum = group.map(item => item.上序合格数 || 0);
mergedItem.上序合格数 = Math.max(...shxnum);
// 计算执行状态:只要一组内包含订单行号=1 或者包含上序合格数>0都属于可执行
const hasFirstProcess = group.some(item => item.订单行号 === 1);
const hasPreviousQualified = group.some(item => (item.上序合格数 || 0) > 0);
mergedItem.执行状态 = (hasFirstProcess || hasPreviousQualified) ? 1 : 2;
// 存储原始组数据引用
mergedItem.originalGroup = group;
return mergedItem;
},
// 获取订单行号最大的TaskAID
getMaxOrderLineTaskAID(row) {
// 如果是单条数据直接返回TaskAID
if (typeof row.TaskAID === 'number' || !row.TaskAID.includes(',')) {
return String(row.TaskAID);
}
// 如果是合并数据从原始数据组中找订单行号最大的TaskAID
if (row.originalGroup) {
const maxOrderLineItem = row.originalGroup.reduce((max, item) => {
return item.订单行号 > max.订单行号 ? item : max;
}, row.originalGroup[0]);
return String(maxOrderLineItem.TaskAID);
}
// 如果没有原始组数据从TaskAID字符串中取最后一个
const taskAIDs = row.TaskAID.split(',');
return taskAIDs[taskAIDs.length - 1];
},
// 获取订单行号最小的TaskAID
getMinOrderLineTaskAID(row) {
// 如果是单条数据直接返回TaskAID
if (typeof row.TaskAID === 'number' || !row.TaskAID.includes(',')) {
return String(row.TaskAID);
}
// 如果是合并数据从原始数据组中找订单行号最大的TaskAID
console.log(row)
if (row.originalGroup) {
const minOrderLineItem = row.originalGroup.reduce((min, item) => {
return item.订单行号 < min.订单行号 ? item : min;
}, row.originalGroup[0]);
return String(minOrderLineItem.TaskAID);
}
// 如果没有原始组数据从TaskAID字符串中取最后一个
const taskAIDs = row.TaskAID.split(',');
return taskAIDs[taskAIDs.length - 1];
},
formatDate(date) {
if (!date) return ''
return date.split(' ').length > 1 ? date.split(' ')[0] : date
},
}
}
</script>
<style>
.field-container {
border: 1px solid #000;
border-bottom:0px
}
.field-row {
display: flex;
width: 100%;
border-bottom: 1px solid #000;
}
.field-group {
display: flex;
width: 25%;
align-items: stretch;
border-right: 1px solid #000;
}
.field-group:last-child {
border-right: none;
}
.field-label {
width: 40%;
color: #000;
text-align: right;
padding: 12px 5px;
border-right: 1px solid #000;
display: flex;
align-items: center;
justify-content: flex-end;
}
.field-value {
width: 60%;
color: #303133;
word-break: break-word;
overflow-wrap: break-word;
padding: 12px 10px;
display: flex;
align-items: center;
}
</style>

View File

@@ -64,6 +64,14 @@
<el-option label="已开工" value="2" />
<el-option label="已完成" value="4" />
</el-select>
<el-switch
v-model="stationFilterMode"
active-text="工位正选"
inactive-text="工位反选"
active-value="include"
inactive-value="exclude"
style="margin-left: 20px;"
/>
<el-button
:disabled="loading"
icon="el-icon-search"
@@ -76,6 +84,7 @@
<el-checkbox v-for="item in Doingoptions" :key="item.工位号" :label="item.指南工位号" :value="item.工位号"> </el-checkbox>
</el-checkbox-group>
</div>
<el-table
v-loading="loading"
@@ -320,6 +329,7 @@ export default {
],
Doing: [],
Doingoptions: [],
stationFilterMode: 'include',
// DoingData: {
// 订单编号: "",
// 合同号: "",
@@ -549,6 +559,7 @@ export default {
param.push(["生产状态", this.productionStatus2]||-1);
param.push(["工位名称", this.Doing]);
param.push(["工位筛选模式", this.stationFilterMode]);
param.push(["用户ID" , this.$store.state.user.id])
param.push(["计划号" , this.plannum])
param.push(["销售订单" , this.salenum])

View File

@@ -0,0 +1,966 @@
<template>
<div>
<el-card>
<div class="search-container" @keyup.enter="searchTable">
<span class="show-text">生产订单:</span>
<el-input v-model="orderNo" placeholder="请输入生产订单" clearable style="width: 150px;margin-right: 10px" />
<span class="show-text">销售订单:</span>
<el-input v-model="contractNo" placeholder="请输入销售订单" clearable style="width: 150px;margin-right: 10px" />
<span class="show-text">产品编码:</span>
<el-input v-model="productCode" placeholder="请输入产品编码" clearable style="width: 150px;margin-right: 10px" />
<span class="show-text">计划号:</span>
<el-input v-model="plannum" placeholder="请输入计划号" clearable style="width: 150px;margin-right: 10px" />
<span class="show-text">自制件属性:</span>
<el-select v-model="selfStatus" clearable placeholder="请选择自制件属性" style="width: 150px;margin-right: 10px">
<el-option label="全部" value="全部" />
<el-option label="机加" value="机加" />
<el-option label="装配" value="装配" />
</el-select>
<!-- 新增外协过滤 -->
<span class="show-text">外协状态:</span>
<el-select v-model="outsourceStatus" clearable placeholder="请选择外协状态" style="width: 150px;margin-right: 10px">
<el-option label="全部" value="全部" />
<el-option label="是" value="是" />
<el-option label="否" value="否" />
</el-select>
<!-- 新增加急过滤 -->
<span class="show-text">加急状态:</span>
<el-select v-model="urgentStatus" clearable placeholder="请选择加急状态" style="width: 150px;margin-right: 10px">
<el-option label="全部" value="全部" />
<el-option label="加急" value="加急" />
<el-option label="正常" value="正常" />
</el-select>
<span class="show-text">单据状态:</span>
<el-select v-model="orderStatus" clearable placeholder="请选择单据状态" style="width: 150px;margin-right: 10px">
<el-option label="全部" value="全部" />
<el-option label="关闭" value="关闭" />
<el-option label="正常" value="正常" />
</el-select>
<!-- 其他搜索条件保持不变 -->
<el-button :disabled="loading" icon="el-icon-search" plain type="primary" @click="searchTable()">查询</el-button>
</div>
<el-table v-loading="loading" :data="tableData" :height="'80vh'" border
element-loading-background="rgba(0, 0, 0, 0.2)" element-loading-spinner="el-icon-loading" highlight-current-row
size="mini" style="width: 100%;margin-top: 20px;" tooltip-effect="dark" @row-click="handleRowClick">
<el-table-column type="expand">
<template slot-scope="scope">
<el-form label-position="left" class="demo-table-expand">
<el-table :data="scope.row.子数据" :row-class-name="getHeaderClass" border >
<el-table-column align="center" label="序号" type="index" width="50" />
<el-table-column align="center" label="工序名称" prop="工序名称" width="100" />
<el-table-column align="center" label="计划数量" prop="计划数量" width="100" />
<el-table-column align="center" label="指派对象" prop="指派对象" width="100" />
<!-- 在子数据中显示外协标识 -->
<!-- <el-table-column align="center" label="外协" width="80">
<template slot-scope="scope">
<div class="status-light" :class="scope.row.是否外协 ? 'status-light-green' : 'status-light-gray'" />
</template>
</el-table-column> -->
<el-table-column align="center" label="计划开始时间" prop="计划开始时间" width="100">
<template slot-scope="scope">{{ formatDate(scope.row.计划开始时间) }}</template>
</el-table-column>
<el-table-column align="center" label="计划结束时间" prop="计划完成时间" width="100">
<template slot-scope="scope">{{ formatDate(scope.row.计划完成时间) }}</template>
</el-table-column>
<el-table-column align="center" label="实际开始时间" prop="开始时间" width="100">
<template slot-scope="scope">{{ scope.row.开始时间 === '1900-01-01 00:00:00'? '':scope.row.开始时间}}</template>
</el-table-column>
<el-table-column align="center" label="实际结束时间" width="100">
<template slot-scope="scope">{{ scope.row.指派对象 === '外协' ? scope.row.外协结束时间 === '1900-01-01 00:00:00'? '':scope.row.外协结束时间 : scope.row.结束时间 === '1900-01-01 00:00:00'? '':scope.row.结束时间}}</template>
</el-table-column>
<el-table-column align="center" label="完成进度" prop="进度" width="100">
<template slot-scope="scope">{{ scope.row.进度}}%</template>
</el-table-column>
<el-table-column align="center" label="完成数量" prop="完成数量" width="100" />
<el-table-column align="center" label="外协发料数量" prop="收料数量" width="100" >
<template slot-scope="scope">{{scope.row.指派对象 === '外协' ? scope.row.收料数量:''}}</template>
</el-table-column>
<el-table-column align="center" label="合格数" prop="收检合格数" width="100" />
<el-table-column align="center" label="不良数" prop="收检不合格数" width="100" />
<el-table-column align="center" label="任务状态" prop="任务状态" width="100" />
<el-table-column align="center" label="加工状态" prop="加工状态" width="100" />
</el-table>
</el-form>
</template>
</el-table-column>
<!-- 主表列定义 -->
<el-table-column align="center" label="序号" type="index" width="50" />
<el-table-column align="center" prop="合同号" label="销售订单" width="120" />
<el-table-column align="center" prop="订单号" label="生产订单" width="100" />
<el-table-column align="center" prop="产品编码" label="产品编码" width="220" />
<el-table-column align="center" prop="产品名称" label="产品名称" width="190" />
<el-table-column align="center" prop="计划数量订单" label="计划数量" width="80" />
<el-table-column align="center" label="加急数量" width="80">
<template slot-scope="scope">
<div @click="Urgent(scope.row)" style="color: aqua;">
{{ scope.row.加急总数 }}
</div>
</template>
</el-table-column>
<el-table-column align="center" label="工艺路线" width="550">
<template slot-scope="scope">
<div class="process-route" v-html="formatProcessRoute(scope.row)" />
</template>
</el-table-column>
<el-table-column align="center" prop="入库数量" label="入库数量" width="80" />
<el-table-column align="center" label="要求完工日" width="120">
<template slot-scope="scope">{{ formatDate(scope.row.要求完工日期) }}</template>
</el-table-column>
<!-- 主表显示外协状态 -->
<!-- <el-table-column align="center" label="外协" width="80">
<template slot-scope="scope">
<div class="status-light" :class="scope.row.是否外协 ? 'status-light-green' : 'status-light-gray'" />
</template>
</el-table-column> -->
<!-- 其他状态列保持不变 -->
<el-table-column align="center" label="排产" width="80">
<template slot-scope="scope">
<div class="status-light" :class="scope.row.排产状态 === 1 ? 'status-light-green' : 'status-light-gray'" />
</template>
</el-table-column>
<el-table-column align="center" label="拣配" width="80">
<template slot-scope="scope">
<div class="status-light" :class="Number(scope.row.拣配状态) === 1 ? 'status-light-green' : 'status-light-gray'" />
</template>
</el-table-column>
<el-table-column align="center" label="开工" width="80">
<template slot-scope="scope">
<div class="status-light" :class="scope.row.开工时间 === 1 ? 'status-light-green' : 'status-light-gray'" />
</template>
</el-table-column>
<el-table-column align="center" label="终检" width="80">
<template slot-scope="scope">
<div class="status-light" :class="scope.row.终检 === '是' ? 'status-light-green' : 'status-light-gray'" />
</template>
</el-table-column>
<el-table-column align="center" label="加急" width="80">
<template slot-scope="scope">
<div class="status-light" :class="scope.row.加急状态 === '加急' ? 'status-light-green' : 'status-light-gray'" />
</template>
</el-table-column>
<el-table-column align="center" label="优先级" width="80">
<template slot-scope="scope">
<div class="status-light" :class="scope.row.优先级 === '是' ? 'status-light-green' : 'status-light-gray'" />
</template>
</el-table-column>
<el-table-column align="center" prop="当前序" label="当前序" width="80" />
<el-table-column align="center" prop="计划号" label="计划号" width="120" />
</el-table>
</el-card>
<el-dialog
:visible.sync="UrgentVisible"
title="加急明细"
width="1200px"
center
:close-on-click-modal="false"
>
<el-form ref="Urgentarr" :model="Urgentarr" size="mini">
<el-form-item v-for="item in Urgentarr" :key="item.订单编号" >
<div class="info-container" >
<div class="info-item">
<span class="info-label" style="width: 80px">生产订单</span>
<span class="info-value">
<el-input
v-model="item.订单编号"
size="mini"
readonly
style="width: 300px"
/>
</span>
</div>
<div class="info-item">
<span class="info-label" style="width: 80px">加急数量</span>
<span class="info-value">
<el-input
v-model="item.加急数量"
size="mini"
style="width: 150px"
readonly
/>
</span>
</div>
<div class="info-item">
<span class="info-label" style="width: 80px">物料编号</span>
<span class="info-value">
<el-input
v-model="item.物料编号"
size="mini"
style="width: 150px"
readonly
/>
</span>
</div>
</div>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="UrgentVisible = false">关闭</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
orderNo: '',
contractNo: '',
productCode: '',
plannum: '',
productName: '',
processName: '',
nature: '',
productionStatus: '全部',
selfStatus: '全部',
// 新增过滤字段
outsourceStatus: '全部', // 外协状态
urgentStatus: '全部', // 加急状态
orderStatus:'正常',
completionTime: [],
loading: false,
tableData: [],
selectedRow: null,
editDialogVisible: false,
editSubmitLoading: false,
currentRow: {},
editForm: {
优先级: '',
未完成说明: '',
派工特殊说明: ''
},
splitTaskDialogVisible: false,
splitTaskSubmitLoading: false,
stationOptions: [],
splitTaskForm: {
分配数量: 0,
指派对象: '',
指派对象编号: '',
派工特殊备注: '',
计划开始时间: '',
计划结束时间: '',
最晚开始时间: '',
任务概述: ''
},
planStartTime: [],
planendTime: [],
UrgentVisible: false,
Urgentarr: {}
}
},
created() {
var now = new Date()
var start = new Date(Date.UTC(now.getFullYear() - 2, now.getMonth(), now.getDate(), 0, 0, 0)).toISOString().replace('T', ' ').replace('.000Z', '')
var end = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59)).toISOString().replace('T', ' ').replace('.000Z', '')
this.searchTable()
},
methods: {
Urgent(row){
var param = []
param.push(["物料编号",row.产品编码])
this.UrgentVisible = true
var Data = this.CreateData("11", "加急订单_加急明细查询",param);
this.ExecDatabase(Data).then((response) => {
this.Urgentarr = response.data
});
},
getHeaderClass({ row, rowIndex }) {
if (row.绿 == 1) {
return 'warning-row'
} else if (row. === 1) {
return 'error-row'
} else if (row. === 1) {
return 'success-row'
} else {
return ''
}
},
formatDate(date) {
if (!date) return ''
return date.split(' ').length > 1 ? date.split(' ')[0] : date
},
formatProcessRouteDate(date) {
const formattedDate = this.formatDate(date)
const match = formattedDate.match(/^(\d{4})-(\d{2})-(\d{2})$/)
return match ? `${match[2]}-${match[3]}` : formattedDate
},
toProcessNumber(value) {
const num = Number(value)
return Number.isFinite(num) ? num : 0
},
escapeProcessHtml(value) {
return String(value == null ? '' : value)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;')
},
isOutsourceProcess(process) {
return process.指派对象 === '外协'
},
getProcessStatusNum(status) {
const statusNum = parseInt(status)
if (Number.isFinite(statusNum)) {
return statusNum
}
const statusMap = {
辅助开始: 2,
辅助结束: 3,
开始加工: 4,
暂停: 5,
报工: 6,
装配加工: 4
}
return statusMap[status] || 0
},
isBlueProcess(process) {
const statusNum = this.getProcessStatusNum(process.加工状态)
const countNum = parseInt(process.收检合格数)
return statusNum === 6 || statusNum === 3 || countNum > 0
},
isGreenProcess(process) {
console.log(process)
console.log( this.toProcessNumber(process.收料数量), this.toProcessNumber(process.完成数量),this.isOutsourceProcess(process))
return this.isOutsourceProcess(process) &&
this.toProcessNumber(process.收料数量) > this.toProcessNumber(process.完成数量) + this.toProcessNumber(process.收检不合格数)
},
getProcessBaseClass(process) {
if (this.isGreenProcess(process)) {
return 'process-route-green'
}
if (this.isBlueProcess(process)) {
return 'process-route-blue'
}
const statusNum = this.getProcessStatusNum(process.加工状态)
if (statusNum === 2 || statusNum === 4) {
return 'process-route-green'
}
return 'process-route-red'
},
getOutsourceGroupClassState(processes) {
const classes = new Map()
let currentIndexes = []
let lastProcess = null
const flushOutsourceRun = () => {
if (currentIndexes.length > 0 && lastProcess) {
const className = this.getProcessBaseClass(lastProcess)
currentIndexes.forEach(index => classes.set(index, className))
}
currentIndexes = []
lastProcess = null
}
const isSameContinuousGroup = process => {
if (!lastProcess) {
return true
}
const lineNo = this.toProcessNumber(process.订单行号)
const lastLineNo = this.toProcessNumber(lastProcess.订单行号)
return lineNo === lastLineNo + 1 &&
String(process.外协分组 || '') === String(lastProcess.外协分组 || '')
}
processes.forEach((process, index) => {
if (!this.isOutsourceProcess(process)) {
flushOutsourceRun()
return
}
if (!isSameContinuousGroup(process)) {
flushOutsourceRun()
}
currentIndexes.push(index)
lastProcess = process
})
flushOutsourceRun()
console.log(classes)
return classes
},
getProcessClass(process, index, outsourceGroupClasses) {
if (this.isOutsourceProcess(process)) {
return outsourceGroupClasses.get(index) || this.getProcessBaseClass(process)
}
return this.getProcessBaseClass(process)
},
getProcessRouteName(process) {
const name = String(process.工序名称 || '')
const assignee = String(process.指派对象 || '')
if (!assignee || name.includes(`(${assignee})`) || name.includes(`${assignee}`)) {
return name
}
return `${name}(${assignee})`
},
getRouteProcesses(row) {
if (Array.isArray(row.子数据) && row.子数据.length > 0) {
return row.子数据
}
return String(row.工艺路线 || '')
.split(',')
.map(name => name.trim())
.filter(Boolean)
.map(name => ({
工序名称: name,
加工状态: 0,
收检合格数: 0,
计划开始时间: '',
指派对象: '',
订单行号: 0,
收料数量: 0,
收检不合格数: 0
}))
},
formatProcessRoute(row) {
const processes = this.getRouteProcesses(row)
if (processes.length === 0) {
return ''
}
const outsourceGroupClasses = this.getOutsourceGroupClassState(processes)
const maxPerRow = 8
const rows = Math.ceil(processes.length / maxPerRow)
let tableHtml = '<div class="process-route-wrap"><table class="process-route-table"><tbody>'
for (let rowIndex = 0; rowIndex < rows; rowIndex++) {
const startIndex = rowIndex * maxPerRow
const endIndex = Math.min(startIndex + maxPerRow, processes.length)
const rowProcesses = processes.slice(startIndex, endIndex)
if (rowIndex > 0) {
tableHtml += '<tr class="process-route-spacer"><td colspan="' + (maxPerRow * 2 - 1) + '"></td></tr>'
}
tableHtml += '<tr>'
rowProcesses.forEach((process, index) => {
const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses)
const planDate = this.formatProcessRouteDate(process.计划开始时间 || process.计划完成时间 || '')
tableHtml += `<td class="process-route-date ${className}">${this.escapeProcessHtml(planDate)}</td>`
if (index < rowProcesses.length - 1) {
tableHtml += '<td class="process-route-arrow-hidden"></td>'
}
})
tableHtml += '</tr>'
tableHtml += '<tr>'
rowProcesses.forEach((process, index) => {
const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses)
const name = this.getProcessRouteName(process)
tableHtml += `<td class="${className}">${this.escapeProcessHtml(name)}</td>`
if (index < rowProcesses.length - 1) {
tableHtml += '<td class="process-route-arrow">→</td>'
}
})
tableHtml += '</tr>'
tableHtml += '<tr>'
rowProcesses.forEach((process, index) => {
const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses)
const count = this.toProcessNumber(process.收检合格数)
tableHtml += `<td class="process-route-count ${className}">合格${this.escapeProcessHtml(count)}</td>`
if (index < rowProcesses.length - 1) {
tableHtml += '<td class="process-route-arrow-hidden"></td>'
}
})
tableHtml += '</tr>'
}
tableHtml += '</tbody></table></div>'
return tableHtml
},
mergeOrderData(dataList) {
// 第一步:先按照订单行号对原始数据进行排序
const sortedDataList = [...dataList].sort((a, b) => {
const rowA = parseInt(a.订单行号 || 0)
const rowB = parseInt(b.订单行号 || 0)
return rowA - rowB
})
const orderMap = new Map()
sortedDataList.forEach((item, index) => {
const orderNumber = item.订单号
if (!orderMap.has(orderNumber)) {
// 判断该工序是否外协
const isOutsource = item.指派对象 && item.指派对象.includes('外协')
orderMap.set(orderNumber, {
...item,
当前序: '',
开工时间: 0,
序检: item.序检,
是否外协: isOutsource, // 新增:记录订单是否包含外协
子数据: [{
工序名称: item.工序名称,
指派对象: item.指派对象,
计划完成时间: item.计划完成时间,
计划开始时间: item.计划开始时间,
进度: item.进度,
拆分内码: item.拆分内码,
计划数量: item.计划数量,
开工时间: item.开工时间,
完成数量: item.完成数量,
收料数量: item.收料数量,
收检合格数: item.收检合格数,
收检不合格数: item.收检不合格数,
任务状态: item.任务状态,
加工状态: item.加工状态,
终检: item.终检,
是否外协: isOutsource, // 新增:记录该工序是否外协
绿: 0,
: 0,
: 0,
订单行号: item.订单行号,
加急总数:item.加急总数,
外协结束时间:item.外协结束时间,
开始时间:item.开始时间,
外协分组: item.外协分组
}]
})
} else {
const existingItem = orderMap.get(orderNumber)
// 判断该工序是否外协
const isOutsource = item.指派对象 && item.指派对象.includes('外协')
// 如果发现外协工序,更新订单的外协状态
if (isOutsource) {
existingItem.是否外协 = true
}
// 插入子数据时保持排序
existingItem.子数据.push({
工序名称: item.工序名称,
指派对象: item.指派对象,
计划完成时间: item.计划完成时间,
计划开始时间: item.计划开始时间,
进度: item.进度,
拆分内码: item.拆分内码,
计划数量: item.计划数量,
开工时间: item.开工时间,
完成数量: item.完成数量,
收料数量: item.收料数量,
收检合格数: item.收检合格数,
收检不合格数: item.收检不合格数,
任务状态: item.任务状态,
加工状态: item.加工状态,
终检: item.终检,
是否外协: isOutsource, // 新增:记录该工序是否外协
绿: 0,
: 0,
: 0,
订单行号: item.订单行号,
加急总数:item.加急总数,
开始时间:item.开始时间,
结束时间:item.结束时间,
外协结束时间:item.外协结束时间,
外协分组: item.外协分组
})
// 对子数据按照订单行号排序
existingItem.子数据.sort((a, b) => {
const rowA = parseInt(a.订单行号 || 0)
const rowB = parseInt(b.订单行号 || 0)
return rowA - rowB
})
existingItem.子数据.forEach((element, index) => {
if (new Date(element.开工时间) > new Date('1900-01-01 00:00:00')) {
element.绿 = 1
} else {
element.绿 = 0
}
if (element.进度 == 100) {
element. = 1
element.绿 = 0
} else {
element. = 0
}
if (index > 0) {
if (new Date(element.开工时间) == new Date('1900-01-01 00:00:00') && existingItem.子数据[index - 1].进度 == 100) {
element. = 1
element.绿 = 0
} else {
element. = 0
}
}
})
if (item.收检合格数 > 0) {
existingItem.当前序 = item.工序名称
}
if (item.优先级 == '是') {
existingItem.优先级 = item.优先级
}
if (item.终检 == '是') {
existingItem.终检 = item.终检
}
if (new Date(item.开工时间) > new Date('1900-01-01 00:00:00')) {
existingItem.开工时间 = 1
}
// 确保加急状态正确传递
if (item.加急状态 === '加急') {
existingItem.加急状态 = '加急'
}
}
})
// 应用过滤条件
let filteredData = Array.from(orderMap.values()).map(item => ({
订单号: item.订单号,
合同号: item.合同号,
产品编码: item.产品编码,
产品名称: item.产品名称,
计划数量订单: item.计划数量订单,
要求完工日期: item.要求完工日期,
排产状态: item.排产状态,
优先级: item.优先级,
当前序: item.当前序,
工艺路线: item.工艺路线,
计划数量: item.计划数量,
开工时间: item.开工时间,
序检: item.序检,
子数据: item.子数据,
加急状态: item.加急状态,
终检: item.终检,
计划号: item.计划号,
拣配状态: item.拣配状态,
是否外协: item.是否外协, // 新增:是否外协订单
加急数量: item.加急数量,
加急总数: item.加急总数,
入库数量: item.入库数量,
}))
// 应用外协过滤
if (this.outsourceStatus !== '全部') {
const isOutsource = this.outsourceStatus === '是'
filteredData = filteredData.filter(item => item.是否外协 === isOutsource)
}
// 应用加急过滤
if (this.urgentStatus !== '全部') {
const isUrgent = this.urgentStatus === '加急'
filteredData = filteredData.filter(item =>
isUrgent ? item.加急状态 === '加急' : (!item.加急状态 || item.加急状态 !== '加急')
)
}
this.tableData = filteredData
},
searchTable() {
this.loading = true
this.tableData = []
var param = []
param.push(['订单号', this.orderNo || 0])
param.push(['物料类型', '自制件'])
param.push(['合同号', this.contractNo])
param.push(['产品编码', this.productCode])
param.push(['产品名称', this.productName])
param.push(['工序名称', this.processName])
param.push(['计划开始1', this.planStartTime[0]])
param.push(['计划开始2', this.planStartTime[1]])
param.push(['计划完成1', this.planendTime[0]])
param.push(['计划完成2', this.planendTime[1]])
param.push(['要求完工日期1', this.completionTime ? this.completionTime[0] : ''])
param.push(['要求完工日期2', this.completionTime ? this.completionTime[1] : ''])
param.push(['排产状态', this.productionStatus])
param.push(['自制件属性', this.selfStatus])
param.push(['指派对象', '全部'])
param.push(['计划号', this.plannum])
param.push(['加急状态', this.urgentStatus])
param.push(['单据状态', this.orderStatus])
// // 添加外协状态过滤条件
// if (this.outsourceStatus !== '全部') {
// param.push(['是否外协', this.outsourceStatus === '是' ? 1 : 0])
// }
var Data = this.CreateData('11', '生产管理_生产计划跟踪', param)
this.ExecDatabase(Data).then(response => {
this.loading = false
if (response.data.length !== 0) {
this.mergeOrderData(response.data)
}
}).catch(() => {
this.loading = false
})
},
// 其他方法保持不变...
handleRowClick(row) {
this.selectedRow = row
},
editTask(row) {
this.currentRow = row
this.editForm = {
优先级: row.优先级 || '',
未完成说明: row.未完成说明 || '',
派工特殊说明: row.派工特殊说明 || ''
}
this.editDialogVisible = true
},
submitEditForm() {
this.editSubmitLoading = true
const params = []
params.push(['订单号', this.currentRow.订单号])
params.push(['订单行号', this.currentRow.订单行号])
params.push(['订单拆分内码', this.currentRow.拆分内码])
params.push(['优先级', this.editForm.优先级])
params.push(['未完成说明', this.editForm.未完成说明])
params.push(['派工特殊说明', this.editForm.派工特殊说明])
params.push(['最后编辑人', this.$store.state.user.name])
const Data = this.CreateData('12', 'MES_OrderPlanned_DescriptionEdit', params)
this.ExecDatabase(Data).then(() => {
this.$message.success('保存成功')
this.editDialogVisible = false
this.searchTable()
}).catch(() => {
this.$message.error('保存失败')
}).finally(() => {
this.editSubmitLoading = false
})
},
handleOutsourceNotify(row) {
this.$confirm('确认同计划发起外协通知吗?', '确认', {
confirmButtonText: '是',
cancelButtonText: '否',
type: 'warning',
center: true
}).then(() => {
this.$message.success('外协通知已发送')
}).catch(() => {
})
},
openSplitTask() {
if (!this.selectedRow) {
this.$message.warning('请先选择需要操作的行')
return
}
this.getStationList()
this.splitTaskForm = {
分配数量: this.selectedRow.计划数量 || 0,
指派对象: this.selectedRow.指派对象 || '',
指派对象编号: this.selectedRow.指派对象编号 || '',
派工特殊备注: this.selectedRow.派工特殊说明 || '',
计划开始时间: this.selectedRow.计划开始时间 || '',
计划结束时间: this.selectedRow.计划完成时间 || '',
最晚开始时间: this.selectedRow.最晚开始时间 || '',
任务概述: this.selectedRow.计划数量 || ''
}
this.splitTaskDialogVisible = true
},
submitSplitTaskForm() {
this.splitTaskSubmitLoading = true
this.$confirm('确认要拆分子任务吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// 空逻辑
this.splitTaskSubmitLoading = false
this.splitTaskDialogVisible = false
this.$message.success('操作成功')
this.searchTable()
}).catch(() => {
this.splitTaskSubmitLoading = false
this.$message.info('已取消操作')
})
},
getStationList() {
const params = []
const Data = this.CreateData('11', 'Prog_MES_LoadStations', params)
this.ExecDatabase(Data).then(response => {
if (response.data && response.data.length > 0) {
this.stationOptions = response.data.map(item => ({
label: item.OPName,
value: item.OPName,
code: item.VisCode
}))
}
})
},
handleStationChange(value) {
const selected = this.stationOptions.find(item => item.value === value)
if (selected) {
this.splitTaskForm.指派对象编号 = selected.code
}
}
}
}
</script>
<style scoped>
::v-deep .el-table th.el-table__cell>.cell{
white-space: pre-wrap;
}
.process{
width: 120px;
display: inline-flex;
}
.process-route {
line-height: 1.4;
white-space: normal;
word-break: break-all;
}
::v-deep .process-route-wrap {
width: 100%;
text-align: left;
}
::v-deep .process-route-table {
width: auto;
border-collapse: collapse;
text-align: left;
table-layout: auto;
}
::v-deep .process-route-table td {
text-align: left;
padding: 2px 2px;
font-size: 11px;
white-space: nowrap;
line-height: 1.4;
}
::v-deep .process-route-date {
font-size: 10px !important;
color: #8899aa !important;
padding: 2px 2px !important;
}
::v-deep .process-route-count {
font-weight: 700;
font-size: 12px !important;
}
::v-deep .process-route-spacer td {
height: 4px;
padding: 0 !important;
line-height: 1 !important;
}
::v-deep .process-route-green {
color: #28d961;
font-weight: 700;
}
::v-deep .process-route-blue {
color: #09a8ff;
font-weight: 700;
}
::v-deep .process-route-red {
color: #ff3f37;
font-weight: 700;
}
::v-deep .process-route-arrow {
color: rgba(0, 164, 255, 0.6) !important;
font-size: 10px !important;
padding: 2px 0 !important;
width: 8px;
text-align: center !important;
}
::v-deep .process-route-arrow-hidden {
padding: 2px 0 !important;
width: 8px;
}
.search-container {
margin-bottom: 20px;
}
.show-text {
margin-right: 5px;
line-height: 32px;
}
.status-light {
display: inline-block;
width: 12px;
height: 12px;
border-radius: 50%;
}
.status-light-green {
background-color: #67C23A;
}
.status-light-gray {
background-color: #909399;
}
.dialog-footer {
text-align: right;
}
::v-deep .warning-row {
background-color: #67c23a !important;
}
::v-deep .error-row {
background-color: #409eff !important;
}
::v-deep .success-row {
background-color: #f2a201 !important;
}
::v-deep .el-table td.el-table__cell{
border: 0;
}
.info-container {
border: 1px solid #ccc;
display: flex;
}
.info-item {
display: flex;
flex: 1;
border-right: 1px solid #ccc;
}
.info-item:last-child {
border-right: none;
}
.info-label {
width: 30%;
padding: 8px;
background-color: #f5f7fa;
border-right: 1px solid #ccc;
}
.info-value {
flex: 1;
padding: 5px;
}
.info-label,
.info-value {
display: flex;
align-items: center;
}
.el-table tr{
background-color: initial;
}
</style>

View File

@@ -18,7 +18,7 @@
/>
&nbsp;&nbsp;
<span class="show-text">设备:</span>
<el-select v-model="equipmentType" placeholder="请选择设备" filterable size="small" style="width:200px" @change="searchTable" >
<el-select v-model="equipmentType" placeholder="请选择设备" filterable size="small" style="width:100px" @change="searchTable" >
<el-option
v-for="item in basedatalx"
:key="item.id"
@@ -43,7 +43,7 @@
</el-table-column>
<el-table-column label="参数值" align="center">
<template slot-scope="scope">
{{ scope.row.参数值 }}
{{ scope.row.参数值 }}{{ scope.row.参数单位 }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="100px">
@@ -53,7 +53,7 @@
</el-table-column>
</el-table>
</div>
<div style="width: 600px;margin-left: 5px">
<div style="width: 800px;margin-left: 5px">
<el-table v-if="dataType === 1" :data="tableData1" v-loading="loading" border size="small" stripe highlight-current-row height="740px" >
<el-table-column label="开始时间" prop="Zone" align="center" width="150px" >
<template slot-scope="scope">
@@ -70,29 +70,130 @@
{{ scope.row.状态名称 }}
</template>
</el-table-column>
<el-table-column label="时长(m)" align="center">
<el-table-column label="时长(min)" align="center">
<template slot-scope="scope">
{{ scope.row.累计分钟数 }}
</template>
</el-table-column>
</el-table>
<el-table v-if="dataType === 2" :data="tableData1" border size="small" stripe highlight-current-row height="740px" >
<el-table-column label="订单编号" prop="Zone" align="center" width="150px" >
<div v-if="dataType === 2">
<span class="show-text">订单编号:</span>
<el-input
v-model="orderNo"
placeholder="请输入订单编号"
clearable
style="width: 150px; margin-right: 10px"
/>
<el-button type="primary" icon="el-icon-search" size="small" style="margin-left: 20px" plain @click="handleSearch(currentRow)">查询</el-button>
<el-table :data="tableData1" border size="small" stripe highlight-current-row height="700px" style="margin-top: 5px" >
<el-table-column label="订单编号" prop="Zone" align="center" width="100px" >
<template slot-scope="scope">
{{ scope.row.订单编号 }}
</template>
</el-table-column>
<el-table-column label="加工时长(min)" prop="TagName" align="center">
<template slot-scope="scope">
{{ scope.row.循环时间 }}
</template>
</el-table-column>
<el-table-column label="换件时长(min)" prop="TagName" align="center">
<template slot-scope="scope">
{{ scope.row.换件时间 }}
</template>
</el-table-column>
<el-table-column label="采集时间" align="center" width="150px" >
<template slot-scope="scope">
{{ scope.row.采集时间 }}
</template>
</el-table-column>
</el-table>
<div class="block" style="margin-top: 10px;">
<el-pagination
:current-page="pageCurrent"
:page-sizes="[20, 40, 50, 100]"
:page-size="pageSize"
:total="total"
:small="true"
layout="total, sizes, prev, pager, next"
@size-change="handleSizeChanges"
@current-change="handleCurrentChanges"/>
</div>
</div>
<el-table v-if="dataType === 3" :data="tableData1" border size="small" stripe highlight-current-row height="740px" >
<el-table-column label="订单编号" prop="Zone" align="center" width="100px" >
<template slot-scope="scope">
{{ scope.row.订单编号 }}
</template>
</el-table-column>
<el-table-column label="加工时长" prop="TagName" align="center">
<el-table-column label="程序时长(min)" prop="Zone" align="center" width="120px" >
<template slot-scope="scope">
{{ scope.row.循环时间 }}
<span style="color: #0ba9e3">{{ scope.row.程序时长 }}</span>
</template>
</el-table-column>
<el-table-column label="采集时间" align="center" width="150px" >
<el-table-column label="最小时长(min)" prop="Zone" align="center" width="120px" >
<template slot-scope="scope">
{{ scope.row.采集时间 }}
{{ scope.row.最小时长 }}
</template>
</el-table-column>
<el-table-column label="最大时长(min)" prop="Zone" align="center" width="120px" >
<template slot-scope="scope">
{{ scope.row.最大时长 }}
</template>
</el-table-column>
<!-- <el-table-column label="频次/总数" prop="Zone" align="center" >-->
<!-- <template slot-scope="scope">-->
<!-- {{ scope.row.频次 }} / {{ scope.row.总记录数 }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="产品编码" prop="Zone" align="center">
<template slot-scope="scope">
{{ scope.row.产品编码 }}
</template>
</el-table-column>
<el-table-column label="产品名称" prop="Zone" align="center" >
<template slot-scope="scope">
{{ scope.row.产品名称 }}
</template>
</el-table-column>
</el-table>
<el-table v-if="dataType === 4" :data="tableData1" border size="small" stripe highlight-current-row height="740px" >
<el-table-column label="订单编号" prop="Zone" align="center" width="100px" >
<template slot-scope="scope">
{{ scope.row.订单编号 }}
</template>
</el-table-column>
<el-table-column label="换件时长(min)" prop="Zone" align="center" width="120px" >
<template slot-scope="scope">
<span style="color: #0ba9e3">{{ scope.row.换件时长 }}</span>
</template>
</el-table-column>
<el-table-column label="最小时长(min)" prop="Zone" align="center" width="120px" >
<template slot-scope="scope">
{{ scope.row.最小时长 }}
</template>
</el-table-column>
<el-table-column label="最大时长(min)" prop="Zone" align="center" width="120px" >
<template slot-scope="scope">
{{ scope.row.最大时长 }}
</template>
</el-table-column>
<!-- <el-table-column label="频次/总数" prop="Zone" align="center" >-->
<!-- <template slot-scope="scope">-->
<!-- {{ scope.row.频次 }} / {{ scope.row.总记录数 }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="产品编码" prop="Zone" align="center" >
<template slot-scope="scope">
{{ scope.row.产品编码 }}
</template>
</el-table-column>
<el-table-column label="产品名称" prop="Zone" align="center" >
<template slot-scope="scope">
{{ scope.row.产品名称 }}
</template>
</el-table-column>
</el-table>
</div>
</div>
@@ -120,6 +221,7 @@ export default {
completionTime: [],
routineCheckType: [],
dataType: 0,
orderNo: '',
loading: false,
dialogFormVisible: false,
title: '',
@@ -146,6 +248,7 @@ export default {
设备类型: [{ required: true, message: '请选择' }]
},
original: '',
currentRow: null,
total: 0, // 分页总数
tableData: [], // 设备信息表
tableData1: [], // 设备信息表
@@ -274,16 +377,31 @@ export default {
this.loading = true
this.tableData1 = []
this.dataType = row.数据类型
this.currentRow = row
var param = []
param.push(['PageCurrent', this.pageCurrent])
param.push(['PageSize', this.pageSize])
param.push(['PageCount', '1111', 'int', '1'])
param.push(['ItemCount', '1111', 'int', '1'])
param.push(['开始时间', this.completionTime[0]])
param.push(['结束时间', this.completionTime[1]])
param.push(['设备名称', this.equipmentType])
param.push(['参数名称', row.参数名称])
param.push(['数据类型', row.数据类型])
param.push(['订单编号', this.orderNo])
var Data = this.CreateData('11', '设备管理_设备数据_统计数据查询_通过类型', param)
this.ExecDatabase(Data).then(response => {
this.loading = false
this.tableData1 = row.数据类型 === 1 ? this.mergeContinuousStatus(response.data) : response.data
console.log(response.data)
if (row.数据类型 === 1) {
this.tableData1 = this.mergeContinuousStatus(response.data.result)
} else if (row.数据类型 === 2) {
this.tableData1 = response.data.result
this.total = parseInt(response.data.output[0].ItemCount)
} else {
this.tableData1 = response.data.result
}
// this.tableData = response.data.result
// this.total = parseInt(response.data.output[0].ItemCount)
}).catch(() => {
@@ -293,11 +411,11 @@ export default {
handleSizeChanges(val) {
this.pageCurrent = 1
this.pageSize = val
this.searchTable()
this.handleSearch(this.currentRow)
},
handleCurrentChanges(val) {
this.pageCurrent = val
this.searchTable()
this.handleSearch(this.currentRow)
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -213,7 +213,7 @@
</el-button>
</template>
</el-table-column>
<el-table-column align="center" prop="备注" label="备注" width="150" />
<el-table-column align="center" prop="备注" label="备注" width="150" show-overflow-tooltip />
<el-table-column align="center" prop="未完成说明" label="未完成说明" width="120" />
<el-table-column align="center" prop="派工特殊说明" label="派工特殊备注" width="120" />
<el-table-column align="center" label="编辑" width="120">
@@ -221,6 +221,8 @@
<el-button type="text" size="mini" @click="editRemark(scope.row)">编辑</el-button>
</template>
</el-table-column>
<el-table-column align="center" prop="行文本备注" label="工艺备注" width="120" />
<el-table-column align="center" prop="任务概述" label="工艺说明" width="120" />
<el-table-column align="center" label="二次派工" width="200">
<template slot-scope="scope">
<el-select

View File

@@ -15,16 +15,16 @@
<el-input v-model="doneprocessName" placeholder="请输入工序名称" clearable style="width: 150px;margin-right: 10px" />
<br>
<br>
<span class="show-text">排产状态:</span>
<!-- <span class="show-text">排产状态:</span>
<el-select v-model="doneproductionStatus" clearable placeholder="请选择状态" style="width: 150px;margin-right: 10px">
<el-option label="全部" value="全部" />
<el-option label="已完成" value="已完成" />
<el-option label="未完成" value="未完成" />
</el-select>
</el-select> -->
<span class="show-text">要求完工日期:</span>
<el-date-picker
v-model="completionTime"
:clearable="false"
end-placeholder="结束时间"
format="yyyy-MM-dd"
popper-class="virtual-cell-time-picker"
@@ -36,26 +36,21 @@
<span class="show-text">计划开始:</span>
<el-date-picker
v-model="planStartTime"
:clearable="false"
end-placeholder="结束时间"
format="yyyy-MM-dd"
popper-class="virtual-cell-time-picker"
range-separator="-"
start-placeholder="开始时间"
style="width: 280px;vertical-align: top"
type="datetimerange"
placeholder="计划开始时间"
style="width: 150px;
vertical-align: top"
type="date"
value-format="yyyy-MM-dd" />
<span class="show-text">计划完成:</span>
<el-date-picker
v-model="planendTime"
:clearable="false"
end-placeholder="结束时间"
format="yyyy-MM-dd"
popper-class="virtual-cell-time-picker"
range-separator="-"
start-placeholder="开始时间"
style="width: 280px;vertical-align: top"
type="datetimerange"
placeholder="计划完成时间"
style="width: 150px;
vertical-align: top"
type="date"
value-format="yyyy-MM-dd" />
<el-button :disabled="loading" icon="el-icon-search" plain type="primary" @click="donesearchTable()">查询</el-button>
</div>
@@ -185,8 +180,10 @@
@click="getitemdata(scope.row.订单号)">查看</el-button>
</template>
</el-table-column>
<el-table-column align="center" prop="备注" label="备注" width="150" />
<el-table-column align="center" label="最晚开始" width="160">
<el-table-column align="center" prop="备注" label="备注" width="150" show-overflow-tooltip/>
<el-table-column align="center" prop="行文本备注" label="工艺备注" width="120" />
<el-table-column align="center" prop="任务概述" label="工艺说明" width="120" />
<!-- <el-table-column align="center" label="最晚开始" width="160">
<el-date-picker
v-model="scope.row.最晚开始时间"
type="date"
@@ -197,7 +194,7 @@
value-format="yyyy-MM-dd"
@change = "editlateTask">
</el-date-picker>
</el-table-column>
</el-table-column> -->
<!-- <el-table-column align="center" label="派工" width="100">
<template slot-scope="scope">
<el-button type="primary" size="mini"
@@ -375,8 +372,8 @@ export default {
station:'全部',
completids:[],
completionTime: [],
planStartTime: [],
planendTime: [],
planStartTime: '',
planendTime: '',
loading: false,
tableData: [],
donetableData: [],
@@ -770,13 +767,11 @@ export default {
// param.push(['性质', this.nature])
param.push(['要求完工日期1', this.completionTime[0]])
param.push(['要求完工日期2', this.completionTime[1]])
param.push(['计划开始1', this.planStartTime[0]])
param.push(['计划开始2', this.planStartTime[1]])
param.push(['计划完成1', this.planendTime[0]])
param.push(['计划完成2', this.planendTime[1]])
param.push(['计划开始', this.planStartTime])
param.push(['计划完成', this.planendTime])
param.push(['排产状态', this.productionStatus])
param.push(['指派对象', this.station])
var Data = this.CreateData('11', 'MES_OrderPlanned_Query', param,this.pageSize, this.pageCurrent)
var Data = this.CreateData('11', '机加已排产_获取任务列表', param,this.pageSize, this.pageCurrent)
this.ExecDatabase(Data).then(response => {
this.loading = false
@@ -825,16 +820,13 @@ export default {
param.push(['产品编码', this.doneproductCode])
param.push(['产品名称', this.doneproductName])
param.push(['工序名称', this.doneprocessName])
// param.push(['性质', this.donenature])
param.push(['要求完工日期1', this.completionTime[0]])
param.push(['要求完工日期2', this.completionTime[1]])
param.push(['计划开始1', this.planStartTime[0]])
param.push(['计划开始2', this.planStartTime[1]])
param.push(['计划完成1', this.planendTime[0]])
param.push(['计划完成2', this.planendTime[1]])
param.push(['计划开始', this.planStartTime])
param.push(['计划完成', this.planendTime])
param.push(['排产状态', this.doneproductionStatus])
param.push(['指派对象', this.station])
var Data = this.CreateData('11', 'MES_OrderPlanned_Query', param,this.pageSize, this.pageCurrent)
var Data = this.CreateData('11', '机加已排产_获取任务列表', param,this.pageSize, this.pageCurrent)
this.ExecDatabase(Data).then(response => {
this.loading = false
@@ -1491,4 +1483,5 @@ export default {
.el-picker-panel__icon-btn{
padding: 0;
}
</style>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -734,6 +734,7 @@ export default {
var orderids = []
var ordernums = []
var orderitems = []
multipleSelection.forEach(item => {
if(item.标准工艺 == 1 & item.生产工艺 !=1 ){
orderids.push(item.订单编号)
@@ -749,7 +750,7 @@ export default {
param.push(['订单编号',orderids])
param.push(['零件图号',orderitems])
param.push(['计划数量',ordernums])
console.log(param)
var Data = this.CreateData('12', '工艺管理_零件工序_生产工艺_批量生成生产工艺', param)
this.ExecDatabase(Data).then(response => {
this.searchTable()
@@ -1141,6 +1142,7 @@ export default {
this.ExecDatabase(Data1).then(response => {
param1[0] = ['物料编号', this.selectedRow.物料编号]
param1[1] = ['订单编号', this.selectedRow.订单编号]
this.$message.success('操作成功')
// 参数数量与名称要与存储过程对应
// var Data3 = this.CreateData('11', '工艺管理_生产工艺_查询生产工艺', param1)
// this.ExecDatabase(Data3).then(response => {

View File

@@ -796,6 +796,7 @@ export default {
this.ExecDatabase(Data1).then(response => {
var param3 = []
param3[0] = ['物料编号', this.partNameValue3]
this.$message.success('保存成功')
// 参数数量与名称要与存储过程对应
// var Data3 = this.CreateData('11', '车间生产管理工艺_零件工序_查询工序信息_工艺库', param3)
// this.ExecDatabase(Data3).then(response => {

File diff suppressed because it is too large Load Diff

View File

@@ -43,6 +43,13 @@
clearable
style="width: 150px; margin-right: 10px"
/>
<span class="show-text">物料名称:</span>
<el-input
v-model="productname2"
placeholder="请输入零件名称"
clearable
style="width: 150px; margin-right: 10px"
/>
<!-- <span class="show-text">计划开工:</span>
<el-date-picker
v-model="completionTime"
@@ -259,6 +266,14 @@
prop="工序名称"
label="工序名称"
width="80"
/>
<el-table-column
align="center"
prop="上序合格数"
label="上序合格数"
width="80"
/>
<!-- <el-table-column align="center" label="开工时间" width="100">
<template slot-scope="scope">{{formatDate(scope.row.开工时间)}}</template>
@@ -1442,7 +1457,7 @@
<el-input
v-model="item.编码"
size="mini"
style="width: 300px"
style="width: 250px"
readonly
/>
</span>
@@ -1453,7 +1468,7 @@
<el-input
v-model="item.数量"
size="mini"
style="width: 200px"
style="width: 100px"
readonly
/>
</span>
@@ -1464,7 +1479,18 @@
<el-input
v-model="item.退库数量"
size="mini"
style="width: 200px"
style="width: 100px"
/>
</span>
</div>
<div class="info-item">
<span class="info-label">备注</span>
<span class="info-value">
<el-input
v-model="item.LineText"
size="mini"
style="width: 100px"
/>
</span>
@@ -1825,6 +1851,7 @@ export default {
salenum:'',
contractNo: "",
productCode2: "",
productname2: "",
process: "",
processList2: [],
nature: "",
@@ -2703,6 +2730,7 @@ getUserId() {
param.push(["TaskAID", this.TaskAID || 0]);
param.push(["订单号", this.orderNo2 || 0]);
param.push(["零件编号", this.productCode2]);
param.push(["零件名称", this.productname2]);
param.push(["计划开工_Start", ""]);
param.push(["计划开工_End", ""]);
param.push(["生产状态", this.productionStatus2 || -1]);
@@ -3662,9 +3690,9 @@ async workendForm() {
['数量', element.退库数量],
['单位', element.单位],
['批次信息', element.批次信息],
['最后编辑人', this.$store.state.user.name]
['最后编辑人', this.$store.state.user.name],
['备注', element.LineText]
];
console.log(param)
return this.CreateData('12', '生产管理_加工中心_退库', param);
});

View File

@@ -2513,7 +2513,7 @@
<el-dialog
:visible.sync="ReturnWarehousepop"
title="退库单"
width="1300px"
width="1500px"
center
:close-on-click-modal="false"
>
@@ -2521,7 +2521,7 @@
<el-form-item v-for="item in ReturnWarehouseForm" :key="item.编码" >
<div class="info-container" >
<div class="info-item">
<span class="info-label">物料名称</span>
<span class="info-label" style="width: 80px">物料名称</span>
<span class="info-value">
<el-input
v-model="item.名称"
@@ -2532,22 +2532,43 @@
</span>
</div>
<div class="info-item">
<span class="info-label">物料编码</span>
<span class="info-label" style="width: 80px">物料编码</span>
<span class="info-value">
<el-input
v-model="item.编码"
size="mini"
readonly
style="width: 300px"
style="width: 250px"
/>
</span>
</div>
<div class="info-item">
<span class="info-label">数量</span>
<span class="info-label" style="width: 80px">发料数量</span>
<span class="info-value">
<el-input
v-model="item.数量"
size="mini"
style="width: 100px"
readonly
/>
</span>
</div>
<div class="info-item">
<span class="info-label" style="width: 80px">退库数量</span>
<span class="info-value">
<el-input
v-model="item.退库数量"
size="mini"
style="width: 100px"
/>
</span>
</div>
<div class="info-item">
<span class="info-label" style="width: 80px">备注</span>
<span class="info-value">
<el-input
v-model="item.LineText"
size="mini"
style="width: 200px"
/>
</span>
@@ -2569,7 +2590,7 @@
<el-dialog
:visible.sync="MaterialRequisitionpop"
title="领料单"
width="900px"
width="1200px"
center
:close-on-click-modal="false"
>
@@ -2577,23 +2598,44 @@
<el-form-item v-for="item in MaterialRequisitionForm.lines" :key="item.ItemNo" >
<div class="info-container" >
<div class="info-item">
<span class="info-label">物料名称</span>
<span class="info-label" style="width: 80px">物料名称</span>
<span class="info-value">
<el-input
v-model="item.ItemName"
size="mini"
readonly
style="width: 300px"
style="width: 200px"
/>
</span>
</div>
<div class="info-item">
<span class="info-label">数量</span>
<span class="info-label" style="width: 80px">物料编码</span>
<span class="info-value">
<el-input
v-model="item.ItemNo"
size="mini"
readonly
style="width: 250px"
/>
</span>
</div>
<div class="info-item">
<span class="info-label" style="width: 80px">数量</span>
<span class="info-value">
<el-input
v-model="item.Quantity"
size="mini"
style="width: 200px"
style="width: 150px"
/>
</span>
</div>
<div class="info-item">
<span class="info-label" style="width: 80px">备注</span>
<span class="info-value">
<el-input
v-model="item.LineText"
size="mini"
style="width: 150px"
/>
</span>
</div>
@@ -6394,7 +6436,10 @@ submitNewProcess() {
var Data = this.CreateData('11', '生产管理_加工中心_生产发料查询', param)
this.ExecDatabase(Data).then(response => {
console.log(response)
this.ReturnWarehouseForm = response.data
this.ReturnWarehouseForm = response.data.map(element => ({
...element,
退库数量: 0
}))
})
},
async MaterialRequisition(){
@@ -6489,16 +6534,17 @@ submitNewProcess() {
},
async submitReturnWare() {
const validData = this.ReturnWarehouseForm
.filter(element => element.数量 != 0)
.filter(element => element.退库数量 != 0)
.map(element => {
const param = [
['生产订单号', element.生产订单号],
['编码', element.编码],
['名称', element.名称],
['数量', element.数量],
['数量', element.退库数量],
['单位', element.单位],
['批次信息', element.批次信息],
['最后编辑人', this.$store.state.user.name]
['最后编辑人', this.$store.state.user.name],
['备注', element.LineText]
];
return this.CreateData('12', '生产管理_加工中心_退库', param);
});
@@ -6544,6 +6590,7 @@ submitNewProcess() {
param2.push(["external_num", item.DocumentAbsoluteEntry])
param2.push(["item_code", item.ItemNo]);
param2.push(["item_name", item.ItemName]);
param2.push(["line_memo", item.LineText]);
param2.push(["whs_code", ""]);
param2.push(["manage_type", 'B']);
param2.push(["price", 0]);

View File

@@ -87,6 +87,7 @@
@row-click="handleRowClick">
<el-table-column type="selection" width="50"></el-table-column>
<el-table-column label="序号" type="index" align="center" width="50"/>
<el-table-column label="状态" align="center" prop="单据状态" width="80" />
<el-table-column label="生产订单" align="center" prop="订单号" width="80" />
<el-table-column label="计划号" align="center" prop="计划号" width="80" />
<el-table-column label="工序名称" align="center" prop="工序名称" width="120"/>
@@ -1404,6 +1405,7 @@ shouldIncludeByExecutionStatus(mergedItem) {
this.$message.error('数量输入错误4')
return
}
this.receiveVisible = false;
// 获取订单行号最大的TaskAID
const maxTaskAID = this.getMaxOrderLineTaskAID(row);
params.push(["TaskAID", maxTaskAID]);
@@ -1441,7 +1443,7 @@ shouldIncludeByExecutionStatus(mergedItem) {
this.$message.error('数量输入错误')
return
}
this.doVisible = false;
// 获取订单行号最大的TaskAID
const maxTaskAID = this.getMaxOrderLineTaskAID(row);
params.push(["TaskAID", maxTaskAID]);

View File

@@ -135,7 +135,7 @@ export default {
},
mounted() {
this.searchTable()
// this.searchTable()
},
methods: {

View File

@@ -32,6 +32,12 @@
<el-option label="加急" value="加急" />
<el-option label="正常" value="正常" />
</el-select>
<span class="show-text">单据状态:</span>
<el-select v-model="orderStatus" clearable placeholder="请选择单据状态" style="width: 150px;margin-right: 10px">
<el-option label="全部" value="全部" />
<el-option label="关闭" value="关闭" />
<el-option label="正常" value="正常" />
</el-select>
<!-- 其他搜索条件保持不变 -->
<el-button :disabled="loading" icon="el-icon-search" plain type="primary" @click="searchTable()">查询</el-button>
@@ -48,6 +54,7 @@
<el-table-column align="center" label="序号" type="index" width="50" />
<el-table-column align="center" label="工序名称" prop="工序名称" width="100" />
<el-table-column align="center" label="计划数量" prop="计划数量" width="100" />
<el-table-column align="center" label="标准工时" prop="标准工时" width="100" />
<el-table-column align="center" label="指派对象" prop="指派对象" width="100" />
<!-- 在子数据中显示外协标识 -->
<!-- <el-table-column align="center" label="外协" width="80">
@@ -86,7 +93,7 @@
<!-- 主表列定义 -->
<el-table-column align="center" label="序号" type="index" width="50" />
<el-table-column align="center" prop="合同号" label="销售订单" width="120" />
<el-table-column align="center" prop="计划号" label="计划号" width="120" />
<el-table-column align="center" prop="订单号" label="生产订单" width="100" />
<el-table-column align="center" prop="产品编码" label="产品编码" width="220" />
<el-table-column align="center" prop="产品名称" label="产品名称" width="190" />
@@ -142,7 +149,12 @@
</template>
</el-table-column>
<el-table-column align="center" prop="当前序" label="当前序" width="80" />
<el-table-column align="center" prop="工艺路线" label="工艺路线" width="180" />
<el-table-column align="center" label="工艺路线" width="550">
<template slot-scope="scope">
<div class="process-route" v-html="formatProcessRoute(scope.row)" />
</template>
</el-table-column>
<el-table-column align="center" prop="计划号" label="计划号" width="120" />
</el-table>
</el-card>
<el-dialog
@@ -214,6 +226,7 @@ export default {
// 新增过滤字段
outsourceStatus: '全部', // 外协状态
urgentStatus: '全部', // 加急状态
orderStatus:'正常',
completionTime: [],
loading: false,
tableData: [],
@@ -276,6 +289,199 @@ export default {
if (!date) return ''
return date.split(' ').length > 1 ? date.split(' ')[0] : date
},
formatProcessRouteDate(date) {
const formattedDate = this.formatDate(date)
const match = formattedDate.match(/^(\d{4})-(\d{2})-(\d{2})$/)
return match ? `${match[2]}-${match[3]}` : formattedDate
},
toProcessNumber(value) {
const num = Number(value)
return Number.isFinite(num) ? num : 0
},
escapeProcessHtml(value) {
return String(value == null ? '' : value)
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;')
},
isOutsourceProcess(process) {
return process.指派对象 === '外协' ||
String(process.工序名称 || '').includes('(外协)') ||
String(process.工序名称 || '').includes('(外协)')
},
getProcessStatusNum(status) {
const statusNum = parseInt(status)
if (Number.isFinite(statusNum)) {
return statusNum
}
const statusMap = {
辅助开始: 2,
辅助结束: 3,
开始加工: 4,
暂停: 5,
报工: 6,
装配加工: 4
}
return statusMap[status] || 0
},
isBlueProcess(process) {
const statusNum = this.getProcessStatusNum(process.加工状态)
const countNum = parseInt(process.收检合格数)
return statusNum === 6 || statusNum === 3 || countNum > 0
},
isGreenProcess(process) {
return this.isOutsourceProcess(process) &&
this.toProcessNumber(process.收料数量) > this.toProcessNumber(process.收检合格数) + this.toProcessNumber(process.收检不合格数)
},
getProcessBaseClass(process) {
if (this.isGreenProcess(process)) {
return 'process-route-green'
}
if (this.isBlueProcess(process)) {
return 'process-route-blue'
}
const statusNum = this.getProcessStatusNum(process.加工状态)
if (statusNum === 2 || statusNum === 4) {
return 'process-route-green'
}
return 'process-route-red'
},
getOutsourceGroupClassState(processes) {
const classes = new Map()
let currentIndexes = []
let lastProcess = null
const flushOutsourceRun = () => {
if (currentIndexes.length > 0 && lastProcess) {
const className = this.getProcessBaseClass(lastProcess)
currentIndexes.forEach(index => classes.set(index, className))
}
currentIndexes = []
lastProcess = null
}
const isSameContinuousGroup = process => {
if (!lastProcess) {
return true
}
const lineNo = this.toProcessNumber(process.订单行号)
const lastLineNo = this.toProcessNumber(lastProcess.订单行号)
return lineNo === lastLineNo + 1 &&
String(process.外协分组 || '') === String(lastProcess.外协分组 || '')
}
processes.forEach((process, index) => {
if (!this.isOutsourceProcess(process)) {
flushOutsourceRun()
return
}
if (!isSameContinuousGroup(process)) {
flushOutsourceRun()
}
currentIndexes.push(index)
lastProcess = process
})
flushOutsourceRun()
return classes
},
getProcessClass(process, index, outsourceGroupClasses) {
if (this.isOutsourceProcess(process)) {
return outsourceGroupClasses.get(index) || this.getProcessBaseClass(process)
}
return this.getProcessBaseClass(process)
},
getProcessRouteName(process) {
const name = String(process.工序名称 || '')
const assignee = String(process.指派对象 || '')
if (!assignee || name.includes(`(${assignee})`) || name.includes(`${assignee}`)) {
return name
}
return `${name}(${assignee})`
},
getRouteProcesses(row) {
if (Array.isArray(row.子数据) && row.子数据.length > 0) {
return row.子数据
}
return String(row.工艺路线 || '')
.split(',')
.map(name => name.trim())
.filter(Boolean)
.map(name => ({
工序名称: name,
加工状态: 0,
收检合格数: 0,
计划开始时间: '',
指派对象: '',
订单行号: 0,
收料数量: 0,
收检不合格数: 0
}))
},
formatProcessRoute(row) {
const processes = this.getRouteProcesses(row)
if (processes.length === 0) {
return ''
}
const outsourceGroupClasses = this.getOutsourceGroupClassState(processes)
const maxPerRow = 8
const rows = Math.ceil(processes.length / maxPerRow)
let tableHtml = '<div class="process-route-wrap"><table class="process-route-table"><tbody>'
for (let rowIndex = 0; rowIndex < rows; rowIndex++) {
const startIndex = rowIndex * maxPerRow
const endIndex = Math.min(startIndex + maxPerRow, processes.length)
const rowProcesses = processes.slice(startIndex, endIndex)
if (rowIndex > 0) {
tableHtml += '<tr class="process-route-spacer"><td colspan="' + (maxPerRow * 2 - 1) + '"></td></tr>'
}
tableHtml += '<tr>'
rowProcesses.forEach((process, index) => {
const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses)
const planDate = this.formatProcessRouteDate(process.计划开始时间 || process.计划完成时间 || '')
tableHtml += `<td class="process-route-date ${className}">${this.escapeProcessHtml(planDate)}</td>`
if (index < rowProcesses.length - 1) {
tableHtml += '<td class="process-route-arrow-hidden"></td>'
}
})
tableHtml += '</tr>'
tableHtml += '<tr>'
rowProcesses.forEach((process, index) => {
const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses)
const name = this.getProcessRouteName(process)
tableHtml += `<td class="${className}">${this.escapeProcessHtml(name)}</td>`
if (index < rowProcesses.length - 1) {
tableHtml += '<td class="process-route-arrow">→</td>'
}
})
tableHtml += '</tr>'
tableHtml += '<tr>'
rowProcesses.forEach((process, index) => {
const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses)
const count = this.toProcessNumber(process.收检合格数)
tableHtml += `<td class="process-route-count ${className}">合格${this.escapeProcessHtml(count)}</td>`
if (index < rowProcesses.length - 1) {
tableHtml += '<td class="process-route-arrow-hidden"></td>'
}
})
tableHtml += '</tr>'
}
tableHtml += '</tbody></table></div>'
return tableHtml
},
mergeOrderData(dataList) {
// 第一步:先按照订单行号对原始数据进行排序
const sortedDataList = [...dataList].sort((a, b) => {
@@ -307,6 +513,7 @@ export default {
进度: item.进度,
拆分内码: item.拆分内码,
计划数量: item.计划数量,
标准工时: item.标准工时,
开工时间: item.开工时间,
完成数量: item.完成数量,
收料数量: item.收料数量,
@@ -322,7 +529,8 @@ export default {
订单行号: item.订单行号,
加急总数:item.加急总数,
外协结束时间:item.外协结束时间,
开始时间:item.开始时间
开始时间:item.开始时间,
外协分组: item.外协分组
}]
})
} else {
@@ -345,6 +553,7 @@ export default {
进度: item.进度,
拆分内码: item.拆分内码,
计划数量: item.计划数量,
标准工时: item.标准工时,
开工时间: item.开工时间,
完成数量: item.完成数量,
收料数量: item.收料数量,
@@ -362,6 +571,7 @@ export default {
开始时间:item.开始时间,
结束时间:item.结束时间,
外协结束时间:item.外协结束时间,
外协分组: item.外协分组
})
// 对子数据按照订单行号排序
@@ -477,6 +687,7 @@ export default {
param.push(['指派对象', '全部'])
param.push(['计划号', this.plannum])
param.push(['加急状态', this.urgentStatus])
param.push(['单据状态', this.orderStatus])
// // 添加外协状态过滤条件
// if (this.outsourceStatus !== '全部') {
// param.push(['是否外协', this.outsourceStatus === '是' ? 1 : 0])
@@ -606,6 +817,78 @@ export default {
width: 120px;
display: inline-flex;
}
.process-route {
line-height: 1.4;
white-space: normal;
word-break: break-all;
}
::v-deep .process-route-wrap {
width: 100%;
text-align: left;
}
::v-deep .process-route-table {
width: auto;
border-collapse: collapse;
text-align: left;
table-layout: auto;
}
::v-deep .process-route-table td {
text-align: left;
padding: 2px 2px;
font-size: 11px;
white-space: nowrap;
line-height: 1.4;
}
::v-deep .process-route-date {
font-size: 10px !important;
color: #8899aa !important;
padding: 2px 2px !important;
}
::v-deep .process-route-count {
font-weight: 700;
font-size: 12px !important;
}
::v-deep .process-route-spacer td {
height: 4px;
padding: 0 !important;
line-height: 1 !important;
}
::v-deep .process-route-green {
color: #28d961;
font-weight: 700;
}
::v-deep .process-route-blue {
color: #09a8ff;
font-weight: 700;
}
::v-deep .process-route-red {
color: #ff3f37;
font-weight: 700;
}
::v-deep .process-route-arrow {
color: rgba(0, 164, 255, 0.6) !important;
font-size: 10px !important;
padding: 2px 0 !important;
width: 8px;
text-align: center !important;
}
::v-deep .process-route-arrow-hidden {
padding: 2px 0 !important;
width: 8px;
}
.search-container {
margin-bottom: 20px;
}
@@ -679,4 +962,7 @@ export default {
display: flex;
align-items: center;
}
</style>
.el-table tr{
background-color: initial;
}
</style>

View File

@@ -97,6 +97,7 @@
@row-click="handleRowClick">
<el-table-column type="selection" width="50"></el-table-column>
<!-- <el-table-column label="序号" type="index" align="center" width="50"/> -->
<el-table-column label="单据状态" align="center" prop="单据状态" width="80" />
<el-table-column label="生产订单" align="center" prop="订单号" width="80" />
<!-- <el-table-column label="计划号" align="center" prop="计划号" width="80" /> -->
<el-table-column label="物料名称" align="center" prop="产品名称" width="120"/>

View File

@@ -12,6 +12,21 @@
<el-input v-model="searchForm.processName" placeholder="请输入工序" clearable style="width: 100px; margin-right: 10px" />
<span class="show-text">订单号:</span>
<el-input v-model="searchForm.orderNo" placeholder="请输入订单号" clearable style="width: 100px; margin-right: 10px" />
<span class="show-text">工时类型:</span>
<el-select v-model="searchForm.workHoursType" placeholder="请选择" clearable style="width: 100px; margin-right: 10px">
<el-option label="装配" value="装配" />
<el-option label="电气" value="电气" />
<el-option label="机加" value="机加" />
<el-option label="质检" value="质检" />
<el-option label="技术" value="技术" />
<el-option label="计划" value="计划" />
<el-option label="库房" value="库房" />
<el-option label="采购" value="采购" />
<el-option label="销售" value="销售" />
<el-option label="售后" value="售后" />
<el-option label="工艺" value="工艺" />
<el-option label="其他" value="其他" />
</el-select>
<span class="show-text">报工开始日期:</span>
<el-date-picker
v-model="searchForm.startDate"
@@ -64,20 +79,49 @@
{{ scope.row.level === 1 ? scope.row.materialCode : '' }}
</template>
</el-table-column>
<el-table-column prop="计划数量" label="计划数量" width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 2 ? scope.row.计划数量 : '' }}
</template>
</el-table-column>
<el-table-column prop="工序说明" label="工序说明" width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 2 ? scope.row.工序说明 : '' }}
</template>
</el-table-column>
<el-table-column prop="工时类型" label="工时类型" width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 2 ? getWorkHoursType(scope.row) : '' }}
</template>
</el-table-column>
<el-table-column prop="workHours" label="工时(h)" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 1}">{{ scope.row.workHours }}</span>
</template>
</el-table-column>
<el-table-column prop="operator" label="操作人" width="100" align="center">
<template slot-scope="scope">
{{ scope.row.level === 2 ? scope.row.operator : '' }}
</template>
</el-table-column>
<el-table-column prop="planStart" label="开始时间" width="110" align="center" />
<el-table-column prop="planEnd" label="结束时间" width="110" align="center" />
<el-table-column prop="订单号" label="订单编号" width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 2 ? scope.row.订单号 : '' }}
</template>
</el-table-column>
<el-table-column prop="processName" label="工序名称" width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 2 ? scope.row.processName : '' }}
</template>
</el-table-column>
<el-table-column prop="operator" label="操作人" width="100" align="center">
<el-table-column prop="指派对象" label="指派对象" width="120" align="center" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 2 ? scope.row.operator : '' }}
{{ scope.row.level === 2 ? scope.row.指派对象 : '' }}
</template>
</el-table-column>
@@ -85,15 +129,9 @@
<el-table-column prop="reportQty" label="报工数量" width="90" align="center" />
<el-table-column prop="planStart" label="计划开始" width="110" align="center" />
<el-table-column prop="planEnd" label="计划完成" width="110" align="center" />
<el-table-column prop="workHours" label="工时(h)" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 1}">{{ scope.row.workHours }}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
@@ -120,17 +158,7 @@
</template>
</el-table-column>
<el-table-column prop="reportCount" label="报工次数" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level <= 2}">{{ scope.row.level <= 2 ? scope.row.reportCount : '' }}</span>
</template>
</el-table-column>
<el-table-column prop="reportQty" label="报工数量" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level <= 2}">{{ scope.row.reportQty }}</span>
</template>
</el-table-column>
<el-table-column prop="contractNo" label="合同号" width="130" show-overflow-tooltip>
<template slot-scope="scope">
@@ -155,13 +183,16 @@
{{ scope.row.level === 3 ? scope.row.productName : '' }}
</template>
</el-table-column>
<el-table-column prop="processName" label="工序名称" width="90" show-overflow-tooltip>
<el-table-column prop="计划数量" label="计划数量" width="100" align="center">
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.processName : '' }}
{{ scope.row.level === 3 ? scope.row.计划数量 : '' }}
</template>
</el-table-column>
<el-table-column prop="工序说明" label="工序说明" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 3}">{{ scope.row.工序说明 }}</span>
</template>
</el-table-column>
<el-table-column prop="startTime" label="开始时间" width="150" align="center">
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.startTime : '' }}
@@ -179,21 +210,46 @@
<span :class="{'bold-text': scope.row.level <= 2}">{{ scope.row.workHours }}</span>
</template>
</el-table-column>
<el-table-column prop="processName" label="工序名称" width="90" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.processName : '' }}
</template>
</el-table-column>
<el-table-column prop="工时类型" label="工时类型" width="100" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 3 ? getWorkHoursType(scope.row) : '' }}
</template>
</el-table-column>
<el-table-column prop="指派对象" label="指派对象" width="120" align="center" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.指派对象 : '' }}
</template>
</el-table-column>
<el-table-column prop="操作类别" label="类型" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 3}">{{ scope.row.操作类别 }}</span>
</template>
</el-table-column>
<el-table-column prop="工序说明" label="工序说明" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 3}">{{ scope.row.工序说明 }}</span>
</template>
</el-table-column>
<el-table-column prop="异常说明" label="异常说明" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 3}">{{ scope.row.异常说明 }}</span>
</template>
</el-table-column>
<el-table-column prop="reportCount" label="报工次数" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level <= 2}">{{ scope.row.level <= 2 ? scope.row.reportCount : '' }}</span>
</template>
</el-table-column>
<el-table-column prop="reportQty" label="报工数量" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level <= 2}">{{ scope.row.reportQty }}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
@@ -234,31 +290,32 @@
{{ scope.row.level === 1 ? scope.row.productName : '' }}
</template>
</el-table-column>
<el-table-column prop="processName" label="工序名称" width="90" show-overflow-tooltip>
<el-table-column prop="计划数量" label="计划数量" width="100" align="center">
<template slot-scope="scope">
{{ scope.row.level === 1 ? scope.row.processName : '' }}
{{ scope.row.level <= 2 ? scope.row.计划数量 : '' }}
</template>
</el-table-column>
<el-table-column prop="工序说明" label="工序说明" width="100" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level <= 2 ? scope.row.工序说明 : '' }}
</template>
</el-table-column>
<el-table-column prop="工时类型" label="工时类型" width="100" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level <= 2 ? getWorkHoursType(scope.row) : '' }}
</template>
</el-table-column>
<el-table-column prop="workHours" label="工时(h)" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 1}">{{ scope.row.workHours }}</span>
</template>
</el-table-column>
<el-table-column prop="operator" label="操作人" width="100" align="center">
<template slot-scope="scope">
{{ scope.row.level === 2 ? scope.row.operator : '' }}
</template>
</el-table-column>
<el-table-column prop="qty" label="计划/完成" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 1}">{{ scope.row.level === 1 ? scope.row.qty : '' }}</span>
</template>
</el-table-column>
<el-table-column prop="reportQty" label="报工数量" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 1}">{{ scope.row.reportQty }}</span>
</template>
</el-table-column>
<el-table-column prop="startTime" label="开始时间" width="150" align="center">
<template slot-scope="scope">
{{ scope.row.level === 2 ? scope.row.startTime : '' }}
@@ -271,11 +328,34 @@
</template>
</el-table-column>
<el-table-column prop="workHours" label="工时(h)" width="100" align="center">
<el-table-column prop="processName" label="工序名称" width="90" show-overflow-tooltip>
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 1}">{{ scope.row.workHours }}</span>
{{ scope.row.level === 1 ? scope.row.processName : '' }}
</template>
</el-table-column>
<el-table-column prop="指派对象" label="指派对象" width="120" align="center" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 2 ? scope.row.指派对象 : '' }}
</template>
</el-table-column>
<el-table-column prop="qty" label="计划/完成" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 1}">{{ scope.row.level === 1 ? scope.row.qty : '' }}</span>
</template>
</el-table-column>
<el-table-column prop="reportQty" label="报工数量" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 1}">{{ scope.row.reportQty }}</span>
</template>
</el-table-column>
<el-table-column prop="workHours" label="类型" width="100" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level === 1}">{{ scope.row.操作类别 }}</span>
@@ -307,17 +387,7 @@
</template>
</el-table-column>
<el-table-column prop="reportCount" label="报工次数" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level <= 2}">{{ scope.row.level <= 2 ? scope.row.reportCount : '' }}</span>
</template>
</el-table-column>
<el-table-column prop="reportQty" label="报工数量" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level <= 2}">{{ scope.row.reportQty }}</span>
</template>
</el-table-column>
<el-table-column prop="contractNo" label="合同号" width="130" show-overflow-tooltip>
<template slot-scope="scope">
@@ -342,13 +412,16 @@
{{ scope.row.level === 3 ? scope.row.productName : '' }}
</template>
</el-table-column>
<el-table-column prop="processName" label="工序名称" width="90" show-overflow-tooltip>
<el-table-column prop="计划数量" label="计划数量" width="100" align="center">
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.processName : '' }}
{{ scope.row.level === 3 ? scope.row.计划数量 : '' }}
</template>
</el-table-column>
<el-table-column prop="reportQty" label="报工数量" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level <= 2}">{{ scope.row.reportQty }}</span>
</template>
</el-table-column>
<el-table-column prop="startTime" label="开始时间" width="150" align="center">
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.startTime : '' }}
@@ -367,6 +440,39 @@
</template>
</el-table-column>
<el-table-column prop="processName" label="工序名称" width="90" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.processName : '' }}
</template>
</el-table-column>
<el-table-column prop="班次" label="班次" width="80" align="center">
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.班次 : '' }}
</template>
</el-table-column>
<el-table-column prop="报工类型" label="报工类型" width="100" align="center" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.报工类型 : '' }}
</template>
</el-table-column>
<el-table-column prop="指派对象" label="指派对象" width="120" align="center" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.指派对象 : '' }}
</template>
</el-table-column>
<el-table-column prop="reportCount" label="报工次数" width="90" align="center">
<template slot-scope="scope">
<span :class="{'bold-text': scope.row.level <= 2}">{{ scope.row.level <= 2 ? scope.row.reportCount : '' }}</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
@@ -374,6 +480,13 @@
<!-- 底部汇总 -->
<div class="summary-footer">
<span>总工时<strong>{{ currentTotalWorkHours }}</strong> 小时</span>
<span
v-for="item in currentWorkHoursTypeSummary"
:key="item.type"
class="type-summary-item"
>
{{ item.type }}<strong>{{ item.workHours }}</strong> 小时
</span>
</div>
</el-card>
</div>
@@ -391,6 +504,7 @@ export default {
productCode: '',
processName: '',
orderNo: '',
workHoursType: '',
startDate: '',
endDate: ''
},
@@ -425,6 +539,19 @@ export default {
return sum + (parseFloat(item.workHours) || 0)
}, 0)
return total.toFixed(1)
},
currentWorkHoursTypeSummary() {
const summaryMap = new Map()
this.getCurrentSummaryItems().forEach(item => {
const type = this.getWorkHoursType(item)
const workHours = parseFloat(item.workHours) || 0
summaryMap.set(type, (summaryMap.get(type) || 0) + workHours)
})
return Array.from(summaryMap, ([type, workHours]) => ({
type,
workHours: workHours.toFixed(1)
}))
}
},
@@ -433,6 +560,29 @@ export default {
},
methods: {
getWorkHoursType(row) {
return row.工时类型 || row.workType || row.WorkType || row.workHoursType || row.WorkHoursType || '未分类'
},
getCurrentSummaryItems() {
const items = []
if (this.activeTab === 'project') {
this.projectTableData.forEach(parent => {
items.push(...(parent.children || []))
})
} else if (this.activeTab === 'operator') {
this.operatorTableData.forEach(operator => {
;(operator.children || []).forEach(date => {
items.push(...(date.children || []))
})
})
} else if (this.activeTab === 'task') {
this.taskTableData.forEach(task => {
items.push(...(task.children || []))
})
}
return items
},
handleSearch() {
// 校验日期是否已选择
// if (!this.searchForm.startDate || !this.searchForm.endDate) {
@@ -470,6 +620,7 @@ export default {
['产品编码', this.searchForm.productCode || ''],
['工序名称', this.searchForm.processName || ''],
['订单号', this.searchForm.orderNo || ''],
['工时类型', this.searchForm.workHoursType || ''],
['开始日期', this.searchForm.startDate || ''],
['结束日期', this.searchForm.endDate || '']
]
@@ -510,13 +661,17 @@ export default {
materialCode: row.materialCode,
processName: row.processName,
operator: row.operator,
指派对象: row.指派对象,
qty: row.qty,
reportQty: row.reportQty,
planStart: row.planStart,
planEnd: row.planEnd,
workHours: row.workHours,
订单号:row.订单号,
操作类别 :row.操作类别
操作类别 :row.操作类别,
工时类型: this.getWorkHoursType(row),
计划数量: row.计划数量,
工序说明: row.工序说明
})
}
})
@@ -540,6 +695,7 @@ export default {
['产品编码', this.searchForm.productCode || ''],
['工序名称', this.searchForm.processName || ''],
['订单号', this.searchForm.orderNo || ''],
['工时类型', this.searchForm.workHoursType || ''],
['开始日期', this.searchForm.startDate || ''],
['结束日期', this.searchForm.endDate || '']
]
@@ -613,6 +769,12 @@ export default {
productCode: row.productCode,
productName: row.productName,
processName: row.processName,
计划数量: row.计划数量,
工序说明: row.工序说明,
工时类型: this.getWorkHoursType(row),
班次: row.班次,
报工类型: row.报工类型,
指派对象: row.指派对象,
reportQty: row.reportQty,
startTime: row.startTime,
endTime: row.endTime,
@@ -643,6 +805,7 @@ export default {
['产品编码', this.searchForm.productCode || ''],
['工序名称', this.searchForm.processName || ''],
['订单号', this.searchForm.orderNo || ''],
['工时类型', this.searchForm.workHoursType || ''],
['开始日期', this.searchForm.startDate || ''],
['结束日期', this.searchForm.endDate || '']
]
@@ -661,7 +824,7 @@ export default {
flatData.forEach((row, index) => {
if (row.Level === 1) {
const key = `${row.contractNo}_${row.productCode}_${row.processName}`
const key = `${row.contractNo}_${row.orderNo}_${row.productCode}_${row.processName}_${this.getWorkHoursType(row)}_${row.操作类别 || ''}`
level1Map.set(key, {
id: `t-${index}`,
level: 1,
@@ -670,6 +833,9 @@ export default {
productCode: row.productCode,
productName: row.productName,
processName: row.processName,
计划数量: row.计划数量,
工序说明: row.工序说明,
工时类型: this.getWorkHoursType(row),
qty: row.qty,
reportQty: row.reportQty,
workHours: row.workHours,
@@ -680,9 +846,14 @@ export default {
id: `t-${index}`,
level: 2,
contractNo: row.contractNo,
orderNo: row.orderNo,
productCode: row.productCode,
processName: row.processName,
计划数量: row.计划数量,
工序说明: row.工序说明,
工时类型: this.getWorkHoursType(row),
operator: row.operator,
指派对象: row.指派对象,
reportQty: row.reportQty,
startTime: row.startTime,
endTime: row.endTime,
@@ -694,7 +865,7 @@ export default {
// 12级关联
level2Items.forEach(item => {
const key = `${item.contractNo}_${item.productCode}_${item.processName}`
const key = `${item.contractNo}_${item.orderNo}_${item.productCode}_${item.processName}_${this.getWorkHoursType(item)}_${item.操作类别 || ''}`
const parent = level1Map.get(key)
if (parent) {
parent.children.push(item)
@@ -846,8 +1017,16 @@ export default {
border-top: 1px solid #ebeef5;
font-size: 13px;
color: #606266;
height: 40px;
min-height: 40px;
line-height: 20px;
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 8px 20px;
}
.type-summary-item {
white-space: nowrap;
}
/* 调整展开图标 */

File diff suppressed because it is too large Load Diff

View File

@@ -59,7 +59,10 @@
</el-select>
<el-button :disabled="!!loading" icon="el-icon-search" plain type="primary" @click="searchTable()">查询</el-button>
<el-button :disabled="!!multipleSelection.length === 0 || loading" icon="el-icon-check" plain type="success" style="width: 100px;" @click="batchValidate">一键校验</el-button>
<el-button :disabled=" uesrname != '付延辉'" icon="el-icon-check" plain type="danger" style="width: 100px;" @click="saveValidationRecord2(multipleSelection)">直接校验</el-button>
<el-button :disabled=" uesrname != '付延辉'" icon="el-icon-check" plain type="danger" style="position: absolute;
width: 100px;
right: 36px;
top: 70px;width: 100px;" @click="saveValidationRecord2(multipleSelection)">直接校验</el-button>
<!-- <el-button :disabled="!!loading" icon="el-icon-plus" plain type="warning" style="width: 130px;" @click="addWorkTimeRecord">新增工时记录</el-button> -->
</div>
@@ -230,11 +233,11 @@
@change="calculateWorkTime" />
</el-form-item>
<!-- <el-form-item label="加工工时">
<el-form-item label="加工工时">
<el-input v-model="editForm.加工工时" readonly>
<template slot="append"></template>
</el-input>
</el-form-item> -->
</el-form-item>
<el-form-item label="人员工时">
<el-input v-model="editForm.总时长" readonly>
<template slot="append"></template>
@@ -728,6 +731,40 @@ async uploadToSAP(record, detail) {
// ========== 9. 提交工时单据到SAP ==========
if (params.length > 0) {
try {
await new Promise(resolve => setTimeout(resolve, 500))
const reorderResult = await getB1("/ProductionOrders", {
"$filter": `AbsoluteEntry eq ${record.订单编号}`
})
if (!reorderResult.success || !reorderResult.data?.value?.length) {
return { success: false, error: '重新获取生产订单失败' }
}
const updatedOrder = reorderResult.data.value[0]
const lines = updatedOrder.ProductionOrderLines || []
lines.forEach(line => {
const matched = params.find(param => Number(line.LineNumber) === Number(param.BaseLine))
if (matched) {
line.PlannedQuantity = Number(line.IssuedQuantity) + Number(matched.Quantity)
}
})
const patchResult = await patchB1(`ProductionOrders(${updatedOrder.AbsoluteEntry})`, {
ProductionOrderLines: lines,
ProductionOrdersStages: updatedOrder.ProductionOrdersStages || []
})
if (!patchResult.success) {
this.$message.error(patchResult.message)
return { success: false, error: patchResult.message || '更新生产订单PlannedQuantity失败' }
}
} catch (reorderError) {
console.warn(`重新获取订单数据失败:`, reorderError)
return { success: false, error: reorderError.message || '更新生产订单PlannedQuantity异常' }
}
try {
const startDate = record.开始时间 ? record.开始时间.split(' ')[0] : this.currentdate
const result = await postB1("/InventoryGenExits", {

View File

@@ -215,7 +215,7 @@
</el-input>
</el-form-item>
<el-form-item label="班次标准工时">
<el-input v-model="editForm.班次标准工时" readonly />
<el-input v-model="editForm.当日班次最小标准工时" />
</el-form-item>
<!-- <el-form-item label="工序顺序">
<el-input v-model="editForm.工艺顺序" readonly />
@@ -682,7 +682,7 @@ export default {
加工工时: row.加工工时 || 0,
总时长: row.总时长 || 0,
工艺顺序: row.订单行号 || 0,
当日班次最小标准工时 : row.当日班次最小标准工时 || 0
当日班次最小标准工时 : row.当日班次最小标准工时 || 8
}
this.editDialogVisible = true
},

View File

@@ -175,6 +175,7 @@
style="width: 100%; margin-top: 20px"
tooltip-effect="dark"
@row-click="handleRowClick"
:row-class-name="tableRowClassName"
>
<el-table-column
align="center"
@@ -743,6 +744,14 @@ export default {
this.loading = false;
if (response.data.rows && response.data.rows.length !== 0) {
this.tableData = response.data.rows;
this.tableData.sort((a, b) => {
const aIsUrgent = a.加急状态 === '1';
const bIsUrgent = b.加急状态 === '1';
if (aIsUrgent && !bIsUrgent) return -1;
if (!aIsUrgent && bIsUrgent) return 1;
return 0;
});
this.total = response.data.total
} else {
this.tableData = [];
@@ -1122,10 +1131,27 @@ export default {
const seconds = String(date.getSeconds()).padStart(2, "0");
return `${year}${month}${day}_${hours}${minutes}${seconds}`;
},
tableRowClassName({ row, rowIndex }) {
const isUrgent = row.加急状态 == "1";
if (isUrgent) {
return "priority-row";
}
return "";
},
},
};
</script>
<style scoped>
::v-deep .priority-row {
background-color: #f56c6c !important;
color: #000000 !important;
}
::v-deep .priority-row td {
background-color: #f56c6c !important;
color: #000000 !important;
border: #f56c6c;
}
</style>
<style>
.search-container {
margin-bottom: 20px;
@@ -1343,4 +1369,4 @@ button {
width: 20px;
height: 20px;
}
</style>
</style>

View File

@@ -221,6 +221,18 @@
width="80"
prop="工位名称"
/>
<el-table-column
align="center"
label="供应商"
width="80"
prop="供应商"
/>
<el-table-column
align="center"
label="采购收货单"
width="100"
prop="采购收货单"
/>
<el-table-column
align="center"
label="加急数量"
@@ -273,7 +285,7 @@
width="180"
prop="检测说明"
/>
<el-table-column label="操作" align="center" width="250" fixed="right">
<el-table-column label="操作" align="center" width="350" fixed="right">
<template slot-scope="scope">
<el-button
class="operation-btn"
@@ -287,9 +299,15 @@
type="primary"
size="mini"
@click="getitemdraw(scope.row)"
>图纸</el-button
>零件图纸</el-button
>
<el-button
class="operation-btn"
type="primary"
size="mini"
@click="getitemdraw2(scope.row)"
>工艺图纸</el-button
>
</template>
</el-table-column>
@@ -586,31 +604,23 @@ export default {
this.$message.error('未上传图纸');
}
})
// this.ExecDatabase(Data).then(async (response) => {
// console.log(response);
// if (response.data.length > 0) {
// var pdfSrc = "" + this.downPDF + "" + response.data[0].uid + ".pdf";
// // 1. 先打开对话框
// this.seeVisible = true;
// // 2. 等待对话框完全渲染(使用 $nextTick 确保 DOM 已更新)
// await this.$nextTick();
// // 3. 等待一小段时间确保对话框内的容器完全渲染
// setTimeout(async () => {
// try {
// await seepdf(pdfSrc, 'see');
// } catch (error) {
// console.error('PDF 渲染失败:', error);
// this.$message.error('PDF 渲染失败: ' + error.message);
// }
// }, 300); // 增加延迟确保 DOM 完全渲染
// } 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('未上传图纸');
}
})
},
Urgent(row){
var param = []
@@ -813,6 +823,7 @@ export default {
param.push(["检测时间", this.receiveCheckData.检测时间]);
param.push(["检测说明", this.receiveCheckData.检测说明]);
param.push(["放行数量", this.receiveCheckData.放行数量]);
param.push(["工位名称", this.receiveCheckData.工位名称]);
console.log(param);
try {

View File

@@ -965,6 +965,7 @@ export default {
return;
}
// 调用存储过程保存数据
this.receiveCheckVisible = false;
this.saveReceiveCheck();
});
},

View File

@@ -40,7 +40,7 @@
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 150px; margin-right: 10px" />
<el-button :disabled="!!loading" icon="el-icon-search" plain type="primary" @click="searchTable()">查询</el-button>
<el-button :disabled="!!loading" icon="el-icon-search" plain type="primary" @click="handleSearch">查询</el-button>
<el-button style="width: 100px;" icon="el-icon-download" type="primary" @click="exportExcel">Excel导出</el-button>
</div>
@@ -165,10 +165,10 @@ export default {
param.push(["质检类型", this.QualityStatus]);
param.push(["开始日期", this.startDate]);
param.push(["结束日期", this.endDate]);
param.push(["订单号", this.orderNo ]);
param.push(["合同号", this.contractNo ]);
param.push(["零件编码", this.productCode ]);
param.push(["零件名称", this.productName ]);
param.push(["订单号", this.normalizeQueryValue(this.orderNo) ]);
param.push(["合同号", this.normalizeQueryValue(this.contractNo) ]);
param.push(["零件编码", this.normalizeQueryValue(this.productCode) ]);
param.push(["零件名称", this.normalizeQueryValue(this.productName) ]);
this.exporting = true
const Data = this.CreateData('2001', '质量管理_质检明细_导出', param)
@@ -218,6 +218,11 @@ export default {
// ============ 分页方法 ============
handleSearch() {
this.pageCurrent = 1
this.searchTable()
},
handleSizeChanges(val) {
this.pageCurrent = 1
this.pageSize = val
@@ -236,12 +241,12 @@ export default {
param.push(["质检类型", this.QualityStatus]);
param.push(["开始日期", this.startDate]);
param.push(["结束日期", this.endDate]);
param.push(["订单号", this.orderNo ]);
param.push(["合同号", this.contractNo ]);
param.push(["零件编码", this.productCode ]);
param.push(["零件名称", this.productName ]);
param.push(["订单号", this.normalizeQueryValue(this.orderNo) ]);
param.push(["合同号", this.normalizeQueryValue(this.contractNo) ]);
param.push(["零件编码", this.normalizeQueryValue(this.productCode) ]);
param.push(["零件名称", this.normalizeQueryValue(this.productName) ]);
param.push(['PageCurrent', this.pageCurrent])
param.push(['pageSize', this.pageSize])
param.push(['PageSize', this.pageSize])
param.push(['PageCount', '1111', 'int', '1'])
param.push(['ItemCount', '1111', 'int', '1'])
@@ -258,6 +263,10 @@ export default {
// ============ 工具方法 ============
normalizeQueryValue(value) {
return value === null || value === undefined || value === '' ? '0' : value
},
getCurrentUser() {
return this.$store.state.user.name
@@ -305,4 +314,4 @@ export default {
background-color: #f56c6c !important;
color: #000000 !important;
} */
</style>
</style>

View File

@@ -0,0 +1,247 @@
<template>
<div class="test-assembly-task">
<el-card>
<div class="search-container">
<span class="show-text">任务类型:</span>
<el-select
v-model="taskType"
placeholder="请选择任务类型"
style="width: 150px; margin-right: 10px"
@change="searchTable"
>
<el-option label="全部" value="全部" />
<el-option label="阀类" value="阀类" />
<el-option label="系统类" value="系统类" />
</el-select>
<span class="show-text">生产订单:</span>
<el-input
v-model="productionOrder"
placeholder="请输入生产订单"
clearable
style="width: 150px; margin-right: 10px"
@keyup.enter.native="searchTable"
/>
<span class="show-text">销售订单:</span>
<el-input
v-model="salesOrder"
placeholder="请输入销售订单"
clearable
style="width: 150px; margin-right: 10px"
@keyup.enter.native="searchTable"
/>
<span class="show-text">物料名称:</span>
<el-input
v-model="materialName"
placeholder="请输入物料名称"
clearable
style="width: 160px; margin-right: 10px"
@keyup.enter.native="searchTable"
/>
<span class="show-text">物料编码:</span>
<el-input
v-model="materialCode"
placeholder="请输入物料编码"
clearable
style="width: 180px; margin-right: 10px"
@keyup.enter.native="searchTable"
/>
<el-button :disabled="loading" icon="el-icon-search" plain type="primary" @click="searchTable">查询</el-button>
<el-button :disabled="loading" icon="el-icon-download" plain type="success" @click="exportToExcel">导出</el-button>
</div>
<el-table
v-loading="loading"
:data="tableData"
:height="'72vh'"
border
element-loading-background="rgba(0, 0, 0, 0.2)"
element-loading-spinner="el-icon-loading"
highlight-current-row
:row-class-name="tableRowClassName"
size="mini"
style="width: 100%; margin-top: 20px"
tooltip-effect="dark"
>
<el-table-column align="center" label="序号" type="index" width="60" fixed />
<el-table-column align="center" prop="预计送检日期" label="预计送检日期" width="120" fixed show-overflow-tooltip >
<template slot-scope="scope">
{{ formatDate(scope.row.预计送检日期) }}
</template>
</el-table-column>
<el-table-column align="center" prop="销售订单" label="销售订单" width="120" fixed show-overflow-tooltip />
<el-table-column align="center" prop="生产订单" label="生产订单" width="100" fixed />
<el-table-column align="center" prop="物料名称" label="物料名称" width="170" show-overflow-tooltip />
<el-table-column align="center" prop="物料编码" label="物料编码" width="180" show-overflow-tooltip />
<el-table-column align="center" prop="计划数量" label="计划数量" width="100" />
<el-table-column align="center" prop="完成数量" label="完成数量" width="100" />
<el-table-column align="center" prop="检验数量" label="检验数量" width="100" />
<el-table-column align="center" prop="检验合格数量" label="检验合格数量" width="120" />
<el-table-column align="center" prop="检验不合格数量" label="检验不合格数量" width="130" />
</el-table>
</el-card>
</div>
</template>
<script>
import * as XLSX from 'xlsx'
export default {
name: 'TestAssemblyTask',
data() {
return {
taskType: '全部',
productionOrder: '',
salesOrder: '',
materialName: '',
materialCode: '',
loading: false,
tableData: []
}
},
mounted() {
this.searchTable()
},
methods: {
formatDate(date) {
if (!date) return ''
return date.split(' ').length > 1 ? date.split(' ')[0] : date
},
tableRowClassName({ row }) {
return this.isInspectionUnfinished(row) ? 'inspection-unfinished-row' : ''
},
searchTable() {
this.loading = true
const param = []
param.push(['任务类型', this.taskType])
param.push(['生产订单', this.productionOrder])
param.push(['销售订单', this.salesOrder])
param.push(['物料名称', this.materialName])
param.push(['物料编码', this.materialCode])
const data = this.CreateData('11', '质量管理_测试装配任务_查询', param)
this.ExecDatabase(data).then(response => {
this.tableData = this.sortTableData(response.data || [])
}).catch(error => {
this.$message.error('查询失败:' + error.message)
}).finally(() => {
this.loading = false
})
},
exportToExcel() {
if (this.tableData.length === 0) {
this.$message.warning('没有数据可导出')
return
}
try {
const exportData = this.tableData.map((item, index) => ({
序号: index + 1,
预计送检日期: this.formatDate(item['预计送检日期']),
销售订单: item['销售订单'] || '',
生产订单: item['生产订单'] || '',
物料名称: item['物料名称'] || '',
物料编码: item['物料编码'] || '',
计划数量: item['计划数量'] || 0,
完成数量: item['完成数量'] || 0,
检验数量: item['检验数量'] || 0,
检验合格数量: item['检验合格数量'] || 0,
检验不合格数量: item['检验不合格数量'] || 0
}))
const wb = XLSX.utils.book_new()
const ws = XLSX.utils.json_to_sheet(exportData)
ws['!cols'] = [
{ wch: 8 },
{ wch: 15 },
{ wch: 15 },
{ wch: 15 },
{ wch: 24 },
{ wch: 20 },
{ wch: 12 },
{ wch: 12 },
{ wch: 12 },
{ wch: 16 },
{ wch: 18 }
]
XLSX.utils.book_append_sheet(wb, ws, '测试装配任务')
XLSX.writeFile(wb, `测试装配任务_${this.formatDateForFileName(new Date())}.xlsx`)
this.$message.success('导出成功')
} catch (error) {
console.error('导出失败:', error)
this.$message.error('导出失败')
}
},
sortTableData(data) {
return data.slice().sort((a, b) => {
const unfinishedA = this.isInspectionUnfinished(a)
const unfinishedB = this.isInspectionUnfinished(b)
if (unfinishedA !== unfinishedB) {
return unfinishedA ? -1 : 1
}
const timeA = this.getDateTime(a['预计送检日期'])
const timeB = this.getDateTime(b['预计送检日期'])
if (timeA === timeB) {
return 0
}
if (timeA === Infinity) {
return 1
}
if (timeB === Infinity) {
return -1
}
return timeA - timeB
})
},
isInspectionUnfinished(row) {
return this.getNumber(row['完成数量']) > this.getNumber(row['检验数量'])
},
getNumber(value) {
if (value === null || value === undefined || value === '') {
return 0
}
const number = Number(String(value).replace(/,/g, ''))
return Number.isNaN(number) ? 0 : number
},
getDateTime(value) {
if (!value) {
return Infinity
}
const time = new Date(String(value).replace(/-/g, '/')).getTime()
return Number.isNaN(time) ? Infinity : time
},
formatDateForFileName(date) {
const year = date.getFullYear()
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const hours = String(date.getHours()).padStart(2, '0')
const minutes = String(date.getMinutes()).padStart(2, '0')
const seconds = String(date.getSeconds()).padStart(2, '0')
return `${year}${month}${day}_${hours}${minutes}${seconds}`
}
}
}
</script>
<style scoped>
.test-assembly-task {
padding: 10px;
}
.search-container {
display: flex;
align-items: center;
flex-wrap: wrap;
}
.show-text {
font-size: 14px;
margin-right: 6px;
}
::v-deep .inspection-unfinished-row > td {
background-color: #e6a23c !important;
color: #1f1f1f;
}
</style>

View File

@@ -52,6 +52,11 @@
<span type="success">{{ scope.row.roles_function }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="班组" prop="班组" show-overflow-tooltip>
<template slot-scope="scope">
<span type="success">{{ scope.row.班组 }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作" min-width="450">
<template slot-scope="scope">
<el-button icon="el-icon-refresh-right" style="font-family: MiSans Regular,serif;color: #4d77d6"
@@ -111,6 +116,27 @@
<el-form-item label="工号" prop="account">
<el-input v-model="form1.account" placeholder="请输入工号" readonly style="width: 240px;border-radius: 4px" />
</el-form-item>
<el-form-item label="班组" prop="班组">
<el-select
v-model="form1.team"
clearable
placeholder="请选择"
style="width: 150px; margin-right: 10px"
>
<el-option label="装配" value="装配" />
<el-option label="电气" value="电气" />
<el-option label="机加" value="机加" />
<el-option label="质检" value="质检" />
<el-option label="技术" value="技术" />
<el-option label="计划" value="计划" />
<el-option label="库房" value="库房" />
<el-option label="采购" value="采购" />
<el-option label="销售" value="销售" />
<el-option label="售后" value="售后" />
<el-option label="工艺" value="工艺" />
<el-option label="其他" value="其他" />
</el-select>
</el-form-item>
<!-- <el-form-item label="密码" prop="password">-->
<!-- <el-input-->
<!-- v-model="form1.password"-->
@@ -167,7 +193,8 @@ export default {
PersonalName: '',
account: '',
password: '',
PersonalroleValue: ''
PersonalroleValue: '',
team:''
},
rules1: {
PersonalName: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
@@ -179,7 +206,8 @@ export default {
tableData: [],
total: 0, // 总条数
pageSize: 10, // 每页显示条数
pageList: 1 // 后台获取页
pageList: 1, // 后台获取页
team:''
}
},
created() {
@@ -251,7 +279,8 @@ export default {
password: response.data.result[i].password,
roles_number: parseInt(response.data.result[i].Roles_number),
roles_function: response.data.result[i].Roles_Function,
isClient: response.data.result[i].isClient
isClient: response.data.result[i].isClient,
班组:response.data.result[i].班组
})
}
}
@@ -270,6 +299,7 @@ export default {
this.form1.account = row.account
this.form1.password = row.password
this.form1.PersonalroleValue = row.roles_number
this.form1.team = row.班组
this.title1 = '编辑人员'
this.dialogFormVisible1 = true
},
@@ -284,6 +314,7 @@ export default {
param[2] = ['password', this.form1.password]
param[3] = ['Personnel_Name', this.form1.PersonalName]
param[4] = ['Roles_number', this.form1.PersonalroleValue]
param[5] = ['班组', this.form1.team]
if (this.form1.account === '' || this.form1.account === null) {
this.$message.error('请输入工号')
} else if (this.form1.password === '' || this.form1.password === null) {

View File

@@ -0,0 +1,68 @@
flowchart TD
U[工艺员/技术人员] --> P[ProcessProduct/index.vue<br/>生产工艺维护页面]
subgraph UI[页面层]
Q[查询区<br/>生产订单/销售订单/物料编码/物料名称/计划号<br/>任务状态/属性/下达日期/工艺状态]
L[生产订单列表<br/>多选/分页/状态灯/编辑工艺]
E[编辑生产工艺弹窗<br/>原料信息/图纸/保存/下发/工序维护]
C[生产工艺拷贝弹窗<br/>标准工艺或生产工艺来源预览]
PDF[图纸预览弹窗<br/>零件图纸/工艺图纸 PDF]
end
subgraph State[前端核心状态]
tableData[tableData<br/>订单列表]
selectedRow[selectedRow<br/>当前订单]
multipleSelection[multipleSelection<br/>批量选中订单]
tableData5[tableData5<br/>当前生产工艺明细]
tableData4[tableData4/filteredTableData4<br/>工序基础库]
tableData6[tableData6<br/>拷贝来源工艺预览]
basedata[basedatagj/basedatajc/basedatacj<br/>量具/机床/车间]
insertidx[insertidx<br/>插入占位行 id]
itemdata[itemdata<br/>订单原料信息]
end
subgraph API[后台过程]
A1[计划排产_生产订单_订单查询]
A2[工艺管理_生产工艺_查询生产工艺]
A3[MES_ProcessManagement_ProcessGet]
A4[设备管理_设备信息_查询]
A5[工艺管理_获取物料原料信息]
A6[工艺管理_零件工序_生产工艺_*<br/>新增/编辑/插入/删除/上下移/批量生成]
A7[工艺管理_生产工艺_*<br/>拷贝/启用/来源查询]
A8[计划排产_生产订单_订单任务_*<br/>整套下发/单条下发]
A9[工艺管理_图纸维护_查看图纸<br/>工艺管理_工艺维护_查看图纸]
A10[车间生产管理工艺_零件工序_保存为标准工艺]
end
P --> Q
P --> L
P --> E
P --> C
P --> PDF
Q -->|searchTable| A1 --> tableData --> L
L -->|row-click| selectedRow
L -->|selection-change| multipleSelection
L -->|编辑工艺 editProcess| E
E -->|getitemdata| A5 --> itemdata
E -->|editProcesssearch| A2 --> tableData5
E -->|getProcess| A3 --> tableData4
E -->|getbasedata| A4 --> basedata
E -->|工序维护| A6 --> tableData5
E -->|保存/启用| A7
E -->|保存为标准工艺| A10
E -->|下发任务| A8
E -->|零件/工艺图纸| A9 --> PDF
C -->|copyData/searchTable2/searchTable4| A7 --> tableData6
C -->|submitCopy| A7 --> tableData5
multipleSelection -->|AllProductProcess| A6 --> tableData
classDef ui fill:#E8F3FF,stroke:#2B6CB0,color:#111;
classDef state fill:#FFF7E6,stroke:#C47F00,color:#111;
classDef api fill:#EAF8EA,stroke:#2F855A,color:#111;
class Q,L,E,C,PDF ui;
class tableData,selectedRow,multipleSelection,tableData5,tableData4,tableData6,basedata,insertidx,itemdata state;
class A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 api;

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -0,0 +1,56 @@
flowchart TD
S[用户点击订单行: 编辑工艺] --> R1[建议先设置 selectedRow = row<br/>当前源码依赖 row-click 已触发]
R1 --> D1[打开 dialogcasual<br/>loading = true]
D1 --> P1[getitemdatarow.订单编号)]
P1 --> SP1[工艺管理_获取物料原料信息]
SP1 --> F1{U_MoType == 机加件?}
F1 -->|是| M1[写入 itemdata<br/>子件编码/名称/计划数量/材质/基本数量/存货量]
F1 -->|否| M0[过滤掉]
D1 --> P2[editProcesssearchrow]
P2 --> SP2[工艺管理_生产工艺_查询生产工艺<br/>入参: 物料编号, 订单编号]
SP2 --> T5[tableData5 = 当前生产工艺明细]
T5 --> P3[getProcess]
P3 --> SP3[MES_ProcessManagement_ProcessGet<br/>入参: 工艺编号='']
SP3 --> G1[tableData4/filteredTableData4<br/>左侧工序基础库]
T5 --> P4[getbasedata]
P4 --> SP4[设备管理_设备信息_查询]
SP4 --> B1{按设备类型名称分类}
B1 -->|量具| BJ[basedatagj<br/>工装量具选项]
B1 -->|机床| BC[basedatajc<br/>指定机床选项]
B1 -->|车间| BW[basedatacj<br/>车间选项]
T5 --> P5[fninsertidx]
P5 --> C1{存在空工艺名称行?}
C1 -->|是| I1[insertidx = 空行 id<br/>左侧选工序时填入占位]
C1 -->|否| I0[insertidx 保持或为 0]
P5 --> C2{工卡量具/指定机床为逗号字符串?}
C2 -->|是| I2[splitmap Number<br/>转换为多选数组]
C2 -->|否| I3[保持原值]
I1 --> READY[编辑弹窗可操作]
I0 --> READY
I2 --> READY
I3 --> READY
READY --> OP1[查看图纸]
READY --> OP2[新增/插入/删除/排序工序]
READY --> OP3[编辑工时/设备/车间/属性/说明/备注]
READY --> OP4[保存/启用]
READY --> OP5[保存为标准工艺]
READY --> OP6[整套或单条下发任务]
classDef start fill:#E8F3FF,stroke:#2B6CB0,color:#111;
classDef proc fill:#FFF7E6,stroke:#C47F00,color:#111;
classDef api fill:#EAF8EA,stroke:#2F855A,color:#111;
classDef decision fill:#F3E8FF,stroke:#6B46C1,color:#111;
classDef output fill:#F0FFF4,stroke:#38A169,color:#111;
class S,D1,READY start;
class P1,P2,P3,P4,P5,R1,OP1,OP2,OP3,OP4,OP5,OP6 proc;
class SP1,SP2,SP3,SP4 api;
class F1,B1,C1,C2 decision;
class M1,M0,T5,G1,BJ,BC,BW,I1,I0,I2,I3 output;

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View File

@@ -0,0 +1,53 @@
flowchart TD
START[编辑生产工艺弹窗] --> LEFT[左侧工序基础库<br/>filteredTableData4]
START --> RIGHT[右侧生产工艺明细<br/>tableData5]
LEFT --> SEARCH[输入 processSearchName]
SEARCH --> FILTER[filterProcess<br/>按 工艺名称 includes 过滤]
FILTER --> LEFT
LEFT --> CLICK[点击某个工序 editProcedurerow]
CLICK --> HASINSERT{insertidx 是否非 0?}
HASINSERT -->|否: 普通新增| ADD[组装参数<br/>工艺编号/物料编号/计划数量/订单编号]
ADD --> SPADD[工艺管理_零件工序_生产工艺_修改数据]
SPADD --> RELOAD1[重新查询生产工艺]
HASINSERT -->|是: 填入占位行| FILL[组装参数<br/>工艺编号/idd/计划数量/订单编号]
FILL --> SPFILL[工艺管理_零件工序_生产工艺_编辑插入工序]
SPFILL --> RELOAD1
RIGHT --> EDIT[编辑字段<br/>准备工时/标准工时/工时合计<br/>工卡量具/指定机床/车间/属性<br/>工艺要求/备注]
EDIT --> NORM[规范化工卡量具/指定机床<br/>数组/对象/字符串 -> 数组]
NORM --> SPEDIT[工艺管理_零件工序_生产工艺_编辑]
SPEDIT --> SILENT[当前无成功提示<br/>后台即时保存]
RIGHT --> MOVEUP[上移工序]
MOVEUP --> SPMU[工艺管理_零件工序_生产工艺_上移工序]
RIGHT --> MOVEDOWN[下移工序]
MOVEDOWN --> SPMD[工艺管理_零件工序_生产工艺_下移工序]
RIGHT --> INSERT[插入工序]
INSERT --> SPI[工艺管理_零件工序_生产工艺_插入工序<br/>生成空占位行]
RIGHT --> DELETE[删除工序]
DELETE --> SPD[工艺管理_零件工序_生产工艺_删除工序]
SPMU --> RELOAD1
SPMD --> RELOAD1
SPI --> RELOAD1
SPD --> RELOAD1
RELOAD1 --> SPQUERY[工艺管理_生产工艺_查询生产工艺]
SPQUERY --> NEWT5[刷新 tableData5]
NEWT5 --> FN[fninsertidx<br/>识别占位行/转换多选字段]
FN --> RIGHT
classDef ui fill:#E8F3FF,stroke:#2B6CB0,color:#111;
classDef action fill:#FFF7E6,stroke:#C47F00,color:#111;
classDef api fill:#EAF8EA,stroke:#2F855A,color:#111;
classDef decision fill:#F3E8FF,stroke:#6B46C1,color:#111;
classDef output fill:#F0FFF4,stroke:#38A169,color:#111;
class START,LEFT,RIGHT ui;
class SEARCH,FILTER,CLICK,ADD,FILL,EDIT,NORM,MOVEUP,MOVEDOWN,INSERT,DELETE,RELOAD1,FN action;
class SPADD,SPFILL,SPEDIT,SPMU,SPMD,SPI,SPD,SPQUERY api;
class HASINSERT decision;
class SILENT,NEWT5 output;

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

@@ -0,0 +1,57 @@
flowchart TD
subgraph Batch[批量生成生产工艺]
B0[列表勾选订单] --> B1[AllProductProcess]
B1 --> B2{multipleSelection.length >= 1?}
B2 -->|否| BERR[提示: 请勾选数据]
B2 -->|是| B3[过滤选中行<br/>标准工艺 == 1 且 生产工艺 != 1]
B3 --> B4[拼接订单编号/物料编号/计划数量<br/>逗号字符串]
B4 --> BSP[工艺管理_零件工序_生产工艺_批量生成生产工艺]
BSP --> B5[刷新订单列表 searchTable]
end
subgraph Copy[工艺拷贝 当前入口被注释]
C0[copyData 打开生产工艺拷贝弹窗] --> C1{processprodutc 勾选?}
C1 -->|否: 标准工艺来源| C2[工艺管理_生产工艺_标准工艺拷贝<br/>获取候选零件]
C2 --> C3[MES_ProcessManagement_ProcessBindGet<br/>预览标准工艺明细]
C1 -->|是: 生产工艺来源| C4[工艺管理_生产工艺_生产工艺拷贝<br/>获取候选物料]
C4 --> C5[工艺管理_制定标准工艺_拷贝生产工艺<br/>预览生产工艺明细]
C3 --> C6[submitCopy]
C5 --> C6
C6 --> C7[工艺管理_生产工艺_工艺拷贝<br/>物料编号/零件图号/订单编号/计划数量/工艺类型]
C7 --> C8{result == '1'?}
C8 -->|是| COK[提示拷贝成功<br/>刷新当前生产工艺]
C8 -->|否| CERR[提示拷贝失败]
end
subgraph Save[保存与沉淀]
S0[保存按钮 saveProcess] --> S1[工艺管理_生产工艺_启用<br/>入参: 订单编号]
S1 --> SOK[提示操作成功]
S2[保存为标准工艺 processSave] --> S3[车间生产管理工艺_零件工序_保存为标准工艺<br/>入参: 物料编号/订单编号]
S3 --> S4{result == '1'?}
S4 -->|是| SOK2[提示保存成功]
S4 -->|否| SERR2[提示保存失败]
end
subgraph Dispatch[任务下发]
D0[整套下发 workprocess] --> D1{tableData5.length 小于 1?}
D1 -->|是| DERR[提示下发失败]
D1 -->|否| D2[计划排产_生产订单_订单任务_生产工艺任务下发<br/>订单编号/物料编号/计划数量]
D2 --> D3{result != 0?}
D3 -->|是| DOK[提示操作成功<br/>刷新列表/关闭弹窗]
D3 -->|否| DOLD[提示已下发任务<br/>刷新列表/关闭弹窗]
O0[单条下发 oneworkprocessrow] --> O1[计划排产_生产订单_订单任务_单条生产工艺任务下发<br/>订单编号/物料编号/计划数量/工艺顺序]
O1 --> OOK[提示操作成功<br/>刷新列表/不关闭弹窗]
end
classDef action fill:#FFF7E6,stroke:#C47F00,color:#111;
classDef api fill:#EAF8EA,stroke:#2F855A,color:#111;
classDef decision fill:#F3E8FF,stroke:#6B46C1,color:#111;
classDef ok fill:#F0FFF4,stroke:#38A169,color:#111;
classDef err fill:#FFEAEA,stroke:#C53030,color:#111;
class B0,B1,B3,B4,B5,C0,C2,C3,C4,C5,C6,C7,S0,S2,D0,D2,O0 action;
class BSP,C2,C3,C4,C5,C7,S1,S3,D2,O1 api;
class B2,C1,C8,S4,D1,D3 decision;
class COK,SOK,SOK2,DOK,DOLD,OOK ok;
class BERR,CERR,SERR2,DERR err;

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,79 @@
flowchart LR
subgraph FE[前端方法]
searchTable[searchTable<br/>订单列表查询]
editProcess[editProcess/editProcesssearch<br/>打开编辑并查工艺]
getitemdata[getitemdata<br/>查原料]
getProcess[getProcess<br/>查工序基础库]
getbasedata[getbasedata<br/>查设备基础数据]
editProcedure[editProcedure/updateProcess/updateProcess2<br/>新增或编辑工序]
orderOps[upOne/downOne/insertOne/deleteOne<br/>排序插入删除]
copyOps[copyData/searchTable2/searchTable4/submitCopy<br/>工艺拷贝]
saveOps[saveProcess/processSave<br/>启用/保存为标准工艺]
dispatchOps[workprocess/oneworkprocess<br/>任务下发]
drawingOps[getNum/getNum2<br/>图纸查看]
end
subgraph SP[存储过程/接口]
sp1[计划排产_生产订单_订单查询]
sp2[工艺管理_生产工艺_查询生产工艺]
sp3[工艺管理_获取物料原料信息]
sp4[MES_ProcessManagement_ProcessGet]
sp5[设备管理_设备信息_查询]
sp6[工艺管理_零件工序_生产工艺_修改数据]
sp7[工艺管理_零件工序_生产工艺_编辑]
sp8[工艺管理_零件工序_生产工艺_编辑插入工序]
sp9[工艺管理_零件工序_生产工艺_上移工序/下移工序/插入工序/删除工序]
sp10[工艺管理_生产工艺_生产工艺拷贝/标准工艺拷贝]
sp11[MES_ProcessManagement_ProcessBindGet]
sp12[工艺管理_制定标准工艺_拷贝生产工艺]
sp13[工艺管理_生产工艺_工艺拷贝]
sp14[工艺管理_生产工艺_启用]
sp15[车间生产管理工艺_零件工序_保存为标准工艺]
sp16[计划排产_生产订单_订单任务_生产工艺任务下发]
sp17[计划排产_生产订单_订单任务_单条生产工艺任务下发]
sp18[工艺管理_图纸维护_查看图纸]
sp19[工艺管理_工艺维护_查看图纸]
sp20[工艺管理_零件工序_生产工艺_批量生成生产工艺]
end
subgraph DB[业务数据对象]
orderData[生产订单/计划排产数据]
stdProcess[标准工艺库]
productProcess[订单级生产工艺库]
processBase[工序基础表]
deviceBase[设备基础资料<br/>量具/机床/车间]
materialData[物料原料/BOM/库存线索]
drawingData[零件图纸/工艺图纸 PDF]
taskData[生产任务/工序任务]
end
searchTable --> sp1 --> orderData
editProcess --> sp2 --> productProcess
getitemdata --> sp3 --> materialData
getProcess --> sp4 --> processBase
getbasedata --> sp5 --> deviceBase
editProcedure --> sp6 --> productProcess
editProcedure --> sp8 --> productProcess
editProcedure --> sp2
orderOps --> sp9 --> productProcess
orderOps --> sp2
editProcedure --> sp7 --> productProcess
copyOps --> sp10 --> productProcess
copyOps --> sp11 --> stdProcess
copyOps --> sp12 --> productProcess
copyOps --> sp13 --> productProcess
saveOps --> sp14 --> productProcess
saveOps --> sp15 --> stdProcess
dispatchOps --> sp16 --> taskData
dispatchOps --> sp17 --> taskData
drawingOps --> sp18 --> drawingData
drawingOps --> sp19 --> drawingData
searchTable -.批量生成入口.-> sp20 --> productProcess
classDef fe fill:#E8F3FF,stroke:#2B6CB0,color:#111;
classDef sp fill:#EAF8EA,stroke:#2F855A,color:#111;
classDef db fill:#FFF7E6,stroke:#C47F00,color:#111;
class searchTable,editProcess,getitemdata,getProcess,getbasedata,editProcedure,orderOps,copyOps,saveOps,dispatchOps,drawingOps fe;
class sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9,sp10,sp11,sp12,sp13,sp14,sp15,sp16,sp17,sp18,sp19,sp20 sp;
class orderData,stdProcess,productProcess,processBase,deviceBase,materialData,drawingData,taskData db;

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

View File

@@ -0,0 +1,338 @@
# ProcessProduct 生产工艺维护详细框图
分析对象:`src/views/ProcessManagement/ProcessProduct/index.vue`
## 1. 模块总览框图
```mermaid
flowchart TD
U[工艺员/技术人员] --> P[ProcessProduct/index.vue<br/>生产工艺维护页面]
subgraph UI[页面层]
Q[查询区<br/>生产订单/销售订单/物料编码/物料名称/计划号<br/>任务状态/属性/下达日期/工艺状态]
L[生产订单列表<br/>多选/分页/状态灯/编辑工艺]
E[编辑生产工艺弹窗<br/>原料信息/图纸/保存/下发/工序维护]
C[生产工艺拷贝弹窗<br/>标准工艺或生产工艺来源预览]
PDF[图纸预览弹窗<br/>零件图纸/工艺图纸 PDF]
end
subgraph State[前端核心状态]
tableData[tableData<br/>订单列表]
selectedRow[selectedRow<br/>当前订单]
multipleSelection[multipleSelection<br/>批量选中订单]
tableData5[tableData5<br/>当前生产工艺明细]
tableData4[tableData4/filteredTableData4<br/>工序基础库]
tableData6[tableData6<br/>拷贝来源工艺预览]
basedata[basedatagj/basedatajc/basedatacj<br/>量具/机床/车间]
insertidx[insertidx<br/>插入占位行 id]
itemdata[itemdata<br/>订单原料信息]
end
subgraph API[后台过程]
A1[计划排产_生产订单_订单查询]
A2[工艺管理_生产工艺_查询生产工艺]
A3[MES_ProcessManagement_ProcessGet]
A4[设备管理_设备信息_查询]
A5[工艺管理_获取物料原料信息]
A6[工艺管理_零件工序_生产工艺_*<br/>新增/编辑/插入/删除/上下移/批量生成]
A7[工艺管理_生产工艺_*<br/>拷贝/启用/来源查询]
A8[计划排产_生产订单_订单任务_*<br/>整套下发/单条下发]
A9[工艺管理_图纸维护_查看图纸<br/>工艺管理_工艺维护_查看图纸]
A10[车间生产管理工艺_零件工序_保存为标准工艺]
end
P --> Q
P --> L
P --> E
P --> C
P --> PDF
Q -->|searchTable| A1 --> tableData --> L
L -->|row-click| selectedRow
L -->|selection-change| multipleSelection
L -->|编辑工艺 editProcess| E
E -->|getitemdata| A5 --> itemdata
E -->|editProcesssearch| A2 --> tableData5
E -->|getProcess| A3 --> tableData4
E -->|getbasedata| A4 --> basedata
E -->|工序维护| A6 --> tableData5
E -->|保存/启用| A7
E -->|保存为标准工艺| A10
E -->|下发任务| A8
E -->|零件/工艺图纸| A9 --> PDF
C -->|copyData/searchTable2/searchTable4| A7 --> tableData6
C -->|submitCopy| A7 --> tableData5
multipleSelection -->|AllProductProcess| A6 --> tableData
classDef ui fill:#E8F3FF,stroke:#2B6CB0,color:#111;
classDef state fill:#FFF7E6,stroke:#C47F00,color:#111;
classDef api fill:#EAF8EA,stroke:#2F855A,color:#111;
classDef risk fill:#FFEAEA,stroke:#C53030,color:#111;
class Q,L,E,C,PDF ui;
class tableData,selectedRow,multipleSelection,tableData5,tableData4,tableData6,basedata,insertidx,itemdata state;
class A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 api;
```
## 2. 编辑生产工艺详细流程
```mermaid
flowchart TD
S[用户点击订单行: 编辑工艺] --> R1[建议先设置 selectedRow = row<br/>当前源码依赖 row-click 已触发]
R1 --> D1[打开 dialogcasual<br/>loading = true]
D1 --> P1[getitemdatarow.订单编号)]
P1 --> SP1[工艺管理_获取物料原料信息]
SP1 --> F1{U_MoType == 机加件?}
F1 -->|是| M1[写入 itemdata<br/>子件编码/名称/计划数量/材质/基本数量/存货量]
F1 -->|否| M0[过滤掉]
D1 --> P2[editProcesssearchrow]
P2 --> SP2[工艺管理_生产工艺_查询生产工艺<br/>入参: 物料编号, 订单编号]
SP2 --> T5[tableData5 = 当前生产工艺明细]
T5 --> P3[getProcess]
P3 --> SP3[MES_ProcessManagement_ProcessGet<br/>入参: 工艺编号='']
SP3 --> G1[tableData4/filteredTableData4<br/>左侧工序基础库]
T5 --> P4[getbasedata]
P4 --> SP4[设备管理_设备信息_查询]
SP4 --> B1{按设备类型名称分类}
B1 -->|量具| BJ[basedatagj<br/>工装量具选项]
B1 -->|机床| BC[basedatajc<br/>指定机床选项]
B1 -->|车间| BW[basedatacj<br/>车间选项]
T5 --> P5[fninsertidx]
P5 --> C1{存在空工艺名称行?}
C1 -->|是| I1[insertidx = 空行 id<br/>左侧选工序时填入占位]
C1 -->|否| I0[insertidx 保持或为 0]
P5 --> C2{工卡量具/指定机床为逗号字符串?}
C2 -->|是| I2[splitmap Number<br/>转换为多选数组]
C2 -->|否| I3[保持原值]
I1 --> READY[编辑弹窗可操作]
I0 --> READY
I2 --> READY
I3 --> READY
READY --> OP1[查看图纸]
READY --> OP2[新增/插入/删除/排序工序]
READY --> OP3[编辑工时/设备/车间/属性/说明/备注]
READY --> OP4[保存/启用]
READY --> OP5[保存为标准工艺]
READY --> OP6[整套或单条下发任务]
classDef start fill:#E8F3FF,stroke:#2B6CB0,color:#111;
classDef proc fill:#FFF7E6,stroke:#C47F00,color:#111;
classDef api fill:#EAF8EA,stroke:#2F855A,color:#111;
classDef decision fill:#F3E8FF,stroke:#6B46C1,color:#111;
classDef output fill:#F0FFF4,stroke:#38A169,color:#111;
class S,D1,READY start;
class P1,P2,P3,P4,P5,R1,OP1,OP2,OP3,OP4,OP5,OP6 proc;
class SP1,SP2,SP3,SP4 api;
class F1,B1,C1,C2 decision;
class M1,M0,T5,G1,BJ,BC,BW,I1,I0,I2,I3 output;
```
## 3. 工序维护与明细编辑流程
```mermaid
flowchart TD
START[编辑生产工艺弹窗] --> LEFT[左侧工序基础库<br/>filteredTableData4]
START --> RIGHT[右侧生产工艺明细<br/>tableData5]
LEFT --> SEARCH[输入 processSearchName]
SEARCH --> FILTER[filterProcess<br/>按 工艺名称 includes 过滤]
FILTER --> LEFT
LEFT --> CLICK[点击某个工序 editProcedurerow]
CLICK --> HASINSERT{insertidx 是否非 0?}
HASINSERT -->|否: 普通新增| ADD[组装参数<br/>工艺编号/物料编号/计划数量/订单编号]
ADD --> SPADD[工艺管理_零件工序_生产工艺_修改数据]
SPADD --> RELOAD1[重新查询生产工艺]
HASINSERT -->|是: 填入占位行| FILL[组装参数<br/>工艺编号/idd/计划数量/订单编号]
FILL --> SPFILL[工艺管理_零件工序_生产工艺_编辑插入工序]
SPFILL --> RELOAD1
RIGHT --> EDIT[编辑字段<br/>准备工时/标准工时/工时合计<br/>工卡量具/指定机床/车间/属性<br/>工艺要求/备注]
EDIT --> NORM[规范化工卡量具/指定机床<br/>数组/对象/字符串 -> 数组]
NORM --> SPEDIT[工艺管理_零件工序_生产工艺_编辑]
SPEDIT --> SILENT[当前无成功提示<br/>后台即时保存]
RIGHT --> MOVEUP[上移工序]
MOVEUP --> SPMU[工艺管理_零件工序_生产工艺_上移工序]
RIGHT --> MOVEDOWN[下移工序]
MOVEDOWN --> SPMD[工艺管理_零件工序_生产工艺_下移工序]
RIGHT --> INSERT[插入工序]
INSERT --> SPI[工艺管理_零件工序_生产工艺_插入工序<br/>生成空占位行]
RIGHT --> DELETE[删除工序]
DELETE --> SPD[工艺管理_零件工序_生产工艺_删除工序]
SPMU --> RELOAD1
SPMD --> RELOAD1
SPI --> RELOAD1
SPD --> RELOAD1
RELOAD1 --> SPQUERY[工艺管理_生产工艺_查询生产工艺]
SPQUERY --> NEWT5[刷新 tableData5]
NEWT5 --> FN[fninsertidx<br/>识别占位行/转换多选字段]
FN --> RIGHT
classDef ui fill:#E8F3FF,stroke:#2B6CB0,color:#111;
classDef action fill:#FFF7E6,stroke:#C47F00,color:#111;
classDef api fill:#EAF8EA,stroke:#2F855A,color:#111;
classDef decision fill:#F3E8FF,stroke:#6B46C1,color:#111;
classDef output fill:#F0FFF4,stroke:#38A169,color:#111;
class START,LEFT,RIGHT ui;
class SEARCH,FILTER,CLICK,ADD,FILL,EDIT,NORM,MOVEUP,MOVEDOWN,INSERT,DELETE,RELOAD1,FN action;
class SPADD,SPFILL,SPEDIT,SPMU,SPMD,SPI,SPD,SPQUERY api;
class HASINSERT decision;
class SILENT,NEWT5 output;
```
## 4. 批量生成、拷贝、保存、下发流程
```mermaid
flowchart TD
subgraph Batch[批量生成生产工艺]
B0[列表勾选订单] --> B1[AllProductProcess]
B1 --> B2{multipleSelection.length >= 1?}
B2 -->|否| BERR[提示: 请勾选数据]
B2 -->|是| B3[过滤选中行<br/>标准工艺 == 1 且 生产工艺 != 1]
B3 --> B4[拼接订单编号/物料编号/计划数量<br/>逗号字符串]
B4 --> BSP[工艺管理_零件工序_生产工艺_批量生成生产工艺]
BSP --> B5[刷新订单列表 searchTable]
end
subgraph Copy[工艺拷贝 当前入口被注释]
C0[copyData 打开生产工艺拷贝弹窗] --> C1{processprodutc 勾选?}
C1 -->|否: 标准工艺来源| C2[工艺管理_生产工艺_标准工艺拷贝<br/>获取候选零件]
C2 --> C3[MES_ProcessManagement_ProcessBindGet<br/>预览标准工艺明细]
C1 -->|是: 生产工艺来源| C4[工艺管理_生产工艺_生产工艺拷贝<br/>获取候选物料]
C4 --> C5[工艺管理_制定标准工艺_拷贝生产工艺<br/>预览生产工艺明细]
C3 --> C6[submitCopy]
C5 --> C6
C6 --> C7[工艺管理_生产工艺_工艺拷贝<br/>物料编号/零件图号/订单编号/计划数量/工艺类型]
C7 --> C8{result == '1'?}
C8 -->|是| COK[提示拷贝成功<br/>刷新当前生产工艺]
C8 -->|否| CERR[提示拷贝失败]
end
subgraph Save[保存与沉淀]
S0[保存按钮 saveProcess] --> S1[工艺管理_生产工艺_启用<br/>入参: 订单编号]
S1 --> SOK[提示操作成功]
S2[保存为标准工艺 processSave] --> S3[车间生产管理工艺_零件工序_保存为标准工艺<br/>入参: 物料编号/订单编号]
S3 --> S4{result == '1'?}
S4 -->|是| SOK2[提示保存成功]
S4 -->|否| SERR2[提示保存失败]
end
subgraph Dispatch[任务下发]
D0[整套下发 workprocess] --> D1{tableData5.length 小于 1?}
D1 -->|是| DERR[提示下发失败]
D1 -->|否| D2[计划排产_生产订单_订单任务_生产工艺任务下发<br/>订单编号/物料编号/计划数量]
D2 --> D3{result != 0?}
D3 -->|是| DOK[提示操作成功<br/>刷新列表/关闭弹窗]
D3 -->|否| DOLD[提示已下发任务<br/>刷新列表/关闭弹窗]
O0[单条下发 oneworkprocessrow] --> O1[计划排产_生产订单_订单任务_单条生产工艺任务下发<br/>订单编号/物料编号/计划数量/工艺顺序]
O1 --> OOK[提示操作成功<br/>刷新列表/不关闭弹窗]
end
classDef action fill:#FFF7E6,stroke:#C47F00,color:#111;
classDef api fill:#EAF8EA,stroke:#2F855A,color:#111;
classDef decision fill:#F3E8FF,stroke:#6B46C1,color:#111;
classDef ok fill:#F0FFF4,stroke:#38A169,color:#111;
classDef err fill:#FFEAEA,stroke:#C53030,color:#111;
class B0,B1,B3,B4,B5,C0,C2,C3,C4,C5,C6,C7,S0,S2,D0,D2,O0 action;
class BSP,C2,C3,C4,C5,C7,S1,S3,D2,O1 api;
class B2,C1,C8,S4,D1,D3 decision;
class COK,SOK,SOK2,DOK,DOLD,OOK ok;
class BERR,CERR,SERR2,DERR err;
```
## 5. 后台过程关系框图
```mermaid
flowchart LR
subgraph FE[前端方法]
searchTable[searchTable<br/>订单列表查询]
editProcess[editProcess/editProcesssearch<br/>打开编辑并查工艺]
getitemdata[getitemdata<br/>查原料]
getProcess[getProcess<br/>查工序基础库]
getbasedata[getbasedata<br/>查设备基础数据]
editProcedure[editProcedure/updateProcess/updateProcess2<br/>新增或编辑工序]
orderOps[upOne/downOne/insertOne/deleteOne<br/>排序插入删除]
copyOps[copyData/searchTable2/searchTable4/submitCopy<br/>工艺拷贝]
saveOps[saveProcess/processSave<br/>启用/保存为标准工艺]
dispatchOps[workprocess/oneworkprocess<br/>任务下发]
drawingOps[getNum/getNum2<br/>图纸查看]
end
subgraph SP[存储过程/接口]
sp1[计划排产_生产订单_订单查询]
sp2[工艺管理_生产工艺_查询生产工艺]
sp3[工艺管理_获取物料原料信息]
sp4[MES_ProcessManagement_ProcessGet]
sp5[设备管理_设备信息_查询]
sp6[工艺管理_零件工序_生产工艺_修改数据]
sp7[工艺管理_零件工序_生产工艺_编辑]
sp8[工艺管理_零件工序_生产工艺_编辑插入工序]
sp9[工艺管理_零件工序_生产工艺_上移工序/下移工序/插入工序/删除工序]
sp10[工艺管理_生产工艺_生产工艺拷贝/标准工艺拷贝]
sp11[MES_ProcessManagement_ProcessBindGet]
sp12[工艺管理_制定标准工艺_拷贝生产工艺]
sp13[工艺管理_生产工艺_工艺拷贝]
sp14[工艺管理_生产工艺_启用]
sp15[车间生产管理工艺_零件工序_保存为标准工艺]
sp16[计划排产_生产订单_订单任务_生产工艺任务下发]
sp17[计划排产_生产订单_订单任务_单条生产工艺任务下发]
sp18[工艺管理_图纸维护_查看图纸]
sp19[工艺管理_工艺维护_查看图纸]
sp20[工艺管理_零件工序_生产工艺_批量生成生产工艺]
end
subgraph DB[业务数据对象]
orderData[生产订单/计划排产数据]
stdProcess[标准工艺库]
productProcess[订单级生产工艺库]
processBase[工序基础表]
deviceBase[设备基础资料<br/>量具/机床/车间]
materialData[物料原料/BOM/库存线索]
drawingData[零件图纸/工艺图纸 PDF]
taskData[生产任务/工序任务]
end
searchTable --> sp1 --> orderData
editProcess --> sp2 --> productProcess
getitemdata --> sp3 --> materialData
getProcess --> sp4 --> processBase
getbasedata --> sp5 --> deviceBase
editProcedure --> sp6 --> productProcess
editProcedure --> sp8 --> productProcess
editProcedure --> sp2
orderOps --> sp9 --> productProcess
orderOps --> sp2
editProcedure --> sp7 --> productProcess
copyOps --> sp10 --> productProcess
copyOps --> sp11 --> stdProcess
copyOps --> sp12 --> productProcess
copyOps --> sp13 --> productProcess
saveOps --> sp14 --> productProcess
saveOps --> sp15 --> stdProcess
dispatchOps --> sp16 --> taskData
dispatchOps --> sp17 --> taskData
drawingOps --> sp18 --> drawingData
drawingOps --> sp19 --> drawingData
searchTable -.批量生成入口.-> sp20 --> productProcess
classDef fe fill:#E8F3FF,stroke:#2B6CB0,color:#111;
classDef sp fill:#EAF8EA,stroke:#2F855A,color:#111;
classDef db fill:#FFF7E6,stroke:#C47F00,color:#111;
class searchTable,editProcess,getitemdata,getProcess,getbasedata,editProcedure,orderOps,copyOps,saveOps,dispatchOps,drawingOps fe;
class sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9,sp10,sp11,sp12,sp13,sp14,sp15,sp16,sp17,sp18,sp19,sp20 sp;
class orderData,stdProcess,productProcess,processBase,deviceBase,materialData,drawingData,taskData db;
```

View File

@@ -0,0 +1,547 @@
# ProcessManagement/ProcessProduct/index 模块详细功能分析
分析对象:`src/views/ProcessManagement/ProcessProduct/index.vue`
## 1. 模块定位
该模块是“生产工艺维护”页面,用于围绕生产订单维护订单级生产工艺。它不是单纯的工艺基础资料维护,而是把“生产订单、物料、标准工艺、生产工艺、图纸、任务下发”串在一起:
- 查询生产订单及其标准工艺、生产工艺、图纸、任务状态。
- 对单个订单/物料维护生产工艺路线。
- 从工序基础库新增、插入、删除、调整生产工艺工序。
- 编辑工序工时、工装量具、指定机床、车间、属性、工序说明和备注。
- 从标准工艺或已有生产工艺拷贝生成当前订单生产工艺。
- 批量按标准工艺生成生产工艺。
- 将生产工艺保存启用,并可下发为生产任务。
- 查看零件图纸、工艺图纸 PDF。
- 可把当前订单生产工艺保存回标准工艺。
## 2. 页面结构
页面由三个主要区域组成:
1. 生产订单查询区
- 输入条件:生产订单、销售订单、物料编码、物料名称、计划号。
- 下拉条件:任务状态、属性、工艺状态。
- 日期条件:下达日期范围。
- 操作按钮:查询、批量生成生产工艺。
2. 生产订单列表
- 支持多选,用于批量生成生产工艺。
- 展示销售订单、计划号、生产订单、物料编码、物料名称、属性、计划数、下达日期、计划开始、计划完成。
- 通过状态灯展示加急状态、标准工艺、生产工艺、图纸。
- 每行提供“编辑工艺”入口。
- 底部有分页,支持每页 20、50、100 条。
3. 弹窗
- `编辑生产工艺`:核心维护弹窗。
- `生产工艺拷贝`:代码中已实现,用于从标准工艺或生产工艺拷贝;但当前模板里的“拷贝”按钮被注释,页面默认没有显式入口。
- `图纸`PDF 预览弹窗。
## 3. 查询与列表功能
页面创建时会自动调用 `searchTable()` 查询订单列表。
查询入参:
- `订单号`:来自 `orderNo`,为空时传 `0`。
- `合同号`:销售订单。
- `产品编码`:物料编码。
- `产品名称`:物料名称。
- `下达日期1`、`下达日期2`:日期范围。
- `任务状态`:默认 `1`,即未下发。
- `订单状态`:默认 `1`,即机加件。
- `工艺状态`:默认 `0`,即全部。
- `计划号`。
- `PageCurrent`、`PageSize`、`PageCount`、`ItemCount`:分页和输出参数。
调用后台:
- `计划排产_生产订单_订单查询`
返回处理:
- `response.data.result` 赋给 `tableData`。
- `response.data.output[0].ItemCount` 转成 `total1`,驱动分页总数。
列表状态灯含义:
- `加急状态 == 1` 显示绿色,否则灰色。
- `标准工艺 == 1` 显示绿色,否则灰色。
- `生产工艺 == 1` 显示绿色,否则灰色。
- `worker != 0` 认为已有图纸,显示绿色,否则灰色。
## 4. 编辑生产工艺主流程
用户点击某行“编辑工艺”后执行 `editProcess(row)`
1. 打开 `dialogcasual` 编辑弹窗。
2. 开启 loading。
3. 调用 `getitemdata(row.订单编号)` 获取该订单的原料信息。
4. 调用 `editProcesssearch(row)` 查询当前订单生产工艺。
### 4.1 原料信息
`getitemdata(item)` 根据订单编号查询原料:
- 后台过程:`工艺管理_获取物料原料信息`
- 入参:`订单编号`
- 仅保留 `U_MoType == '机加件'` 的子件。
- 展示字段:子件编码、子件名称、计划数量、材质、基本数量、存货量、待出数量、拣配数量。
这些原料信息展示在编辑弹窗顶部,用于工艺员维护工艺时参考物料和库存情况。
### 4.2 当前生产工艺查询
`editProcesssearch(row)` 查询生产工艺明细:
- 后台过程:`工艺管理_生产工艺_查询生产工艺`
- 入参:`物料编号`、`订单编号`
查询成功后同时加载:
- 工序基础列表:`getProcess()`
- 设备基础数据:`getbasedata()`
- 当前生产工艺明细:`tableData5`
- 插入占位行检测和设备字段转换:`fninsertidx()`
## 5. 编辑弹窗功能
编辑弹窗顶部展示:
- 当前物料编码。
- 当前物料名称。
- 机加原料清单。
弹窗按钮:
- `零件图纸`:查看零件图纸 PDF。
- `工艺图纸`:查看工艺图纸 PDF。
- `保存为标准工艺`:把当前生产工艺保存为标准工艺。
- `下发任务`:把整套生产工艺下发为生产任务。
- `保存/已保存`:启用当前生产工艺。
弹窗主体左右两栏:
- 左侧是工序基础库,支持按工序名称过滤,点击工序可加入当前生产工艺。
- 右侧是当前订单生产工艺明细,支持编辑、排序、插入、删除和单条下发。
## 6. 工序基础库
`getProcess()` 调用:
- 后台过程:`MES_ProcessManagement_ProcessGet`
- 入参:`工艺编号 = ''`
返回数据:
- 保存到 `tableData4`。
- 同步到 `filteredTableData4`。
`filterProcess()` 根据 `processSearchName` 做前端过滤:
- 匹配字段:`工艺名称`
- 过滤逻辑:`item.工艺名称.includes(processSearchName)`
点击左侧工序触发 `editProcedure(row)`。
## 7. 新增/插入生产工艺工序
### 7.1 普通新增工序
当 `insertidx` 为 0 时,点击左侧工序执行普通新增:
- 后台过程:`工艺管理_零件工序_生产工艺_修改数据`
- 入参:
- `工艺编号`
- `物料编号`
- `计划数量`
- `订单编号`
新增成功后重新查询当前生产工艺:
- `工艺管理_生产工艺_查询生产工艺`
### 7.2 插入占位行后补入工序
当 `insertidx` 非 0 时,表示右侧工艺表里存在一条空工序占位行。点击左侧工序会调用 `updateProcess2(param1)`
- 后台过程:`工艺管理_零件工序_生产工艺_编辑插入工序`
- 入参:
- `工艺编号`
- `idd`:占位行 id
- `计划数量`
- `订单编号`
成功后重新查询生产工艺,并把 `insertidx` 重置为 0。
### 7.3 插入空工序行
右侧点击某行的“插入工序”按钮执行 `insertOne(row)`
- 后台过程:`工艺管理_零件工序_生产工艺_插入工序`
- 入参:
- `零件图号`:实际传当前 `selectedRow.物料编号`
- `idd`:当前行 id
- `订单编号`
该过程应在当前行附近生成空工序占位,之后用户再从左侧工序基础库选择工序填入。
## 8. 编辑生产工艺明细
右侧生产工艺表可编辑字段:
- `准备工时`
- `标准工时`
- `工时合计`
- `工卡量具`
- `指定机床`
- `车间`
- `属性`
- `工艺要求`
- `备注`
字段变更触发 `updateProcess(row)`
- 后台过程:`工艺管理_零件工序_生产工艺_编辑`
- 入参:
- `idd`
- `工艺要求`
- `准备工时`
- `标准工时`
- `工时合计`
- `工卡量具`
- `指定机床`
- `车间`
- `备注`
- `属性`
`工卡量具` 和 `指定机床` 支持数组、对象、字符串三种输入形态。方法会统一转换成数组再提交。
注意:工时输入使用 `@input`,每次输入都会调用后台编辑过程;工序说明和备注使用 `@change`,失焦或确认后提交。
## 9. 工序排序与删除
右侧每条工序提供:
- 下移工序:`downOne(row)`
- 上移工序:`upOne(row)`
- 插入工序:`insertOne(row)`
- 删除工序:`deleteOne(row)`
- 单条下发任务:`oneworkprocess(row)`
排序/删除调用过程:
- 上移:`工艺管理_零件工序_生产工艺_上移工序`
- 下移:`工艺管理_零件工序_生产工艺_下移工序`
- 删除:`工艺管理_零件工序_生产工艺_删除工序`
通用入参:
- `物料编号`
- `idd`
- `订单编号`
每次操作成功后都会重新调用:
- `工艺管理_生产工艺_查询生产工艺`
并重新执行 `fninsertidx()` 处理空工序占位和设备字段格式。
## 10. 设备与属性基础数据
`getbasedata()` 调用:
- 后台过程:`设备管理_设备信息_查询`
按 `设备类型名称` 分类:
- `量具` -> `basedatagj`,用于工装量具多选。
- `机床` -> `basedatajc`,用于指定机床多选。
- `车间` -> `basedatacj`,用于车间下拉。
工序属性下拉为前端固定值:
- 外协
- 自制
设备字段后端返回通常是逗号字符串,`fninsertidx()` 和 `datadoing()` 会把:
- `工卡量具`
- `指定机床`
转换为数字数组,方便 Element UI 多选框回显。
## 11. 拷贝生产工艺功能
代码中实现了 `copyData()`、`submitCopy()`、`searchTable2()`、`searchTable4()`,用于从其他工艺来源拷贝到当前订单。
当前模板中原“拷贝”按钮被注释:
```vue
<!-- <el-button ... @click="copyData()">拷贝</el-button> -->
```
因此此能力在源码中存在,但当前页面默认不可见,除非后续恢复按钮或从其他逻辑触发。
### 11.1 选择拷贝来源
`processprodutc` 为勾选状态时,表示从生产工艺拷贝:
- 候选来源过程:`工艺管理_生产工艺_生产工艺拷贝`
- 明细查询过程:`工艺管理_制定标准工艺_拷贝生产工艺`
- 选择字段:`物料编号`
未勾选时,表示从标准工艺拷贝:
- 候选来源过程:`工艺管理_生产工艺_标准工艺拷贝`
- 明细查询过程:`MES_ProcessManagement_ProcessBindGet`
- 选择字段:`零件图号`
### 11.2 确认拷贝
`submitCopy()` 调用:
- 后台过程:`工艺管理_生产工艺_工艺拷贝`
入参:
- `物料编号`:当前订单物料编号。
- `零件图号`:选择的来源物料/零件。
- `订单编号`:当前订单编号。
- `计划数量`:当前订单计划数量。
- `工艺类型``processprodutc` 勾选时为 1否则为 0。
返回 `response.data[0].result === '1'` 判定拷贝成功,然后刷新当前生产工艺。
## 12. 批量生成生产工艺
列表多选后点击“批量生成生产工艺”执行 `AllProductProcess()`。
筛选逻辑:
- 只处理 `标准工艺 == 1` 且 `生产工艺 != 1` 的选中行。
- 把符合条件的订单编号、物料编号、计划数量分别用逗号拼接。
调用后台:
- `工艺管理_零件工序_生产工艺_批量生成生产工艺`
入参:
- `订单编号`
- `零件图号`:实际传物料编号列表。
- `计划数量`
成功后刷新订单列表。
注意:如果选中了数据但没有任何行满足“有标准工艺且未生成生产工艺”,当前代码仍会提交空字符串参数,没有前端提示。
## 13. 保存、启用、保存为标准工艺
### 13.1 保存/启用生产工艺
`saveProcess()` 调用:
- 后台过程:`工艺管理_生产工艺_启用`
- 入参:`订单编号`
该动作更像“启用当前订单生产工艺”,成功后只提示“操作成功”,当前代码未立即刷新生产工艺明细,也未关闭弹窗。
### 13.2 保存为标准工艺
`processSave()` 调用:
- 后台过程:`车间生产管理工艺_零件工序_保存为标准工艺`
- 入参:
- `物料编号`
- `订单编号`
返回 `result === '1'` 时提示保存成功,否则提示保存失败。
该功能用于把订单级生产工艺沉淀回物料标准工艺。
## 14. 任务下发
### 14.1 整套生产工艺下发
点击编辑弹窗顶部“下发任务”执行 `workprocess()`。
前置判断:
- `tableData5.length < 1` 时提示下发失败。
调用后台:
- `计划排产_生产订单_订单任务_生产工艺任务下发`
入参:
- `订单编号`
- `物料编号`
- `计划数量`
返回处理:
- `response.data[0].result != 0`:认为下发成功。
- 否则提示“已下发任务”。
- 无论成功或已下发,都会刷新订单列表并关闭编辑弹窗。
- catch 分支也提示成功,说明这里对后台异常处理较宽松。
### 14.2 单条工序下发
右侧工序行点击“下发任务”执行 `oneworkprocess(row)`
- 后台过程:`计划排产_生产订单_订单任务_单条生产工艺任务下发`
- 入参:
- `订单编号`
- `物料编号`
- `计划数量`
- `工艺顺序`
成功后刷新订单列表,但不关闭编辑弹窗。
## 15. 图纸查看
### 15.1 零件图纸
`getNum()` 调用:
- 后台过程:`工艺管理_图纸维护_查看图纸`
- 入参:`物料编号`
如果返回数据非空:
- 使用 `MESDownFile + uid + '.pdf'` 拼出 PDF 地址。
- 打开 `seeVisible` 弹窗。
- 调用 `seepdf(pdfSrc, 'see')` 渲染 PDF。
否则提示“未上传图纸”。
### 15.2 工艺图纸
`getNum2()` 调用:
- 后台过程:`工艺管理_工艺维护_查看图纸`
- 入参:`物料编号`
渲染逻辑与零件图纸相同。
## 16. 数据状态与关键变量
核心状态:
- `tableData`:订单列表。
- `tableData5`:当前订单生产工艺明细。
- `tableData4`:工序基础库。
- `filteredTableData4`:过滤后的工序基础库。
- `tableData3`:拷贝来源候选列表。
- `tableData6`:拷贝来源工艺明细预览。
- `selectedRow`:当前选中的订单行。
- `multipleSelection`:订单列表多选项。
- `itemdata`:当前订单机加原料信息。
- `insertidx`:空工序占位行 id决定点击左侧工序是新增还是填入占位。
- `processStatus`:控制“保存/已保存”按钮显示,但当前代码中基本一直被置为 0。
- `taskstatus`:默认 `1`,页面初始只查未下发。
- `orderstatus`:默认 `1`,页面初始只查机加件。
- `standardprocess`:默认 `0`,工艺状态全部。
- `basedatagj`、`basedatajc`、`basedatacj`:量具、机床、车间选项。
## 17. 后台过程清单
本页面直接调用的后台过程:
- `工艺管理_获取物料原料信息`
- `工艺管理_生产工艺_查询生产工艺`
- `工艺管理_生产工艺_工艺拷贝`
- `工艺管理_生产工艺_生产工艺拷贝`
- `工艺管理_生产工艺_标准工艺拷贝`
- `计划排产_生产订单_订单查询`
- `计划排产_生产订单_订单任务_生产工艺任务下发`
- `计划排产_生产订单_订单任务_单条生产工艺任务下发`
- `工艺管理_零件工序_生产工艺_批量生成生产工艺`
- `设备管理_设备信息_查询`
- `MES_ProcessManagement_ProcessBindGet`
- `工艺管理_制定标准工艺_拷贝生产工艺`
- `MES_ProcessManagement_ProcessGet`
- `车间生产管理工艺_零件工序_保存为标准工艺`
- `工艺管理_图纸维护_查看图纸`
- `工艺管理_工艺维护_查看图纸`
- `工艺管理_零件工序_生产工艺_修改数据`
- `工艺管理_零件工序_生产工艺_编辑`
- `工艺管理_零件工序_生产工艺_编辑插入工序`
- `工艺管理_零件工序_生产工艺_删除工序`
- `工艺管理_零件工序_生产工艺_上移工序`
- `工艺管理_零件工序_生产工艺_下移工序`
- `工艺管理_零件工序_生产工艺_插入工序`
- `工艺管理_生产工艺_启用`
## 18. 业务数据流
典型流程如下:
1. 工艺员进入页面,默认查询未下发的机加件订单。
2. 工艺员按订单号、销售订单、物料、计划号、工艺状态等条件定位订单。
3. 如果订单已有标准工艺但未生成生产工艺,可批量生成生产工艺。
4. 点击“编辑工艺”进入订单级工艺维护。
5. 系统加载当前订单原料、生产工艺、工序基础库、设备基础数据。
6. 工艺员从左侧工序库添加工序,或对已有工序做插入、删除、上下移动。
7. 工艺员维护每道工序的工时、工装量具、指定机床、车间、外协/自制属性、工艺要求和备注。
8. 工艺员可查看零件图纸、工艺图纸辅助判断。
9. 工艺员保存/启用生产工艺。
10. 工艺员可将生产工艺保存为标准工艺。
11. 工艺确认后下发整套生产任务,或只下发单条工序任务。
## 19. 与其他模块关系
该模块位于工艺管理与计划排产之间,是订单进入生产执行前的关键节点。
- 上游依赖:
- 生产订单/计划排产数据。
- 标准工艺数据。
- 工序基础资料。
- 设备基础资料。
- 图纸维护资料。
- 下游影响:
- 生产任务下发。
- 排产、报工、质检、生产计划跟踪等模块读取任务和工艺路线。
- 生产工艺的标准工时、准备工时、外协/自制属性会影响计划工时、任务执行和统计报表。
旧技术文档中也将核心数据归为:
- `基础表_工序`
- `车间生产管理工艺_零件工序_工艺库`
- `车间生产管理工艺_零件生产工艺_工艺库`
- `View_标准工艺视图`
- `View_生产工艺视图`
- `物料基础数据_零件图纸`
- `物料基础数据_工艺图纸`
## 20. 代码层面的注意点
1. `selectedRow` 只在表格行点击时赋值。点击“编辑工艺”时没有在 `editProcess(row)` 内显式设置 `selectedRow = row`,依赖表格行点击事件是否先触发。更稳妥的写法应在 `editProcess(row)` 开头赋值。
2. `processStatus` 当前主要被置为 0`已保存` 状态很难出现。需要结合后端返回或生产工艺状态重新设计。
3. “拷贝”按钮被注释,但相关代码仍完整存在。如果业务需要拷贝,应恢复入口并确认交互。
4. 批量生成时,如果选中行都不满足“有标准工艺且未生成生产工艺”,代码会提交空参数。建议增加前端校验并提示“所选数据无可生成项”。
5. `workprocess()` 的 catch 分支提示“操作成功”,可能掩盖真实失败。建议区分网络/后台异常。
6. `oneworkprocess()` 的 tooltip 文案仍是“删除工序”,但按钮实际是“下发任务”,提示文案不一致。
7. 工时字段使用 `@input` 直接调用后台,连续输入会频繁请求。建议防抖或改为 `@change`。
8. `insertidx` 在 `fninsertidx()` 中只要发现空 `工艺名称` 就赋值,但没有在每次扫描前清零,可能保留旧值。虽然部分流程会重置,但仍存在状态残留风险。
9. `dialogVisible` 在 data 中重复定义,`loading`、`productName`、`pageCurrent`、`pageSize` 也有重复定义或语义冲突,建议整理。
10. 日期控件类型为 `datetimerange`,但 `value-format` 是 `yyyy-MM-dd`,实际只传日期,不含时分秒。
## 21. 总结
`ProcessProduct/index.vue` 是订单级生产工艺维护页面。它的核心价值是把标准工艺和工序基础资料转成可执行的生产订单工艺,并在确认后下发到生产任务。该页面承担的功能包括订单查询、生产工艺生成、工艺路线编辑、工时和设备维护、图纸查看、工艺拷贝、保存启用、保存为标准工艺、整套或单条任务下发。
从业务链路看,该模块是“工艺准备完成”到“生产任务执行”的转换点;从数据风险看,生产工艺一旦下发会影响排产、报工、质检和统计,因此保存、启用、下发、编辑已下发工艺等行为需要明确状态控制。

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 742 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 KiB

Some files were not shown because too many files have changed in this diff Show More