feat: update MES tracking and timesheet reports

This commit is contained in:
meswork764
2026-06-22 18:07:51 +08:00
parent ab508369c9
commit 20c6d587ad
22 changed files with 3136 additions and 2 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,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

Binary file not shown.

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,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

@@ -54,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">
@@ -512,6 +513,7 @@ export default {
进度: item.进度,
拆分内码: item.拆分内码,
计划数量: item.计划数量,
标准工时: item.标准工时,
开工时间: item.开工时间,
完成数量: item.完成数量,
收料数量: item.收料数量,
@@ -551,6 +553,7 @@ export default {
进度: item.进度,
拆分内码: item.拆分内码,
计划数量: item.计划数量,
标准工时: item.标准工时,
开工时间: item.开工时间,
完成数量: item.完成数量,
收料数量: item.收料数量,

View File

@@ -81,6 +81,12 @@
</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" />
<el-table-column prop="reportQty" label="报工数量" width="90" align="center" />
@@ -162,6 +168,12 @@
</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="startTime" label="开始时间" width="150" align="center">
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.startTime : '' }}
@@ -247,6 +259,12 @@
</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>
@@ -349,6 +367,12 @@
</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="startTime" label="开始时间" width="150" align="center">
<template slot-scope="scope">
{{ scope.row.level === 3 ? scope.row.startTime : '' }}
@@ -510,6 +534,7 @@ export default {
materialCode: row.materialCode,
processName: row.processName,
operator: row.operator,
指派对象: row.指派对象,
qty: row.qty,
reportQty: row.reportQty,
planStart: row.planStart,
@@ -613,6 +638,7 @@ export default {
productCode: row.productCode,
productName: row.productName,
processName: row.processName,
指派对象: row.指派对象,
reportQty: row.reportQty,
startTime: row.startTime,
endTime: row.endTime,
@@ -683,6 +709,7 @@ export default {
productCode: row.productCode,
processName: row.processName,
operator: row.operator,
指派对象: row.指派对象,
reportQty: row.reportQty,
startTime: row.startTime,
endTime: row.endTime,

View File

@@ -230,7 +230,7 @@
<el-table-column
align="center"
label="采购收货单"
width="80"
width="100"
prop="采购收货单"
/>
<el-table-column
@@ -823,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

@@ -46,6 +46,7 @@
@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
@@ -56,11 +57,17 @@
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 />
@@ -76,6 +83,8 @@
</template>
<script>
import * as XLSX from 'xlsx'
export default {
name: 'TestAssemblyTask',
data() {
@@ -93,6 +102,13 @@ export default {
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 = []
@@ -103,12 +119,106 @@ export default {
param.push(['物料编码', this.materialCode])
const data = this.CreateData('11', '质量管理_测试装配任务_查询', param)
this.ExecDatabase(data).then(response => {
this.tableData = response.data || []
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}`
}
}
}
@@ -129,4 +239,9 @@ export default {
font-size: 14px;
margin-right: 6px;
}
::v-deep .inspection-unfinished-row > td {
background-color: #e6a23c !important;
color: #1f1f1f;
}
</style>

BIN
装配任务看板/dist.zip Normal file

Binary file not shown.

View File

@@ -15,6 +15,12 @@ const routes = [
name: "root",
component: () => import("@/views/index.vue"),
children: [],
},
{
// 测试任务看板
path: "/TestTaskDashboard",
name: "TestTaskDashboard",
component: () => import("@/views/TestTaskDashboard.vue"),
}
];

View File

@@ -0,0 +1,898 @@
<template>
<div class="assembly-dashboard"
:style="{ width: `${style.width}px`, height: `${style.height}px`, transform: style.transform }">
<div class="dashboard-shell">
<header class="dashboard-header">
<div class="brand"><img class="brand-logo" :src="clientLogoUrl" alt="RENLY" /></div>
<h1>质检测试任务看板</h1>
<div class="current-time">{{ currentTime }}</div>
</header>
<main class="dashboard-content">
<section class="summary-row">
<article v-for="item in summaryCards" :key="item.title" class="panel summary-card" :class="item.className">
<div>
<div class="summary-title">{{ item.title }}</div>
<div v-if="item.metrics" class="summary-metrics">
<div v-for="metric in item.metrics" :key="metric.label" class="summary-metric">
<span>{{ metric.label }}</span>
<b>{{ metric.value }}</b>
<small>{{ item.unit }}</small>
</div>
</div>
<div v-else class="summary-body">
<img class="summary-icon" :src="item.icon" :alt="item.title" />
<div class="summary-value" :class="item.valueClass"><span>{{ item.value }}</span><small
v-if="item.unit">{{ item.unit }}</small></div>
</div>
</div>
<div v-if="item.people" class="people-list">
<div v-for="person in item.people" :key="person.name"><span>{{ person.name }}</span><b>{{ person.group
}}</b></div>
</div>
</article>
</section>
<section class="main-grid">
<div class="left-column">
<article class="panel table-panel">
<div class="panel-caption">发货状态列表</div>
<div class="scroll-wrap">
<table>
<thead>
<tr>
<th class="idx-th">序号</th>
<th v-for="c in taskColumns2" :key="c.key">{{ c.label }}</th>
</tr>
</thead>
<tbody :style="deliveryScrollStyle">
<tr v-for="(r, i) in deliveryDisplayRows" :key="i">
<td class="idx-td">{{ r._idx }}</td>
<td v-for="c in taskColumns2" :key="c.key">{{ r[c.key] }}</td>
</tr>
</tbody>
</table>
</div>
</article>
<article class="panel table-panel task-panel">
<div class="panel-caption">测试装配任务列表</div>
<div class="scroll-wrap">
<table>
<thead>
<tr>
<th class="idx-th">序号</th>
<th v-for="c in taskColumns" :key="c.key">{{ c.label }}</th>
</tr>
</thead>
<tbody :style="taskScrollStyle">
<tr v-for="(r, i) in taskDisplayRows" :key="i" :class="{ warning: r.urgentQty > 0 }">
<td class="idx-td">{{ r._idx }}</td>
<td v-for="c in taskColumns" :key="c.key">{{ r[c.key] }}</td>
</tr>
</tbody>
</table>
</div>
</article>
</div>
<aside class="right-column">
<article class="panel table-panel">
<div class="panel-caption">在制任务缺件明细</div>
<div class="scroll-wrap">
<table>
<thead>
<tr>
<th class="idx-th">序号</th>
<th v-for="c in materialColumns" :key="c.key">{{ c.label }}</th>
</tr>
</thead>
<tbody :style="materialScrollStyle">
<tr v-for="(r, i) in materialDisplayRows" :key="i">
<td class="idx-td">{{ r._idx }}</td>
<td v-for="c in materialColumns" :key="c.key">{{ r[c.key] }}</td>
</tr>
</tbody>
</table>
</div>
</article>
<article class="panel table-panel">
<div class="panel-caption">已完工任务</div>
<div class="scroll-wrap">
<table>
<thead>
<tr>
<th class="idx-th">序号</th>
<th v-for="c in doneColumns" :key="c.key">{{ c.label }}</th>
</tr>
</thead>
<tbody :style="doneScrollStyle">
<tr v-for="(r, i) in doneDisplayRows" :key="i">
<td class="idx-td">{{ r._idx }}</td>
<td v-for="c in doneColumns" :key="c.key" :class="c.key === 'passRate' ? r.rateClass : ''">{{ r[c.key] }}</td>
</tr>
</tbody>
</table>
</div>
</article>
</aside>
</section>
</main>
</div>
</div>
</template>
<script setup>
import { computed, inject, nextTick, onMounted, onUnmounted, reactive, ref } from 'vue'
const CreateData = inject('CreateData')
const ExecDatabase = inject('ExecDatabase')
defineOptions({ name: 'AssemblyCenterTaskDashboard' })
const now = ref(new Date('2026-05-06 10:10:10'))
let timer = null
let resizeHandler = null
let scrollTimers = []
const style = reactive({ width: 1920, height: 1080, transform: 'scaleY(1) scaleX(1) translate(-50%, -50%)' })
const setScale = () => { const s = getScale(); style.transform = `scaleY(${s.y}) scaleX(${s.x}) translate(-50%, -50%)` }
const getScale = () => ({ x: window.innerWidth / style.width, y: window.innerHeight / style.height })
const pad = v => String(v).padStart(2, '0')
const currentTime = computed(() => `${now.value.getFullYear()}-${pad(now.value.getMonth() + 1)}-${pad(now.value.getDate())} ${pad(now.value.getHours())}:${pad(now.value.getMinutes())}:${pad(now.value.getSeconds())}`)
const clientLogoUrl = './public/ClientLogo.png'
const icon = name => `./public/svg/${name}.svg`
const tableData = ref([])
const getFirstRow = rows => {
if (Array.isArray(rows) && rows.length > 0) {
return rows[0]
}
return {}
}
onMounted(() => {
startClock();
setScale();
resizeHandler = setScale;
window.addEventListener('resize', resizeHandler)
searchDashboardData()
startAllScroll()
setInterval(function(){
searchDashboardData()
},600000)
})
onUnmounted(() => {
if (timer) window.clearInterval(timer);
if (resizeHandler) window.removeEventListener('resize', resizeHandler)
stopAllScroll()
})
// ============ 滚动数据 ============
const deliveryRows = ref([])
const taskRows = ref([])
const materialRows = ref([])
const doneRows = ref([])
// 每个列表的滚动偏移
const deliveryOffset = ref(0)
const taskOffset = ref(0)
const materialOffset = ref(0)
const doneOffset = ref(0)
// 可见行数
const VISIBLE_ROWS = {
delivery: 8,
task: 7,
material: 8,
done: 7
}
// 生成带序号和循环滚动的显示行
const makeDisplayRows = (rows, offset, visibleCount) => {
if (!rows || rows.length === 0) return []
const len = rows.length
const result = []
for (let i = 0; i < visibleCount; i++) {
const idx = (offset + i) % len
result.push({ ...rows[idx], _idx: idx + 1 })
}
return result
}
const deliveryDisplayRows = computed(() => makeDisplayRows(deliveryRows.value, deliveryOffset.value, VISIBLE_ROWS.delivery))
const taskDisplayRows = computed(() => makeDisplayRows(taskRows.value, taskOffset.value, VISIBLE_ROWS.task))
const materialDisplayRows = computed(() => makeDisplayRows(materialRows.value, materialOffset.value, VISIBLE_ROWS.material))
const doneDisplayRows = computed(() => makeDisplayRows(doneRows.value, doneOffset.value, VISIBLE_ROWS.done))
// 滚动样式(平滑过渡)
const deliveryScrollStyle = computed(() => ({ transition: 'none' }))
const taskScrollStyle = computed(() => ({ transition: 'none' }))
const materialScrollStyle = computed(() => ({ transition: 'none' }))
const doneScrollStyle = computed(() => ({ transition: 'none' }))
// 启动单个列表滚动
const startScroll = (rowsRef, offsetRef) => {
const id = window.setInterval(() => {
if (rowsRef.value.length > 0) {
offsetRef.value = (offsetRef.value + 1) % rowsRef.value.length
}
}, 2000)
scrollTimers.push(id)
return id
}
const startAllScroll = () => {
startScroll(deliveryRows, deliveryOffset)
startScroll(taskRows, taskOffset)
startScroll(materialRows, materialOffset)
startScroll(doneRows, doneOffset)
}
const stopAllScroll = () => {
scrollTimers.forEach(id => window.clearInterval(id))
scrollTimers = []
}
// ============ 数据查询 ============
const searchDashboardData = () => {
searchTestAssemblyTaskData()
searchQualityTimelinessData()
searchDoneTaskData()
searchMaterialshortageData()
searchDeliveryData()
}
const searchTestAssemblyTaskData = () => {
const param = [
['任务类型', '全部'],
['生产订单', ''],
['销售订单', ''],
['物料名称', ''],
['物料编码', '']
]
queryDashboardData('质量管理_测试装配任务_查询', applyTestAssemblyTaskData, param)
}
const searchQualityTimelinessData = () => {
const param = [
['任务类型', '全部'],
['生产订单', ''],
['销售订单', ''],
['物料名称', ''],
['物料编码', '']
]
queryDashboardData('质量管理_测试装配任务_质检及时率', applyQualityTimelinessData, param)
}
const searchDoneTaskData = () => {
const param = [
['任务类型', '全部'],
['生产订单', ''],
['销售订单', ''],
['物料名称', ''],
['物料编码', '']
]
queryDashboardData('质量管理_测试装配任务_完成查询', applyDoneTaskData, param)
}
const searchDeliveryData = () => {
queryDashboardData('装配中心任务看板_发货状态查询', applyDeliveryData)
}
const searchMaterialshortageData = () => {
queryDashboardData('装配中心任务看板_在制品缺件查询', applyMaterialshortageData)
}
const applyTestAssemblyTaskData = rows => {
const sortedRows = sortTestAssemblyTaskRows(rows)
const executableRows = sortedRows.filter(isInspectionUnfinished)
const valueRows = executableRows.filter(item => getTaskType(item) === '阀类')
const systemRows = executableRows.filter(item => getTaskType(item) === '系统类')
summaryCards[0].metrics[0].value = valueRows.length
summaryCards[0].metrics[1].value = systemRows.length
summaryCards[1].value = executableRows.filter(isReworkTask).length
summaryCards[3].value = executableRows.filter(item => getNumber(item.加急总数 || item.加急数量) > 0).length
summaryCards[4].value = sortedRows.reduce((sum, item) => sum + getNumber(item.异常未关闭数 || item.测试装配异常未关闭总数), 0)
applyTaskData(sortedRows)
}
const applyQualityTimelinessData = rows => {
const row = getFirstRow(rows)
summaryCards[2].value = `${getNumber(row.质检及时率).toFixed(2)}`
}
const applyDeliveryData = rows => {
deliveryRows.value = rows.map(item => {
let requiredDate = ''
if (item.要求发货日期) {
// 如果是字符串
if (typeof item.要求发货日期 === 'string') {
requiredDate = item.要求发货日期.split(' ')[0]
}
// 如果是 Date 对象
else if (item.要求发货日期 instanceof Date) {
requiredDate = item.要求发货日期.toISOString().split('T')[0]
}
// 如果是其他格式
else {
const dateStr = String(item.要求发货日期)
requiredDate = dateStr.split(' ')[0]
}
}
return {
productionOrder: item.订单编号,
salesOrder: item.合同号 || '',
materialName: item.物料描述 || '',
materialCode: item.物料编号 || '',
completeSet: item.齐套 === 1 ? '是' : '否',
issueStatus: item.发料状态 === '1' ? '发料齐套' : (item.发料状态 === '2' ? '发料缺件' : ''),
urgentQty: item.操作人,
assignQty: item.交货数量,
taskdate: requiredDate,
operator: item.任务状态 === 0 ? '待执行' : (item.发料状态 === 1 ? '可执行' : '已开工'),
}
})
}
const applyDoneTaskData = rows => {
doneRows.value = rows.map(item => ({
productionOrder: item.生产订单?.toString() || item.计划号?.toString() || '',
materialName: item.物料名称 || item.零件名称 || '',
materialCode: item.物料编码 || item.零件编码 || '',
passRate: `${getPassRate(item)}%`,
rateClass: getPassRate(item) <= 70 ? 'orange-cell' : 'green-cell'
}))
}
const applyTaskData = rows => {
taskRows.value = rows.map(item => ({
productionOrder: item.生产订单?.toString() || item.订单号?.toString() || item.计划号?.toString() || '',
salesOrder: item.销售订单 || item.合同号 || '',
materialName: item.物料名称 || item.零件名称 || '',
materialCode: item.物料编码 || item.零件编码 || '',
taskType: item.任务类型 || (String(item.自制件属性 || item.物料名称 || item.零件名称 || '').includes('系统') ? '系统类' : '阀类'),
urgentQty: getNumber(item.加急总数 || item.加急数量),
assignQty: getNumber(item.计划数量 || item.计划生产数 || item.分配数),
completeQty: getNumber(item.完成数量),
inspectQty: getNumber(item.检验数量),
expectedInspectionDate: formatDate(item.预计送检日期)
}))
}
const applyMaterialshortageData = rows => {
console.log(rows)
materialRows.value = rows.map(item => ({
wipOrder: item.DocEntry,
shortageStatus: item.U_Name,
finishTime: item.ItemCode,
owner: item.加急数量
}))
console.log(materialRows.value)
}
const queryDashboardData = (procedureName, applyData, param = []) => {
let data
data = CreateData('11', procedureName, param)
ExecDatabase(data).then(response => {
const rows = getResponseRows(response)
tableData.value = rows
applyData(rows)
})
}
const getResponseRows = response => {
if (response && Array.isArray(response.data)) {
return response.data
}
if (response && response.data && Array.isArray(response.data.result)) {
return response.data.result
}
return []
}
const getNumber = value => {
if (value === null || value === undefined || value === '') return 0
const number = Number(String(value).replace(/,/g, ''))
return Number.isNaN(number) ? 0 : number
}
const formatDate = value => {
if (!value) return ''
return String(value).split(' ')[0]
}
const getDateTime = value => {
if (!value) return Infinity
const time = new Date(String(value).replace(/-/g, '/')).getTime()
return Number.isNaN(time) ? Infinity : time
}
const getTaskType = item => item.任务类型 || (String(item.自制件属性 || item.物料名称 || item.零件名称 || '').includes('系统') ? '系统类' : '阀类')
const isInspectionUnfinished = item => getNumber(item.完成数量) > getNumber(item.检验数量)
const isReworkTask = item => String(item.检测说明 || '').includes('返工')
const sortTestAssemblyTaskRows = rows => rows.slice().sort((a, b) => {
const unfinishedA = isInspectionUnfinished(a)
const unfinishedB = isInspectionUnfinished(b)
if (unfinishedA !== unfinishedB) return unfinishedA ? -1 : 1
return getDateTime(a.预计送检日期) - getDateTime(b.预计送检日期)
})
const getPassRate = item => {
const inspectQty = getNumber(item.检验数量)
if (inspectQty <= 0) return 100
return Number(((getNumber(item.检验合格数量) * 100) / inspectQty).toFixed(2))
}
const startClock = () => { timer = window.setInterval(() => { now.value = new Date(now.value.getTime() + 1000) }, 1000) }
const svgData = svg => 'data:image/svg+xml;utf8,' + encodeURIComponent(svg)
const svgIcon = (from, to, body) => svgData(
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 72 72" fill="none">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="${from}"/>
<stop offset="1" stop-color="${to}"/>
</linearGradient>
<linearGradient id="shine" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#fff" stop-opacity=".35"/>
<stop offset="1" stop-color="#fff" stop-opacity="0"/>
</linearGradient>
<filter id="glow" x="-55%" y="-55%" width="210%" height="210%"><feGaussianBlur stdDeviation="4" result="b"/><feMerge><feMergeNode in="b"/><feMergeNode in="SourceGraphic"/></feMerge></filter>
</defs>
<rect x="7" y="7" width="58" height="58" rx="11" fill="url(#bg)" filter="url(#glow)"/>
<path d="M14 14h44v20c-10-4-29-4-44 1z" fill="url(#shine)"/>
<g transform="translate(36 36) scale(1.12) translate(-36 -36)" stroke="#fff" stroke-width="4.1" stroke-linecap="round" stroke-linejoin="round" opacity=".96">${body}</g>
</svg>`
)
const icons = {
pending: svgIcon('#37a9ff', '#0862f3', '<rect x="23" y="20" width="26" height="36" rx="4"/><path d="M29 20h14l-3-6h-8l-3 6zM29 34h14M29 43h14"/>'),
urgent: svgIcon('#ff7469', '#dc2524', '<path d="M21 55h30M25 50V34a11 11 0 0 1 22 0v16M36 13v8M18 21l6 6M54 21l-6 6M15 38h8M49 38h8"/>'),
cart: svgIcon('#28a8ff', '#0a58ff', '<path d="M16 22h7l5 25h27l5-17H28"/><circle cx="32" cy="56" r="2.8"/><circle cx="52" cy="56" r="2.8"/>'),
checklist: svgIcon('#49e89e', '#08a86e', '<rect x="21" y="17" width="32" height="42" rx="5"/><path d="M28 35l5 5 12-13M28 49h19"/>'),
returnDown: svgIcon('#ffb23f', '#fb7418', '<rect x="21" y="23" width="31" height="32" rx="4"/><path d="M36 14v24M27 31l9 9 9-9"/>'),
returnSales: svgIcon('#9867ff', '#6232e6', '<path d="M51 22H28a10 10 0 0 0 0 20h26M28 14l-11 9 11 9"/><rect x="35" y="37" width="18" height="18" rx="2"/>'),
finalCheck: svgIcon('#3a95ff', '#0a61e8', '<path d="M36 14l16 7v13c0 11-7 18-16 24-9-6-16-13-16-24V21z"/><path d="M27 37l6 6 13-15"/>'),
other: svgIcon('#4bd8ff', '#0a88cc', '<path d="M19 26l17-10 17 10-17 10zM19 26v19l17 10 17-10V26M36 36v19"/>'),
shield: svgIcon('#3a9aff', '#0861e8', '<path d="M36 14l16 7v13c0 11-7 18-16 24-9-6-16-13-16-24V21z"/><path d="M28 37l6 6 12-14"/>'),
done: svgIcon('#47eaa0', '#0da76b', '<rect x="19" y="19" width="34" height="34" rx="8"/><path d="M27 37l7 7 15-18"/>')
}
const summaryCards = [
{ title: '可执行任务数', unit: '条', className: 'executable-card', metrics: [{ label: '阀类', value: 0 }, { label: '系统类', value: 0 }] },
{ title: '待协助任务数', value: 0, unit: '条', icon: icons.pending , valueClass: 'red-text'},
{ title: '质检及时率', value: '100.00', icon: icons.finalCheck, valueClass: 'green-text full-value' },
{ title: '加急任务数', value: 125, unit: '条', icon: icons.urgent, valueClass: 'red-text' },
{ title: '异常未关闭消息数', value: 5, unit: '条', icon: icons.urgent, valueClass: 'red-text', className: 'exception-card' },
]
const taskColumns = [
{ label: '生产订单', key: 'productionOrder', width: '72px' },
{ label: '销售订单', key: 'salesOrder', width: '92px' },
{ label: '物料名称', key: 'materialName', width: '190px' },
{ label: '物料编码', key: 'materialCode', width: '176px' },
{ label: '任务类型', key: 'taskType', width: '62px' },
{ label: '加急数', key: 'urgentQty', width: '62px' },
{ label: '计划数', key: 'assignQty', width: '70px' },
{ label: '完成数', key: 'completeQty', width: '70px' },
{ label: '检验数', key: 'inspectQty', width: '70px' },
{ label: '预计送检', key: 'expectedInspectionDate', width: '88px' },
]
const taskColumns2 = [
{ label: '生产订单', key: 'productionOrder', width: '72px' },
{ label: '销售订单', key: 'salesOrder', width: '92px' },
{ label: '物料名称', key: 'materialName', width: '190px' },
{ label: '物料编码', key: 'materialCode', width: '176px' },
{ label: '数量', key: 'assignQty', width: '176px' },
{ label: '要求发货日期', key: 'taskdate', width: '176px' },
{ label: '齐套', key: 'completeSet', width: '52px' },
{ label: '发料状态', key: 'issueStatus', width: '88px' },
{ label: '操作人', key: 'urgentQty', width: '62px' },
{ label: '装配开工', key: 'operator', width: '82px' },
]
const materialColumns = [
{ label: '生产订单', key: 'wipOrder', width: '76px' },
{ label: '物料名称', key: 'shortageStatus', width: '105px' },
{ label: '物料编码', key: 'finishTime', width: '160px' },
{ label: '加急数量', key: 'owner', width: '90px' },
]
const doneColumns = [
{ label: '生产订单', key: 'productionOrder', width: '88px' },
{ label: '物料名称', key: 'materialName', width: '150px' },
{ label: '物料编码', key: 'materialCode', width: '165px' },
{ label: '合格率', key: 'passRate', width: '86px' },
]
</script>
<style scoped lang="scss">
* {
box-sizing: border-box;
}
.assembly-dashboard {
position: fixed;
left: 50%;
top: 50%;
width: 1920px;
height: 1080px;
transform-origin: 0 0;
transition: .3s;
overflow: hidden;
color: #f3f9ff;
font-family: 'Microsoft YaHei', Arial, sans-serif;
background: #07001f;
}
.dashboard-shell {
width: 100%;
height: 100%;
padding: 0 15px 15px;
}
.dashboard-header {
display: grid;
grid-template-columns: 336px 1fr 442px;
align-items: center;
height: 95px;
border-bottom: 1px solid rgba(21, 162, 240, .7);
}
.brand {
width: 300px;
height: 72px;
display: flex;
align-items: center;
overflow: visible;
position: relative;
z-index: 2;
}
.brand-logo {
width: 224px;
height: 58px;
padding: 5px 10px;
background: #ffffff;
border-radius: 6px;
object-fit: contain;
object-position: left center;
filter: drop-shadow(0 0 5px rgba(255, 255, 255, 0.28));
}
.dashboard-header h1 {
margin: 0;
color: #fff;
font-size: 55px;
font-weight: 900;
letter-spacing: .08em;
text-align: center;
}
.current-time {
padding-right: 40px;
color: #eef7ff;
font-size: 27px;
text-align: right;
}
.dashboard-content {
display: grid;
grid-template-rows: 126px 1fr;
gap: 17px;
height: calc(100% - 95px);
padding-top: 10px;
}
.summary-row {
display: grid;
grid-template-columns: 1.28fr 1fr 1fr 1fr .82fr;
gap: 17px;
}
.main-grid {
display: grid;
grid-template-columns: 2.05fr 1fr;
gap: 17px;
min-height: 0;
}
.left-column {
display: grid;
grid-template-rows: 1.05fr .9fr;
gap: 17px;
min-height: 0;
}
.right-column {
display: grid;
grid-template-rows: 1.05fr .9fr;
gap: 17px;
min-height: 0;
}
.panel {
position: relative;
border: 1px solid rgba(29, 153, 229, .78);
background: rgba(3, 16, 48, .38);
box-shadow: inset 0 0 18px rgba(27, 130, 214, .24), 0 0 10px rgba(1, 132, 220, .18);
}
.panel::before {
position: absolute;
inset: -1px;
content: '';
pointer-events: none;
background: linear-gradient(90deg, #2bd8ff 0 14px, transparent 14px) left top/14px 2px no-repeat, linear-gradient(180deg, #2bd8ff 0 14px, transparent 14px) left top/2px 14px no-repeat, linear-gradient(270deg, #2bd8ff 0 14px, transparent 14px) right top/14px 2px no-repeat, linear-gradient(180deg, #2bd8ff 0 14px, transparent 14px) right top/2px 14px no-repeat, linear-gradient(90deg, #2bd8ff 0 14px, transparent 14px) left bottom/14px 2px no-repeat, linear-gradient(0deg, #2bd8ff 0 14px, transparent 14px) left bottom/2px 14px no-repeat, linear-gradient(270deg, #2bd8ff 0 14px, transparent 14px) right bottom/14px 2px no-repeat, linear-gradient(0deg, #2bd8ff 0 14px, transparent 14px) right bottom/2px 14px no-repeat;
}
.panel::after {
position: absolute;
inset: 0;
content: '';
pointer-events: none;
box-shadow: inset 0 0 12px rgba(43, 216, 255, .12);
}
.summary-card {
display: flex;
align-items: center;
justify-content: center;
min-width: 0;
padding: 8px 18px;
}
.summary-card > div:first-child {
width: 100%;
min-width: 0;
}
.absence-card {
justify-content: space-between;
}
.absence-card > div:first-child {
width: auto;
padding-right: 22px;
border-right: 3px solid rgba(238, 247, 255, 0.92);
}
.absence-card .summary-title {
text-align: left;
}
.absence-card .summary-body {
display: flex;
gap: 26px;
width: auto;
}
.absence-card .summary-value {
display: flex;
gap: 8px;
}
.absence-card .summary-value span {
text-align: left;
}
.executable-card {
padding: 8px 16px;
}
.executable-card .summary-title {
margin-bottom: 8px;
font-size: 21px;
text-align: left;
}
.summary-metrics {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 14px;
align-items: center;
width: 100%;
}
.summary-metric {
position: relative;
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
grid-template-rows: 22px 48px;
align-items: baseline;
min-width: 0;
padding: 6px 10px 4px;
color: #fff;
font-weight: 800;
}
.summary-metric span {
grid-column: 1 / -1;
color: #89d4ff;
font-size: 18px;
line-height: 22px;
white-space: nowrap;
}
.summary-metric b {
color: #18c65b;
font-size: 50px;
line-height: 1;
text-align: right;
text-shadow: 0 0 10px rgba(24, 198, 91, .32);
}
.summary-metric small {
color: #fff;
font-size: 18px;
font-weight: 700;
text-align: left;
white-space: nowrap;
}
.exception-card {
padding: 8px 12px;
}
.exception-card .summary-title {
font-size: 18px;
}
.exception-card .summary-body {
grid-template-columns: 54px 150px;
column-gap: 16px;
}
.exception-card .summary-icon {
width: 54px;
height: 54px;
}
.exception-card .summary-value {
grid-template-columns: 105px 28px;
}
.exception-card .summary-value span {
font-size: 48px;
}
.exception-card .summary-value small {
font-size: 20px;
}
.summary-title {
margin-bottom: 5px;
color: #89d4ff;
font-size: 20px;
font-weight: 700;
text-align: left;
}
.summary-body {
display: grid;
grid-template-columns: 66px 214px;
align-items: center;
justify-content: center;
column-gap: 26px;
width: 100%;
}
.summary-icon {
width: 66px;
height: 66px;
object-fit: contain;
}
.summary-value {
display: grid;
grid-template-columns: 150px 32px;
align-items: baseline;
justify-content: center;
color: #fff;
font-weight: 900;
line-height: 1;
}
.summary-value span {
font-size: 57px;
text-align: center;
}
.summary-value small {
color: #fff;
font-size: 22px;
font-weight: 700;
text-align: left;
}
.full-value span {
grid-column: 1 / -1;
}
.red-text span {
color: #ff1e2e;
}
.green-text span {
color: #18c65b;
}
.orange-text span {
color: #ff9c12;
}
.absence-card .summary-value::before {
content: '总数:';
color: #fff;
font-size: 20px;
font-weight: 700;
}
.people-list {
min-width: 130px;
color: #fff;
font-size: 13px;
line-height: 1.75;
}
.people-list div {
display: flex;
gap: 18px;
justify-content: space-between;
}
.panel-caption {
height: 38px;
color: #8cd3ff;
font-size: 22px;
font-weight: 600;
line-height: 38px;
text-align: center;
}
.table-panel {
display: flex;
flex-direction: column;
min-width: 0;
min-height: 0;
}
.scroll-wrap {
flex: 1;
min-height: 0;
overflow: hidden;
padding: 0 9px 10px;
}
table {
width: 100%;
table-layout: fixed;
border-collapse: collapse;
}
th, td {
height: 48px;
border: 1px solid rgba(53, 149, 217, .54);
color: #f1f8ff;
font-size: 14px;
line-height: 1.18;
text-align: center;
vertical-align: middle;
white-space: pre-line;
word-break: break-all;
background: rgba(4, 24, 57, .44);
}
th {
height: 44px;
color: #bde9ff;
font-weight: 500;
background: rgba(12, 68, 119, .28);
}
.idx-th {
width: 44px;
}
.idx-td {
width: 44px;
color: #89d4ff;
font-size: 13px;
}
.task-panel td {
height: 47px;
}
.warning td {
color: #ff4949;
}
.green-cell {
color: #32ff32;
}
.orange-cell {
color: #ff7a1a;
}
</style>