2026-06-14 16:49:18 +08:00
|
|
|
|
// =============================================================================
|
|
|
|
|
|
// 企微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)
|
2026-07-17 23:08:59 +08:00
|
|
|
|
agents.value = response.items
|
2026-06-14 16:49:18 +08:00
|
|
|
|
} 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,
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|