refactor: 全量迁移前端 API 调用到统一 api-services 服务层

- 新建 api-services-raw.ts 导出原始 axios 方法供特殊端点使用
- 完成 api-services.ts 全领域覆盖(auth/employee/roster/dashboard/attendance/payroll/socialInsurance/commercialInsurance/termination/policies/evidence/audit/calendar/companyFiles/notifications/settings/ai/platform/portal/survey/search)
- 迁移所有 47+ 页面文件:pages/、pages/roster/、pages/portal/、pages/platform/、pages/auth/、pages/dashboard/、pages/compliance/
- 移除所有直接 import api from '../../lib/api' 引用
- 修复 Termination.tsx / WorkProcess.tsx 中 string|null 类型错误
- 修复 SocialInsurance.tsx 中 api-services-raw delete 导入名
- 修复 PlatformLogin.tsx 变量遮蔽问题
- tsc --noEmit 零错误,vite build 成功
This commit is contained in:
selfrelease
2026-08-01 16:13:19 +08:00
parent fb924dea98
commit 16f22e6622
64 changed files with 1197 additions and 597 deletions
+18 -23
View File
@@ -2,7 +2,8 @@ import { useState, useEffect } from 'react'
import { toast } from 'sonner'
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { Building2, Users, CreditCard, Plus, Bell, Download, Upload, FileSpreadsheet, Clock, CheckCircle, AlertCircle, ClipboardList } from 'lucide-react'
import api from '../lib/api'
import { settingsApi, notificationsApi } from '../lib/api-services'
import { post as apiPost, patch as apiPatch } from '../lib/api-services-raw'
import { useAuthStore } from '../store/authStore'
import Card from '../components/ui/Card'
import Button from '../components/ui/Button'
@@ -17,21 +18,19 @@ export default function Settings() {
const { data: orgData } = useQuery<any>({
queryKey: ['org-settings'],
queryFn: async () => {
const res = await api.get('/settings/org') as any
return res.data
return await settingsApi.org()
},
})
const { data: usersData } = useQuery<any>({
queryKey: ['users'],
queryFn: async () => {
const res = await api.get('/settings/users') as any
return res.data
return await settingsApi.users()
},
})
const updateOrgMutation = useMutation({
mutationFn: (data: any) => api.put('/settings/org', data),
mutationFn: (data: any) => settingsApi.updateOrg(data),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['org-settings'] }),
})
@@ -153,14 +152,13 @@ function RetirementSection({ enabled, onToggle }: { enabled: boolean; onToggle:
const { data: policyData, isLoading } = useQuery<any>({
queryKey: ['retirement-policy'],
queryFn: async () => {
const res = await api.get('/settings/retirement-policy') as any
return res.data
return await settingsApi.retirementPolicy()
},
enabled,
})
const confirmMutation = useMutation({
mutationFn: (id: string) => api.post(`/settings/retirement-policy/${id}/confirm`),
mutationFn: (id: string) => apiPost(`/settings/retirement-policy/${id}/confirm`),
onSuccess: () => {
toast.success('退休政策已确认生效')
setConfirming(false)
@@ -272,12 +270,12 @@ function UserSettings({ usersData }: { usersData: any }) {
const users = usersData || []
const updateMutation = useMutation({
mutationFn: ({ id, data }: { id: string; data: any }) => api.put(`/settings/users/${id}`, data),
mutationFn: ({ id, data }: { id: string; data: any }) => settingsApi.updateUser(id, data),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['users'] }),
})
const toggleDisableMutation = useMutation({
mutationFn: (id: string) => api.patch(`/settings/users/${id}/toggle-disable`),
mutationFn: (id: string) => settingsApi.toggleDisable(id),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['users'] }),
})
@@ -407,7 +405,7 @@ function AddUserModal({ open, onClose }: { open: boolean; onClose: () => void })
setLoading(true)
setError('')
try {
await api.post('/settings/users', form)
await settingsApi.addUser(form)
onClose()
} catch (err: any) {
setError(err.response?.data?.error?.message || '添加失败')
@@ -658,13 +656,12 @@ function PlanSettings({ orgData }: { orgData: any }) {
const { data: usageData } = useQuery<any>({
queryKey: ['usage'],
queryFn: async () => {
const res = await api.get('/settings/usage') as any
return res.data
return await settingsApi.usage()
},
})
const planMutation = useMutation({
mutationFn: (newPlan: string) => api.put('/settings/plan', { plan: newPlan }),
mutationFn: (newPlan: string) => settingsApi.updatePlan(newPlan),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['org'] })
queryClient.invalidateQueries({ queryKey: ['usage'] })
@@ -744,16 +741,14 @@ function NotificationSettings() {
const { data: setting } = useQuery<any>({
queryKey: ['notification-settings'],
queryFn: async () => {
const res = await api.get('/notifications/settings') as any
return res.data
return await notificationsApi.settings()
},
})
const { data: logsData } = useQuery<any>({
queryKey: ['notification-logs'],
queryFn: async () => {
const res = await api.get('/notifications/logs', { params: { pageSize: 10 } }) as any
return res.data
return await notificationsApi.logs({ pageSize: 10 })
},
})
@@ -762,12 +757,12 @@ function NotificationSettings() {
}, [setting])
const updateMutation = useMutation({
mutationFn: (data: any) => api.put('/notifications/settings', data),
mutationFn: (data: any) => notificationsApi.updateSettings(data),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['notification-settings'] }),
})
const checkMutation = useMutation({
mutationFn: () => api.post('/notifications/check-contracts') as any,
mutationFn: () => apiPost('/notifications/check-contracts') as any,
onSuccess: (res: any) => {
setCheckResult(`检查完成:发现 ${res.data.checked} 个即将到期的合同,已发送 ${res.data.notified} 条通知`)
queryClient.invalidateQueries({ queryKey: ['notification-logs'] })
@@ -775,14 +770,14 @@ function NotificationSettings() {
})
const testWechatMutation = useMutation({
mutationFn: () => api.post('/notifications/test', { channel: 'wechat' }) as any,
mutationFn: () => apiPost('/notifications/test', { channel: 'wechat' }) as any,
onSuccess: (res: any) => {
toast.success(res.success ? res.data.message : (res.error?.message || '测试失败'))
},
})
const testEmailMutation = useMutation({
mutationFn: () => api.post('/notifications/test', { channel: 'email' }) as any,
mutationFn: () => apiPost('/notifications/test', { channel: 'email' }) as any,
onSuccess: (res: any) => {
toast.success(res.success ? res.data.message : (res.error?.message || '测试失败'))
},