2025-09-16 16:19:29 +08:00

274 lines
5.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="my-answer-page">
<navBar title="我的意见" />
<scroll-view scroll-y class="content-scroll">
<!-- 文本输入 -->
<view class="card">
<view class="card-title">我的意见 <text class="required">*</text></view>
<view class="textarea-wrap">
<textarea
v-model="form.note"
class="textarea"
:maxlength="300"
placeholder="请依据患者的个人信息、疾病资料及患者所咨询的问题详细解答患者的问题信息仅提问患者及医生可见最多输入300个字"
placeholder-class="ph"
auto-height
/>
</view>
</view>
<!-- 图片上传 -->
<view class="card">
<view class="card-title">相关图片</view>
<view class="sub-tip">可以用部分科普或文献来协助回答问题最多6张</view>
<view class="img-grid">
<view
v-if="imgList.length>0"
v-for="(img, index) in imgList"
:key="index"
class="img-item"
@click="preview(index)"
>
<image :src="docUrl+img" mode="aspectFill" class="img" />
<view class="del" @click.stop="remove(index)">×</view>
</view>
<view v-if="imgList.length < maxImages" class="img-item add" @click="addImages">
<view class="plus"></view>
</view>
</view>
</view>
</scroll-view>
<!-- 底部提交 -->
<view class="bottom-fixed">
<view class="submit-btn" @click="submit">提交</view>
</view>
</view>
</template>
<script setup>
import { ref } from 'vue'
import navBar from '@/components/navBar/navBar.vue'
import api from '@/api/api'
import docUrl from '@/utils/docUrl'
import { onLoad,onShow } from '@dcloudio/uni-app'
const uuid=ref('');
const maxImages = 6;
const imgList = ref([]);
const form = ref({
note: '',
images: []
})
onLoad((options) => {
uuid.value = options.uuid || ''
})
const getInterrogation=()=>{
api.getInterrogation({
uuid:uuid.value
}).then(res=>{
console.log(res)
if(res.code === '200' && res.data) {
let user=uni.getStorageSync('userInfo');
let arr=res.data.AnswerList.filter(item=>{
return user.uuid == item.expert_uuid
})
form.value= arr[0];
imgList.value= form.value.imgs?form.value.imgs.split(','):[];
}
})
}
const updateInterrogationAnswer=()=>{
let imgobj={};
if(imgList.value.length>0){
let count=0;
imgList.value.forEach(item=>{
imgobj['img'+count]=docUrl+item;
})
}
api.updateInterrogationAnswer({
answer_uuid: answer_uuid.value,
note: form.value.note,
imgsBean: imgobj
}).then(res=>{
if(res.code == 200){
uni.showToast({title: '提交成功', icon: 'none'})
uni.navigateBack()
}
})
}
const addInterrogationAnswer=()=>{
api.addInterrogationAnswer({
note: form.value.note,
imgsBean: imgobj
}).then(res=>{
if(res.code == 200){
uni.showToast({title: '提交成功', icon: 'none'})
uni.navigateBack()
}
})
}
onShow(()=>{
getInterrogation()
})
function addImages(){
const remain = maxImages - form.value.images.length
if(remain <= 0){
uni.showToast({title: '最多6张', icon: 'none'})
return
}
uni.chooseImage({
count: remain,
sizeType: ['compressed'],
sourceType: ['album','camera'],
success: (res)=>{
const paths = (res.tempFilePaths || res.tempFiles?.map(f=>f.path) || [])
imgList.value = imgList.value.concat(paths).slice(0, maxImages)
}
})
}
function preview(index){
uni.previewImage({
urls:imgList.map(path=> docUrl + path),
current: index
})
}
function remove(index){
imgList.valuesplice(index, 1)
}
function submit(){
if(!form.value.note.trim()){
uni.showToast({title:'请输入意见', icon:'none'})
return
}
if(answer_uuid.value){
updateInterrogationAnswer()
}else{
addInterrogationAnswer()
}
}
</script>
<style lang="scss" scoped>
.my-answer-page{
background-color: #fff;
height: 100vh;
display: flex;
flex-direction: column;
}
.content-scroll{
flex: 1;
position: fixed;
top: 135rpx;
left: 0;
right: 0;
bottom: 160rpx;
padding: 24rpx 24rpx 0;
box-sizing: border-box;
}
.card{
background: #fff;
border-radius: 16rpx;
padding: 24rpx;
margin-bottom: 24rpx;
}
.card-title{
font-size: 32rpx;
color: #8B2316;
font-weight: 500;
margin-bottom: 16rpx;
}
.required{ color: #ff4d4f; }
.textarea-wrap{
position: relative;
background: #f7f7f7;
border-radius: 12rpx;
padding: 16rpx 88rpx 16rpx 16rpx;
}
.textarea{
min-height: 180rpx;
width: 100%;
font-size: 28rpx;
color: #333;
}
.ph{ color:#999; }
.voice-btn{
position: absolute;
right: 16rpx;
bottom: 16rpx;
width: 64rpx;
height: 64rpx;
border-radius: 32rpx;
background: #b90f0f;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
}
.sub-tip{
font-size: 26rpx;
color: #999;
margin-bottom: 16rpx;
}
.img-grid{
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16rpx;
}
.img-item{
position: relative;
width:150rpx;
height: 150rpx;
border-radius: 12rpx;
overflow: hidden;
background: #f0f0f0;
}
.img{ width: 100%; height: 100%; }
.add{ display:flex; align-items:center; justify-content:center; }
.plus{ font-size: 80rpx; color:#c0c0c0; line-height: 1; }
.del{
position: absolute;
top: 8rpx;
right: 8rpx;
width: 44rpx;
height: 44rpx;
border-radius: 22rpx;
background: rgba(0,0,0,.5);
color: #fff;
text-align: center;
line-height: 44rpx;
font-size: 28rpx;
}
.bottom-fixed{
position: fixed;
left: 0; right: 0; bottom: 0;
background: #fff;
padding: 24rpx;
box-shadow: 0 -2rpx 10rpx rgba(0,0,0,.06);
}
.submit-btn{
width: 100%;
height: 88rpx;
line-height: 88rpx;
text-align: center;
background: #00bcd4;
color: #fff;
font-size: 32rpx;
border-radius: 16rpx;
}
</style>