2025.7.18 监管任务模块
1. 监管场景样式优化;
2. 新增监管场景GIS地图展示(待完成);
| | |
| | | <body> |
| | | <div id="app"></div> |
| | | </body> |
| | | <!-- <script type="text/javascript"> |
| | | <script type="text/javascript"> |
| | | window._AMapSecurityConfig = { |
| | | serviceHost: 'http://47.100.191.150:8083/_AMapService' |
| | | }; |
| | | </script> |
| | | <script |
| | | <!-- <script |
| | | type="text/javascript" |
| | | src="https://webapi.amap.com/maps?v=1.4.5&key=520c5e5cf44c7793104e500cbf0ed711&plugin=Map3D,ElasticMarker,AMap.ControlBar,AMap.Geocoder" |
| | | ></script> --> |
| | |
| | | let ip2_file = 'https://fyami.com.cn/'; |
| | | |
| | | if (debug) { |
| | | ip1 = 'http://192.168.0.103:8080/'; |
| | | ip1 = 'http://192.168.0.103:9001/'; |
| | | // ip1_file = 'http://192.168.0.138:8080/'; |
| | | // ip2 = 'http://192.168.0.138:8080/'; |
| | | // ip2_file = 'https://fyami.com.cn/'; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import scene_1 from '@/assets/image/scene_1.png'; |
| | | import scene_4 from '@/assets/image/scene_4.png'; |
| | | import scene_5 from '@/assets/image/scene_5.png'; |
| | | import scene_6 from '@/assets/image/scene_6.png'; |
| | | import scene_15 from '@/assets/image/scene_15.png'; |
| | | import scene_16 from '@/assets/image/scene_16.png'; |
| | | import scene_17 from '@/assets/image/scene_17.png'; |
| | | import scene_18 from '@/assets/image/scene_18.png'; |
| | | import scene_19 from '@/assets/image/scene_19.png'; |
| | | import scene_20 from '@/assets/image/scene_20.png'; |
| | | |
| | | function sceneIcon(type) { |
| | | switch (type + '') { |
| | | case '1': |
| | | return scene_1; |
| | | case '2': |
| | | return scene_1; |
| | | case '3': |
| | | return scene_1; |
| | | case '4': |
| | | return scene_4; |
| | | case '5': |
| | | return scene_5; |
| | | case '6': |
| | | return scene_6; |
| | | case '15': |
| | | return scene_15; |
| | | case '16': |
| | | return scene_16; |
| | | case '17': |
| | | return scene_17; |
| | | case '18': |
| | | return scene_18; |
| | | case '19': |
| | | return scene_19; |
| | | case '20': |
| | | return scene_20; |
| | | default: |
| | | return scene_1; |
| | | } |
| | | } |
| | | |
| | | export { sceneIcon }; |
| | |
| | | ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] |
| | | ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] |
| | | ElRow: typeof import('element-plus/es')['ElRow'] |
| | | ElScroll: typeof import('element-plus/es')['ElScroll'] |
| | | ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] |
| | | ElSegmented: typeof import('element-plus/es')['ElSegmented'] |
| | | ElSelect: typeof import('element-plus/es')['ElSelect'] |
| | |
| | | <template> |
| | | <!-- <el-card shadow="hover"> --> |
| | | <div class="wrapper"> |
| | | <div :class="statusClass + ' wrapper'"> |
| | | <div> |
| | | <el-text>{{ item.displayid }}ã</el-text> |
| | | <el-text truncated class="w-250px">{{ item.sensename }}</el-text> |
| | | <!-- <el-text>{{ item.displayid }}ã</el-text> --> |
| | | <el-text tag="b" class="text-line-2"> |
| | | {{ item.displayid + 'ã' + item.sensename }} |
| | | </el-text> |
| | | </div> |
| | | <!-- <div> |
| | | <el-text>å°åï¼{{ item.location }}</el-text> |
| | | </div> --> |
| | | <div> |
| | | <el-text truncated class="w-250px" type="info"> |
| | | <el-icon><LocationInformation /></el-icon> |
| | | {{ item.scene.location }} |
| | | </el-text> |
| | | </div> |
| | | <el-row justify="space-between" style="margin-top: 4px"> |
| | | <el-space> |
| | | <el-tag type="info" effect="plain" size="small"> |
| | | <el-tag |
| | | v-if="item.extension1 == '1'" |
| | | type="success" |
| | | effect="plain" |
| | | size="small" |
| | | > |
| | | <el-icon :size="8"><Select /></el-icon> |
| | | <span>å·²ç管</span> |
| | | </el-tag> |
| | | <el-tag |
| | | v-else-if="!item.extension1 || item.extension1 == '0'" |
| | | type="danger" |
| | | effect="plain" |
| | | size="small" |
| | | > |
| | | <el-icon :size="8"><CloseBold /></el-icon> |
| | | <span>æªç管</span> |
| | | </el-tag> |
| | | <el-tag v-else type="primary" effect="plain" size="small"> |
| | | <el-icon :size="8"><Select /></el-icon> |
| | | <span>已夿 ¸</span> |
| | | </el-tag> |
| | | <!-- <el-tag type="info" effect="plain" size="small"> |
| | | {{ item.sceneType }} |
| | | </el-tag> --> |
| | | <el-space> |
| | | <el-tag type="info" size="small"> |
| | | 计åï¼{{ item.monitornum }}次 |
| | | </el-tag> |
| | | <el-tag type="info" effect="plain" size="small"> |
| | | 计åç管ï¼{{ item.monitornum }} |
| | | <el-tag type="info" size="small"> |
| | | ç管ï¼{{ item.extension1 ? item.extension1 : '0' }}次 |
| | | </el-tag> |
| | | <el-tag type="info" effect="plain" size="small"> |
| | | å·²ç管ï¼{{ item.extension1 ? item.extension1 : '0' }} |
| | | </el-tag> |
| | | </el-space> |
| | | </el-space> |
| | | <slot :item="item"></slot> |
| | | <!-- <el-button size="small" type="success" @click="add">æ·»å </el-button> --> |
| | |
| | | /** |
| | | * ç管对象 |
| | | */ |
| | | |
| | | import { computed } from 'vue'; |
| | | |
| | | const props = defineProps({ |
| | | item: { |
| | |
| | | }); |
| | | |
| | | const emit = defineEmits(['add']); |
| | | |
| | | const statusClass = computed(() => { |
| | | if (!props.item.extension1 || props.item.extension1 == '0') { |
| | | return 'border-bottom-danger'; |
| | | } else if (props.item.extension1 == '1') { |
| | | return 'border-bottom-success'; |
| | | } else { |
| | | return 'border-bottom-primary'; |
| | | } |
| | | }); |
| | | |
| | | function add() { |
| | | emit('add', props.item); |
| | |
| | | border: 1px solid var(--el-border-color); |
| | | border-radius: var(--el-border-radius-base); |
| | | padding: 4px 8px; |
| | | box-shadow: var(--el-box-shadow-light); |
| | | } |
| | | |
| | | .text-line-2 { |
| | | width: 300px; |
| | | height: 40px; |
| | | display: -webkit-box; |
| | | line-clamp: 2; |
| | | -webkit-line-clamp: 2; |
| | | -webkit-box-orient: vertical; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | } |
| | | |
| | | .border-bottom-success { |
| | | border-left: 3px solid var(--el-color-success); |
| | | } |
| | | |
| | | .border-bottom-danger { |
| | | border-left: 3px solid var(--el-color-danger); |
| | | } |
| | | |
| | | .border-bottom-primary { |
| | | border-left: 3px solid var(--el-color-primary); |
| | | } |
| | | </style> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { onMounted } from 'vue'; |
| | | import { createMap } from '@/utils/map/index_old'; |
| | | import { onMounted, onUnmounted } from 'vue'; |
| | | import { createMap, map } from '@/utils/map/index'; |
| | | onMounted(() => { |
| | | // é«å¾·å°å¾åå§å |
| | | createMap('container'); |
| | | }); |
| | | onUnmounted(() => { |
| | | map?.destroy(); |
| | | }); |
| | | </script> |
| | | <style> |
| | | #container { |
| | |
| | | <template> |
| | | <div style="width: 70vw; height: 500px; background-color: aliceblue"> |
| | | <BaseMap></BaseMap> |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import { watch } from 'vue'; |
| | | import { map, onMapMounted } from '@/utils/map/index'; |
| | | import marks from '@/utils/map/marks'; |
| | | import { sceneIcon } from '@/assets/scene-icon'; |
| | | const props = defineProps({ |
| | | // åºæ¯ç¹ä½ä¿¡æ¯ |
| | | data: Array |
| | | }); |
| | | |
| | | var markViewList = []; |
| | | |
| | | watch( |
| | | () => props.data, |
| | | (nV, oV) => { |
| | | if (nV != oV) { |
| | | drawSceneMarks(); |
| | | } |
| | | }, |
| | | { immediate: true } |
| | | ); |
| | | |
| | | function drawSceneMarks() { |
| | | onMapMounted(() => { |
| | | markViewList = []; |
| | | props.data.forEach((d) => { |
| | | const mark = marks.createMarker({ |
| | | position: [d.longitude, d.latitude], |
| | | icon: sceneIcon(d.typeid), |
| | | label: d.name, |
| | | extData: d.guid |
| | | }); |
| | | markViewList.push(mark); |
| | | }); |
| | | map.setFitView(markViewList); |
| | | }); |
| | | } |
| | | </script> |
| | | <style scoped></style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import AMapLoader from '@amap/amap-jsapi-loader'; |
| | | |
| | | var mapInitDone = false; |
| | | var onMapMountedEvents = []; |
| | | |
| | | var AMap; |
| | | // å°å¾å¯¹è±¡ |
| | | var map; |
| | | // 嫿å¾å± |
| | | var satellite; |
| | | // é¼ æ ç»å¾ |
| | | var mouseTool; |
| | | // 3Då¾å± |
| | | var object3Dlayer; |
| | | // å°å¾æå¨ç¶æ |
| | | var isDragging = false; |
| | | |
| | | // å°å¾å è½½å®æè§¦å |
| | | function onMapMounted(...events) { |
| | | if (mapInitDone) { |
| | | events.forEach((e) => { |
| | | e(); |
| | | }); |
| | | } else { |
| | | onMapMountedEvents = onMapMountedEvents.concat(events); |
| | | } |
| | | } |
| | | |
| | | function createMap(id) { |
| | | AMapLoader.load({ |
| | | key: '520c5e5cf44c7793104e500cbf0ed711', // ç³è¯·å¥½çWeb端å¼åè
Keyï¼é¦æ¬¡è°ç¨ load æ¶å¿
å¡« |
| | | version: '2.0', // æå®è¦å è½½ç JS API ççæ¬ï¼ç¼ºçæ¶é»è®¤ä¸º 1.4.15 |
| | | // éè¦ä½¿ç¨ççæä»¶å表ï¼å¦æ¯ä¾å°º'AMap.Scale'ç |
| | | plugins: [ |
| | | 'AMap.ElasticMarker', |
| | | 'AMap.ControlBar', |
| | | 'AMap.ToolBar', |
| | | 'AMap.Scale', |
| | | // 'AMap.DragRoute', |
| | | // 'AMap.MouseTool', |
| | | // 'AMap.PolygonEditor' |
| | | ] |
| | | }) |
| | | .then((_AMap) => { |
| | | AMap = _AMap; |
| | | _initMap(id); |
| | | mapInitDone = true; |
| | | onMapMountedEvents.forEach((e) => { |
| | | e(); |
| | | }); |
| | | onMapMountedEvents = []; |
| | | }) |
| | | .catch((e) => { |
| | | console.log(e); |
| | | }); |
| | | } |
| | | |
| | | function _initMap(elementId) { |
| | | map = new AMap.Map(elementId, { |
| | | // mapStyle: 'amap://styles/e1e78509de64ddcd2efb4cb34c6fae2a', |
| | | features: ['bg', 'road'], |
| | | pitch: 45, // å°å¾ä¿¯ä»°è§åº¦ï¼ææèå´ 0 度- 83 度 |
| | | viewMode: '2D', // å°å¾æ¨¡å¼ |
| | | resizeEnable: true, |
| | | center: [121.6039283, 31.25295567], |
| | | zooms: [2, 26], |
| | | zoom: 14 |
| | | }); |
| | | // map = new AMap.Map(elementId); |
| | | |
| | | // æ·»å 嫿å°å¾ |
| | | satellite = new AMap.TileLayer.Satellite(); |
| | | satellite.hide(); |
| | | map.add([satellite]); |
| | | |
| | | // _initMouseTool(); |
| | | // _init3DLayer(); |
| | | // _initDragEvent(); |
| | | } |
| | | |
| | | // é¼ æ ç»å¾åå§å |
| | | function _initMouseTool() { |
| | | mouseTool = new AMap.MouseTool(map); |
| | | } |
| | | |
| | | // 3Då¾å±åå§å |
| | | function _init3DLayer() { |
| | | object3Dlayer = new AMap.Object3DLayer(); |
| | | map.add(object3Dlayer); |
| | | } |
| | | |
| | | // 设置å°å¾ææ½çå¬äºä»¶ |
| | | function _initDragEvent() { |
| | | let dragEndEvent; |
| | | map.on('dragstart', () => { |
| | | clearTimeout(dragEndEvent); |
| | | isDragging = true; |
| | | }); |
| | | map.on('dragend', function () { |
| | | dragEndEvent = setTimeout(() => { |
| | | isDragging = false; |
| | | }, 8000); |
| | | }); |
| | | } |
| | | |
| | | export { |
| | | createMap, |
| | | onMapMounted, |
| | | map, |
| | | AMap, |
| | | mouseTool, |
| | | object3Dlayer, |
| | | isDragging |
| | | }; |
| | |
| | | * é«å¾·å°å¾ç¹æ è®°ç»å¶ç¸å
³ |
| | | */ |
| | | |
| | | import { map } from './index_old'; |
| | | import { map, AMap } from './index'; |
| | | import { useToolboxStore } from '@/stores/toolbox'; |
| | | |
| | | const toolboxStore = useToolboxStore(); |
| | |
| | | for (let i = 0; i < lnglats.length; i++) { |
| | | data.push({ |
| | | lnglat: lnglats[i], //ç¹æ è®°ä½ç½® |
| | | name: `${fDatas.times[i]}<br/>${_factor.factorName}: ${_factor.datas[i].factorData} mg/m³`, |
| | | name: `${fDatas.times[i]}<br/>${_factor.factorName}: ${_factor.datas[i].factorData} μg/m³`, |
| | | id: i |
| | | }); |
| | | } |
| | |
| | | var styleObject = { |
| | | url: 'https://a.amap.com/jsapi_demos/static/images/mass1.png', |
| | | // url: './asset/mipmap/ic_up_white.png', // 徿 å°å |
| | | // eslint-disable-next-line no-undef |
| | | |
| | | size: new AMap.Size(11, 11), // 徿 å¤§å° |
| | | // eslint-disable-next-line no-undef |
| | | |
| | | anchor: new AMap.Pixel(5, 5) // 徿 æ¾ç¤ºä½ç½®åç§»éï¼åºåç¹ä¸ºå¾æ å·¦ä¸è§ |
| | | }; |
| | | // eslint-disable-next-line no-undef |
| | | |
| | | var massMarks = new AMap.MassMarks(data, { |
| | | zIndex: 5, // æµ·éç¹å¾å±å å çé¡ºåº |
| | | zooms: [15, 18], // 卿å®å°å¾ç¼©æ¾çº§å«èå´å
å±ç¤ºæµ·éç¹å¾å± |
| | |
| | | // 3. èªå®ä¹ç¹å»äºä»¶ |
| | | onClick(i); |
| | | }); |
| | | // eslint-disable-next-line no-undef |
| | | |
| | | var marker = new AMap.Marker({ |
| | | content: ' ', |
| | | map: map, |
| | | // eslint-disable-next-line no-undef |
| | | |
| | | offset: new AMap.Pixel(13, 12) |
| | | }); |
| | | var timeout; |
| | |
| | | * @param {boolean} collision æ æ³¨é¿è®© |
| | | * @returns |
| | | */ |
| | | createLabelMarks(img, dataList, collision = true) { |
| | | // eslint-disable-next-line no-undef |
| | | createLabelMarks(img, dataList, collision = true, showTxt = true) { |
| | | const layer = new AMap.LabelsLayer({ |
| | | zooms: [3, 20], |
| | | zIndex: 1000, |
| | |
| | | retina: true |
| | | }, |
| | | text: { |
| | | content: data.name, |
| | | content: showTxt ? data.name : '', |
| | | direction: 'top', |
| | | offset: [0, -5], |
| | | style: { |
| | |
| | | index: i |
| | | }; |
| | | |
| | | // eslint-disable-next-line no-undef |
| | | var labelMarker = new AMap.LabelMarker(curData); |
| | | |
| | | // markers.push(labelMarker); |
| | |
| | | } |
| | | |
| | | return layer; |
| | | }, |
| | | |
| | | createMarker({ position, icon, label, extData }) { |
| | | const marker = new AMap.Marker({ |
| | | position: position, |
| | | offset: new AMap.Pixel(-10, -10), |
| | | icon: icon, //æ·»å icon 徿 URL |
| | | title: label, |
| | | label: { |
| | | content: label, |
| | | direction: 'bottom' |
| | | }, |
| | | extData |
| | | }); |
| | | map.add(marker); |
| | | return marker; |
| | | } |
| | | }; |
| | |
| | | <template> |
| | | <el-affix :offset="60" target=".el-main"> |
| | | <!-- <el-affix :offset="60" target=".el-main"> --> |
| | | <div class="page-header"> |
| | | <el-page-header @back="goBack"> |
| | | <template #content> |
| | |
| | | </el-page-header> |
| | | <el-divider /> |
| | | </div> |
| | | </el-affix> |
| | | <!-- </el-affix> --> |
| | | <CompMonitorObjEdit |
| | | ref="objEditRef" |
| | | :task="task" |
| | |
| | | <CompMonitorPlan |
| | | ref="planRef" |
| | | :task="curTask.data" |
| | | :day-task-list="dayTaskList" |
| | | @date-change="onDateChange" |
| | | ></CompMonitorPlan> |
| | | </el-col> |
| | |
| | | create |
| | | v-model="curSubTaskList" |
| | | :loading="subTaskLoading" |
| | | :create-loading="daytaskLoading" |
| | | :create-loading="daytaskCreateLoading" |
| | | height="56vh" |
| | | @add="handleAddSubtask" |
| | | @submit="handleSubtaskSubmit" |
| | |
| | | </el-col> |
| | | </el-row> |
| | | </el-tab-pane> |
| | | <!-- <el-tab-pane label="ç管å°å¾" name="second"> |
| | | <CompTaskMap></CompTaskMap> |
| | | </el-tab-pane> --> |
| | | <el-tab-pane label="ç管å°å¾" name="second"> |
| | | <CompTaskMap :plans="curMonitorObjList"></CompTaskMap> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </el-row> |
| | | <el-divider></el-divider> |
| | |
| | | showMonitorObjList: [], |
| | | //å½åéä¸çä»»å¡ |
| | | curTask: {}, |
| | | //å½åéä¸çæ¥ä»»å¡ |
| | | curDayTaskList: [], |
| | | daytaskLoading: false, |
| | | //æä½æé® |
| | | buttons: [ |
| | | { |
| | |
| | | // å½åéæ©çæ¥ä»»å¡ |
| | | curDayTask: {}, |
| | | curDay: undefined, |
| | | daytaskLoading: false, |
| | | daytaskCreateLoading: false, |
| | | // å½åéæ©çæ¥ä»»å¡ä¸çåä»»å¡ |
| | | curSubTaskList: undefined, |
| | | subTaskLoading: false, |
| | |
| | | }) |
| | | .finally(() => { |
| | | this.mainLoading = false; |
| | | this.fetchDayTasks(); |
| | | }); |
| | | }, |
| | | fetchDayTasks() { |
| | | // è·åæ¥ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | this.dayTaskLoading = true; |
| | | return taskApi |
| | | .fetchDayTasks(this.curTask.data.tguid) |
| | | .then((res) => { |
| | | this.dayTaskList = res; |
| | | }) |
| | | .finally(() => (this.dayTaskLoading = false)); |
| | | }, |
| | | editTask() { |
| | | this.$router.push({ |
| | |
| | | _dayTask.settime = dayjs().toDate(); |
| | | _dayTask.t1stverifytime = dayjs().toDate(); |
| | | _dayTask.runingstatus = 'æªæ§è¡'; |
| | | this.daytaskLoading = true; |
| | | this.daytaskCreateLoading = true; |
| | | taskApi |
| | | .putTask(_dayTask) |
| | | .then((res) => { |
| | |
| | | this.subTaskDrawer = true; |
| | | this.handleSubtaskSubmit(); |
| | | }) |
| | | .finally(() => (this.daytaskLoading = false)); |
| | | .finally(() => (this.daytaskCreateLoading = false)); |
| | | } |
| | | } |
| | | }, |
| | |
| | | <template> |
| | | <div class="monitor-obj-wrapper"> |
| | | <el-affix v-if="affix" :offset="60" target=".monitor-obj-wrapper"> |
| | | <div> |
| | | <el-segmented |
| | | <el-scrollbar class="p-b-8" always> |
| | | <!-- <el-segmented |
| | | :model-value="activeName" |
| | | :options="activeTabs" |
| | | @change="tabChange" |
| | | /> |
| | | </div> |
| | | /> --> |
| | | <el-tabs v-model="activeName" @tab-change="tabChange"> |
| | | <el-tab-pane |
| | | v-for="item in activeTabs" |
| | | :key="item" |
| | | :label="item" |
| | | :name="item" |
| | | ></el-tab-pane> |
| | | </el-tabs> |
| | | </el-scrollbar> |
| | | </el-affix> |
| | | <div v-else> |
| | | <el-segmented |
| | | <el-scrollbar class="" always v-else> |
| | | <!-- <el-segmented |
| | | :model-value="activeName" |
| | | :options="activeTabs" |
| | | @change="tabChange" |
| | | /> |
| | | </div> |
| | | /> --> |
| | | <el-tabs v-model="activeName" @tab-change="tabChange"> |
| | | <el-tab-pane |
| | | v-for="item in activeTabs" |
| | | :key="item" |
| | | :label="item" |
| | | :name="item" |
| | | ></el-tab-pane> |
| | | </el-tabs> |
| | | </el-scrollbar> |
| | | <el-space size="large"> |
| | | <el-tag type="info"> æ»æ°ï¼{{ activeData.length }} </el-tag> |
| | | <el-checkbox-group v-model="checkList"> |
| | | <el-checkbox label="æªç管" :value="0" /> |
| | | <el-checkbox label="å·²ç管" :value="1" /> |
| | | <el-checkbox label="已夿 ¸" :value="2" /> |
| | | </el-checkbox-group> |
| | | </el-space> |
| | | <el-scrollbar :height="height"> |
| | | <el-space wrap> |
| | | <ItemMonitorObj v-for="obj in activeData" :key="obj.movid" :item="obj"> |
| | |
| | | }, |
| | | btnType: { |
| | | type: String, |
| | | default: 'danger' |
| | | default: 'default' |
| | | }, |
| | | // 头é¨é项æ¯å¦å¸é¡¶ |
| | | affix: Boolean, |
| | |
| | | data() { |
| | | return { |
| | | activeName: defaultTabName, |
| | | tabs: [] |
| | | tabs: [], |
| | | checkList: [0, 1, 2] |
| | | }; |
| | | }, |
| | | computed: { |
| | | activeData() { |
| | | const list = this.data.filter((v) => { |
| | | return ( |
| | | this.activeName == defaultTabName || v.sceneType == this.activeName |
| | | ); |
| | | // return this.tabName == defaultTabName || v.sceneType == this.tabName; |
| | | // çéå½åéæ©çæ ç¾é¡µå¯¹åºçåºæ¯ç±»å |
| | | const b1 = |
| | | this.activeName == defaultTabName || v.sceneType == this.activeName; |
| | | |
| | | // 计ç®åºæ¯ççç®¡ç¶æ |
| | | let status; |
| | | if (v.extension1 == undefined || null) { |
| | | // æªç管 |
| | | status = 0; |
| | | } else { |
| | | const num = parseInt(v.extension1); |
| | | if (num >= 2) { |
| | | // 已夿 ¸ |
| | | status = 2; |
| | | } else { |
| | | // å·²ç管ï¼1æ¬¡ï¼ |
| | | status = num; |
| | | } |
| | | } |
| | | const b2 = this.checkList.indexOf(status) != -1; |
| | | return b1 && b2; |
| | | }); |
| | | this.$emit('update:showData', list); |
| | | return list; |
| | |
| | | </div> |
| | | <el-divider /> |
| | | <CompMonitorObj |
| | | height="68vh" |
| | | height="62vh" |
| | | :data="curMonitorObjList" |
| | | show-btn |
| | | v-model:tabName="curSceneType" |
| | |
| | | </CompMonitorObj> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-affix :offset="140"> |
| | | <!-- <el-affix :offset="140"> --> |
| | | <div> |
| | | <el-text>å¯éåºæ¯</el-text> |
| | | </div> |
| | | <el-divider /> |
| | | <div> |
| | | <el-segmented v-model="curSceneType" :options="sceneTypeOptions" /> |
| | | </div> |
| | | <el-scrollbar class="scrollbar-flex-content" always > |
| | | <!-- <el-segmented v-model="curSceneType" :options="sceneTypeOptions" /> --> |
| | | <el-tabs v-model="curSceneType"> |
| | | <el-tab-pane |
| | | v-for="item in sceneTypeOptions" |
| | | :key="item" |
| | | :label="item" |
| | | :name="item" |
| | | ></el-tab-pane> |
| | | </el-tabs> |
| | | </el-scrollbar> |
| | | <FYInfoSearch |
| | | placeholder="请è¾å
¥åºæ¯åç§°å
³é®å" |
| | | :data="showSceneList" |
| | |
| | | </ItemScene> |
| | | </template> |
| | | </FYInfoSearch> |
| | | </el-affix> |
| | | <!-- </el-affix> --> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | |
| | | const total = this.curMonitorObjList.length; |
| | | const map = new Map(); |
| | | this.curMonitorObjList.forEach((e) => { |
| | | const d = e.scene |
| | | const d = e.scene; |
| | | if (!map.has(d.type)) { |
| | | map.set(d.type, { num: 0 }); |
| | | } |
| | |
| | | }); |
| | | }, |
| | | deleteMov(item) { |
| | | if (!(item.extension1 == null || item.extension1 == undefined || item.extension1 == '0')) { |
| | | if ( |
| | | !( |
| | | item.extension1 == null || |
| | | item.extension1 == undefined || |
| | | item.extension1 == '0' |
| | | ) |
| | | ) { |
| | | ElMessage({ |
| | | message: 'å·²çç®¡åºæ¯æ æ³ç§»é¤', |
| | | type: 'error' |
| | |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped></style> |
| | | <style scoped> |
| | | .scrollbar-flex-content { |
| | | display: flex; |
| | | /* width: fit-content; */ |
| | | height: min-content; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <el-calendar |
| | | v-loading="dayTaskLoading" |
| | | v-model="dateValue" |
| | | :range="dateRange" |
| | | @update:model-value="onDateChange" |
| | |
| | | task: { |
| | | type: Object, |
| | | default: () => {} |
| | | }, |
| | | dayTaskList: { |
| | | type: Array, |
| | | default: () => [] |
| | | } |
| | | }); |
| | | const emit = defineEmits(['dateChange']); |
| | |
| | | |
| | | /********************** 任塿°æ® *********************************/ |
| | | |
| | | // è·åæ¥ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | const dayTaskLoading = ref(false); |
| | | const dayTaskList = ref([]); |
| | | function fetchDayTasks() { |
| | | dayTaskLoading.value = true; |
| | | return taskApi |
| | | .fetchDayTasks(props.task.tguid) |
| | | .then((res) => { |
| | | dayTaskList.value = res; |
| | | // 妿已鿥æåå¨ï¼å¨éæ°è·åæ¥ä»»å¡ç»è®¡ä¿¡æ¯åï¼å次触åç¹å»äºä»¶ |
| | | if (dateValue.value) { |
| | | onDateChange(dateValue.value) |
| | | watch( |
| | | () => props.dayTaskList, |
| | | (nV, oV) => { |
| | | if (nV != oV && dateValue.value) { |
| | | onDateChange(dateValue.value); |
| | | } |
| | | }) |
| | | .finally(() => (dayTaskLoading.value = false)); |
| | | } |
| | | }, |
| | | { immediate: false } |
| | | ); |
| | | |
| | | // // è·åæ¥ä»»å¡ç»è®¡ä¿¡æ¯ |
| | | // const dayTaskLoading = ref(false); |
| | | // const dayTaskList = ref([]); |
| | | // function fetchDayTasks() { |
| | | // dayTaskLoading.value = true; |
| | | // return taskApi |
| | | // .fetchDayTasks(props.task.tguid) |
| | | // .then((res) => { |
| | | // dayTaskList.value = res; |
| | | // // 妿已鿥æåå¨ï¼å¨éæ°è·åæ¥ä»»å¡ç»è®¡ä¿¡æ¯åï¼å次触åç¹å»äºä»¶ |
| | | // if (dateValue.value) { |
| | | // onDateChange(dateValue.value); |
| | | // } |
| | | // }) |
| | | // .finally(() => (dayTaskLoading.value = false)); |
| | | // } |
| | | |
| | | // æ¥ä»»å¡æ°æ®å±ç¤º |
| | | const compMap = new Map(); |
| | |
| | | return compMap.get(key).value; |
| | | } |
| | | const result = computed(() => { |
| | | return dayTaskList.value.find((v) => { |
| | | return props.dayTaskList.find((v) => { |
| | | return dayjs(v.date).isSame(dayjs(day)); |
| | | }); |
| | | }); |
| | |
| | | // æ»ä»»å¡ç»è®¡ |
| | | const taskStatistic = computed(() => { |
| | | const res = { total: 0, complete: 0, changed: 0 }; |
| | | dayTaskList.value.forEach((e) => { |
| | | props.dayTaskList.forEach((e) => { |
| | | res.total += e.totalTaskNum; |
| | | res.complete += e.completeTaskNum; |
| | | res.changed += e.changedTaskNum; |
| | |
| | | }); |
| | | /********************** åå§å *********************************/ |
| | | |
| | | watch( |
| | | () => props.task, |
| | | (nV) => { |
| | | if (nV && nV.tguid) { |
| | | fetchDayTasks(); |
| | | } |
| | | }, |
| | | { immediate: true } |
| | | ); |
| | | // watch( |
| | | // () => props.task, |
| | | // (nV) => { |
| | | // if (nV && nV.tguid) { |
| | | // fetchDayTasks(); |
| | | // } |
| | | // }, |
| | | // { immediate: true } |
| | | // ); |
| | | |
| | | defineExpose({ fetchDayTasks }); |
| | | // defineExpose({ fetchDayTasks }); |
| | | </script> |
| | | <style scoped> |
| | | .li-01 { |
| | |
| | | <template> |
| | | <SceneMap></SceneMap> |
| | | <div style="width: 70vw; height: 600px; background-color: aliceblue"> |
| | | <SceneMap :data="scenes"></SceneMap> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { computed } from 'vue'; |
| | | const props = defineProps({ |
| | | // åºæ¯è®¡å |
| | | plans: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | dayTasks: { |
| | | type: Array, |
| | | default: () => [] |
| | | } |
| | | }); |
| | | |
| | | |
| | | const scenes = computed(() => { |
| | | return props.plans.map((p) => { |
| | | return p.scene; |
| | | }); |
| | | }); |
| | | </script> |
| | |
| | | resolvers: [ |
| | | ElementPlusResolver({ |
| | | importStyle: 'sass' |
| | | }), |
| | | }) |
| | | ], |
| | | dts: 'src/components.d.ts', |
| | | }), |
| | | dts: 'src/components.d.ts' |
| | | }) |
| | | // ElementPlus({ |
| | | // useSource: true, |
| | | // }), |
| | |
| | | |
| | | alias: [ |
| | | { find: /^@\//, replacement: `${pathSrc}/` }, |
| | | { find: /^~/, replacement: `` }, |
| | | ], |
| | | { find: /^~/, replacement: `` } |
| | | ] |
| | | // extensions: ['.js', '.mjs', '.vue', '.json', '.less', '.css'] |
| | | }, |
| | | build: { |
| | |
| | | input: path.resolve(__dirname, 'index.html'), |
| | | output: { |
| | | chunkFileNames: 'js/[name].[hash].js', |
| | | entryFileNames: 'js/[name].[hash].js', |
| | | entryFileNames: 'js/[name].[hash].js' |
| | | // assetFileNames: "assets/[name].[hash].[ext]", |
| | | }, |
| | | }, |
| | | } |
| | | } |
| | | }, |
| | | css: { |
| | | postcss: { |
| | | plugins: [autoprefixer], |
| | | plugins: [autoprefixer] |
| | | }, |
| | | preprocessorOptions: { |
| | | // less: { |
| | |
| | | // additionalData: `@import "${path.resolve(__dirname, 'src/styles/variable.less')}";` |
| | | // }, |
| | | scss: { |
| | | additionalData: `@use "@/styles/element/index.scss" as *;`, |
| | | }, |
| | | }, |
| | | additionalData: `@use "@/styles/element/index.scss" as *;` |
| | | } |
| | | } |
| | | }, |
| | | server: { |
| | | host: '0.0.0.0' |
| | | host: '0.0.0.0', |
| | | // port: 5174 |
| | | } |
| | | }); |