Files
wecom_it_smart_desk/frontend-admin/src/stores/agent.ts
T

158 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// =============================================================================
// 企微IT智能服务台 — 坐席管理状态管理(Pinia Store
// =============================================================================
// 说明:管理后台坐席管理数据,支持列表查询、筛选、增删改
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import type { Agent, AgentFilterStatus, CreateAgentRequest, UpdateAgentRequest } from '@/types'
import { getAgents as apiGetAgents, createAgent as apiCreateAgent, updateAgent as apiUpdateAgent, deleteAgent as apiDeleteAgent } from '@/api/admin'
// --------------------------------------------------------------------------
// Store 定义
// --------------------------------------------------------------------------
export const useAgentStore = defineStore('agent', () => {
// ==========================================================================
// 响应式状态
// ==========================================================================
/** 坐席列表 */
const agents = ref<Agent[]>([])
/** 当前筛选状态 */
const filterStatus = ref<AgentFilterStatus>('all')
/** 是否正在加载 */
const loading = ref<boolean>(false)
/** 总坐席数 */
const totalCount = computed(() => agents.value.length)
// ==========================================================================
// 计算属性
// ==========================================================================
/** 按状态筛选后的坐席列表 */
const filteredAgents = computed(() => {
if (filterStatus.value === 'all') {
return agents.value
}
return agents.value.filter((a) => a.status === filterStatus.value)
})
/** 各状态计数 */
const statusCounts = computed(() => {
const counts: Record<AgentFilterStatus, number> = {
all: agents.value.length,
online: 0,
busy: 0,
offline: 0,
}
for (const a of agents.value) {
if (a.status === 'online') counts.online++
else if (a.status === 'busy') counts.busy++
else counts.offline++
}
return counts
})
// ==========================================================================
// 方法
// ==========================================================================
/**
* 加载坐席列表
* @param status - 可选筛选状态
*/
async function loadAgents(status?: string): Promise<void> {
loading.value = true
try {
const response = await apiGetAgents(status)
agents.value = response.items
} catch (error) {
console.error('加载坐席列表失败:', error)
} finally {
loading.value = false
}
}
/**
* 设置筛选状态并重新加载
* @param status - 筛选状态
*/
function setFilter(status: AgentFilterStatus): void {
filterStatus.value = status
}
/**
* 添加坐席
* @param data - 坐席创建数据
*/
async function addAgent(data: CreateAgentRequest): Promise<boolean> {
try {
await apiCreateAgent(data)
// 重新加载列表
await loadAgents()
return true
} catch (error) {
console.error('添加坐席失败:', error)
return false
}
}
/**
* 编辑坐席
* @param id - 坐席ID
* @param data - 坐席更新数据
*/
async function editAgent(id: string, data: UpdateAgentRequest): Promise<boolean> {
try {
await apiUpdateAgent(id, data)
// 重新加载列表
await loadAgents()
return true
} catch (error) {
console.error('编辑坐席失败:', error)
return false
}
}
/**
* 移除坐席
* @param id - 坐席ID
*/
async function removeAgent(id: string): Promise<boolean> {
try {
await apiDeleteAgent(id)
// 重新加载列表
await loadAgents()
return true
} catch (error) {
console.error('移除坐席失败:', error)
return false
}
}
// ==========================================================================
// 返回
// ==========================================================================
return {
// 状态
agents,
filterStatus,
loading,
// 计算属性
filteredAgents,
statusCounts,
totalCount,
// 方法
loadAgents,
setFilter,
addAgent,
editAgent,
removeAgent,
}
})