opt:西门子优化
This commit is contained in:
@@ -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')
|
||||
}
|
||||
})
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user