This commit is contained in:
gr
2026-10-15 11:03:54 +08:00
parent 70ddc1a70a
commit bb28d93cec
64 changed files with 12747 additions and 420 deletions
@@ -25,6 +25,17 @@
</span>
</el-tooltip>
<span v-else class="unserved-badge unserved-muted">从未打卡</span>
<!-- 复诊节点徽标:第 N 诊 · 药尽 MM-DD · 超期 N 天(接口无 revisit_due 字段时不渲染) -->
<el-tooltip
v-if="revisitBadgeLabel"
placement="bottom"
:disabled="!revisitTooltipText"
:content="revisitTooltipText"
>
<span :class="['unserved-badge', 'revisit-badge', revisitBadgeColorClass]">
{{ revisitBadgeLabel }}
</span>
</el-tooltip>
</div>
</div>
@@ -156,6 +167,12 @@ import { diagnosisReadonlyDetail } from '@/api/tcm'
import { getDoctorNotes } from '@/api/patient'
import { formatGender } from '@/utils/diag-display'
import { hasPermission } from '@/utils/perm'
import {
normalizeRevisitDue,
revisitBadgeText,
revisitStateColorClass,
revisitTooltipLines
} from '@/utils/revisitDue'
import PatientInfoCard from './components/PatientInfoCard.vue'
import PatientCaseCard from './components/PatientCaseCard.vue'
import DailyMatrix from './components/DailyMatrix.vue'
@@ -193,6 +210,17 @@ const unservedDays = computed<number | null>(() => {
})
const lastBloodAt = computed<string>(() => detail.value?.last_blood_record_at || '')
/** 复诊节点:readonlyDetail 顶层 revisit_due(兼容挂在 diagnosis 下);字段不存在 → null → 不渲染徽标 */
const revisitDue = computed(() =>
normalizeRevisitDue(detail.value?.revisit_due ?? detail.value?.diagnosis?.revisit_due)
)
const revisitBadgeLabel = computed(() => revisitBadgeText(revisitDue.value))
const revisitBadgeColorClass = computed(() => {
const due = revisitDue.value
return due ? revisitStateColorClass(due.state) : 'unserved-muted'
})
const revisitTooltipText = computed(() => revisitTooltipLines(revisitDue.value).join(';'))
/**
* 「未服务天数」着色规则(与 T3 列表一致):
* null/undefined → 灰;>=7 → 红;3-6 → 橙;<=2 → 绿
@@ -352,6 +380,13 @@ onMounted(fetchDetail)
border-color: #fecaca;
background: rgba(220, 38, 38, 0.08);
}
/* 复诊节点徽标专用:已约 / 已联系 */
&.unserved-blue {
color: #4a5dff;
border-color: #c7d2fe;
background: rgba(74, 93, 255, 0.08);
}
}
.empty-state {