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) { return Array.isArray(data) ? data : (data.records ?? data.items ?? data.content ?? []) } export async function getCampuses(): Promise { 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>>( '/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 { if (useMockData) { return Promise.resolve([]) } return getDepartmentPage(campusId).then((page) => page.records) } async function getDepartmentPage( campusId: string | undefined, page = 1, pageSize = 200, ): Promise> { if (useMockData) { return { records: [], total: 0, page, pageSize } } const params: Record = { page, size: pageSize } if (campusId) { params.campusId = campusId } const response = await request.get>>( '/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 { 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 { if (useMockData) { throw new Error('Mock 模式不执行院区写操作') } const response = await request.post>('/v1/campuses', payload) return mapCampus(unwrapApiResponse(response)) } export async function updateCampus( id: string, payload: UpdateCampusRequest, ): Promise { if (useMockData) { throw new Error('Mock 模式不执行院区写操作') } const response = await request.put>( `/v1/campuses/${encodeURIComponent(id)}`, payload, ) return mapCampus(unwrapApiResponse(response)) } export async function deleteCampus(id: string): Promise { if (useMockData) { throw new Error('Mock 模式不执行院区写操作') } const response = await request.delete>(`/v1/campuses/${encodeURIComponent(id)}`) unwrapNullableApiResponse(response) } export async function createDepartment( payload: CreateDepartmentRequest, ): Promise { if (useMockData) { throw new Error('Mock 模式不执行科室写操作') } const response = await request.post>( '/v1/departments', payload, ) return mapDepartment(unwrapApiResponse(response)) } export async function updateDepartment( id: string, payload: UpdateDepartmentRequest, ): Promise { if (useMockData) { throw new Error('Mock 模式不执行科室写操作') } const response = await request.put>( `/v1/departments/${encodeURIComponent(id)}`, payload, ) return mapDepartment(unwrapApiResponse(response)) } export async function deleteDepartment(id: string): Promise { if (useMockData) { throw new Error('Mock 模式不执行科室写操作') } const response = await request.delete>( `/v1/departments/${encodeURIComponent(id)}`, ) unwrapNullableApiResponse(response) }