575 lines
12 KiB
Vue
Raw Normal View History

2026-01-20 13:21:50 +08:00
<template>
<view class="message-card" :class="cardTypeClass">
<view class="card-header">
<text class="card-title">{{ title }}</text>
<view v-if="showDetail" class="detail-btn" @click.stop="handleDetail">
<text class="detail-text">详情</text>
<uni-icons type="right" size="14" color="#fff"></uni-icons>
</view>
</view>
<view class="card-content">
<!-- 病情描述类型 -->
<fill-description-card v-if="payload.description === 'PATIENT_FILL_CONSULTATION'" :payload="payload" />
<medicines-card v-else-if="payload.description === 'DOCTOR_WRITE_PRESCRIPTION'" :payload="payload" />
<refill-medicine-card v-else-if="payload.description === 'USER_REFILL_PRESCRIPTION'" :payload="payload" />
<reject-refill-medicine-card v-else-if="payload.description === 'REJECT_REFILL_PRESCRIPTION'"
:payload="payload" />
<!-- 续方申请类型 -->
<template v-if="messageData.messageType === 'refill'">
<view class="refill-detail">
<!-- 诊断信息 -->
<view class="refill-diagnosis">
<text class="label-text">诊断</text>
<text class="content-text">{{ messageData.diagnosis }}</text>
</view>
<!-- 药品信息 -->
<view class="refill-medicines">
<text class="section-title">药品</text>
<!-- 中药处方 -->
<view v-if="messageData.prescriptionType === '中药处方'" class="chinese-medicine-refill">
<text class="medicine-type-title">{{
messageData.prescriptionType
}}</text>
<text class="medicine-description">{{
messageData.prescriptionDesc
}}</text>
</view>
<!-- 西药处方 -->
<view v-else class="western-medicine-refill">
<view v-for="(medicine, index) in messageData.medicines" :key="index" class="medicine-item-refill">
<view class="medicine-info-refill">
<text class="medicine-name-refill">{{ medicine.name }} {{ medicine.spec }}</text>
<text class="medicine-count-refill">{{
medicine.count
}}</text>
</view>
<text class="medicine-usage-refill">{{ medicine.usage }}</text>
</view>
</view>
</view>
</view>
</template>
<!-- 问卷调查类型 -->
<template v-if="messageData.messageType === 'survey'">
<view class="survey-detail">
<!-- 问卷标题和描述 -->
<view class="survey-header">
<view class="survey-info">
<text class="survey-title">{{ messageData.surveyTitle }}</text>
<text class="survey-subtitle">{{
messageData.surveyDescription
}}</text>
</view>
</view>
<!-- 问卷详情 -->
<view class="survey-content">
<view class="survey-item">
<text class="survey-label">问卷名称</text>
<text class="survey-value">{{ messageData.surveyName }}</text>
</view>
<view class="survey-item">
<text class="survey-label">预计用时</text>
<text class="survey-value">{{ messageData.estimatedTime }}</text>
</view>
<view class="survey-item" v-if="messageData.reward">
<text class="survey-label">完成奖励</text>
<text class="survey-value reward-text">{{
messageData.reward
}}</text>
</view>
</view>
<!-- 问卷说明 -->
<view class="survey-note" v-if="messageData.note">
<text class="note-text">{{ messageData.note }}</text>
</view>
</view>
</template>
<!-- 立即购买按钮 -->
<view class="card-footer" @click="handlePurchase" v-if="messageData.messageType === 'prescription'">
<text class="view-all-text">立即购药</text>
</view>
<!-- 续方申请按钮 -->
<view class="card-footer" @click="handleBuy" v-if="messageData.messageType === 'refill'">
<text class="view-all-text">申请再次购买</text>
</view>
<!-- 问卷调查按钮 -->
<view class="card-footer" @click="handleBuy" v-if="messageData.messageType === 'survey'">
<text class="view-all-text">去填写</text>
</view>
</view>
</view>
</template>
<script setup>
import { computed } from "vue";
import { sendSystemMessage } from "@/api/corp/im.js";
import fillDescriptionCard from "./fill-description-card.vue";
import medicinesCard from "./medicines-card.vue";
import refillMedicineCard from "./refill-medicine-card.vue";
import rejectRefillMedicineCard from "./reject-refill-medicine-card.vue";
const props = defineProps({
payload: {
type: Object,
required: true,
},
messageData: {
type: Object,
required: true,
},
flow: {
type: String,
default: 'out'
},
});
const emit = defineEmits(["viewDetail"]);
const CardTitle = {
PATIENT_FILL_CONSULTATION: "患者病情描述",
USER_REFILL_PRESCRIPTION: '续方申请',
DOCTOR_WRITE_PRESCRIPTION: "医嘱",
REJECT_REFILL_PRESCRIPTION: '续方失败',
symptom: "病情描述",
prescription: "处方单",
refill: "续方申请",
survey: "问卷调查",
};
// const showDetailBtn = computed(() => {
// return ['DOCTOR_WRITE_PRESCRIPTION'].includes(props.payload.description)
// });
// 计算卡片标题
const title = computed(() => {
return CardTitle[props.payload.description] || CardTitle[props.messageData.messageType] || "消息卡片";
});
const extension = computed(() => {
try {
return JSON.parse(props.payload.extension);
} catch (e) { }
return {}
})
const showDetail = computed(() => {
if (props.payload.description === 'DOCTOR_WRITE_PRESCRIPTION' && extension.value.id) {
return true
}
return false
})
function handleDetail() {
if (props.payload.description === 'DOCTOR_WRITE_PRESCRIPTION' && extension.value.id) {
uni.navigateTo({
url: `/pages-home/prescription/detail?id=${extension.value.id}`
})
}
}
// 是否有附件
const hasAttachment = computed(() => {
return props.messageData.images && props.messageData.images.length > 0;
});
// 附件数量
const number = computed(() => {
return `${props.messageData.images.length}`;
});
// 计算卡片样式类
const cardTypeClass = computed(() => {
return `card-${props.messageData.messageType}`;
});
// 处理查看详情点击
const handleBuy = () => {
emit("viewDetail", props.messageData);
};
// 处理立即购买点击
const handlePurchase = () => {
console.log('购买成功', props.messageData);
const groupID = props.messageData.conversationID.replace('GROUP', '');
sendSystemMessage(groupID, 'purchased');
};
</script>
<style lang="scss">
.message-card {
border-radius: 4rpx;
overflow: hidden;
}
.card-symptom,
.card-prescription,
.card-refill,
.card-survey {
background-color: $primary-color;
}
.card-header {
padding: 12rpx 12rpx 0;
display: flex;
justify-content: space-between;
align-items: center;
}
.card-title {
color: white;
font-size: 28rpx;
font-weight: 600;
}
.detail-btn {
display: flex;
align-items: center;
gap: 4rpx;
padding: 4rpx 8rpx;
border-radius: 4rpx;
transition: all 0.3s;
}
.detail-text {
color: white;
font-size: 22rpx;
}
.detail-arrow {
color: white;
font-size: 22rpx;
font-weight: 600;
}
.card-content {
margin: 10rpx;
padding: 12rpx 16rpx 16rpx;
background-color: white;
border-radius: 4rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
}
.patient-info {
margin-bottom: 12rpx;
}
.label-text {
color: #666;
font-size: 24rpx;
}
.content-text {
color: #333;
font-size: 24rpx;
line-height: 1.5;
display: -webkit-box;
-webkit-line-clamp: 3;
line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
/* 医院就诊信息样式 */
.hospital-visit-info {
margin-top: 8rpx;
}
.visit-text {
color: #666;
font-size: 13rpx;
}
/* 处方单样式 */
.prescription-detail {
margin-bottom: 12rpx;
}
.prescription-section {
width: 420rpx;
margin-bottom: 8rpx;
margin-top: 4rpx;
}
.section-title {
color: #666;
font-size: 24rpx;
display: block;
margin-bottom: 8rpx;
}
.medicine-list {
display: flex;
flex-direction: column;
gap: 6rpx;
}
.medicine-item-wrapper {
background-color: #f8f9fa;
border-radius: 6rpx;
padding: 8rpx 12rpx;
}
.medicine-item {
display: flex;
align-items: center;
justify-content: space-between;
}
.medicine-usage {
margin-top: 4rpx;
padding-top: 4rpx;
border-top: 1px solid #e9ecef;
}
.medicine-name {
color: #333;
font-size: 24rpx;
font-weight: 500;
flex: 1;
margin-right: 8rpx;
}
.medicine-spec {
color: #666;
font-size: 24rpx;
flex: 1;
text-align: center;
}
.medicine-count {
color: #333;
font-size: 24rpx;
font-weight: 600;
min-width: 30rpx;
text-align: right;
}
.usage-text {
color: #666;
font-size: 24rpx;
line-height: 1.4;
}
/* 中药处方样式 */
.tcm-prescription {
background-color: #f8f9fa;
border-radius: 6rpx;
padding: 12rpx;
}
.tcm-label {
color: #333;
font-size: 24rpx;
font-weight: 600;
display: block;
margin-bottom: 8rpx;
}
.card-footer {
background-color: $primary-color;
border-radius: 4rpx;
padding: 8rpx 16rpx;
text-align: center;
margin: 0 -4rpx;
transition: all 0.3s;
}
.card-footer:active {
background-color: $primary-color;
transform: scale(0.98);
}
.view-all-text {
color: white;
font-size: 24rpx;
font-weight: 500;
}
/* 续方申请样式 */
.refill-detail {
margin-bottom: 12rpx;
width: 420rpx;
max-width: 95vw;
}
.refill-patient-info {
margin-bottom: 12rpx;
padding-bottom: 8rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.refill-diagnosis {
margin-bottom: 12rpx;
display: flex;
align-items: flex-start;
}
.refill-diagnosis .label-text {
min-width: 50rpx;
margin-right: 8rpx;
}
.refill-medicines {
margin-bottom: 12rpx;
}
.refill-medicines .section-title {
margin-bottom: 8rpx;
}
/* 中药续方样式 */
.chinese-medicine-refill {
background-color: #f8f9fa;
border-radius: 6rpx;
padding: 12rpx;
}
.medicine-type-title {
color: #333;
font-size: 24rpx;
font-weight: 600;
display: block;
margin-bottom: 8rpx;
}
.medicine-description {
color: #666;
font-size: 24rpx;
line-height: 1.4;
}
/* 西药续方样式 */
.western-medicine-refill {
display: flex;
flex-direction: column;
gap: 8rpx;
}
.medicine-item-refill {
background-color: #f8f9fa;
border-radius: 6rpx;
padding: 10rpx 12rpx;
}
.medicine-info-refill {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 4rpx;
}
.medicine-name-refill {
color: #333;
font-size: 24rpx;
font-weight: 500;
flex: 1;
margin-right: 8rpx;
}
.medicine-count-refill {
color: #333;
font-size: 24rpx;
font-weight: 600;
min-width: 30rpx;
text-align: right;
}
.medicine-usage-refill {
color: #666;
font-size: 22rpx;
line-height: 1.3;
}
/* 问卷调查样式 */
.survey-detail {
margin-bottom: 12rpx;
width: 420rpx;
max-width: 90vw;
}
.survey-header {
display: flex;
align-items: flex-start;
margin-bottom: 16rpx;
padding-bottom: 12rpx;
border-bottom: 1rpx solid #f0f0f0;
}
.survey-info {
flex: 1;
}
.survey-title {
color: #333;
font-size: 26rpx;
font-weight: 600;
display: block;
margin-bottom: 4rpx;
line-height: 1.3;
}
.survey-subtitle {
color: #666;
font-size: 24rpx;
line-height: 1.4;
}
.survey-content {
margin-bottom: 12rpx;
}
.survey-item {
display: flex;
align-items: center;
margin-bottom: 8rpx;
}
.survey-item:last-child {
margin-bottom: 0;
}
.survey-label {
color: #666;
font-size: 24rpx;
min-width: 80rpx;
margin-right: 8rpx;
}
.survey-value {
color: #333;
font-size: 24rpx;
flex: 1;
}
.reward-text {
color: #ff6b35;
font-weight: 600;
}
.survey-note {
background-color: #f8f9fa;
border-radius: 6rpx;
padding: 10rpx 12rpx;
margin-top: 12rpx;
}
.note-text {
color: #666;
font-size: 23rpx;
line-height: 1.4;
}
</style>