From 9ce8807ed63c3bead99ee84e752eb242524c8745 Mon Sep 17 00:00:00 2001
From: wangyu <823267011@qq.com>
Date: Wed, 8 Jul 2026 13:38:03 +0800
Subject: [PATCH] =?UTF-8?q?feat(micro/acid):=20=E9=85=B8=E8=BD=A7=E6=96=B0?=
=?UTF-8?q?=E5=A2=9E=E3=80=8C=E6=A8=A1=E5=9E=8B=E3=80=8Dtab=EF=BC=8C?=
=?UTF-8?q?=E5=AF=B9=E6=8E=A5=E5=85=AD=E6=9C=BA=E6=9E=B6=E8=BD=A7=E5=88=B6?=
=?UTF-8?q?=E6=A8=A1=E5=9E=8B=E6=9C=8D=E5=8A=A1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增/mill-api代理(dev+nginx),指向klp-ml-mill FastAPI服务
- Model.vue:当前卷/下一卷,L2实测 vs 我们模型预测,逐机架对照
- 鉴权Key通过VUE_APP_MILL_API_KEY环境变量注入,不写死在源码里
---
klp-ui/src/api/l2/mill.js | 26 ++
klp-ui/src/utils/millRequest.js | 41 ++
.../micro/pages/acid/components/Model.vue | 360 ++++++++++++++++++
klp-ui/src/views/micro/pages/acid/index.vue | 14 +-
klp-ui/vue.config.js | 8 +
script/docker/nginx/conf/nginx.conf | 9 +
6 files changed, 456 insertions(+), 2 deletions(-)
create mode 100644 klp-ui/src/api/l2/mill.js
create mode 100644 klp-ui/src/utils/millRequest.js
create mode 100644 klp-ui/src/views/micro/pages/acid/components/Model.vue
diff --git a/klp-ui/src/api/l2/mill.js b/klp-ui/src/api/l2/mill.js
new file mode 100644
index 000000000..0b100f817
--- /dev/null
+++ b/klp-ui/src/api/l2/mill.js
@@ -0,0 +1,26 @@
+import request from '@/utils/millRequest'
+
+// 当前卷 + 下一卷:L2真实数据 与 我们模型预测数据,四组一起返回
+export function getLatestMillData() {
+ return request({
+ url: '/latest',
+ method: 'get'
+ })
+}
+
+// 单次预测(静态/序贯两种模式,见klp-ml-mill/api.py PredictRequest)
+export function predictMill(data) {
+ return request({
+ url: '/predict',
+ method: 'post',
+ data
+ })
+}
+
+// 服务健康检查 + 数据库摘要
+export function getMillHealth() {
+ return request({
+ url: '/health',
+ method: 'get'
+ })
+}
diff --git a/klp-ui/src/utils/millRequest.js b/klp-ui/src/utils/millRequest.js
new file mode 100644
index 000000000..32c38dc94
--- /dev/null
+++ b/klp-ui/src/utils/millRequest.js
@@ -0,0 +1,41 @@
+import axios from 'axios'
+import { Message } from 'element-ui'
+
+// 酸轧六机架轧制模型服务(klp-ml-mill FastAPI)专用请求实例。
+// 这是一套独立的 Python 服务,不走若依后端的 {code,msg,data} 包装协议,
+// 直接返回业务 JSON,所以单独起一个 axios 实例,不复用 utils/request.js 的响应拦截逻辑。
+const service = axios.create({
+ baseURL: '/mill-api',
+ timeout: 60000,
+ headers: {
+ 'Content-Type': 'application/json;charset=utf-8',
+ // 临时鉴权Key,服务端在请求头 X-API-Key 校验(见 klp-ml-mill/api.py)。
+ // 值不写死在代码里,从 VUE_APP_MILL_API_KEY 读(见 klp-ui/.env.local,未入库)。
+ 'X-API-Key': process.env.VUE_APP_MILL_API_KEY || ''
+ }
+})
+
+if (!process.env.VUE_APP_MILL_API_KEY) {
+ // eslint-disable-next-line no-console
+ console.warn('[millRequest] 未配置 VUE_APP_MILL_API_KEY,模型服务接口会被拒绝(401)。'
+ + '请在 klp-ui/.env.local 里设置该变量。')
+}
+
+service.interceptors.response.use(
+ res => res.data,
+ error => {
+ let message = error.message || '请求失败'
+ if (error.response) {
+ const detail = error.response.data && error.response.data.detail
+ message = detail || `模型服务接口异常(${error.response.status})`
+ } else if (message === 'Network Error') {
+ message = '无法连接模型服务(klp-ml-mill),请确认服务是否已启动'
+ } else if (message.includes('timeout')) {
+ message = '模型服务请求超时'
+ }
+ Message({ message, type: 'error', duration: 5000 })
+ return Promise.reject(error)
+ }
+)
+
+export default service
diff --git a/klp-ui/src/views/micro/pages/acid/components/Model.vue b/klp-ui/src/views/micro/pages/acid/components/Model.vue
new file mode 100644
index 000000000..29872bbb7
--- /dev/null
+++ b/klp-ui/src/views/micro/pages/acid/components/Model.vue
@@ -0,0 +1,360 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-ui/src/views/micro/pages/acid/index.vue b/klp-ui/src/views/micro/pages/acid/index.vue
index e8e39034b..b6ea99577 100644
--- a/klp-ui/src/views/micro/pages/acid/index.vue
+++ b/klp-ui/src/views/micro/pages/acid/index.vue
@@ -26,6 +26,10 @@
规程
+
+
+ 模型
+
计划
@@ -39,7 +43,7 @@
实绩
-
+
配辊
@@ -76,6 +80,7 @@ import Stoppage from '@/views/timing/stoppage/index.vue';
import AcidTiming from '@/views/lines/acid/index.vue';
import TrackingView from './components/TrackingView.vue';
import ProcessSpec from './components/ProcessSpec.vue';
+import Model from './components/Model.vue';
export default {
name: 'AcidSystem',
@@ -92,7 +97,8 @@ export default {
Stoppage,
AcidTiming,
TrackingView,
- ProcessSpec
+ ProcessSpec,
+ Model
},
data() {
return {
@@ -115,6 +121,7 @@ export default {
acidTiming: 'AcidTiming',
tracking: 'TrackingView',
processSpec: 'ProcessSpec',
+ model: 'Model',
};
return componentMap[this.activeMenu];
},
@@ -159,6 +166,7 @@ export default {
color: #606266;
padding: 0 20px;
font-size: 14px;
+ transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease;
&:hover {
background-color: #ecf5ff;
@@ -169,11 +177,13 @@ export default {
background-color: #ecf5ff;
color: #409eff;
border-right: 3px solid #409eff;
+ font-weight: 600;
}
i {
font-size: 18px;
margin-right: 8px;
+ transition: color 0.2s ease;
}
}
}
diff --git a/klp-ui/vue.config.js b/klp-ui/vue.config.js
index b14f87c2e..48eec3ae6 100644
--- a/klp-ui/vue.config.js
+++ b/klp-ui/vue.config.js
@@ -54,6 +54,14 @@ module.exports = {
['^' + '/zinc-api']: '/api'
}
},
+ // 酸轧六机架轧制模型服务(klp-ml-mill FastAPI),/predict /latest /sync /retrain /health
+ '/mill-api': {
+ target: `http://117.72.159.31:10001`,
+ changeOrigin: true,
+ pathRewrite: {
+ ['^' + '/mill-api']: ''
+ }
+ },
// 直接代理WebSocket相关路径
'/websocket': {
target: `http://localhost:8080`,
diff --git a/script/docker/nginx/conf/nginx.conf b/script/docker/nginx/conf/nginx.conf
index e9630aaf7..b1a677310 100644
--- a/script/docker/nginx/conf/nginx.conf
+++ b/script/docker/nginx/conf/nginx.conf
@@ -81,6 +81,15 @@ http {
proxy_pass http://server/;
}
+ # 酸轧六机架轧制模型服务(klp-ml-mill FastAPI)
+ location /mill-api/ {
+ proxy_set_header Host $http_host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header REMOTE-HOST $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_pass http://117.72.159.31:10001/;
+ }
+
# https 会拦截内链所有的 http 请求 造成功能无法使用
# 解决方案1 将 admin 服务 也配置成 https
# 解决方案2 将菜单配置为外链访问 走独立页面 http 访问