转诊方功能优化

This commit is contained in:
李琦
2026-02-07 13:02:15 +08:00
parent 184ff88bd2
commit 800aabf5ee
6 changed files with 72 additions and 14 deletions

View File

@@ -50,4 +50,12 @@ export async function getTransferQuestionsApi() {
*/
export async function submitTransferQuestionsApi(params) {
return await post('/transfer-prescription/submit-questions', params, 3)
}
/**
* 获取转诊助理配置(移动端)
* @returns {Promise<*>}
*/
export async function getTransferAssistantConfigApi() {
return await get('/transfer-assistant-config/get-config', {}, 3)
}

View File

@@ -96,7 +96,7 @@
<view class="chat-footer safe-area-inset-bottom" :style="{ bottom: keyboardHeight + 'px' }">
<view v-if="isConsultationEnded" class="consultation-ended-notice">
<u-icon name="checkmark-circle-fill" size="18" color="#999"></u-icon>
<text>本次问诊已结束</text>
<text>本次问诊未开始或已结束</text>
</view>
<template v-else>
@@ -161,6 +161,7 @@ import MessageBubble from './components/MessageBubble.vue'; // 引入组件
import { webSocketManager } from '@/utils/ws/websocket';
import { ChatManager } from '@/store/chat/chat.js';
import {getChatRegisterInfoApi, sendToUserApi, upLoadChatFileApi, getDoctorInfoApi, getRoomStatusApi} from "@/request/api/im";
import {getTransferAssistantConfigApi} from "@/request/api/transferPrescription";
import { checkDev } from '@/utils/utils';
// 根据环境获取上传URL
@@ -192,6 +193,7 @@ export default {
doctorId: 'doctor-1',
doctorAvatar: 'https://xiaokang88.oss-cn-hangzhou.aliyuncs.com/xk_upload_20250108/29bdb9560340373bb3096394a845afa5.jpg',
userAvatar: 'https://xiaokang88.oss-cn-hangzhou.aliyuncs.com/xk_upload_20250108/29bdb9560340373bb3096394a845afa5.jpg',
assistantConfig: { name: '医生助理', avatar: '' }, // 助理配置信息
messages: [],
newMessage: '',
voiceInputActive: false, // 默认文字输入
@@ -256,6 +258,9 @@ export default {
// 无论是否有nickName都需要获取医生详情信息职称、医院、擅长
this.fetchDoctorInfo(doctorId);
// 加载助理配置信息
this.loadAssistantConfig();
const nickName = this.doctorUserInfo.nick_name;
if (nickName && nickName !== 'undefined' && nickName !== 'null') {
uni.setNavigationBarTitle({ title: `${nickName}医生的对话` });
@@ -328,6 +333,17 @@ export default {
if (this.isMsgMine(msg)) {
return this.userAvatar;
}
// 如果是医生助理发送的消息
const senderId = msg.sender_user_id || msg.senderId;
if (senderId === 'doctor_assistant') {
const avatar = this.assistantConfig.avatar || 'https://xiaokang88.oss-cn-hangzhou.aliyuncs.com/xk_upload_20250108/29bdb9560340373bb3096394a845afa5.jpg';
try {
return decodeURIComponent(avatar);
} catch (e) {
return avatar;
}
}
// 其他情况(医生发送的消息)
let avatar = this.doctorUserInfo.avatar || this.doctorAvatar || 'https://xiaokang88.oss-cn-hangzhou.aliyuncs.com/xk_upload_20250108/29bdb9560340373bb3096394a845afa5.jpg';
try {
return decodeURIComponent(avatar);
@@ -335,6 +351,23 @@ export default {
return avatar;
}
},
// 加载助理配置信息
async loadAssistantConfig() {
try {
const res = await getTransferAssistantConfigApi();
if (res.data && res.data.code === 0) {
const config = res.data.result || {};
this.assistantConfig = {
name: config.name || '医生助理',
avatar: config.avatar || ''
};
}
} catch (error) {
console.error('加载助理配置失败:', error);
// 失败不影响继续,使用默认值
}
},
// === 音频播放逻辑 ===
playAudio(msg) {

View File

@@ -2,7 +2,7 @@
<view class="transfer-message-bubble">
<view class="bubble-header">
<view class="header-icon">
<text class="iconfont icon-zhuanzhen"></text>
<text class="iconfont icon-mendian"></text>
</view>
<view class="header-title">转诊消息</view>
</view>

View File

@@ -2,7 +2,7 @@
<view class="transfer-card">
<view class="card-header">
<view class="header-icon">
<text class="iconfont icon-zhuanzhen"></text>
<text class="iconfont icon-mendian"></text>
</view>
<view class="header-title">转诊处方</view>
<view class="status-tag" :class="statusClass">
@@ -13,7 +13,7 @@
<view class="card-body">
<view class="info-row" v-if="transferData.transfer_store">
<view class="info-icon">
<text class="iconfont icon-yiyuan"></text>
<text class="iconfont icon-mendian"></text>
</view>
<view class="info-content">
<view class="info-label">转诊诊所</view>
@@ -23,7 +23,7 @@
<view class="info-row" v-if="transferData.delegate_store">
<view class="info-icon">
<text class="iconfont icon-zhensuo"></text>
<text class="iconfont icon-mendian"></text>
</view>
<view class="info-content">
<view class="info-label">委托诊所</view>

View File

@@ -21,12 +21,12 @@
<scroll-view class="messages-scroll" scroll-y="true" :scroll-into-view="scrollIntoView" scroll-with-animation>
<view class="messages-container">
<!-- 按时间顺序渲染消息 -->
<template v-for="(message, index) in displayedMessages" :key="message.id || index">
<view v-for="(message, index) in displayedMessages" :key="message.id || index">
<!-- 欢迎消息 -->
<view v-if="message.type === 'welcome'" class="message-item other">
<image class="avatar" :src="assistantAvatar" mode="aspectFill"></image>
<view class="message-content">
<view class="assistant-label">医生助理</view>
<view class="assistant-label">{{ assistantName }}</view>
<view class="message-bubble">
<text>您好! 我是医生助理, 已收到您的用药申请:{{ prescriptionInfo }}, 为了帮助医生判断准确, 请按照您的真实情况回答以下问题</text>
</view>
@@ -37,7 +37,7 @@
<view v-else-if="message.type === 'question'" class="message-item other" :id="'question-' + message.questionId">
<image class="avatar" :src="assistantAvatar" mode="aspectFill"></image>
<view class="message-content">
<view class="assistant-label">医生助理</view>
<view class="assistant-label">{{ assistantName }}</view>
<view class="message-bubble">
<text>{{ message.content }}</text>
</view>
@@ -58,13 +58,13 @@
<view v-else-if="message.type === 'waiting'" class="message-item other">
<image class="avatar" :src="assistantAvatar" mode="aspectFill"></image>
<view class="message-content">
<view class="assistant-label">医生助理</view>
<view class="assistant-label">{{ assistantName }}</view>
<view class="message-bubble">
<text>请稍等, 正在为您转接医生进行复诊开方...</text>
</view>
</view>
</view>
</template>
</view>
<!-- 底部锚点 -->
<view id="bottom-anchor" style="height: 1px;"></view>
@@ -91,7 +91,8 @@
import {
getTransferPrescriptionDetailApi,
getTransferQuestionsApi,
submitTransferQuestionsApi
submitTransferQuestionsApi,
getTransferAssistantConfigApi
} from '@/request/api/transferPrescription.js'
export default {
@@ -107,7 +108,8 @@ export default {
showWaiting: false, // 显示等待转接消息
isSubmitting: false, // 是否正在提交
scrollIntoView: '', // 滚动到指定位置
assistantAvatar: '/static/images/assistant-avatar.png', // 医生助理头像(需要替换为实际路径
assistantAvatar: '/static/images/assistant-avatar.png', // 医生助理头像(默认值,会从后端获取
assistantName: '医生助理', // 医生助理名字(默认值,会从后端获取)
userAvatar: '/static/images/user-avatar.png', // 用户头像(需要替换为实际路径)
prescriptionInfo: '炒黄芪等共2味' // 处方信息(可以从转诊详情中获取)
}
@@ -182,9 +184,10 @@ export default {
return
}
// 加载转诊详情问题列表
// 加载转诊详情问题列表和助理配置
this.loadTransferDetail()
this.loadQuestions()
this.loadAssistantConfig()
},
methods: {
// 加载转诊详情(获取药品信息)
@@ -265,6 +268,20 @@ export default {
if (drugNames.length === 1) return drugNames[0]
return drugNames[0] + '等共' + drugNames.length + '味'
},
// 加载助理配置
async loadAssistantConfig() {
try {
const res = await getTransferAssistantConfigApi()
if (res.data && res.data.code === 0) {
const config = res.data.result || {}
this.assistantName = config.name || '医生助理'
this.assistantAvatar = config.avatar || '/static/images/assistant-avatar.png'
}
} catch (error) {
console.error('加载助理配置失败:', error)
// 失败不影响继续,使用默认值
}
},
// 加载问题列表
async loadQuestions() {
try {

View File

@@ -18,7 +18,7 @@
<view class="card">
<view class="card-header">
<view class="header-icon">
<text class="iconfont icon-zhuanzhen"></text>
<text class="iconfont icon-mendian"></text>
</view>
<view class="header-title">转诊处方</view>
<!-- 修复不直接调用方法而是使用预处理好的属性 -->