123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643 |
- <template>
- <div class="right-Panel-container">
- <div class="title-container">
- <span class="title-text">当日重点关注:发热门诊病历99例</span>
- </div>
- <div class="top-chart-container">
- <div class="chart-left-container">
- <titleContent>本市发热腹综情况</titleContent>
- <div class="charts-box" id="leftChartId" ref="leftChartId"></div>
- </div>
- <div class="chart-right-container">
- <titleContent>发热门诊、呼综情况</titleContent>
- <div class="charts-box" id="rightChartId" ref="rightChartId"></div>
- </div>
- </div>
- <template v-if="!mapStore.currentToolSelectArray.includes('Bidding')">
- <div class="title-box">
- <titleContent>发热门诊病例分区</titleContent>
- </div>
- <div class="partition-box">
- <div
- class="partition-card"
- v-for="(key, index) in Object.keys(partitionData)"
- :key="index + key + ''"
- :class="{ activeCard: mapStore.selectPartKey == key }"
- @click="handleSelect(key)"
- >
- <div class="title">{{ key }}</div>
- <template v-for="(childKey, index1) in Object.keys(partitionData[key])" :key="index1">
- <template v-if="childKey == 'infection'">
- <div class="text-box">
- <span>传染病</span>
- <span class="num">{{ partitionData[key][childKey][0].num }}</span>
- </div>
- </template>
- <template v-else-if="childKey == 'fever'">
- <div class="text-box">
- <span>发热</span> <span class="num">{{ partitionData[key][childKey][0].num }}</span>
- </div>
- </template>
- <template v-else-if="childKey == 'fuzong'">
- <div class="text-box text-box-border">
- <span>腹综</span>
- <span class="num">{{ getSum(partitionData[key][childKey]) }}</span>
- </div>
- <div
- class="text-box text-child-box"
- v-for="(item, index2) in partitionData[key][childKey]"
- :key="index2"
- >
- <span>{{ item.type }}</span>
- <span class="num">{{ partitionData[key][childKey][index2].num }}</span>
- </div>
- </template>
- <template v-else-if="childKey == 'cold'">
- <div class="text-box">
- <span>感冒</span>
- <span class="num">{{ getSum(partitionData[key][childKey]) }}</span>
- </div>
- <div
- class="text-box text-child-box"
- v-for="(item, index2) in partitionData[key][childKey]"
- :key="index2"
- >
- <span>{{ item.type }}</span>
- <span class="num">{{ partitionData[key][childKey][index2].num }}</span>
- </div>
- </template>
- </template>
- </div>
- </div>
- </template>
- <template v-else>
- <div class="title-box">
- <titleContent>病例列表</titleContent>
- </div>
- <div class="table-container">
- <el-table
- :data="mapStore.currentAllPointList"
- @row-click="handleView"
- @row-dblclick="handleDbView"
- >
- <el-table-column show-overflow-tooltip align="left" label="" prop="" width="15">
- <template #default="scope">
- <div
- v-if="scope.row.ty == '无轨迹'"
- class="point-box"
- style="background: rgba(255, 127, 0, 0.4)"
- ></div>
- <div
- v-if="scope.row.ty == '有轨迹'"
- class="point-box"
- style="background: rgba(0, 128, 255, 0.4)"
- ></div>
- <div
- v-if="scope.row.ty == '无坐标'"
- class="point-box"
- style="background: rgba(248, 152, 152, 0.4)"
- ></div>
- </template>
- </el-table-column>
- <el-table-column label="序号" align="center" type="index" width="50" />
- <el-table-column
- show-overflow-tooltip
- align="center"
- label="病例编号"
- prop="blbh"
- min-width="60"
- >
- <template #default="scope">
- <div @click="clickBlbh(scope)" style="color: #1257bc">{{ scope.row.blbh }}</div>
- </template>
- </el-table-column>
- <el-table-column show-overflow-tooltip label="疾病名称" prop="type" min-width="60">
- <template #default="scope">
- <span v-if="scope.row.type == 1">传染病</span>
- <span v-if="scope.row.type == 2">发热</span>
- <span v-if="scope.row.type == 3">腹综</span>
- <span v-if="scope.row.type == 4">感冒</span>
- </template>
- </el-table-column>
- <el-table-column show-overflow-tooltip label="流调情况" prop="ty" min-width="60">
- </el-table-column>
- <!-- <el-table-column fixed="right" label="操作" min-width="40">
- <template #default="scoped">
- <el-button class="option-button" @click="handleView(scoped)" type="text"
- >查看</el-button
- >
- </template>
- </el-table-column> -->
- </el-table>
- </div>
- </template>
- </div>
- </template>
- <script setup>
- import { watch, onMounted, ref } from 'vue';
- import titleContent from './TitleContent.vue';
- import * as echarts from 'echarts';
- import {
- getDataByArea,
- getHistogramData,
- getTrajectorPointOnPeople,
- getTrajectorPointOnPeopleById,
- getCaseDetailsByBh,
- getAllSaDian
- } from '@/service/api/mapRequest';
- import { stackRightOptions, stackLeftOptions } from '@/utils/chartsOptions.js';
- import { useMapStore } from '@/stores/mapStore.js';
- import { useDrawPointStore } from '@/stores/drawPointManage.js';
- import {
- addPoint,
- gotoPosition,
- regionZone,
- closePoint,
- fullExtent
- } from '@/utils/map/mapOperation.js';
- const partitionData = ref({});
- const mapStore = useMapStore();
- const drawPointStore = useDrawPointStore();
- const leftChartId = ref('');
- const rightChartId = ref('');
- //初始化echarts图
- const initChart = (chartDom, option) => {
- const myChart = echarts.init(chartDom);
- option && myChart.setOption(option);
- };
- const getBarData = async () => {
- try {
- const res = await getHistogramData();
- if (res.code == 200) {
- const data = res?.data || [];
- const dateArr = Object.keys(data);
- const data1 = dateArr.map((item) => {
- return { date: item, num: 0 };
- });
- const data2 = dateArr.map((item) => {
- return { date: item, num: 0 };
- });
- const data3 = dateArr.map((item) => {
- return { date: item, num: 0 };
- });
- const data4 = dateArr.map((item) => {
- return { date: item, num: 0 };
- });
- Object.values(data).forEach((item) => {
- item.forEach((element) => {
- if (element.type == '1') {
- data1.forEach((data) => {
- if (element.month == data.date) {
- data.num = element.num;
- }
- });
- } else if (element.type == '2') {
- data2.forEach((data) => {
- if (element.month == data.date) {
- data.num = element.num;
- }
- });
- } else if (element.type == '3') {
- data3.forEach((data) => {
- if (element.month == data.date) {
- data.num = element.num;
- }
- });
- } else if (element.type == '4') {
- data4.forEach((data) => {
- if (element.month == data.date) {
- data.num = element.num;
- }
- });
- }
- });
- });
- const yAxisData = {
- data1: Object.values(data1).map((item) => item.num),
- data2: Object.values(data2).map((item) => item.num),
- data3: Object.values(data3).map((item) => item.num),
- data4: Object.values(data4).map((item) => item.num)
- };
- const line = yAxisData.data1.map((item, index) => {
- return (
- (item + yAxisData.data2[index] + yAxisData.data3[index] + yAxisData.data4[index]) / 4
- );
- });
- yAxisData.line = line;
- initChart(rightChartId.value, stackRightOptions(dateArr, yAxisData));
- initChart(leftChartId.value, stackLeftOptions(dateArr, yAxisData));
- }
- } catch (error) {
- console.log(error);
- }
- };
- const clickBlbh = async (scope) => {
- try {
- const row = scope.row;
- const res = await getCaseDetailsByBh({
- bh: row.blbh,
- type: row.type
- });
- if (res.code == 200) {
- } else {
- console.log('获取病例详情数据错误');
- }
- } catch (error) {
- console.log(error);
- }
- };
- const handleView = (row) => {
- if (row?.x && row?.y) {
- let color = row.ty == '有轨迹' ? 'rgba(0, 128, 255, 0.8)' : 'rgba(255, 127, 0, 0.8)';
- let borderColor = row.ty == '有轨迹' ? 'rgba(0, 128, 255, 1)' : 'rgba(255, 127, 0, 1)';
- addPoint([row], 'clickView', {
- color: color,
- borderColor: borderColor
- });
- }
- };
- const selectPartKey = ref('');
- //选择区
- const handleSelect = (key) => {
- closePoint('cityLine');
- if (mapStore.selectPartKey == key) {
- mapStore.selectPartKey = '';
- fullExtent();
- return;
- }
- mapStore.selectPartKey = key;
- if (key == '浦东新区') {
- regionZone('浦东新区');
- } else {
- regionZone(key);
- }
- };
- const handleDbView = async (row) => {
- try {
- if (row?.x && row?.y) {
- let color = row.ty == '有轨迹' ? 'rgba(0, 128, 255, 0.8)' : 'rgba(255, 127, 0, 0.8)';
- gotoPosition(row, color);
- }
- //有轨迹就有id,无轨迹无id,此时将编号作为id
- if (row?.id) {
- const res = await getTrajectorPointOnPeopleById({
- id: row?.id
- });
- if (res.code == 200) {
- drawPointStore.currentSelectName = row.name;
- drawPointStore.currentSelectId = row.id;
- drawPointStore.currentSelectCode = row.code;
- drawPointStore.currentDrawPointList = res.data || [];
- drawPointStore.openBiddingTable = true;
- } else {
- console.log('获取病例轨迹数据错误');
- }
- } else {
- drawPointStore.currentSelectName = row.name;
- drawPointStore.currentSelectId = row.blbh;
- drawPointStore.currentSelectCode = row.blbh;
- drawPointStore.currentDrawPointList = [];
- drawPointStore.openBiddingTable = true;
- }
- } catch (error) {
- console.log(error);
- }
- };
- //分区看板
- const getLeftChartData = async () => {
- try {
- const res = await getDataByArea();
- if (res.code == 200 && res.data) {
- //重塑数据结构
- Object.keys(res.data).forEach((key) => {
- if (res.data && res.data[key]) {
- res.data[key].forEach((item) => {
- if (!partitionData.value[key]) {
- partitionData.value[key] = {};
- }
- let keyName;
- if (item.diseaseType == '1') {
- //传染病
- keyName = 'infection';
- } else if (item.diseaseType == '2') {
- //发热
- keyName = 'fever';
- } else if (item.diseaseType == '3') {
- //腹宗
- keyName = 'fuzong';
- } else if (item.diseaseType == '4') {
- //感冒
- keyName = 'cold';
- }
- if (keyName) {
- if (!partitionData.value[key][keyName]) {
- partitionData.value[key][keyName] = [];
- }
- partitionData.value[key][keyName].push(item);
- }
- });
- }
- });
- console.log(partitionData.value);
- } else {
- console.log(res.msg || 'getDataByArea:error');
- }
- } catch (error) {
- console.log(error);
- }
- };
- //求和
- const getSum = (numArr) => {
- return numArr
- .map((item) => item.num)
- .reduce((pre, next) => {
- return pre + next;
- });
- };
- const getAllPoint = async () => {
- try {
- const res = await getAllSaDian();
- if (res.code == 200) {
- let arr = [];
- Object.keys(res.data).forEach((key) => {
- if (key == '有轨迹') {
- arr = [...res.data[key], ...arr];
- } else {
- arr = [...arr, ...res.data[key]];
- }
- });
- mapStore.currentAllPointList = arr;
- } else {
- throw 'getTrajectorPointOnPeople:error';
- }
- } catch (error) {
- console.log(error);
- }
- };
- onMounted(() => {
- getLeftChartData();
- getBarData();
- getAllPoint();
- });
- </script>
- <style lang="scss" scoped>
- .right-Panel-container {
- .title-container {
- background-image: url('@/assets/image/message-bg.png');
- margin-top: 67px;
- display: flex;
- justify-content: flex-start;
- align-items: center;
- background-size: 100% 100%;
- width: 703px;
- height: 50px;
- .title-text {
- font-weight: bold;
- font-size: 18px;
- color: #ffffff;
- line-height: 29px;
- padding-left: 15px;
- }
- }
- .top-chart-container {
- display: flex;
- justify-content: space-between;
- padding-top: 36px;
- .chart-left-container,
- .chart-right-container {
- width: calc(50% - 30px);
- .charts-box {
- width: 100%;
- height: 175px;
- margin-top: 30px;
- }
- }
- }
- .title-box {
- width: calc(50% - 10px);
- margin-top: 20px;
- }
- .partition-box {
- display: flex;
- justify-content: flex-start;
- align-content: flex-start;
- flex-wrap: wrap;
- width: 100%;
- height: 621px;
- overflow-y: auto;
- padding-top: 29px;
- gap: 24px;
- scrollbar-width: none;
- .partition-card {
- width: 162px;
- background-image: url('@/assets/image/normal-bg.png');
- background-repeat: no-repeat;
- background-size: 100% 60px;
- margin-bottom: 5%;
- .title {
- font-family: Microsoft YaHei;
- font-weight: 400;
- font-size: 16px;
- color: #0080ff;
- line-height: 32px;
- font-style: italic;
- padding-left: 14px;
- position: relative;
- top: -13px;
- }
- .text-box {
- color: #585858;
- display: flex;
- justify-content: space-between;
- font-size: 14px;
- padding: 5px 5px 0 9px;
- .num {
- color: #0080ff;
- font-size: 16px;
- }
- }
- .text-box-border {
- border-bottom: 1px solid #0080ff;
- }
- .text-child-box {
- padding-left: 20px;
- }
- }
- .activeCard {
- background-image: url('@/assets/image/red-bg.png');
- .title {
- color: rgb(253, 1, 0);
- }
- .text-box {
- .num {
- color: rgb(253, 1, 0);
- }
- }
- .text-box-border {
- border-bottom: 1px solid rgb(253, 1, 0);
- }
- }
- }
- .table-container {
- width: 100%;
- height: 600px;
- background: rgba(0, 0, 0, 0);
- box-shadow: 0px 4px 5px #cccccc;
- margin-top: 25px;
- overflow: hidden;
- .option-button {
- width: 30px;
- }
- :deep(.el-table--enable-row-hover .el-table__body tr:hover > td.el-table__cell) {
- background-color: rgba(90, 172, 255, 0.2);
- color: #1257bc;
- }
- .top-box {
- display: flex;
- justify-content: flex-start;
- padding-right: 20px;
- span {
- margin-right: 10px;
- }
- .add-box {
- width: 40px;
- height: 30px;
- margin-left: auto;
- }
- }
- :deep(.el-table) {
- height: calc(100% - 30px);
- background: rgba(0, 0, 0, 0);
- .cell {
- padding: 0;
- }
- .el-table__cell {
- padding: 5px 3px;
- }
- .el-button + .el-button {
- margin-left: 5px;
- }
- tr,
- td {
- background-color: unset;
- }
- th {
- background-color: rgba(90, 172, 255, 0.5);
- color: #ffffff;
- }
- }
- .table-row-head,
- .table-row-box {
- display: flex;
- justify-content: space-evenly;
- align-items: center;
- height: 25px;
- font-size: 14px;
- .table-td {
- flex: 1;
- text-align: center;
- }
- }
- // .table-row-head {
- // background-color: #dde2eb;
- // }
- .table-row-box {
- }
- }
- }
- .point-box {
- width: 20px;
- height: 20px;
- border-radius: 50px;
- }
- </style>
- <style lang="scss">
- .bigSize {
- .right-Panel-container {
- .title-container {
- .title-text {
- font-size: 22px;
- }
- }
- .partition-box {
- scrollbar-width: none;
- .partition-card {
- .title {
- font-size: 20px;
- }
- .text-box {
- font-size: 18px;
- .num {
- font-size: 20px;
- }
- }
- }
- }
- .table-container {
- .table-row-head,
- .table-row-box {
- font-size: 18px;
- }
- .el-table {
- .cell {
- font-size: 16px;
- }
- }
- }
- }
- }
- .veryBigSize {
- .right-Panel-container {
- .title-container {
- .title-text {
- font-size: 25px;
- }
- }
- .partition-box {
- scrollbar-width: none;
- .partition-card {
- .title {
- font-size: 24px;
- }
- .text-box {
- font-size: 22px;
- .num {
- font-size: 24px;
- }
- }
- }
- }
- .table-container {
- .table-row-head,
- .table-row-box {
- font-size: 22px;
- }
- .el-table {
- .cell {
- font-size: 20px;
- }
- }
- }
- }
- }
- </style>
|