feat: 改造为冷轧双机架二级控制系统

- 删除 ruoyi-flowable 模块,移除所有 Flowable 依赖
- 新建 ruoyi-mill 业务模块:
  * protocol: iXComPCS UDP 电文编解码器(7条电文完整定义)
  * udp: UdpServer/UdpSender/TelegramDispatcher
  * domain: MillPlan / MillProductionResult
  * service/controller: 生产计划、产出管理骨架
- 前端改造为工业深色主题(深海军蓝 + 工业青色)
- 系统标题更新为"冷轧双机架二级控制系统"
- application.yml 新增 mill.udp 配置节

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-28 12:58:22 +08:00
parent 30764b5854
commit 7648a56a0d
66 changed files with 1579 additions and 6169 deletions

View File

@@ -1,31 +1,122 @@
/**
* I think element-ui's default theme color is too light for long-term use.
* So I modified the default color and you can modify it to your liking.
**/
/* theme color */
$--color-primary: #1890ff;
$--color-success: #13ce66;
$--color-warning: #ffba00;
$--color-danger: #ff4949;
// $--color-info: #1E1E1E;
$--button-font-weight: 400;
// $--color-text-regular: #1f2d3d;
$--border-color-light: #dfe4ed;
$--border-color-lighter: #e6ebf5;
$--table-border: 1px solid #dfe6ec;
/* icon font path, required */
$--font-path: '~element-ui/lib/theme-chalk/fonts';
@import "~element-ui/packages/theme-chalk/src/index";
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
theme: $--color-primary;
}
/**
* 冷轧二级控制系统 — Element-UI 主题覆盖(工业风格)
*/
/* 主题色:工业青蓝 */
$--color-primary: #0099cc;
$--color-success: #00c853;
$--color-warning: #ff8c00;
$--color-danger: #ff3d00;
$--color-info: #546e8a;
$--button-font-weight: 500;
/* 边框 */
$--border-color-light: #1a3a5c;
$--border-color-lighter: #152e4a;
$--table-border: 1px solid #1a3a5c;
/* icon font path */
$--font-path: '~element-ui/lib/theme-chalk/fonts';
@import "~element-ui/packages/theme-chalk/src/index";
// 深色背景下全局 Element 样式覆盖
.el-table {
background-color: #0e2137 !important;
color: #c8d8e8 !important;
th.el-table__cell {
background-color: #0a1e35 !important;
color: #00d4ff !important;
border-bottom: 1px solid #1a3a5c !important;
font-size: 13px;
font-weight: 600;
letter-spacing: 0.5px;
}
td.el-table__cell {
border-bottom: 1px solid #132030 !important;
}
tr:hover > td {
background-color: #122840 !important;
}
&::before {
background-color: #1a3a5c;
}
}
.el-card {
background-color: #0e2137 !important;
border: 1px solid #1a3a5c !important;
border-radius: 4px;
color: #c8d8e8;
.el-card__header {
border-bottom: 1px solid #1a3a5c;
color: #00d4ff;
font-weight: 600;
font-size: 14px;
padding: 12px 20px;
}
}
.el-input__inner {
background-color: #071120 !important;
border-color: #1a3a5c !important;
color: #c8d8e8 !important;
&::placeholder { color: #4a6a8a; }
&:focus { border-color: #00d4ff !important; }
}
.el-select .el-input__inner { background-color: #071120 !important; }
.el-dropdown-menu,
.el-select-dropdown {
background-color: #0e2137 !important;
border: 1px solid #1a3a5c !important;
.el-select-dropdown__item { color: #c8d8e8 !important; }
.el-select-dropdown__item.hover,
.el-select-dropdown__item:hover { background-color: #0a2545 !important; }
.el-select-dropdown__item.selected { color: #00d4ff !important; }
}
.el-pagination {
color: #8ab0cc !important;
.btn-prev, .btn-next, .el-pager li {
background-color: #0e2137 !important;
color: #8ab0cc !important;
border: 1px solid #1a3a5c !important;
}
.el-pager li.active { color: #00d4ff !important; border-color: #00d4ff !important; }
}
.el-dialog {
background-color: #0e2137 !important;
border: 1px solid #1a3a5c;
.el-dialog__title { color: #00d4ff !important; }
.el-dialog__body { color: #c8d8e8 !important; }
}
.el-form-item__label { color: #8ab0cc !important; }
.el-tag {
&.el-tag--success { background-color: rgba(0,200,83,.15); border-color: #00c853; color: #00c853; }
&.el-tag--danger { background-color: rgba(255,61,0,.15); border-color: #ff3d00; color: #ff3d00; }
&.el-tag--warning { background-color: rgba(255,140,0,.15); border-color: #ff8c00; color: #ff8c00; }
&.el-tag--info { background-color: rgba(84,110,138,.15);border-color: #546e8a; color: #8ab0cc; }
}
.el-button--primary {
background-color: #0077aa !important;
border-color: #0099cc !important;
&:hover { background-color: #0099cc !important; }
}
// webpack JS/SCSS 变量共享
:export {
theme: $--color-primary;
}

View File

@@ -5,132 +5,192 @@
@import './sidebar.scss';
@import './btn.scss';
// 工业风全局字体与背景
body {
height: 100%;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
margin: 0;
background-color: #071120;
color: $industrial-text;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Microsoft YaHei',
'Source Han Sans CN', Arial, monospace;
font-size: 14px;
}
label {
font-weight: 700;
}
label { font-weight: 600; color: #8ab0cc; }
html {
height: 100%;
box-sizing: border-box;
}
#app {
height: 100%;
}
#app { height: 100%; }
*,
*:before,
*:after {
box-sizing: inherit;
}
*, *:before, *:after { box-sizing: inherit; }
.no-padding {
padding: 0px !important;
}
.padding-content {
padding: 4px 0;
}
a:focus,
a:active {
outline: none;
}
a,
a:focus,
a:hover {
a:focus, a:active { outline: none; }
a, a:focus, a:hover {
cursor: pointer;
color: inherit;
color: $industrial-cyan;
text-decoration: none;
}
div:focus {
outline: none;
}
div:focus { outline: none; }
.fr {
float: right;
}
// 工具类
.fr { float: right; }
.fl { float: left; }
.pr-5 { padding-right: 5px; }
.pl-5 { padding-left: 5px; }
.block { display: block; }
.pointer { cursor: pointer; }
.inlineBlock { display: block; }
.text-center { text-align: center; }
.no-padding { padding: 0 !important; }
.padding-content { padding: 4px 0; }
.fl {
float: left;
}
.pr-5 {
padding-right: 5px;
}
.pl-5 {
padding-left: 5px;
}
.block {
.clearfix:after {
visibility: hidden;
display: block;
font-size: 0;
content: " ";
clear: both;
height: 0;
}
.pointer {
cursor: pointer;
// 页面内容容器
.app-container {
padding: 16px 20px;
background-color: transparent;
}
.inlineBlock {
display: block;
}
// 搜索/过滤栏
.filter-container {
padding-bottom: 12px;
background-color: $industrial-surface;
padding: 12px 16px;
border: 1px solid $industrial-border;
border-radius: 4px;
margin-bottom: 12px;
.clearfix {
&:after {
visibility: hidden;
display: block;
font-size: 0;
content: " ";
clear: both;
height: 0;
.filter-item {
display: inline-block;
vertical-align: middle;
margin-bottom: 8px;
margin-right: 8px;
}
}
aside {
background: #eef1f6;
padding: 8px 24px;
margin-bottom: 20px;
border-radius: 2px;
display: block;
line-height: 32px;
font-size: 16px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
color: #2c3e50;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
// 状态徽标 — 机组运行状态
.status-dot {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
margin-right: 6px;
a {
color: #337ab7;
cursor: pointer;
&.running { background-color: $industrial-green; box-shadow: 0 0 6px $industrial-green; }
&.stopped { background-color: $industrial-red; box-shadow: 0 0 6px $industrial-red; }
&.standby { background-color: $industrial-amber; box-shadow: 0 0 6px $industrial-amber; }
&.offline { background-color: $industrial-text-muted; }
}
&:hover {
color: rgb(32, 160, 255);
// 数据看板 — 工艺参数数值框
.param-value {
font-family: 'Courier New', Courier, monospace;
font-size: 20px;
font-weight: 700;
color: $industrial-cyan;
letter-spacing: 1px;
}
.param-unit {
font-size: 11px;
color: $industrial-text-muted;
margin-left: 4px;
}
// 告警闪烁
@keyframes alarmBlink {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
.alarm-blink {
animation: alarmBlink 1s ease-in-out infinite;
color: $industrial-red;
}
// 顶部导航栏
.navbar {
background-color: #091628 !important;
border-bottom: 1px solid #00d4ff33 !important;
box-shadow: 0 2px 12px rgba(0, 212, 255, 0.08) !important;
}
// 面包屑
.el-breadcrumb__inner { color: #6b8aaa !important; }
.el-breadcrumb__inner.is-link:hover { color: #00d4ff !important; }
.el-breadcrumb__separator { color: #1a3a5c !important; }
// 标签页(tab-view)
.tags-view-container {
background-color: #071120 !important;
border-bottom: 1px solid #1a3a5c !important;
.tags-view-wrapper .tags-view-item {
background-color: #0e2137 !important;
border: 1px solid #1a3a5c !important;
color: #8ab0cc !important;
&.active {
background-color: #0077aa !important;
border-color: #00d4ff !important;
color: #ffffff !important;
}
}
}
//main-container全局样式
.app-container {
padding: 20px;
// 侧边栏 Logo 区域
.sidebar-logo-container {
background-color: #060f1e !important;
border-bottom: 1px solid #1a3a5c !important;
.sidebar-title {
color: #00d4ff !important;
font-size: 16px !important;
font-weight: 700 !important;
letter-spacing: 1px;
}
}
.components-container {
margin: 30px 50px;
position: relative;
// 滚动条工业风格
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: #071120; }
::-webkit-scrollbar-thumb { background: #1a3a5c; border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: #00d4ff55; }
// 提示/备注区域
aside {
background: #0e2137;
padding: 8px 16px;
margin-bottom: 16px;
border-left: 3px solid #00d4ff;
border-radius: 2px;
display: block;
line-height: 32px;
font-size: 13px;
color: #8ab0cc;
a { color: #00d4ff; &:hover { color: #40e0ff; } }
}
.text-center {
text-align: center
.link-type, .link-type:focus {
color: #00d4ff;
cursor: pointer;
&:hover { color: #40e0ff; }
}
.sub-navbar {
@@ -140,48 +200,17 @@ aside {
width: 100%;
text-align: right;
padding-right: 20px;
transition: 600ms ease position;
background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
background: linear-gradient(90deg, #0a1e35 0%, #0077aa 100%);
border-bottom: 1px solid #00d4ff44;
.subtitle {
font-size: 20px;
color: #fff;
}
&.draft {
background: #d0d0d0;
}
&.deleted {
background: #d0d0d0;
}
.subtitle { font-size: 16px; color: #fff; letter-spacing: 1px; }
}
.link-type,
.link-type:focus {
color: #337ab7;
cursor: pointer;
&:hover {
color: rgb(32, 160, 255);
}
.components-container {
margin: 20px 30px;
position: relative;
}
.filter-container {
padding-bottom: 10px;
.filter-item {
display: inline-block;
vertical-align: middle;
margin-bottom: 10px;
}
}
//refine vue-multiselect plugin
.multiselect {
line-height: 16px;
}
.multiselect--active {
z-index: 1000 !important;
}
// 多选
.multiselect { line-height: 16px; }
.multiselect--active { z-index: 1000 !important; }

View File

@@ -76,11 +76,12 @@
white-space: nowrap !important;
}
// menu hover
// menu hover — 工业风高亮
.submenu-title-noDropdown,
.el-submenu__title {
&:hover {
background-color: rgba(0, 0, 0, 0.06) !important;
background-color: rgba(0, 212, 255, 0.08) !important;
border-left: 2px solid #00d4ff;
}
}
@@ -88,12 +89,18 @@
color: $base-menu-color-active !important;
}
.el-menu-item.is-active {
background-color: rgba(0, 119, 170, 0.30) !important;
border-left: 3px solid #00d4ff !important;
color: #00d4ff !important;
}
& .nest-menu .el-submenu>.el-submenu__title,
& .el-submenu .el-menu-item {
min-width: $base-sidebar-width !important;
&:hover {
background-color: rgba(0, 0, 0, 0.06) !important;
background-color: rgba(0, 212, 255, 0.08) !important;
}
}

View File

@@ -1,54 +1,53 @@
// base color
$blue:#324157;
$light-blue:#3A71A8;
$red:#C03639;
$pink: #E65D6E;
$green: #30B08F;
$tiffany: #4AB7BD;
$yellow:#FEC171;
$panGreen: #30B08F;
// 默认菜单主题风格
$base-menu-color:#bfcbd9;
$base-menu-color-active:#f4f4f5;
$base-menu-background:#304156;
$base-logo-title-color: #ffffff;
$base-menu-light-color:rgba(0,0,0,.70);
$base-menu-light-background:#ffffff;
$base-logo-light-title-color: #001529;
$base-sub-menu-background:#1f2d3d;
$base-sub-menu-hover:#001528;
// 自定义暗色菜单风格
/**
$base-menu-color:hsla(0,0%,100%,.65);
$base-menu-color-active:#fff;
$base-menu-background:#001529;
$base-logo-title-color: #ffffff;
$base-menu-light-color:rgba(0,0,0,.70);
$base-menu-light-background:#ffffff;
$base-logo-light-title-color: #001529;
$base-sub-menu-background:#000c17;
$base-sub-menu-hover:#001528;
*/
$base-sidebar-width: 200px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
menuColor: $base-menu-color;
menuLightColor: $base-menu-light-color;
menuColorActive: $base-menu-color-active;
menuBackground: $base-menu-background;
menuLightBackground: $base-menu-light-background;
subMenuBackground: $base-sub-menu-background;
subMenuHover: $base-sub-menu-hover;
sideBarWidth: $base-sidebar-width;
logoTitleColor: $base-logo-title-color;
logoLightTitleColor: $base-logo-light-title-color
}
// ============================================================
// 冷轧双机架二级控制系统 — 工业深色主题色板
// ============================================================
// btn.scss 依赖的旧变量(映射到工业色板)
$blue: #0099cc;
$light-blue:#00d4ff;
$red: #ff3d00;
$pink: #ff6b6b;
$green: #00c853;
$tiffany: #00b4d8;
$yellow: #ff8c00;
$panGreen: #00c853;
// 工业色调
$industrial-bg: #0a1628; // 深海军蓝,主背景
$industrial-surface: #0e2137; // 卡片/面板背景
$industrial-border: #1a3a5c; // 边框色
$industrial-cyan: #00d4ff; // 工业青色,主高亮
$industrial-amber: #ff8c00; // 琥珀橙,警告/重点
$industrial-green: #00e676; // 状态绿,正常/运行
$industrial-red: #ff3d00; // 告警红
$industrial-text: #c8d8e8; // 主文字
$industrial-text-muted: #6b8aaa; // 次要文字
// 默认侧边栏主题(工业深色)
$base-menu-color: #8ab0cc;
$base-menu-color-active: #00d4ff;
$base-menu-background: #0a1628;
$base-logo-title-color: #e0f0ff;
$base-menu-light-color: rgba(0,0,0,.70);
$base-menu-light-background: #ffffff;
$base-logo-light-title-color:#001529;
$base-sub-menu-background: #071120;
$base-sub-menu-hover: #0d2040;
$base-sidebar-width: 210px;
// webpack JS/SCSS 变量共享
:export {
menuColor: $base-menu-color;
menuLightColor: $base-menu-light-color;
menuColorActive: $base-menu-color-active;
menuBackground: $base-menu-background;
menuLightBackground: $base-menu-light-background;
subMenuBackground: $base-sub-menu-background;
subMenuHover: $base-sub-menu-hover;
sideBarWidth: $base-sidebar-width;
logoTitleColor: $base-logo-title-color;
logoLightTitleColor: $base-logo-light-title-color;
}

View File

@@ -1,44 +1,46 @@
module.exports = {
/**
* 侧边栏主题 深色主题theme-dark浅色主题theme-light
*/
sideTheme: 'theme-dark',
/**
* 是否系统布局配置
*/
showSettings: false,
/**
* 是否显示顶部导航
*/
topNav: false,
/**
* 是否显示 tagsView
*/
tagsView: true,
/**
* 是否固定头部
*/
fixedHeader: false,
/**
* 是否显示logo
*/
sidebarLogo: true,
/**
* 是否显示动态标题
*/
dynamicTitle: false,
/**
* @type {string | array} 'production' | ['production', 'development']
* @description Need show err logs component.
* The default is only used in the production env
* If you want to also use it in dev, you can pass ['production', 'development']
*/
errorLog: 'production'
}
module.exports = {
/**
* 网站标题
*/
title: '冷轧双机架二级控制系统',
/**
* 侧边栏主题:固定使用工业深色主题
*/
sideTheme: 'theme-dark',
/**
* 是否显示右上角设置按钮(生产环境建议关闭)
*/
showSettings: false,
/**
* 是否显示顶部导航
*/
topNav: false,
/**
* 是否显示 tagsView多标签页
*/
tagsView: true,
/**
* 是否固定头部
*/
fixedHeader: true,
/**
* 是否显示侧边栏 Logo
*/
sidebarLogo: true,
/**
* 是否显示动态标题
*/
dynamicTitle: true,
/**
* 错误日志显示环境
*/
errorLog: 'production'
}