no message

This commit is contained in:
wangdongbo 2026-02-02 13:27:48 +08:00
parent a7d3eeae3a
commit 3ccdc954c2
5 changed files with 394 additions and 395 deletions

View File

@ -1,214 +1,48 @@
<template>
<view class="medical-case-form">
<view class="form-container">
<!-- 门诊病历 -->
<template v-if="caseType === 'outpatient'">
<view class="form-item required">
<view class="item-label">就诊机构</view>
<input
class="item-input"
v-model="formData.hospital"
placeholder="暂无"
:disabled="!isEditing"
/>
</view>
<view class="form-item required">
<view class="item-label">就诊日期</view>
<picker
mode="date"
:value="formData.visitTime"
@change="onDateChange('visitTime', $event)"
:disabled="!isEditing"
>
<view class="picker-value">
{{ formData.visitTime || '暂无' }}
</view>
</picker>
</view>
<view class="form-item required">
<view class="item-label">门诊诊断</view>
<textarea
class="item-textarea"
v-model="formData.diagnosisName"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
<view class="form-item">
<view class="item-label">治疗方案</view>
<textarea
class="item-textarea"
v-model="formData.treatmentPlan"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
</template>
<!-- 住院病历 -->
<template v-if="caseType === 'inpatient'">
<view class="form-item required">
<view class="item-label">就诊机构</view>
<input
class="item-input"
v-model="formData.hospital"
placeholder="暂无"
:disabled="!isEditing"
/>
</view>
<view class="form-item required">
<view class="item-label">入院日期</view>
<picker
mode="date"
:value="formData.inhosDate"
@change="onDateChange('inhosDate', $event)"
:disabled="!isEditing"
>
<view class="picker-value">
{{ formData.inhosDate || '暂无' }}
</view>
</picker>
</view>
<view class="form-item required">
<view class="item-label">住院主诊断</view>
<textarea
class="item-textarea"
v-model="formData.diagnosisName"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
<view class="form-item">
<view class="item-label">手术名称</view>
<textarea
class="item-textarea"
v-model="formData.operation"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
<view class="form-item">
<view class="item-label">手术日期</view>
<picker
mode="date"
:value="formData.operationDate"
@change="onDateChange('operationDate', $event)"
:disabled="!isEditing"
>
<view class="picker-value">
{{ formData.operationDate || '暂无' }}
</view>
</picker>
</view>
<view class="form-item">
<view class="item-label">治疗方案</view>
<textarea
class="item-textarea"
v-model="formData.treatmentPlan"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
</template>
<!-- 体检记录 -->
<template v-if="caseType === 'physicalExam'">
<view class="form-item required">
<view class="item-label">就诊机构</view>
<input
class="item-input"
v-model="formData.hospital"
placeholder="暂无"
:disabled="!isEditing"
/>
</view>
<view class="form-item required">
<view class="item-label">体检日期</view>
<picker
mode="date"
:value="formData.inspectTime"
@change="onDateChange('inspectTime', $event)"
:disabled="!isEditing"
>
<view class="picker-value">
{{ formData.inspectTime || '暂无' }}
</view>
</picker>
</view>
<view class="form-item">
<view class="item-label">体检小结</view>
<textarea
class="item-textarea"
v-model="formData.inspectSummary"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
<view class="form-item">
<view class="item-label">阳性发现及处理意见</view>
<textarea
class="item-textarea"
v-model="formData.positiveFind"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
</template>
<!-- 预问诊记录 -->
<template v-if="caseType === 'preConsultation'">
<view class="form-item">
<view class="item-label">主诉</view>
<textarea
class="item-textarea"
v-model="formData.chiefComplaint"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
<view class="form-item">
<view class="item-label">现病史</view>
<textarea
class="item-textarea"
v-model="formData.presentIllnessHistory"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
<view class="form-item">
<view class="item-label">既往史</view>
<textarea
class="item-textarea"
v-model="formData.pastMedicalHistory"
placeholder="请输入"
:disabled="!isEditing"
/>
</view>
</template>
<view class="tips-box">
<text class="tips-text">
1门诊住院病历记录生成生成后支持医生在线编辑并保存至档案或者重新生成
</text>
<text class="tips-text">
2若未来集到有效信息则以模板字段中默认项写无内容生成医生可以直接在存字段上进行编辑
</text>
<!-- 动态渲染表单字段 -->
<view
v-for="field in currentFields"
:key="field.key"
class="form-item"
:class="{ required: field.required }"
>
<view class="item-label">{{ field.label }}</view>
<!-- 日期选择器 -->
<picker
v-if="field.type === 'date'"
mode="date"
:value="formData[field.key]"
@change="onDateChange(field.key, $event)"
:disabled="!isEditing"
>
<view class="picker-value">
{{ formData[field.key] || "暂无" }}
</view>
</picker>
<!-- 多行文本 -->
<textarea
v-else-if="field.type === 'textarea'"
class="item-textarea"
v-model="formData[field.key]"
placeholder="请输入"
:disabled="!isEditing"
/>
<!-- 单行文本 -->
<input
v-else
class="item-input"
v-model="formData[field.key]"
placeholder="暂无"
:disabled="!isEditing"
/>
</view>
</view>
<view class="footer-buttons">
<view class="btn-regenerate" @click="handleRegenerate">
<text class="btn-text">重新生成</text>
@ -221,42 +55,212 @@
</template>
<script setup>
import { ref, onMounted } from 'vue';
const caseType = ref('');
import { ref, computed, onMounted } from "vue";
import { storeToRefs } from "pinia";
import useAccountStore from "@/store/account";
import api from "@/utils/api.js";
const caseType = ref("");
const formData = ref({});
const isEditing = ref(true);
const customerId = ref('');
const groupId = ref('');
const customerId = ref("");
const groupId = ref("");
const accountStore = useAccountStore();
const { doctorInfo } = storeToRefs(accountStore);
//
const CASE_TYPE_NAMES = {
outpatient: "门诊病历",
inhospital: "住院病历",
physicalExaminationTemplate: "体检记录",
preConsultation: "预问诊记录",
};
//
const FIELD_LABELS = {
//
visitTime: "就诊日期",
chiefComplaint: "主诉",
medicalHistorySummary: "病史概要",
examination: "检查",
diagnosisName: "门诊诊断",
//
inhosDate: "入院日期",
operation: "手术记录",
operationDate: "手术日期",
treatmentPlan: "治疗方案",
//
inspectTime: "体检日期",
inspectSummary: "体检小结",
positiveFind: "阳性发现及处理意见",
//
presentIllnessHistory: "现病史",
pastMedicalHistory: "既往史",
};
//
const FIELD_CONFIG = {
outpatient: [
{
key: "visitTime",
label: FIELD_LABELS.visitTime,
type: "date",
required: false,
},
{
key: "diagnosisName",
label: FIELD_LABELS.diagnosisName,
type: "textarea",
required: false,
},
{
key: "chiefComplaint",
label: FIELD_LABELS.chiefComplaint,
type: "textarea",
required: false,
},
{
key: "medicalHistorySummary",
label: FIELD_LABELS.medicalHistorySummary,
type: "textarea",
required: false,
},
{
key: "examination",
label: FIELD_LABELS.examination,
type: "textarea",
required: false,
},
{
key: "treatmentPlan",
label: "治疗方案",
type: "textarea",
required: false,
},
],
inhospital: [
{
key: "inhosDate",
label: FIELD_LABELS.inhosDate,
type: "date",
required: false,
},
{
key: "diagnosisName",
label: "住院主诊断",
type: "textarea",
required: false,
},
{
key: "operation",
label: FIELD_LABELS.operation,
type: "textarea",
required: false,
},
{
key: "operationDate",
label: FIELD_LABELS.operationDate,
type: "date",
required: false,
},
{
key: "treatmentPlan",
label: FIELD_LABELS.treatmentPlan,
type: "textarea",
required: false,
},
{
key: "chiefComplaint",
label: FIELD_LABELS.chiefComplaint,
type: "textarea",
required: false,
},
{
key: "medicalHistorySummary",
label: FIELD_LABELS.medicalHistorySummary,
type: "textarea",
required: false,
},
{
key: "examination",
label: FIELD_LABELS.examination,
type: "textarea",
required: false,
},
{
key: "treatmentPlan",
label: "治疗方案",
type: "textarea",
required: false,
},
],
physicalExaminationTemplate: [
{
key: "inspectTime",
label: FIELD_LABELS.inspectTime,
type: "date",
required: false,
},
{
key: "inspectSummary",
label: FIELD_LABELS.inspectSummary,
type: "textarea",
required: false,
},
{
key: "positiveFind",
label: FIELD_LABELS.positiveFind,
type: "textarea",
required: false,
},
],
preConsultation: [
{
key: "chiefComplaint",
label: FIELD_LABELS.chiefComplaint,
type: "textarea",
required: false,
},
{
key: "presentIllnessHistory",
label: FIELD_LABELS.presentIllnessHistory,
type: "textarea",
required: false,
},
{
key: "pastMedicalHistory",
label: FIELD_LABELS.pastMedicalHistory,
type: "textarea",
required: false,
},
],
};
//
const currentFields = computed(() => {
return FIELD_CONFIG[caseType.value] || [];
});
onMounted(() => {
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const options = currentPage.options;
caseType.value = options.caseType || '';
customerId.value = options.customerId || '';
groupId.value = options.groupId || '';
caseType.value = options.caseType || "";
customerId.value = options.patientId || "";
groupId.value = options.groupId || "";
// options
if (options.formData) {
try {
formData.value = JSON.parse(decodeURIComponent(options.formData));
} catch (e) {
console.error('解析表单数据失败:', e);
console.error("解析表单数据失败:", e);
}
}
//
const titles = {
outpatient: '添加门诊病历',
inpatient: '添加住院病历',
physicalExam: '添加体检记录',
preConsultation: '添加预问诊记录'
};
uni.setNavigationBarTitle({
title: titles[caseType.value] || '添加病历'
});
const title = CASE_TYPE_NAMES[caseType.value]
? `添加${CASE_TYPE_NAMES[caseType.value]}`
: "添加病历";
uni.setNavigationBarTitle({ title });
});
const onDateChange = (field, event) => {
@ -265,96 +269,78 @@ const onDateChange = (field, event) => {
const handleRegenerate = () => {
uni.showModal({
title: '提示',
content: '确定要重新生成吗?当前编辑的内容将被覆盖',
title: "提示",
content: "确定要重新生成吗?当前编辑的内容将被覆盖",
success: (res) => {
if (res.confirm) {
//
uni.navigateBack({
success: () => {
uni.$emit('regenerateMedicalCase', {
uni.$emit("regenerateMedicalCase", {
caseType: caseType.value,
customerId: customerId.value,
groupId: groupId.value
groupId: groupId.value,
});
}
},
});
}
}
},
});
};
const handleSave = async () => {
//
const requiredFields = getRequiredFields();
const missingFields = requiredFields.filter(field => !formData.value[field.key]);
const missingFields = requiredFields.filter(
(field) => !formData.value[field.key]
);
if (missingFields.length > 0) {
uni.showToast({
title: `请填写${missingFields[0].label}`,
icon: 'none'
icon: "none",
});
return;
}
try {
uni.showLoading({ title: '保存中...' });
//
const api = (await import('@/utils/api.js')).default;
const result = await api('addMedicalRecord', {
customerId: customerId.value,
caseType: caseType.value,
...formData.value
uni.showLoading({ title: "保存中..." });
const result = await api("addMedicalRecord", {
medicalType: caseType.value,
memberId: customerId.value,
creator: doctorInfo.value.userid,
...formData.value,
});
uni.hideLoading();
if (result.success) {
uni.showToast({
title: '保存成功',
icon: 'success'
title: "保存成功",
icon: "success",
});
setTimeout(() => {
uni.navigateBack();
}, 1500);
} else {
uni.showToast({
title: result.message || '保存失败',
icon: 'none'
title: result.message || "保存失败",
icon: "none",
});
}
} catch (error) {
uni.hideLoading();
console.error('保存病历失败:', error);
console.error("保存病历失败:", error);
uni.showToast({
title: '保存失败,请重试',
icon: 'none'
title: "保存失败,请重试",
icon: "none",
});
}
};
const getRequiredFields = () => {
const fieldsMap = {
outpatient: [
{ key: 'hospital', label: '就诊机构' },
{ key: 'visitTime', label: '就诊日期' },
{ key: 'diagnosisName', label: '门诊诊断' }
],
inpatient: [
{ key: 'hospital', label: '就诊机构' },
{ key: 'inhosDate', label: '入院日期' },
{ key: 'diagnosisName', label: '住院主诊断' }
],
physicalExam: [
{ key: 'hospital', label: '就诊机构' },
{ key: 'inspectTime', label: '体检日期' }
],
preConsultation: []
};
return fieldsMap[caseType.value] || [];
return currentFields.value.filter((field) => field.required);
};
</script>
@ -363,26 +349,26 @@ const getRequiredFields = () => {
min-height: 100vh;
background-color: #f5f5f5;
padding-bottom: 120rpx;
.form-container {
background-color: #ffffff;
padding: 32rpx;
.form-item {
margin-bottom: 32rpx;
&.required .item-label::before {
content: '*';
content: "*";
color: #ff4d4f;
margin-right: 8rpx;
}
.item-label {
font-size: 28rpx;
color: #333333;
margin-bottom: 16rpx;
}
.item-input,
.picker-value {
width: 100%;
@ -392,64 +378,65 @@ const getRequiredFields = () => {
border-radius: 8rpx;
font-size: 28rpx;
color: #333333;
&[disabled] {
color: #999999;
}
}
.picker-value {
display: flex;
align-items: center;
color: #999999;
}
.item-textarea {
width: 100%;
min-height: 160rpx;
min-height: 100rpx;
padding: 20rpx 24rpx;
background-color: #f8f9fa;
border-radius: 8rpx;
font-size: 28rpx;
color: #333333;
height: 100px;
&[disabled] {
color: #999999;
}
}
}
.tips-box {
margin-top: 32rpx;
padding: 24rpx;
background-color: #fffbe6;
border-radius: 8rpx;
.tips-text {
display: block;
font-size: 24rpx;
color: #666666;
line-height: 1.6;
margin-bottom: 8rpx;
&:last-child {
margin-bottom: 0;
}
}
}
}
.footer-buttons {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 100;
display: flex;
gap: 24rpx;
padding: 24rpx 32rpx;
background-color: #ffffff;
box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.08);
.btn-regenerate,
.btn-save {
flex: 1;
@ -458,25 +445,25 @@ const getRequiredFields = () => {
align-items: center;
justify-content: center;
border-radius: 44rpx;
.btn-text {
font-size: 32rpx;
font-weight: 500;
}
}
.btn-regenerate {
background-color: #ffffff;
border: 2rpx solid #1890ff;
.btn-text {
color: #1890ff;
}
}
.btn-save {
background-color: #1890ff;
.btn-text {
color: #ffffff;
}

View File

@ -44,6 +44,10 @@ const props = defineProps({
type: String,
default: "",
},
patientId: {
type: String,
default: "",
},
corpId: {
type: String,
default: "",
@ -333,12 +337,15 @@ const handleRegenerateFromProgress = (data) => {
//
const handleNextFromProgress = (data) => {
//
const extractedData = data.data?.extractedData || {};
//
uni.navigateTo({
url: `/pages/case/medical-case-form?caseType=${data.caseType}&customerId=${
props.customerId || props.patientAccountId
url: `/pages/case/medical-case-form?caseType=${data.caseType}&patientId=${
props.patientId
}&groupId=${props.groupId}&formData=${encodeURIComponent(
JSON.stringify(data.data?.extractedData || {})
JSON.stringify(extractedData)
)}`,
});
};

View File

@ -4,29 +4,32 @@
<view class="close-btn" @click="close">
<text class="close-icon"></text>
</view>
<view class="progress-content">
<view class="progress-title">{{ progressTitle }}</view>
<view class="progress-bar-wrapper">
<view class="progress-bar">
<view class="progress-fill" :style="{ width: progress + '%' }"></view>
<view
class="progress-fill"
:style="{ width: progress + '%' }"
></view>
</view>
<text class="progress-text">{{ progress }}%</text>
</view>
<view class="detected-info">
<view class="detected-info">
<text class="detected-title">检测到以下{{ caseTypeName }}信息</text>
<view class="info-list">
<view
v-for="(item, index) in detectedInfo"
:key="index"
<view
v-for="(item, index) in detectedInfo"
:key="index"
class="info-item"
:class="{ 'fade-in': item.animated }"
>
<text class="check-icon"></text>
<text
class="info-text"
<text
class="info-text"
:class="{ 'empty-value': item.value === '暂无' }"
>
{{ item.label }}{{ item.value }}
@ -34,11 +37,11 @@
</view>
</view>
</view>
<view v-if="isGenerating" class="generating-text">
<text class="dot-animation">正在生成结构化{{ caseTypeName }}</text>
</view>
<!-- 完成后的操作按钮 -->
<view v-if="isCompleted" class="action-buttons">
<view class="action-button secondary" @click="handleRegenerate">
@ -54,48 +57,47 @@
</template>
<script setup>
import { ref, computed } from 'vue';
import { ref, computed } from "vue";
const emit = defineEmits(['regenerate', 'next']);
const emit = defineEmits(["regenerate", "next"]);
const popup = ref(null);
const progress = ref(0);
const detectedInfo = ref([]);
const isGenerating = ref(false);
const isCompleted = ref(false);
const caseType = ref('');
const caseType = ref("");
const finalData = ref(null);
const CASE_TYPE_NAMES = {
outpatient: '门诊病历',
inpatient: '住院病历',
physicalExam: '体检记录',
preConsultation: '预问诊记录'
outpatient: "门诊病历",
inhospital: "住院病历",
physicalExaminationTemplate: "体检记录",
preConsultation: "预问诊记录",
};
const FIELD_LABELS = {
//
visitTime: '就诊日期',
chiefComplaint: '主诉',
medicalHistorySummary: '病史概要',
examination: '检查',
diagnosisName: '门诊诊断',
visitTime: "就诊日期",
chiefComplaint: "主诉",
medicalHistorySummary: "病史概要",
examination: "检查",
diagnosisName: "门诊诊断",
//
inhosDate: '入院日期',
operation: '手术记录',
operationDate: '手术日期',
treatmentPlan: '术后病程',
outhosAdvice: '出院医嘱',
inhosDate: "入院日期",
operation: "手术名称",
operationDate: "手术日期",
treatmentPlan: "治疗方案",
//
inspectTime: '体检日期',
inspectSummary: '体检小结',
positiveFind: '阳性发现及处理意见',
inspectTime: "体检日期",
inspectSummary: "体检小结",
positiveFind: "阳性发现及处理意见",
//
presentIllnessHistory: '现病史',
pastMedicalHistory: '既往史'
presentIllnessHistory: "现病史",
pastMedicalHistory: "既往史",
};
const caseTypeName = computed(() => CASE_TYPE_NAMES[caseType.value] || '病历');
const caseTypeName = computed(() => CASE_TYPE_NAMES[caseType.value] || "病历");
const progressTitle = computed(() => {
if (progress.value < 100) {
@ -125,11 +127,11 @@ const updateProgress = (value) => {
const addDetectedInfo = (fieldKey, fieldValue) => {
const label = FIELD_LABELS[fieldKey] || fieldKey;
// ""
const displayValue = (fieldValue && fieldValue.trim()) ? fieldValue : '暂无';
const displayValue = fieldValue && fieldValue.trim() ? fieldValue : "暂无";
detectedInfo.value.push({
label,
value: displayValue,
animated: true
animated: true,
});
};
@ -151,14 +153,14 @@ const reset = () => {
};
const handleRegenerate = () => {
emit('regenerate', { caseType: caseType.value });
emit("regenerate", { caseType: caseType.value });
close();
};
const handleNext = () => {
emit('next', {
emit("next", {
caseType: caseType.value,
data: finalData.value
data: finalData.value,
});
close();
};
@ -170,7 +172,7 @@ defineExpose({
addDetectedInfo,
setGenerating,
setCompleted,
reset
reset,
});
</script>
@ -183,7 +185,7 @@ defineExpose({
position: relative;
max-height: 80vh;
overflow-y: auto;
.close-btn {
position: absolute;
top: 20rpx;
@ -194,13 +196,13 @@ defineExpose({
align-items: center;
justify-content: center;
z-index: 10;
.close-icon {
font-size: 40rpx;
color: #999999;
}
}
.progress-content {
.progress-title {
font-size: 32rpx;
@ -209,27 +211,27 @@ defineExpose({
margin-bottom: 32rpx;
text-align: center;
}
.progress-bar-wrapper {
display: flex;
align-items: center;
gap: 16rpx;
margin-bottom: 32rpx;
.progress-bar {
flex: 1;
height: 16rpx;
background-color: #e5e5e5;
border-radius: 8rpx;
overflow: hidden;
.progress-fill {
height: 100%;
background: linear-gradient(90deg, #1890ff 0%, #40a9ff 100%);
transition: width 0.5s ease;
}
}
.progress-text {
font-size: 28rpx;
color: #1890ff;
@ -238,21 +240,21 @@ defineExpose({
text-align: right;
}
}
.detected-info {
margin-bottom: 24rpx;
.detected-title {
font-size: 28rpx;
color: #666666;
display: block;
margin-bottom: 16rpx;
}
.info-list {
max-height: 400rpx;
overflow-y: auto;
.info-item {
display: flex;
align-items: flex-start;
@ -260,25 +262,25 @@ defineExpose({
margin-bottom: 12rpx;
opacity: 0;
transform: translateX(-20rpx);
&.fade-in {
animation: fadeInSlide 0.4s ease forwards;
}
.check-icon {
font-size: 28rpx;
color: #52c41a;
font-weight: bold;
margin-top: 2rpx;
}
.info-text {
flex: 1;
font-size: 26rpx;
color: #333333;
line-height: 1.6;
word-break: break-all;
//
&.empty-value {
color: #999999;
@ -287,24 +289,24 @@ defineExpose({
}
}
}
.generating-text {
font-size: 28rpx;
color: #1890ff;
text-align: center;
padding: 16rpx 0;
.dot-animation::after {
content: '...';
content: "...";
animation: dots 1.5s steps(4, end) infinite;
}
}
.action-buttons {
display: flex;
gap: 16rpx;
margin-top: 32rpx;
.action-button {
flex: 1;
height: 80rpx;
@ -313,34 +315,34 @@ defineExpose({
align-items: center;
justify-content: center;
transition: all 0.3s ease;
&.primary {
background: linear-gradient(90deg, #1890ff 0%, #40a9ff 100%);
.button-text {
color: #ffffff;
}
&:active {
opacity: 0.8;
transform: scale(0.98);
}
}
&.secondary {
background-color: #ffffff;
border: 2rpx solid #d9d9d9;
.button-text {
color: #666666;
}
&:active {
background-color: #f5f5f5;
transform: scale(0.98);
}
}
.button-text {
font-size: 30rpx;
font-weight: 500;
@ -358,17 +360,19 @@ defineExpose({
}
@keyframes dots {
0%, 20% {
content: '';
0%,
20% {
content: "";
}
40% {
content: '.';
content: ".";
}
60% {
content: '..';
content: "..";
}
80%, 100% {
content: '...';
80%,
100% {
content: "...";
}
}
</style>

View File

@ -7,7 +7,7 @@
<text class="close-icon"></text>
</view>
</view>
<view class="case-type-grid">
<view
v-for="type in caseTypes"
@ -23,29 +23,29 @@
</template>
<script setup>
import { ref } from 'vue';
import { ref } from "vue";
const emit = defineEmits(['select']);
const emit = defineEmits(["select"]);
const popup = ref(null);
const caseTypes = [
{
id: 'outpatient',
name: '门诊病历'
id: "outpatient",
name: "门诊病历",
},
{
id: 'inpatient',
name: '住院病历'
id: "inhospital",
name: "住院病历",
},
{
id: 'physicalExam',
name: '体检记录'
id: "physicalExaminationTemplate",
name: "体检记录",
},
{
id: 'preConsultation',
name: '预问诊记录'
}
id: "preConsultation",
name: "预问诊记录",
},
];
const open = () => {
@ -57,13 +57,13 @@ const close = () => {
};
const selectType = (type) => {
emit('select', type);
emit("select", type);
close();
};
defineExpose({
open,
close
close,
});
</script>
@ -73,38 +73,38 @@ defineExpose({
background-color: #ffffff;
border-radius: 24rpx;
padding: 40rpx;
.selector-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 40rpx;
.header-title {
font-size: 36rpx;
font-weight: 600;
color: #333333;
}
.close-btn {
width: 48rpx;
height: 48rpx;
display: flex;
align-items: center;
justify-content: center;
.close-icon {
font-size: 40rpx;
color: #999999;
}
}
}
.case-type-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 24rpx;
.case-type-item {
display: flex;
flex-direction: column;
@ -115,13 +115,13 @@ defineExpose({
border: 2rpx solid #e5e5e5;
border-radius: 16rpx;
transition: all 0.3s ease;
&:active {
background-color: #e8f4ff;
border-color: #1890ff;
transform: scale(0.98);
}
.type-name {
font-size: 30rpx;
color: #333333;

View File

@ -149,6 +149,7 @@
"
:groupId="groupId"
:patientAccountId="chatInfo.userID || ''"
:patientId="patientId"
:corpId="corpId"
@streamText="handleStreamText"
@clearInput="handleClearInput"
@ -1048,4 +1049,4 @@ uni.$on("sendSurvey", async (data) => {
<style scoped lang="scss">
@import "./chat.scss";
</style>
</style>