2026-01-14 17:41:42 +08:00

471 lines
12 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="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="imgbox">
<uni-file-picker limit="6" v-model="tempImageList" file-mediatype="image" :auto-upload="false" @select="selectImages" @delete="deleteImages" ></uni-file-picker>
</view> -->
<view class="img-grid">
<view
v-if="tempImageList.length > 0"
v-for="(img, index) in tempImageList"
:key="index"
class="img-item"
@click="preview(index)"
>
<image :src="img" mode="aspectFill" class="img" />
<view class="del" @click.stop="remove(index)">×</view>
</view>
<view
v-if="tempImageList.length < maxImages"
class="img-item add"
@click="beforeAddImages"
>
<view class="plus"></view>
</view>
</view>
</view>
</scroll-view>
<!-- <button style="position: fixed;bottom: 200rpx;left: 50%;transform: translateX(-50%);z-index: 99999999999;" @click="test" >测试</button> -->
<!-- 底部提交 -->
<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";
import { pathToBase64 } from "image-tools";
import { getCameraPermission } from "@/utils/permission.js";
import isAndroid from "@/utils/platform.js";
const uuid = ref("");
const answer_uuid = ref("");
const maxImages = 6;
const imgList = ref([]);
const isLock = ref(false);
const tempImageList = ref([]);
const note = ref("");
onLoad((options) => {
uuid.value = options.uuid || "";
answer_uuid.value = options.answer_uuid || "";
getInterrogation();
});
const beforeAddImages = () => {
if (isAndroid) {
getCameraPermission(addImages);
} else {
addImages();
}
};
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;
});
imgList.value = [];
if (arr && arr.length > 0) {
note.value = arr[0].note || "";
let imgs = arr[0].imgs ? arr[0].imgs.split(",") : [];
tempImageList.value = imgs.map((item, index) => {
return {
name: "图片" + index + 1,
url: docUrl + item,
};
});
tempImageList.value = imgs.map((item) => docUrl + item);
for (let i = 0; i < imgs.length; i++) {
uni.request({
url: docUrl + imgs[i],
method: "GET",
responseType: "arraybuffer",
success: (res) => {
const base64 = `${uni.arrayBufferToBase64(res.data)}`;
imgList.value.push(base64);
},
fail: (err) => {
reject(err);
},
});
}
}
}
});
};
const updateInterrogationAnswer = () => {
if (note.value.trim().length < 5) {
uni.showToast({ title: "输入意见至少5个字", icon: "none" });
return;
}
if (isLock.value) {
return;
}
isLock.value = true;
let imgobj = {};
if (imgList.value.length > 0) {
let count = 0;
imgList.value.forEach((item, index) => {
imgobj["img" + (index + 1)] = item;
});
}
api
.updateInterrogationAnswer({
uuid: answer_uuid.value,
note: note.value,
imgsBean: imgobj,
})
.then((res) => {
isLock.value = false;
if (res.code == 200) {
uni.showToast({ title: "提交成功", icon: "none" });
uni.$emit("updateStatus", 1);
uni.navigateBack();
}
});
};
const test = () => {
uni.navigateTo({
url: "/pages/upload/upload",
});
};
const addInterrogationAnswer = () => {
if (note.value.trim().length < 5) {
uni.showToast({ title: "输入意见至少5个字", icon: "none" });
return;
}
if (isLock.value) {
return;
}
isLock.value = true;
let imgobj = {};
if (imgList.value.length > 0) {
imgList.value.forEach((item, index) => {
imgobj["img" + (index + 1)] = item;
});
}
api
.addInterrogationAnswer({
step1_uuid: uuid.value,
note: note.value,
imgsBean: imgobj,
})
.then((res) => {
isLock.value = false;
if (res.code == 200) {
uni.$emit("updateStatus", 1);
uni.showToast({ title: "提交成功", icon: "none" });
uni.navigateBack();
}
});
};
const selectImages = (e) => {
let tempFilePaths = e.tempFiles;
console.log(e);
tempImageList.value = [...tempImageList.value, ...tempFilePaths];
for (let i = 0; i < tempFilePaths.length; i++) {
pathToBase64(tempFilePaths[i].url)
.then((base64) => {
console.log("转base64成功");
imgList.value.push(base64.split(",")[1]);
})
.catch((error) => {
console.log("转base64成功");
console.error(error);
});
}
console.log(tempImageList.value);
console.log(imgList.value);
};
const addImages = () => {
const remain = maxImages - imgList.value.length;
if (remain <= 0) {
uni.showToast({ title: "最多6张", icon: "none" });
return;
}
console.log("执行选择图片");
console.log('isAndroid:'+isAndroid)
if (isAndroid) {
uni.chooseImage({
count: remain,
sizeType: ["original", "compressed"],
sourceType: ["album", "camera"],
success: (res) => {
console.log("获取到照片");
console.log(res.tempFilePaths);
tempImageList.value = [...tempImageList.value, ...res.tempFilePaths];
for (let i = 0; i < res.tempFilePaths.length; i++) {
uni.saveFile({
tempFilePath: res.tempFilePaths[i],
success: (res1) => {
pathToBase64(res1.savedFilePath)
.then((base64) => {
console.log("转base64成功");
imgList.value.push(base64.split(",")[1]);
})
.catch((error) => {
console.log("转base64失败");
console.error(error);
});
}
})
}
},
});
} else {
uni.chooseImage({
count: remain,
sourceType: ["album", "camera"],
crop: {
width: 375,
height: 500,
resize: true,
quality:100,
},
success: (res) => {
console.log("获取到照片");
console.log(res.tempFilePaths);
tempImageList.value = [...tempImageList.value, ...res.tempFilePaths];
for (let i = 0; i < res.tempFilePaths.length; i++) {
uni.getImageInfo({
src: res.tempFilePaths[i],
success: (result) => {
console.log(result);
if (result.width > 1000) {
uni.compressImage({
quality:100,
src: res.tempFilePaths[i],
success: (result2) => {
console.log("压缩成功");
console.log(result2.tempFilePath);
pathToBase64(result2.tempFilePath)
.then((base64) => {
console.log("转base64成功");
imgList.value.push(base64.split(",")[1]);
})
.catch((error) => {
console.log("转base64失败");
console.error(error);
});
},
fail: (err) => {
console.log("压缩失败:" + err.errMsg);
},
});
} else {
pathToBase64(res.tempFilePaths[i])
.then((base64) => {
console.log("转base64成功");
imgList.value.push(base64.split(",")[1]);
})
.catch((error) => {
console.log("转base64失败");
console.error(error);
});
}
},
});
}
},
fail: (err) => {
console.log("获取图片信息失败:");
console.error(err.errMsg);
},
});
}
};
function preview(index) {
uni.previewImage({
urls: tempImageList.value,
current: index,
});
}
function remove(index) {
imgList.value.splice(index, 1);
tempImageList.value.splice(index, 1);
}
const deleteImages = (e) => {
let index = e.index;
imgList.value.splice(index, 1);
tempImageList.value.splice(index, 1);
};
function submit() {
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: calc(var(--status-bar-height) + 44px);
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 16rpx 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, 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, 0.06);
}
.submit-btn {
width: 100%;
height: 88rpx;
line-height: 88rpx;
text-align: center;
background: #3cc7c0;
color: #fff;
font-size: 32rpx;
border-radius: 16rpx;
}
</style>