新增
This commit is contained in:
+106
-106
@@ -1,106 +1,106 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 医生列表(从管理员表获取,role_id=1;默认不含禁止登录账号)
|
||||
export function doctorLists(params: any) {
|
||||
return request.get({
|
||||
url: '/auth.admin/lists',
|
||||
params: { ...params, role_id: 1, exclude_disabled: 1 }
|
||||
})
|
||||
}
|
||||
|
||||
// 医生详情
|
||||
export function doctorDetail(params: any) {
|
||||
return request.get({ url: '/auth.admin/detail', params })
|
||||
}
|
||||
|
||||
// ========== 排班管理 ==========
|
||||
|
||||
// 获取排班列表(按周)
|
||||
export function rosterLists(params: any) {
|
||||
return request.get({ url: '/doctor.roster/lists', params })
|
||||
}
|
||||
|
||||
// 添加/更新排班
|
||||
export function rosterSave(params: any) {
|
||||
return request.post({ url: '/doctor.roster/save', params })
|
||||
}
|
||||
|
||||
// 删除排班
|
||||
export function rosterDelete(params: any) {
|
||||
return request.post({ url: '/doctor.roster/delete', params })
|
||||
}
|
||||
|
||||
// 批量设置排班
|
||||
export function rosterBatchSave(params: any) {
|
||||
return request.post({ url: '/doctor.roster/batchSave', params })
|
||||
}
|
||||
|
||||
// 获取医生某天的排班详情
|
||||
export function rosterDetail(params: any) {
|
||||
return request.get({ url: '/doctor.roster/detail', params })
|
||||
}
|
||||
|
||||
// 复制排班(复制某周到另一周)
|
||||
export function rosterCopy(params: any) {
|
||||
return request.post({ url: '/doctor.roster/copy', params })
|
||||
}
|
||||
// ========== 挂号管理 ==========
|
||||
|
||||
// 获取医生某天的可用时间段
|
||||
export function getAvailableSlots(params: any) {
|
||||
return request.get({ url: '/doctor.appointment/availableSlots', params })
|
||||
}
|
||||
|
||||
// 创建挂号
|
||||
export function createAppointment(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/create', params })
|
||||
}
|
||||
|
||||
// 取消挂号
|
||||
export function cancelAppointment(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/cancel', params })
|
||||
}
|
||||
|
||||
// 获取挂号列表
|
||||
export function appointmentLists(params: any) {
|
||||
return request.get({ url: '/doctor.appointment/lists', params })
|
||||
}
|
||||
|
||||
/** 后台编辑挂号(预约日期/时段/类型/状态/备注/医助) */
|
||||
export function appointmentAdminEdit(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/edit', params })
|
||||
}
|
||||
|
||||
/** 批量修改挂号渠道来源(与 edit 共用 doctor.appointment/edit 权限) */
|
||||
export function appointmentBatchEditChannel(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/batchEditChannel', params })
|
||||
}
|
||||
|
||||
// 获取挂号详情
|
||||
export function appointmentDetail(params: any) {
|
||||
return request.get({ url: '/doctor.appointment/detail', params })
|
||||
}
|
||||
|
||||
// 完成挂号
|
||||
export function completeAppointment(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/complete', params })
|
||||
}
|
||||
|
||||
// ========== 医生统计 ==========
|
||||
|
||||
// 获取医生诊单统计
|
||||
export function getDoctorStatistics(params: any) {
|
||||
return request.get({ url: '/doctor.statistics/lists', params })
|
||||
}
|
||||
|
||||
// ========== 部门统计 ==========
|
||||
|
||||
// 获取部门列表
|
||||
export function getDeptList() {
|
||||
return request.get({ url: '/dept.dept/all' })
|
||||
}
|
||||
|
||||
// 获取部门统计
|
||||
export function getDeptStatistics(params: any) {
|
||||
return request.get({ url: '/doctor.statistics/deptLists', params })
|
||||
}
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 医生列表(从管理员表获取,role_id=1;默认不含禁止登录账号)
|
||||
export function doctorLists(params: any) {
|
||||
return request.get({
|
||||
url: '/auth.admin/lists',
|
||||
params: { ...params, role_id: 1, exclude_disabled: 1 }
|
||||
})
|
||||
}
|
||||
|
||||
// 医生详情
|
||||
export function doctorDetail(params: any) {
|
||||
return request.get({ url: '/auth.admin/detail', params })
|
||||
}
|
||||
|
||||
// ========== 排班管理 ==========
|
||||
|
||||
// 获取排班列表(按周)
|
||||
export function rosterLists(params: any) {
|
||||
return request.get({ url: '/doctor.roster/lists', params })
|
||||
}
|
||||
|
||||
// 添加/更新排班
|
||||
export function rosterSave(params: any) {
|
||||
return request.post({ url: '/doctor.roster/save', params })
|
||||
}
|
||||
|
||||
// 删除排班
|
||||
export function rosterDelete(params: any) {
|
||||
return request.post({ url: '/doctor.roster/delete', params })
|
||||
}
|
||||
|
||||
// 批量设置排班
|
||||
export function rosterBatchSave(params: any) {
|
||||
return request.post({ url: '/doctor.roster/batchSave', params })
|
||||
}
|
||||
|
||||
// 获取医生某天的排班详情
|
||||
export function rosterDetail(params: any) {
|
||||
return request.get({ url: '/doctor.roster/detail', params })
|
||||
}
|
||||
|
||||
// 复制排班(复制某周到另一周)
|
||||
export function rosterCopy(params: any) {
|
||||
return request.post({ url: '/doctor.roster/copy', params })
|
||||
}
|
||||
// ========== 挂号管理 ==========
|
||||
|
||||
// 获取医生某天的可用时间段
|
||||
export function getAvailableSlots(params: any) {
|
||||
return request.get({ url: '/doctor.appointment/availableSlots', params })
|
||||
}
|
||||
|
||||
// 创建挂号
|
||||
export function createAppointment(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/create', params })
|
||||
}
|
||||
|
||||
// 取消挂号
|
||||
export function cancelAppointment(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/cancel', params })
|
||||
}
|
||||
|
||||
// 获取挂号列表
|
||||
export function appointmentLists(params: any) {
|
||||
return request.get({ url: '/doctor.appointment/lists', params })
|
||||
}
|
||||
|
||||
/** 后台编辑挂号(预约日期/时段/类型/状态/备注/医助) */
|
||||
export function appointmentAdminEdit(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/edit', params })
|
||||
}
|
||||
|
||||
/** 批量修改挂号渠道来源(与 edit 共用 doctor.appointment/edit 权限) */
|
||||
export function appointmentBatchEditChannel(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/batchEditChannel', params })
|
||||
}
|
||||
|
||||
// 获取挂号详情
|
||||
export function appointmentDetail(params: any) {
|
||||
return request.get({ url: '/doctor.appointment/detail', params })
|
||||
}
|
||||
|
||||
// 完成挂号
|
||||
export function completeAppointment(params: any) {
|
||||
return request.post({ url: '/doctor.appointment/complete', params })
|
||||
}
|
||||
|
||||
// ========== 医生统计 ==========
|
||||
|
||||
// 获取医生诊单统计
|
||||
export function getDoctorStatistics(params: any) {
|
||||
return request.get({ url: '/doctor.statistics/lists', params })
|
||||
}
|
||||
|
||||
// ========== 部门统计 ==========
|
||||
|
||||
// 获取部门列表
|
||||
export function getDeptList() {
|
||||
return request.get({ url: '/dept.dept/all' })
|
||||
}
|
||||
|
||||
// 获取部门统计
|
||||
export function getDeptStatistics(params: any) {
|
||||
return request.get({ url: '/doctor.statistics/deptLists', params })
|
||||
}
|
||||
|
||||
+289
-285
@@ -1,285 +1,289 @@
|
||||
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<string, unknown>) {
|
||||
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<string, unknown>) {
|
||||
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'
|
||||
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' | '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' | 'week' | 'month'
|
||||
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<string, unknown>) {
|
||||
return request.post({ url: '/firstvisit.wecomPromotion/savePool', params })
|
||||
}
|
||||
|
||||
export function wecomPromotionSaveWidget(params: Record<string, unknown>) {
|
||||
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<string, unknown>) {
|
||||
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
|
||||
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<WecomPromotionCustomerStatsSummary>
|
||||
lists?: WecomPromotionCustomerStatRow[]
|
||||
total?: number
|
||||
link_options?: Array<{ id: number | string; name: string }>
|
||||
member_options?: Array<{ id: number; 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 })
|
||||
}
|
||||
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<string, unknown>) {
|
||||
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<string, unknown>) {
|
||||
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' | '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' | '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<string, unknown>) {
|
||||
return request.post({ url: '/firstvisit.wecomPromotion/savePool', params })
|
||||
}
|
||||
|
||||
export function wecomPromotionSaveWidget(params: Record<string, unknown>) {
|
||||
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<string, unknown>) {
|
||||
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
|
||||
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<WecomPromotionCustomerStatsSummary>
|
||||
lists?: WecomPromotionCustomerStatRow[]
|
||||
total?: number
|
||||
link_options?: Array<{ id: number | string; name: string }>
|
||||
member_options?: Array<{ id: number; 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 })
|
||||
}
|
||||
|
||||
+111
-111
@@ -1,111 +1,111 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 订单列表
|
||||
export function orderLists(params: any) {
|
||||
return request.get({ url: '/order.order/lists', params })
|
||||
}
|
||||
|
||||
// 同步企业微信对外收款账单到订单
|
||||
export function syncWechatWorkBills(params?: { begin_time?: string; end_time?: string }) {
|
||||
return request.get({ url: '/order.order/syncWechatWorkBills', params })
|
||||
}
|
||||
|
||||
// 调试:测试企业微信对外收款 API 连接
|
||||
export function syncWechatWorkBillsDebug(params?: { begin_time?: string; end_time?: string; payee_userid?: string }) {
|
||||
return request.get({ url: '/order.order/syncWechatWorkBillsDebug', params })
|
||||
}
|
||||
|
||||
// 今日收益(按角色权限)
|
||||
export function orderTodayRevenue() {
|
||||
return request.get({ url: '/order.order/todayRevenue' })
|
||||
}
|
||||
|
||||
// 订单统计(-1全部已支付类型合计,0退款,1~8:含全部费用与驼奶费用等)
|
||||
export function orderStats(params?: { order_type?: number; days?: number }) {
|
||||
return request.get({ url: '/order.order/orderStats', params })
|
||||
}
|
||||
|
||||
// 订单详情
|
||||
export function orderDetail(params: any) {
|
||||
return request.post({ url: '/order.order/detail', params })
|
||||
}
|
||||
|
||||
// 创建订单
|
||||
export function orderCreate(params: any) {
|
||||
return request.post({ url: '/order.order/create', params })
|
||||
}
|
||||
|
||||
// 创建企业微信对外收款订单(返回 order_no 供企业微信发起收款时使用)
|
||||
export function orderCreateForWechatWork(params: any) {
|
||||
return request.post({ url: '/order.order/createForWechatWork', params })
|
||||
}
|
||||
|
||||
// 编辑订单
|
||||
export function orderEdit(params: any) {
|
||||
return request.post({ url: '/order.order/edit', params })
|
||||
}
|
||||
|
||||
// 删除订单
|
||||
export function orderDelete(params: any) {
|
||||
return request.post({ url: '/order.order/delete', params })
|
||||
}
|
||||
|
||||
// 支付订单
|
||||
export function orderPay(params: any) {
|
||||
return request.post({ url: '/order.order/pay', params })
|
||||
}
|
||||
|
||||
// 支付宝支付
|
||||
export function alipayPay(params: any) {
|
||||
return request.post({ url: '/order.order/alipay', params })
|
||||
}
|
||||
|
||||
// 微信支付
|
||||
export function wechatPay(params: any) {
|
||||
return request.post({ url: '/order.order/wechat', params })
|
||||
}
|
||||
|
||||
// 取消订单
|
||||
export function orderCancel(params: any) {
|
||||
return request.post({ url: '/order.order/cancel', params })
|
||||
}
|
||||
|
||||
// 退款订单
|
||||
export function orderRefund(params: any) {
|
||||
return request.post({ url: '/order.order/refund', params })
|
||||
}
|
||||
|
||||
// 导出订单
|
||||
export function orderExport(params: any) {
|
||||
return request.get({ url: '/order.order/export', params }, { isReturnDefaultResponse: true })
|
||||
}
|
||||
|
||||
// 拆分订单(待支付 / 付呗待审核)
|
||||
export function orderSplit(params: { id: number; amounts: number[]; order_types: number[] }) {
|
||||
return request.post({ url: '/order.order/split', params })
|
||||
}
|
||||
|
||||
// 搜索患者(从诊单表)
|
||||
export function searchPatients(params: any) {
|
||||
return request.get({ url: '/tcm.diagnosis/searchPatient', params })
|
||||
}
|
||||
|
||||
/** 单条订单操作日志(分页) */
|
||||
export function orderActionLogs(params: { order_id: number; page_no?: number; page_size?: number }) {
|
||||
return request.get({ url: '/order.order/actionLogs', params })
|
||||
}
|
||||
|
||||
/** 按管理员统计操作次数(时间范围,未传时默认近 7 天) */
|
||||
export function orderActionLogStats(params?: { start_time?: string; end_time?: string; limit?: number }) {
|
||||
return request.get({ url: '/order.order/actionLogStats', params })
|
||||
}
|
||||
|
||||
/** 批量将支付单指派给医助 */
|
||||
export function orderBatchAssignAssistant(params: { order_ids: number[]; assistant_id: number }) {
|
||||
return request.post({ url: '/order.order/assignAssistant', params })
|
||||
}
|
||||
|
||||
/** 设置/取消支付单豁免权 */
|
||||
export function orderSetExempt(params: { id: number; is_exempt: 0 | 1 }) {
|
||||
return request.post({ url: '/order.order/setExempt', params })
|
||||
}
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 订单列表
|
||||
export function orderLists(params: any) {
|
||||
return request.get({ url: '/order.order/lists', params })
|
||||
}
|
||||
|
||||
// 同步企业微信对外收款账单到订单
|
||||
export function syncWechatWorkBills(params?: { begin_time?: string; end_time?: string }) {
|
||||
return request.get({ url: '/order.order/syncWechatWorkBills', params })
|
||||
}
|
||||
|
||||
// 调试:测试企业微信对外收款 API 连接
|
||||
export function syncWechatWorkBillsDebug(params?: { begin_time?: string; end_time?: string; payee_userid?: string }) {
|
||||
return request.get({ url: '/order.order/syncWechatWorkBillsDebug', params })
|
||||
}
|
||||
|
||||
// 今日收益(按角色权限)
|
||||
export function orderTodayRevenue() {
|
||||
return request.get({ url: '/order.order/todayRevenue' })
|
||||
}
|
||||
|
||||
// 订单统计(-1全部已支付类型合计,0退款,1~8:含全部费用与驼奶费用等)
|
||||
export function orderStats(params?: { order_type?: number; days?: number }) {
|
||||
return request.get({ url: '/order.order/orderStats', params })
|
||||
}
|
||||
|
||||
// 订单详情
|
||||
export function orderDetail(params: any) {
|
||||
return request.post({ url: '/order.order/detail', params })
|
||||
}
|
||||
|
||||
// 创建订单
|
||||
export function orderCreate(params: any) {
|
||||
return request.post({ url: '/order.order/create', params })
|
||||
}
|
||||
|
||||
// 创建企业微信对外收款订单(返回 order_no 供企业微信发起收款时使用)
|
||||
export function orderCreateForWechatWork(params: any) {
|
||||
return request.post({ url: '/order.order/createForWechatWork', params })
|
||||
}
|
||||
|
||||
// 编辑订单
|
||||
export function orderEdit(params: any) {
|
||||
return request.post({ url: '/order.order/edit', params })
|
||||
}
|
||||
|
||||
// 删除订单
|
||||
export function orderDelete(params: any) {
|
||||
return request.post({ url: '/order.order/delete', params })
|
||||
}
|
||||
|
||||
// 支付订单
|
||||
export function orderPay(params: any) {
|
||||
return request.post({ url: '/order.order/pay', params })
|
||||
}
|
||||
|
||||
// 支付宝支付
|
||||
export function alipayPay(params: any) {
|
||||
return request.post({ url: '/order.order/alipay', params })
|
||||
}
|
||||
|
||||
// 微信支付
|
||||
export function wechatPay(params: any) {
|
||||
return request.post({ url: '/order.order/wechat', params })
|
||||
}
|
||||
|
||||
// 取消订单
|
||||
export function orderCancel(params: any) {
|
||||
return request.post({ url: '/order.order/cancel', params })
|
||||
}
|
||||
|
||||
// 退款订单
|
||||
export function orderRefund(params: any) {
|
||||
return request.post({ url: '/order.order/refund', params })
|
||||
}
|
||||
|
||||
// 导出订单
|
||||
export function orderExport(params: any) {
|
||||
return request.get({ url: '/order.order/export', params }, { isReturnDefaultResponse: true })
|
||||
}
|
||||
|
||||
// 拆分订单(待支付 / 付呗待审核)
|
||||
export function orderSplit(params: { id: number; amounts: number[]; order_types: number[] }) {
|
||||
return request.post({ url: '/order.order/split', params })
|
||||
}
|
||||
|
||||
// 搜索患者(从诊单表)
|
||||
export function searchPatients(params: any) {
|
||||
return request.get({ url: '/tcm.diagnosis/searchPatient', params })
|
||||
}
|
||||
|
||||
/** 单条订单操作日志(分页) */
|
||||
export function orderActionLogs(params: { order_id: number; page_no?: number; page_size?: number }) {
|
||||
return request.get({ url: '/order.order/actionLogs', params })
|
||||
}
|
||||
|
||||
/** 按管理员统计操作次数(时间范围,未传时默认近 7 天) */
|
||||
export function orderActionLogStats(params?: { start_time?: string; end_time?: string; limit?: number }) {
|
||||
return request.get({ url: '/order.order/actionLogStats', params })
|
||||
}
|
||||
|
||||
/** 批量将支付单指派给医助 */
|
||||
export function orderBatchAssignAssistant(params: { order_ids: number[]; assistant_id: number }) {
|
||||
return request.post({ url: '/order.order/assignAssistant', params })
|
||||
}
|
||||
|
||||
/** 设置/取消支付单豁免权 */
|
||||
export function orderSetExempt(params: { id: number; is_exempt: 0 | 1 }) {
|
||||
return request.post({ url: '/order.order/setExempt', params })
|
||||
}
|
||||
|
||||
@@ -1,31 +1,31 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 部门列表
|
||||
export function deptLists(params?: any) {
|
||||
return request.get({ url: '/dept.dept/lists', params })
|
||||
}
|
||||
|
||||
// 添加部门
|
||||
export function deptAdd(params: any) {
|
||||
return request.post({ url: '/dept.dept/add', params })
|
||||
}
|
||||
|
||||
// 编辑部门
|
||||
export function deptEdit(params: any) {
|
||||
return request.post({ url: '/dept.dept/edit', params })
|
||||
}
|
||||
|
||||
// 删除部门
|
||||
export function deptDelete(params: any) {
|
||||
return request.post({ url: '/dept.dept/delete', params })
|
||||
}
|
||||
|
||||
// 部门详情
|
||||
export function deptDetail(params: any) {
|
||||
return request.get({ url: '/dept.dept/detail', params })
|
||||
}
|
||||
|
||||
// 部门列表全部;apply_data_scope=1 时按当前账号角色数据权限收窄树(与 DataScopeService 一致)
|
||||
export function deptAll(params?: { apply_data_scope?: number }) {
|
||||
return request.get({ url: '/dept.dept/all', params })
|
||||
}
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 部门列表
|
||||
export function deptLists(params?: any) {
|
||||
return request.get({ url: '/dept.dept/lists', params })
|
||||
}
|
||||
|
||||
// 添加部门
|
||||
export function deptAdd(params: any) {
|
||||
return request.post({ url: '/dept.dept/add', params })
|
||||
}
|
||||
|
||||
// 编辑部门
|
||||
export function deptEdit(params: any) {
|
||||
return request.post({ url: '/dept.dept/edit', params })
|
||||
}
|
||||
|
||||
// 删除部门
|
||||
export function deptDelete(params: any) {
|
||||
return request.post({ url: '/dept.dept/delete', params })
|
||||
}
|
||||
|
||||
// 部门详情
|
||||
export function deptDetail(params: any) {
|
||||
return request.get({ url: '/dept.dept/detail', params })
|
||||
}
|
||||
|
||||
// 部门列表全部;apply_data_scope=1 时按当前账号角色数据权限收窄树(与 DataScopeService 一致)
|
||||
export function deptAll(params?: { apply_data_scope?: number }) {
|
||||
return request.get({ url: '/dept.dept/all', params })
|
||||
}
|
||||
|
||||
+255
-255
@@ -1,255 +1,255 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
/** 角色数据驾驶舱:服务端统一按当前管理员的数据范围聚合。 */
|
||||
export function performanceDashboardOverview(params?: { ranking_dept_id?: number; _t?: number }) {
|
||||
return request.get(
|
||||
{ url: '/stats.performanceDashboard/overview', params, timeout: 120000 },
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
export function getConversionStatsOverview(params: any) {
|
||||
return request.get({ url: '/stats.conversion/overview', params })
|
||||
}
|
||||
|
||||
/** 业绩看板:单区间(部门 × 时间 × 渠道) */
|
||||
export function yejiStatsOverview(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/overview', params })
|
||||
}
|
||||
|
||||
/** 业绩看板:多区间一次返回(默认 月/周/今日/昨日 四张表) */
|
||||
export function yejiStatsMulti(params: {
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
ranges?: Array<{ label?: string; start_date: string; end_date: string }>
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/multi', params })
|
||||
}
|
||||
|
||||
/** 业绩看板:部门下拉 */
|
||||
export function yejiStatsDeptOptions() {
|
||||
return request.get({ url: '/stats.yejiStats/deptOptions' })
|
||||
}
|
||||
|
||||
/** 业绩看板:渠道下拉(按 source_group_name 分组) */
|
||||
export function yejiStatsChannelOptions() {
|
||||
return request.get({ url: '/stats.yejiStats/channelOptions' })
|
||||
}
|
||||
|
||||
/** 业绩看板:医助排行榜(按部门分表;区间须与当前业绩表一致) */
|
||||
export function yejiStatsLeaderboard(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/leaderboard', params })
|
||||
}
|
||||
|
||||
/** 「未归属中心」行:按订单创建人拆解合计业绩(与看板「合计业绩」未归属部分同口径) */
|
||||
export function yejiStatsUnassignedBreakdown(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/unassignedBreakdown', params })
|
||||
}
|
||||
|
||||
/** 部门行「进线数据」逐条明细(与看板同口径) */
|
||||
export function yejiStatsLeadLines(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_id: number
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
page?: number
|
||||
page_size?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/leadLines', params })
|
||||
}
|
||||
|
||||
/** 医助排行榜「预约诊单」逐条挂号明细;业绩主表部门行传 dept_id(可与 assistant_id 二选一) */
|
||||
export function yejiStatsAppointmentLines(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
assistant_id?: number
|
||||
dept_id?: number
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
page?: number
|
||||
page_size?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/appointmentLines', params })
|
||||
}
|
||||
|
||||
/** 二中心复诊:部门行下钻医助 × 业务订单笔数 */
|
||||
export function yejiStatsRevisitBreakdown(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_id: number
|
||||
revisit_slot: number
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/revisitBreakdown', params })
|
||||
}
|
||||
|
||||
/** 被指派数明细:与看板「被指派数」同口径;部门行传 dept_id,医助排行榜传 assistant_id */
|
||||
export function yejiStatsAssignLines(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_id?: number
|
||||
assistant_id?: number
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
page?: number
|
||||
page_size?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/assignLines', params })
|
||||
}
|
||||
|
||||
export function doctorDailyStatsOverview(params: {
|
||||
start_date?: string
|
||||
end_date?: string
|
||||
channel_code?: string
|
||||
dept_ids?: number[] | string
|
||||
}) {
|
||||
return request.get({ url: '/stats.doctorDailyStats/overview', params })
|
||||
}
|
||||
|
||||
/** 提成结算接口计算较重,单独放宽超时(默认多为 60s) */
|
||||
const COMMISSION_SETTLEMENT_TIMEOUT_MS = 120000
|
||||
|
||||
/** 提成结算业绩(独立于业绩看板 yejiStats) */
|
||||
export function commissionSettlementOverview(params: {
|
||||
settlement_month: string
|
||||
/** 与 tcm.prescriptionOrder/lists 同源:create_time between */
|
||||
start_time?: string
|
||||
end_time?: string
|
||||
/** 默认 3=履约完成,与列表 fulfillment_status 一致 */
|
||||
fulfillment_status?: number
|
||||
/** 传 1 时仅统计 is_system_auto=1;显式时段下默认不传(含手动) */
|
||||
require_system_auto_prescription?: 0 | 1
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
}) {
|
||||
return request.get(
|
||||
{ url: '/stats.commissionSettlement/overview', params, timeout: COMMISSION_SETTLEMENT_TIMEOUT_MS },
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
export function commissionSettlementDeptOptions() {
|
||||
return request.get({ url: '/stats.commissionSettlement/deptOptions' })
|
||||
}
|
||||
|
||||
export function commissionSettlementChannelOptions() {
|
||||
return request.get({ url: '/stats.commissionSettlement/channelOptions' })
|
||||
}
|
||||
|
||||
/** 提成核对:订单明细分页 bucket: 空|current|deferred;appt_channel_value 可与 assistant_id/doctor_id 组合(0=未匹配挂号渠道) */
|
||||
export function commissionSettlementOrderLines(params: {
|
||||
settlement_month: string
|
||||
start_time?: string
|
||||
end_time?: string
|
||||
fulfillment_status?: number
|
||||
require_system_auto_prescription?: 0 | 1
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
page?: number
|
||||
page_size?: number
|
||||
bucket?: string
|
||||
assistant_id?: number
|
||||
doctor_id?: number
|
||||
appt_channel_value?: number
|
||||
}) {
|
||||
return request.get(
|
||||
{ url: '/stats.commissionSettlement/orderLines', params, timeout: COMMISSION_SETTLEMENT_TIMEOUT_MS },
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
export function commissionSettlementConfirmStatus(params: {
|
||||
settlement_month: string
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.commissionSettlement/confirmStatus', params })
|
||||
}
|
||||
|
||||
export function commissionSettlementSaveReconcile(params: Record<string, any>) {
|
||||
return request.post({ url: '/stats.commissionSettlement/saveReconcile', params })
|
||||
}
|
||||
|
||||
export function commissionSettlementConfirmFinalize(params: Record<string, any>) {
|
||||
return request.post(
|
||||
{ url: '/stats.commissionSettlement/confirmFinalize', params, timeout: COMMISSION_SETTLEMENT_TIMEOUT_MS },
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
/** 撤回「确定本期业绩」:清除顺延结转,状态变为可再次核对/确定 */
|
||||
export function commissionSettlementConfirmRevoke(params: Record<string, any>) {
|
||||
return request.post({ url: '/stats.commissionSettlement/confirmRevoke', params })
|
||||
}
|
||||
|
||||
/** 复诊接诊率(按月):当月 N 诊接诊率,部门 → 医助分组 + 合计;剔除「继承」指派 */
|
||||
export function revisitRateOverview(params: { month?: string; dept_ids?: string }) {
|
||||
return request.get({ url: '/stats.revisitRate/overview', params })
|
||||
}
|
||||
|
||||
/** 复诊接诊率:部门下拉(前端组树) */
|
||||
export function revisitRateDeptOptions() {
|
||||
return request.get({ url: '/stats.revisitRate/deptOptions' })
|
||||
}
|
||||
|
||||
/** 复诊接诊率:「被指派数」点击下钻(按诊单聚合明细) */
|
||||
export function revisitRateAssignLines(params: {
|
||||
month?: string
|
||||
dept_ids?: string
|
||||
assistant_id?: number
|
||||
dept_id?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.revisitRate/assignLines', params })
|
||||
}
|
||||
|
||||
/** 复诊接诊率:「N 诊单数」点击下钻(具体订单明细) */
|
||||
export function revisitRateVisitOrderLines(params: {
|
||||
month?: string
|
||||
slot: number
|
||||
dept_ids?: string
|
||||
assistant_id?: number
|
||||
dept_id?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.revisitRate/visitOrderLines', params })
|
||||
}
|
||||
|
||||
/** 待分配诊单自动指派日志列表(定时命令 tcm:auto-assign-pending 写入,含分配/未分配原因) */
|
||||
export function autoAssignLogLists(params: Record<string, any>) {
|
||||
return request.get({ url: '/stats.autoAssignLog/lists', params })
|
||||
}
|
||||
|
||||
/** 批量回退自动分配:将诊单医助撤回到自动分配前的原医助 */
|
||||
export function autoAssignLogRollback(data: { ids: number[] }) {
|
||||
return request.post({ url: '/stats.autoAssignLog/rollback', data })
|
||||
}
|
||||
|
||||
/** 医助个人业绩概览 */
|
||||
export function assistantPerformanceOverview(params: {
|
||||
time_type?: string
|
||||
start_date?: string
|
||||
end_date?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.assistantPerformance/overview', params })
|
||||
}
|
||||
import request from '@/utils/request'
|
||||
|
||||
/** 角色数据驾驶舱:服务端统一按当前管理员的数据范围聚合。 */
|
||||
export function performanceDashboardOverview(params?: { ranking_dept_id?: number; _t?: number }) {
|
||||
return request.get(
|
||||
{ url: '/stats.performanceDashboard/overview', params, timeout: 120000 },
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
export function getConversionStatsOverview(params: any) {
|
||||
return request.get({ url: '/stats.conversion/overview', params })
|
||||
}
|
||||
|
||||
/** 业绩看板:单区间(部门 × 时间 × 渠道) */
|
||||
export function yejiStatsOverview(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/overview', params })
|
||||
}
|
||||
|
||||
/** 业绩看板:多区间一次返回(默认 月/周/今日/昨日 四张表) */
|
||||
export function yejiStatsMulti(params: {
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
ranges?: Array<{ label?: string; start_date: string; end_date: string }>
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/multi', params })
|
||||
}
|
||||
|
||||
/** 业绩看板:部门下拉 */
|
||||
export function yejiStatsDeptOptions() {
|
||||
return request.get({ url: '/stats.yejiStats/deptOptions' })
|
||||
}
|
||||
|
||||
/** 业绩看板:渠道下拉(按 source_group_name 分组) */
|
||||
export function yejiStatsChannelOptions() {
|
||||
return request.get({ url: '/stats.yejiStats/channelOptions' })
|
||||
}
|
||||
|
||||
/** 业绩看板:医助排行榜(按部门分表;区间须与当前业绩表一致) */
|
||||
export function yejiStatsLeaderboard(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/leaderboard', params })
|
||||
}
|
||||
|
||||
/** 「未归属中心」行:按订单创建人拆解合计业绩(与看板「合计业绩」未归属部分同口径) */
|
||||
export function yejiStatsUnassignedBreakdown(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/unassignedBreakdown', params })
|
||||
}
|
||||
|
||||
/** 部门行「进线数据」逐条明细(与看板同口径) */
|
||||
export function yejiStatsLeadLines(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_id: number
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
page?: number
|
||||
page_size?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/leadLines', params })
|
||||
}
|
||||
|
||||
/** 医助排行榜「预约诊单」逐条挂号明细;业绩主表部门行传 dept_id(可与 assistant_id 二选一) */
|
||||
export function yejiStatsAppointmentLines(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
assistant_id?: number
|
||||
dept_id?: number
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
page?: number
|
||||
page_size?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/appointmentLines', params })
|
||||
}
|
||||
|
||||
/** 二中心复诊:部门行下钻医助 × 业务订单笔数 */
|
||||
export function yejiStatsRevisitBreakdown(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_id: number
|
||||
revisit_slot: number
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/revisitBreakdown', params })
|
||||
}
|
||||
|
||||
/** 被指派数明细:与看板「被指派数」同口径;部门行传 dept_id,医助排行榜传 assistant_id */
|
||||
export function yejiStatsAssignLines(params: {
|
||||
start_date: string
|
||||
end_date: string
|
||||
dept_id?: number
|
||||
assistant_id?: number
|
||||
dept_ids?: string
|
||||
channel_code?: string
|
||||
tag_id?: string
|
||||
page?: number
|
||||
page_size?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.yejiStats/assignLines', params })
|
||||
}
|
||||
|
||||
export function doctorDailyStatsOverview(params: {
|
||||
start_date?: string
|
||||
end_date?: string
|
||||
channel_code?: string
|
||||
dept_ids?: number[] | string
|
||||
}) {
|
||||
return request.get({ url: '/stats.doctorDailyStats/overview', params })
|
||||
}
|
||||
|
||||
/** 提成结算接口计算较重,单独放宽超时(默认多为 60s) */
|
||||
const COMMISSION_SETTLEMENT_TIMEOUT_MS = 120000
|
||||
|
||||
/** 提成结算业绩(独立于业绩看板 yejiStats) */
|
||||
export function commissionSettlementOverview(params: {
|
||||
settlement_month: string
|
||||
/** 与 tcm.prescriptionOrder/lists 同源:create_time between */
|
||||
start_time?: string
|
||||
end_time?: string
|
||||
/** 默认 3=履约完成,与列表 fulfillment_status 一致 */
|
||||
fulfillment_status?: number
|
||||
/** 传 1 时仅统计 is_system_auto=1;显式时段下默认不传(含手动) */
|
||||
require_system_auto_prescription?: 0 | 1
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
}) {
|
||||
return request.get(
|
||||
{ url: '/stats.commissionSettlement/overview', params, timeout: COMMISSION_SETTLEMENT_TIMEOUT_MS },
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
export function commissionSettlementDeptOptions() {
|
||||
return request.get({ url: '/stats.commissionSettlement/deptOptions' })
|
||||
}
|
||||
|
||||
export function commissionSettlementChannelOptions() {
|
||||
return request.get({ url: '/stats.commissionSettlement/channelOptions' })
|
||||
}
|
||||
|
||||
/** 提成核对:订单明细分页 bucket: 空|current|deferred;appt_channel_value 可与 assistant_id/doctor_id 组合(0=未匹配挂号渠道) */
|
||||
export function commissionSettlementOrderLines(params: {
|
||||
settlement_month: string
|
||||
start_time?: string
|
||||
end_time?: string
|
||||
fulfillment_status?: number
|
||||
require_system_auto_prescription?: 0 | 1
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
page?: number
|
||||
page_size?: number
|
||||
bucket?: string
|
||||
assistant_id?: number
|
||||
doctor_id?: number
|
||||
appt_channel_value?: number
|
||||
}) {
|
||||
return request.get(
|
||||
{ url: '/stats.commissionSettlement/orderLines', params, timeout: COMMISSION_SETTLEMENT_TIMEOUT_MS },
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
export function commissionSettlementConfirmStatus(params: {
|
||||
settlement_month: string
|
||||
dept_ids?: number[] | string
|
||||
channel_code?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.commissionSettlement/confirmStatus', params })
|
||||
}
|
||||
|
||||
export function commissionSettlementSaveReconcile(params: Record<string, any>) {
|
||||
return request.post({ url: '/stats.commissionSettlement/saveReconcile', params })
|
||||
}
|
||||
|
||||
export function commissionSettlementConfirmFinalize(params: Record<string, any>) {
|
||||
return request.post(
|
||||
{ url: '/stats.commissionSettlement/confirmFinalize', params, timeout: COMMISSION_SETTLEMENT_TIMEOUT_MS },
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
/** 撤回「确定本期业绩」:清除顺延结转,状态变为可再次核对/确定 */
|
||||
export function commissionSettlementConfirmRevoke(params: Record<string, any>) {
|
||||
return request.post({ url: '/stats.commissionSettlement/confirmRevoke', params })
|
||||
}
|
||||
|
||||
/** 复诊接诊率(按月):当月 N 诊接诊率,部门 → 医助分组 + 合计;剔除「继承」指派 */
|
||||
export function revisitRateOverview(params: { month?: string; dept_ids?: string }) {
|
||||
return request.get({ url: '/stats.revisitRate/overview', params })
|
||||
}
|
||||
|
||||
/** 复诊接诊率:部门下拉(前端组树) */
|
||||
export function revisitRateDeptOptions() {
|
||||
return request.get({ url: '/stats.revisitRate/deptOptions' })
|
||||
}
|
||||
|
||||
/** 复诊接诊率:「被指派数」点击下钻(按诊单聚合明细) */
|
||||
export function revisitRateAssignLines(params: {
|
||||
month?: string
|
||||
dept_ids?: string
|
||||
assistant_id?: number
|
||||
dept_id?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.revisitRate/assignLines', params })
|
||||
}
|
||||
|
||||
/** 复诊接诊率:「N 诊单数」点击下钻(具体订单明细) */
|
||||
export function revisitRateVisitOrderLines(params: {
|
||||
month?: string
|
||||
slot: number
|
||||
dept_ids?: string
|
||||
assistant_id?: number
|
||||
dept_id?: number
|
||||
}) {
|
||||
return request.get({ url: '/stats.revisitRate/visitOrderLines', params })
|
||||
}
|
||||
|
||||
/** 待分配诊单自动指派日志列表(定时命令 tcm:auto-assign-pending 写入,含分配/未分配原因) */
|
||||
export function autoAssignLogLists(params: Record<string, any>) {
|
||||
return request.get({ url: '/stats.autoAssignLog/lists', params })
|
||||
}
|
||||
|
||||
/** 批量回退自动分配:将诊单医助撤回到自动分配前的原医助 */
|
||||
export function autoAssignLogRollback(data: { ids: number[] }) {
|
||||
return request.post({ url: '/stats.autoAssignLog/rollback', data })
|
||||
}
|
||||
|
||||
/** 医助个人业绩概览 */
|
||||
export function assistantPerformanceOverview(params: {
|
||||
time_type?: string
|
||||
start_date?: string
|
||||
end_date?: string
|
||||
}) {
|
||||
return request.get({ url: '/stats.assistantPerformance/overview', params })
|
||||
}
|
||||
|
||||
@@ -590,6 +590,119 @@ export function prescriptionOrderSetShipMode(params: { id: number; ship_mode: 'g
|
||||
|
||||
// ========== 处方库 ==========
|
||||
|
||||
export type PrescriptionAiProfile = 'qwen' | 'openai'
|
||||
|
||||
export interface PrescriptionLibraryHerb {
|
||||
medicine_id?: number
|
||||
name: string
|
||||
dosage: number | string
|
||||
}
|
||||
|
||||
export interface PrescriptionLibraryRow {
|
||||
id: number
|
||||
prescription_name: string
|
||||
formula_type: '主方' | '辅方' | string
|
||||
herbs: PrescriptionLibraryHerb[]
|
||||
is_public: 0 | 1
|
||||
disable_edit: 0 | 1
|
||||
creator_id: number
|
||||
creator_name: string
|
||||
create_time: string
|
||||
update_time?: string
|
||||
}
|
||||
|
||||
export interface PrescriptionAiStructuredReport {
|
||||
summary: string
|
||||
possible_symptoms: string[]
|
||||
main_indications: string
|
||||
efficacy: string[]
|
||||
suitable_people: string[]
|
||||
compatibility_analysis: string
|
||||
cautions: string[]
|
||||
disclaimer: string
|
||||
}
|
||||
|
||||
export interface PrescriptionAiReportRecord {
|
||||
report_id: number
|
||||
id: number
|
||||
model_key: PrescriptionAiProfile
|
||||
model_name: string
|
||||
model_label: string
|
||||
prompt_version: string
|
||||
message_id: string
|
||||
prescription_fingerprint: string
|
||||
is_stale: boolean
|
||||
generated_by: number
|
||||
generated_time: number
|
||||
generated_at: string
|
||||
report?: PrescriptionAiStructuredReport | null
|
||||
content: string
|
||||
edited_by: number
|
||||
edited_time: number
|
||||
edited_at?: string
|
||||
is_edited: boolean
|
||||
}
|
||||
|
||||
export interface PrescriptionAiGenerationResult {
|
||||
model_key: PrescriptionAiProfile
|
||||
model_name: string
|
||||
model_label: string
|
||||
status: 'success' | 'error'
|
||||
report_id?: number
|
||||
message_id?: string
|
||||
prompt_version?: string
|
||||
latency_ms: number
|
||||
error_code?: string
|
||||
error_message?: string
|
||||
}
|
||||
|
||||
export interface PrescriptionAiCapabilities {
|
||||
can_view: boolean
|
||||
can_refresh: boolean
|
||||
can_edit: boolean
|
||||
}
|
||||
|
||||
export interface PrescriptionAiReportsResponse {
|
||||
prescription_id: number
|
||||
prescription_name: string
|
||||
formula_type: string
|
||||
prescription_updated_at: string
|
||||
prescription_fingerprint: string
|
||||
prompt_version: string
|
||||
reports: PrescriptionAiReportRecord[]
|
||||
missing_model_keys: PrescriptionAiProfile[]
|
||||
can_view: boolean
|
||||
can_refresh: boolean
|
||||
can_edit: boolean
|
||||
capabilities: PrescriptionAiCapabilities
|
||||
status?: 'success' | 'partial' | 'error'
|
||||
partial?: boolean
|
||||
success_count?: number
|
||||
failure_count?: number
|
||||
results?: PrescriptionAiGenerationResult[]
|
||||
}
|
||||
|
||||
export interface PrescriptionAiReportEditResponse {
|
||||
prescription_id: number
|
||||
report: PrescriptionAiReportRecord
|
||||
can_edit: boolean
|
||||
can_refresh: boolean
|
||||
}
|
||||
|
||||
export interface PrescriptionMissingAiReportItem {
|
||||
id: number
|
||||
prescription_name: string
|
||||
formula_type: string
|
||||
herb_count: number
|
||||
}
|
||||
|
||||
export interface PrescriptionMissingAiReportsResponse {
|
||||
total: number
|
||||
items: PrescriptionMissingAiReportItem[]
|
||||
limit: number
|
||||
truncated?: boolean
|
||||
}
|
||||
|
||||
// 处方库列表
|
||||
export function prescriptionLibraryLists(params: any) {
|
||||
return request.get({ url: '/tcm.prescriptionLibrary/lists', params })
|
||||
@@ -615,6 +728,58 @@ export function prescriptionLibraryDetail(params: { id: number }) {
|
||||
return request.get({ url: '/tcm.prescriptionLibrary/detail', params })
|
||||
}
|
||||
|
||||
/** 查询完全没有持久化 AI 报告的处方,单次最多返回 500 条。 */
|
||||
export function prescriptionLibraryMissingAiReports(params: { limit?: number } = {}) {
|
||||
return request.get<PrescriptionMissingAiReportsResponse>(
|
||||
{
|
||||
url: '/tcm.prescriptionLibrary/missingAiReports',
|
||||
params,
|
||||
timeout: 30000
|
||||
},
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
/** 读取数据库中已保存的 AI 报告;不会触发模型生成。 */
|
||||
export function prescriptionLibraryAiReports(params: { id: number }) {
|
||||
return request.get<PrescriptionAiReportsResponse>(
|
||||
{
|
||||
url: '/tcm.prescriptionLibrary/aiReports',
|
||||
params,
|
||||
timeout: 30000
|
||||
},
|
||||
{ ignoreCancelToken: true }
|
||||
)
|
||||
}
|
||||
|
||||
/** 重新生成整份多模型诊断报告;POST 不自动重试,避免重复计费。 */
|
||||
export function prescriptionLibraryGenerateAiReports(params: { id: number }) {
|
||||
return request.post<PrescriptionAiReportsResponse>(
|
||||
{
|
||||
url: '/tcm.prescriptionLibrary/generateAiReports',
|
||||
params,
|
||||
timeout: 210000
|
||||
},
|
||||
{ ignoreCancelToken: true, isOpenRetry: false }
|
||||
)
|
||||
}
|
||||
|
||||
/** 编辑一份已持久化的模型报告。 */
|
||||
export function prescriptionLibraryEditAiReport(params: {
|
||||
id: number
|
||||
report_id: number
|
||||
content: string
|
||||
}) {
|
||||
return request.post<PrescriptionAiReportEditResponse>(
|
||||
{
|
||||
url: '/tcm.prescriptionLibrary/editAiReport',
|
||||
params,
|
||||
timeout: 30000
|
||||
},
|
||||
{ ignoreCancelToken: true, isOpenRetry: false }
|
||||
)
|
||||
}
|
||||
|
||||
// ========== 诊单待办事项(T5) ==========
|
||||
|
||||
/** 待办列表(按 diagnosis_id) */
|
||||
|
||||
Reference in New Issue
Block a user