import type { TransformBlob, TransformBody, TransformData, TransformList, TransformRecord, } from '#/api'; import { downloadFileFromBlob } from '@vben/utils'; import { http } from '#/api'; import { fromDepartment, fromDoctor, toDepartment, toDoctor, } from '#/api/model'; export namespace BusinessModel { export interface Department extends TransformRecord { id: string; name: string; code?: string; description?: string; organization?: { name: string }; parent?: Department; children?: Department[]; registerLink?: string; } export interface Doctor extends TransformRecord { id: string; name: string; code?: string; avatar?: string; description?: string; worker?: string; department?: Department; titleOfClinical?: string; titleOfTeach?: string; titleOf?: string; adeptAt?: string; registerLink?: string; } } export function listDepartmentsMethod( page = 1, size = 20, query?: Partial, ) { return http.post, TransformList>( `/basis/department/listPage`, toDepartment(query), { params: { page, limit: size }, transform({ items, ...data }) { return { ...data, items: items.map((item) => fromDepartment(item)) }; }, }, ); } export function treeDepartmentsMethod() { return http.post( `/basis/department/list`, void 0, { transform(data) { return data.map((item) => fromDepartment(item)); }, }, ); } export function editDepartmentMethod(data: Partial) { return http.post( data?.id ? `/basis/department/update` : `/basis/department/add`, toDepartment(data), ); } export function deleteDepartmentMethod( data: Pick, ) { return deleteDepartmentsMethod([data]); } export function deleteDepartmentsMethod( params: Pick[], ) { return http.post(`/basis/department/batchDelete`, void 0, { params: { ids: params.map((item) => item.id).join(',') }, }); } export function downloadDepartmentTemplateMethod(filename = '科室模板.xlsx') { return http.get(`/basis/department/downExcel`, { params: { fileName: filename }, transform(data: TransformBlob) { downloadFileFromBlob(data); return data; }, }); } export function uploadDepartmentFileMethod(file: File) { const data = new FormData(); data.append('file', file); return http.post(`/basis/department/importExcel`, data, { meta: { notParseResponseBody: true }, transform(data: TransformBody) { if (data.code === 0) { const [_, count = ''] = data.message?.match(/入库成功(\d+)条/) ?? []; if (+count > 0) return { count: +count, message: data.message ?? `导入成功` }; } // eslint-disable-next-line no-throw-literal throw { message: data.message ?? `导入失败` }; }, }); } export function listDoctorsMethod( page = 1, size = 20, query?: Partial, ) { return http.post, TransformList>( `/basis/doctor/listPage`, toDoctor(query), { params: { page, limit: size }, transform({ items, ...data }) { return { ...data, items: items.map((item) => fromDoctor(item)) }; }, }, ); } export function editDoctorMethod(data: Partial) { return http.post( data?.id ? `/basis/doctor/update` : `/basis/doctor/add`, toDoctor(data), ); } export function deleteDoctorMethod(data: Pick) { return deleteDoctorsMethod([data]); } export function deleteDoctorsMethod( params: Pick[], ) { return http.post(`/basis/doctor/batchDelete`, void 0, { params: { ids: params.map((item) => item.id).join(',') }, }); } export function downloadDoctorTemplateMethod(filename = '医生模板.xlsx') { return http.get(`/basis/doctor/downExcel`, { params: { fileName: filename }, transform(data: TransformBlob) { downloadFileFromBlob(data); return data; }, }); } export function uploadDoctorFileMethod(file: File) { const data = new FormData(); data.append('file', file); return http.post(`/basis/doctor/importExcel`, data, { meta: { notParseResponseBody: true }, transform(data: TransformBody) { if (data.code === 0) { const [_, count = ''] = data.message?.match(/入库成功(\d+)条/) ?? []; if (+count > 0) return { count: +count, message: data.message ?? `导入成功` }; } // eslint-disable-next-line no-throw-literal throw { message: data.message ?? `导入失败` }; }, }); }