Files
xh-medical-sign-web/clinical-web/src/api/management/organization.ts
T

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)
}