Files
xj-screen/src/views/indexSun.vue
T
weixin 822fecc3b1 update
1.根据新疆反馈(12.22),修改相关问题
2025-12-24 14:42:16 +08:00

959 lines
33 KiB
Vue

<template>
<div class="sun-screen-box" ref="pageRef">
<login-out-button out-url="login" />
<div class="sun-screen-title">
<div class="sun-title-left">
{{ dateInfo?.day }} {{ dateInfo?.times }}<span style="margin-left: 30px">{{ rightDate }}</span>
</div>
<div class="sun-title-center">{{ getCenterInfo.screenTitle || '健康服务中心' }}</div>
<div class="sun-title-right">
<a-button class="top-right-button" @click="toZ">咨询服务平台</a-button>
<a-button class="top-right-button" @click="toOther" :loading="otherLoading">健康监测平台</a-button>
</div>
</div>
<div class="sun-body-content">
<div class="sun-body-left">
<div class="sun-body-left-one">
<OneL @handle-click="handleOneLeftClick" :center-id="centerId" :bKey="`one-l-${count}`" />
</div>
<div class="sun-body-left-two">
<twoL @handle-view="handleTwoLClick" :center-id="centerId" :bKey="`two-l-${count}`" />
</div>
<div class="sun-body-left-three">
<three-left-new :bKey="`three-l-n-${count}`" :center-id="centerId" @handle-view="handlePieView" />
<!-- <threeL />-->
<!-- <threeNewL :bKey="`three-l-${count}`" :center-id="centerId" />-->
</div>
<!-- <div class="sun-body-left-four" style="margin-bottom: 0">-->
<!-- <threeR @handle-click="handleThreeRClick" :center-id="centerId" :bKey="`four-l-${count}`" />-->
<!-- </div>-->
</div>
<div class="sun-body-center">
<CenterMap
ref="centerMapRef"
:showHospitalList="showHospitalList"
:hospitalList="hospitalList"
@clear-hospital-list="clearHospitalList"
@handle-last-seven="handleLastSeven"
:show-rest-b="showRestB"
:user-data="userData"
@handle-detail="handleCenterMapClick"
:show-map-bottom="showMapBottom"
@show-rest-b="
() => {
userData = {};
showRestB = false;
showMapBottom = false;
}
"
/>
</div>
<div class="sun-body-right">
<div class="sun-body-right-one">
<one-right-new :user-data="userData" @handle-view="handleOneRightView" @handle-emer="handleEmer" />
</div>
<div class="sun-body-right-two">
<oneR
@handle-view="handleOneRClick"
@show-reset="
() => {
showRestB = true;
}
"
:bKey="`one-r-${count}`"
/>
</div>
<div class="sun-body-right-three">
<two-new-r ref="twoNewR" :center-id="centerId" :bKey="`two-n-r-${count}`" @handle-view="handleTwoNewRClick" />
</div>
</div>
</div>
</div>
<PhoneDialog ref="phoneDialogRef" :title="phoneDialogTitle" :useForm="true" :setting="setting" :phoneType="phoneType" />
<!-- 健康监测弹窗 -->
<EmployeeDialog ref="employeeDialogRef" :record="socketData" @confirm-help="confirmHelp" :get-container="() => pageRef" />
<!-- 应急、120弹窗 -->
<EmergencyDialog ref="emergencyDialogRef" :record="socketData1" @confirm-help="confirmHelp" :get-container="() => pageRef" />
<IndexModal
ref="indexModalRef"
:api="modalApi"
:api-params="apiParams"
:title="indexModalTitle"
:useForm="true"
:column="indexColumn"
:firstForm="firstFormOne"
:need-dept="needDept"
:need-date-picker="needDatePicker"
:date-time-arr="dateTimeArr"
:twoROnly="twoROnly"
>
<template #bodyCell="{ column, record }">
<template v-if="column.dataIndex === 'd'">
<template v-if="record?.emergencyType != 2">
<template v-if="record?.latitude && record?.longitude">
<environment-outlined style="height: auto !important; color: #178ef2 !important" @click="forHelp(record)" />
</template>
<template v-else>
<span style="color: red">未获取到位置信息</span>
</template>
</template>
</template>
<template v-if="column.dataIndex === 'cz'">
<a-button type="link" @click="forHelp(record, false)">求助信息</a-button>
</template>
<template v-if="column.dataIndex === 'gName'">
<a-button type="link" @click="openRBModal(record)">{{ record?.name }}</a-button>
</template>
</template>
</IndexModal>
<heart-modal ref="heartModalRef" :get-container="() => pageRef" />
<emer-modal ref="emerRef" :get-container="() => pageRef" />
</template>
<script setup lang="ts">
import { EnvironmentOutlined } from '@ant-design/icons-vue';
import OneL from '/@/views/indexSun/oneL.vue';
import twoL from '/@/views/indexSun/twoL.vue';
import oneR from '/@/views/indexSun/oneR.vue';
import CenterMap from '/@/views/indexSun/centerMap.vue';
import { ServerDetailType } from '/@/components/body-d-left/bodyLeftHooks.ts';
import {
centerMapColumns,
centerMapFromList,
columns,
contactListColumns,
fromLists,
infoContentSpecial,
monitorColumns,
oneRNewColumns,
pieColumns,
pieSearch,
threeRModalColumns,
threeRModalFromList,
towRcolumns,
twoRform,
twoRNewColumns,
twoRNewForm,
} from '/@/views/indexSun/indexSun.ts';
import { nextTick, onMounted, onUnmounted, ref, watch } from 'vue';
import PhoneDialog from '/@/views/components/phoneDialog/phoneDialog.vue';
import { DataType, getSettings } from '/@/utils/settings.ts';
import IndexModal from '/@/views/indexSun/indexModal.vue';
import LoginOutButton from '/@/views/components/loginOutButton.vue';
import router from '/@/router';
import { getAuthCache } from '/@/utils/auth.ts';
import { basicPath, useSocket, emergencyPath } from '/@/utils/socket.ts';
import { Map } from '/@/assets/mapUtils/map.ts';
import EmployeeDialog from '/@/views/components/employeeDialog.vue';
import EmergencyDialog from '/@/views/components/emergencyDialog.vue';
import { handleSocketUrl, startTime } from '/@/utils/utils.ts';
import { useUserStore } from '/@/store/modules/user.ts';
const { getCenterInfo, setCount } = useUserStore();
import {
careUserApi,
contactListApi,
nearResourcesApi,
oneLApi,
oneRApi,
queryAnYanTokenApi,
roomDetailApi,
threeRModalApi,
todayEmergencyListApi,
twoLModalApi,
twoRModal1Api,
twoRModal2Api,
twoRModal3Api,
twoRNApi,
twoRNDetailApi,
watchPageApi,
} from '/@/views/indexSun/indexSun.api.ts';
import dayjs from 'dayjs';
import ThreeLeftNew from '/@/views/indexSun/threeLeftNew.vue';
import OneRightNew from '/@/views/indexSun/oneRightNew.vue';
import TwoNewR from '/@/views/indexSun/twoNewR.vue';
import { message } from 'ant-design-vue';
import HeartModal from '/@/views/indexSun/heartModal.vue';
import EmerModal from '/@/views/indexSun/emerModal.vue';
//0:处置 1:处理 2:呼入 3:全部
const phoneType = ref('');
const phoneDialogTitle = ref('呼入电话');
const phoneDialogRef = ref();
const indexModalRef = ref();
const heartModalRef = ref();
const emerRef = ref();
const pageRef = ref();
const indexModalTitle = ref();
const indexColumn: any = ref([]);
const setting = getSettings(DataType.xian);
const firstFormOne = ref();
const centerId = ref();
const apiParams = ref();
const modalApi = ref();
const needDept = ref(false);
const needDatePicker = ref(false);
const dateTimeArr = ref();
const twoROnly = ref();
const showRestB = ref(false);
const dateInfo = ref<object>({});
const rightDate = ref<string>('');
const count = ref<number>(0);
const qhInterval = ref();
const cInterval = ref();
const initDate = ref(startTime);
const showMapBottom = ref(false);
const userData = ref<object>({});
const centerMapRef = ref();
const twoNewR = ref();
const otherLoading = ref<boolean>(false);
onMounted(() => {
getTime();
qhInterval.value = setInterval(() => {
getTime();
}, 1000);
cInterval.value = setInterval(
() => {
count.value++;
},
5 * 60 * 1000
);
rightDate.value = '累计运行时间:' + (dayjs().diff(dayjs(initDate.value), 'days') + 1) + ' 天';
const centerInfo = getAuthCache('centerInfo');
centerId.value = centerInfo.id;
document.title = centerInfo.screenTitle || '健康服务中心';
if (sessionStorage.getItem('socketData')) {
console.log(JSON.parse(sessionStorage.getItem('socketData')));
confirmHelp(JSON.parse(sessionStorage.getItem('socketData')));
sessionStorage.removeItem('socketData');
}
});
function openRBModal(item: any) {
twoNewR.value.handlePolice(item);
}
const getTime = () => {
dateInfo.value = {
day: dayjs().format('YYYY年MM月DD日'),
times: dayjs().format('HH:mm:ss'),
};
};
watch(
() => dateInfo.value.day,
() => {
rightDate.value = '累计运行时间:' + (dayjs().diff(dayjs(initDate.value), 'days') + 1) + ' 天';
}
);
async function forHelp(record: any, showBottomInfo = true) {
indexModalRef.value.closeDialog();
record['lat'] = record?.latitude;
record['lon'] = record?.longitude;
Map.driving && Map.driving.clear();
Map.walking && Map.walking.clear();
if (record['lat']) {
let list: any = [];
const res: any = await nearResourcesApi({ longitude: record?.lon, latitude: record?.lat });
if (res.code === 200) {
list = res.result || [];
}
record['hospitalList'] = list.map((item: any) => {
item['latitude'] = item['lat'];
item['longitude'] = item['lon'];
return item;
});
} else {
centerMapRef.value.resetMap();
showRestB.value = false;
userData.value = record;
}
await confirmHelp(record, showBottomInfo);
}
function toOther() {
otherLoading.value = true;
queryAnYanTokenApi()
.then((res: any) => {
if (res.code === 200) {
// res.result = {
// scope: 'default',
// expires_in: 3348,
// token_type: 'bearer',
// access_token: '2a643081-b661-4f44-bc36-6bc91addde3a',
// refresh_token: 'e0a91714-59aa-4311-bb6c-ca3a48f20dd1',
// satoken: '9a493672-36e0-4539-9a74-650e95cefc87',
// };
window.open(
`http://aygc.pc.iosp.ydpt.tech/monitor/health?tokens=${res?.result?.access_token}&expires_in=${res?.result?.expires_in}&refresh_token=${res?.result?.refresh_token}&satoken=${res?.result?.satoken}`,
'_blank'
);
} else {
message.error(res?.message);
}
otherLoading.value = false;
})
.catch((err) => {
otherLoading.value = false;
console.log(err);
});
}
async function toZ() {
const routeUrl = router.resolve({
path: '/home2',
}).href;
window.open(routeUrl, '_blank');
}
function handleOneLeftClick(item: any) {
const { name, key, dateType } = item;
let startDate;
let endDate;
//呼入电话
//受理电话
if (key == 'alerdyreceive' || key == 'gross') {
phoneType.value = (ServerDetailType as any)[key];
indexModalTitle.value = name;
firstFormOne.value = fromLists[0];
indexColumn.value = columns[0];
modalApi.value = oneLApi;
needDept.value = false;
needDatePicker.value = true;
console.log(dateType, 123);
if (dateType == '0') {
startDate = dayjs().startOf('week').format('YYYY-MM-DD');
endDate = dayjs().endOf('week').format('YYYY-MM-DD');
} else if (dateType == '1') {
endDate = dayjs().format('YYYY-MM-DD');
startDate = dayjs().subtract(7, 'day').format('YYYY-MM-DD');
} else {
startDate = '';
endDate = '';
}
if (dateType == '2') {
dateTimeArr.value = [];
} else {
dateTimeArr.value = [startDate, endDate];
}
apiParams.value = {
phoneType: key == 'gross' ? 0 : 1,
centerId: centerId.value,
startDate: startDate,
endDate: endDate,
};
twoROnly.value = '';
nextTick(() => {
indexModalRef.value.openDialog();
});
}
}
function handleTwoLClick(params: any) {
indexModalTitle.value = '应急求助详情';
indexColumn.value = columns[1];
firstFormOne.value = fromLists[1];
twoROnly.value = '';
modalApi.value = twoLModalApi;
needDept.value = true;
needDatePicker.value = false;
nextTick(() => {
emerRef.value.openDialog(params);
});
}
function handleOneRClick() {
// router.push({
// path: '/indexSon',
// });
indexModalTitle.value = '健康终端报警';
indexColumn.value = monitorColumns;
firstFormOne.value = [];
twoROnly.value = '';
modalApi.value = oneRApi;
needDept.value = true;
nextTick(() => {
indexModalRef.value.openDialog();
});
}
// 健康监测工具报警
let socketUrl = handleSocketUrl(basicPath, getCenterInfo?.id);
const { socketData, setSocketData, closeSocket } = useSocket(socketUrl);
const employeeDialogRef = ref();
watch(socketData, (nVal) => {
if (nVal) {
nextTick(() => {
setCount();
setSocketData(nVal);
employeeDialogRef.value.openDialog();
});
}
});
//应急求助、120弹窗
let socketUrl1 = handleSocketUrl(emergencyPath, getCenterInfo?.id);
const { socketData: socketData1, setSocketData: setSocketData1, closeSocket: closeSocket1 } = useSocket(socketUrl1, false);
const emergencyDialogRef = ref(); //紧急求助
watch(socketData1, (nVal) => {
if (nVal) {
setCount();
setSocketData1(nVal);
emergencyDialogRef.value.openDialog();
}
});
const hospitalList = ref([]); //医院列表
const showHospitalList = ref(false);
async function confirmHelp(data: any, showBottomInfo = true) {
showMapBottom.value = false;
Map.driveLine && Map.driveLine.clear();
try {
const res = await careUserApi({ userId: data?.userId, workNo: data?.employeeNum });
data['careLiaisonName'] = res?.result?.careLiaisonName;
data['careLiaisonPhone'] = res?.result?.careLiaisonPhone;
data['lifeguardName'] = res?.result?.lifeguardName;
data['lifeguardPhone'] = res?.result?.lifeguardPhone;
} catch (err) {
console.log(err);
}
userData.value = data;
if (!data.lon || !data.lat) {
centerMapRef.value.newResetMap();
showMapBottom.value = data?.emergencyType != 2 && showBottomInfo;
return;
}
Map.removeOverlayGroup();
try {
hospitalList.value = data.hospitalList;
//用户的坐标信息
let point = [data.lon, data.lat];
centerMapRef.value.setStartPosition(data);
const a = ((await getHospitalList(data.hospitalList, point)) as any) || [];
hospitalList.value = a.sort((a: any, b: any) => a.distance - b.distance);
const arr = await Map.createOverlay1(
hospitalList.value.concat([{ latitude: data.lat, longitude: data.lon }]),
{
content: (val: any) => {
return `<div style="
width: 21px;
height: 44px;
position: absolute;
left: -20px;
top: -20px;" title="${val?.name}">
</div>`;
},
},
async (val) => {
if (Map.mapDriverOrWalkLoading) return;
Map.createInfoModal({ option: val, content: infoContentSpecial(val) }, false);
const end = await Map.getAddressByPoint([val.lon, val.lat]);
if (!data?.address) {
data['address'] = await Map.getAddressByPoint([data.lon, data.lat]);
}
centerMapRef.value.getSearch({
startPosition: [data.lon, data.lat],
endPosition: [val.lon, val.lat],
start: data['address'],
end,
});
('');
},
true,
'1'
);
Map.getAddressByPoint(point)
.then((res) => {
const option = {
lon: data.lon,
lat: data.lat,
position: point,
name: data.realName,
address: res,
sex: data.sex,
};
Map.createEmergencyMarker(option);
Map.map.setFitView([...arr, Map.emergencyMarker], false, [180, 180, 180, 180]);
})
.catch((err: any) => {
console.log(err);
});
} catch (e: any) {
console.log(e);
}
}
async function getHospitalList(hospitalList, userLocation) {
const hospitalPromises = hospitalList.map(async (item) => {
item.distance = getDistance(userLocation, [item.lon, item.lat]);
let t = '';
let r = '';
if (item.distance > 2000) {
const { time, routeList } = await getDriveTime(userLocation, [item.lon, item.lat]);
t = time;
r = routeList;
} else {
const { time, routeList } = await getWalkingTime(userLocation, [item.lon, item.lat]);
t = time;
r = routeList;
}
item.driveTime = t;
item.routeList = r;
item.userLocation = userLocation;
return item; // 返回更新后的医院条目
});
return Promise.all(hospitalPromises);
}
function getDistance(userLocation, destination) {
const value = Map.getDistance(userLocation, destination);
// return value > 1000 ? (value / 1000).toFixed(2) + 'km' : parseInt(value) + 'm';
return value;
}
async function getDriveTime(userLocation, destination) {
let { time, steps } = await Map.getDriveTime(userLocation, destination);
let h,
m,
s = 0;
if (time <= 60) {
return {
time: `${s}秒`,
routeList: steps,
};
}
if (time > 60 && time < 3600) {
m = Math.floor(time / 60);
return {
time: `${m}分`,
routeList: steps,
};
}
if (time >= 3600) {
h = Math.floor(time / 3600);
m = Math.floor((time - h * 3600) / 60);
return {
time: `${h}小时${m}分`,
routeList: steps,
};
}
}
async function getWalkingTime(userLocation, destination) {
let { time, steps } = await Map.getWalkingTime(userLocation, destination);
let h,
m,
s = 0;
if (time <= 60) {
return {
time: `${s}秒`,
routeList: steps,
};
}
if (time > 60 && time < 3600) {
m = Math.floor(time / 60);
return {
time: `${m}分`,
routeList: steps,
};
}
if (time >= 3600) {
h = Math.floor(time / 3600);
m = Math.floor((time - h * 3600) / 60);
return {
time: `${h}小时${m}分`,
routeList: steps,
};
}
}
function clearHospitalList() {
hospitalList.value = [];
showHospitalList.value = false;
}
function handleLastSeven(item) {
handleOneLeftClick(item);
}
onUnmounted(() => {
if (qhInterval.value) clearInterval(qhInterval.value);
if (cInterval.value) clearInterval(cInterval.value);
// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function () {
closeSocket();
closeSocket1(); //西安云坐席
};
});
function handleThreeRClick(type) {
const textArr = ['心血管异常人员列表', '脑血管异常人员列表', '冠状CT异常人员列表'];
indexModalTitle.value = textArr[type - 1];
indexColumn.value = threeRModalColumns;
modalApi.value = threeRModalApi;
twoROnly.value = '';
apiParams.value = { queryType: type };
needDept.value = false;
firstFormOne.value = threeRModalFromList;
nextTick(() => {
indexModalRef.value.openDialog();
});
}
function handleTwoRClick(data) {
const textArr = ['健康打卡减重数据', '健康打卡减血糖数据', '健康打卡血压数据'];
indexModalTitle.value = textArr[data.type - 1];
indexColumn.value = towRcolumns[data.type - 1];
needDept.value = false;
twoROnly.value = data;
const apiArr = [twoRModal1Api, twoRModal2Api, twoRModal3Api];
const params = {
inputDateBegin: '',
inputDateEnd: '',
abFlag: data.normal == 2 ? '1' : '2',
};
if (data.date == 1) {
params.inputDateBegin = dayjs().format('YYYY-MM-DD');
params.inputDateEnd = dayjs().format('YYYY-MM-DD');
} else {
params.inputDateBegin = dayjs().startOf('month').format('YYYY-MM-DD');
params.inputDateEnd = dayjs().format('YYYY-MM-DD');
}
apiParams.value = params;
modalApi.value = apiArr[data.type - 1];
firstFormOne.value = twoRform(data.normal == 2 ? '1' : '');
nextTick(() => {
indexModalRef.value.openDialog();
});
}
function handleTwoNewRClick() {
indexColumn.value = twoRNewColumns;
firstFormOne.value = twoRNewForm;
const params = {
centerId: centerId.value,
};
indexModalTitle.value = '重点关爱趋势预警';
modalApi.value = twoRNDetailApi;
needDept.value = false;
needDatePicker.value = false;
apiParams.value = params;
nextTick(() => {
indexModalRef.value.openDialog();
});
}
function handleOneRightView() {
indexColumn.value = oneRNewColumns;
firstFormOne.value = [];
const params = {
centerId: centerId.value,
startDate: '2000-01-01',
endDate: '2030-12-31',
};
indexModalTitle.value = '今日应急';
modalApi.value = todayEmergencyListApi;
apiParams.value = params;
nextTick(() => {
indexModalRef.value.openDialog();
});
}
function handlePieView(params: any) {
indexColumn.value = pieColumns;
firstFormOne.value = pieSearch;
nextTick(() => {
heartModalRef.value.openDialog(params);
});
}
function handleEmer(userId: string) {
indexColumn.value = contactListColumns;
firstFormOne.value = [];
const params = {
userId,
};
indexModalTitle.value = '紧急联系人';
modalApi.value = contactListApi;
apiParams.value = params;
nextTick(() => {
indexModalRef.value.openDialog();
});
}
function handleCenterMapClick(res: any) {
indexColumn.value = centerMapColumns;
firstFormOne.value = centerMapFromList;
const params = {
healthRoomId: res?.ayId,
};
indexModalTitle.value = '健康小屋详情';
modalApi.value = roomDetailApi;
apiParams.value = params;
nextTick(() => {
indexModalRef.value.openDialog();
});
}
function openEmergencyOpen() {
setSocketData1({
userId: '1942871719583739905',
phone: '15129287781',
realName: '连龙刚',
lon: 108.94734,
lat: 34.218951,
sex: 2,
age: 37,
orgCode: 'A01A01A02',
orgName: '硬件部',
departCode: 'A01A01',
departName: '软硬件开发部',
type: '0',
centerId: '1940693902422519809',
popType: 3,
queue: null,
noticeId: null,
careLiaisonName: '周飞飞',
careLiaisonPhone: '18800001111',
lifeguardName: '李林林',
lifeguardPhone: '15511110000',
});
emergencyDialogRef.value.openDialog();
}
function employeeDialogOpen() {
setSocketData({
watchNo: 'A5GTQ24920002519',
eventType: 'a_key_alarm',
eventType_dictText: '一键告警',
bindUserId: '1942871719583739905',
bindDate: '2025-07-23',
createBy: 'apiusername',
createDate: '2025-09-25 15:01:11',
dataValue: '',
address: null,
lon: 0,
lat: 0,
dataDate: '2025-09-25',
warnTime: '2025-09-25 15:00:03',
gpsErrorMsg: '定位超时',
lonGd: null,
latGd: null,
addressGd: null,
sendFlag: '0',
largeScreenFlag: '0',
orgCode: 'A01A01A02',
orgName: '硬件部',
realName: '连龙刚',
phone: '15129287781',
hospitalList: [
{
name: '跃满油田作业区',
lon: 82.9955,
lat: 40.787056,
},
{
name: '跃满油田作业区',
lon: 82.9955,
lat: 40.787056,
},
{
name: '采油一厂稠油小屋',
lon: 84.881775,
lat: 44.987652,
},
],
centerId: '1940693902422519809',
popType: 3,
keyUser: '0',
avatar: null,
sex: 2,
age: 37,
workNo: '2025001',
deptName: '软硬件开发部',
audioUrl: null,
});
employeeDialogRef.value.openDialog();
}
// setTimeout(() => {
// employeeDialogOpen();
// openEmergencyOpen();
// yunZOpen();
// }, 5000);
</script>
<style lang="less" scoped>
.sun-screen-box {
height: 100vh;
letter-spacing: 2px;
background: url('/@/assets/indexSun/bigBg.png') no-repeat;
background-size: 100% 100%;
.sun-screen-title {
height: 80px;
background: url('/@/assets/indexSun/bg.png') no-repeat;
background-size: 100% 100%;
display: flex;
font-size: 20px;
color: #fff;
text-align: center;
font-family: MicrosoftYaHei-Bold;
.sun-title-left {
text-align: left;
flex: 1;
line-height: 60px;
padding-left: 15px;
font-weight: bold;
}
.sun-title-right {
flex: 1;
text-align: right;
line-height: 50px;
> button {
&:nth-child(1) {
margin-right: 10px;
}
&:nth-child(2) {
margin-right: 30px;
}
}
}
.sun-title-center {
flex: 1;
font-size: 50px;
line-height: 80px;
letter-spacing: 10px;
text-shadow: 2px 2px 5px rgba(118, 141, 219, 0.53);
font-weight: bold;
}
}
.sun-body-content {
height: calc(100% - 80px);
padding: 10px 20px;
display: flex;
justify-content: space-between;
.sun-body-left,
.sun-body-right {
height: 100%;
width: 22%;
display: flex;
flex-direction: column;
//justify-content: space-between;
}
.sun-body-center {
flex: 1;
margin: 0 10px;
height: 100%;
display: flex;
flex-direction: column;
}
.sun-body-left {
> div {
margin-bottom: 10px;
border: 1px solid #00ccff;
border-radius: 14px;
.one-l-box,
.two-l-box,
.three-l-box,
.three-r-box,
.three-new-l {
height: 100%;
}
}
.sun-body-left-one {
height: 20%;
}
.sun-body-left-two {
flex: 1;
}
.sun-body-left-three {
//height: 45%;
}
//.sun-body-left-four {
// height: 18%;
//}
}
.sun-body-right {
//display: flex;
//flex-direction: column;
> div {
border: 1px solid #00ccff;
border-radius: 14px;
overflow: hidden;
overflow: hidden;
&:not(:last-child) {
margin-bottom: 10px;
}
.one-r-box,
.two-r-box,
.three-r-box {
height: 100%;
}
}
.sun-body-right-one {
}
.sun-body-right-two {
flex: 1;
}
.sun-body-right-three {
flex: 1;
}
}
}
}
.top-right-button {
color: #ffffff;
font-weight: bold;
font-size: 18px;
width: 160px;
height: 40px;
background: radial-gradient(ellipse at center, #082147 0%, #08254c 55%, #085faa 100%);
border-radius: 8px;
border: 1px solid #55d3ff;
}
:deep(.amap-info-close) {
top: 15px;
right: 15px;
}
:deep(.emergency-dialog) {
position: relative;
&::before {
content: '';
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background:
linear-gradient(to top, transparent calc(100% - 15px), #a0440f 100%),
linear-gradient(to bottom, transparent calc(100% - 15px), #a0440f 100%),
linear-gradient(to left, transparent calc(100% - 15px), #a0440f 100%),
linear-gradient(to right, transparent calc(100% - 15px), #a0440f 100%);
animation: borderFlash 2s ease-in-out infinite;
}
@keyframes borderFlash {
0% {
opacity: 1;
}
50% {
opacity: 0.5;
}
100% {
opacity: 1;
}
}
}
</style>