diff --git a/.env.test b/.env.test index 4267570..11f16b8 100644 --- a/.env.test +++ b/.env.test @@ -6,3 +6,7 @@ VITE_GLOB_API_URL=http://cqyt.test.yg.dt.io VITE_GLOB_API_YIN_JI=ws://cqyt.test.yg.dt.io/health-emergency/websocket/watchMonitor #健康监测工具报警-websocket VITE_GLOB_API_JIAN_CE=ws://cqyt.test.yg.dt.io/health-emergency/websocket/emergency +#西安云坐席 +VITE_GLOB_API_XIAN_YUN=ws://cqyt.test.yg.dt.io/health-emergency/websocket/emergency3 +#银川云坐席 +VITE_GLOB_API_YIN_CHUAN=ws://cqyt.test.yg.dt.io/health-emergency/websocket/emergency4 \ No newline at end of file diff --git a/src/api/request.ts b/src/api/request.ts index 1979e72..a074cde 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -31,8 +31,10 @@ service.interceptors.response.use( }, (error) => { if (error.response) { + console.log('response', error.response); switch (error.response.data.code) { case 401: + // debugger; let path = getBaseLogin(); if (!path) { path = toLoginByNowPath(router.currentRoute.value.path); diff --git a/src/api/user.ts b/src/api/user.ts index 725dc2e..33e0f5f 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -6,6 +6,7 @@ enum Api { Logout = '/sys/logout', GetUserInfo = '/sys/user/getUserInfo', auth = '/sys/permission/getPermCode', + emergencyCenter = '/health-emergency/emergency/center/getCenterDetail', } export const getCodeInfo = (params: any) => get(Api.getInputCode + `/${params}`); @@ -14,6 +15,14 @@ export function loginApi(params: any) { return post(Api.Login, params); } +/** + * @description 获取登录人应急中心数据 + * @param params + */ +export function getEmergencyCenterApi(params?: any) { + return get(Api.emergencyCenter, params); +} + /** * @description: getUserInfo */ diff --git a/src/assets/img/empty-img.png b/src/assets/img/empty-img.png new file mode 100644 index 0000000..f238a94 Binary files /dev/null and b/src/assets/img/empty-img.png differ diff --git a/src/assets/mapUtils/commonFun.ts b/src/assets/mapUtils/commonFun.ts index c814711..2177592 100644 --- a/src/assets/mapUtils/commonFun.ts +++ b/src/assets/mapUtils/commonFun.ts @@ -1,4 +1,4 @@ -import { mapIcon1, mapIcon2, mapIcon3, mapIcon4 } from '/@/components/chinaMap/chinaHooks.ts'; +import { mapIcon1, mapIcon2, mapIcon3, mapIcon4, mapIcon7 } from '/@/components/chinaMap/chinaHooks.ts'; import { watchIcon } from '/@/components/secondaryScreen/secondMap/secondMapHooks.ts'; import * as turf from '@turf/turf'; @@ -20,7 +20,7 @@ export function createIcon({ icon, iconSize, imageSize }) { * @desc 根据类型创建Icon * @type 1:油田医院,2:合作医院,3:医疗点 */ -export function typeToIcon(type: string) { +export function typeToIcon(type: string, centerResource: boolean) { const iconSize = [18, 44]; const imageSize = [18, 44]; if (type == '1') { @@ -29,6 +29,10 @@ export function typeToIcon(type: string) { if (type == '2') { return createIcon({ icon: mapIcon4, iconSize, imageSize }); } + //关联医疗点 + if (type == '3' && centerResource) { + return createIcon({ icon: mapIcon7, iconSize, imageSize }); + } if (type == '3') { return createIcon({ icon: mapIcon2, iconSize, imageSize }); } diff --git a/src/assets/mapUtils/map.ts b/src/assets/mapUtils/map.ts index 67a54e9..efbdf91 100644 --- a/src/assets/mapUtils/map.ts +++ b/src/assets/mapUtils/map.ts @@ -144,7 +144,7 @@ export const Map = { this.setZoomCenter(center, zoom); } for (let i = 0; i < result.length; i++) { - let { type, lon, lat, lng } = result[i]; + let { type, lon, lat, lng, centerResource } = result[i]; if (lng) { lon = lng; } @@ -152,7 +152,7 @@ export const Map = { continue; } // 创建一个 Icon - let startIcon = typeToIcon(type); + let startIcon = typeToIcon(type, centerResource); // 将 icon 传入 marker let startMarker = new AMap.Marker({ // 点的坐标 diff --git a/src/components/body-d-left/bodyLeftHooks.ts b/src/components/body-d-left/bodyLeftHooks.ts index 1444c2c..796f807 100644 --- a/src/components/body-d-left/bodyLeftHooks.ts +++ b/src/components/body-d-left/bodyLeftHooks.ts @@ -1,5 +1,6 @@ import { ref, unref } from 'vue'; import * as echarts from 'echarts'; +import { emptyChart } from '/@/utils/utils.ts'; //服务详情数据弹窗参数 export enum ServerDetailType { @@ -205,8 +206,24 @@ const radarChartsTheme = { * @param countList:数据项 */ export const radarCharts = ({ indicator, countList, theme }) => { + if (!countList?.length) { + return emptyChart(); + } const { radarName, splitLine, axisName, areaStyle, lineStyle, itemStyle } = radarChartsTheme[theme] || radarChartsTheme.dark; return { + noDataLoadingOption: { + text: '暂无数据', + effect: 'whirling', + effectOption: { + period: 3, + radius: 10, + frame: 3, + }, + textStyle: { + color: '#333', + fontSize: 16, + }, + }, grid: { top: '1%', left: '5%', diff --git a/src/components/chinaMap/chinaHooks.ts b/src/components/chinaMap/chinaHooks.ts index acbdd8b..434e819 100644 --- a/src/components/chinaMap/chinaHooks.ts +++ b/src/components/chinaMap/chinaHooks.ts @@ -120,6 +120,7 @@ export const mapIcon3 = new URL('/@/assets/img/mapIcon3.png', import.meta.url).h export const mapIcon4 = new URL('/@/assets/img/mapIcon4.png', import.meta.url).href; export const mapIcon5 = new URL('/@/assets/img/mapIcon5.png', import.meta.url).href; export const mapIcon6 = new URL('/@/assets/img/mapIcon6.png', import.meta.url).href; +export const mapIcon7 = new URL('/@/assets/img/mapIcon7.png', import.meta.url).href; export const legend1 = new URL('/@/assets/img/legend1.png', import.meta.url).href; export const legend2 = new URL('/@/assets/img/legend2.png', import.meta.url).href; diff --git a/src/enum/pageEnum.ts b/src/enum/pageEnum.ts index afaad1b..75c099c 100644 --- a/src/enum/pageEnum.ts +++ b/src/enum/pageEnum.ts @@ -4,7 +4,10 @@ export enum PageEnum { BASE_LOGIN = '/login', BASE_HOME = '/home', BASE_LOGIN_YINCHUAN = '/screenLogin', + // centralScreenLogin + CENTRAL_SCREEN_LOGIN = '/centralScreenLogin', YINCHUAN_HOME = '/yinChuanHome', + CENTRAL_SCREEN = '/centralScreen', } export function setBaseLogin(baseLogin) { @@ -18,12 +21,15 @@ export function getBaseLogin() { //根据当前路径跳转登录页 export function toLoginByNowPath(nowPath: string) { const xianPath = ['/home', '/secondScreen', '/']; - const yinchuanPath = ['/yinChuanHome', '/yinChuanTest']; + //其他应急中心的页面路径 + const centerPath = ['/centralScreen', '/centralScreenLogin']; if (xianPath.includes(nowPath)) { return PageEnum.BASE_LOGIN; } else if (yinchuanPath.includes(nowPath)) { return PageEnum.BASE_LOGIN_YINCHUAN; + } else if (centerPath.includes(nowPath)) { + return PageEnum.CENTRAL_SCREEN_LOGIN; } } @@ -33,10 +39,14 @@ export function toHomeByLogoutPath(nowPath: string) { const xianPath = ['/home', '/secondScreen', '/']; //银川的页面路径 const yinchuanPath = ['/yinChuanHome', '/yinChuanTest']; + //其他应急中心的页面路径 + const centerPath = ['/centralScreen']; if (xianPath.includes(nowPath)) { return PageEnum.BASE_HOME; } else if (yinchuanPath.includes(nowPath)) { return PageEnum.YINCHUAN_HOME; + } else if (centerPath.includes(nowPath)) { + return PageEnum.YINCHUAN_HOME; } } diff --git a/src/router/index.ts b/src/router/index.ts index 031a558..2b28da8 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -12,6 +12,7 @@ const routes: Array = [ path: '/login', name: 'login', meta: { + //西安大屏登录 title: '登录', }, component: () => import('/@/views/sys/login.vue'), @@ -20,6 +21,16 @@ const routes: Array = [ path: '/screenLogin', name: 'screenLogin', meta: { + //银川大屏登录 + title: '登录', + }, + component: () => import('/@/views/sys/login.vue'), + }, + { + path: '/centralScreenLogin', + name: 'centralScreenLogin', + meta: { + //分中心大屏登录 title: '登录', }, component: () => import('/@/views/sys/login.vue'), @@ -68,7 +79,7 @@ const routes: Array = [ path: '/centralScreen', name: 'centralScreen', meta: { - title: '应急大屏', + title: '应急中心', }, component: () => import('/@/views/centralScreen/centralScreen.vue'), }, diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 1c6ef0c..22f923e 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -20,6 +20,7 @@ export const useUserStore = defineStore({ flag1: '', //银川权限标识 flag2: '', //西安权限标识 centerId: '', //中心点id + centerInfo: null, //应急中心信息 }), getters: { getUserInfo(): UserInfo { @@ -43,6 +44,9 @@ export const useUserStore = defineStore({ getCenterId(): string { return this.centerId || getAuthCache('centerId'); }, + getCenterInfo(): any { + return this.centerInfo || getAuthCache('centerInfo'); + }, }, actions: { setToken(info: string | undefined) { @@ -72,6 +76,10 @@ export const useUserStore = defineStore({ this.centerId = info ? info : ''; setAuthCache('centerId', info); }, + setCenterInfo(info: any) { + this.centerInfo = info; + setAuthCache('centerInfo', info); + }, /** * 登录事件 */ diff --git a/src/utils/socket.ts b/src/utils/socket.ts index e1bf862..b0fb26c 100644 --- a/src/utils/socket.ts +++ b/src/utils/socket.ts @@ -19,7 +19,12 @@ export const xianYunPath = VITE_GLOB_API_XIAN_YUN; export const yinChuanPath = VITE_GLOB_API_YIN_CHUAN; let t = token || getAuthCache(TOKEN_KEY); -export function useSocket(p = basicPath) { +/** + * + * @param p websocket地址 + * @param hasTimestamp 是否需要时间戳 + */ +export function useSocket(p = basicPath, hasTimestamp: boolean = true) { const socket = ref(); let socketData = ref({}); let lockReconnect = ref(false); //避免ws重复连接 @@ -75,7 +80,12 @@ export function useSocket(p = basicPath) { } else { closeSocket(); // 实例化socket - socket.value = new WebSocket(path.value + Date.now(), [t]); + //判断是否需要时间戳 + if (hasTimestamp) { + socket.value = new WebSocket(path.value + Date.now(), [t]); + } else { + socket.value = new WebSocket(path.value, [t]); + } socket.value.onclose = function () { reconnect(path.value); diff --git a/src/utils/utils.ts b/src/utils/utils.ts index a650b90..266bf8a 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -53,3 +53,18 @@ export function visibleChartLabel(chartData) { } return data; } + +export function emptyChart() { + return { + title: { + text: '暂无数据', + x: 'center', + y: 'center', + textStyle: { + color: '#fff', + fontWeight: 'normal', + fontSize: 14, + }, + }, + }; +} diff --git a/src/views/centralScreen/centralScreen.api.ts b/src/views/centralScreen/centralScreen.api.ts index e1cad02..3f3dac2 100644 --- a/src/views/centralScreen/centralScreen.api.ts +++ b/src/views/centralScreen/centralScreen.api.ts @@ -2,7 +2,7 @@ import { get, post } from '/@/api/request.ts'; enum Api { server = '/health-emergency/emergency/tblUserHelp/statistics', - getDetail = '/health-medical/medical/hospital/getMedicalHospital', + getDetail = '/health-medical/medical/hospital/getMedicalHospitalNew', getMonitorList = '/health-watch/watch/watchMonitorData/getMonitorList', statisticsNew = '/health-emergency/emergency/LargeScreenNew/statisticsNew', phoneListNew = '/health-emergency/emergency/LargeScreenNew/phoneListNew', @@ -27,20 +27,31 @@ export const medicalCenterNew = (params: any) => post(Api.medicalCenterNew, para * @param params */ -export const userHealthCenterNew = (params: any) => get(Api.userHealthCenterNew, params); +export const userHealthCenterNew = (params: any) => { + return post(Api.userHealthCenterNew, params); +}; /** * @description 获取体检数据 * @param params */ -export const getPhysicalData = (params: any) => get(Api.getDetail, params); +export const getPhysicalData = (params: any) => { + let { centerId, ...other } = params; + return post(Api.getDetail, other); +}; /** * @description 呼入电话、受理电话 * @param params */ export const getPhoneList = (params: any) => post(Api.phoneListNew, params); -//健康终端报警 -export const getMonitorList = (params: any) => get(Api.getMonitorList, params); +/** + * @description 健康终端报警 + * @param params + */ +export const getMonitorList = (params: any) => { + let { orgCodeList, ...otherParams } = params; + return get(Api.getMonitorList + '?orgCodeList=' + orgCodeList, otherParams); +}; /** * @description 获取地图所有资源 diff --git a/src/views/centralScreen/centralScreen.vue b/src/views/centralScreen/centralScreen.vue index e2cfa18..722d984 100644 --- a/src/views/centralScreen/centralScreen.vue +++ b/src/views/centralScreen/centralScreen.vue @@ -42,15 +42,19 @@ -
+
+ + + + - + diff --git a/src/views/centralScreen/components/employeeHealth.vue b/src/views/centralScreen/components/employeeHealth.vue index 8e1f6c9..9ed7b44 100644 --- a/src/views/centralScreen/components/employeeHealth.vue +++ b/src/views/centralScreen/components/employeeHealth.vue @@ -18,6 +18,7 @@ import PublicTitle from '/@/components/publicTitle.vue'; import { caching, useSession } from '/@/hooks/autoRefresh/caching.ts'; import { userHealthCenterNew } from '/@/views/centralScreen/centralScreen.api.ts'; + import { useUserStore } from '/@/store/modules/user.ts'; const props = defineProps({ setting: Object, @@ -66,9 +67,12 @@ }); } + const userStore = useUserStore(); + async function viewDetail() { try { - const { code, result } = await userHealthCenterNew({ dataType: props.setting?.dataType }); + let centerId = userStore.getCenterInfo?.id; + const { code, result } = await userHealthCenterNew({ dataType: props.setting?.dataType, centerId }); if (code != 200) { return; } diff --git a/src/views/centralScreen/components/phoneDialog.vue b/src/views/centralScreen/components/phoneDialog.vue index cef5c04..dc7daca 100644 --- a/src/views/centralScreen/components/phoneDialog.vue +++ b/src/views/centralScreen/components/phoneDialog.vue @@ -29,6 +29,7 @@ import { SexType, sexTypeList } from '/@/utils/settings.ts'; import { getPhoneList } from '/@/views/centralScreen/centralScreen.api.ts'; import { useTheme } from '/@/hooks/theme/useTheme.ts'; + import { useUserStore } from '/@/store/modules/user.ts'; const props = defineProps({ record: Object, @@ -89,12 +90,14 @@ const formRecord = ref({ sex: SexType.all, }); + const userStore = useUserStore(); const formState = computed(() => ({ ...formRecord.value, centerId: '', dataType: props.setting.dataType, phoneType: props.phoneType, showType: '0', + centerId: userStore.getCenterInfo?.id, })); const dialogTitle = ref(); const { visible, closeDialog, openDialog } = useDialog({ title: dialogTitle.value }); diff --git a/src/views/centralScreen/components/physicalExaminationData.vue b/src/views/centralScreen/components/physicalExaminationData.vue index b7b23e3..433707c 100644 --- a/src/views/centralScreen/components/physicalExaminationData.vue +++ b/src/views/centralScreen/components/physicalExaminationData.vue @@ -26,6 +26,7 @@ import * as echarts from 'echarts'; import { useTheme } from '/@/hooks/theme/useTheme.ts'; import { getPhysicalData } from '/@/views/centralScreen/centralScreen.api.ts'; + import { useUserStore } from '/@/store/modules/user.ts'; const props = defineProps({ refreshState: { @@ -54,11 +55,15 @@ }); const { radarList, setRadarList, getRadarList } = useHospitalList(); + const userStore = useUserStore(); async function getList() { setSpin(true); try { - const { code, result } = (await getPhysicalData({ dataType: props.setting.dataType, condition: selectVal.value })) || {}; + let orgCodeList = userStore.getCenterInfo?.serviceScope || ''; + let centerId = userStore.getCenterInfo?.id || ''; + const { code, result } = + (await getPhysicalData({ dataType: props.setting.dataType, condition: selectVal.value, orgCodeList, centerId })) || {}; setSpin(!spinning.value); if (code != 200) { return; @@ -75,19 +80,21 @@ function setValue(result) { setRadarList(result); const everyEmpty = allValueEmpty('value', getRadarList()); - everyEmpty && initChart(); + // everyEmpty && initChart(); + initChart(); } const radarChartsRef = ref(); function initChart() { const myChart = echarts.init(radarChartsRef.value); - let countList = radarList?.value.map((item) => item?.userCount); - if (countList.length < 1) return; + let countList = radarList?.value?.map((item) => item?.userCount) || []; + // if (countList?.length < 1) return; let max = Math.max(...countList); - const indicator = radarList?.value.map((item) => ({ name: item?.hospitalName, max: max })); + const indicator = radarList?.value?.map((item) => ({ name: item?.hospitalName, max: max })); const option = radarCharts({ indicator, countList, theme: unref(themeType) }); myChart.setOption(option); + myChart.showLoading('noData'); window.addEventListener('resize', () => { myChart.resize(); }); diff --git a/src/views/centralScreen/components/serviceDetails.vue b/src/views/centralScreen/components/serviceDetails.vue index 998f4ec..69335c1 100644 --- a/src/views/centralScreen/components/serviceDetails.vue +++ b/src/views/centralScreen/components/serviceDetails.vue @@ -35,6 +35,7 @@ import { useSession, caching } from '/@/hooks/autoRefresh/caching.ts'; import { useTheme } from '/@/hooks/theme/useTheme.ts'; import { statisticsNewApi } from '/@/views/centralScreen/centralScreen.api.ts'; + import { useUserStore } from '/@/store/modules/user.ts'; const { themeType } = useTheme(); const { SERVER_DETAIL } = caching; @@ -62,11 +63,13 @@ const useDetail = useDetailStore(); const { setSession, getSession } = useSession(); + const userStore = useUserStore(); async function getList() { setSpin(true); try { - const { code, result } = (await statisticsNewApi({ condition: selectVal.value, centerId: '' })) || {}; + let centerId = userStore.getCenterInfo?.id; + const { code, result } = (await statisticsNewApi({ condition: selectVal.value, centerId })) || {}; setSpin(false); if (code != 200 || !result) { return; diff --git a/src/views/centralScreen/components/terminalAlarm.vue b/src/views/centralScreen/components/terminalAlarm.vue index 55816f9..8fb3359 100644 --- a/src/views/centralScreen/components/terminalAlarm.vue +++ b/src/views/centralScreen/components/terminalAlarm.vue @@ -47,7 +47,7 @@
发生地点:
-
{{ userInfo?.address }}
+
{{ userInfo?.address }}
{{ userInfo?.gpsErrorMsg }}
@@ -67,6 +67,7 @@ import { DataType } from '/@/utils/settings.ts'; import { useTheme } from '/@/hooks/theme/useTheme.ts'; import { message } from 'ant-design-vue'; + import { useUserStore } from '/@/store/modules/user.ts'; const props = defineProps({ setting: Object, @@ -115,10 +116,12 @@ * @desc 终端报警 * */ const scrollList = ref([]); + const userStore = useUserStore(); async function getScrollList() { try { - const { code, result } = await getMonitorList({ pageSize: 10, pageNo: 1, orgCode: props.setting?.orgCode }); + let orgCodeList = userStore.getCenterInfo?.serviceScope; + const { code, result } = await getMonitorList({ pageSize: 10, pageNo: 1, orgCode: props.setting?.orgCode, orgCodeList }); if (code == 200) { setSession(RIGHT_KEY1_NEW, JSON.stringify(result.records)); scrollList.value = result.records; diff --git a/src/views/centralScreen/components/terminakAlarmDialog.vue b/src/views/centralScreen/components/terminalAlarmDialog.vue similarity index 94% rename from src/views/centralScreen/components/terminakAlarmDialog.vue rename to src/views/centralScreen/components/terminalAlarmDialog.vue index 69cdae1..b74cd31 100644 --- a/src/views/centralScreen/components/terminakAlarmDialog.vue +++ b/src/views/centralScreen/components/terminalAlarmDialog.vue @@ -16,6 +16,7 @@ import { useDialog } from '/@/views/components/dialogHooks.ts'; import BasicTable from '/@/components/secondaryScreen/secondMap/components/basicTable/BasicTable.vue'; import { getMonitorList } from '/@/views/centralScreen/centralScreen.api.ts'; + import { useUserStore } from '/@/store/modules/user.ts'; const props = defineProps({ record: Object, @@ -72,9 +73,12 @@ // }, }, ]; + const userStore = useUserStore(); + const formState = computed(() => ({ dataType: props.setting.dataType, orgCode: props.setting?.orgCode, + orgCodeList: userStore.getCenterInfo?.serviceScope, })); const { visible, closeDialog, openDialog } = useDialog({ title: props.title }); const registerTable = ref(); diff --git a/src/views/sys/login.vue b/src/views/sys/login.vue index ceee0e0..543fa49 100644 --- a/src/views/sys/login.vue +++ b/src/views/sys/login.vue @@ -91,7 +91,7 @@