77140864ef
在工单工作台对话页为当前工单用户增加“查看用户” 和“用户订单”入口,支持直接跳转到用户管理与订单管理 用户管理页新增 `user_id/user_email` 路由作用域, 进入后按用户 ID 精准筛选,并支持在重置筛选时清除 该作用域 同步更新 admin-frontend 模块文档、变更归档与测试环境 compose 配置
174 lines
4.8 KiB
TypeScript
174 lines
4.8 KiB
TypeScript
import { computed, ref } from 'vue'
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
import { resetUserTraffic } from '@/api/admin'
|
|
import type { AdminUserFilter, AdminUserListItem } from '@/types/api'
|
|
|
|
export function useUserScopedActions() {
|
|
const route = useRoute()
|
|
const router = useRouter()
|
|
|
|
const assignOrderVisible = ref(false)
|
|
const assignOrderEmail = ref('')
|
|
const trafficLogVisible = ref(false)
|
|
const trafficLogUserId = ref<number | null>(null)
|
|
const trafficLogUserEmail = ref('')
|
|
const resettingTrafficId = ref<number | null>(null)
|
|
|
|
const scopedUserId = computed(() => {
|
|
const raw = route.query.user_id
|
|
const value = Array.isArray(raw) ? raw[0] : raw
|
|
const numeric = Number(value)
|
|
return Number.isFinite(numeric) && numeric > 0 ? numeric : null
|
|
})
|
|
|
|
const scopedUserEmail = computed(() => {
|
|
const raw = route.query.user_email
|
|
const value = Array.isArray(raw) ? raw[0] : raw
|
|
return typeof value === 'string' ? value : ''
|
|
})
|
|
|
|
const scopedInviteUserId = computed(() => {
|
|
const raw = route.query.invite_user_id
|
|
const value = Array.isArray(raw) ? raw[0] : raw
|
|
const numeric = Number(value)
|
|
return Number.isFinite(numeric) && numeric > 0 ? numeric : null
|
|
})
|
|
|
|
const scopedInviteUserEmail = computed(() => {
|
|
const raw = route.query.invite_user_email
|
|
const value = Array.isArray(raw) ? raw[0] : raw
|
|
return typeof value === 'string' ? value : ''
|
|
})
|
|
|
|
const scopedInviteFilters = computed<AdminUserFilter[]>(() => (
|
|
scopedInviteUserId.value
|
|
? [{ id: 'invite_user_id', value: `eq:${scopedInviteUserId.value}` }]
|
|
: []
|
|
))
|
|
|
|
const scopedUserFilters = computed<AdminUserFilter[]>(() => (
|
|
scopedUserId.value
|
|
? [{ id: 'id', value: `eq:${scopedUserId.value}` }]
|
|
: []
|
|
))
|
|
|
|
const scopedUserSummaries = computed(() => {
|
|
if (!scopedUserId.value) {
|
|
return []
|
|
}
|
|
|
|
const label = scopedUserEmail.value || `用户 #${scopedUserId.value}`
|
|
return [`用户:${label}`]
|
|
})
|
|
|
|
const scopedInviteSummaries = computed(() => {
|
|
if (!scopedInviteUserId.value) {
|
|
return []
|
|
}
|
|
|
|
const label = scopedInviteUserEmail.value || `用户 #${scopedInviteUserId.value}`
|
|
return [`邀请人:${label}`]
|
|
})
|
|
|
|
function clearScopedUserQuery() {
|
|
if (!scopedUserId.value && !scopedUserEmail.value) {
|
|
return Promise.resolve()
|
|
}
|
|
|
|
const nextQuery = { ...route.query }
|
|
delete nextQuery.user_id
|
|
delete nextQuery.user_email
|
|
return router.replace({ name: 'Users', query: nextQuery })
|
|
}
|
|
|
|
function clearScopedInviteQuery() {
|
|
if (!scopedInviteUserId.value && !scopedInviteUserEmail.value) {
|
|
return Promise.resolve()
|
|
}
|
|
|
|
const nextQuery = { ...route.query }
|
|
delete nextQuery.invite_user_id
|
|
delete nextQuery.invite_user_email
|
|
return router.replace({ name: 'Users', query: nextQuery })
|
|
}
|
|
|
|
function openAssignOrder(user: Pick<AdminUserListItem, 'email'>) {
|
|
assignOrderEmail.value = user.email
|
|
assignOrderVisible.value = true
|
|
}
|
|
|
|
function handleAssignOrderSuccess() {
|
|
assignOrderVisible.value = false
|
|
}
|
|
|
|
function openTrafficLogs(user: Pick<AdminUserListItem, 'id' | 'email'>) {
|
|
trafficLogUserId.value = user.id
|
|
trafficLogUserEmail.value = user.email
|
|
trafficLogVisible.value = true
|
|
}
|
|
|
|
function viewUserOrders(user: Pick<AdminUserListItem, 'id' | 'email'>) {
|
|
return router.push({
|
|
name: 'SubscriptionOrders',
|
|
query: {
|
|
user_id: String(user.id),
|
|
user_email: user.email,
|
|
},
|
|
})
|
|
}
|
|
|
|
function viewUserInvites(
|
|
user: Pick<AdminUserListItem, 'id' | 'email'>,
|
|
resetLocalFilters: () => void,
|
|
) {
|
|
resetLocalFilters()
|
|
return router.push({
|
|
name: 'Users',
|
|
query: {
|
|
invite_user_id: String(user.id),
|
|
invite_user_email: user.email,
|
|
},
|
|
})
|
|
}
|
|
|
|
async function performResetTraffic(user: Pick<AdminUserListItem, 'id' | 'email'>) {
|
|
await ElMessageBox.confirm(`确认重置用户 ${user.email} 的已用流量吗?该操作会清空当前上行和下行统计。`, '重置流量', {
|
|
type: 'warning',
|
|
})
|
|
|
|
resettingTrafficId.value = user.id
|
|
|
|
try {
|
|
await resetUserTraffic(user.id, '用户管理更多操作手动重置')
|
|
ElMessage.success('用户流量已重置')
|
|
} finally {
|
|
resettingTrafficId.value = null
|
|
}
|
|
}
|
|
|
|
return {
|
|
route,
|
|
assignOrderVisible,
|
|
assignOrderEmail,
|
|
trafficLogVisible,
|
|
trafficLogUserId,
|
|
trafficLogUserEmail,
|
|
resettingTrafficId,
|
|
scopedUserId,
|
|
scopedUserFilters,
|
|
scopedUserSummaries,
|
|
scopedInviteUserId,
|
|
scopedInviteFilters,
|
|
scopedInviteSummaries,
|
|
clearScopedUserQuery,
|
|
clearScopedInviteQuery,
|
|
openAssignOrder,
|
|
handleAssignOrderSuccess,
|
|
openTrafficLogs,
|
|
viewUserOrders,
|
|
viewUserInvites,
|
|
performResetTraffic,
|
|
}
|
|
}
|