feat:诊所问题优化,气泡卡片优化,修复了导入药品的时候无法打开开方组件并且切换tab的问题

This commit is contained in:
李琦
2026-07-28 14:23:50 +08:00
parent 05885ed405
commit 5506c8917f
5 changed files with 154 additions and 15 deletions

View File

@@ -1,13 +1,29 @@
<script setup>
/**
* 诊所复诊 type11 follow_up_drug 助理用药确认卡
* 展示问题、药品、是否用过、适用症/补充;可一键导入处方单
*/
import { computed } from 'vue';
import { Button } from 'ant-design-vue';
const props = defineProps({
content: {
type: Object,
required: true,
},
/** 是否展示「添加到处方单」(接诊中且有药) */
showAddToRx: {
type: Boolean,
default: false,
},
addToRxLoading: {
type: Boolean,
default: false,
},
});
const emit = defineEmits(['add-to-rx']);
const data = computed(() =>
typeof props.content === 'string'
? (() => {
@@ -30,6 +46,25 @@ const answeredLabel = computed(() => {
const drugs = computed(() =>
Array.isArray(data.value.drugs) ? data.value.drugs : [],
);
/** 适用症文案(有值才展示) */
const illnessInfo = computed(() => {
const v = data.value.illness_info;
return v != null && String(v).trim() ? String(v).trim() : '';
});
/**
* 补充信息:优先独立字段;若 illness_info 已含「;补充:」且无独立字段则不重复展示
*/
const supplementText = computed(() => {
const v = data.value.supplement;
if (v != null && String(v).trim()) return String(v).trim();
return '';
});
const canShowAddBtn = computed(
() => props.showAddToRx && drugs.value.length > 0,
);
</script>
<template>
@@ -63,12 +98,36 @@ const drugs = computed(() =>
<span class="value">{{ answeredLabel }}</span>
</div>
<div v-if="illnessInfo" class="info-block">
<div class="info-block-label">适用症/症状</div>
<div class="info-block-content">{{ illnessInfo }}</div>
</div>
<div v-if="supplementText" class="info-block">
<div class="info-block-label">补充信息</div>
<div class="info-block-content">{{ supplementText }}</div>
</div>
<div
v-else-if="data.answer_status === 'pending'"
v-else-if="!answeredLabel && data.answer_status === 'pending'"
class="pending-tip"
>
待患者在小程序端填写用药信息
</div>
<div v-if="canShowAddBtn" class="add-rx-wrap">
<Button
:loading="addToRxLoading"
block
size="small"
type="primary"
ghost
@click.stop="emit('add-to-rx')"
>
<i class="fas fa-plus-circle mr-1"></i>
添加到处方单
</Button>
</div>
</div>
</template>
@@ -122,7 +181,7 @@ const drugs = computed(() =>
}
.answer-row {
@apply flex items-center justify-between rounded-lg bg-emerald-50 px-3 py-2 text-sm dark:bg-emerald-900/30;
@apply mb-3 flex items-center justify-between rounded-lg bg-emerald-50 px-3 py-2 text-sm dark:bg-emerald-900/30;
}
.answer-row .label {
@@ -133,7 +192,23 @@ const drugs = computed(() =>
@apply font-medium text-emerald-800 dark:text-emerald-300;
}
.info-block {
@apply mb-3 rounded-lg bg-slate-50 px-3 py-2 dark:bg-slate-900/50;
}
.info-block-label {
@apply mb-1 text-xs text-slate-500 dark:text-slate-400;
}
.info-block-content {
@apply text-sm leading-relaxed text-slate-800 dark:text-slate-100;
}
.pending-tip {
@apply rounded-lg border border-dashed border-amber-200 bg-amber-50 px-3 py-2 text-center text-xs text-amber-800 dark:border-amber-700 dark:bg-amber-900/20 dark:text-amber-200;
}
.add-rx-wrap {
@apply mt-3 border-t border-slate-100 pt-3 dark:border-slate-600;
}
</style>

View File

@@ -251,10 +251,15 @@ const canAddRegisterDrugsToRx = computed(() => {
const handleAddRegisterDrugsToPrescription = async () => {
if (registerAddToRxLoading.value) return;
const cardRegisterId = registerCardDisplay.value?.id;
const followUpRegisterId =
isFollowUpDrugAssistant.value && parsedContent.value?.register_id
? parsedContent.value.register_id
: '';
const registerId =
prescriptionStore.currentRegisterId ||
chatStore.currentFriend?.register_id ||
cardRegisterId;
cardRegisterId ||
followUpRegisterId;
if (!registerId) {
antdMessage.warning('请先接诊患者');
return;
@@ -308,6 +313,22 @@ const isFollowUpDrugAssistant = computed(() => {
return !!(pc && typeof pc === 'object' && pc.flow === 'follow_up_drug');
});
/**
* 复诊用药卡「添加到处方单」:有药、非本人发送、当前会话有挂号
* 与挂号卡加方共用 handleAddRegisterDrugsToPrescription
*/
const canAddFollowUpDrugsToRx = computed(() => {
if (!isFollowUpDrugAssistant.value || props.isSent) return false;
const pc = parsedContent.value;
const drugs = pc && Array.isArray(pc.drugs) ? pc.drugs : [];
if (!drugs.length) return false;
return !!(
prescriptionStore.currentRegisterId ||
chatStore.currentFriend?.register_id ||
pc.register_id
);
});
function fetchRegisterCard() {
if (props.message.message_type !== 10) return;
const content = getParsedContent(
@@ -1044,6 +1065,9 @@ const getSexText = (sex) => {
<FollowUpDrugAssistantCard
v-else-if="message.message_type === 11 && isFollowUpDrugAssistant"
:content="parsedContent"
:show-add-to-rx="canAddFollowUpDrugsToRx"
:add-to-rx-loading="registerAddToRxLoading"
@add-to-rx="handleAddRegisterDrugsToPrescription"
/>
<!-- 患者就诊经历卡片 (type=11) -->

View File

@@ -54,7 +54,7 @@ function readStoredTab() {
if (stored === 'price_adjust' || stored === 'input_audit' || stored === 'miniprogram' || stored === 'oa_notify') {
activeKey.value = stored;
}
}
}}
function parseBoolConfig(val: unknown, defaultVal: boolean): boolean {
if (val === undefined || val === null || val === '') return defaultVal;