205 lines
5.9 KiB
TypeScript
205 lines
5.9 KiB
TypeScript
import { unwrapApiResponse, unwrapNullableApiResponse } from '@/utils/api-response'
|
|
import { mockFlags } from '@/utils/mock-flags'
|
|
import { request } from '@/utils/request'
|
|
import type { ApiResponse, PageResult } from '@/types/common'
|
|
|
|
import type {
|
|
BackendCollection,
|
|
CampusRecord,
|
|
CreateCampusRequest,
|
|
CreateDepartmentRequest,
|
|
DepartmentRecord,
|
|
OrganizationResponseDto,
|
|
UpdateCampusRequest,
|
|
UpdateDepartmentRequest,
|
|
} from './types'
|
|
|
|
const useMockData = mockFlags.organization
|
|
|
|
function getRecords(data: BackendCollection<OrganizationResponseDto>) {
|
|
return Array.isArray(data) ? data : (data.records ?? data.items ?? data.content ?? [])
|
|
}
|
|
|
|
export async function getCampuses(): Promise<CampusRecord[]> {
|
|
if (useMockData) {
|
|
return []
|
|
}
|
|
|
|
const firstPage = await getCampusPage(1, 200)
|
|
const pageCount = Math.ceil(firstPage.total / firstPage.pageSize)
|
|
if (pageCount <= 1) return firstPage.records
|
|
|
|
const remainingPages = await Promise.all(
|
|
Array.from({ length: pageCount - 1 }, (_, index) =>
|
|
getCampusPage(index + 2, firstPage.pageSize),
|
|
),
|
|
)
|
|
return [firstPage, ...remainingPages].flatMap((page) => page.records)
|
|
}
|
|
|
|
async function getCampusPage(page: number, pageSize: number) {
|
|
const response = await request.get<ApiResponse<BackendCollection<OrganizationResponseDto>>>(
|
|
'/v1/campuses',
|
|
{ params: { page, size: pageSize } },
|
|
)
|
|
const data = unwrapApiResponse(response)
|
|
const records = getRecords(data).map(mapCampus)
|
|
return {
|
|
records,
|
|
total: Array.isArray(data) ? records.length : (data.total ?? records.length),
|
|
pageSize: Array.isArray(data) ? pageSize : (data.size ?? pageSize),
|
|
}
|
|
}
|
|
|
|
export function getDepartments(campusId?: string): Promise<DepartmentRecord[]> {
|
|
if (useMockData) {
|
|
return Promise.resolve([])
|
|
}
|
|
|
|
return getDepartmentPage(campusId).then((page) => page.records)
|
|
}
|
|
|
|
async function getDepartmentPage(
|
|
campusId: string | undefined,
|
|
page = 1,
|
|
pageSize = 200,
|
|
): Promise<PageResult<DepartmentRecord>> {
|
|
if (useMockData) {
|
|
return { records: [], total: 0, page, pageSize }
|
|
}
|
|
|
|
const params: Record<string, string | number> = { page, size: pageSize }
|
|
|
|
if (campusId) {
|
|
params.campusId = campusId
|
|
}
|
|
|
|
const response = await request.get<ApiResponse<BackendCollection<OrganizationResponseDto>>>(
|
|
'/v1/departments',
|
|
{ params },
|
|
)
|
|
const data = unwrapApiResponse(response)
|
|
const records = getRecords(data).map(mapDepartment)
|
|
|
|
return {
|
|
records,
|
|
total: Array.isArray(data) ? records.length : (data.total ?? records.length),
|
|
page: Array.isArray(data) ? page : (data.page ?? page),
|
|
pageSize: Array.isArray(data) ? pageSize : (data.size ?? pageSize),
|
|
}
|
|
}
|
|
|
|
export async function getAllDepartments(campusId?: string): Promise<DepartmentRecord[]> {
|
|
const firstPage = await getDepartmentPage(campusId, 1, 200)
|
|
const pageCount = Math.ceil(firstPage.total / firstPage.pageSize)
|
|
|
|
if (pageCount <= 1) {
|
|
return firstPage.records
|
|
}
|
|
|
|
const remainingPages = await Promise.all(
|
|
Array.from({ length: pageCount - 1 }, (_, index) =>
|
|
getDepartmentPage(campusId, index + 2, firstPage.pageSize),
|
|
),
|
|
)
|
|
|
|
return [firstPage, ...remainingPages].flatMap((page) => page.records)
|
|
}
|
|
|
|
function mapCampus(data: OrganizationResponseDto): CampusRecord {
|
|
return {
|
|
id: data.id,
|
|
code: data.code ?? data.id,
|
|
name: data.name ?? data.campusName ?? data.id,
|
|
institutionName: data.institutionName?.trim() || '新华院区',
|
|
address: data.address ?? undefined,
|
|
status: data.status ?? 'ENABLED',
|
|
sortNo: data.sortNo ?? 0,
|
|
}
|
|
}
|
|
|
|
function mapDepartment(data: OrganizationResponseDto): DepartmentRecord {
|
|
return {
|
|
id: data.id,
|
|
campusId: data.campusId ?? '',
|
|
parentId: data.parentId,
|
|
code: data.code ?? data.id,
|
|
name: data.name ?? data.departmentName ?? data.id,
|
|
status: data.status ?? 'ENABLED',
|
|
sortNo: data.sortNo ?? 0,
|
|
}
|
|
}
|
|
|
|
export async function createCampus(payload: CreateCampusRequest): Promise<CampusRecord> {
|
|
if (useMockData) {
|
|
throw new Error('Mock 模式不执行院区写操作')
|
|
}
|
|
|
|
const response = await request.post<ApiResponse<OrganizationResponseDto>>('/v1/campuses', payload)
|
|
return mapCampus(unwrapApiResponse(response))
|
|
}
|
|
|
|
export async function updateCampus(
|
|
id: string,
|
|
payload: UpdateCampusRequest,
|
|
): Promise<CampusRecord> {
|
|
if (useMockData) {
|
|
throw new Error('Mock 模式不执行院区写操作')
|
|
}
|
|
|
|
const response = await request.put<ApiResponse<OrganizationResponseDto>>(
|
|
`/v1/campuses/${encodeURIComponent(id)}`,
|
|
payload,
|
|
)
|
|
return mapCampus(unwrapApiResponse(response))
|
|
}
|
|
|
|
export async function deleteCampus(id: string): Promise<void> {
|
|
if (useMockData) {
|
|
throw new Error('Mock 模式不执行院区写操作')
|
|
}
|
|
|
|
const response = await request.delete<ApiResponse<null>>(`/v1/campuses/${encodeURIComponent(id)}`)
|
|
unwrapNullableApiResponse(response)
|
|
}
|
|
|
|
export async function createDepartment(
|
|
payload: CreateDepartmentRequest,
|
|
): Promise<DepartmentRecord> {
|
|
if (useMockData) {
|
|
throw new Error('Mock 模式不执行科室写操作')
|
|
}
|
|
|
|
const response = await request.post<ApiResponse<OrganizationResponseDto>>(
|
|
'/v1/departments',
|
|
payload,
|
|
)
|
|
return mapDepartment(unwrapApiResponse(response))
|
|
}
|
|
|
|
export async function updateDepartment(
|
|
id: string,
|
|
payload: UpdateDepartmentRequest,
|
|
): Promise<DepartmentRecord> {
|
|
if (useMockData) {
|
|
throw new Error('Mock 模式不执行科室写操作')
|
|
}
|
|
|
|
const response = await request.put<ApiResponse<OrganizationResponseDto>>(
|
|
`/v1/departments/${encodeURIComponent(id)}`,
|
|
payload,
|
|
)
|
|
return mapDepartment(unwrapApiResponse(response))
|
|
}
|
|
|
|
export async function deleteDepartment(id: string): Promise<void> {
|
|
if (useMockData) {
|
|
throw new Error('Mock 模式不执行科室写操作')
|
|
}
|
|
|
|
const response = await request.delete<ApiResponse<null>>(
|
|
`/v1/departments/${encodeURIComponent(id)}`,
|
|
)
|
|
unwrapNullableApiResponse(response)
|
|
}
|