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

164 lines
4.5 KiB
TypeScript

import { unwrapApiResponse, unwrapNullableApiResponse } from '@/utils/api-response'
import { request } from '@/utils/request'
import type { ApiResponse } from '@/types/common'
import type {
BackendCollection,
CampusRecord,
CreateCampusRequest,
CreateDepartmentRequest,
DepartmentRecord,
OrganizationResponseDto,
UpdateCampusRequest,
UpdateDepartmentRequest,
} from './types'
const useMockData = import.meta.env.VITE_USE_MOCK !== 'false'
function getRecords(data: BackendCollection<OrganizationResponseDto>) {
return Array.isArray(data) ? data : (data.records ?? data.items ?? data.content ?? [])
}
export function getCampuses(): Promise<CampusRecord[]> {
if (useMockData) {
return Promise.resolve([])
}
return request
.get<ApiResponse<BackendCollection<OrganizationResponseDto>>>('/v1/campuses', {
params: { page: 1, size: 200 },
})
.then(unwrapApiResponse)
.then((data) =>
getRecords(data).map((item) => ({
id: item.id,
code: item.code ?? item.id,
name: item.name ?? item.campusName ?? item.id,
address: item.address ?? undefined,
status: item.status ?? 'ENABLED',
sortNo: item.sortNo ?? 0,
})),
)
}
export function getDepartments(campusId?: string): Promise<DepartmentRecord[]> {
if (useMockData) {
return Promise.resolve([])
}
const params = campusId ? { page: 1, size: 200, campusId } : { page: 1, size: 200 }
return request
.get<ApiResponse<BackendCollection<OrganizationResponseDto>>>('/v1/departments', {
params,
})
.then(unwrapApiResponse)
.then((data) =>
getRecords(data).map((item) => ({
id: item.id,
campusId: item.campusId ?? '',
parentId: item.parentId,
code: item.code ?? item.id,
name: item.name ?? item.departmentName ?? item.id,
status: item.status ?? 'ENABLED',
sortNo: item.sortNo ?? 0,
})),
)
}
function mapCampus(data: OrganizationResponseDto): CampusRecord {
return {
id: data.id,
code: data.code ?? data.id,
name: data.name ?? data.campusName ?? data.id,
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)
}