You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
virtual-patient-web/src/views/selectCase/index.vue

506 lines
13 KiB
Vue

<script setup lang="ts">
import NavBar from "@/components/NavBar/index.vue";
import { ref, onMounted, reactive } from "vue";
import addImg from "@/assets/newInquiry/add.png";
import goBackImg from "@/assets/newInquiry/go_back.png";
import userAvatar from "@/assets/user.jpg";
import router from "@/router";
import {
queryDiagnoseProcessPageList,
queryMedicalRecPageList,
deleteProcess
} from "@/api/consultation";
import { getUserInfo } from "@/utils/auth";
import { useConsultationStoreHooks } from "@/store/modules/consultation";
import { creatDiagnosisProcesse } from "@/api/inquiry";
// import { message } from "@/utils/message";
import { downLoadUrl } from "@/utils/auth";
import { ElMessageBox } from "element-plus";
import { message } from "@/utils/message";
const addFlag = ref(false);
const caseList = ref([]);
const diagnoseProcessList = ref([]); //问诊流程列表
const medicalRecList = ref([]); //病例信息列表
const addCase = () => {
addFlag.value = true;
caseList.value = medicalRecList.value;
};
const goBack = () => {
addFlag.value = false;
caseList.value = diagnoseProcessList.value;
};
const openCase = async item => {
// const res: any = await resourceIsFree();
// if (res.data === true) {
if (item.status) {
sessionStorage.setItem(
"inspectSatus",
item.status === "3" ? "2" : item.status // 已评估状态和未评估进入页面一样
);
if (item.processId) {
router.push({
path: "/consultation",
query: {
processId: item.processId
}
});
}
} else {
createProcess(item);
}
sessionStorage.setItem("patientSilentVideo", item.patientSilentVideo);
sessionStorage.setItem("patientDummyVideo", item.patientDummyVideo);
// } else {
// message("实例资源占用,请稍后再试", { type: "warning" });
// }
};
const createProcess = async item => {
const res: any = await creatDiagnosisProcesse({
medicalId: item.medicalId,
patientId: item.patientId
});
if (res.code === 200) {
sessionStorage.setItem("inspectSatus", "0");
router.push({
path: "/consultation",
query: {
processId: res.data.id
}
});
}
};
const userPagination = reactive<any>({
total: 0,
pageSize: 11,
currentPage: 1
});
const casePagination = reactive<any>({
total: 0,
pageSize: 11,
currentPage: 1
});
const getDiagnoseProcessPageList = async () => {
const userInfo: any = getUserInfo();
const params = {
pageNum: userPagination.currentPage,
pageSize: userPagination.pageSize,
userId: JSON.parse(userInfo).id
};
const res: any = await queryDiagnoseProcessPageList(params);
userPagination.total = res.data.total;
caseList.value = res.data.records;
diagnoseProcessList.value = res.data.records;
userPagination.total = res.data.total;
};
const getMedicalRecPageList = async () => {
const params = {
pageNum: casePagination.currentPage,
pageSize: casePagination.pageSize
};
const res: any = await queryMedicalRecPageList(params);
medicalRecList.value = res.data.records;
casePagination.total = res.data.total;
if (addFlag.value === true) {
caseList.value = medicalRecList.value;
}
};
const handleUserChange = val => {
userPagination.currentPage = val;
getDiagnoseProcessPageList();
};
const handleCaseChange = val => {
casePagination.currentPage = val;
getMedicalRecPageList();
};
const delItem = async item => {
ElMessageBox.confirm(item ? `确定删除这条问诊实例”` : "", "提示", {
type: "warning"
})
.then(async () => {
const res: any = await deleteProcess({ processId: item.processId });
if (res.code === 200) {
getDiagnoseProcessPageList();
getMedicalRecPageList();
message("删除成功", { type: "success" });
}
})
.catch(() => {});
};
onMounted(() => {
getDiagnoseProcessPageList();
getMedicalRecPageList();
sessionStorage.setItem("inspectSatus", "");
useConsultationStoreHooks().changeInspectSatus("");
});
</script>
<template>
<div class="selectCase">
<NavBar />
<div v-if="caseList.length === 0" class="no_data">
<div class="add_card" @click="addCase">
<p>选择问诊实例</p>
<span class="desc">暂无可选择问诊实例,请先新建问诊实例</span>
<div class="content">
<img class="add_img" :src="addImg" alt="" />
<span>新建问诊实例</span>
</div>
</div>
</div>
<div v-if="caseList.length > 0" class="main">
<div class="content">
<div class="title">选择问诊实例</div>
<div class="case_list">
<div v-if="!addFlag" @click="addCase" class="case_list_item add_item">
<img class="add_img" :src="addImg" alt="" />
<span>新建问诊实例</span>
</div>
<div v-if="addFlag" @click="goBack" class="case_list_item add_item">
<img class="add_img" :src="goBackImg" alt="" />
<span>返回问诊历史</span>
</div>
<div
v-for="(item, index) in caseList"
:key="index"
class="case_list_item"
@click="openCase(item)"
>
<div class="item_info">
<img v-if="!item.patientHeadPic" :src="userAvatar" alt="" />
<img
v-if="item.patientHeadPic"
:src="downLoadUrl(item.patientHeadPic)"
alt=""
/>
<div class="item_info_content">
<span class="name">{{ item.name }}</span>
<span>{{ `年龄:${item.age}岁 性别:${item.gender}` }}</span>
</div>
</div>
<div class="desc" :title="item.patientSelfDesc">
{{ `主诉:${item.patientSelfDesc}` }}
</div>
<div class="time" v-show="item.status">
{{ `最近问诊时间:${item.time}` }}
</div>
<div :class="[addFlag ? 'add_btn_list' : 'btn_list']">
<div class="del_btn" v-if="!addFlag" @click.stop="delItem(item)">
删除
</div>
<div class="btn" v-if="item.status === '0'">继续问诊</div>
<div class="btn" v-else-if="item.status === '1'">去处置</div>
<div class="btn" v-else-if="item.status === '2'">
查看评估结果
</div>
<div class="btn" v-else-if="item.status === '3'">
查看评估结果
</div>
<div class="btn" v-else>开始问诊</div>
</div>
<div
v-if="item.status === '0'"
style="background-color: #0db274"
class="type"
>
待问诊
</div>
<div v-if="item.status === '1'" class="type wait">待处置</div>
<div v-if="item.status === '2'" class="type determine">已确诊</div>
<div v-if="item.status === '3'" class="type determine">已评估</div>
</div>
</div>
<div class="footer">
<el-pagination
v-if="userPagination.total > 11 && !addFlag"
@current-change="handleUserChange"
:hide-on-single-page="true"
background
:default-page-size="11"
layout="prev, pager, next"
:total="userPagination.total"
class="mt-4"
/>
<el-pagination
v-if="casePagination.total > 11 && addFlag"
@current-change="handleCaseChange"
:hide-on-single-page="true"
background
:default-page-size="11"
layout="prev, pager, next"
:total="casePagination.total"
class="mt-4"
/>
</div>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
.selectCase {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
overflow: hidden;
background-image: url("../../assets/newInquiry/select_bg.png");
background-size: 100% 100%;
.no_data {
display: flex;
flex: 1;
align-items: center;
justify-content: center;
.add_card {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 439px;
height: 445px;
background: linear-gradient(225deg, #f4f8ff 0%, #fff 46%);
border-radius: 6px;
box-shadow: 0 40px 100px 0 rgb(65 149 249 / 30%);
p {
margin-bottom: 8px;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
}
.desc {
font-size: 14px;
font-weight: 400;
color: rgb(43 63 84 / 60%);
}
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 367px;
height: 193px;
margin-top: 40px;
cursor: pointer;
background: rgb(66 135 255 / 5%);
border: 1px dashed #4287ff;
border-radius: 6px;
img {
width: 60px;
height: 60px;
}
span {
margin-top: 8px;
font-size: 16px;
color: #4287ff;
}
}
}
}
.main {
display: flex;
justify-content: center;
margin-top: 80px;
.content {
width: 1200px;
.title {
margin-bottom: 24px;
font-size: 24px;
font-weight: bold;
color: #2b3f54;
}
.case_list {
display: flex;
flex-wrap: wrap;
.case_list_item {
position: relative;
width: 266px;
height: 210px;
padding: 16px;
margin-right: 24px;
margin-bottom: 24px;
cursor: pointer;
background: #fff;
border-radius: 6px;
.item_info {
display: flex;
img {
width: 64px;
height: 64px;
margin-right: 16px;
border-radius: 50%;
}
}
.item_info_content {
display: flex;
flex-direction: column;
font-size: 12px;
color: #666;
.name {
margin-bottom: 8px;
font-size: 16px;
font-weight: 400;
color: #2b3f54;
}
}
.desc {
display: -webkit-box;
height: 40px;
padding-bottom: 16px;
margin-top: 16px;
margin-bottom: 4px;
overflow: hidden;
font-size: 14px;
font-weight: 400;
color: #2b3f54;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.time {
font-size: 12px;
font-weight: 400;
color: #999;
}
.btn_list {
position: absolute;
bottom: 16px;
display: flex;
margin-top: 16px;
opacity: 1;
.del_btn {
width: 109px;
height: 29px;
margin-right: 16px;
font-size: 14px;
line-height: 29px;
color: #999;
text-align: center;
border: 1px solid #999;
border-radius: 6px;
}
.btn {
width: 109px;
height: 29px;
line-height: 29px;
color: #4287ff;
text-align: center;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
.add_btn_list {
.btn {
position: absolute;
bottom: 16px;
width: 234px;
height: 29px;
margin-top: 16px;
line-height: 29px;
color: #4287ff;
text-align: center;
border: 1px solid #4287ff;
border-radius: 6px;
opacity: 1;
}
}
.type {
position: absolute;
top: 0;
right: 0;
width: 72px;
height: 24px;
font-size: 12px;
font-weight: 400;
line-height: 24px;
color: #fff;
text-align: center;
border-top-right-radius: 6px;
}
.wait {
background: #ffa700;
}
.determine {
background: #4287ff;
}
}
.case_list_item:hover {
box-shadow: 0 40px 100px 0 rgb(65 149 249 / 30%);
.btn {
color: #fff;
background: #4287ff;
}
}
.add_item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: #4287ff;
cursor: pointer;
}
.add_img {
width: 80px;
height: 80px;
}
}
.footer {
display: flex;
justify-content: center;
margin-top: 32px;
}
}
.view {
margin-top: 32px;
text-align: center;
cursor: pointer;
}
}
}
</style>
<!-- <style lang="scss">
.el-pagination.is-background .btn-next,
.el-pagination.is-background .btn-prev,
.el-pagination.is-background .el-pager li {
background-color: #fff !important;
}
.el-pagination.is-background .btn-next.is-active,
.el-pagination.is-background .btn-prev.is-active,
.el-pagination.is-background .el-pager li.is-active {
color: rgba(0, 0, 0, 0.85);
}
</style> -->