完善审批台接收推送信息
This commit is contained in:
parent
5a13911694
commit
f7641f6439
|
@ -1,49 +1,70 @@
|
||||||
import http from '@/utils/http'
|
import http from '@/utils/http'
|
||||||
import type { EquipmentApprovalReq, EquipmentApprovalResp, EquipmentApprovalListReq } from './type'
|
import type { EquipmentApprovalListReq, EquipmentApprovalResp } from './type'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设备审批管理API
|
* 设备审批API
|
||||||
*/
|
*/
|
||||||
export const equipmentApprovalApi = {
|
export const equipmentApprovalApi = {
|
||||||
/**
|
/**
|
||||||
* 分页查询待审批的设备采购申请
|
* 分页查询待审批的设备采购申请
|
||||||
*/
|
*/
|
||||||
getPendingApprovals: (params: EquipmentApprovalListReq) => {
|
getPendingApprovals(params: EquipmentApprovalListReq) {
|
||||||
return http.get<ApiRes<PageRes<EquipmentApprovalResp>>>('/equipment/approval/pending', { params })
|
return http.get<EquipmentApprovalResp[]>('/equipment/approval/pending', params)
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分页查询已审批的设备采购申请
|
* 分页查询已审批的设备采购申请
|
||||||
*/
|
*/
|
||||||
getApprovedApprovals: (params: EquipmentApprovalListReq) => {
|
getApprovedApprovals(params: EquipmentApprovalListReq) {
|
||||||
return http.get<ApiRes<PageRes<EquipmentApprovalResp>>>('/equipment/approval/approved', { params })
|
return http.get<EquipmentApprovalResp[]>('/equipment/approval/approved', params)
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 审批通过
|
* 审批通过
|
||||||
*/
|
*/
|
||||||
approve: (approvalId: string, data: EquipmentApprovalReq) => {
|
approve(approvalId: string, data: any) {
|
||||||
return http.post<ApiRes<null>>(`/equipment/approval/${approvalId}/approve`, data)
|
return http.post(`/equipment/approval/${approvalId}/approve`, data)
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 审批拒绝
|
* 审批拒绝
|
||||||
*/
|
*/
|
||||||
reject: (approvalId: string, data: EquipmentApprovalReq) => {
|
reject(approvalId: string, data: any) {
|
||||||
return http.post<ApiRes<null>>(`/equipment/approval/${approvalId}/reject`, data)
|
return http.post(`/equipment/approval/${approvalId}/reject`, data)
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取审批详情
|
* 获取审批详情
|
||||||
*/
|
*/
|
||||||
getApprovalDetail: (approvalId: string) => {
|
getApprovalDetail(approvalId: string) {
|
||||||
return http.get<ApiRes<EquipmentApprovalResp>>(`/equipment/approval/${approvalId}`)
|
return http.get<EquipmentApprovalResp>(`/equipment/approval/${approvalId}`)
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取审批统计信息
|
* 获取审批统计信息
|
||||||
*/
|
*/
|
||||||
getApprovalStats: () => {
|
getApprovalStats() {
|
||||||
return http.get<ApiRes<unknown>>('/equipment/approval/stats')
|
return http.get('/equipment/approval/stats')
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交采购申请
|
||||||
|
*/
|
||||||
|
submitProcurementApplication(data: any) {
|
||||||
|
return http.post('/equipment/approval/procurement/apply', data)
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取我的采购申请
|
||||||
|
*/
|
||||||
|
getMyProcurementApplications(params: EquipmentApprovalListReq) {
|
||||||
|
return http.get<EquipmentApprovalResp[]>('/equipment/approval/procurement/my-applications', params)
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 撤回采购申请
|
||||||
|
*/
|
||||||
|
withdrawProcurementApplication(approvalId: string) {
|
||||||
|
return http.post(`/equipment/approval/procurement/${approvalId}/withdraw`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,9 +74,9 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Modal } from '@arco-design/web-vue'
|
import { Modal, Notification } from '@arco-design/web-vue'
|
||||||
import { useFullscreen } from '@vueuse/core'
|
import { useFullscreen } from '@vueuse/core'
|
||||||
import { onMounted, ref, nextTick } from 'vue'
|
import { onMounted, ref, nextTick, onBeforeUnmount } from 'vue'
|
||||||
import Message from './Message.vue'
|
import Message from './Message.vue'
|
||||||
import SettingDrawer from './SettingDrawer.vue'
|
import SettingDrawer from './SettingDrawer.vue'
|
||||||
import Search from './Search.vue'
|
import Search from './Search.vue'
|
||||||
|
@ -116,29 +116,61 @@ const initWebSocket = (token: string) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
socket = new WebSocket(`${import.meta.env.VITE_API_WS_URL}/websocket?token=${token}`)
|
const wsUrl = import.meta.env.VITE_API_WS_URL || 'ws://localhost:8888'
|
||||||
|
console.log('正在连接WebSocket:', `${wsUrl}/websocket?token=${token}`)
|
||||||
|
|
||||||
|
socket = new WebSocket(`${wsUrl}/websocket?token=${token}`)
|
||||||
|
|
||||||
socket.onopen = () => {
|
socket.onopen = () => {
|
||||||
// console.log('WebSocket connection opened')
|
console.log('WebSocket连接成功')
|
||||||
}
|
}
|
||||||
|
|
||||||
socket.onmessage = (event) => {
|
socket.onmessage = (event) => {
|
||||||
|
console.log('收到WebSocket消息:', event.data)
|
||||||
|
try {
|
||||||
|
const data = JSON.parse(event.data)
|
||||||
|
|
||||||
|
// 处理通知消息
|
||||||
|
if (data.type && data.title && data.content) {
|
||||||
|
console.log('处理通知消息:', data)
|
||||||
|
// 显示通知
|
||||||
|
Notification.info({
|
||||||
|
title: data.title,
|
||||||
|
content: data.content,
|
||||||
|
duration: 5000,
|
||||||
|
closable: true,
|
||||||
|
position: 'topRight'
|
||||||
|
})
|
||||||
|
|
||||||
|
// 增加未读消息计数
|
||||||
|
unreadMessageCount.value++
|
||||||
|
} else {
|
||||||
|
// 处理简单的数字消息(兼容旧版本)
|
||||||
|
const count = Number.parseInt(event.data)
|
||||||
|
if (!isNaN(count)) {
|
||||||
|
unreadMessageCount.value = count
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('解析WebSocket消息失败:', error)
|
||||||
|
// 尝试解析为数字(兼容旧版本)
|
||||||
const count = Number.parseInt(event.data)
|
const count = Number.parseInt(event.data)
|
||||||
if (!isNaN(count)) {
|
if (!isNaN(count)) {
|
||||||
unreadMessageCount.value = count
|
unreadMessageCount.value = count
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
socket.onerror = () => {
|
|
||||||
// console.error('WebSocket error:', error)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
socket.onclose = () => {
|
socket.onerror = (error) => {
|
||||||
// console.log('WebSocket connection closed')
|
console.error('WebSocket连接错误:', error)
|
||||||
|
}
|
||||||
|
|
||||||
|
socket.onclose = (event) => {
|
||||||
|
console.log('WebSocket连接关闭:', event.code, event.reason)
|
||||||
socket = null
|
socket = null
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to create WebSocket connection:', error)
|
console.error('创建WebSocket连接失败:', error)
|
||||||
}
|
}
|
||||||
|
|
||||||
initTimer = null
|
initTimer = null
|
||||||
|
|
|
@ -57,6 +57,7 @@ declare global {
|
||||||
const useCssVars: typeof import('vue')['useCssVars']
|
const useCssVars: typeof import('vue')['useCssVars']
|
||||||
const useId: typeof import('vue')['useId']
|
const useId: typeof import('vue')['useId']
|
||||||
const useLink: typeof import('vue-router')['useLink']
|
const useLink: typeof import('vue-router')['useLink']
|
||||||
|
const useModel: typeof import('vue')['useModel']
|
||||||
const useRoute: typeof import('vue-router')['useRoute']
|
const useRoute: typeof import('vue-router')['useRoute']
|
||||||
const useRouter: typeof import('vue-router')['useRouter']
|
const useRouter: typeof import('vue-router')['useRouter']
|
||||||
const useSlots: typeof import('vue')['useSlots']
|
const useSlots: typeof import('vue')['useSlots']
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
interface ImportMetaEnv {
|
interface ImportMetaEnv {
|
||||||
readonly VITE_API_PREFIX: string
|
readonly VITE_API_PREFIX: string
|
||||||
readonly VITE_API_BASE_URL: string
|
readonly VITE_API_BASE_URL: string
|
||||||
|
readonly VITE_API_WS_URL: string
|
||||||
readonly VITE_BASE: string
|
readonly VITE_BASE: string
|
||||||
readonly VITE_APP_SETTING: string
|
readonly VITE_APP_SETTING: string
|
||||||
readonly VITE_CLIENT_ID: string
|
readonly VITE_CLIENT_ID: string
|
||||||
|
|
Loading…
Reference in New Issue