feat: 同步g30

This commit is contained in:
砂糖
2026-01-04 17:04:42 +08:00
parent 36e9fc47db
commit b95291265b
38 changed files with 1550 additions and 2176 deletions

View File

@@ -1,9 +1,9 @@
<template>
<div class="app-container">
<!-- Toolbar / 工具栏 -->
<!-- 工具栏 -->
<div class="toolbar">
<el-button @click="reload" icon="el-icon-refresh" size="small" :loading="loading">
Refresh
刷新
</el-button>
<el-button
v-if="lastSuccess && lastSuccess.lastSendTime"
@@ -13,11 +13,11 @@
size="small"
@click="applyLastSuccessValues"
>
Apply Last Success Values
应用上次成功参数
</el-button>
</div>
<!-- Cards / 卡片 -->
<!-- 卡片列表 -->
<div v-loading="loading" class="card-grid-container">
<el-row :gutter="20">
<el-col
@@ -31,27 +31,27 @@
<el-card class="parameter-card" shadow="hover">
<div slot="header" class="card-header">
<div class="card-header-content">
<!-- 头部信息参考 setup/panels 卡片表头多字段拼接的风格 -->
<!-- 头部信息多字段拼接展示 -->
<div class="card-title-row">
<span class="card-title">
Plan ID: {{ setup.planid || '-' }}
| Coil ID: {{ setup.coilid || '-' }}
| Steel Grade: {{ setup.steelGrade || setup.grade || '-' }}
计划ID: {{ setup.planid || '-' }}
| 钢卷号: {{ setup.coilid || '-' }}
| 钢种: {{ setup.steelGrade || setup.grade || '-' }}
</span>
</div>
<div class="card-subtitle">
<span>Entry Thickness: {{ setup.entryThick || '-' }}</span>
<span>Entry Width: {{ setup.entryWidth || '-' }}</span>
<span>Entry Weight: {{ setup.entryWeight || '-' }}</span>
<span>Entry Length: {{ setup.entryLength || '-' }}</span>
<span>入口厚度: {{ setup.entryThick || '-' }}</span>
<span>入口宽度: {{ setup.entryWidth || '-' }}</span>
<span>入口重量: {{ setup.entryWeight || '-' }}</span>
<span>入口长度: {{ setup.entryLength || '-' }}</span>
</div>
<div class="card-subtitle">
<span>TL Elongation: {{ setup.tlElong || '-' }}</span>
<span>TM Roll Force: {{ setup.tmRollforce || '-' }}</span>
<span>TM Bending Force: {{ setup.tmBendforce || '-' }}</span>
<span v-if="setup.updateTime">Updated: {{ formatTime(setup.updateTime) }}</span>
<span>拉伸机延伸率: {{ setup.tlElong || '-' }}</span>
<span>轧机轧制力: {{ setup.tmRollforce || '-' }}</span>
<span>轧机弯辊力: {{ setup.tmBendforce || '-' }}</span>
<span v-if="setup.updateTime">更新时间: {{ formatTime(setup.updateTime) }}</span>
</div>
</div>
@@ -63,7 +63,7 @@
@click="handleSend(setup)"
:loading="setup.sending"
>
Send
下发
</el-button>
</div>
</div>
@@ -92,46 +92,46 @@
</el-row>
<div v-if="setups.length === 0 && !loading" class="empty-data">
<el-empty description="No Setup History Data"></el-empty>
<el-empty description="暂无配置历史数据"></el-empty>
</div>
</div>
</div>
</template>
<script>
// Import APIs / 引入接口
// 引入接口
import { listSetup } from '@/api/business/setup'
import { createSendJob, executeSendJob } from '@/api/l2/sendJob'
import { getLastSuccess } from '@/api/l2/sendTemplate'
// Drive fields definition (English UI, Chinese comments) / 传动字段定义(文界面,中文注释
// 传动字段定义(文界面,贴合工业场景
const DRIVE_FIELDS = [
{ key: 'porTension', label: 'Pay-off Reel Tension' },
{ key: 'celTension', label: 'Entry Loop Tension' },
{ key: 'cleanTension', label: 'Cleaning Section Tension' },
{ key: 'furTension', label: 'Furnace Zone Tension' },
{ key: 'towerTension', label: 'Cooling Tower Tension' },
{ key: 'tmNoneTension', label: 'TM No Tension' },
{ key: 'tmEntryTension', label: 'TM Entry Tension' },
{ key: 'tmExitTension', label: 'TM Exit Tension' },
{ key: 'tlNoneTension', label: 'TL No Tension' },
{ key: 'tlExitTension', label: 'TL Exit Tension' },
{ key: 'coatTension', label: 'Post-treatment Tension' },
{ key: 'cxlTension', label: 'Exit Loop Tension' },
{ key: 'trTension', label: 'Take-up Reel Tension' },
{ key: 'porTension', label: '开卷机张力' },
{ key: 'celTension', label: '入口活套张力' },
{ key: 'cleanTension', label: '清洗段张力' },
{ key: 'furTension', label: '炉区张力' },
{ key: 'towerTension', label: '冷却塔张力' },
{ key: 'tmNoneTension', label: '轧机无张力' },
{ key: 'tmEntryTension', label: '轧机入口张力' },
{ key: 'tmExitTension', label: '轧机出口张力' },
{ key: 'tlNoneTension', label: '拉伸机无张力' },
{ key: 'tlExitTension', label: '拉伸机出口张力' },
{ key: 'coatTension', label: '后处理段张力' },
{ key: 'cxlTension', label: '出口活套张力' },
{ key: 'trTension', label: '卷取机张力' },
{ key: 'tlElong', label: 'TL Elongation' },
{ key: 'tlLvlMesh1', label: 'TL Leveling Roll Mesh 1' },
{ key: 'tlLvlMesh2', label: 'TL Leveling Roll Mesh 2' },
{ key: 'tlAcbMesh', label: 'TL Anti-crossbow Mesh' },
{ key: 'tlElong', label: '拉伸机延伸率' },
{ key: 'tlLvlMesh1', label: '拉伸机矫直辊间隙1' },
{ key: 'tlLvlMesh2', label: '拉伸机矫直辊间隙2' },
{ key: 'tlAcbMesh', label: '拉伸机防侧弯间隙' },
{ key: 'tmBendforce', label: 'TM Bending Force' },
{ key: 'tmAcrMesh', label: 'TM Anti-crimping Roll Mesh' },
{ key: 'tmBrMesh', label: 'TM Anti-tremor Roll Mesh' },
{ key: 'tmRollforce', label: 'TM Roll Force' }
{ key: 'tmBendforce', label: '轧机弯辊力' },
{ key: 'tmAcrMesh', label: '轧机防皱辊间隙' },
{ key: 'tmBrMesh', label: '轧机防颤辊间隙' },
{ key: 'tmRollforce', label: '轧机轧制力' }
]
// OPC address mapping / OPC点位映射
// OPC地址映射(保持原有配置,不影响功能)
const DRIVE_ADDRESS = {
porTension: 'ns=2;s=ProcessCGL.PLCLine.L2Setup.tensionPorBR1',
celTension: 'ns=2;s=ProcessCGL.PLCLine.L2Setup.tensionBR3',
@@ -164,7 +164,7 @@ export default {
return {
loading: false,
lastSuccess: null,
setups: [], // Changed from 'plans' to 'setups'
setups: [],
driveFields: DRIVE_FIELDS,
driveAddress: { ...DRIVE_ADDRESS }
}
@@ -176,22 +176,22 @@ export default {
async reload() {
this.loading = true
try {
// 1. Get last success for DRIVE
// 1. 获取传动模块上次成功下发数据
const lastRes = await getLastSuccess('DRIVE')
this.lastSuccess = lastRes && lastRes.code === 200 ? lastRes.data : null
// 2. Get setup history list (instead of plans)
const setupRes = await listSetup({ pageNum: 1, pageSize: 20 }) // Fetch latest 20 for example
// 2. 获取配置历史列表
const setupRes = await listSetup({ pageNum: 1, pageSize: 20 })
const setupList = (setupRes && setupRes.rows) || []
// 3. Map setup list to display data
// 3. 映射配置列表为展示数据
this.setups = setupList.map(s => {
const params = {}
this.driveFields.forEach(f => {
const fromSetup = s ? s[f.key] : undefined
const fromLast = this.lastSuccess?.values?.[f.key]
// Priority: current setup value > last success value > ''
// 优先级:当前配置值 > 上次成功值 > 空字符串
if (fromSetup !== undefined && fromSetup !== null && String(fromSetup) !== '') {
params[f.key] = String(fromSetup)
} else if (fromLast !== undefined && fromLast !== null) {
@@ -209,7 +209,7 @@ export default {
})
} catch (e) {
console.error(e)
this.$message.error('Load failed')
this.$message.error('加载失败')
} finally {
this.loading = false
}
@@ -217,7 +217,7 @@ export default {
applyLastSuccessValues() {
if (!this.lastSuccess || !this.lastSuccess.values) {
this.$message.info('No last success data')
this.$message.info('暂无上次成功数据')
return
}
this.setups.forEach(setup => {
@@ -228,13 +228,13 @@ export default {
}
})
})
this.$message.success('Last success values applied')
this.$message.success('上次成功参数应用完成')
},
getPlaceholder(key) {
const v = this.lastSuccess?.values?.[key]
if (v !== undefined) return `Last: ${v}`
return 'Please enter'
if (v !== undefined) return `上次值:${v}`
return '请输入参数值'
},
formatTime(t) {
@@ -244,11 +244,11 @@ export default {
handleSend(setup) {
this.$confirm(
`Confirm to send parameters for Coil [${setup.coilid || '-'}]?`,
'Warning',
`确认要下发【${setup.coilid || '-'}】钢卷的传动参数吗?`,
'提示',
{
confirmButtonText: 'Confirm',
cancelButtonText: 'Cancel',
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning'
}
).then(() => this.doSend(setup)).catch(() => {})
@@ -259,24 +259,24 @@ export default {
try {
const items = this.driveFields.map(f => ({
paramCode: f.key,
address: this.driveAddress[f.key], // OPC address can be empty
address: this.driveAddress[f.key],
valueRaw: String(setup.params[f.key] || ''),
setTime: new Date()
})).filter(it => !!it.address) // Filter out items without an address
})).filter(it => !!it.address) // 过滤无OPC地址的项
if (!items.length) {
this.$message.warning('OPC addresses are not configured. Nothing to send.')
this.$message.warning('OPC地址未配置,无可下发内容')
return
}
const dto = {
deviceName: 'CGL_LINE_1',
bizKey: setup.coilid, // Use coilid as business key
bizKey: setup.coilid,
groups: [
{
groupNo: 1,
groupType: 'DRIVE',
groupName: `Drive Params for ${setup.coilid || ''}`,
groupName: `传动参数_${setup.coilid || ''}`,
items
}
]
@@ -284,15 +284,15 @@ export default {
const createRes = await createSendJob(dto)
const jobId = createRes.data
if (!jobId) throw new Error('Create send job failed')
if (!jobId) throw new Error('创建下发任务失败')
await executeSendJob(jobId)
this.$message.success('Send success')
this.$message.success('下发成功')
await this.reload()
} catch (e) {
console.error(e)
this.$message.error(e.message || 'Send failed')
this.$message.error(e.message || '下发失败')
} finally {
setup.sending = false
}
@@ -313,4 +313,4 @@ export default {
.header-right { flex-shrink: 0; margin-left: 16px; }
.last-send-time { font-size: 12px; color:#909399; margin-right:16px; }
.empty-data { margin-top: 20px; }
</style>
</style>