import request from '@/utils/request' export interface MyPatientListParams { page_no: number page_size: number keyword?: string status_filter?: '' | 'unbooked' | 'pending_interview' | 'completed' | 'missed' start_date?: string end_date?: string } export function myPatientLists(params: MyPatientListParams) { return request.get({ url: '/firstvisit.myPatient/lists', params }) } export interface MyPatientOrderListParams { page_no: number page_size: number keyword?: string prescription_audit_status?: '' | number payment_slip_audit_status?: '' | number fulfillment_status?: '' | number start_date?: string end_date?: string } export function myPatientOrderLists(params: MyPatientOrderListParams) { return request.get({ url: '/firstvisit.myPatient/orders', params }) } export function myPatientOrderDetail(params: { id: number }) { return request.get({ url: '/firstvisit.myPatient/orderDetail', params }) } export function myPatientOrderEdit(params: Record) { return request.post({ url: '/firstvisit.myPatient/orderEdit', params }) } export function myPatientOrderAuditPrescription(params: { id: number action: 'approve' | 'reject' remark?: string }) { return request.post({ url: '/firstvisit.myPatient/orderAuditPrescription', params }) } export function myPatientOrderRevokeRxAudit(params: { id: number }) { return request.post({ url: '/firstvisit.myPatient/orderRevokeRxAudit', params }) } export function myPatientOrderAuditPayment(params: { id: number action: 'approve' | 'reject' remark?: string }) { return request.post({ url: '/firstvisit.myPatient/orderAuditPayment', params }) } export function myPatientOrderRevokePayAudit(params: { id: number }) { return request.post({ url: '/firstvisit.myPatient/orderRevokePayAudit', params }) } export function myPatientOrderDdcode(params: { id: number express_company: string tracking_number: string }) { return request.post({ url: '/firstvisit.myPatient/orderDdcode', params }) } export function myPatientOrderShip(params: { id: number ship_mode?: 'gancao' | 'direct' express_company: string tracking_number: string }) { return request.post({ url: '/firstvisit.myPatient/orderShip', params }) } export function myPatientOrderAddPayOrder(params: { id: number order_type: number pay_amount: number pay_remark?: string completion_request?: number pay_create_type?: 'fubei' | 'express_cod' }) { return request.post({ url: '/firstvisit.myPatient/orderAddPayOrder', params }) } export function myPatientOrderComplete(params: { id: number; fulfillment_status: number }) { return request.post({ url: '/firstvisit.myPatient/orderComplete', params }) } export function myPatientOrderRefund(params: { id: number; reason: string; refund_amount?: number }) { return request.post({ url: '/firstvisit.myPatient/orderRefund', params }) } export function myPatientOrderWithdraw(params: { id: number }) { return request.post({ url: '/firstvisit.myPatient/orderWithdraw', params }) } export function myPatientOrderUploadToPharmacy(params: { id: number }) { return request.post({ url: '/firstvisit.myPatient/orderUploadToPharmacy', params }) } export interface MyPatientProgressListParams { page_no: number page_size: number keyword?: string status?: '' | 1 | 3 | 4 start_date?: string end_date?: string } export function myPatientProgressLists(params: MyPatientProgressListParams) { return request.get({ url: '/firstvisit.myPatient/progress', params }) } export function myPatientCreateAppointment(params: Record) { return request.post({ url: '/firstvisit.myPatient/createAppointment', params }) } export function myPatientCancelAppointment(params: { id: number }) { return request.post({ url: '/firstvisit.myPatient/cancelAppointment', params }) } export function myPatientAssistants() { return request.get({ url: '/firstvisit.myPatient/assistants' }) } export function myPatientAssign(params: { id: number; assistant_id: number; is_inherit?: 0 | 1 }) { return request.post({ url: '/firstvisit.myPatient/assign', params }) } export function myPatientFillIdCard(params: { id: number; id_card: string }) { return request.post({ url: '/firstvisit.myPatient/fillIdCard', params }) } export interface FirstVisitConversionParams { time_type: 'today' | 'yesterday' | 'week' | 'month' | 'quarter' | 'year' | 'custom' start_date?: string end_date?: string dept_id?: number assistant_id?: number media_channel_code?: string } /** 一诊综合数据转化:服务端按当前角色 DataScope 与所选部门/员工取交集。 */ export function firstVisitConversionOverview(params: FirstVisitConversionParams) { return request.get( { url: '/firstvisit.conversion/overview', params, timeout: 120000 }, { ignoreCancelToken: true } ) } export interface FirstVisitRegistrationStatsParams { time_type: 'today' | 'yesterday' | 'week' | 'month' dept_id?: number assistant_id?: number } /** 一诊挂号统计:部门和员工参数只会在服务端 DataScope 权限范围内继续收窄。 */ export function firstVisitRegistrationStatsOverview(params: FirstVisitRegistrationStatsParams) { return request.get( { url: '/firstvisit.registrationStats/overview', params, timeout: 120000 }, { ignoreCancelToken: true } ) } export interface FirstVisitDoctorDashboardParams { time_type: 'today' | 'yesterday' | 'week' | 'month' | 'custom' start_date?: string end_date?: string dept_id?: number doctor_id?: number active_only?: 0 | 1 alert_threshold?: number } /** 一诊医生看板:医生与经手医助范围均由服务端根据当前角色和部门权限计算。 */ export function firstVisitDoctorDashboardOverview(params: FirstVisitDoctorDashboardParams) { return request.get( { url: '/firstvisit.doctorDashboard/overview', params, timeout: 120000 }, { ignoreCancelToken: true } ) } export function wecomPromotionOverview() { return request.get({ url: '/firstvisit.wecomPromotion/overview' }) } export function wecomPromotionSavePool(params: Record) { return request.post({ url: '/firstvisit.wecomPromotion/savePool', params }) } export function wecomPromotionSaveWidget(params: Record) { return request.post({ url: '/firstvisit.wecomPromotion/saveWidget', params }) } export function wecomPromotionDeletePool(params: { id: number }) { return request.post({ url: '/firstvisit.wecomPromotion/deletePool', params }) } export function wecomPromotionSaveLink(params: Record) { return request.post({ url: '/firstvisit.wecomPromotion/saveLink', params }) } export function wecomPromotionCheckApiPermission() { return request.post({ url: '/firstvisit.wecomPromotion/checkApiPermission' }) } export function wecomPromotionSyncRemoteLinks(params: { pool_id: number }) { return request.post({ url: '/firstvisit.wecomPromotion/syncRemoteLinks', params, timeout: 120000 }) } export function wecomPromotionRemoteLinkDetail(params: { id: number }) { return request.get({ url: '/firstvisit.wecomPromotion/remoteLinkDetail', params }) } export function wecomPromotionDeleteRemoteLink(params: { id: number }) { return request.post({ url: '/firstvisit.wecomPromotion/deleteRemoteLink', params }) } export function wecomPromotionToggleLink(params: { id: number; status: number }) { return request.post({ url: '/firstvisit.wecomPromotion/toggleLink', params }) } export function wecomPromotionDeleteLink(params: { id: number }) { return request.post({ url: '/firstvisit.wecomPromotion/deleteLink', params }) } export type WecomPromotionCustomerChatStatus = '' | 'messaged' | 'silent' | 'unknown' export interface WecomPromotionCustomerStatsParams { page_no: number page_size: number promotion_link_id?: number userid?: string chat_status?: 0 | 1 | 2 } export interface WecomPromotionCustomerStatsSummary { customer_count: number messaged_customer_count: number message_customer_rate: number received_message_count: number message_count_known_count: number } export interface WecomPromotionCustomerStatRow { id?: number userid?: string external_userid_masked?: string customer_id_masked?: string customer_name_masked?: string link_id?: number | string link_name?: string member_id?: number member_name?: string department_name?: string dept_name?: string has_messaged?: boolean | number chat_status?: 0 | 1 | 2 message_count_known?: boolean | number received_message_count?: number last_synced_at?: string last_message_at?: string } export interface WecomPromotionCustomerStatsResult { summary?: Partial lists?: WecomPromotionCustomerStatRow[] total?: number link_options?: Array<{ id: number | string; name: string }> member_options?: Array<{ id: number; userid?: string; name: string; department_name?: string; dept_name?: string }> meta?: { last_synced_at?: string } } /** 获客客户消息统计:服务端继续按当前角色和部门数据范围收窄。 */ export function wecomPromotionCustomerStats(params: WecomPromotionCustomerStatsParams) { return request.get( { url: '/firstvisit.wecomPromotion/customerStatistics', params, timeout: 120000 }, { ignoreCancelToken: true } ) } export function wecomPromotionSyncCustomers(params: { promotion_link_id?: number } = {}) { return request.post({ url: '/firstvisit.wecomPromotion/syncCustomers', params, timeout: 120000 }) }