|
|
|
@@ -3,7 +3,7 @@
|
|
|
|
|
<el-card>
|
|
|
|
|
<template #header><div class="card-header"><span>公益婚恋咨询管理</span></div></template>
|
|
|
|
|
<el-tabs v-model="activeTab">
|
|
|
|
|
<el-tab-pane label="待分配队列" name="queue">
|
|
|
|
|
<el-tab-pane v-if="canAssign" label="待分配队列" name="queue">
|
|
|
|
|
<el-table :data="pendingQueue" stripe v-loading="loading">
|
|
|
|
|
<el-table-column prop="userId" label="用户ID" width="120" />
|
|
|
|
|
<el-table-column prop="serviceType" label="服务类型" width="150">
|
|
|
|
@@ -36,10 +36,10 @@
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="操作" width="200">
|
|
|
|
|
<template #default="{ row }">
|
|
|
|
|
<el-button v-if="row.status==='assigned'" size="small" @click="scheduleCounseling(row)">排期</el-button>
|
|
|
|
|
<el-button v-if="row.status==='scheduled'" size="small" type="success" @click="startCounseling(row)">开始</el-button>
|
|
|
|
|
<el-button v-if="row.status==='in_progress'" size="small" type="primary" @click="showFollowup(row)">跟进</el-button>
|
|
|
|
|
<el-button v-if="row.status==='in_progress'" size="small" type="warning" @click="completeCounseling(row)">完成</el-button>
|
|
|
|
|
<el-button v-if="canProcess && row.status==='assigned'" size="small" @click="scheduleCounseling(row)">排期</el-button>
|
|
|
|
|
<el-button v-if="canProcess && row.status==='scheduled'" size="small" type="success" @click="startCounseling(row)">开始</el-button>
|
|
|
|
|
<el-button v-if="canCreateNote && row.status==='in_progress'" size="small" type="primary" @click="showFollowup(row)">跟进</el-button>
|
|
|
|
|
<el-button v-if="canProcess && row.status==='in_progress'" size="small" type="warning" @click="completeCounseling(row)">完成</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
</el-table>
|
|
|
|
@@ -78,11 +78,16 @@
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
import { ref, onMounted } from 'vue'
|
|
|
|
|
import { ref, computed, onMounted } from 'vue'
|
|
|
|
|
import { get, post } from '@/api/client'
|
|
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
|
|
import { useAuthStore } from '@/stores/auth'
|
|
|
|
|
|
|
|
|
|
const activeTab = ref('queue')
|
|
|
|
|
const authStore = useAuthStore()
|
|
|
|
|
const canAssign = computed(() => authStore.permissions.includes('counseling.service.assign'))
|
|
|
|
|
const canProcess = computed(() => authStore.permissions.includes('counseling.service.process'))
|
|
|
|
|
const canCreateNote = computed(() => authStore.permissions.includes('counseling.note.create'))
|
|
|
|
|
const activeTab = ref(canAssign.value ? 'queue' : 'assigned')
|
|
|
|
|
const loading = ref(false)
|
|
|
|
|
const pendingQueue = ref<any[]>([])
|
|
|
|
|
const assignedServices = ref<any[]>([])
|
|
|
|
@@ -116,38 +121,38 @@ function formatDateTime(d: string) { return d ? new Date(d).toLocaleString('zh-C
|
|
|
|
|
|
|
|
|
|
async function loadQueue() {
|
|
|
|
|
loading.value = true
|
|
|
|
|
try { const res: any = await get('/operator/counseling/services/queue'); pendingQueue.value = res?.data || [] } finally { loading.value = false }
|
|
|
|
|
try { const res: any = await get('/counseling/services/operator/queue'); pendingQueue.value = res?.data || [] } finally { loading.value = false }
|
|
|
|
|
}
|
|
|
|
|
async function loadAssigned() {
|
|
|
|
|
loading.value = true
|
|
|
|
|
try { const res: any = await get('/operator/counseling/services/operator/assigned'); assignedServices.value = res?.data || [] } finally { loading.value = false }
|
|
|
|
|
try { const res: any = await get('/counseling/services/operator/assigned'); assignedServices.value = res?.data || [] } finally { loading.value = false }
|
|
|
|
|
}
|
|
|
|
|
async function openAssign(row: any) { currentId.value = row.id; assignForm.value.counselorId = ''; assignDialogVisible.value = true }
|
|
|
|
|
async function doAssign() {
|
|
|
|
|
try { await post(`/operator/counseling/services/${currentId.value}/assign`, { counselorId: assignForm.value.counselorId }); ElMessage.success('分配成功'); assignDialogVisible.value = false; loadQueue() }
|
|
|
|
|
try { await post(`/counseling/services/operator/${currentId.value}/assign`, { counselorId: assignForm.value.counselorId }); ElMessage.success('分配成功'); assignDialogVisible.value = false; loadQueue() }
|
|
|
|
|
catch (e: any) { ElMessage.error(e?.response?.data?.message || '操作失败') }
|
|
|
|
|
}
|
|
|
|
|
async function scheduleCounseling(row: any) {
|
|
|
|
|
const now = new Date(); now.setHours(now.getHours() + 2)
|
|
|
|
|
const end = new Date(now); end.setHours(end.getHours() + 1)
|
|
|
|
|
try { await post(`/operator/counseling/services/${row.id}/schedule`, { startAt: now.toISOString(), endAt: end.toISOString() }); ElMessage.success('排期成功'); loadAssigned() }
|
|
|
|
|
try { await post(`/counseling/services/operator/${row.id}/schedule`, { startAt: now.toISOString(), endAt: end.toISOString() }); ElMessage.success('排期成功'); loadAssigned() }
|
|
|
|
|
catch (e: any) { ElMessage.error(e?.response?.data?.message || '操作失败') }
|
|
|
|
|
}
|
|
|
|
|
async function startCounseling(row: any) {
|
|
|
|
|
try { await post(`/operator/counseling/services/${row.id}/start`, {}); ElMessage.success('已开始'); loadAssigned() }
|
|
|
|
|
try { await post(`/counseling/services/operator/${row.id}/start`, {}); ElMessage.success('已开始'); loadAssigned() }
|
|
|
|
|
catch (e: any) { ElMessage.error(e?.response?.data?.message || '操作失败') }
|
|
|
|
|
}
|
|
|
|
|
function showFollowup(row: any) { currentId.value = row.id; followupForm.value = { type: 'phone_call', content: '' }; followupDialogVisible.value = true }
|
|
|
|
|
async function doFollowup() {
|
|
|
|
|
try { await post(`/operator/counseling/services/${currentId.value}/followup`, { followupType: followupForm.value.type, content: followupForm.value.content }); ElMessage.success('跟进记录已保存'); followupDialogVisible.value = false; loadAssigned() }
|
|
|
|
|
}
|
|
|
|
|
try { await post(`/counseling/services/operator/${currentId.value}/followup`, { followupType: followupForm.value.type, content: followupForm.value.content }); ElMessage.success('跟进记录已保存'); followupDialogVisible.value = false; loadAssigned() }
|
|
|
|
|
catch (e: any) { ElMessage.error(e?.response?.data?.message || '操作失败') }
|
|
|
|
|
}
|
|
|
|
|
async function completeCounseling(row: any) {
|
|
|
|
|
try { await post(, {}); ElMessage.success('已完成'); loadAssigned() }
|
|
|
|
|
try { await post(`/counseling/services/operator/${row.id}/complete`, {}); ElMessage.success('已完成'); loadAssigned() }
|
|
|
|
|
catch (e: any) { ElMessage.error(e?.response?.data?.message || '操作失败') }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onMounted(() => { loadQueue(); loadAssigned() })
|
|
|
|
|
onMounted(() => { if (canAssign.value) loadQueue(); loadAssigned() })
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|