已修改22个文件
已添加10个文件
已重命名1个文件
¶Ô±ÈÐÂÎļþ |
| | |
| | | import { $fysp } from '../index' |
| | | |
| | | const id = 'IF3DgsgKxSWvTM3M' |
| | | const name = 'pcheck' |
| | | |
| | | export default { |
| | | /** |
| | | * é®é¢å®¡æ ¸ |
| | | * @param {Number} action 0ï¼é®é¢éè¿ï¼1ï¼é®é¢ä¸éè¿ï¼2ï¼æ´æ¹éè¿ï¼3æ´æ¹ä¸éè¿ |
| | | */ |
| | | checkProblem({ pId, action, remark = '', userId = id, userName = name }) { |
| | | const params = `?pId=${pId}&action=${action}&remark=${remark}&userId=${userId}&userName=${userName}` |
| | | return $fysp.post(`problemlist/check${params}`).then((res) => res.data) |
| | | }, |
| | | |
| | | fetchProblemType({ cityCode, districtCode, sceneTypeId }) { |
| | | const params = `?taskTypeId=1&cityCode=${cityCode}&districtCode=${districtCode}&sceneTypeId=${sceneTypeId}` |
| | | return $fysp.get(`problemtype/search${params}`).then((res) => res.data) |
| | | }, |
| | | |
| | | /** |
| | | * è·åå·¡æ¥ä»»å¡çé®é¢åæ´æ¹ |
| | | */ |
| | | fetchProblems(subtaskId) { |
| | | return $fysp |
| | | .get('problemlist/subtask', { |
| | | params: { |
| | | stGuid: subtaskId, |
| | | // å
嫿ªå®¡æ ¸ä»¥åå®¡æ ¸ä¸éè¿çé®é¢ |
| | | all: true |
| | | } |
| | | }) |
| | | .then((res) => res.data) |
| | | }, |
| | | |
| | | /** |
| | | * è·ååé®é¢ç±»ååççæ°éç»è®¡ |
| | | */ |
| | | fetchProblemsStatistic(area) { |
| | | return $fysp.post('problemlist/getStatisticalResult', area).then((res) => res.data) |
| | | } |
| | | } |
| | |
| | | let ip2_file = 'https://fyami.com.cn/' |
| | | |
| | | if (debug) { |
| | | // ip1 = 'http://192.168.0.138:8082/' |
| | | ip1 = 'http://localhost:8080/' |
| | | ip1 = 'http://192.168.0.138:8082/' |
| | | // ip1 = 'http://localhost:8080/' |
| | | // ip1_file = 'http://47.100.191.150:9005/'; |
| | | // ip2 = 'http://192.168.0.138:8080/'; |
| | | // ip2_file = 'https://fyami.com.cn/'; |
| | |
| | | // @forward 'element-plus/theme-chalk/src/common/var.scss' with ( |
| | | // $colors: ( |
| | | // 'primary': ( |
| | | // 'base': green |
| | | // ) |
| | | // ) |
| | | // ); |
| | | |
| | | @forward 'element-plus/theme-chalk/src/dark/var.scss' with ( |
| | | $bg-color: ( |
| | | 'page': #ffffffa9, |
| | | '': #122b54a9, |
| | | 'overlay': #122b54a9 |
| | | '': #14428be8, |
| | | 'overlay': #102f63c9 |
| | | ), |
| | | $colors: ( |
| | | 'primary': ( |
| | | 'base': #e6a23c |
| | | ) |
| | | ) |
| | | ); |
| | |
| | | font-weight: normal; |
| | | font-style: normal; |
| | | } |
| | | |
| | | .border-r-small { |
| | | // padding: 0 8px; |
| | | // border: 1px white solid; |
| | | } |
| | |
| | | ElCard: typeof import('element-plus/es')['ElCard'] |
| | | ElCascader: typeof import('element-plus/es')['ElCascader'] |
| | | ElCol: typeof import('element-plus/es')['ElCol'] |
| | | ElCollapse: typeof import('element-plus/es')['ElCollapse'] |
| | | ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] |
| | | ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] |
| | | ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] |
| | | ElDivider: typeof import('element-plus/es')['ElDivider'] |
| | | ElIcon: typeof import('element-plus/es')['ElIcon'] |
| | | ElImage: typeof import('element-plus/es')['ElImage'] |
| | | ElLink: typeof import('element-plus/es')['ElLink'] |
| | | ElOption: typeof import('element-plus/es')['ElOption'] |
| | | ElProgress: typeof import('element-plus/es')['ElProgress'] |
| | |
| | | ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] |
| | | ElSegmented: typeof import('element-plus/es')['ElSegmented'] |
| | | ElSelect: typeof import('element-plus/es')['ElSelect'] |
| | | ElSpace: typeof import('element-plus/es')['ElSpace'] |
| | | ElStatistic: typeof import('element-plus/es')['ElStatistic'] |
| | | ElTable: typeof import('element-plus/es')['ElTable'] |
| | | ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] |
| | |
| | | OptionLocation: typeof import('./components/search/OptionLocation.vue')['default'] |
| | | OptionSceneType: typeof import('./components/search/OptionSceneType.vue')['default'] |
| | | OptionTime: typeof import('./components/search/OptionTime.vue')['default'] |
| | | ProblemItem: typeof import('./components/inspection/ProblemItem.vue')['default'] |
| | | RouterLink: typeof import('vue-router')['RouterLink'] |
| | | RouterView: typeof import('vue-router')['RouterView'] |
| | | SubtaskExamineItem: typeof import('./components/inspection/SubtaskExamineItem.vue')['default'] |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-text tag="b" type="warning" size="small">{{ index }}. </el-text> |
| | | <el-text type="warning" size="small">{{ title }}</el-text> |
| | | </div> |
| | | <!-- <div> |
| | | <el-text>{{ proStatus.name }}</el-text> |
| | | </div> --> |
| | | <template v-for="(pic, t) in pics" :key="t"> |
| | | <template v-if="pic.path.length > 0"> |
| | | <div> |
| | | <el-text size="small" type="info">{{ pic.title }}</el-text> |
| | | </div> |
| | | <el-space> |
| | | <el-image |
| | | v-for="(p, i) in pic.path" |
| | | class="image" |
| | | :key="i" |
| | | :src="p" |
| | | :preview-src-list="pic.path" |
| | | :initial-index="i" |
| | | fit="cover" |
| | | lazy |
| | | /> |
| | | </el-space> |
| | | </template> |
| | | </template> |
| | | </template> |
| | | <script setup> |
| | | import { computed } from 'vue' |
| | | |
| | | import ProCheckProxy from '@/utils/ProCheckProxy' |
| | | |
| | | const props = defineProps({ |
| | | problem: { |
| | | type: Object, |
| | | default: () => { |
| | | return {} |
| | | } |
| | | }, |
| | | index: { |
| | | type: Number, |
| | | default: 1 |
| | | } |
| | | }) |
| | | |
| | | // é®é¢åç§° |
| | | const title = computed(() => { |
| | | return props.problem.problemname |
| | | }) |
| | | |
| | | // é®é¢å¾ç |
| | | const pics = computed(() => { |
| | | return ProCheckProxy.proPics(props.problem) |
| | | }) |
| | | |
| | | // é®é¢ç¶æ |
| | | const proStatus = computed(() => { |
| | | return ProCheckProxy.proStatusMap(props.problem.extension3) |
| | | }) |
| | | </script> |
| | | <style scoped> |
| | | .image { |
| | | width: 60px; |
| | | height: 60px; |
| | | border-radius: 2px; |
| | | } |
| | | </style> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { onMounted } from 'vue' |
| | | import { onMounted, inject } from 'vue' |
| | | import { createMap } from '@/utils/map/index' |
| | | // import { createMap } from '@/utils/map/baseMap' |
| | | import { inject } from 'vue' |
| | | |
| | | const mapHeight = inject('mapHeight') |
| | | |
| | |
| | | @change="handleChange" |
| | | :type="type" |
| | | placeholder="éæ©æ¶é´" |
| | | :disabled-date="disabledDate" |
| | | size="small" |
| | | style="width: 100px" |
| | | /> |
| | |
| | | |
| | | <script> |
| | | const MONTH = 'month' |
| | | const DATE = 'date' |
| | | |
| | | export default { |
| | | props: { |
| | |
| | | default: |
| | | return 'YYYY-MM' |
| | | } |
| | | }, |
| | | disabledDate(time) { |
| | | return time.getTime() > Date.now() |
| | | } |
| | | }, |
| | | mounted() { |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // æ¥å£æ°æ®çè·å |
| | | import { ref, watch, computed } from 'vue'; |
| | | |
| | | export function useFetchData(page_size) { |
| | | // åé¡µä¿¡æ¯ |
| | | const page = ref(1); |
| | | const pageNum = ref(1); |
| | | const pageSize = ref(page_size ? page_size : 20); |
| | | const total = ref(0); |
| | | watch(page, (nValue, oValue) => { |
| | | if (nValue != oValue) { |
| | | fetchData(); |
| | | } |
| | | }); |
| | | watch(pageSize, (nValue, oValue) => { |
| | | if (nValue != oValue) { |
| | | fetchData(); |
| | | } |
| | | }); |
| | | |
| | | // å è½½ç¶æ, 0: å è½½å®æ; 1: å è½½ä¸; 2: å·²å
¨é¨å è½½; 3: å 载失败; |
| | | const loadStatus = ref(0); |
| | | |
| | | const loading = computed(() => { |
| | | return loadStatus.value == 1; |
| | | }); |
| | | |
| | | // æ°æ®è·å |
| | | function fetchData(fetch) { |
| | | loadStatus.value = 1; |
| | | fetch(page.value, pageSize.value) |
| | | .then((pageInfo) => { |
| | | if (pageInfo) { |
| | | page.value = pageInfo.page ? pageInfo.page : 1; |
| | | pageNum.value = pageInfo.pageNum ? pageInfo.pageNum : 1; |
| | | total.value = pageInfo.total ? pageInfo.total : 0; |
| | | } |
| | | |
| | | loadStatus.value = 0; |
| | | }) |
| | | .catch(() => { |
| | | loadStatus.value = 3; |
| | | }) |
| | | .finally(() => { |
| | | loadStatus.value = 2; |
| | | }); |
| | | } |
| | | |
| | | return { page, pageNum, pageSize, total, loadStatus, loading, fetchData }; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import { ref } from 'vue' |
| | | import { defineStore } from 'pinia' |
| | | |
| | | export const useMapStore = defineStore('map', () => { |
| | | const focusMarker = ref() |
| | | |
| | | return { focusMarker } |
| | | }) |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import { $fysp } from '@/api/index' |
| | | |
| | | //é®é¢ç¶æ |
| | | const proStatus = { |
| | | unCheck: 'unCheck', |
| | | pass: 'pass', |
| | | fail: 'fail', |
| | | change_unCheck: 'change_unCheck', |
| | | change_fail: 'change_fail', |
| | | change_pass: 'change_pass' |
| | | } |
| | | |
| | | export default { |
| | | //ç»è®¡é®é¢ |
| | | calProStatus(proList) { |
| | | const status = { |
| | | //é®é¢æ°é |
| | | proNum: proList.length, |
| | | //æ´æ¹æ°é |
| | | changeNum: 0, |
| | | //å¾
å®¡æ ¸æ°é |
| | | uncheckNum: 0, |
| | | //å·²å®¡æ ¸éè¿æ°é |
| | | passNum: 0, |
| | | //æªéè¿æ°é |
| | | unpassNum: 0, |
| | | //æ´æ¹ç |
| | | changePer: '0%', |
| | | //éè¿ç |
| | | passPer: '0%', |
| | | //å®¡æ ¸ç |
| | | checkPer: '0%' |
| | | } |
| | | |
| | | proList.forEach((p) => { |
| | | if (p.ischanged) status.changeNum++ |
| | | |
| | | if (p.extension3 == 'fail' || p.extension3 == 'change_fail') status.unpassNum++ |
| | | else if ( |
| | | p.extension3 == 'unCheck' || |
| | | p.extension3 == 'change_unCheck' || |
| | | (p.extension3 == 'pass' && p.ischanged) |
| | | ) |
| | | status.uncheckNum++ |
| | | else status.passNum++ |
| | | |
| | | status.changePer = |
| | | String( |
| | | (status.changeNum / status.proNum) * 100 |
| | | ? ((status.changeNum / status.proNum) * 100).toFixed(1) |
| | | : 0 |
| | | ) + '%' |
| | | status.passPer = |
| | | String( |
| | | (status.passNum / status.proNum) * 100 |
| | | ? ((status.passNum / status.proNum) * 100).toFixed(1) |
| | | : 0 |
| | | ) + '%' |
| | | status.checkPer = |
| | | String( |
| | | ((status.passNum + status.unpassNum) / status.proNum) * 100 |
| | | ? (((status.passNum + status.unpassNum) / status.proNum) * 100).toFixed(1) |
| | | : 0 |
| | | ) + '%' |
| | | }) |
| | | |
| | | return status |
| | | }, |
| | | |
| | | //ç»è®¡é®é¢ï¼è¿åæ°ç»å½¢å¼ |
| | | proStatusArray(proList) { |
| | | const status = this.calProStatus(proList) |
| | | return [ |
| | | { name: 'é®é¢æ°', value: status.proNum }, |
| | | { name: 'æ´æ¹æ°', value: status.changeNum }, |
| | | { name: 'å¾
å®¡æ ¸', value: status.uncheckNum }, |
| | | { name: 'å·²å®¡æ ¸', value: status.passNum }, |
| | | { name: 'æªéè¿', value: status.unpassNum }, |
| | | { name: 'æ´æ¹ç', value: status.changePer }, |
| | | { name: 'éè¿ç', value: status.passPer }, |
| | | { name: 'å®¡æ ¸ç', value: status.checkPer } |
| | | ] |
| | | }, |
| | | |
| | | //é®é¢å¾çåæ´æ¹å¾ç |
| | | proPics(pro) { |
| | | const pics = [ |
| | | { |
| | | title: 'é®é¢å¾ç', |
| | | path: [] |
| | | }, |
| | | { |
| | | title: 'æ´æ¹å¾ç', |
| | | path: [] |
| | | } |
| | | ] |
| | | if (pro.mediafileList) { |
| | | pro.mediafileList.forEach((m) => { |
| | | pics[m.ischanged ? 1 : 0].path.push(`${$fysp.imgUrl}${m.extension1}${m.guid}.jpg`) |
| | | }) |
| | | } |
| | | |
| | | return pics |
| | | }, |
| | | |
| | | //é®é¢å®¡æ ¸ç¶æè½¬æ¢ä¸æ |
| | | proStatusMap(p) { |
| | | switch (p) { |
| | | case proStatus.unCheck: |
| | | return { name: 'é®é¢æªå®¡æ ¸', type: 'warning', index: 0, checkable: true, deletable: true, changeable: false } |
| | | case proStatus.pass: |
| | | return { name: 'é®é¢éè¿', type: 'success', index: 1, checkable: false, deletable: true, changeable: false } |
| | | case proStatus.fail: |
| | | return { name: 'é®é¢ä¸éè¿', type: 'danger', index: 1, checkable: false, deletable: true, changeable: false } |
| | | case proStatus.change_unCheck: |
| | | return { name: 'æ´æ¹æªå®¡æ ¸', type: 'warning', index: 2, checkable: true, deletable: false, changeable: true } |
| | | case proStatus.change_fail: |
| | | return { name: 'æ´æ¹ä¸éè¿', type: 'danger', index: 3, checkable: false, deletable: false, changeable: true } |
| | | case proStatus.change_pass: |
| | | return { name: 'æ´æ¹éè¿', type: 'success', index: 3, checkable: false, deletable: false, changeable: true } |
| | | default: |
| | | return { name: 'é®é¢æªå®¡æ ¸', type: 'warning', index: 0, checkable: true, deletable: true } |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * é®é¢å®¡æ ¸åç¶æåæ¢ |
| | | * @param {String} s å½åé®é¢ç¶æ |
| | | * @param {Boolean} isPass å®¡æ ¸éè¿æé©³å |
| | | * @returns ä¸ä¸ä¸ªé®é¢ç¶æ |
| | | */ |
| | | proNextStatus(s, isPass) { |
| | | let status, action |
| | | switch (s) { |
| | | case proStatus.unCheck: |
| | | status = isPass ? proStatus.pass : proStatus.fail |
| | | action = isPass ? 0 : 1 |
| | | break |
| | | case proStatus.change_unCheck: |
| | | status = isPass ? proStatus.change_pass : proStatus.change_fail |
| | | action = isPass ? 2 : 3 |
| | | break |
| | | } |
| | | return { status: status, action: action } |
| | | } |
| | | } |
| | |
| | | showBuildingBlock: true, |
| | | mapStyle: 'amap://styles/e1e78509de64ddcd2efb4cb34c6fae2a', |
| | | features: ['bg', 'road'], |
| | | pitch: 45, // å°å¾ä¿¯ä»°è§åº¦ï¼ææèå´ 0 度- 83 度 |
| | | pitch: 0, // å°å¾ä¿¯ä»°è§åº¦ï¼ææèå´ 0 度- 83 度 |
| | | viewMode: '3D', // å°å¾æ¨¡å¼ |
| | | resizeEnable: true, |
| | | center: [121.603928, 31.252955], |
| | |
| | | } |
| | | |
| | | return layer |
| | | }, |
| | | |
| | | drawMarker(title, lnglat, img) { |
| | | const marker = new AMap.Marker({ |
| | | position: new AMap.LngLat(lnglat[0], lnglat[1]), // ç»çº¬åº¦å¯¹è±¡ï¼ä¹å¯ä»¥æ¯ç»çº¬åº¦ææçä¸ç»´æ°ç»[116.39, 39.9] |
| | | title: title, |
| | | // offset: new AMap.Pixel(-13, -12), |
| | | // anchor: 'center', |
| | | icon: new AMap.Icon({ |
| | | image: img, |
| | | imageSize: [30, 30] |
| | | }) |
| | | }) |
| | | map.add(marker) |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import { map, isDragging } from '@/utils/map/index' |
| | | |
| | | export default { |
| | | setCenter(lnglat) { |
| | | if (isDragging) { |
| | | return |
| | | } |
| | | var now = new Date() |
| | | if (this.lasttime == undefined || now.getTime() - this.lasttime.getTime() >= 1000) { |
| | | map.setCenter(lnglat) |
| | | this.lasttime = now |
| | | } |
| | | }, |
| | | addViews(view) { |
| | | map.add(view) |
| | | }, |
| | | removeViews(view) { |
| | | map.remove(view) |
| | | }, |
| | | clearViews() { |
| | | map.clearMap() |
| | | }, |
| | | setFitView() { |
| | | map.setFitView() |
| | | } |
| | | } |
| | |
| | | <template> |
| | | <div class="wrapper"> |
| | | <div>ç°åºå·¡æ¥</div> |
| | | <div>ä¸å¡ç¶æä¸æ§</div> |
| | | <WorkStream></WorkStream> |
| | | </div> |
| | | </template> |
| | |
| | | */ |
| | | import TaskTrack from '@/views/inspection/TaskTrack.vue' |
| | | import WorkStream from '@/views/inspection/WorkStream.vue' |
| | | |
| | | </script> |
| | | |
| | | <style scoped> |
| | |
| | | <template> |
| | | <div class="border-r-small m-h-2 p-h-4"> |
| | | <el-scrollbar ref="scrollbarRef" height="calc(var(--fy-body-height) / 3 * 1 - 30px)"> |
| | | <el-scrollbar ref="scrollbarRef" :height="height"> |
| | | <div ref="scrollContentRef"> |
| | | <div v-for="item in streams" :key="item.index"> |
| | | <el-text type="primary">[{{ item.time }}]: </el-text> |
| | |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import { reactive, ref, onMounted } from 'vue' |
| | | import { reactive, ref, onMounted, inject } from 'vue' |
| | | import dayjs from 'dayjs' |
| | | |
| | | import { unCalc } from '@/utils/css-util' |
| | | |
| | | const excludeMapHeight = inject('excludeMapHeight') |
| | | const height = `calc(${unCalc(excludeMapHeight)} - 30px)` |
| | | |
| | | const streams = reactive([]) |
| | | const scrollContentRef = ref() |
| | | const scrollbarRef = ref() |
| | |
| | | <div class="border-r-small"> |
| | | <div class="font-large">é®é¢æ´æ¹è·è¸ª</div> |
| | | <div> |
| | | <el-row justify="end"> |
| | | <OptionTime v-model="time" type="date"></OptionTime> |
| | | </el-row> |
| | | <ProblemSummary :data="subtaskList"></ProblemSummary> |
| | | <ProblemTable :data="subtaskList"></ProblemTable> |
| | | </div> |
| | | <div> |
| | | <ProblemChangeChart></ProblemChangeChart> |
| | | </div> |
| | | <div> |
| | | <ProblemType></ProblemType> |
| | | </div> |
| | | <el-collapse v-model="activeNames" @change="handleChange"> |
| | | <el-collapse-item title="åæè¶å¿" name="1"> |
| | | <ProblemChangeChart ref="pChangeRef"></ProblemChangeChart> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="é®é¢åå¸" name="2"> |
| | | <ProblemType ref="pTypeRef"></ProblemType> |
| | | </el-collapse-item> |
| | | </el-collapse> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | components: { ProblemSummary, ProblemTable, ProblemChangeChart, ProblemType }, |
| | | data() { |
| | | return { |
| | | subtaskList: [] |
| | | subtaskList: [], |
| | | activeNames: ['1', '2'], |
| | | time: '' |
| | | } |
| | | }, |
| | | watch: {}, |
| | | watch: { |
| | | time(nV, oV) { |
| | | if (nV != oV) { |
| | | this.areaStore.setTimeOneDay(nV) |
| | | this.fetchSubtask() |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | ...mapStores(useAreaStore) |
| | | // area() { |
| | | // return { |
| | | // provincecode: '31', |
| | | // provincename: '䏿µ·å¸', |
| | | // citycode: '3100', |
| | | // cityname: '䏿µ·å¸', |
| | | // districtcode: '310116', |
| | | // districtname: 'éå±±åº', |
| | | // starttime: '', |
| | | // endtime: '' |
| | | // } |
| | | // } |
| | | }, |
| | | methods: { |
| | | fetchSubtask() { |
| | | taskApi.fetchSubtaskSummaryByArea(this.areaStore.area).then((res) => { |
| | | this.subtaskList = res.data |
| | | }) |
| | | }, |
| | | handleChange(val) { |
| | | if (val.indexOf('1') != -1) { |
| | | this.$refs.pChangeRef.refresh() |
| | | } |
| | | if (val.indexOf('2') != -1) { |
| | | this.$refs.pTypeRef.refresh() |
| | | } |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.fetchSubtask() |
| | | // this.fetchSubtask() |
| | | } |
| | | } |
| | | </script> |
| | |
| | | <template> |
| | | <el-row justify="space-between"> |
| | | <div>åæè¶å¿</div> |
| | | <OptionTime v-model="time"></OptionTime> |
| | | <el-col :span="18"> |
| | | <div> |
| | | åºæ¯æ°ï¼{{ sceneNum }}ï¼é®é¢æ»æ°ï¼{{ proNum }}ï¼ååºæ¯é®é¢åå¼ï¼{{ proEachSceneNum }}ï¼ |
| | | </div> |
| | | <div> |
| | | æ´æ¹æ»æ°ï¼{{ changeNum }}ï¼æææ´æ¹æ°ï¼{{ changePassNum }}ï¼é®é¢æ´æ¹çï¼{{ |
| | | changePer |
| | | }}ï¼æææ´æ¹çï¼{{ changePassPer }} |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-row justify="end"> |
| | | <OptionTime v-model="time"></OptionTime> |
| | | </el-row> |
| | | </el-col> |
| | | </el-row> |
| | | <div ref="echart" class="line-chart"></div> |
| | | </template> |
| | |
| | | import * as echarts from 'echarts' |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | | sceneNum: 51, |
| | | proNum: 161, |
| | | changeNum: 40, |
| | | changePassNum: 40 |
| | | } |
| | | }, |
| | | computed: { |
| | | proEachSceneNum() { |
| | | return Math.round((this.proNum / this.sceneNum) * 10) / 10 |
| | | }, |
| | | changePer() { |
| | | if (this.proNum > 0) { |
| | | return Math.round((this.changeNum / this.proNum) * 100) + '%' |
| | | } else { |
| | | return '/' |
| | | } |
| | | }, |
| | | changePassPer() { |
| | | if (this.proNum > 0) { |
| | | return Math.round((this.changePassNum / this.proNum) * 100) + '%' |
| | | } else { |
| | | return '/' |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | refresh() { |
| | | const fontSize = 12 |
| | | const option = { |
| | | legend: { |
| | | data: ['é®é¢', 'æ´æ¹'], |
| | | data: ['é®é¢æ°', 'æ´æ¹æ°'], |
| | | textStyle: { |
| | | fontSize: fontSize, |
| | | color: 'white' |
| | |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: ['1å·', '2å·', '3å·', '4å·', '5å·', '6å·'], |
| | | data: ['1å·', '2å·', '3å·', '4å·', '5å·', '6å·', '7å·', '8å·', '9å·'], |
| | | axisLabel: { |
| | | textStyle: { |
| | | fontSize: fontSize |
| | |
| | | }, |
| | | series: [ |
| | | { |
| | | name: 'é®é¢', |
| | | name: 'é®é¢æ°', |
| | | type: 'bar', |
| | | data: [67, 45, 90, 67, 45, 90] |
| | | data: [12, 8, 9, 7, 14, 19, 9, 7, 14] |
| | | }, |
| | | { |
| | | name: 'æ´æ¹', |
| | | name: 'æ´æ¹æ°', |
| | | type: 'bar', |
| | | data: [67, 45, 90, 67, 40, 81] |
| | | data: [6, 2, 5, 3, 6, 3, 6, 2, 5] |
| | | } |
| | | // { |
| | | // name: 'æ´æ¹ç', |
| | |
| | | <template> |
| | | <div> |
| | | é®é¢æ°: {{ summary.proNum }}ï¼æ´æ¹æ°: {{ summary.changeNum }}ï¼æ´æ¹ç: {{ summary.changePer }} |
| | | <div class="font-small"> |
| | | 仿¥ç»è®¡ï¼é®é¢æ°: {{ summary.proNum }}ï¼æ´æ¹æ°: {{ summary.changeNum }}ï¼æ´æ¹ç: |
| | | {{ summary.changePer }} |
| | | </div> |
| | | <div class="font-small">çªåºé®é¢ï¼è·¯é¢ç§¯å°ï¼é®é¢æ°ï¼13ï¼å æ¯ï¼81%</div> |
| | | </template> |
| | | <script setup> |
| | | import { computed, ref } from 'vue' |
| | |
| | | }) |
| | | |
| | | if (proNum > 0) { |
| | | changePer = Math.round((changeNum / proNum) * 100) / 100 + '%' |
| | | changePer = Math.round((changeNum / proNum) * 100) + '%' |
| | | } |
| | | |
| | | return { proNum, changeNum, changePer } |
| | | }) |
| | | |
| | | const mainPro = computed(() => { |
| | | let res |
| | | let total = 0, |
| | | max = 0 |
| | | props.data.forEach((d) => { |
| | | total += d.proNum |
| | | }) |
| | | props.data.forEach((d) => { |
| | | if (total > 0) { |
| | | const per = d.proNum / total |
| | | if (per >= max) { |
| | | max = per |
| | | // res.push({ |
| | | // name: d.name, |
| | | // count: d.count, |
| | | // per: Math.round(per * 100) + '%' |
| | | // }) |
| | | res = { |
| | | name: d.name, |
| | | count: d.count, |
| | | per: Math.round(per * 100) + '%' |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | return res |
| | | }) |
| | | </script> |
| | |
| | | :row-class-name="tableRowClassName" |
| | | :height="tableHeight" |
| | | size="small" |
| | | @row-click="handleRowClick" |
| | | > |
| | | <el-table-column type="index" label="" width="30"> </el-table-column> |
| | | <el-table-column prop="scene.name" :show-overflow-tooltip="true" label="åç§°" width="150"> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <div class="btn-more font-small"> |
| | | <el-link type="primary" @click="showMore = !showMore">æ¥çæ´å¤</el-link> |
| | | <div v-if="showMoreBtn" class="btn-more font-small"> |
| | | <el-link type="primary" @click="showMore = !showMore"> |
| | | {{ showMore ? 'æ¶èµ·æ´å¤' : 'æ¥çæ´å¤' }} |
| | | </el-link> |
| | | </div> |
| | | </template> |
| | | <script setup> |
| | | import { computed, ref } from 'vue' |
| | | import dayjs from 'dayjs' |
| | | import { useMapStore } from '@/stores/map.js' |
| | | |
| | | import marks from '@/utils/map/marks.js' |
| | | import mapUtil from '@/utils/map/util.js' |
| | | import scene_1 from '@/assets/icon/scene_1.png' |
| | | |
| | | const mapStore = useMapStore() |
| | | |
| | | const props = defineProps({ |
| | | data: { |
| | |
| | | loading: Boolean |
| | | }) |
| | | |
| | | const showCount = 3 |
| | | |
| | | const showMore = ref(false) |
| | | const showMoreBtn = computed(() => { |
| | | return props.data.length > showCount |
| | | }) |
| | | |
| | | const tableData = computed(() => { |
| | | const l = props.data.map((value) => { |
| | |
| | | }) |
| | | |
| | | return l.sort((a, b) => { |
| | | return dayjs(b.updateTime) - dayjs(a.updateTime) |
| | | if (!a.updateTime) { |
| | | return 1 |
| | | } else if (!b.updateTime) { |
| | | return -1 |
| | | } else { |
| | | return dayjs(b.updateTime) - dayjs(a.updateTime) |
| | | } |
| | | }) |
| | | // return l |
| | | }) |
| | |
| | | if (showMore.value) { |
| | | return tableData.value |
| | | } else { |
| | | return tableData.value.slice(0, 3) |
| | | return tableData.value.slice(0, showCount) |
| | | } |
| | | }) |
| | | |
| | |
| | | if (p == 0) { |
| | | return '/' |
| | | } else { |
| | | return Math.round((c / p) * 100) / 100 + '%' |
| | | return Math.round((c / p) * 100) + '%' |
| | | } |
| | | } |
| | | |
| | | function handleRowClick(row, col, event) { |
| | | const title = row.scene.name |
| | | const lnglat = [row.scene.longitude, row.scene.latitude] |
| | | const img = scene_1 |
| | | mapUtil.clearViews() |
| | | marks.drawMarker(title, lnglat, img) |
| | | mapUtil.setFitView() |
| | | |
| | | mapStore.focusMarker = row |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | .btn-more { |
| | |
| | | <template> |
| | | <el-row justify="space-between"> |
| | | <div>é®é¢åå¸</div> |
| | | <OptionTime v-model="time"></OptionTime> |
| | | <el-col :span="18"> |
| | | <div v-if="mainProType"> |
| | | çªåºé®é¢ï¼{{ mainProType.name }}ï¼é®é¢æ°ï¼{{ mainProType.count }}ï¼å æ¯{{ mainProType.per }} |
| | | <!-- <span v-for="item in mainProType" :key="item.name"> |
| | | {{ item.name }}ï¼é®é¢æ°ï¼{{ item.count }}ï¼å æ¯{{ item.per }} |
| | | </span> --> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-row justify="end"> |
| | | <OptionTime v-model="time"></OptionTime> |
| | | </el-row> |
| | | </el-col> |
| | | </el-row> |
| | | <div ref="echart" class="line-chart"></div> |
| | | </template> |
| | | <script> |
| | | import * as echarts from 'echarts' |
| | | import { unref } from 'vue' |
| | | import dayjs from 'dayjs' |
| | | |
| | | import problemApi from '@/api/fysp/problemApi.js' |
| | | import { useFetchData } from '@/composables/fetchData' |
| | | import { useAreaStore } from '@/stores/area.js' |
| | | import { mapStores } from 'pinia' |
| | | |
| | | export default { |
| | | setup() { |
| | | const { loading, fetchData } = useFetchData() |
| | | return { loading, fetchData } |
| | | }, |
| | | data() { |
| | | return { |
| | | dataList: [] |
| | | } |
| | | }, |
| | | computed: { |
| | | ...mapStores(useAreaStore), |
| | | mainProType() { |
| | | let res |
| | | let total = 0, |
| | | max = 0 |
| | | this.dataList.forEach((d) => { |
| | | total += d.count |
| | | }) |
| | | this.dataList.forEach((d) => { |
| | | if (total > 0) { |
| | | const per = d.count / total |
| | | if (per >= max) { |
| | | max = per |
| | | // res.push({ |
| | | // name: d.name, |
| | | // count: d.count, |
| | | // per: Math.round(per * 100) + '%' |
| | | // }) |
| | | res = { |
| | | name: d.name, |
| | | count: d.count, |
| | | per: Math.round(per * 100) + '%' |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | return res |
| | | } |
| | | }, |
| | | methods: { |
| | | refresh() { |
| | | fetchProblemsStatistic() { |
| | | const param = unref(this.areaStore.area) |
| | | param.starttime = dayjs(param.starttime).startOf('month').format('YYYY-MM-DD HH:mm:ss') |
| | | param.endtime = dayjs(param.endtime).endOf('month').format('YYYY-MM-DD HH:mm:ss') |
| | | this.fetchData((page, pageSize) => { |
| | | return problemApi.fetchProblemsStatistic(param).then((res) => { |
| | | this.dataList = res |
| | | const chartData = res |
| | | .map((item) => { |
| | | return { |
| | | value: item.count, |
| | | name: item.name |
| | | } |
| | | }) |
| | | .sort(function (a, b) { |
| | | return a.value - b.value |
| | | }) |
| | | |
| | | this.refresh(chartData) |
| | | }) |
| | | }) |
| | | }, |
| | | refresh(chartData) { |
| | | const fontSize = 12 |
| | | const option = { |
| | | legend: { |
| | |
| | | type: 'pie', |
| | | radius: '55%', |
| | | center: ['50%', '50%'], |
| | | data: [ |
| | | { value: 24, name: 'åºå
¥å£ï¼éè·¯ï¼æ¬å°' }, |
| | | { value: 20, name: 'å·¥ç¨è½¦è¾' }, |
| | | { value: 18, name: 'éè·¯æ¬å°' }, |
| | | { value: 26, name: 'è·¯é¢ç¡¬å' }, |
| | | { value: 30, name: '渣å' } |
| | | ].sort(function (a, b) { |
| | | return a.value - b.value |
| | | }), |
| | | data: chartData, |
| | | // data: [ |
| | | // { value: 24, name: 'åºå
¥å£ï¼éè·¯ï¼æ¬å°' }, |
| | | // { value: 20, name: 'å·¥ç¨è½¦è¾' }, |
| | | // { value: 18, name: 'éè·¯æ¬å°' }, |
| | | // { value: 26, name: 'è·¯é¢ç¡¬å' }, |
| | | // { value: 30, name: '渣å' } |
| | | // ].sort(function (a, b) { |
| | | // return a.value - b.value |
| | | // }), |
| | | roseType: 'radius', |
| | | label: { |
| | | color: 'rgba(255, 255, 255, 0.3)' |
| | | color: 'rgba(255, 255, 255, 0.8)' |
| | | }, |
| | | labelLine: { |
| | | lineStyle: { |
| | |
| | | }, |
| | | mounted() { |
| | | this.echart = echarts.init(this.$refs.echart) |
| | | this.refresh() |
| | | this.fetchProblemsStatistic() |
| | | } |
| | | } |
| | | </script> |
| | |
| | | <template> |
| | | <el-row> |
| | | <el-col :span="7" class="page-right"> |
| | | <!-- <el-scrollbar height="var(--fy-body-height)"> --> |
| | | <ManagementView></ManagementView> |
| | | <!-- </el-scrollbar> --> |
| | | <el-scrollbar height="var(--fy-body-height)"> |
| | | <ManagementView></ManagementView> |
| | | </el-scrollbar> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-scrollbar class="page-left-top"> |
| | |
| | | const windowHeight = ref(window.innerHeight) |
| | | const areaStore = useAreaStore() |
| | | areaStore.setTimeOneDay() |
| | | areaStore.setLocation({ |
| | | pCode: '31', |
| | | pName: '䏿µ·å¸', |
| | | cCode: '3100', |
| | | cName: '䏿µ·å¸', |
| | | dCode: '310106', |
| | | dName: 'éå®åº' |
| | | }) |
| | | areaStore.setSceneType('1') |
| | | |
| | | // const headerHeight = computed(()=>{ |
| | | // return |
| | |
| | | // console.log(res.text()) |
| | | // }) |
| | | |
| | | provide('mapHeight', 'calc(var(--fy-body-height) / 3 * 2)') |
| | | provide('mapHeight', 'calc(var(--fy-body-height) / 4 * 3)') |
| | | provide('excludeMapHeight', 'calc(var(--fy-body-height) / 4 * 1)') |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .page-left-top { |
| | | height: calc(var(--fy-body-height) / 3 * 2); |
| | | height: calc(var(--fy-body-height) / 4 * 3); |
| | | /* background-color: aquamarine; */ |
| | | } |
| | | .page-left-bottom { |
| | | height: calc(var(--fy-body-height) / 3 * 1); |
| | | height: calc(var(--fy-body-height) / 4 * 1); |
| | | /* background-color: bisque; */ |
| | | } |
| | | |
| | |
| | | <!-- <TaskStats ref="statusRef"></TaskStats> --> |
| | | <EvaluateSummary :height="height"></EvaluateSummary> |
| | | <!-- <TaskSummary ref="summaryRef"></TaskSummary> --> |
| | | <ReInspectionView ref="summaryRef"></ReInspectionView> |
| | | <!-- <ReInspectionView ref="summaryRef"></ReInspectionView> --> |
| | | </template> |
| | | |
| | | <script> |
| | | import TaskStats from '@/views/management/TaskStats.vue' |
| | | import TaskSummary from '@/views/management/TaskSummary.vue' |
| | | import EvaluateSummary from '@/views/management/EvaluateSummary.vue' |
| | | import EvaluateSummary from '@/views/management/evaluate/EvaluateSummary.vue' |
| | | import ReInspectionView from '@/views/inspection/ReInspectionView.vue' |
| | | import ProblemTrack from '@/views/inspection/problem/ProblemTrack.vue' |
| | | import { vResize } from '@/utils/resize-observer' |
| | |
| | | methods: { |
| | | calcHeight() { |
| | | const h1 = this.$refs.statusRef.$el.offsetHeight |
| | | const h2 = this.$refs.summaryRef.$el.offsetHeight |
| | | const h = h1 + h2 |
| | | // const h2 = this.$refs.summaryRef.$el.offsetHeight |
| | | const h = h1 |
| | | return `calc(var(--fy-body-height) - ${h}px)` |
| | | } |
| | | }, |
| | |
| | | vResize.mounted(this.$refs.statusRef.$el, ({ height }) => { |
| | | this.statusHeight = height |
| | | }) |
| | | vResize.mounted(this.$refs.summaryRef.$el, ({ height }) => { |
| | | this.summaryHeight = height |
| | | }) |
| | | // vResize.mounted(this.$refs.summaryRef.$el, ({ height }) => { |
| | | // this.summaryHeight = height |
| | | // }) |
| | | }, |
| | | unmounted() { |
| | | vResize.unmounted(this.$refs.statusRef.$el) |
| | | vResize.unmounted(this.$refs.summaryRef.$el) |
| | | // vResize.unmounted(this.$refs.summaryRef.$el) |
| | | } |
| | | } |
| | | </script> |
| | |
| | | <template> |
| | | <!-- <el-row> ç»è®¡ç®¡ç </el-row> --> |
| | | <SelfInspection></SelfInspection> |
| | | <JointEnforcement></JointEnforcement> |
| | | <!-- <SelfInspection></SelfInspection> --> |
| | | <!-- <JointEnforcement></JointEnforcement> --> |
| | | <TaskStats></TaskStats> |
| | | <TaskSummary></TaskSummary> |
| | | <DustMonitor></DustMonitor> |
| | | </template> |
| | | |
| | | <script> |
| | | import SelfInspection from '@/views/inspection/SelfInspection.vue' |
| | | import JointEnforcement from '@/views/inspection/JointEnforcement.vue' |
| | | import TaskSummary from '@/views/management/TaskSummary.vue' |
| | | import TaskStats from '@/views/management/TaskStats.vue' |
| | | import DustMonitor from '@/views/monitor/DustMonitor.vue' |
| | | import { vResize } from '@/utils/resize-observer' |
| | | |
| | | export default { |
| | | components: { SelfInspection, JointEnforcement, TaskSummary }, |
| | | components: { SelfInspection, JointEnforcement, TaskSummary, TaskStats, DustMonitor }, |
| | | data() { |
| | | return { |
| | | // height: '500px', |
| | |
| | | <template> |
| | | <div class="border-r-small"> |
| | | <div class="font-large">å·¡æ¥é</div> |
| | | <div class="font-large">ä»»å¡çæ§</div> |
| | | <el-row justify="space-evenly"> |
| | | <el-statistic title="仿¥å®æ" :value="10"> </el-statistic> |
| | | <el-statistic title="æ¬å¨å®æ" :value="10"> </el-statistic> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="border-r-small"> |
| | | <el-row justify="space-between"> |
| | | <div ref="titleRef" class="font-large">综åé£é©è¯ä¼°</div> |
| | | <!-- <OptionTime v-model="time"></OptionTime> --> |
| | | </el-row> |
| | | <RiskCount></RiskCount> |
| | | <RiskArea></RiskArea> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { unCalc } from '@/utils/css-util' |
| | | import RiskCount from './component/RiskCount.vue' |
| | | import RiskArea from './component/RiskArea.vue' |
| | | /** |
| | | * 坹宿çä»»å¡è¿è¡è¯ä¼°é£é©ï¼æ¾ç¤ºé«é£é©åºæ¯ï¼æ¾ç¤ºå¤æ ¸çåºæ¯çæ
åµ |
| | | */ |
| | | export default { |
| | | components: { RiskCount, RiskArea }, |
| | | props: { |
| | | height: { |
| | | type: String, |
| | | default: '200' |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | tableData: [], |
| | | tableHeight: '200' |
| | | } |
| | | }, |
| | | watch: { |
| | | height(nV, oV) { |
| | | if (nV != oV) { |
| | | this.tableHeight = this.calcTableHeight() |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | calcTableHeight() { |
| | | const h1 = this.$refs.titleRef.offsetHeight |
| | | // const h2 = this.$refs.statisticRef.$el.offsetHeight |
| | | const h = h1 |
| | | const r = `calc(${unCalc(this.height)} - ${h}px)` |
| | | return r |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.tableHeight = this.calcTableHeight() |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped></style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-row justify="space-between"> |
| | | <div class="font-small">åºåé£é©åå¸</div> |
| | | <OptionTime v-model="time"></OptionTime> |
| | | </el-row> |
| | | <div ref="echart" class="line-chart"></div> |
| | | </template> |
| | | <script> |
| | | import * as echarts from 'echarts' |
| | | |
| | | export default { |
| | | methods: { |
| | | refresh() { |
| | | const fontSize = 12 |
| | | const option = { |
| | | color: ['#f56c6c', '#e6a23c', '#67c23a'], |
| | | legend: { |
| | | data: ['é«é£é©', 'ä¸é£é©', 'ä½é£é©'], |
| | | textStyle: { |
| | | fontSize: fontSize, |
| | | color: 'white' |
| | | } |
| | | }, |
| | | grid: { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | containLabel: true |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: [ |
| | | 'æ±å®è·¯è¡é', |
| | | 'ç³é¨äºè·¯è¡é', |
| | | 'å京西路è¡é', |
| | | 'éå®å¯ºè¡é', |
| | | 'æ¹å®¶æ¸¡è¡é', |
| | | '天ç®è¥¿è·¯è¡é', |
| | | 'åç«è¡é', |
| | | 'å®å±±è·¯è¡é', |
| | | 'å
±åæ°è·¯è¡é', |
| | | '大å®è·¯è¡é', |
| | | '彿µ¦æ°æè¡é', |
| | | '临汾路è¡é', |
| | | 'è·æ±è¥¿è·¯è¡é', |
| | | '彿µ¦é' |
| | | ], |
| | | axisLabel: { |
| | | rotate: 45, |
| | | textStyle: { |
| | | fontSize: fontSize |
| | | }, |
| | | color: '#ffffff', |
| | | textBorderColor: '#fff' |
| | | } |
| | | }, |
| | | yAxis: { |
| | | type: 'value', |
| | | axisLabel: { |
| | | textStyle: { |
| | | fontSize: fontSize, |
| | | color: 'white' |
| | | } |
| | | } |
| | | }, |
| | | series: [ |
| | | { |
| | | name: 'é«é£é©', |
| | | type: 'bar', |
| | | stack: 'risk', |
| | | barWidth: 10, |
| | | data: [2, 0, 4, 3, 1, 0, 2, 0, 4, 3, 1, 0, 2, 1] |
| | | }, |
| | | { |
| | | name: 'ä¸é£é©', |
| | | type: 'bar', |
| | | stack: 'risk', |
| | | data: [3, 1, 5, 4, 2, 1, 3, 1, 5, 4, 2, 1, 3, 1] |
| | | }, |
| | | { |
| | | name: 'ä½é£é©', |
| | | type: 'bar', |
| | | stack: 'risk', |
| | | data: [1, 1, 6, 2, 0, 0, 0, 0, 3, 1, 0, 2, 1, 0] |
| | | } |
| | | ] |
| | | } |
| | | this.echart.setOption(option) |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.echart = echarts.init(this.$refs.echart) |
| | | this.refresh() |
| | | } |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | .line-chart { |
| | | /* width: 200px; */ |
| | | height: 220px; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <el-row style="align-items: end; gap: 8px"> |
| | | <div class="tag"> |
| | | <div> |
| | | <span class="num-big">10</span> |
| | | <span class="num-small red"> |
| | | 24% |
| | | <el-icon> |
| | | <CaretTop /> |
| | | </el-icon> |
| | | </span> |
| | | </div> |
| | | <div class="statistic-footer red"> |
| | | <span>é«é£é©</span> |
| | | </div> |
| | | </div> |
| | | <div class="tag"> |
| | | <div> |
| | | <span style="font-size: 20px">12</span> |
| | | <span class="num-small yellow"> |
| | | 24% |
| | | <el-icon> |
| | | <CaretTop /> |
| | | </el-icon> |
| | | </span> |
| | | </div> |
| | | <div class="statistic-footer yellow"> |
| | | <span>ä¸é£é©</span> |
| | | </div> |
| | | </div> |
| | | <div class="tag"> |
| | | <div> |
| | | <span style="font-size: 20px">5</span> |
| | | <span class="num-small green"> |
| | | 48% |
| | | <el-icon> |
| | | <CaretTop /> |
| | | </el-icon> |
| | | </span> |
| | | </div> |
| | | <div class="statistic-footer green"> |
| | | <span>ä½é£é©</span> |
| | | </div> |
| | | </div> |
| | | </el-row> |
| | | </template> |
| | | <script></script> |
| | | <style scoped> |
| | | .tag { |
| | | display: flex; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .num-big { |
| | | font-size: 36px; |
| | | } |
| | | |
| | | .num-small { |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .statistic-footer { |
| | | /* background-color: #ffd100; */ |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | font-size: 12px; |
| | | color: var(--el-text-color-regular); |
| | | /* margin-top: 16px; */ |
| | | } |
| | | |
| | | .green { |
| | | color: #67c23a; |
| | | } |
| | | |
| | | .red { |
| | | color: #f56c6c; |
| | | } |
| | | |
| | | .yellow { |
| | | color: #e6a23c; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="border-r-small">å¨çº¿çæµ</div> |
| | | </template> |
| | | <script></script> |
| | |
| | | <template> |
| | | <el-scrollbar :height="mapHeight"> |
| | | <el-scrollbar v-if="mapStore.focusMarker" :height="mapHeight"> |
| | | <el-card class="p-events-auto wrapper"> |
| | | <div>{{ subtask.name }}</div> |
| | | <el-timeline style="max-width: 600px"> |
| | | <div class="font-small">{{ scene.name }}</div> |
| | | <el-divider></el-divider> |
| | | <div class="font-small">ç¶æï¼{{ subtask.status }}</div> |
| | | <div class="font-small">计åï¼{{ $fm.formatYMD(subtask.planstarttime) }}</div> |
| | | <div v-if="subtask.status != 'æªæ§è¡'" class="font-small"> |
| | | <span>æ§è¡ï¼{{ $fm.formatH(subtask.executionstarttime) }}</span> |
| | | <span> - </span> |
| | | <span>{{ $fm.formatH(subtask.executionendtime) }}</span> |
| | | </div> |
| | | <div class="font-small">é®é¢ï¼</div> |
| | | <problem-item |
| | | v-for="(item, i) in problemList" |
| | | :key="item.guid" |
| | | :index="i + 1" |
| | | :problem="item" |
| | | ></problem-item> |
| | | <!-- <div v-for="item in problemList" :key="item.guid"> |
| | | {{ item.problemname }} |
| | | </div> --> |
| | | <!-- <el-timeline style="max-width: 600px"> |
| | | <el-timeline-item |
| | | v-for="(activity, index) in activities" |
| | | :key="index" |
| | |
| | | > |
| | | {{ activity.content }} |
| | | </el-timeline-item> |
| | | </el-timeline> |
| | | </el-timeline> --> |
| | | </el-card> |
| | | </el-scrollbar> |
| | | </template> |
| | | |
| | | <script> |
| | | import { inject } from 'vue' |
| | | import { useMapStore } from '@/stores/map.js' |
| | | import { mapStores } from 'pinia' |
| | | |
| | | import problemApi from '@/api/fysp/problemApi.js' |
| | | |
| | | /** |
| | | * å
·ä½å·¡æ¥ä»»å¡å¯è§å |
| | | * å
æ¬å°å¾å®ä½ä¿¡æ¯å±ç¤ºãå·¡æ¥ä»»å¡å
¨æµç¨å¹³éºå±ç¤º |
| | |
| | | return { height, mapHeight } |
| | | }, |
| | | props: { |
| | | subtask: { |
| | | type: Object, |
| | | default: () => { |
| | | return { |
| | | guid: 'SMuheEkjswioSn7A', |
| | | name: 'ä¸ç§çææ°åæ¸¯é¡¹ç®å·¡æ¥ä¸ç§çææ°åæ¸¯é¡¹ç®å·¡æ¥', |
| | | district: 'éå±±åº', |
| | | planTime: '2024-06-04', |
| | | startTime: '2024-06-04 13:31:26', |
| | | endTime: '2024-06-04 13:33:37', |
| | | userName: 'æ±æ£å¼º', |
| | | status: 'å·²ç»æ', |
| | | total: 4, |
| | | checked: 2 |
| | | } |
| | | } |
| | | } |
| | | // subtask: { |
| | | // type: Object, |
| | | // default: () => { |
| | | // return { |
| | | // guid: 'SMuheEkjswioSn7A', |
| | | // name: 'ä¸ç§çææ°åæ¸¯é¡¹ç®å·¡æ¥ä¸ç§çææ°åæ¸¯é¡¹ç®å·¡æ¥', |
| | | // district: 'éå±±åº', |
| | | // planTime: '2024-06-04', |
| | | // startTime: '2024-06-04 13:31:26', |
| | | // endTime: '2024-06-04 13:33:37', |
| | | // userName: 'æ±æ£å¼º', |
| | | // status: 'å·²ç»æ', |
| | | // total: 4, |
| | | // checked: 2 |
| | | // } |
| | | // } |
| | | // } |
| | | }, |
| | | data() { |
| | | return { |
| | | activities: [ |
| | | { |
| | | content: 'ä»»å¡å建', |
| | | timestamp: '2024-06-04 08:00', |
| | | running: false |
| | | }, |
| | | { |
| | | content: 'å¼å§å·¡æ¥', |
| | | timestamp: '2024-06-04 09:00', |
| | | running: false |
| | | }, |
| | | { |
| | | content: 'ç»æå·¡æ¥', |
| | | timestamp: '2024-06-04 09:15', |
| | | running: false |
| | | }, |
| | | { |
| | | content: '宿é®é¢å®¡æ ¸', |
| | | timestamp: '2024-06-04 10:15', |
| | | running: false |
| | | }, |
| | | { |
| | | content: 'é®é¢æ´æ¹ä¸...', |
| | | timestamp: '2024-06-04 10:15', |
| | | running: true |
| | | } |
| | | ] |
| | | // activities: [ |
| | | // { |
| | | // content: 'ä»»å¡å建', |
| | | // timestamp: '2024-06-04 08:00', |
| | | // running: false |
| | | // }, |
| | | // { |
| | | // content: 'å¼å§å·¡æ¥', |
| | | // timestamp: '2024-06-04 09:00', |
| | | // running: false |
| | | // }, |
| | | // { |
| | | // content: 'ç»æå·¡æ¥', |
| | | // timestamp: '2024-06-04 09:15', |
| | | // running: false |
| | | // }, |
| | | // { |
| | | // content: '宿é®é¢å®¡æ ¸', |
| | | // timestamp: '2024-06-04 10:15', |
| | | // running: false |
| | | // }, |
| | | // { |
| | | // content: 'é®é¢æ´æ¹ä¸...', |
| | | // timestamp: '2024-06-04 10:15', |
| | | // running: true |
| | | // } |
| | | // ] |
| | | problemList: [] |
| | | } |
| | | }, |
| | | computed: { |
| | | ...mapStores(useMapStore), |
| | | subtask() { |
| | | return this.mapStore.focusMarker ? this.mapStore.focusMarker.subtask : {} |
| | | }, |
| | | scene() { |
| | | return this.mapStore.focusMarker ? this.mapStore.focusMarker.scene : {} |
| | | }, |
| | | inspection() { |
| | | return this.mapStore.focusMarker ? this.mapStore.focusMarker.inspection : {} |
| | | } |
| | | }, |
| | | watch: { |
| | | subtask(nV, oV) { |
| | | if (nV != oV) { |
| | | this.fetchProblem(nV.stguid) |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | fetchProblem(stguid) { |
| | | problemApi.fetchProblems(stguid).then((res) => { |
| | | this.problemList = res |
| | | }) |
| | | } |
| | | } |
| | | } |
| | |
| | | right: 0; |
| | | /* background-color: wheat; */ |
| | | } |
| | | |
| | | .el-card { |
| | | --el-card-padding: 8px; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <el-row> |
| | | <div class="p-events-auto"> |
| | | <OptionLocation :level="3" :width="170" v-model="locations"></OptionLocation> |
| | | <OptionSceneType :type="2" :width="120" v-model="sceneType"></OptionSceneType> |
| | | <OptionLocation |
| | | :level="3" |
| | | :width="170" |
| | | :initValue="false" |
| | | v-model="locations" |
| | | ></OptionLocation> |
| | | <OptionSceneType |
| | | :type="2" |
| | | :width="120" |
| | | :initValue="false" |
| | | v-model="sceneType" |
| | | ></OptionSceneType> |
| | | <OptionTime v-model="time"></OptionTime> |
| | | </div> |
| | | </el-row> |
| | |
| | | props: {}, |
| | | data() { |
| | | return { |
| | | locations: {}, |
| | | sceneType: {}, |
| | | locations: { |
| | | pCode: '31', |
| | | pName: '䏿µ·å¸', |
| | | cCode: '3100', |
| | | cName: '䏿µ·å¸', |
| | | dCode: '310106', |
| | | dName: 'éå®åº' |
| | | }, |
| | | sceneType: { |
| | | label: 'å·¥å°', |
| | | value: '1' |
| | | }, |
| | | time: '' |
| | | } |
| | | }, |
| | |
| | | <!-- <el-row class="wrapper"> å¯è§å </el-row> --> |
| | | <BaseMap></BaseMap> |
| | | <el-row class="overlay-container" :style="height"> |
| | | <el-col :span="18"> |
| | | <el-col :span="14"> |
| | | <SupervisionVisual></SupervisionVisual> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <!-- <SubtaskVisual></SubtaskVisual> --> |
| | | <el-col :span="10"> |
| | | <SubtaskVisual></SubtaskVisual> |
| | | </el-col> |
| | | </el-row> |
| | | </template> |