business.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import type {
  2. TransformBlob,
  3. TransformBody,
  4. TransformData,
  5. TransformList,
  6. TransformRecord,
  7. } from '#/api';
  8. import { downloadFileFromBlob } from '@vben/utils';
  9. import { http } from '#/api';
  10. import {
  11. fromDepartment,
  12. fromDoctor,
  13. toDepartment,
  14. toDoctor,
  15. } from '#/api/model';
  16. export namespace BusinessModel {
  17. export interface Department extends TransformRecord {
  18. id: string;
  19. name: string;
  20. code?: string;
  21. description?: string;
  22. organization?: { name: string };
  23. parent?: Department;
  24. children?: Department[];
  25. registerLink?: string;
  26. }
  27. export interface Doctor extends TransformRecord {
  28. id: string;
  29. name: string;
  30. code?: string;
  31. avatar?: string;
  32. description?: string;
  33. worker?: string;
  34. department?: Department;
  35. titleOfClinical?: string;
  36. titleOfTeach?: string;
  37. titleOf?: string;
  38. adeptAt?: string;
  39. registerLink?: string;
  40. }
  41. }
  42. export function listDepartmentsMethod(
  43. page = 1,
  44. size = 20,
  45. query?: Partial<BusinessModel.Department>,
  46. ) {
  47. return http.post<TransformList<BusinessModel.Department>, TransformList>(
  48. `/basis/department/listPage`,
  49. toDepartment(query),
  50. {
  51. params: { page, limit: size },
  52. transform({ items, ...data }) {
  53. return { ...data, items: items.map((item) => fromDepartment(item)) };
  54. },
  55. },
  56. );
  57. }
  58. export function treeDepartmentsMethod() {
  59. return http.post<BusinessModel.Department[], TransformData[]>(
  60. `/basis/department/list`,
  61. void 0,
  62. {
  63. transform(data) {
  64. return data.map((item) => fromDepartment(item));
  65. },
  66. },
  67. );
  68. }
  69. export function editDepartmentMethod(data: Partial<BusinessModel.Department>) {
  70. return http.post(
  71. data?.id ? `/basis/department/update` : `/basis/department/add`,
  72. toDepartment(data),
  73. );
  74. }
  75. export function deleteDepartmentMethod(
  76. data: Pick<BusinessModel.Department, 'id'>,
  77. ) {
  78. return deleteDepartmentsMethod([data]);
  79. }
  80. export function deleteDepartmentsMethod(
  81. params: Pick<BusinessModel.Department, 'id'>[],
  82. ) {
  83. return http.post(`/basis/department/batchDelete`, void 0, {
  84. params: { ids: params.map((item) => item.id).join(',') },
  85. });
  86. }
  87. export function downloadDepartmentTemplateMethod(filename = '科室模板.xlsx') {
  88. return http.get(`/basis/department/downExcel`, {
  89. params: { fileName: filename },
  90. transform(data: TransformBlob) {
  91. downloadFileFromBlob(data);
  92. return data;
  93. },
  94. });
  95. }
  96. export function uploadDepartmentFileMethod(file: File) {
  97. const data = new FormData();
  98. data.append('file', file);
  99. return http.post(`/basis/department/importExcel`, data, {
  100. meta: { notParseResponseBody: true },
  101. transform(data: TransformBody<unknown>) {
  102. if (data.code === 0) {
  103. const [_, count = ''] = data.message?.match(/入库成功(\d+)条/) ?? [];
  104. if (+count > 0)
  105. return { count: +count, message: data.message ?? `导入成功` };
  106. }
  107. // eslint-disable-next-line no-throw-literal
  108. throw { message: data.message ?? `导入失败` };
  109. },
  110. });
  111. }
  112. export function listDoctorsMethod(
  113. page = 1,
  114. size = 20,
  115. query?: Partial<BusinessModel.Doctor>,
  116. ) {
  117. return http.post<TransformList<BusinessModel.Doctor>, TransformList>(
  118. `/basis/doctor/listPage`,
  119. toDoctor(query),
  120. {
  121. params: { page, limit: size },
  122. transform({ items, ...data }) {
  123. return { ...data, items: items.map((item) => fromDoctor(item)) };
  124. },
  125. },
  126. );
  127. }
  128. export function editDoctorMethod(data: Partial<BusinessModel.Doctor>) {
  129. return http.post(
  130. data?.id ? `/basis/doctor/update` : `/basis/doctor/add`,
  131. toDoctor(data),
  132. );
  133. }
  134. export function deleteDoctorMethod(data: Pick<BusinessModel.Doctor, 'id'>) {
  135. return deleteDoctorsMethod([data]);
  136. }
  137. export function deleteDoctorsMethod(
  138. params: Pick<BusinessModel.Doctor, 'id'>[],
  139. ) {
  140. return http.post(`/basis/doctor/batchDelete`, void 0, {
  141. params: { ids: params.map((item) => item.id).join(',') },
  142. });
  143. }
  144. export function downloadDoctorTemplateMethod(filename = '医生模板.xlsx') {
  145. return http.get(`/basis/doctor/downExcel`, {
  146. params: { fileName: filename },
  147. transform(data: TransformBlob) {
  148. downloadFileFromBlob(data);
  149. return data;
  150. },
  151. });
  152. }
  153. export function uploadDoctorFileMethod(file: File) {
  154. const data = new FormData();
  155. data.append('file', file);
  156. return http.post(`/basis/doctor/importExcel`, data, {
  157. meta: { notParseResponseBody: true },
  158. transform(data: TransformBody<unknown>) {
  159. if (data.code === 0) {
  160. const [_, count = ''] = data.message?.match(/入库成功(\d+)条/) ?? [];
  161. if (+count > 0)
  162. return { count: +count, message: data.message ?? `导入成功` };
  163. }
  164. // eslint-disable-next-line no-throw-literal
  165. throw { message: data.message ?? `导入失败` };
  166. },
  167. });
  168. }