海信医疗-远程超声管理平台-信创国产化
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

403 lines
10 KiB

1 month ago
<template>
<div class="app-container">
<!-- 1. 会议模式卡片 -->
<el-card class="card" style="margin-bottom: 10px">
<div slot="header" class="card-header">
<span class="line"></span>
会议模式
</div>
<!-- 口令入会区域 -->
<div class="join-area">
<el-input
v-model="meetingCode"
placeholder="请输入数字口令"
class="join-input"
@keyup.enter="joinMeeting"
/>
<el-button type="success" class="join-btn" @click="joinMeeting">
入会
</el-button>
</div>
<!-- 四种模式卡片 -->
<div class="mode-list">
<div
v-for="(mode, index) in meetingModes"
:key="index"
:class="['mode-item', mode.color]"
@click="handleModeClick(mode)"
>
<div class="title">
{{ mode.title }}
</div>
<div class="icon-bg">
<i :class="mode.icon"></i>
</div>
</div>
</div>
</el-card>
1 month ago
<!-- 2. 会诊记录卡片 -->
<el-card class="card">
<div slot="header" class="card-header">
<span class="line"></span>
会诊记录
</div>
<!-- 无数据状态 -->
<div v-if="recordList.length === 0" class="no-data">
----- 无会诊记录 -----
</div>
1 month ago
<!-- 会诊表格 -->
<el-table
v-loading="loading"
v-else
1 month ago
:data="recordList"
:show-header="false"
stripe
>
<el-table-column label="头像" prop="avatar" align="center" width="50">
<template slot-scope="scope">
<el-avatar :src="scope.row.avatar" />
</template>
</el-table-column>
<el-table-column label="会议名称" prop="name" align="center" />
<el-table-column label="类型" prop="type" align="center" />
<el-table-column label="时间" prop="time" align="center" />
<el-table-column label="操作" align="center" width="50">
<template slot-scope="scope">
<el-button
type="text"
icon="el-icon-more"
class="more-btn"
@click="showDetail(scope.row)"
/>
</template>
</el-table-column>
</el-table>
1 month ago
<!-- 分页 -->
<div class="pagination-wrapper">
<el-pagination
background
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="queryParams.pageNum"
:page-sizes="[10, 20, 50, 100]"
:page-size="queryParams.pageSize"
layout="prev, pager, next"
:total="queryParams.total"
>
</el-pagination>
</div>
1 month ago
</el-card>
1 month ago
<!-- 会诊详情弹框 -->
<el-dialog
title="会诊详情"
:visible.sync="showDetailDialog"
width="400px"
:close-on-click-modal="false"
>
<el-form :model="selectedRecord" label-width="110px">
<el-form-item label="会议状态">
{{ selectedRecord.status || "进行中" }}
</el-form-item>
1 month ago
<el-divider />
<el-form-item label="会议时间">
{{ selectedRecord.time }}
</el-form-item>
1 month ago
<el-form-item label="会议持续时间">
{{ selectedRecord.duration || "0分钟0秒" }}
1 month ago
</el-form-item>
<el-form-item label="病例数记录">
<el-form-item label="总病例数">
{{ selectedRecord.totalCases || "2" }}
</el-form-item>
<el-form-item label="阳性病例数">
{{ selectedRecord.positiveCases || "0" }}
</el-form-item>
<el-form-item label="阴性病例数">
{{ selectedRecord.negativeCases || "0" }}
</el-form-item>
<el-form-item label="上级转诊病例数">
{{ selectedRecord.referralCases || "4" }}
</el-form-item>
</el-form-item>
<el-divider />
<el-form-item label="会议发起人">
{{ selectedRecord.sponsor || "暂无" }}
</el-form-item>
1 month ago
<el-divider />
<el-form-item label="参会人员">
{{ selectedRecord.participants || "暂无" }}
</el-form-item>
1 month ago
</el-form>
</el-dialog>
</div>
</template>
<script>
import { listMeeting, getMeeting, joinMeeting } from "@/api/videoCommunication";
export default {
name: "VideoPage",
data() {
return {
meetingCode: "",
// 查询参数
loading: false,
queryParams: {
pageNum: 1,
pageSize: 10,
total: 0,
},
// 会议模式配置
meetingModes: [
{
title: "实时会诊",
icon: "el-icon-user-solid",
color: "blue",
routeName: "RealTimeConsultation",
routePath: "/videoCommunication/realTimeConsultation",
},
{
title: "带教培训",
icon: "el-icon-video-play",
color: "yellow",
routeName: "Training",
routePath: "/videoCommunication/training",
},
{
title: "在线质控",
icon: "el-icon-lightbulb",
1 month ago
color: "grayblue",
routeName: "QualityControl",
routePath: "/videoCommunication/qualityControl",
},
{
title: "病例研讨",
icon: "el-icon-user-solid",
1 month ago
color: "greenblue",
routeName: "CaseDiscussion",
routePath: "/videoCommunication/caseDiscussion",
},
],
// 会诊记录表格数据
recordList: [],
// 详情弹框
showDetailDialog: false,
selectedRecord: {},
};
},
mounted() {
this.getList();
},
methods: {
// 口令入会
joinMeeting() {
if (!this.meetingCode.trim()) {
this.$message.warning("请输入数字口令");
return;
}
this.loading = true;
joinMeeting({ meetingCode: this.meetingCode })
.then(() => {
1 month ago
this.$message.success("成功加入会议");
this.meetingCode = "";
})
.catch(() => {
1 month ago
this.$message.error("入会失败,请检查口令是否正确");
})
.finally(() => {
this.loading = false;
});
},
// 处理会议模式点击
handleModeClick(mode) {
this.$router.push({ name: mode.routeName });
1 month ago
},
// 查询会诊记录列表
getList() {
this.loading = true;
listMeeting(this.queryParams)
.then((response) => {
this.recordList = response.rows || [];
this.queryParams.total = response.total || 0;
1 month ago
})
.catch(() => {
1 month ago
this.$message.error("获取会议列表失败");
})
.finally(() => {
// 接口失败时,用空数据模拟无记录状态
this.recordList = [];
this.queryParams.total = 0;
1 month ago
this.loading = false;
});
},
// 显示详情弹框
showDetail(record) {
this.loading = true;
getMeeting(record.id)
.then((response) => {
this.selectedRecord = response.data || record;
1 month ago
this.showDetailDialog = true;
})
.catch(() => {
1 month ago
this.$message.error("获取会议详情失败");
this.selectedRecord = record;
this.showDetailDialog = true;
})
.finally(() => {
1 month ago
this.loading = false;
});
},
// 分页处理
handleSizeChange(val) {
this.queryParams.pageSize = val;
this.getList();
},
handleCurrentChange(val) {
this.queryParams.pageNum = val;
this.getList();
},
1 month ago
},
};
</script>
<style lang="scss" scoped>
.app-container {
padding: 10px;
}
1 month ago
// 卡片通用样式
.card {
.card-header {
display: flex;
align-items: center;
font-size: 16px;
font-weight: 500;
color: #333;
.line {
display: inline-block;
width: 3px;
height: 16px;
background-color: #009696;
margin-right: 8px;
}
}
// 口令入会区域
.join-area {
display: flex;
align-items: center;
margin-bottom: 20px;
.join-input {
width: 250px;
margin-right: 10px;
}
.join-btn {
background-color: #009696;
border-color: #009696;
color: #fff;
&:hover {
background-color: #00796b;
border-color: #00796b;
}
}
}
// 会议模式列表
.mode-list {
display: flex;
gap: 10px;
.mode-item {
flex: 1;
height: 115px;
border-radius: 8px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: #fff;
position: relative;
overflow: hidden;
cursor: pointer;
transition: transform 0.2s ease, box-shadow 0.2s ease;
&:hover {
transform: translateY(-3px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2);
}
&:active {
transform: translateY(-1px);
}
.title {
font-size: 18px;
margin-bottom: 10px;
z-index: 1;
}
.icon-bg {
position: absolute;
right: 20px;
bottom: 20px;
font-size: 40px;
opacity: 0.3;
}
&::after {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 60px;
background: rgba(255, 255, 255, 0.1);
border-radius: 100% 100% 0 0;
}
&.blue {
background: linear-gradient(to right, #67c2ef, #2196f3);
}
&.yellow {
background: linear-gradient(to right, #ffd54f, #ff9800);
}
&.grayblue {
background: linear-gradient(to right, #b0bec5, #29b6f6);
}
&.greenblue {
background: linear-gradient(to right, #43d8c9, #29b6f6);
}
}
}
// 无会诊记录样式
.no-data {
text-align: center;
padding: 50px 0;
color: #999;
}
1 month ago
// 会诊记录表格
.more-btn {
color: #009696;
cursor: pointer;
}
// 分页样式
.pagination-wrapper {
text-align: center;
margin-top: 15px;
}
1 month ago
}
</style>