ykt-team-wxapp/pages/message/components/system-message.vue

158 lines
3.6 KiB
Vue
Raw Normal View History

2026-01-28 13:38:05 +08:00
<template>
<!-- <view v-if="notifyText" class="notify-bar">
<view class="notify-line"></view>
<view class="notify-text">{{ notifyText }}</view>
<view class="notify-line"></view>
</view> -->
<view class="system-message">
<view class="system-text">{{ text }}</view>
</view>
</template>
<script setup>
import { computed } from 'vue';
const props = defineProps({
message: {
type: Object,
default: () => ({})
}
});
const payload = computed(() => props.message?.payload || {});
// 解析系统消息内容
const systemMessageData = computed(() => {
try {
// 尝试从 payload.data 解析系统消息
if (payload.value.data) {
const data = typeof payload.value.data === 'string'
? JSON.parse(payload.value.data)
: payload.value.data;
if (data.type === 'system_message') {
return data;
}
}
} catch (e) {
console.error('解析系统消息失败:', e);
}
return null;
});
// 解析扩展信息
const extension = computed(() => {
try {
if (payload.value.extension) {
return typeof payload.value.extension === 'string'
? JSON.parse(payload.value.extension)
: payload.value.extension;
}
} catch (e) {
console.error('解析扩展信息失败:', e);
}
return {};
});
// 显示的文本内容
const text = computed(() => {
// 优先从系统消息数据中获取文本
if (systemMessageData.value?.text) {
return systemMessageData.value.text;
}
// 根据消息类型返回默认文本
if (systemMessageData.value?.messageType) {
const messageType = systemMessageData.value.messageType;
switch (messageType) {
case 'consult_pending':
return '患者已发起咨询申请,请及时接诊';
case 'consult_accepted':
return '医生已接诊';
case 'consult_rejected':
return '医生暂时无法接诊';
case 'consult_ended':
return '问诊已结束';
case 'consult_timeout':
return '问诊已超时';
default:
return systemMessageData.value.content || '[系统消息]';
}
}
// 兼容旧格式:从 extension 中获取
if (extension.value.patient) {
return extension.value.patient;
}
// 兼容旧格式:直接从 payload.data 获取
if (payload.value.data && typeof payload.value.data === 'string') {
// 如果 data 不是 JSON 格式,直接显示
try {
JSON.parse(payload.value.data);
} catch {
return payload.value.data;
}
}
return '[系统消息]';
});
// 通知文本(红色提示)
const notifyText = computed(() => {
// 从扩展信息中获取通知文本
if (extension.value.notifyText) {
return extension.value.notifyText;
}
// 根据系统消息类型显示不同的通知
if (systemMessageData.value) {
const messageType = systemMessageData.value.messageType;
switch (messageType) {
case 'consult_pending':
return '待接诊';
case 'consult_rejected':
return '已拒绝';
case 'consult_timeout':
return '已超时';
case 'consult_accepted':
return '已接诊';
case 'consult_ended':
return '已结束';
default:
return '';
}
}
return '';
});
</script>
<style scoped lang="scss">
@import "../chat.scss";
.notify-bar {
display: flex;
align-items: center;
padding: 0 30rpx;
}
.notify-line {
flex-grow: 1;
min-width: 30rpx;
height: 1px;
background: #ddd;
}
.notify-text {
margin: 0 20rpx;
font-size: 24rpx;
color: red;
white-space: nowrap;
flex-shrink: 0;
max-width: 80%;
text-overflow: ellipsis;
overflow: hidden;
}
</style>