From 2ac9e1f66ed834356a75276ae1138f13f1431425 Mon Sep 17 00:00:00 2001 From: zhangshun <453905631@qq.com> Date: Thu, 11 Jun 2026 17:27:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=80=E5=85=B7=E5=AF=BF?= =?UTF-8?q?=E5=91=BD=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/webpack.prod.conf.js | 5 +- .../设备管理_刀具寿命_明细_查询.sql | 45 + .../设备管理_刀具寿命_机床列表_查询.sql | 23 + ...查询_测量数据发动机在线状态_工位JPH_历史.sql | 46 + ...询_测量数据发动机在线状态_工位JPH_历史_导出.sql | 23 + ...查询_测量数据发动机在线状态_工位JPH_实时.sql | 25 + ...查询_测量数据发动机在线状态_工位节拍统计.sql | 71 ++ ...询_测量数据发动机在线状态_工位节拍统计_导出.sql | 140 +++ src/icons/svg/CylinderMaintenance.svg | 1 + src/lang/en-US.js | 78 +- src/lang/zh-CN.js | 78 +- src/styles/sidebar.scss | 162 +++- .../BasicData/PersonnelManagement/index.vue | 13 +- .../EquipmentToolLife/index.vue | 655 ++++++++++++++ .../AssemblyQualitydataQuery/index.vue | 28 +- .../InquiryTransitInformation/index.vue | 10 +- .../RecipeManagement/index.vue | 52 +- .../CylinderMaintenance/UploadExcel.vue | 134 +++ .../CylinderMaintenance/index.vue | 402 +++++++++ .../ReleaseOfProductionPlan/index.vue | 7 +- src/views/dashboard/index.vue | 814 ++++++++++++++---- src/views/layout/components/Navbar.vue | 453 +++++++--- src/views/layout/components/Sidebar/index.vue | 101 +-- src/views/login/index.vue | 617 ++++++++----- static/config.js | 2 +- 25 files changed, 3395 insertions(+), 590 deletions(-) create mode 100644 sql/EquipmentOperationAnalysis/设备管理_刀具寿命_明细_查询.sql create mode 100644 sql/EquipmentOperationAnalysis/设备管理_刀具寿命_机床列表_查询.sql create mode 100644 sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_历史.sql create mode 100644 sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_历史_导出.sql create mode 100644 sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_实时.sql create mode 100644 sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位节拍统计.sql create mode 100644 sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位节拍统计_导出.sql create mode 100644 src/icons/svg/CylinderMaintenance.svg create mode 100644 src/views/EquipmentOperationAnalysis/EquipmentToolLife/index.vue create mode 100644 src/views/WorkOrderManagement/CylinderMaintenance/UploadExcel.vue create mode 100644 src/views/WorkOrderManagement/CylinderMaintenance/index.vue diff --git a/build/webpack.prod.conf.js b/build/webpack.prod.conf.js index b2aaf64..95f8c0f 100644 --- a/build/webpack.prod.conf.js +++ b/build/webpack.prod.conf.js @@ -73,7 +73,10 @@ const webpackConfig = merge(baseWebpackConfig, { } } }), - new CssMinimizerPlugin() + new CssMinimizerPlugin({ + // TinyMCE 4 静态资源目录下的样式不参与二次压缩,避免老资源和当前压缩器的兼容问题 + exclude: /static[\\/]tinymce4\.7\.5[\\/].*\.css$/i + }) ], splitChunks: { chunks: 'all', diff --git a/sql/EquipmentOperationAnalysis/设备管理_刀具寿命_明细_查询.sql b/sql/EquipmentOperationAnalysis/设备管理_刀具寿命_明细_查询.sql new file mode 100644 index 0000000..7125939 --- /dev/null +++ b/sql/EquipmentOperationAnalysis/设备管理_刀具寿命_明细_查询.sql @@ -0,0 +1,45 @@ +IF OBJECT_ID(N'dbo.设备管理_刀具寿命_明细_查询', N'P') IS NOT NULL + DROP PROCEDURE dbo.设备管理_刀具寿命_明细_查询 +GO + +CREATE PROCEDURE dbo.设备管理_刀具寿命_明细_查询 + @设备编号 NVARCHAR(100) = N'' +AS +BEGIN + SET NOCOUNT ON + + SELECT + LTRIM(RTRIM(所在工位号)) AS 设备编号, + LTRIM(RTRIM(所在工位号)) AS 设备名称, + ISNULL(名称, '') AS 刀具名称, + ISNULL(刀具代码, '') AS 刀具代码, + ISNULL(刀具组号, '') AS 刀具组号, + ISNULL(规格, '') AS 规格, + ISNULL(型号, '') AS 型号, + CAST(ISNULL(刀具额定寿命, 0) AS DECIMAL(18, 2)) AS 额定寿命, + CAST(ISNULL(已用寿命, 0) AS DECIMAL(18, 2)) AS 已用寿命, + CAST(ISNULL(预警值1, 0) AS DECIMAL(18, 2)) AS 预警值1, + CAST(ISNULL(刀具额定寿命, 0) - ISNULL(已用寿命, 0) AS DECIMAL(18, 2)) AS 剩余寿命, + CASE + WHEN ISNULL(刀具额定寿命, 0) > 0 AND ISNULL(已用寿命, 0) >= ISNULL(刀具额定寿命, 0) THEN N'报废' + WHEN ISNULL(预警值1, 0) > 0 AND ISNULL(已用寿命, 0) >= ISNULL(预警值1, 0) THEN N'预警' + ELSE N'正常' + END AS 状态, + 所属工艺, + 采购日期, + 装刀到工位日期, + 操作时间 + FROM dbo.设备管理_刀具设备台账 + WHERE ISNULL(LTRIM(RTRIM(@设备编号)), '') = '' + OR LTRIM(RTRIM(所在工位号)) = LTRIM(RTRIM(@设备编号)) + ORDER BY + LTRIM(RTRIM(所在工位号)), + CASE + WHEN ISNULL(刀具额定寿命, 0) > 0 AND ISNULL(已用寿命, 0) >= ISNULL(刀具额定寿命, 0) THEN 3 + WHEN ISNULL(预警值1, 0) > 0 AND ISNULL(已用寿命, 0) >= ISNULL(预警值1, 0) THEN 2 + ELSE 1 + END DESC, + ISNULL(名称, ''), + ISNULL(刀具代码, '') +END +GO diff --git a/sql/EquipmentOperationAnalysis/设备管理_刀具寿命_机床列表_查询.sql b/sql/EquipmentOperationAnalysis/设备管理_刀具寿命_机床列表_查询.sql new file mode 100644 index 0000000..47f4ba7 --- /dev/null +++ b/sql/EquipmentOperationAnalysis/设备管理_刀具寿命_机床列表_查询.sql @@ -0,0 +1,23 @@ +IF OBJECT_ID(N'dbo.设备管理_刀具寿命_机床列表_查询', N'P') IS NOT NULL + DROP PROCEDURE dbo.设备管理_刀具寿命_机床列表_查询 +GO + +CREATE PROCEDURE dbo.设备管理_刀具寿命_机床列表_查询 +AS +BEGIN + SET NOCOUNT ON + + /* + 当前表“设备管理_刀具设备台账”中: + 1. 设备编号为空 + 2. 所在工位号有实际值,可作为设备/机床维度使用 + */ + + SELECT DISTINCT + LTRIM(RTRIM(所在工位号)) AS 设备编号, + LTRIM(RTRIM(所在工位号)) AS 设备名称 + FROM dbo.设备管理_刀具设备台账 + WHERE ISNULL(LTRIM(RTRIM(所在工位号)), '') <> '' + ORDER BY LTRIM(RTRIM(所在工位号)) +END +GO diff --git a/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_历史.sql b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_历史.sql new file mode 100644 index 0000000..4493d88 --- /dev/null +++ b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_历史.sql @@ -0,0 +1,46 @@ +CREATE OR ALTER PROCEDURE [dbo].[质量数据查询_测量数据发动机在线状态_工位JPH_历史] + @开始时间 nvarchar(50) = null, + @结束时间 nvarchar(50) = null, + @工位_check bit = null, + @工位列表 nvarchar(max) = null, + @订单号_check bit = null, + @订单号 nvarchar(50) = null, + @产品型号代码_check bit = null, + @产品型号代码 nvarchar(50) = null +AS +BEGIN + SET NOCOUNT ON + + DECLARE @startTime datetime = null + DECLARE @endTime datetime = null + + IF @开始时间 IS NOT NULL AND LTRIM(RTRIM(@开始时间)) <> N'' + SET @startTime = CONVERT(datetime, @开始时间 + N' 00:00:00', 120) + + IF @结束时间 IS NOT NULL AND LTRIM(RTRIM(@结束时间)) <> N'' + SET @endTime = CONVERT(datetime, @结束时间 + N' 23:59:59', 120) + + ;WITH StationFilter AS ( + SELECT LTRIM(RTRIM(value)) AS 工位号 + FROM STRING_SPLIT(ISNULL(@工位列表, N''), N',') + WHERE LTRIM(RTRIM(value)) <> N'' + ) + SELECT + 日期 = CONVERT(nvarchar(10), CONVERT(datetime, [离开时间], 120), 23), + 小时段 = RIGHT('0' + CAST(DATEPART(HOUR, CONVERT(datetime, [离开时间], 120)) AS nvarchar(2)), 2) + N':00', + 产量 = COUNT(1) + FROM [dbo].[测量数据发动机在线状态] m + WHERE m.[ID] <> 0 + AND m.[离开时间] IS NOT NULL + AND (@startTime IS NULL OR CONVERT(datetime, m.[离开时间], 120) >= @startTime) + AND (@endTime IS NULL OR CONVERT(datetime, m.[离开时间], 120) <= @endTime) + AND (ISNULL(@订单号_check, 0) = 0 OR m.[订单号] = @订单号) + AND (ISNULL(@产品型号代码_check, 0) = 0 OR m.[机型代码] = @产品型号代码) + AND (ISNULL(@工位_check, 0) = 0 OR EXISTS ( + SELECT 1 FROM StationFilter f WHERE f.工位号 = m.[工位号] + )) + GROUP BY + CONVERT(nvarchar(10), CONVERT(datetime, m.[离开时间], 120), 23), + DATEPART(HOUR, CONVERT(datetime, m.[离开时间], 120)) + ORDER BY 日期, 小时段 +END diff --git a/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_历史_导出.sql b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_历史_导出.sql new file mode 100644 index 0000000..99bb636 --- /dev/null +++ b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_历史_导出.sql @@ -0,0 +1,23 @@ +CREATE OR ALTER PROCEDURE [dbo].[质量数据查询_测量数据发动机在线状态_工位JPH_历史_导出] + @开始时间 nvarchar(50) = null, + @结束时间 nvarchar(50) = null, + @工位_check bit = null, + @工位列表 nvarchar(max) = null, + @订单号_check bit = null, + @订单号 nvarchar(50) = null, + @产品型号代码_check bit = null, + @产品型号代码 nvarchar(50) = null +AS +BEGIN + SET NOCOUNT ON + + EXEC [dbo].[质量数据查询_测量数据发动机在线状态_工位JPH_历史] + @开始时间 = @开始时间, + @结束时间 = @结束时间, + @工位_check = @工位_check, + @工位列表 = @工位列表, + @订单号_check = @订单号_check, + @订单号 = @订单号, + @产品型号代码_check = @产品型号代码_check, + @产品型号代码 = @产品型号代码 +END diff --git a/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_实时.sql b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_实时.sql new file mode 100644 index 0000000..b7097e0 --- /dev/null +++ b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位JPH_实时.sql @@ -0,0 +1,25 @@ +CREATE OR ALTER PROCEDURE [dbo].[质量数据查询_测量数据发动机在线状态_工位JPH_实时] + @开始时间 nvarchar(50) = null, + @结束时间 nvarchar(50) = null, + @工位_check bit = null, + @工位列表 nvarchar(max) = null, + @订单号_check bit = null, + @订单号 nvarchar(50) = null, + @产品型号代码_check bit = null, + @产品型号代码 nvarchar(50) = null +AS +BEGIN + SET NOCOUNT ON + + DECLARE @today nvarchar(10) = CONVERT(nvarchar(10), GETDATE(), 23) + + EXEC [dbo].[质量数据查询_测量数据发动机在线状态_工位JPH_历史] + @开始时间 = @today, + @结束时间 = @today, + @工位_check = @工位_check, + @工位列表 = @工位列表, + @订单号_check = @订单号_check, + @订单号 = @订单号, + @产品型号代码_check = @产品型号代码_check, + @产品型号代码 = @产品型号代码 +END diff --git a/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位节拍统计.sql b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位节拍统计.sql new file mode 100644 index 0000000..4adf59b --- /dev/null +++ b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位节拍统计.sql @@ -0,0 +1,71 @@ +CREATE OR ALTER PROCEDURE [dbo].[质量数据查询_测量数据发动机在线状态_工位节拍统计] + @开始时间 nvarchar(50) = null, + @结束时间 nvarchar(50) = null, + @工位_check bit = null, + @工位列表 nvarchar(max) = null, + @订单号_check bit = null, + @订单号 nvarchar(50) = null, + @产品型号代码_check bit = null, + @产品型号代码 nvarchar(50) = null +AS +BEGIN + SET NOCOUNT ON + + DECLARE @startTime datetime = null + DECLARE @endTime datetime = null + + IF @开始时间 IS NOT NULL AND LTRIM(RTRIM(@开始时间)) <> N'' + SET @startTime = CONVERT(datetime, @开始时间 + N' 00:00:00', 120) + + IF @结束时间 IS NOT NULL AND LTRIM(RTRIM(@结束时间)) <> N'' + SET @endTime = CONVERT(datetime, @结束时间 + N' 23:59:59', 120) + + ;WITH StationFilter AS ( + SELECT LTRIM(RTRIM(value)) AS 工位号 + FROM STRING_SPLIT(ISNULL(@工位列表, N''), N',') + WHERE LTRIM(RTRIM(value)) <> N'' + ), + SourceData AS ( + SELECT + s.[工位号] AS 工位, + CONVERT(nvarchar(10), CONVERT(datetime, m.[离开时间], 120), 23) AS 日期, + CAST(m.[在线时间] AS decimal(18, 2)) AS 在线时间 + FROM [dbo].[测量数据发动机在线状态] m + INNER JOIN [dbo].[MES_计划BOM_工位与名称] s + ON m.[工位号] = s.[工位号] + WHERE m.[ID] <> 0 + AND m.[离开时间] IS NOT NULL + AND m.[在线时间] IS NOT NULL + AND ISNUMERIC(CONVERT(nvarchar(50), m.[在线时间])) = 1 + AND (@startTime IS NULL OR CONVERT(datetime, m.[离开时间], 120) >= @startTime) + AND (@endTime IS NULL OR CONVERT(datetime, m.[离开时间], 120) <= @endTime) + AND (ISNULL(@订单号_check, 0) = 0 OR m.[订单号] = @订单号) + AND (ISNULL(@产品型号代码_check, 0) = 0 OR m.[机型代码] = @产品型号代码) + AND (ISNULL(@工位_check, 0) = 0 OR EXISTS ( + SELECT 1 FROM StationFilter f WHERE f.工位号 = m.[工位号] + )) + ), + DailyAgg AS ( + SELECT + 工位, + 日期, + CAST(AVG(在线时间) AS decimal(18, 2)) AS 当日平均节拍 + FROM SourceData + GROUP BY 工位, 日期 + ), + TotalAgg AS ( + SELECT + 工位, + CAST(AVG(在线时间) AS decimal(18, 2)) AS 总平均节拍 + FROM SourceData + GROUP BY 工位 + ) + SELECT + d.工位, + t.总平均节拍, + d.日期, + d.当日平均节拍 + FROM DailyAgg d + INNER JOIN TotalAgg t ON d.工位 = t.工位 + ORDER BY d.工位, d.日期 +END diff --git a/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位节拍统计_导出.sql b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位节拍统计_导出.sql new file mode 100644 index 0000000..f08bbd0 --- /dev/null +++ b/sql/QualityAssurance/质量数据查询_测量数据发动机在线状态_工位节拍统计_导出.sql @@ -0,0 +1,140 @@ +CREATE OR ALTER PROCEDURE [dbo].[质量数据查询_测量数据发动机在线状态_工位节拍统计_导出] + @开始时间 nvarchar(50) = null, + @结束时间 nvarchar(50) = null, + @工位_check bit = null, + @工位列表 nvarchar(max) = null, + @订单号_check bit = null, + @订单号 nvarchar(50) = null, + @产品型号代码_check bit = null, + @产品型号代码 nvarchar(50) = null +AS +BEGIN + SET NOCOUNT ON + + DECLARE @startTime datetime = null + DECLARE @endTime datetime = null + DECLARE @cols nvarchar(max) = N'' + DECLARE @sql nvarchar(max) + + IF @开始时间 IS NOT NULL AND LTRIM(RTRIM(@开始时间)) <> N'' + SET @startTime = CONVERT(datetime, @开始时间 + N' 00:00:00', 120) + + IF @结束时间 IS NOT NULL AND LTRIM(RTRIM(@结束时间)) <> N'' + SET @endTime = CONVERT(datetime, @结束时间 + N' 23:59:59', 120) + + ;WITH StationFilter AS ( + SELECT LTRIM(RTRIM(value)) AS 工位号 + FROM STRING_SPLIT(ISNULL(@工位列表, N''), N',') + WHERE LTRIM(RTRIM(value)) <> N'' + ), + SourceData AS ( + SELECT + m.[工位号] AS 工位, + CONVERT(nvarchar(10), CONVERT(datetime, m.[离开时间], 120), 23) AS 日期, + CAST(m.[在线时间] AS decimal(18, 2)) AS 在线时间 + FROM [dbo].[测量数据发动机在线状态] m + INNER JOIN [dbo].[MES_计划BOM_工位与名称] s + ON m.[工位号] = s.[工位号] + WHERE m.[ID] <> 0 + AND m.[离开时间] IS NOT NULL + AND m.[在线时间] IS NOT NULL + AND ISNUMERIC(CONVERT(nvarchar(50), m.[在线时间])) = 1 + AND (@startTime IS NULL OR CONVERT(datetime, m.[离开时间], 120) >= @startTime) + AND (@endTime IS NULL OR CONVERT(datetime, m.[离开时间], 120) <= @endTime) + AND (ISNULL(@订单号_check, 0) = 0 OR m.[订单号] = @订单号) + AND (ISNULL(@产品型号代码_check, 0) = 0 OR m.[机型代码] = @产品型号代码) + AND (ISNULL(@工位_check, 0) = 0 OR EXISTS ( + SELECT 1 FROM StationFilter f WHERE f.工位号 = m.[工位号] + )) + ), + DailyAgg AS ( + SELECT + 工位, + 日期, + CAST(AVG(在线时间) AS decimal(18, 2)) AS 当日平均节拍 + FROM SourceData + GROUP BY 工位, 日期 + ) + SELECT @cols = STUFF(( + SELECT N',' + QUOTENAME(日期) + FROM (SELECT DISTINCT 日期 FROM DailyAgg) d + ORDER BY 日期 + FOR XML PATH(''), TYPE + ).value('.', 'nvarchar(max)'), 1, 1, N'') + + IF ISNULL(@cols, N'') = N'' + BEGIN + SELECT CAST(N'' AS nvarchar(50)) AS 工位, CAST(0 AS decimal(18, 2)) AS 总平均节拍 + WHERE 1 = 0 + RETURN + END + + SET @sql = N' + ;WITH StationFilter AS ( + SELECT LTRIM(RTRIM(value)) AS 工位号 + FROM STRING_SPLIT(ISNULL(@工位列表, N''''), N'','') + WHERE LTRIM(RTRIM(value)) <> N'''' + ), + SourceData AS ( + SELECT + m.[工位号] AS 工位, + CONVERT(nvarchar(10), CONVERT(datetime, m.[离开时间], 120), 23) AS 日期, + CAST(m.[在线时间] AS decimal(18, 2)) AS 在线时间 + FROM [dbo].[测量数据发动机在线状态] m + INNER JOIN [dbo].[MES_计划BOM_工位与名称] s + ON m.[工位号] = s.[工位号] + WHERE m.[ID] <> 0 + AND m.[离开时间] IS NOT NULL + AND m.[在线时间] IS NOT NULL + AND ISNUMERIC(CONVERT(nvarchar(50), m.[在线时间])) = 1 + AND (@startTime IS NULL OR CONVERT(datetime, m.[离开时间], 120) >= @startTime) + AND (@endTime IS NULL OR CONVERT(datetime, m.[离开时间], 120) <= @endTime) + AND (ISNULL(@订单号_check, 0) = 0 OR m.[订单号] = @订单号) + AND (ISNULL(@产品型号代码_check, 0) = 0 OR m.[机型代码] = @产品型号代码) + AND (ISNULL(@工位_check, 0) = 0 OR EXISTS ( + SELECT 1 FROM StationFilter f WHERE f.工位号 = m.[工位号] + )) + ), + DailyAgg AS ( + SELECT + 工位, + 日期, + CAST(AVG(在线时间) AS decimal(18, 2)) AS 当日平均节拍 + FROM SourceData + GROUP BY 工位, 日期 + ), + TotalAgg AS ( + SELECT + 工位, + CAST(AVG(在线时间) AS decimal(18, 2)) AS 总平均节拍 + FROM SourceData + GROUP BY 工位 + ), + PivotData AS ( + SELECT 工位, 日期, 当日平均节拍 + FROM DailyAgg + ) + SELECT 工位, 总平均节拍, ' + @cols + N' + FROM ( + SELECT p.工位, t.总平均节拍, p.日期, p.当日平均节拍 + FROM PivotData p + INNER JOIN TotalAgg t ON p.工位 = t.工位 + ) src + PIVOT ( + MAX(当日平均节拍) + FOR 日期 IN (' + @cols + N') + ) p + ORDER BY 工位' + + EXEC sp_executesql + @sql, + N'@startTime datetime, @endTime datetime, @工位_check bit, @工位列表 nvarchar(max), @订单号_check bit, @订单号 nvarchar(50), @产品型号代码_check bit, @产品型号代码 nvarchar(50)', + @startTime = @startTime, + @endTime = @endTime, + @工位_check = @工位_check, + @工位列表 = @工位列表, + @订单号_check = @订单号_check, + @订单号 = @订单号, + @产品型号代码_check = @产品型号代码_check, + @产品型号代码 = @产品型号代码 +END diff --git a/src/icons/svg/CylinderMaintenance.svg b/src/icons/svg/CylinderMaintenance.svg new file mode 100644 index 0000000..3b12260 --- /dev/null +++ b/src/icons/svg/CylinderMaintenance.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/lang/en-US.js b/src/lang/en-US.js index 45425bd..49e83e0 100644 --- a/src/lang/en-US.js +++ b/src/lang/en-US.js @@ -7,6 +7,7 @@ export default { cancel: 'Cancel', home: 'Home', logout: 'Logout', + online: 'Online', language: 'Language', chinese: 'Chinese', english: 'English' @@ -30,6 +31,30 @@ export default { editFailed: 'Edit failed', accountPasswordError: 'Incorrect username or password' }, + dashboard: { + workbench: 'MES Workbench', + heroDescription: '{date}, the current workbench includes {moduleCount} top-level modules, {entryCount} quick entries.', + focus: 'Focus', + module: 'Module', + pendingTitle: 'Pending Alerts', + sortHint: 'Sorted by count in descending order', + handleHint: 'Open the related business page to process it', + emptyTitle: 'No pending alerts at the moment', + emptyText: 'New business alerts will appear here automatically when available.', + quickAccess: 'Quick Access', + moduleEntryCount: '{count} quick entries', + metricTopModules: 'Top-Level Modules', + metricTopModulesHint: 'Primary navigation groups', + metricQuickEntries: 'Quick Entries', + metricQuickEntriesHint: 'Direct dashboard shortcuts', + metricPendingMessages: 'Pending Messages', + metricPendingMessagesHint: 'Items requiring timely action', + metricNoticeSources: 'Alert Sources', + metricNoticeSourcesHint: 'Active alert categories', + greetingMorning: 'Good morning', + greetingAfternoon: 'Good afternoon', + greetingEvening: 'Good evening' + }, menuManagement: { filterPlaceholder: 'Enter keyword to filter', menuName: 'Menu Name', @@ -310,13 +335,57 @@ export default { selectOrder: 'Please select an order!', confirmCompleteOrder: 'Confirm early completion for order {orderNo}?' }, + cylinderMaintenance: { + keywordLabel: 'Keyword:', + keywordPlaceholder: 'Please enter keyword', + productionDateLabel: 'Production Date', + selectProductionDate: 'Please select production date', + productionStatusLabel: 'Production Status', + selectProductionStatus: 'Please select production status', + onlineTimeLabel: 'Online Time', + startDate: 'Start Date', + endDate: 'End Date', + dateRangeSeparator: '~', + search: 'Search', + importData: 'Import', + importTitle: 'Cylinder Group Import', + importHint: 'The first Excel row must match the `缸体分组号` table fields before import.', + confirmImport: 'Confirm Import', + dragExcelFile: 'Drop the Excel file here or', + browse: 'Browse', + sequence: 'No.', + blankNo: 'Blank No.', + materialNo: 'Material No.', + groupNo: 'Group No.', + productionMonth: 'Production Month', + crankcaseNo: 'Crankcase No.', + bindingTime: 'Binding Time', + qrCode: 'QR Code', + serialNo: 'Serial No.', + statusAll: 'All', + statusCompleted: 'Completed', + statusPending: 'Not Produced', + loadingData: 'Loading data', + noData: 'No data', + noImportData: 'No import data', + queryFailed: 'Query failed', + importPreviewFailed: 'Import preview failed', + importSuccess: 'Import succeeded', + importFailed: 'Import failed. Check the file or field mapping.', + uploadOneFileOnly: 'Only one file can be uploaded', + uploadExcelOnly: 'Only .xlsx, .xls, and .csv files are supported' + }, recipeManagement: { - productModelLabel: 'Product Model:', - productModel: 'Product Model', + productModelLabel: 'Cylinder Model:', + productModel: 'Cylinder Model', search: 'Search', loadingData: 'Loading data', - productModelCode: 'Pro. Model Code', - largeModel: 'Large Model', + productModelCode: 'Cylinder Code', + largeModel: 'Model Name', + crankcaseCode: 'Crankcase Code', + crankcaseModel: 'Crankcase Model', + crankcaseModelName: 'Crankcase Model Name', + combinePartNumber: 'Combined Part No.', add: 'Add', edit: 'Edit', partType: 'Part Type', @@ -630,6 +699,7 @@ export default { '下线统计': 'Offline Count', '工位节拍': 'Station Beat', '工位JPH': 'Station JPH', + '缸体分组号': 'Cylinder Group No.', '生产计划订单完工': 'Order Complete', 'SPC分析': 'SPC Analysis', '基本趋势图': 'Trend Chart', diff --git a/src/lang/zh-CN.js b/src/lang/zh-CN.js index a75c35f..354c337 100644 --- a/src/lang/zh-CN.js +++ b/src/lang/zh-CN.js @@ -7,6 +7,7 @@ export default { cancel: '取消', home: '主页', logout: '退出', + online: '在线', language: '语言', chinese: '中文', english: 'English' @@ -30,6 +31,30 @@ export default { editFailed: '编辑失败', accountPasswordError: '用户名或密码不正确' }, + dashboard: { + workbench: 'MES 工作台', + heroDescription: '{date},当前工作台已汇总 {moduleCount} 个一级模块、{entryCount} 个快捷入口。', + focus: '重点关注', + module: '模块', + pendingTitle: '待办提醒', + sortHint: '按数量从高到低展示', + handleHint: '进入对应业务页面处理', + emptyTitle: '当前没有待办提醒', + emptyText: '通知列表为空时,这里会自动显示新的业务提醒。', + quickAccess: '快速进入', + moduleEntryCount: '{count} 个快捷入口', + metricTopModules: '一级模块', + metricTopModulesHint: '系统主导航分组', + metricQuickEntries: '快捷入口', + metricQuickEntriesHint: '首页可直达功能', + metricPendingMessages: '待办消息', + metricPendingMessagesHint: '需要及时处理事项', + metricNoticeSources: '提醒来源', + metricNoticeSourcesHint: '当前激活通知类型', + greetingMorning: '早上好', + greetingAfternoon: '下午好', + greetingEvening: '晚上好' + }, menuManagement: { filterPlaceholder: '输入关键字进行过滤', menuName: '菜单名称', @@ -310,13 +335,57 @@ export default { selectOrder: '请选择订单!', confirmCompleteOrder: '确定要提前完工订单:{orderNo}吗?' }, + cylinderMaintenance: { + keywordLabel: '关键字:', + keywordPlaceholder: '请输入关键字', + productionDateLabel: '生产日期', + selectProductionDate: '请选择生产日期', + productionStatusLabel: '生产状态', + selectProductionStatus: '请选择生产状态', + onlineTimeLabel: '上线时间', + startDate: '开始日期', + endDate: '结束日期', + dateRangeSeparator: '~', + search: '查询', + importData: '导入', + importTitle: '缸体分组号导入', + importHint: 'Excel首行需与缸体分组号表字段一致,确认无误后再导入。', + confirmImport: '确认导入', + dragExcelFile: '将Excel文件拖入或', + browse: '浏览', + sequence: '序号', + blankNo: '毛坯号', + materialNo: '物料号', + groupNo: '分组号', + productionMonth: '生产月份', + crankcaseNo: '曲轴箱号', + bindingTime: '绑定时间', + qrCode: '二维码', + serialNo: '流水号', + statusAll: '全部', + statusCompleted: '已完成', + statusPending: '未生产', + loadingData: '数据加载中', + noData: '暂无数据', + noImportData: '暂无可导入数据', + queryFailed: '查询失败', + importPreviewFailed: '导入预览失败', + importSuccess: '导入成功', + importFailed: '导入失败,请检查导入文件或字段映射', + uploadOneFileOnly: '仅支持上传一个文件', + uploadExcelOnly: '仅支持上传 .xlsx、.xls、.csv 格式文件' + }, recipeManagement: { - productModelLabel: '产品型号:', - productModel: '产品型号', + productModelLabel: '缸体型号:', + productModel: '缸体型号', search: '查询', loadingData: '数据加载中', - productModelCode: '产品型号代码', - largeModel: '大机型', + productModelCode: '缸体代码', + largeModel: '机型名称', + crankcaseCode: '曲轴箱代码', + crankcaseModel: '曲轴箱型号', + crankcaseModelName: '曲轴箱型号名称', + combinePartNumber: '合箱零件号', add: '增加', edit: '编辑', partType: '零件类型', @@ -630,6 +699,7 @@ export default { '下线统计': '下线统计', '工位节拍': '工位节拍', '工位JPH': '工位JPH', + '缸体分组号': '缸体分组号', '生产计划订单完工': '生产计划订单完工', 'SPC分析': 'SPC分析', '基本趋势图': '基本趋势图', diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss index 4b85229..bf2d866 100644 --- a/src/styles/sidebar.scss +++ b/src/styles/sidebar.scss @@ -5,13 +5,13 @@ min-width: 1360px; // div3固定宽度后新增 min-height: 100%; transition: margin-left .28s; - margin-left: 220px; + margin-left: 236px; position: relative; } // 侧边栏 .sidebar-container { transition: width 0.28s; - width: 220px !important; + width: 236px !important; height: 100%; position: fixed; font-size: 0px; @@ -20,17 +20,36 @@ left: 0; z-index: 1001; overflow: hidden; + background: linear-gradient(180deg, #f8fbff 0%, #eef5ff 100%); + border-right: 1px solid rgba(108, 146, 210, 0.18); + box-shadow: 18px 0 40px rgba(15, 43, 92, 0.08); + + &::before { + content: ''; + position: absolute; + top: -18%; + right: -22%; + width: 180px; + height: 180px; + border-radius: 50%; + background: radial-gradient(circle, rgba(89, 168, 255, 0.22) 0%, rgba(89, 168, 255, 0) 72%); + pointer-events: none; + } + //reset element-ui css .horizontal-collapse-transition { transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; } .el-scrollbar__bar.is-vertical{ - right: 0px; + right: 4px; + width: 6px; } .scrollbar-wrapper { overflow-x: hidden!important; .el-scrollbar__view { height: 100%; + display: flex; + flex-direction: column; } } .is-horizontal { @@ -42,33 +61,145 @@ overflow: hidden; } .svg-icon { - margin-right: 16px; + margin-right: 12px; + font-size: 18px; + color: inherit; + transition: color .2s ease; } .el-menu { border: none; height: 100%; - background: white!important; + background: transparent !important; width: 100% !important; } + .el-scrollbar__thumb { + background-color: rgba(102, 136, 191, 0.36); + border-radius: 999px; + } + .sidebar-menu { + padding: 0 10px 14px; + } + .submenu-title-noDropdown, + .el-submenu > .el-submenu__title, + .el-menu-item { + height: 46px; + line-height: 46px; + margin-bottom: 8px; + padding-left: 18px !important; + border-radius: 14px; + color: #31456a !important; + font-size: 14px; + font-weight: 500; + transition: background-color .22s ease, color .22s ease, box-shadow .22s ease, transform .22s ease; + } + .submenu-title-noDropdown, + .el-submenu > .el-submenu__title { + position: relative; + } + .submenu-title-noDropdown:hover, + .el-submenu > .el-submenu__title:hover, + .el-menu-item:hover { + background: rgba(21, 118, 232, 0.10) !important; + color: #0a67d1 !important; + transform: translateX(2px); + } + .submenu-title-noDropdown:hover .svg-icon, + .el-submenu > .el-submenu__title:hover .svg-icon, + .el-menu-item:hover .svg-icon { + color: #0a67d1 !important; + } + .el-submenu.is-active > .el-submenu__title, + .submenu-title-noDropdown.is-active, + .el-menu-item.is-active { + background: linear-gradient(135deg, #1576e8 0%, #44a0ff 100%) !important; + color: #ffffff !important; + box-shadow: 0 14px 24px rgba(21, 118, 232, 0.26); + } + .el-submenu.is-active > .el-submenu__title .svg-icon, + .submenu-title-noDropdown.is-active .svg-icon, + .el-menu-item.is-active .svg-icon { + color: #ffffff !important; + } + .el-submenu .el-menu { + height: auto !important; + margin: 2px 0 12px; + padding: 8px; + background: rgba(255, 255, 255, 0.68) !important; + border-radius: 16px; + box-shadow: inset 0 0 0 1px rgba(145, 178, 233, 0.18); + backdrop-filter: blur(8px); + } + .el-submenu .el-menu-item { + min-width: 100% !important; + height: 40px; + line-height: 40px; + margin-bottom: 6px; + padding-left: 42px !important; + border-radius: 12px; + font-size: 13px; + color: #48617f !important; + background: transparent !important; + } + .el-submenu .el-menu-item:last-child { + margin-bottom: 0; + } + .el-submenu .el-menu-item:hover { + background: rgba(21, 118, 232, 0.10) !important; + color: #0a67d1 !important; + } + .el-submenu .el-menu-item.is-active { + background: rgba(21, 118, 232, 0.14) !important; + color: #0a67d1 !important; + box-shadow: none; + } + .el-submenu .el-menu-item.is-active::before { + content: ''; + position: absolute; + left: 18px; + top: 50%; + width: 8px; + height: 8px; + border-radius: 50%; + background: #1576e8; + transform: translateY(-50%); + } + .el-submenu__icon-arrow { + margin-top: -5px; + right: 18px; + color: #90a3bd; + font-weight: 700; + } } .hideSidebar { .sidebar-container { - width: 36px !important; + width: 72px !important; } .main-container { - margin-left: 36px; + margin-left: 72px; } .submenu-title-noDropdown { - padding-left: 10px !important; + padding-left: 0 !important; position: relative; .el-tooltip { - padding: 0 10px !important; + padding: 0 !important; } } + .sidebar-container .sidebar-menu { + padding-left: 8px; + padding-right: 8px; + } + .sidebar-container .el-menu-item, + .sidebar-container .el-submenu > .el-submenu__title { + padding: 0 !important; + text-align: center; + } + .sidebar-container .svg-icon { + margin-right: 0; + } .el-submenu { overflow: hidden; &>.el-submenu__title { - padding-left: 12px !important; + padding-left: 0 !important; .el-submenu__icon-arrow { display: none; } @@ -90,14 +221,13 @@ } .sidebar-container .nest-menu .el-submenu>.el-submenu__title, .sidebar-container .el-submenu .el-menu-item { - min-width: 200px !important; - background-color: white !important; + min-width: 100% !important; &:hover { - background-color: variables.$menuHover !important; + background-color: rgba(21, 118, 232, 0.10) !important; } } .el-menu--collapse .el-menu .el-submenu { - min-width: 180px !important; + min-width: 220px !important; } //适配移动端 @@ -107,12 +237,12 @@ } .sidebar-container { transition: transform .28s; - width: 180px !important; + width: 236px !important; } &.hideSidebar { .sidebar-container { transition-duration: 0.3s; - transform: translate3d(-180px, 0, 0); + transform: translate3d(-236px, 0, 0); } } } diff --git a/src/views/BasicData/PersonnelManagement/index.vue b/src/views/BasicData/PersonnelManagement/index.vue index 9d58630..c08ed32 100644 --- a/src/views/BasicData/PersonnelManagement/index.vue +++ b/src/views/BasicData/PersonnelManagement/index.vue @@ -80,8 +80,8 @@ - -
+ +
{{ $t('personnelManagement.departmentMaintenance') }} {{ $t('personnelManagement.expand') }}
@@ -242,7 +242,7 @@ -
+
@@ -1282,7 +1283,7 @@ export default { diff --git a/src/views/QualityAssurance/AssemblyQualitydataQuery/index.vue b/src/views/QualityAssurance/AssemblyQualitydataQuery/index.vue index e1ad368..1bf5b48 100644 --- a/src/views/QualityAssurance/AssemblyQualitydataQuery/index.vue +++ b/src/views/QualityAssurance/AssemblyQualitydataQuery/index.vue @@ -141,7 +141,7 @@ size="mini"> - + @@ -157,7 +157,7 @@ - + @@ -188,7 +188,7 @@ - + @@ -198,7 +198,7 @@ {{ scope.row.测量项目 }} - + @@ -213,16 +213,16 @@ - - - - - - + + + + + + + + + + - + @@ -137,7 +137,7 @@ {{ scope.row.发动机号 }} - + @@ -162,17 +162,17 @@ - + - + - + diff --git a/src/views/RecipeManagement/RecipeManagement/index.vue b/src/views/RecipeManagement/RecipeManagement/index.vue index 8f28b57..d0861df 100644 --- a/src/views/RecipeManagement/RecipeManagement/index.vue +++ b/src/views/RecipeManagement/RecipeManagement/index.vue @@ -8,8 +8,8 @@
+ size="mini" + > - - - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -96,7 +103,8 @@ + :placeholder="$t('recipeManagement.partType')" + /> + :placeholder="$t('recipeManagement.partTypeSign')" + /> + :placeholder="$t('recipeManagement.partTypeName')" + /> diff --git a/src/views/WorkOrderManagement/CylinderMaintenance/UploadExcel.vue b/src/views/WorkOrderManagement/CylinderMaintenance/UploadExcel.vue new file mode 100644 index 0000000..ebae9dc --- /dev/null +++ b/src/views/WorkOrderManagement/CylinderMaintenance/UploadExcel.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/src/views/WorkOrderManagement/CylinderMaintenance/index.vue b/src/views/WorkOrderManagement/CylinderMaintenance/index.vue new file mode 100644 index 0000000..f080ad0 --- /dev/null +++ b/src/views/WorkOrderManagement/CylinderMaintenance/index.vue @@ -0,0 +1,402 @@ + + + + + diff --git a/src/views/WorkOrderManagement/ReleaseOfProductionPlan/index.vue b/src/views/WorkOrderManagement/ReleaseOfProductionPlan/index.vue index b31a4f7..3ee8f3b 100644 --- a/src/views/WorkOrderManagement/ReleaseOfProductionPlan/index.vue +++ b/src/views/WorkOrderManagement/ReleaseOfProductionPlan/index.vue @@ -101,7 +101,12 @@ size="mini" > - + + + + diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue index d69b29d..656c9cf 100644 --- a/src/views/dashboard/index.vue +++ b/src/views/dashboard/index.vue @@ -1,48 +1,140 @@ + + + - diff --git a/src/views/layout/components/Navbar.vue b/src/views/layout/components/Navbar.vue index fbc6a51..dabb74c 100644 --- a/src/views/layout/components/Navbar.vue +++ b/src/views/layout/components/Navbar.vue @@ -1,48 +1,73 @@