opt:西门子优化

This commit is contained in:
2026-04-09 15:47:03 +08:00
parent 4a134ddb2e
commit f0816dd4ce
23 changed files with 708 additions and 103 deletions

View File

@@ -408,7 +408,7 @@ export default {
popSecList: [],
currentRow: null,
value: '',
options: [{ value: 'G01', label: 'G01' }, { value: 'R01', label: 'R01' }, { value: 'R02', label: 'R02' }, { value: 'R03', label: 'R03' }, { value: 'S04', label: 'S04' }, { value: 'S06', label: 'S06' }],
options: [{ value: 'G01', label: 'G01' }, { value: 'R01', label: 'R01(大框)' }, { value: 'R02', label: 'R02(小框)' }, { value: 'R03', label: 'R03' }, { value: 'S04', label: 'S04(侧板架)' }, { value: 'S06', label: 'S06(A字架)' }],
value1: '',
options1: [{ value: '1', label: '货架' }, { value: '2', label: '仓库收货区' }, { value: '3', label: '外协' }, { value: '4', label: '内部过道' }, { value: '5', label: '精加工' }],
value2: '',
@@ -577,8 +577,62 @@ export default {
crudProduceScreen.callEmp({ vehicle_type: this.value, device_code: this.popData.device_code }).then(res => {
this.disabled = false
this.$message(res.msg)
}).catch(() => {
}).catch(error => {
this.disabled = false
console.log('Error object:', error)
console.log('Error response:', error.response)
console.log('Error response data:', error.response && error.response.data)
console.log('Error message:', error.message)
// 检查错误信息格式
let errorMsg = ''
if (error.response && error.response.data) {
if (error.response.data.msg) {
errorMsg = error.response.data.msg
} else if (error.response.data.message) {
errorMsg = error.response.data.message
} else if (error.response.data.error) {
errorMsg = error.response.data.error
}
} else if (error.message) {
errorMsg = error.message
}
console.log('Extracted error message:', errorMsg)
if (errorMsg === '该点位不是空站点,请确认是否设置成空站点并继续呼叫?') {
this.$confirm('该点位不是空站点,请确认是否设置成空站点并继续呼叫?', '确认操作', {
confirmButtonText: '是',
cancelButtonText: '否',
type: 'warning'
}).then(() => {
// 用户确认,重新调用接口,传入 check_flag: true
crudProduceScreen.callEmp({
vehicle_type: this.value,
device_code: this.popData.device_code,
check_flag: true
}).then(res => {
this.$message(res.msg)
}).catch(error => {
// 二次失败,显示后端返回的错误信息
let secondErrorMsg = ''
if (error.response && error.response.data) {
if (error.response.data.msg) {
secondErrorMsg = error.response.data.msg
} else if (error.response.data.message) {
secondErrorMsg = error.response.data.message
} else if (error.response.data.error) {
secondErrorMsg = error.response.data.error
}
} else if (error.message) {
secondErrorMsg = error.message
}
this.$message.error(secondErrorMsg || '操作失败')
})
}).catch(() => {
// 用户取消,不做任何操作
})
} else {
// 其他错误,显示错误信息
this.$message.error(errorMsg || '操作失败')
}
})
} else if (this.type === 'SCANER') {
if (!this.vcode) {
@@ -666,11 +720,11 @@ export default {
if (res && res.length > 0) {
// 转换报警信息格式先过滤再映射避免undefined
this.errorDetails = res
.filter(status => status.isActive === '1') // 先过滤出激活的报警
.filter(status => status.is_active === '1') // 先过滤出激活的报警
.map(status => { // 再映射成目标格式
return {
type: 'AGV报警',
message: `${status.deviceName || status.deviceCode}: ${status.status}`,
message: `${status.device_name || status.device_code}: ${status.status}`,
time: new Date(status.updateTime).toLocaleString('zh-CN')
}
})

View File

@@ -244,7 +244,7 @@ export default {
popSecList: [],
currentRow: null,
value: '',
options: [{ value: 'G01', label: 'G01' }, { value: 'R01', label: 'R01' }, { value: 'R02', label: 'R02' }, { value: 'R03', label: 'R03' }, { value: 'S04', label: 'S04' }, { value: 'S06', label: 'S06' }],
options: [{ value: 'G01', label: 'G01' }, { value: 'R01', label: 'R01(大框)' }, { value: 'R02', label: 'R02(小框)' }, { value: 'R03', label: 'R03' }, { value: 'S04', label: 'S04(侧板架)' }, { value: 'S06', label: 'S06(A字架)' }],
value1: '',
options1: [{ value: '1', label: '货架' }, { value: '2', label: '内部' }, { value: '3', label: '外协' }, { value: '4', label: '内部过道' }],
value2: '',
@@ -351,8 +351,62 @@ export default {
crudProduceScreen.callEmp({ vehicle_type: this.value, device_code: this.popData.device_code }).then(res => {
this.disabled = false
this.$message(res.msg)
}).catch(() => {
}).catch(error => {
this.disabled = false
console.log('Error object:', error)
console.log('Error response:', error.response)
console.log('Error response data:', error.response && error.response.data)
console.log('Error message:', error.message)
// 检查错误信息格式
let errorMsg = ''
if (error.response && error.response.data) {
if (error.response.data.msg) {
errorMsg = error.response.data.msg
} else if (error.response.data.message) {
errorMsg = error.response.data.message
} else if (error.response.data.error) {
errorMsg = error.response.data.error
}
} else if (error.message) {
errorMsg = error.message
}
console.log('Extracted error message:', errorMsg)
if (errorMsg === '该点位不是空站点,请确认是否设置成空站点并继续呼叫?') {
this.$confirm('该点位不是空站点,请确认是否设置成空站点并继续呼叫?', '确认操作', {
confirmButtonText: '是',
cancelButtonText: '否',
type: 'warning'
}).then(() => {
// 用户确认,重新调用接口,传入 check_flag: true
crudProduceScreen.callEmp({
vehicle_type: this.value,
device_code: this.popData.device_code,
check_flag: true
}).then(res => {
this.$message(res.msg)
}).catch(error => {
// 二次失败,显示后端返回的错误信息
let secondErrorMsg = ''
if (error.response && error.response.data) {
if (error.response.data.msg) {
secondErrorMsg = error.response.data.msg
} else if (error.response.data.message) {
secondErrorMsg = error.response.data.message
} else if (error.response.data.error) {
secondErrorMsg = error.response.data.error
}
} else if (error.message) {
secondErrorMsg = error.message
}
this.$message.error(secondErrorMsg || '操作失败')
})
}).catch(() => {
// 用户取消,不做任何操作
})
} else {
// 其他错误,显示错误信息
this.$message.error(errorMsg || '操作失败')
}
})
} else if (this.type === 'SCANER') {
if (!this.vcode) {

View File

@@ -30,4 +30,11 @@ export function getTodayUsageRate() {
})
}
export default { getAgvUsageStatistics, getAgvUsageDetail, getAgvRealtimeStatus, getTodayUsageRate }
export function getMonthlyUsageStatistics() {
return request({
url: 'api/agv_usage/monthly',
method: 'get'
})
}
export default { getAgvUsageStatistics, getAgvUsageDetail, getAgvRealtimeStatus, getTodayUsageRate, getMonthlyUsageStatistics }

View File

@@ -62,7 +62,42 @@
</el-table>
</el-card>
</el-col>
</el-row>
<!-- 月度统计报表 -->
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="24">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>月度统计报表</span>
</div>
<el-table
v-loading="monthlyLoading"
:data="monthlyData"
border
style="width: 100%"
size="small"
>
<el-table-column prop="month" label="月份" width="100" />
<el-table-column prop="totalWorkDuration" label="总工作时长(秒)" width="150">
<template slot-scope="scope">
{{ formatDuration(scope.row.totalWorkDuration) }}
</template>
</el-table-column>
<el-table-column prop="totalTaskCount" label="任务数量" width="100" />
<el-table-column prop="avgUsageRate" label="平均使用率(%)">
<template slot-scope="scope">
<el-progress
:percentage="scope.row.avgUsageRate || 0"
:color="getProgressColor(scope.row.avgUsageRate)"
/>
</template>
</el-table-column>
<el-table-column prop="maxUsageRate" label="最高使用率(%)" width="120" />
<el-table-column prop="minUsageRate" label="最低使用率(%)" width="120" />
</el-table>
</el-card>
</el-col>
</el-row>
<el-dialog
@@ -114,6 +149,7 @@ export default {
return {
loading: false,
detailLoading: false,
monthlyLoading: false,
detailVisible: false,
query: {
startDate: new Date(),
@@ -121,11 +157,18 @@ export default {
},
tableData: [],
detailData: [],
currentDeviceCode: null
monthlyData: [],
currentDeviceCode: null,
refreshTimer: null
}
},
created() {
this.toQuery()
this.getMonthlyStatistics()
this.startAutoRefresh()
},
beforeDestroy() {
this.clearAutoRefresh()
},
methods: {
toQuery() {
@@ -198,6 +241,31 @@ export default {
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
return `${year}-${month}-${day}`
},
// 获取月度统计数据
getMonthlyStatistics() {
this.monthlyLoading = true
crudAgvUsage.getMonthlyUsageStatistics().then(res => {
this.monthlyData = res || []
this.monthlyLoading = false
}).catch(() => {
this.monthlyLoading = false
})
},
// 开始自动刷新
startAutoRefresh() {
// 每10秒刷新一次数据
this.refreshTimer = setInterval(() => {
this.toQuery()
this.getMonthlyStatistics()
}, 10000)
},
// 清除自动刷新
clearAutoRefresh() {
if (this.refreshTimer) {
clearInterval(this.refreshTimer)
this.refreshTimer = null
}
}
}
}
@@ -212,5 +280,21 @@ export default {
margin-bottom: 20px;
}
/* 确保所有进度条组件都应用此样式 */
.el-progress {
display: flex !important;
flex-direction: column !important;
align-items: center !important;
}
.el-progress .el-progress-bar {
width: 100% !important;
}
.el-progress .el-progress__text {
margin-top: 4px !important;
white-space: nowrap !important;
text-align: center !important;
}
</style>

View File

@@ -231,6 +231,9 @@
<el-form-item label="载具编码" prop="vehicle_code">
<el-input v-model="form.vehicle_code" clearable style="width: 370px;" />
</el-form-item>
<el-form-item label="多个载具编码" prop="vehicles">
<el-input v-model="form.vehicles" clearable style="width: 370px;" />
</el-form-item>
<el-form-item label="允许载具类型" prop="can_vehicle_type">
<el-select
v-model="form.can_vehicle_type"
@@ -317,6 +320,7 @@
</el-table-column> -->
<!-- <el-table-column prop="vehicle_type" label="物料类型" :min-width="flexWidth('vehicle_type',crud.data,'物料类型')" />-->
<el-table-column prop="vehicle_code" label="载具编码" :min-width="flexWidth('vehicle_code',crud.data,'载具编码')" />
<el-table-column prop="vehicles" label="多个载具编码" :min-width="flexWidth('vehicles',crud.data,'多个载具编码')" />
<el-table-column v-if="false" prop="vehicle_qty" label="载具数量" :min-width="flexWidth('vehicle_qty',crud.data,'载具数量')" />
<el-table-column label="是否锁定" :min-width="flexWidth('is_lock',crud.data,'是否锁定')">
<template slot-scope="scope">
@@ -382,6 +386,7 @@ const defaultForm = {
vehicle_max_qty: null,
vehicle_type: null,
vehicle_code: null,
vehicles: null,
vehicle_qty: 0,
block_num: null,
row_num: null,