This commit is contained in:
Your Name
2026-05-28 12:18:14 +08:00
parent afd88714ec
commit 7f08771dd0
9 changed files with 472 additions and 34 deletions
+67
View File
@@ -181,9 +181,44 @@
<template #default="{ row }">¥ {{ formatDoctorDailyMoney(row.deal_amount) }}</template>
</el-table-column>
<el-table-column prop="deal_order_count" label="接诊诊单" min-width="88" align="right" />
<el-table-column
prop="appointment_total"
label="总挂号"
min-width="88"
align="right"
>
<template #header>
<span>总挂号</span>
<el-tooltip
effect="dark"
placement="top"
content="区间内该医生 doctor_appointment 全部状态合计(已预约/已完成/已过号/已取消);选部门时仅计经手医助归属在所选部门子树的挂号(与业绩看板「预约诊单」医助口径一致)"
>
<el-icon class="doctor-daily-th__hint"><InfoFilled /></el-icon>
</el-tooltip>
</template>
</el-table-column>
<el-table-column prop="appointment_completed" label="挂号完成" min-width="88" align="right" />
<el-table-column prop="appointment_missed" label="过号" min-width="72" align="right" />
<el-table-column prop="appointment_cancelled" label="取消" min-width="72" align="right" />
<el-table-column
prop="appointment_conversion_rate"
label="挂号率"
min-width="92"
align="right"
>
<template #header>
<span>挂号率</span>
<el-tooltip
effect="dark"
placement="top"
content="挂号率 = 成交单数 / 总挂号数 × 100;总挂号为 0 时显示「—」"
>
<el-icon class="doctor-daily-th__hint"><InfoFilled /></el-icon>
</el-tooltip>
</template>
<template #default="{ row }">{{ formatDoctorDailyRate(row.appointment_conversion_rate) }}</template>
</el-table-column>
</el-table>
</el-card>
<el-empty v-else description="当前账号无医生统计权限" />
@@ -2078,6 +2113,10 @@ function buildDoctorDailyRequestParams(): Record<string, any> {
if (selectedChannel.value) {
p.channel_code = selectedChannel.value
}
// 选中父级时由后端 resolvePrimaryDepts 自动展开所有子级,再用 admin_dept 收窄医生集合。
if (selectedDeptIds.value.length > 0) {
p.dept_ids = selectedDeptIds.value.join(',')
}
if (customRange.value?.[0] && customRange.value?.[1]) {
p.start_date = customRange.value[0]
p.end_date = customRange.value[1]
@@ -2096,6 +2135,15 @@ function formatDoctorDailyMoney(n: number | string | undefined) {
return x.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
}
/** 挂号率展示:null 或非有限数显示「—」;保留 2 位小数 + % 后缀 */
function formatDoctorDailyRate(v: number | string | null | undefined): string {
if (v === null || v === undefined || v === '') return '—'
const n = Number(v)
if (!Number.isFinite(n)) return '—'
return `${n.toFixed(2)}%`
}
function getDoctorDailySummaries(param: { columns: any[] }) {
const t = doctorDailyTotal.value
const sums: string[] = []
@@ -2118,6 +2166,9 @@ function getDoctorDailySummaries(param: { columns: any[] }) {
case 'deal_order_count':
sums[index] = String(t.deal_order_count ?? 0)
break
case 'appointment_total':
sums[index] = String(t.appointment_total ?? 0)
break
case 'appointment_completed':
sums[index] = String(t.appointment_completed ?? 0)
break
@@ -2127,6 +2178,9 @@ function getDoctorDailySummaries(param: { columns: any[] }) {
case 'appointment_cancelled':
sums[index] = String(t.appointment_cancelled ?? 0)
break
case 'appointment_conversion_rate':
sums[index] = formatDoctorDailyRate(t.appointment_conversion_rate)
break
default:
sums[index] = ''
}
@@ -4100,6 +4154,19 @@ onMounted(async () => {
background: var(--yj-accent-soft) !important;
font-size: 13px;
}
.doctor-daily-th__hint {
margin-left: 4px;
color: var(--yj-muted);
cursor: help;
vertical-align: -2px;
font-size: 13px;
transition: color 0.15s;
&:hover {
color: var(--yj-brand);
}
}
}
.filter-surface {