diff --git a/.env.production b/.env.production index 609c948..0c0d4c9 100644 --- a/.env.production +++ b/.env.production @@ -6,3 +6,7 @@ VITE_GLOB_API_YIN_JI=wss://api.cqygjk.com/health-watch/websocket/watchMonitor #健康监测工具报警-websocket VITE_GLOB_API_JIAN_CE=wss://api.cqygjk.com/health-emergency/websocket/emergency +#西安云坐席 +VITE_GLOB_API_XIAN_YUN=wss://api.cqygjk.com/health-emergency/websocket/emergency3 +#银川云坐席 +VITE_GLOB_API_YIN_CHUAN=wss://api.cqygjk.com/health-emergency/websocket/emergency4 \ No newline at end of file diff --git a/src/assets/mapUtils/map.ts b/src/assets/mapUtils/map.ts index 1a7cee9..082667b 100644 --- a/src/assets/mapUtils/map.ts +++ b/src/assets/mapUtils/map.ts @@ -459,7 +459,6 @@ export const Map = { return new Promise((resolve, reject) => { geocoder.getAddress(lnglat, (status, result) => { if (status === 'complete' && result.regeocode) { - console.log('xx', result); return resolve(result.regeocode.formattedAddress, result.regeocode); } return reject(result); diff --git a/src/components/chinaMap/chinaMap.vue b/src/components/chinaMap/chinaMap.vue index 2c5b54b..49ef7ed 100644 --- a/src/components/chinaMap/chinaMap.vue +++ b/src/components/chinaMap/chinaMap.vue @@ -474,7 +474,7 @@ margin: 5px 19px 5px 8px; } - .line-sesc { + .line-desc { flex: 1; } } diff --git a/src/components/chinaMap/components/routePanel.vue b/src/components/chinaMap/components/routePanel.vue index f65d420..5f8ed0e 100644 --- a/src/components/chinaMap/components/routePanel.vue +++ b/src/components/chinaMap/components/routePanel.vue @@ -107,7 +107,7 @@ margin: 5px 19px 5px 8px; } - .line-sesc { + .line-desc { flex: 1; } } diff --git a/src/components/secondaryScreen/secondMap/components/userInfoModal/sleep.vue b/src/components/secondaryScreen/secondMap/components/userInfoModal/sleep.vue index 6307fc3..35b4267 100644 --- a/src/components/secondaryScreen/secondMap/components/userInfoModal/sleep.vue +++ b/src/components/secondaryScreen/secondMap/components/userInfoModal/sleep.vue @@ -204,7 +204,6 @@ type: 'shadow', }, formatter: function (params) { - console.log(params); let tar = params[0]; let name = ''; switch (tar.value) { @@ -380,6 +379,7 @@ return { h: (time - (time % 60)) / 60, m: time % 60 }; } + onMounted(() => { initEchart(); }); diff --git a/src/components/xianMap/components/routePanel.vue b/src/components/xianMap/components/routePanel.vue index 9a7816e..735e03c 100644 --- a/src/components/xianMap/components/routePanel.vue +++ b/src/components/xianMap/components/routePanel.vue @@ -104,11 +104,11 @@ .line { width: 1px; - color: var(--cardFontColor); + background-color: var(--cardFontColor); margin: 5px 19px 5px 8px; } - .line-sesc { + .line-desc { flex: 1; } } diff --git a/src/utils/env.ts b/src/utils/env.ts index 71ce661..b793abb 100644 --- a/src/utils/env.ts +++ b/src/utils/env.ts @@ -1,9 +1,11 @@ export function getAppEnvConfig() { const ENV = import.meta.env; - const { VITE_GLOB_API_URL, VITE_GLOB_API_YIN_JI, VITE_GLOB_API_JIAN_CE } = ENV; + const { VITE_GLOB_API_URL, VITE_GLOB_API_YIN_JI, VITE_GLOB_API_JIAN_CE, VITE_GLOB_API_XIAN_YUN, VITE_GLOB_API_YIN_CHUAN } = ENV; return { VITE_GLOB_API_URL, VITE_GLOB_API_YIN_JI, VITE_GLOB_API_JIAN_CE, + VITE_GLOB_API_XIAN_YUN, + VITE_GLOB_API_YIN_CHUAN, }; -} \ No newline at end of file +} diff --git a/src/utils/socket.ts b/src/utils/socket.ts index cd7fd06..2ba9b79 100644 --- a/src/utils/socket.ts +++ b/src/utils/socket.ts @@ -8,11 +8,15 @@ import { useRouter } from 'vue-router'; const router = useRouter(); const userStore = useUserStore(); const { token } = userStore; -const { VITE_GLOB_API_YIN_JI, VITE_GLOB_API_JIAN_CE } = getAppEnvConfig(); -//健康监测工具报警 -export const basicPath = VITE_GLOB_API_YIN_JI; +const { VITE_GLOB_API_YIN_JI, VITE_GLOB_API_JIAN_CE, VITE_GLOB_API_XIAN_YUN, VITE_GLOB_API_YIN_CHUAN } = getAppEnvConfig(); //应急求助 +export const basicPath = VITE_GLOB_API_YIN_JI; +//健康监测工具报警 export const emergencyPath = VITE_GLOB_API_JIAN_CE; +//西安云坐席 +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) { @@ -69,6 +73,7 @@ export function useSocket(p = basicPath) { if (typeof WebSocket === 'undefined') { alert('您的浏览器不支持socket'); } else { + closeSocket(); // 实例化socket socket.value = new WebSocket(path.value + Date.now(), [t]); @@ -87,10 +92,11 @@ export function useSocket(p = basicPath) { socket.value.onmessage = function (event) { //如果获取到消息,心跳检测重置 heartCheck.reset().start(); //拿到任何消息都说明当前连接是正常的 - //console.log('收到消息:', event.data); + console.log('收到消息:', event.data); if (event.data != 'pong') { let data = JSON.parse(event.data); - socketData.value = data; + // socketData.value = data; + setSocketData(data); } }; } @@ -103,7 +109,7 @@ export function useSocket(p = basicPath) { init(); function closeSocket() { - socket.value && socket.value.close; + socket.value && socket.value.hasOwnProperty('close') && socket.value.close(); } return { socket, socketData, setSocketData, closeSocket }; diff --git a/src/views/components/yunZuoXiDialog.vue b/src/views/components/yunZuoXiDialog.vue new file mode 100644 index 0000000..722dd6f --- /dev/null +++ b/src/views/components/yunZuoXiDialog.vue @@ -0,0 +1,107 @@ + + + + diff --git a/src/views/index.vue b/src/views/index.vue index d614a87..8c667c2 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -28,6 +28,7 @@
+ @@ -44,8 +45,9 @@ import xianMap from '/@/components/xianMap/xianMap.vue'; import EmployeeDialog from '/@/views/components/employeeDialog.vue'; import EmergencyDialog from '/@/views/components/emergencyDialog.vue'; + import YunZuoXiDialog from '/@/views/components/yunZuoXiDialog.vue'; import { useTopTime } from '/@/utils/utils.ts'; - import { basicPath, emergencyPath, useSocket } from '/@/utils/socket.ts'; + import { basicPath, emergencyPath, xianYunPath, useSocket } from '/@/utils/socket.ts'; import { useRefresh } from '/@/hooks/autoRefresh'; import { DEFAULT_TIME } from '/@/hooks/autoRefresh/pageRefreshTime.ts'; import { DataType, getSettings, ThemeType } from '/@/utils/settings.ts'; @@ -169,15 +171,28 @@ if (nVal) { nextTick(() => { setEmergencyData(nVal); - emergencyDialogRef.value.openDialog; + emergencyDialogRef.value.openDialog(); }); } }); + //西安云坐席 + const { socketData: xianYunData, setSocketData: setXianYunData, closeSocket: closeSocket3 } = useSocket(xianYunPath); + const yunZuoXiDialogRef = ref(); + watch(xianYunData, (nVal) => { + if (nVal) { + nextTick(() => { + setXianYunData(nVal); + yunZuoXiDialogRef.value.openDialog(); + }); + } + }); + onUnmounted(() => { // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。 window.onbeforeunload = function () { closeSocket(); closeSocket2(); + closeSocket3(); //西安云坐席 }; clearInterval(interval.value); @@ -213,13 +228,15 @@ hospitalList.value = []; //用户的坐标信息 let point = [data.lon, data.lat]; - if (data.hospitalList.length > 0) { + if (data.hospitalList && data.hospitalList.length > 0) { try { hospitalList.value = await getHospitalList(data.hospitalList, point); showHospitalList.value = true; } catch (error) { console.log('获取医院列表时出错:', error); } + } else { + console.log('没有医院list'); } Map.getAddressByPoint(point).then((res) => { const option = { diff --git a/src/views/yinChuan/yinChuan.vue b/src/views/yinChuan/yinChuan.vue index 3796d96..e9303af 100644 --- a/src/views/yinChuan/yinChuan.vue +++ b/src/views/yinChuan/yinChuan.vue @@ -24,7 +24,14 @@
- +
@@ -37,7 +44,8 @@
- + + @@ -52,10 +60,11 @@ import ChinaMap from '/@/components/chinaMap/chinaMap.vue'; import EmployeeDialog from '/@/views/components/employeeDialog.vue'; import EmergencyDialog from '/@/views/components/emergencyDialog.vue'; + import YunZuoXiDialog from '/@/views/components/yunZuoXiDialog.vue'; import PhoneDialog from '/@/views/components/phoneDialog/phoneDialog.vue'; import TerminalAlarmDialog from '/@/views/yinChuan/componetns/TerminalAlarmDialog/TerminalAlarmDialog.vue'; import { useTopTime } from '/@/utils/utils.ts'; - import { basicPath, emergencyPath, useSocket } from '/@/utils/socket.ts'; + import { basicPath, emergencyPath, useSocket, yinChuanPath } from '/@/utils/socket.ts'; import { useRefresh } from '/@/hooks/autoRefresh'; import { DEFAULT_TIME } from '/@/hooks/autoRefresh/pageRefreshTime.ts'; import { useRoute } from 'vue-router'; @@ -63,6 +72,7 @@ import { ServerDetailType } from '/@/components/body-d-left/bodyLeftHooks.ts'; import { YinChuanOption } from '/@/assets/mapUtils/mapConstant.ts'; import { useUserStore } from '/@/store/modules/user.ts'; + import { Map } from '/@/assets/mapUtils/map.ts'; const title = ref('银川片应急就医服务中心'); const phone = '(0951-6805199)'; @@ -183,7 +193,18 @@ if (nVal) { nextTick(() => { setEmergencyData(nVal); - emergencyDialogRef.value.openDialog; + emergencyDialogRef.value.openDialog(); + }); + } + }); + //银川云坐席 + const { socketData: yunZuoXiData, setSocketData: setYunZuoXiData, closeSocket: closeSocket3 } = useSocket(yinChuanPath); + const yunZuoXiDialogRef = ref(); + watch(yunZuoXiData, (nVal) => { + if (nVal) { + nextTick(() => { + setYunZuoXiData(nVal); + yunZuoXiDialogRef.value.openDialog(); }); } }); @@ -192,6 +213,7 @@ window.onbeforeunload = function () { closeSocket(); closeSocket2(); + closeSocket3(); //银川云坐席 }; clearInterval(interval.value); @@ -225,6 +247,88 @@ terminalAlarmDialogRef.value.openDialog(); } + //确认应急求助 + const hospitalList = ref([]); //医院列表 + const showHospitalList = ref(false); + + async function confirmHelp(data) { + if (!data.lon) return; + hospitalList.value = []; + //用户的坐标信息 + let point = [data.lon, data.lat]; + if (data.hospitalList && data.hospitalList.length > 0) { + try { + hospitalList.value = await getHospitalList(data.hospitalList, point); + showHospitalList.value = true; + } catch (error) { + console.log('获取医院列表时出错:', error); + } + } else { + console.log('没有医院list'); + } + 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); + }); + } + + async function getHospitalList(hospitalList, userLocation) { + const hospitalPromises = hospitalList.map(async (item) => { + item.distance = getDistance(userLocation, [item.lon, item.lat]); + const { time, routeList } = await getDriveTime(userLocation, [item.lon, item.lat]); + item.driveTime = time; + item.routeList = routeList; + 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' : value + 'm'; + } + + 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, + }; + } + } + + function clearHospitalList() { + hospitalList.value = []; + showHospitalList.value = false; + } + // function test() { // let nVal = { // watchNo: 'CRFTQ22C03000080', diff --git a/vite.config.ts b/vite.config.ts index 16beb10..f2e886c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -20,7 +20,7 @@ const px2remOptions = { // ignoreIdentifier: false, //(boolean/string)忽略单个属性的方法,启用ignoreidentifier后,replace将自动设置为true。 // replace: true, // (布尔值)替换包含REM的规则,而不是添加回退。 mediaQuery: false, //(布尔值)允许在媒体查询中转换px - minPixelValue: 0, //设置要替换的最小像素值(3px会被转rem)。 默认 0 + minPixelValue: 2, //设置要替换的最小像素值(3px会被转rem)。 默认 0 }; // https://vitejs.dev/config/ export default defineConfig({ @@ -60,4 +60,29 @@ export default defineConfig({ // @iconify/iconify: The dependency is dynamically and virtually loaded by @purge-icons/generated, so it needs to be specified explicitly include: ['lodash-es', 'ant-design-vue/es/locale/zh_CN', 'ant-design-vue/es/locale/en_US'], }, + // build: { + // rollupOptions: { + // output: { + // //入口文件输出配置 + // entryFileNames: `assets/js/[name]-[hash].js`, + // //代码分割后的文件输出配置 + // chunkFileNames: `assets/js/[name]-[hash].js`, + // //静态资源输出配置 + // assetFileNames(assetInfo) { + // //css文件单独输出到css文件夹 + // if (assetInfo.name.endsWith('.css')) { + // return `assets/css/[name]-[hash].css`; + // } + // //图片文件单独输出到img文件夹 + // else if (['.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp'].some((ext) => assetInfo.name.endsWith(ext))) { + // return `assets/img/[name]-[hash].[ext]`; + // } + // //其他资源输出到assets文件夹 + // else { + // return `assets/[name]-[hash].[ext]`; + // } + // }, + // }, + // }, + // }, });