日期筛选

pull/101/head
ZHW 5 months ago
parent 55c85cfe3c
commit d516a9bcdb

@ -74,8 +74,10 @@
<!-- 告警列表 -->
<div v-else class="alert-list">
<div v-for="alert in recentAlerts" :key="alert.alertId" class="alert-item">
<!-- 只显示前10条告警 -->
<div v-for="(alert, index) in recentAlerts.slice(0, 10)" :key="alert.alertId" class="alert-item">
<div class="alert-text">{{ alert.deviceId }}{{ alert.alertMessage }}</div>
<div class="alert-time">{{ formatDateTime(alert.timestamp) }}</div>
<div class="alert-meta">
<div :class="['alert-level', alert.alertLevel?.toLowerCase()]">
{{ formatAlertLevel(alert.alertLevel) }}
@ -85,23 +87,6 @@
</div>
</div>
</div>
<!-- 工单状态统计 -->
<div class="content-card">
<h3 class="card-title">工单状态统计</h3>
<div class="chart-placeholder">
<div class="placeholder-text">
<div style="font-size: 16px; margin-bottom: 8px;">待处理工单数: {{ stats.pendingWorkOrders }}</div>
<div style="font-size: 24px; margin-bottom: 12px;">柱状图</div>
<div style="color: #666; font-size: 12px;">
通过Group内data和config中继器可更改数据及配置
</div>
<div style="color: #666; font-size: 12px;">
详情访问https://axhub.im/charts
</div>
</div>
</div>
</div>
</div>
</div>
</template>
@ -166,6 +151,12 @@ const formatAlertLevel = (level: string): string => {
return levelMap[level?.toLowerCase()] || level
}
//
const formatDateTime = (dateTime: string): string => {
if (!dateTime) return ''
return new Date(dateTime).toLocaleString('zh-CN')
}
//
const fetchStatsData = async () => {
try {
@ -178,18 +169,51 @@ const fetchStatsData = async () => {
return
}
//
const statusCountResult = await request<ResultVO<Record<string, number>>>(
'/api/web/device-status/status-count',
{ method: 'GET' }
)
if (statusCountResult.code === 200 && statusCountResult.data) {
const data = statusCountResult.data
stats.value.onlineDevices = data.online || 0
stats.value.offlineDevices = data.offline || 0
stats.value.alertDevices = data.fault || 0
stats.value.totalDevices = (data.online || 0) + (data.offline || 0) + (data.fault || 0)
// 使
try {
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = userInfo.areaId || ''
//
const areaParam = areaId ? `?areaId=${areaId}` : ''
//
const [onlineResult, offlineResult, faultResult] = await Promise.allSettled([
request<ResultVO<any[]>>(`/api/web/device-status/by-status?status=online${areaParam}`, { method: 'GET' }),
request<ResultVO<any[]>>(`/api/web/device-status/by-status?status=offline${areaParam}`, { method: 'GET' }),
request<ResultVO<any[]>>(`/api/web/device-status/by-status?status=fault${areaParam}`, { method: 'GET' })
])
// 线
if (onlineResult.status === 'fulfilled' && onlineResult.value.code === 200) {
stats.value.onlineDevices = onlineResult.value.data?.length || 0
} else {
stats.value.onlineDevices = 0
}
// 线
if (offlineResult.status === 'fulfilled' && offlineResult.value.code === 200) {
stats.value.offlineDevices = offlineResult.value.data?.length || 0
} else {
stats.value.offlineDevices = 0
}
//
if (faultResult.status === 'fulfilled' && faultResult.value.code === 200) {
stats.value.alertDevices = faultResult.value.data?.length || 0
} else {
stats.value.alertDevices = 0
}
//
stats.value.totalDevices = stats.value.onlineDevices + stats.value.offlineDevices + stats.value.alertDevices
} catch (statusError) {
console.error('获取设备状态统计失败,使用默认值:', statusError)
//
stats.value.onlineDevices = 0
stats.value.offlineDevices = 0
stats.value.alertDevices = 0
stats.value.totalDevices = 0
}
//
@ -200,6 +224,8 @@ const fetchStatsData = async () => {
if (workOrderResult.code === 200 && workOrderResult.data) {
stats.value.pendingWorkOrders = workOrderResult.data.length
} else {
stats.value.pendingWorkOrders = 0
}
} catch (error: any) {
@ -245,25 +271,24 @@ const fetchAlertData = async () => {
//
const alerts = Array.isArray(alertResult.data) ? alertResult.data : []
// 5
recentAlerts.value = alerts.slice(0, 5)
// 10
recentAlerts.value = alerts.slice(0, 10)
//
if (recentAlerts.value.length > 0) {
const sortedAlerts = [...recentAlerts.value].sort((a, b) => {
const priorityMap: Record<string, number> = {
'critical': 4,
'error': 3,
'warning': 2,
'info': 1
};
return (priorityMap[b.alertLevel?.toLowerCase()] || 0) - (priorityMap[a.alertLevel?.toLowerCase()] || 0);
});
latestAlert.value = sortedAlerts[0] ?? null; // undefined
} else {
latestAlert.value = null;
}
const sortedAlerts = [...recentAlerts.value].sort((a, b) => {
const priorityMap: Record<string, number> = {
'critical': 4,
'error': 3,
'warning': 2,
'info': 1
};
return (priorityMap[b.alertLevel?.toLowerCase()] || 0) - (priorityMap[a.alertLevel?.toLowerCase()] || 0);
});
latestAlert.value = sortedAlerts[0] ?? null;
} else {
latestAlert.value = null;
}
}
} catch (error: any) {
console.error('获取告警数据失败:', error)
@ -517,10 +542,16 @@ onMounted(() => {
.alert-text {
font-size: 14px;
color: #333;
margin-bottom: 8px;
margin-bottom: 4px;
line-height: 1.4;
}
.alert-time {
font-size: 12px;
color: #666;
margin: 4px 0;
}
.alert-meta {
display: flex;
justify-content: space-between;
@ -589,4 +620,4 @@ onMounted(() => {
gap: 8px;
}
}
</style>
</style>

@ -30,8 +30,8 @@
@change="handleSearch"
>
<option value="">全部片区</option>
<option value="市区">市区</option>
<option value="校区">校区</option>
<option value="A">A</option>
<option value="B">B</option>
</select>
<!-- 状态筛选 -->

@ -167,18 +167,43 @@ const loadCompletedOrders = async () => {
console.log('当前 Token:', token.substring(0, 20) + '...')
//
let url = '/api/work-orders/by-status?status=completed'
//
let url = ''
const params = new URLSearchParams()
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
if (filterForm.value.createDate) {
// 使 by-time-range
url = '/api/work-orders/by-time-range'
//
const startDate = new Date(filterForm.value.createDate)
const endDate = new Date(startDate)
endDate.setDate(endDate.getDate() + 1)
params.append('startTime', startDate.toISOString())
params.append('endTime', endDate.toISOString())
params.append('status', 'completed') //
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
}
} else {
// 使 by-status
url = '/api/work-orders/by-status'
params.append('status', 'completed')
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
}
}
//
const queryString = params.toString()
if (queryString) {
url += `&${queryString}`
url += `?${queryString}`
}
// 使 request
@ -243,7 +268,7 @@ const formatStatus = (status: OrderStatus): string => {
return statusMap[status] || status
}
//
// -
const filteredOrders = computed(() => {
return orders.value.filter(order => {
// /ID
@ -254,11 +279,12 @@ const filteredOrders = computed(() => {
//
const areaMatch = filterForm.value.area === '' || order.area === filterForm.value.area
//
const dateMatch = filterForm.value.createDate === '' ||
order.createTime.split(' ')[0] === filterForm.value.createDate
//
// const dateMatch = filterForm.value.createDate === '' ||
// order.createTime.split(' ')[0] === filterForm.value.createDate
return keywordMatch && areaMatch && dateMatch
// dateMatch
return keywordMatch && areaMatch
})
})
@ -308,6 +334,7 @@ onMounted(() => {
})
</script>
<style scoped>
/* 样式与前几个页面完全一致,仅修改页面容器类名 */
.order-completed-page {

@ -230,45 +230,58 @@ const formatStatus = (status: OrderStatus): string => {
const loadAvailableOrders = async () => {
loading.value = true
try {
// Pinia Token Admin.vue
const token = authStore.token
// Token
if (!token) {
console.warn('未获取到 Token跳转到登录页')
router.push('/login')
return
}
console.log('当前 Token:', token.substring(0, 20) + '...') //
//
let url = '/api/work-orders/available'
let url = ''
const params = new URLSearchParams()
// areaId
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
//
if (filterForm.value.createDate) {
// 使 by-time-range
url = '/api/work-orders/by-time-range'
//
const startDate = new Date(filterForm.value.createDate)
const endDate = new Date(startDate)
endDate.setDate(endDate.getDate() + 1)
params.append('startTime', startDate.toISOString())
params.append('endTime', endDate.toISOString())
if (areaId) {
params.append('areaId', areaId)
}
} else {
// 使 available
url = '/api/work-orders/available'
if (areaId) {
params.append('areaId', areaId)
}
}
//
const queryString = params.toString()
if (queryString) {
url += `?${queryString}`
}
// 使 request 使 axios
// loadAvailableOrders
const response = await request<{
code: number
msg: string
data: any[]
}>(url,{
method: 'GET',
})
code: number
msg: string
data: any[]
}>(url, {
method: 'GET',
})
//
if (response.code === 200) {
orders.value = (response.data || []).map((order: any) => ({
id: order.orderId || '',
@ -291,29 +304,18 @@ const loadAvailableOrders = async () => {
}
} catch (error: any) {
console.error('请求异常:', error)
console.error('错误详情:', {
message: error.message,
status: error.status,
response: error.response
})
const errorMsg = error.message.includes('401') || error.message.includes('403')
? '权限不足或登录已过期,请重新登录'
: error.message.includes('Network')
? '网络连接失败,请检查网络'
: error.message || '获取数据失败,请稍后重试'
alert(`获取待抢单工单失败:${errorMsg}`)
/*if (error.message.includes('401') || error.message.includes('403')) {
authStore.logout()
router.push('/login')
}*/
}
finally {
const errorMsg = error.message.includes('401') || error.message.includes('403')
? '权限不足或登录已过期,请重新登录'
: error.message.includes('Network')
? '网络连接失败,请检查网络'
: error.message || '获取数据失败,请稍后重试'
alert(`获取待抢单工单失败:${errorMsg}`)
} finally {
loading.value = false
}
}
//
const filteredOrders = computed(() => {
return orders.value.filter(order => {
@ -326,10 +328,10 @@ const filteredOrders = computed(() => {
const areaMatch = filterForm.value.area === '' || order.area === filterForm.value.area
//
const dateMatch = filterForm.value.createDate === '' ||
order.createTime.split(' ')[0] === filterForm.value.createDate
// const dateMatch = filterForm.value.createDate === '' ||
// order.createTime.split(' ')[0] === filterForm.value.createDate
return keywordMatch && areaMatch && dateMatch
return keywordMatch && areaMatch
})
})

@ -228,6 +228,7 @@ const formatStatus = (status: OrderStatus): string => {
}
//
// loadProcessingOrders
const loadProcessingOrders = async () => {
loading.value = true
try {
@ -238,22 +239,40 @@ const loadProcessingOrders = async () => {
return
}
//
//
let url = ''
const params = new URLSearchParams()
params.append('status', 'processing')
if (filterForm.value.area) {
params.append('areaId', filterForm.value.area)
}
if (filterForm.value.createDate) {
params.append('startDate', filterForm.value.createDate)
// 使 by-time-range
url = '/api/work-orders/by-time-range'
//
const startDate = new Date(filterForm.value.createDate)
const endDate = new Date(startDate)
endDate.setDate(endDate.getDate() + 1)
params.append('startTime', startDate.toISOString())
params.append('endTime', endDate.toISOString())
params.append('status', 'processing') //
if (filterForm.value.area) {
params.append('areaId', filterForm.value.area)
}
} else {
// 使 by-status
url = '/api/work-orders/by-status'
params.append('status', 'processing')
if (filterForm.value.area) {
params.append('areaId', filterForm.value.area)
}
}
const queryString = params.toString()
//
const url = `/api/work-orders/by-status?status=processing${queryString ? `&${queryString}` : ''}`
if (queryString) {
url += `?${queryString}`
}
//
const response = await request<{
@ -292,6 +311,7 @@ const loadProcessingOrders = async () => {
}
}
//
const filteredOrders = computed(() => {
return orders.value.filter(order => {
@ -304,10 +324,10 @@ const filteredOrders = computed(() => {
const areaMatch = filterForm.value.area === '' || order.area === filterForm.value.area
//
const dateMatch = filterForm.value.createDate === '' ||
order.createTime.split(' ')[0] === filterForm.value.createDate
//const dateMatch = filterForm.value.createDate === '' ||
// order.createTime.split(' ')[0] === filterForm.value.createDate
return keywordMatch && areaMatch && dateMatch
return keywordMatch && areaMatch
})
})

@ -154,6 +154,7 @@ const filterForm = ref({
})
//
// -
const loadReviewOrders = async () => {
loading.value = true
try {
@ -167,18 +168,43 @@ const loadReviewOrders = async () => {
console.log('当前 Token:', token.substring(0, 20) + '...')
//
let url = '/api/work-orders/by-status?status=reviewing'
//
let url = ''
const params = new URLSearchParams()
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
if (filterForm.value.createDate) {
// 使 by-time-range
url = '/api/work-orders/by-time-range'
//
const startDate = new Date(filterForm.value.createDate)
const endDate = new Date(startDate)
endDate.setDate(endDate.getDate() + 1)
params.append('startTime', startDate.toISOString())
params.append('endTime', endDate.toISOString())
params.append('status', 'reviewing') //
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
}
} else {
// 使 by-status
url = '/api/work-orders/by-status'
params.append('status', 'reviewing')
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
}
}
//
const queryString = params.toString()
if (queryString) {
url += `&${queryString}`
url += `?${queryString}`
}
// 使 request
@ -243,22 +269,23 @@ const formatStatus = (status: OrderStatus): string => {
return statusMap[status] || status
}
//
// -
const filteredOrders = computed(() => {
return orders.value.filter(order => {
// /ID
const keywordMatch = searchKeyword.value.trim() === '' ||
order.orderNo.toLowerCase().includes(searchKeyword.value.toLowerCase()) ||
order.deviceId.toLowerCase().includes(searchKeyword.value.toLowerCase())
order.orderNo.toLowerCase().includes(searchKeyword.value.toLowerCase()) ||
order.deviceId.toLowerCase().includes(searchKeyword.value.toLowerCase())
//
const areaMatch = filterForm.value.area === '' || order.area === filterForm.value.area
//
const dateMatch = filterForm.value.createDate === '' ||
order.createTime.split(' ')[0] === filterForm.value.createDate
//
// const dateMatch = filterForm.value.createDate === '' ||
// order.createTime.split(' ')[0] === filterForm.value.createDate
return keywordMatch && areaMatch && dateMatch
// dateMatch
return keywordMatch && areaMatch
})
})

@ -253,7 +253,7 @@ const selectedStaffId = ref('')
const assignRemark = ref('')
const allStaff = ref<MaintenanceStaff[]>([])
//
// -
const loadTimeoutOrders = async () => {
loading.value = true
try {
@ -267,18 +267,43 @@ const loadTimeoutOrders = async () => {
console.log('当前 Token:', token.substring(0, 20) + '...')
//
let url = '/api/work-orders/by-status?status=timeout'
//
let url = ''
const params = new URLSearchParams()
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
if (filterForm.value.createDate) {
// 使 by-time-range
url = '/api/work-orders/by-time-range'
//
const startDate = new Date(filterForm.value.createDate)
const endDate = new Date(startDate)
endDate.setDate(endDate.getDate() + 1)
params.append('startTime', startDate.toISOString())
params.append('endTime', endDate.toISOString())
params.append('status', 'timeout') //
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
}
} else {
// 使 by-status
url = '/api/work-orders/by-status'
params.append('status', 'timeout')
const userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
const areaId = filterForm.value.area || userInfo.areaId || ''
if (areaId) {
params.append('areaId', areaId)
}
}
//
const queryString = params.toString()
if (queryString) {
url += `&${queryString}`
url += `?${queryString}`
}
// 使 request
@ -387,17 +412,18 @@ const filteredOrders = computed(() => {
return orders.value.filter(order => {
// /ID
const keywordMatch = searchKeyword.value.trim() === '' ||
order.orderNo.toLowerCase().includes(searchKeyword.value.toLowerCase()) ||
order.deviceId.toLowerCase().includes(searchKeyword.value.toLowerCase())
order.orderNo.toLowerCase().includes(searchKeyword.value.toLowerCase()) ||
order.deviceId.toLowerCase().includes(searchKeyword.value.toLowerCase())
//
const areaMatch = filterForm.value.area === '' || order.area === filterForm.value.area
//
const dateMatch = filterForm.value.createDate === '' ||
order.createTime.split(' ')[0] === filterForm.value.createDate
//
// const dateMatch = filterForm.value.createDate === '' ||
// order.createTime.split(' ')[0] === filterForm.value.createDate
return keywordMatch && areaMatch && dateMatch
// dateMatch
return keywordMatch && areaMatch
})
})

Loading…
Cancel
Save