diff --git a/src/api/hisApi.ts b/src/api/hisApi.ts new file mode 100644 index 0000000..887b367 --- /dev/null +++ b/src/api/hisApi.ts @@ -0,0 +1,303 @@ +import axios, { AxiosInstance } from "axios"; + +// API配置 +const API_CONFIG = { + // 内网URL + INTERNAL_URL: + "http://10.1.5.118:8077/platform-api/api/his-web/self-service-machine/", + // 外网URL + EXTERNAL_URL: + "http://apihis.circleharmonyhospital.cn:8982/platform-api/api/his-web/self-service-machine/", +}; + +// 响应数据类型 +export interface ApiResponse { + Status: number; + Message: string | null; + Data: T; + CopyRight: string; +} + +// 患者基本信息 +export interface PatientInfo { + name: string; + gender: number; + gender_name: string; + age: string; + IdCard: string; + phone: string; + marital: number; + marital_name: string; +} + +// VIP认证结果 +export interface VipResult { + is_vip: number; // 0-否 1-是 +} + +// 可选项目列表 - 套餐信息 +export interface PackageInfo { + physical_exam_id: number; + is_optional_package: number; + is_optional_package_name: string; + package_code: number; + package_name: string; + registration_time: string; +} + +// 可选项目 +export interface OptionalItem { + combination_name: string; + combination_code: number; + physical_exam_id: number; + package_code: number; +} + +// 可选项目列表响应 +export interface OptionalItemListResponse { + packageInfo: PackageInfo; + listOptionalItem: OptionalItem[]; +} + +// 已预约套餐信息 +export interface PackagItemInfo { + patient_name: string; + appointment_datetime: string; + package_code: number; + package_name: string; + registration_time: string; +} + +// 套餐详情 +export interface PackDetail { + department_id: number; + department_name: string; + project_id: string; + project_name: string; +} + +// 已预约套餐详情响应 +export interface PackagItemDetailResponse { + packagItemInfo: PackagItemInfo; + listPackDetail: PackDetail[]; +} + +// PDF响应 +export interface PdfResponse { + pdf_url: string; + message: string | null; +} + +// 解析后的PDF响应(接口8返回的pdf_url可能是JSON字符串) +export interface ParsedPdfResponse { + pdfUrl: string; + message: string; +} + +// 创建axios实例 +function createAxiosInstance(baseURL: string): AxiosInstance { + const instance = axios.create({ + baseURL, + timeout: 30000, // 30秒超时 + headers: { + "Content-Type": "application/json; charset=UTF-8", + }, + }); + + // 请求拦截器 + instance.interceptors.request.use( + (config) => { + return config; + }, + (error) => { + return Promise.reject(error); + } + ); + + // 响应拦截器 + instance.interceptors.response.use( + (response) => { + return response; + }, + (error) => { + return Promise.reject(error); + } + ); + + return instance; +} + +// 默认使用外网URL,可以通过环境变量或配置切换 +let currentBaseURL = API_CONFIG.EXTERNAL_URL; +let axiosInstance = createAxiosInstance(currentBaseURL); + +/** + * 设置API基础URL + * @param useInternal 是否使用内网URL + */ +export function setApiBaseUrl(useInternal: boolean = false) { + currentBaseURL = useInternal + ? API_CONFIG.INTERNAL_URL + : API_CONFIG.EXTERNAL_URL; + axiosInstance = createAxiosInstance(currentBaseURL); +} + +/** + * 1. 通过身份证号查询基本信息 + */ +export async function getPatientInfo( + id_no: string +): Promise> { + const response = await axiosInstance.post>( + "patient-info", + { + id_no, + } + ); + return response.data; +} + +/** + * 2. 获取VIP客户认证结果 + */ +export async function getVipStatus( + id_no: string +): Promise> { + const response = await axiosInstance.post>("is-vip", { + id_no, + }); + return response.data; +} + +/** + * 3. 通过身份证号获取体检选项项目列表 + */ +export async function getOptionalItemList( + id_no: string +): Promise> { + const response = await axiosInstance.post< + ApiResponse + >("optional-item-list", { + id_no, + }); + return response.data; +} + +/** + * 4. 查询已预约的体检套餐详情 + * 注意:此接口与接口3使用相同的路径,但返回数据不同 + * 如果后端需要区分,可能需要额外的参数或不同的路径 + */ +export async function getPackagItemDetail( + id_no: string +): Promise> { + const response = await axiosInstance.post< + ApiResponse + >("optional-item-list", { + id_no, + }); + return response.data; +} + +/** + * 5. 获取体检知情同意书PDF + */ +export async function getTongyishuPdf( + exam_id: number +): Promise> { + const response = await axiosInstance.post>( + "tongyishu-get", + { + exam_id, + } + ); + return response.data; +} + +/** + * 6. 体检知情同意书签名,返回生成的知情同意书PDF + * @param exam_id 体检ID + * @param sign_file 签名图片文件(File对象或Blob) + */ +export async function submitTongyishuSign( + exam_id: number, + sign_file: File | Blob +): Promise> { + const formData = new FormData(); + formData.append("exam_id", exam_id.toString()); + formData.append("sign_file", sign_file); + + const response = await axiosInstance.post>( + "tongyishu-sign-submit", + formData, + { + headers: { + "Content-Type": "multipart/form-data", + }, + } + ); + return response.data; +} + +/** + * 7. 获取体检导检单PDF + */ +export async function getDaojiandanPdf( + exam_id: number +): Promise> { + const response = await axiosInstance.post>( + "daojiandan-get", + { + exam_id, + } + ); + return response.data; +} + +/** + * 8. 提交体检导检单签名,返回生成的导检单PDF + * @param exam_id 体检ID + * @param sign_file 签名图片文件(File对象或Blob) + * @returns 注意:返回的Data.pdf_url可能是JSON字符串,需要解析 + */ +export async function submitDaojiandanSign( + exam_id: number, + sign_file: File | Blob +): Promise> { + const formData = new FormData(); + formData.append("exam_id", exam_id.toString()); + formData.append("sign_file", sign_file); + + const response = await axiosInstance.post>( + "daojiandan-sign-submit", + formData, + { + headers: { + "Content-Type": "multipart/form-data", + }, + } + ); + return response.data; +} + +/** + * 解析接口8返回的pdf_url JSON字符串 + * @param pdfUrlJsonString JSON字符串 + * @returns 解析后的PDF响应对象 + */ +export function parsePdfUrlResponse( + pdfUrlJsonString: string +): ParsedPdfResponse { + try { + return JSON.parse(pdfUrlJsonString); + } catch (error) { + // 如果不是JSON字符串,直接返回 + return { + pdfUrl: pdfUrlJsonString, + message: "", + }; + } +} + +// 导出axios实例,以便需要时进行自定义配置 +export { axiosInstance };