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
+37 -48
View File
@@ -6,8 +6,7 @@ import * as XLSX from 'xlsx'
import { Calculator, AlertCircle, Info, Check, Upload, Layers, Settings as SettingsIcon, Archive, Plus, Trash2, AlertTriangle, Download, FileText, X, ChevronLeft, Wallet, LayoutTemplate, Clock, Receipt, Users, TrendingDown, TrendingUp, BadgeCheck } from 'lucide-react'
import { Stepper, type Step } from '../components/ui/Stepper'
import { InlineAlert } from '../components/ui/InlineAlert'
import api from '../lib/api'
import { rosterApi } from '../lib/api-services'
import { payrollApi, rosterApi, employeeApi } from '../lib/api-services'
import { useAuthStore } from '../store/authStore'
import Card from '../components/ui/Card'
import Button from '../components/ui/Button'
@@ -162,8 +161,7 @@ function BatchManager() {
const { data: checkResult } = useQuery<any>({
queryKey: ['batch-check', month],
queryFn: async () => {
const res = await api.get('/payroll2/batches/check', { params: { month } }) as any
return res.data
return await payrollApi.batchCheck(month)
},
})
@@ -176,22 +174,20 @@ function BatchManager() {
if (monthTo) params.monthTo = monthTo
if (filterStatus) params.status = filterStatus
if (filterType) params.type = filterType
const res = await api.get('/payroll2/batches', { params }) as any
return res.data
return await payrollApi.batches(params)
},
})
const { data: archivedBatches } = useQuery<any[]>({
queryKey: ['archived-batches'],
queryFn: async () => {
const res = await api.get('/payroll2/batches/archived/list') as any
return res.data
return await payrollApi.archivedBatches()
},
enabled: createMode === 'copy_batch',
})
const createMutation = useMutation({
mutationFn: (data: any) => api.post('/payroll2/batches', data),
mutationFn: (data: any) => payrollApi.createBatch(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batches'] })
queryClient.invalidateQueries({ queryKey: ['batch-check'] })
@@ -202,7 +198,7 @@ function BatchManager() {
})
const deleteBatchMutation = useMutation({
mutationFn: (batchId: string) => api.delete(`/payroll2/batches/${batchId}`),
mutationFn: (batchId: string) => payrollApi.removeBatch(batchId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batches'] })
queryClient.invalidateQueries({ queryKey: ['batch-check'] })
@@ -213,7 +209,7 @@ function BatchManager() {
const renameBatchMutation = useMutation({
mutationFn: ({ batchId, name }: { batchId: string; name: string }) =>
api.put(`/payroll2/batches/${batchId}/name`, { name }),
payrollApi.renameBatch(batchId, name),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batches'] })
toast.success('批次名称已更新')
@@ -222,7 +218,7 @@ function BatchManager() {
})
const unarchiveBatchMutation = useMutation({
mutationFn: (batchId: string) => api.post(`/payroll2/batches/${batchId}/unarchive`),
mutationFn: (batchId: string) => payrollApi.unarchiveBatch(batchId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batches'] })
queryClient.invalidateQueries({ queryKey: ['batch-check'] })
@@ -503,14 +499,13 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
const { data: batch, isLoading } = useQuery<any>({
queryKey: ['batch-detail', batchId],
queryFn: async () => {
const res = await api.get(`/payroll2/batches/${batchId}`) as any
return res.data
return await payrollApi.batchDetail(batchId)
},
})
const updateEntryMutation = useMutation({
mutationFn: ({ employeeId, data }: { employeeId: string; data: any }) =>
api.put(`/payroll2/batches/${batchId}/entries/${employeeId}`, data),
payrollApi.updateBatchEntry(batchId, employeeId, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batch-detail'] })
queryClient.invalidateQueries({ queryKey: ['batches'] })
@@ -518,7 +513,7 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
})
const removeEmployeeMutation = useMutation({
mutationFn: (employeeId: string) => api.delete(`/payroll2/batches/${batchId}/employees/${employeeId}`),
mutationFn: (employeeId: string) => payrollApi.removeBatchEmployee(batchId, employeeId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batch-detail'] })
queryClient.invalidateQueries({ queryKey: ['batches'] })
@@ -526,7 +521,7 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
})
const archiveMutation = useMutation({
mutationFn: () => api.post(`/payroll2/batches/${batchId}/archive`),
mutationFn: () => payrollApi.archiveBatch(batchId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batch-detail'] })
queryClient.invalidateQueries({ queryKey: ['batches'] })
@@ -537,7 +532,7 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
})
const unarchiveMutation = useMutation({
mutationFn: () => api.post(`/payroll2/batches/${batchId}/unarchive`),
mutationFn: () => payrollApi.unarchiveBatch(batchId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batch-detail'] })
queryClient.invalidateQueries({ queryKey: ['batches'] })
@@ -549,7 +544,7 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
})
const publishPayslipMutation = useMutation({
mutationFn: () => api.post(`/payroll2/batches/${batchId}/publish`),
mutationFn: () => payrollApi.publishPayslip(batchId),
onSuccess: (res: any) => {
toast.success(`已发布 ${res.data?.published || 0} 条工资条`)
queryClient.invalidateQueries({ queryKey: ['batch-detail'] })
@@ -560,7 +555,7 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
const [showScheduleModal, setShowScheduleModal] = useState(false)
const [scheduleDate, setScheduleDate] = useState('')
const schedulePayslipMutation = useMutation({
mutationFn: () => api.post(`/payroll2/batches/${batchId}/schedule`, { scheduledAt: scheduleDate }),
mutationFn: () => payrollApi.schedulePayslip(batchId, scheduleDate),
onSuccess: (res: any) => {
toast.success(`已设定定时发送 ${res.data?.scheduled || 0} 条工资条`)
setShowScheduleModal(false)
@@ -570,7 +565,7 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
})
const importOvertimeMutation = useMutation({
mutationFn: () => api.post(`/payroll/overtime/import-to-batch/${batchId}`),
mutationFn: () => payrollApi.importOvertimeToBatch(batchId),
onSuccess: (res: any) => {
queryClient.invalidateQueries({ queryKey: ['batch-detail'] })
queryClient.invalidateQueries({ queryKey: ['batches'] })
@@ -615,7 +610,7 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
})
const deleteBatchMutation = useMutation({
mutationFn: () => api.delete(`/payroll2/batches/${batchId}`),
mutationFn: () => payrollApi.removeBatch(batchId),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batches'] })
queryClient.invalidateQueries({ queryKey: ['batch-check'] })
@@ -845,8 +840,8 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
size="sm"
onClick={async () => {
try {
const res = await api.get(`/payroll/batch/${batchId}/summary`) as any
const { departments, grandTotal } = res.data
const res = await payrollApi.batchSummary(batchId) as any
const { departments, grandTotal } = res
const headers = ['部门', '人数', '应发合计', '实发合计', '个人社保', '单位社保', '个人公积金', '单位公积金', '个税合计']
const rows = departments.map((d: any) => [
d.department, d.headcount, d.totalPay.toFixed(2), d.totalNetPay.toFixed(2),
@@ -874,8 +869,8 @@ function BatchDetail({ batchId, onBack }: { batchId: string; onBack: () => void
size="sm"
onClick={async () => {
try {
const res = await api.get(`/payroll/batch/${batchId}/detail`) as any
const { details } = res.data
const res = await payrollApi.batchDetailExport(batchId) as any
const { details } = res
const headers = ['姓名', '部门', '基本工资', '岗位工资', '绩效工资', '工龄工资', '加班费', '交通补贴', '餐补', '住房补贴', '通讯补贴', '其他津贴', '奖金', '扣款', '其他扣款', '个人社保', '个人公积金', '个税', '应发合计', '实发工资']
const rows = details.map((d: any) => [
d.name, d.department,
@@ -1161,13 +1156,12 @@ function AddEmployeeToBatch({ batchId, onClose }: { batchId: string; onClose: ()
const { data: employees } = useQuery<any>({
queryKey: ['employees-for-batch'],
queryFn: async () => {
const res = await api.get('/employees', { params: { pageSize: 100 } }) as any
return res.data
return await employeeApi.paged({ pageSize: 100 })
},
})
const addMutation = useMutation({
mutationFn: (employeeIds: string[]) => api.post(`/payroll2/batches/${batchId}/employees`, { employeeIds }),
mutationFn: (employeeIds: string[]) => payrollApi.addBatchEmployees(batchId, employeeIds),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['batch-detail'] })
queryClient.invalidateQueries({ queryKey: ['batches'] })
@@ -1225,13 +1219,12 @@ function TemplateManager() {
const { data: items, isLoading } = useQuery<any[]>({
queryKey: ['payslip-template'],
queryFn: async () => {
const res = await api.get('/payroll2/template') as any
return res.data
return await payrollApi.template()
},
})
const deleteMutation = useMutation({
mutationFn: (id: string) => api.delete(`/payroll2/template/${id}`),
mutationFn: (id: string) => payrollApi.removeTemplateItem(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['payslip-template'] })
toast.success('已删除')
@@ -1240,7 +1233,7 @@ function TemplateManager() {
})
const createMutation = useMutation({
mutationFn: (data: any) => api.post('/payroll2/template', data),
mutationFn: (data: any) => payrollApi.createTemplateItem(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['payslip-template'] })
setShowForm(false)
@@ -1250,7 +1243,7 @@ function TemplateManager() {
})
const updateMutation = useMutation({
mutationFn: ({ id, data }: { id: string; data: any }) => api.put(`/payroll2/template/${id}`, data),
mutationFn: ({ id, data }: { id: string; data: any }) => payrollApi.updateTemplateItem(id, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['payslip-template'] })
setShowForm(false)
@@ -1491,13 +1484,12 @@ function OvertimeCalculator() {
const { data: config, isLoading: configLoading } = useQuery<any>({
queryKey: ['overtime-config'],
queryFn: async () => {
const res = await api.get('/payroll/overtime/config') as any
return res.data
return await payrollApi.overtimeConfig()
},
})
const saveConfigMutation = useMutation({
mutationFn: (data: any) => api.post('/payroll/overtime/config', data),
mutationFn: (data: any) => payrollApi.saveOvertimeConfig(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['overtime-config'] })
},
@@ -1507,8 +1499,7 @@ function OvertimeCalculator() {
const { data: employees } = useQuery<{ items: { id: string; name: string; department: string }[] }>({
queryKey: ['employees-for-overtime'],
queryFn: async () => {
const res = await api.get('/employees', { params: { pageSize: 100 } }) as any
return res.data
return await employeeApi.paged({ pageSize: 100 })
},
})
@@ -1516,14 +1507,13 @@ function OvertimeCalculator() {
const { data: overtimeRecords, refetch } = useQuery<any[]>({
queryKey: ['overtime-records', month],
queryFn: async () => {
const res = await api.get('/payroll/overtime', { params: { month } }) as any
return res.data
return await payrollApi.overtimeRecords({ month })
},
enabled: step === 3,
})
const batchImportMutation = useMutation({
mutationFn: (data: any[]) => api.post('/payroll/overtime/batch', data),
mutationFn: (data: any[]) => payrollApi.batchImportOvertime(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['overtime-records'] })
setPreviewData([])
@@ -1534,7 +1524,7 @@ function OvertimeCalculator() {
// 更新单条加班记录
const updateOvertimeMutation = useMutation({
mutationFn: ({ id, data }: { id: string; data: any }) =>
api.put(`/payroll/overtime/${id}`, data),
payrollApi.updateOvertime(id, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['overtime-records'] })
setEditingId(null)
@@ -1939,18 +1929,17 @@ function PayslipManager() {
const { data: payslips, isLoading } = useQuery<any[]>({
queryKey: ['payslips', month],
queryFn: async () => {
const res = await api.get('/payroll/payslip', { params: { month } }) as any
return res.data
return await payrollApi.payslips({ month })
},
})
const deleteMutation = useMutation({
mutationFn: (id: string) => api.delete(`/payroll/payslip/${id}`),
mutationFn: (id: string) => payrollApi.removePayslip(id),
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['payslips'] }),
})
const generateFromBatchMutation = useMutation({
mutationFn: (data: any) => api.post('/payroll2/payslips/generate', data),
mutationFn: (data: any) => payrollApi.generatePayslips(data?.month || data),
onSuccess: (res: any) => {
queryClient.invalidateQueries({ queryKey: ['payslips'] })
queryClient.invalidateQueries({ queryKey: ['dashboard'] })
@@ -1960,7 +1949,7 @@ function PayslipManager() {
})
const taxPreviewMutation = useMutation({
mutationFn: (data: any) => api.post('/payroll/tax-preview', data),
mutationFn: (data: any) => payrollApi.taxPreview(data),
onSuccess: (res: any) => {
setTaxResult(res.data)
setShowTaxPreview(true)