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

158 lines
4.3 KiB
TypeScript
Raw Normal View History

// =============================================================================
// 企微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,
}
})