| ¶Ô±ÈÐÂÎļþ |
| | |
| | | (window._iconfont_svg_string_5068051 = |
| | | '<svg><symbol id="icon-element-ui_printer" viewBox="0 0 1024 1024"><path d="M249.856 774.144H95.232c-6.827 0-12.117-0.341-15.872-1.024s-6.997-1.707-9.728-3.072c-5.461-3.413-9.557-7.509-12.288-12.288-1.365-2.731-2.389-5.973-3.072-9.728-0.683-3.755-1.024-9.045-1.024-15.872V375.808c0-21.163 1.195-37.205 3.584-48.128 2.389-10.923 5.632-20.139 9.728-27.648 8.875-15.701 21.163-27.989 36.864-36.864 7.509-4.096 16.725-7.339 27.648-9.728 10.923-2.389 26.965-3.584 48.128-3.584h70.656V53.248h524.288v196.608H844.8c21.163 0 37.205 1.195 48.128 3.584 10.923 2.389 20.139 5.632 27.648 9.728 15.701 8.875 27.989 21.163 36.864 36.864 4.096 7.509 7.339 16.725 9.728 27.648 2.389 10.923 3.584 26.965 3.584 48.128V732.16c0 6.827-0.341 12.117-1.024 15.872s-1.707 6.997-3.072 9.728c-3.413 5.461-7.509 9.557-12.288 12.288-2.731 1.365-5.973 2.389-9.728 3.072-3.755 0.683-9.045 1.024-15.872 1.024H774.144v196.608H249.856V774.144z m65.536-196.608v327.68h393.216v-327.68H315.392z m-65.536 131.072V512h524.288v196.608h131.072v-332.8c0-14.336-0.341-24.576-1.024-30.72s-2.219-11.093-4.608-14.848a29.687 29.687 0 0 0-9.216-9.216c-3.755-2.389-8.704-3.925-14.848-4.608-6.144-0.683-16.384-1.024-30.72-1.024H179.2c-14.336 0-24.576 0.341-30.72 1.024s-11.093 2.219-14.848 4.608a29.687 29.687 0 0 0-9.216 9.216c-2.389 3.755-3.925 8.704-4.608 14.848-0.683 6.144-1.024 16.384-1.024 30.72v332.8h131.072z m65.536-458.752h393.216V118.784H315.392v131.072z m-65.536 131.072h65.536v65.536h-65.536v-65.536z m131.072 0h65.536v65.536h-65.536v-65.536z" ></path></symbol></svg>'), |
| | | ((n) => { |
| | | var e = (t = (t = document.getElementsByTagName('script'))[ |
| | | t.length - 1 |
| | | ]).getAttribute('data-injectcss'), |
| | | t = t.getAttribute('data-disable-injectsvg'); |
| | | if (!t) { |
| | | var i, |
| | | o, |
| | | c, |
| | | s, |
| | | d, |
| | | a = function (e, t) { |
| | | t.parentNode.insertBefore(e, t); |
| | | }; |
| | | if (e && !n.__iconfont__svg__cssinject__) { |
| | | n.__iconfont__svg__cssinject__ = !0; |
| | | try { |
| | | document.write( |
| | | '<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>' |
| | | ); |
| | | } catch (e) { |
| | | console && console.log(e); |
| | | } |
| | | } |
| | | (i = function () { |
| | | var e, |
| | | t = document.createElement('div'); |
| | | (t.innerHTML = n._iconfont_svg_string_5068051), |
| | | (t = t.getElementsByTagName('svg')[0]) && |
| | | (t.setAttribute('aria-hidden', 'true'), |
| | | (t.style.position = 'absolute'), |
| | | (t.style.width = 0), |
| | | (t.style.height = 0), |
| | | (t.style.overflow = 'hidden'), |
| | | (t = t), |
| | | (e = document.body).firstChild |
| | | ? a(t, e.firstChild) |
| | | : e.appendChild(t)); |
| | | }), |
| | | document.addEventListener |
| | | ? ~['complete', 'loaded', 'interactive'].indexOf(document.readyState) |
| | | ? setTimeout(i, 0) |
| | | : ((o = function () { |
| | | document.removeEventListener('DOMContentLoaded', o, !1), i(); |
| | | }), |
| | | document.addEventListener('DOMContentLoaded', o, !1)) |
| | | : document.attachEvent && |
| | | ((c = i), |
| | | (s = n.document), |
| | | (d = !1), |
| | | l(), |
| | | (s.onreadystatechange = function () { |
| | | 'complete' == s.readyState && |
| | | ((s.onreadystatechange = null), r()); |
| | | })); |
| | | } |
| | | function r() { |
| | | d || ((d = !0), c()); |
| | | } |
| | | function l() { |
| | | try { |
| | | s.documentElement.doScroll('left'); |
| | | } catch (e) { |
| | | return void setTimeout(l, 50); |
| | | } |
| | | r(); |
| | | } |
| | | })(window); |
| | |
| | | CompQuickSet: typeof import('./components/search-option/CompQuickSet.vue')['default'] |
| | | Content: typeof import('./components/core/Content.vue')['default'] |
| | | ElAffix: typeof import('element-plus/es')['ElAffix'] |
| | | ElAlert: typeof import('element-plus/es')['ElAlert'] |
| | | ElAside: typeof import('element-plus/es')['ElAside'] |
| | | ElAvatar: typeof import('element-plus/es')['ElAvatar'] |
| | | ElBadge: typeof import('element-plus/es')['ElBadge'] |
| | | ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] |
| | | ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem'] |
| | | ElButton: typeof import('element-plus/es')['ElButton'] |
| | | ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup'] |
| | | ElCalendar: typeof import('element-plus/es')['ElCalendar'] |
| | | ElCard: typeof import('element-plus/es')['ElCard'] |
| | | ElCascader: typeof import('element-plus/es')['ElCascader'] |
| | |
| | | ElDialog: typeof import('element-plus/es')['ElDialog'] |
| | | ElDivider: typeof import('element-plus/es')['ElDivider'] |
| | | ElDrawer: typeof import('element-plus/es')['ElDrawer'] |
| | | ElDropdown: typeof import('element-plus/es')['ElDropdown'] |
| | | ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] |
| | | ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] |
| | | ElEmpty: typeof import('element-plus/es')['ElEmpty'] |
| | | ElForm: typeof import('element-plus/es')['ElForm'] |
| | | ElFormItem: typeof import('element-plus/es')['ElFormItem'] |
| | |
| | | ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] |
| | | ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup'] |
| | | ElOption: typeof import('element-plus/es')['ElOption'] |
| | | ElPageHeader: typeof import('element-plus/es')['ElPageHeader'] |
| | | ElPagination: typeof import('element-plus/es')['ElPagination'] |
| | | ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm'] |
| | | ElPopover: typeof import('element-plus/es')['ElPopover'] |
| | | ElRadio: typeof import('element-plus/es')['ElRadio'] |
| | | ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] |
| | | ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] |
| | | ElRow: typeof import('element-plus/es')['ElRow'] |
| | | 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'] |
| | | ElStep: typeof import('element-plus/es')['ElStep'] |
| | |
| | | ElTag: typeof import('element-plus/es')['ElTag'] |
| | | ElText: typeof import('element-plus/es')['ElText'] |
| | | ElTooltip: typeof import('element-plus/es')['ElTooltip'] |
| | | ElTransfer: typeof import('element-plus/es')['ElTransfer'] |
| | | ElTree: typeof import('element-plus/es')['ElTree'] |
| | | ElUpload: typeof import('element-plus/es')['ElUpload'] |
| | | Footer: typeof import('./components/core/Footer.vue')['default'] |
| | |
| | | FYSearchBar: typeof import('./components/search-option/FYSearchBar.vue')['default'] |
| | | FYTable: typeof import('./components/table/FYTable.vue')['default'] |
| | | Header: typeof import('./components/core/Header.vue')['default'] |
| | | IconPrinter: typeof import('./components/iconfont/IconPrinter.vue')['default'] |
| | | ItemDevice: typeof import('./components/list-item/ItemDevice.vue')['default'] |
| | | ItemMonitorObj: typeof import('./components/list-item/ItemMonitorObj.vue')['default'] |
| | | ItemScene: typeof import('./components/list-item/ItemScene.vue')['default'] |
| | |
| | | SearchBar: typeof import('./components/SearchBar.vue')['default'] |
| | | SideList: typeof import('./components/SideList.vue')['default'] |
| | | SiderMenu: typeof import('./components/core/SiderMenu.vue')['default'] |
| | | SvgIcon: typeof import('./components/iconfont/SvgIcon.vue')['default'] |
| | | ToolBar: typeof import('./components/ToolBar.vue')['default'] |
| | | } |
| | | export interface ComponentCustomProperties { |
| | |
| | | <template> |
| | | <div style="padding-right: 10px;"> |
| | | <div style="padding-right: 10px"> |
| | | <div v-if="legend" class="state-label"> |
| | | <el-input |
| | | v-model="filterText" |
| | |
| | | </el-space> |
| | | </el-tooltip> |
| | | </div> |
| | | <slot name="header" class="state-label"></slot> |
| | | <el-tree |
| | | ref="treeRef" |
| | | class="el-tree" |
| | |
| | | title: String, |
| | | descriptions: { |
| | | type: Array, |
| | | default: () => [ |
| | | { |
| | | name: '', |
| | | value: '' |
| | | } |
| | | ] |
| | | default: () => [] |
| | | }, |
| | | buttons: { |
| | | type: Array, |
| | | default: () => [ |
| | | { |
| | | name: '', |
| | | color: 'primary', |
| | | click: () => {} |
| | | } |
| | | ] |
| | | default: () => [] |
| | | } |
| | | } |
| | | }; |
| | |
| | | background-color: white; |
| | | height: var(--height-toolbar); |
| | | border-bottom: 1px solid var(--el-color-info-light-7); |
| | | box-shadow: 6px 4px 4px rgba(0, 0, 0, 0.12); |
| | | box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.12); |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | |
| | | <el-row align="middle" class="header"> |
| | | <el-col :span="12"> |
| | | <el-space> |
| | | <el-button @click="collapsedSider" icon="Fold" circle :class="rotateIcon" /> |
| | | <el-button |
| | | @click="collapsedSider" |
| | | icon="ArrowLeftBold" |
| | | circle |
| | | :class="rotateIcon" |
| | | /> |
| | | <el-breadcrumb separator="/" style="white-space: nowrap"> |
| | | <el-breadcrumb-item v-for="(t, i) in navTitles" :key="i">{{ t }}</el-breadcrumb-item> |
| | | <el-breadcrumb-item v-for="(t, i) in navTitles" :key="i">{{ |
| | | t |
| | | }}</el-breadcrumb-item> |
| | | </el-breadcrumb> |
| | | </el-space> |
| | | </el-col> |
| | |
| | | } |
| | | |
| | | .rotate-icon { |
| | | transform: rotate(-90deg); |
| | | transform: rotate(-180deg); |
| | | } |
| | | |
| | | .logout { |
| | |
| | | props: { |
| | | collapse: { |
| | | type: Boolean, |
| | | default: false |
| | | default: true |
| | | } |
| | | }, |
| | | emits: ['navPage'], |
| | |
| | | return this.sysNames[this.sysIndex].name; |
| | | }, |
| | | menus() { |
| | | return [MENU_FYSP, MENU_FYTZ, MENU_FYPW][this.sysIndex]; |
| | | return [MENU_FYSP(), MENU_FYTZ, MENU_FYPW][this.sysIndex]; |
| | | } |
| | | }, |
| | | methods: { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <SvgIcon |
| | | icon-class="icon-element-ui_printer" |
| | | color="var(--el-color-default)" |
| | | /> |
| | | </template> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <svg :class="classList" aria-hidden="true"> |
| | | <use :xlink:href="iconName" :fill="color" /> |
| | | </svg> |
| | | </template> |
| | | <script setup> |
| | | import { computed } from 'vue'; |
| | | const props = defineProps({ |
| | | className: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | iconClass: { |
| | | type: String, |
| | | required: true |
| | | }, |
| | | color: { |
| | | type: String, |
| | | default: '#409eff' |
| | | }, |
| | | size: { |
| | | type: String, |
| | | default: '20px' |
| | | } |
| | | }); |
| | | const classList = computed(() => { |
| | | return ['icon', props.className || '']; |
| | | }); |
| | | const iconName = computed(() => { |
| | | return `#${props.iconClass}`; |
| | | }); |
| | | </script> |
| | | <style scoped> |
| | | .icon { |
| | | /* v-bindæ¯Vue3ææ¯æçåè½ï¼å¯ä»¥å°CSSçå¼ä¸jsçå¼ç»å® */ |
| | | width: v-bind('props.size'); |
| | | height: v-bind('props.size'); |
| | | position: relative; |
| | | vertical-align: -2px; |
| | | fill: currentColor; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * 卿¤å¤æ³¨åç徿 ç»ä»¶ï¼å¨å
¨å±ç»ä»¶ä¸å¯ä»¥ç´æ¥ä½¿ç¨ |
| | | * ç¨æ³åelementUIä¸ç徿 ç»ä»¶ç¨æ³ç¸å |
| | | */ |
| | | export {default as IconPrinter} from './IconPrinter.vue'; |
| | |
| | | <!-- <el-card shadow="hover"> --> |
| | | <div :class="statusClass + ' wrapper'"> |
| | | <div> |
| | | <!-- <el-text>{{ item.displayid }}ã</el-text> --> |
| | | <el-text tag="b" class="text-line-2"> |
| | | {{ item.displayid + 'ã' + item.sensename }} |
| | | {{ item.displayid + '. ' + item.sensename }} |
| | | </el-text> |
| | | </div> |
| | | <div> |
| | | <el-text truncated class="w-250px" type="info"> |
| | | <el-text truncated class="w-300px" type="info"> |
| | | <el-icon><LocationInformation /></el-icon> |
| | | {{ item.scene.location }} |
| | | </el-text> |
| | |
| | | width: 300px; |
| | | height: 40px; |
| | | display: -webkit-box; |
| | | line-height: 20px; |
| | | line-clamp: 2; |
| | | -webkit-line-clamp: 2; |
| | | -webkit-box-orient: vertical; |
| | |
| | | <!-- <el-card shadow="hover"> --> |
| | | <div class="wrapper"> |
| | | <div> |
| | | <el-text>{{ item.index }}ã</el-text> |
| | | <el-text>{{ item.name }}</el-text> |
| | | <el-text>{{ item.index + '. ' + item.name }}</el-text> |
| | | </div> |
| | | <!-- <div> |
| | | <el-text>å°åï¼{{ item.location }}</el-text> |
| | |
| | | <div class="text-info"> |
| | | <div class="text-label"> |
| | | <el-icon class="m-r-4" size="16"><LocationInformation /></el-icon> |
| | | <span>ä»»å¡å°åï¼</span> |
| | | <span>å°åï¼</span> |
| | | </div> |
| | | {{ item.scenseaddress }} |
| | | </div> |
| | |
| | | <div class="text-label"> |
| | | <!-- <el-icon><Clock /></el-icon> --> |
| | | <el-icon class="m-r-4" size="16"><AlarmClock /></el-icon> |
| | | <span>任塿¶é´ï¼</span> |
| | | <span>æ¶é´ï¼</span> |
| | | </div> |
| | | {{ $fm.formatYMD(item.planstarttime) }} |
| | | </div> |
| | | <div class="text-info"> |
| | | <div class="text-label"> |
| | | <el-icon class="m-r-4" size="16"><User /></el-icon> |
| | | ä»»å¡äººåï¼ |
| | | 人åï¼ |
| | | </div> |
| | | {{ item.executorrealtimes }} |
| | | </div> |
| | |
| | | #container { |
| | | position: relative; |
| | | width: 100%; |
| | | height: 100vh; |
| | | height: 100%; |
| | | min-height: var(--screen-min-height); |
| | | min-width: var(--screen-min-width); |
| | | z-index: 0px; |
| | |
| | | opacity: 0 !important; |
| | | } |
| | | |
| | | .amap-marker-label { |
| | | font-size: 13px; |
| | | /* .amap-marker-label { |
| | | font-size: 14px; |
| | | text-align: center; |
| | | color: white; |
| | | background-color: transparent; |
| | |
| | | border-radius: 2px; |
| | | border: 0px; |
| | | padding: 4px; |
| | | } |
| | | } */ |
| | | </style> |
| | |
| | | <template> |
| | | <BaseMap></BaseMap> |
| | | <el-row class="left-top-wrap"> |
| | | <div class="wrap p-events-none"> |
| | | <el-row class="p-events-none"> |
| | | <FYOptionScene |
| | | class="p-events-auto" |
| | | label="" |
| | | :allOption="true" |
| | | :type="2" |
| | | v-model:value="scenetype" |
| | | ></FYOptionScene> |
| | | <div class="p-events-auto"> |
| | | <slot name="left-top"></slot> |
| | | </div> |
| | | </el-row> |
| | | <el-row |
| | | class="p-events-none left-wrap" |
| | | align="bottom" |
| | | :style="leftCardWrapStyle" |
| | | > |
| | | <div |
| | | ref="refLeftCard" |
| | | v-show="leftCardShow" |
| | | class="card-left p-events-auto" |
| | | > |
| | | <div><el-text size="large">åºæ¯å表</el-text></div> |
| | | <el-scrollbar height="400px" class="scrollbar"> |
| | | <el-row |
| | | v-for="s in selectedSceneList" |
| | | :key="s.guid" |
| | | justify="space-between" |
| | | class="p-v-4 scene-item" |
| | | > |
| | | <el-text truncated style="width: 250px"> |
| | | {{ s.index + 'ã' + s.name }} |
| | | </el-text> |
| | | <el-space> |
| | | <el-icon |
| | | :color=" |
| | | s._checked ? 'rgb(121, 187, 255)' : 'rgb(200, 201, 204)' |
| | | " |
| | | @click="locateTo(s)" |
| | | > |
| | | <LocationInformation /> |
| | | </el-icon> |
| | | <el-icon |
| | | class="cursor-p" |
| | | :color=" |
| | | s._visible ? 'rgb(121, 187, 255)' : 'rgb(200, 201, 204)' |
| | | " |
| | | @click="handleVisibleChange(s)" |
| | | > |
| | | <View /> |
| | | </el-icon> |
| | | </el-space> |
| | | </el-row> |
| | | </el-scrollbar> |
| | | </div> |
| | | <el-button |
| | | class="close-btn-right p-events-auto" |
| | | type="primary" |
| | | plain |
| | | size="small" |
| | | :icon="leftCardShow ? 'ArrowLeft' : 'ArrowRight'" |
| | | @click="leftCardShow = !leftCardShow" |
| | | ></el-button> |
| | | </el-row> |
| | | </div> |
| | | |
| | | <!-- <el-row class="right-wrap"> |
| | | <el-col :span="4"> |
| | | <el-button>close</el-button> |
| | |
| | | |
| | | </el-col> |
| | | </el-row> --> |
| | | <el-scrollbar class="right-wrap"> |
| | | <div v-for="s in selectedSceneList" :key="s.guid"> |
| | | <el-checkbox |
| | | v-model="s._checked" |
| | | :label="s.name" |
| | | @change="handleChange(s)" |
| | | /> |
| | | <!-- <el-text>{{ s.name }}</el-text> --> |
| | | </div> |
| | | </el-scrollbar> |
| | | </template> |
| | | <script setup> |
| | | import { ref, watch, computed } from 'vue'; |
| | | import { ref, watch, computed, onMounted } from 'vue'; |
| | | import { map, onMapMounted } from '@/utils/map/index'; |
| | | import marks from '@/utils/map/marks'; |
| | | import mapUtil from '@/utils/map/util'; |
| | |
| | | data: Array |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | // refLeftCard.value.offsetHeight; |
| | | // leftCardWrapStyle.value = { |
| | | // height: refLeftCard.value.offsetHeight + 'px' |
| | | // }; |
| | | }); |
| | | |
| | | const refLeftCard = ref(); |
| | | const leftCardShow = ref(true); |
| | | const leftCardWrapStyle = ref(); |
| | | |
| | | let allMarkViews = []; |
| | | let markViewList = []; |
| | | |
| | |
| | | |
| | | const selectedSceneList = computed(() => { |
| | | return props.data.filter((v) => { |
| | | v._checked = true; |
| | | v._visible = true; |
| | | return ( |
| | | scenetype.value == undefined || |
| | | scenetype.value.value == null || |
| | |
| | | } |
| | | }); |
| | | |
| | | function handleChange(scene) { |
| | | function handleVisibleChange(scene) { |
| | | const mv = markViewList.find((v) => { |
| | | return scene.guid == v.getExtData().guid; |
| | | }); |
| | | if (scene._checked) { |
| | | scene._visible = !scene._visible; |
| | | if (scene._visible) { |
| | | map.add(mv); |
| | | } else { |
| | | map.remove(mv); |
| | | } |
| | | // filterMarkViews(); |
| | | } |
| | | |
| | | function locateTo(scene) { |
| | | const mv = markViewList.find((v) => { |
| | | return scene.guid == v.getExtData().guid; |
| | | }); |
| | | if (mv) { |
| | | mapUtil.setFitView(mv); |
| | | } |
| | | } |
| | | |
| | | function createSceneMarks() { |
| | |
| | | const mark = marks.createMarker({ |
| | | position: [d.longitude, d.latitude], |
| | | img: sceneIcon(d.typeid), |
| | | // label: d.name, |
| | | label: '', |
| | | extData: d |
| | | }); |
| | | var timeout; |
| | | // æ·»å ç¹å»äºä»¶ |
| | | mark.on('click', (ev) => { |
| | | mark.on('mouseover', (ev) => { |
| | | if (timeout) { |
| | | clearTimeout(timeout); |
| | | } |
| | | const _mark = ev.target; |
| | | const _extData = _mark.getExtData(); |
| | | if (_extData._show) { |
| | | ev.target.setLabel({ |
| | | content: '' |
| | | // direction: 'bottom' |
| | | }); |
| | | _extData._show = false; |
| | | ev.target.setExtData(_extData); |
| | | } else { |
| | | ev.target.setLabel({ |
| | | content: _extData.name |
| | | // direction: 'bottom' |
| | | }); |
| | | _extData._show = true; |
| | | ev.target.setExtData(_extData); |
| | | } |
| | | timeout = setTimeout(() => { |
| | | ev.target.setLabel({ |
| | | content: '' |
| | | }); |
| | | }, 2000); |
| | | // if (_extData._show) { |
| | | // ev.target.setLabel({ |
| | | // content: '' |
| | | // // direction: 'bottom' |
| | | // }); |
| | | // _extData._show = false; |
| | | // ev.target.setExtData(_extData); |
| | | // } else { |
| | | // ev.target.setLabel({ |
| | | // content: _extData.name |
| | | // // direction: 'bottom' |
| | | // }); |
| | | // _extData._show = true; |
| | | // ev.target.setExtData(_extData); |
| | | // } |
| | | }); |
| | | allMarkViews.push(mark); |
| | | }); |
| | |
| | | } |
| | | markViewList = markViewList.filter((v) => { |
| | | const _index = selectedSceneList.value.findIndex((s) => { |
| | | return s.guid == v.getExtData().guid && s._checked; |
| | | return s.guid == v.getExtData().guid && s._visible; |
| | | }); |
| | | return _index != -1; |
| | | }); |
| | |
| | | } |
| | | </script> |
| | | <style scoped> |
| | | .left-top-wrap { |
| | | .wrap { |
| | | position: absolute; |
| | | left: 0px; |
| | | top: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | .left-wrap { |
| | | position: absolute; |
| | | left: 0; |
| | | top: 0; |
| | | bottom: 1px; |
| | | } |
| | | .right-wrap { |
| | | position: absolute; |
| | | right: 0px; |
| | | bottom: 0; |
| | | height: 50%; |
| | | |
| | | .card-left { |
| | | background-color: white; |
| | | border-radius: 4px; |
| | | padding: 2px 8px; |
| | | max-width: 300px; |
| | | box-shadow: var(--el-box-shadow); |
| | | /* border-radius: 4px; */ |
| | | width: 316px; |
| | | /* box-shadow: var(--el-box-shadow); */ |
| | | z-index: 0; |
| | | } |
| | | |
| | | .scrollbar { |
| | | padding-right: 8px; |
| | | /* width: 300px; */ |
| | | } |
| | | |
| | | .close-btn-right { |
| | | margin-left: -3px; |
| | | height: 60px; |
| | | } |
| | | |
| | | .p-events-auto { |
| | | pointer-events: auto; |
| | | } |
| | | |
| | | .p-events-none { |
| | | pointer-events: none; |
| | | } |
| | | |
| | | .scene-item { |
| | | /* background-color: aliceblue; */ |
| | | } |
| | | </style> |
| | |
| | | } |
| | | ElMessage({ |
| | | message: errStr, |
| | | type: 'warning', |
| | | type: 'error', |
| | | }); |
| | | }); |
| | | } |
| | |
| | | }); |
| | | } |
| | | |
| | | const MENU_FYSP = [ |
| | | const _MENU_FYSP = [ |
| | | // { |
| | | // icon: 'Search', |
| | | // name: 'å·¡æ¥å®¡æ ¸', |
| | |
| | | { |
| | | path: '/fysp/config/domainCatalog', |
| | | icon: 'List', |
| | | name: 'å¼åç®å½' |
| | | name: 'å¼åç®å½', |
| | | debug: true |
| | | } |
| | | ] |
| | | }, |
| | |
| | | } |
| | | ]; |
| | | |
| | | |
| | | const MENU_FYSP = () => { |
| | | // æ·±æ·è´åå§èåæ°ç»ï¼é¿å
ä¿®æ¹åæ°æ® |
| | | const menuCopy = JSON.parse(JSON.stringify(_MENU_FYSP)); |
| | | |
| | | // éå½å¤çèå项 |
| | | const processMenuItem = (item) => { |
| | | // 妿å½å项æchildren屿§ |
| | | if (item.children && Array.isArray(item.children)) { |
| | | // æ ¹æ®ç¯å¢è¿æ»¤childrenæ°ç» |
| | | item.children = item.children.filter(child => { |
| | | // éå½å¤çå项çchildren |
| | | processMenuItem(child); |
| | | |
| | | // å¼åç¯å¢ä¿çææé¡¹ï¼å
æ¬debug: trueçï¼ï¼ç产ç¯å¢è¿æ»¤ædebug: trueç项 |
| | | // 注æï¼åªæè®¾ç½®äºdebug: trueç项æéè¦å¨éå¼åç¯å¢è¿æ»¤ |
| | | // å¦ææ²¡ædebug屿§ï¼åºè¯¥ä¿ç |
| | | return import.meta.env.DEV || child.debug !== true; |
| | | }); |
| | | } |
| | | return item; |
| | | }; |
| | | |
| | | // å¤çæ´ä¸ªèåæ°ç» |
| | | return menuCopy.map(processMenuItem); |
| | | }; |
| | | |
| | | |
| | | export { MENU_FYSP, MENU_FYTZ, MENU_FYPW, MENU_COMMON }; |
| | |
| | | |
| | | // import 'element-plus/dist/index.css'; |
| | | import './assets/main.css'; |
| | | import './assets/iconfont/iconfont.js' |
| | | import * as MyIconfont from './components/iconfont'; |
| | | |
| | | import { ElMessageBox, ElNotification, ElMessage } from 'element-plus'; |
| | | import 'element-plus/theme-chalk/src/overlay.scss'; |
| | |
| | | app.component(key, component); |
| | | } |
| | | |
| | | // å
¨å±æ³¨åèªå®ä¹å¾æ ç»ä»¶ |
| | | for (const [key, component] of Object.entries(MyIconfont)) { |
| | | app.component(key, component); |
| | | } |
| | | |
| | | |
| | | |
| | | app |
| | | .use(pinia) |
| | | .use(router) |
| | |
| | | FileSaver.saveAs(blob, zipName); |
| | | } |
| | | |
| | | function print( |
| | | function print({ |
| | | ref, |
| | | title, |
| | | style, |
| | |
| | | borderHeadStyle, |
| | | gridStyle, |
| | | css |
| | | ) { |
| | | }) { |
| | | printJS({ |
| | | printable: ref, |
| | | header: title || null, |
| | | type: type || 'html', |
| | | // headerStyle: |
| | | // 'font-size:6px;font-weight:600;text-align:center;padding:15px 0 10px 0;', //æ é¢è®¾ç½® |
| | | headerStyle: |
| | | 'font-size:6px;font-weight:600;text-align:center;padding:15px 0 10px 0;', //æ é¢è®¾ç½® |
| | | properties: jsonData || [], //jsonæ°æ®å
|
| | | gridHeaderStyle: |
| | | borderHeadStyle || |
| | | 'font-size:6px;font-weight:400;height:40px;line-height:40px;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //jsonæ ¼å¼è¡¨å¤´æ ·å¼ |
| | | gridStyle: |
| | | gridStyle || |
| | | 'font-size:1px;font-weight:200;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //jsonåå¼è¡¨å¥å¤®è§ |
| | | // gridHeaderStyle: |
| | | // borderHeadStyle || |
| | | // 'font-size:6px;font-weight:400;height:40px;line-height:40px;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //jsonæ ¼å¼è¡¨å¤´æ ·å¼ |
| | | // gridStyle: |
| | | // gridStyle || |
| | | // 'font-size:1px;font-weight:200;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //jsonåå¼è¡¨å¥å¤®è§ |
| | | scanStyles: false, //ä¸éç¨é»è®¤æ ·å¼ |
| | | repeatTableHeader: false, //æå°jsonè¡¨å¤´åªæ¾ç¤ºå¨ç¬¬ä¸é¡µ |
| | | style: style || `@page{size:auto;margin: 0cm 1cm 0cm 1cm;}`, //å»é¤é¡µç页è |
| | | style: style || `@page{size:A4;margin: -1cm 0cm 0cm 0cm;}`, //å»é¤é¡µç页è |
| | | css: css || null //css url |
| | | }); |
| | | } |
| | |
| | | e(); |
| | | }); |
| | | onMapMountedEvents = []; |
| | | console.log('-------------------map init done'); |
| | | }) |
| | | .catch((e) => { |
| | | console.log(e); |
| | |
| | | export default { |
| | | data() { |
| | | return { |
| | | isCollapsed: false, |
| | | isCollapsed: true, |
| | | navTitles: [], |
| | | headerHeight: 60, |
| | | mainPadding: 10, |
| | |
| | | :items="domainCatalog" |
| | | :loading="sideLoading" |
| | | @item-click="chooseCatalog" |
| | | ></SideList> |
| | | > |
| | | <template #header> |
| | | <el-row justify="end"> |
| | | <el-button |
| | | type="primary" |
| | | icon="CirclePlusFilled" |
| | | size="small" |
| | | @click="handelDownload" |
| | | > |
| | | </el-button> |
| | | </el-row> |
| | | </template> |
| | | </SideList> |
| | | </template> |
| | | <template #main> |
| | | <ToolBar |
| | | class="toolbar-sticky" |
| | | :title="selectedCatalog?.name" |
| | | :loading="loading" |
| | | ></ToolBar> |
| | | <!-- <FormCol> --> |
| | | <el-table |
| | | :data="domainItems" |
| | |
| | | |
| | | // åæ¶ç¼è¾ |
| | | function cancelEdit(scope) { |
| | | scope.row._isAdd = false; |
| | | scope.row._isEdit = false; |
| | | if (scope.row._isAdd) { |
| | | domainItems.value.splice(scope.$index, 1); |
| | | } |
| | | |
| | | |
| | | scope.row._isAdd = false; |
| | | scope.row._isEdit = false; |
| | | } |
| | | |
| | | function _validate(row) { |
| | | return ( |
| | |
| | | <el-dialog |
| | | :model-value="modelValue" |
| | | @update:model-value="handleDialogChange" |
| | | title="å·¡æ¥åæ®ä¸è½½" |
| | | title="å·¡æ¥åæ®ä¸è½½æå°" |
| | | class="dialog-wrapper" |
| | | v-loading="loading" |
| | | > |
| | |
| | | type="default" |
| | | size="small" |
| | | class="m-t-4" |
| | | icon="IconPrinter" |
| | | @click="handlePreview(item)" |
| | | > |
| | | é¢è§ |
| | | </el-button> |
| | | </el-row> |
| | | </el-checkbox> |
| | |
| | | </el-scrollbar> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="danger" @click="cancel">åæ¶</el-button> |
| | | <el-button type="primary" :loading="docLoading" @click="handelDownload"> |
| | | ä¸è½½ |
| | | <el-button type="danger" @click="cancel" icon="CloseBold" |
| | | >åæ¶</el-button |
| | | > |
| | | <el-button |
| | | type="primary" |
| | | :loading="docLoading" |
| | | icon="Download" |
| | | :disabled="checkList.length == 0" |
| | | @click="handelDownload" |
| | | > |
| | | ä¸è½½æé |
| | | </el-button> |
| | | <el-button type="default" :loading="docLoading" @click="handelPrint"> |
| | | æå° |
| | | <el-button |
| | | type="default" |
| | | :loading="docLoading" |
| | | :disabled="checkList.length == 0" |
| | | @click="handlePreview()" |
| | | icon="IconPrinter" |
| | | > |
| | | <el-space> |
| | | æå°æé |
| | | </el-space> |
| | | </el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <el-dialog v-model="previewVisible" :show-close="true" fullscreen> |
| | | <el-dialog v-model="previewVisible" :show-close="false" fullscreen> |
| | | <template #header="{ close, titleId, titleClass }"> |
| | | <el-row justify="end"> |
| | | <el-button type="danger" @click="close" icon="CircleCloseFilled"> |
| | |
| | | <el-button |
| | | type="primary" |
| | | @click="handelPrint(refWord)" |
| | | icon="PrintFilled" |
| | | icon="IconPrinter" |
| | | > |
| | | æå° |
| | | </el-button> |
| | | </el-row> |
| | | </template> |
| | | <div ref="refWord"> |
| | | |
| | | <div |
| | | :id="`word-preview-${i}`" |
| | | v-for="(item, i) in previewList" |
| | | :key="item" |
| | | ></div> |
| | | </div> |
| | | <!-- <iframe ref="pdfPreview" width="100%" height="100vh" style="height: calc(100vh - 60px);"></iframe> --> |
| | | </el-dialog> |
| | |
| | | * åºæ¯å·¡æ¥åæ®èªå¨ä¸è½½ |
| | | */ |
| | | import { ref, watch } from 'vue'; |
| | | import { useRouter } from "vue-router"; |
| | | import { useRouter } from 'vue-router'; |
| | | import { |
| | | exportDocx, |
| | | prepareDocxBlob, |
| | |
| | | |
| | | // é¢è§å¯¹è¯æ¡å¼å
³ |
| | | const previewVisible = ref(false); |
| | | // é¢è§çææ¡£ |
| | | const previewList = ref([]); |
| | | |
| | | watch( |
| | | () => [props.modelValue, props.value], |
| | |
| | | |
| | | // æ ¹æ®åºæ¯ç±»åï¼çæå¯¹åºçwordææ¡£ |
| | | function generateDoc(param, callback) { |
| | | param.map((p) => { |
| | | param.map((p, index) => { |
| | | let template, _param; |
| | | switch (p.type) { |
| | | // å·¥å° |
| | |
| | | break; |
| | | } |
| | | prepareDocxBlob(template, _param).then((blob) => { |
| | | callback(blob, `${_param.name}å·¡æ¥åæ®.docx`); |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | function generatePdf(param, callback) { |
| | | param.map((p) => { |
| | | let template, _param; |
| | | switch (p.type) { |
| | | // å·¥å° |
| | | case 1: |
| | | template = '/å·¥å°å·¡æ¥åæ®æ¨¡æ¿-ç®ç.docx'; |
| | | _param = p.params; |
| | | break; |
| | | // é¤é¥® |
| | | case 5: |
| | | template = '/é¤é¥®å·¡æ¥åæ®æ¨¡æ¿.docx'; |
| | | _param = p.params; |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | preparePdf(template, _param).then((blob) => { |
| | | callback(blob, `${_param.name}å·¡æ¥åæ®.pdf`); |
| | | callback(blob, `${_param.name}å·¡æ¥åæ®.docx`, index); |
| | | }); |
| | | }); |
| | | } |
| | |
| | | // ç¹å»æå°æé®æä½ |
| | | function handelPrint(ref) { |
| | | if (ref) { |
| | | print(ref); |
| | | print({ |
| | | ref, |
| | | // æ ¹æ®ç®å使ç¨çdocx-previewç»ä»¶ï¼è®¾ç½®æå°æ ·å¼ï¼ä¸»è¦å»é¤å¤ä½çmarginåpaddingï¼ä»¥åé´å½±ææ |
| | | style: ` |
| | | @page{size:A4;margin: 0 !important;padding:0 !important;} |
| | | body {margin: 0 !important;padding:0 !important;} |
| | | header {color: rgb(182, 182, 182);} |
| | | footer {color: rgb(182, 182, 182);} |
| | | .docx-wrapper {padding: 0 !important;} |
| | | .docx {margin-bottom: 0 !important; box-shadow: none !important;} |
| | | .docx_5 { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: flex-end; |
| | | } |
| | | // const file = filePrepare(); |
| | | // if (file) { |
| | | // previewDocx(file.blob, refWord.value); |
| | | // } |
| | | ` |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function handlePreview(item) { |
| | | const param = parseParam(item); |
| | | // é¢è§çææ¡£ï¼åºååç¬æå°åæå°å
¨é¨ |
| | | previewList.value = item ? ['0'] : checkList.value; |
| | | const param = item ? parseParam(item) : parseParam(); |
| | | if (param) { |
| | | generatePdf(param, (blob, name) => { |
| | | generateDoc(param, (blob, name, index) => { |
| | | previewVisible.value = true; |
| | | setTimeout(() => { |
| | | previewDocx(blob, refWord.value); |
| | | previewDocx(blob, document.getElementById(`word-preview-${index}`)); |
| | | }, 200); |
| | | // blob.print() |
| | | // blob.getBlob((buffer) => { |
| | | // previewDocx(buffer, refWord.value); |
| | | // }); |
| | | |
| | | // const resolved = router.resolve({ |
| | | // path: '/fysp/scene/SceneInspectFile', |
| | | // query: { |
| | | // data: JSON.stringify(blob), |
| | | // } |
| | | // }); |
| | | // window.open(resolved.href, '_blank') |
| | | |
| | | |
| | | // console.log('pdf', blob); |
| | | |
| | | // blob.autoPrint(); |
| | | // // blob.save(name) |
| | | // // çæPDFçBlob对象 |
| | | // var pdfBlob = blob.output('blob'); |
| | | |
| | | // setTimeout(() => { |
| | | // // å¨iframe䏿¾ç¤ºé¢è§ |
| | | // pdfPreview.value.src = URL.createObjectURL(pdfBlob); |
| | | // }, 200); |
| | | }); |
| | | } |
| | | } |
| | |
| | | :deep(.el-checkbox__label) { |
| | | width: 100%; |
| | | } |
| | | |
| | | /* ææ¡£åä½ */ |
| | | :deep(section.docx) { |
| | | font-family: 'é»ä½' !important; |
| | | } |
| | | /* ææ¡£æ é¢ */ |
| | | :deep(header) { |
| | | color: rgb(182, 182, 182); |
| | | } |
| | | :deep(.docx_5) { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: flex-end; |
| | | } |
| | | |
| | | /* */ |
| | | :deep(footer) { |
| | | color: rgb(182, 182, 182); |
| | | } |
| | | </style> |
| | |
| | | sortable |
| | | prop="ncNum" |
| | | label="ç¼å·" |
| | | width="100" |
| | | width="90" |
| | | > |
| | | </el-table-column> |
| | | <el-table-column |
| | |
| | | prop="ncItemName" |
| | | label="项ç®åç§°" |
| | | :show-overflow-tooltip="true" |
| | | width="400" |
| | | width="200" |
| | | > |
| | | </el-table-column> |
| | | <!-- <el-table-column prop="ncItemUnit" label="ä¸ä¸»åä½" width="130" /> --> |
| | |
| | | <el-table-column |
| | | prop="ncFileName" |
| | | label="夿½æä»¶" |
| | | width="170" |
| | | width="186" |
| | | > |
| | | <template #default="{ row }"> |
| | | <el-link |
| | |
| | | :href="row.ncUrl" |
| | | target="_blank" |
| | | >{{ row.ncFileName }}</el-link |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="ncUserId" label="å¹é
ç¨æ·"> |
| | | <template #default="{ row }"> |
| | | <el-text |
| | | :loading="row._loading" |
| | | :type="row._user ? 'success' : 'danger'" |
| | | >{{ row._user ? row._user.realname : 'æªå¹é
' }}</el-text |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | |
| | | {{ $fm.formatYMD(row.ncCreateTime) }} |
| | | </template> |
| | | </el-table-column> --> |
| | | <el-table-column prop="ncUserId" label="å¹é
ç¨æ·"> |
| | | <template #default="{ row }"> |
| | | <el-text |
| | | :loading="row._loading" |
| | | :type="row._user ? 'success' : 'danger'" |
| | | >{{ row._user ? row._user.realname : 'æªå¹é
' }}</el-text |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column fixed="right" label="æä½" width="80"> |
| | | <template #default="{ row }"> |
| | | <el-button |
| | |
| | | </el-checkbox-group> |
| | | </el-space> |
| | | <el-scrollbar :height="height"> |
| | | <el-space wrap> |
| | | <el-space v-if="activeData.length > 0" wrap style="padding-bottom: 200px;"> |
| | | <ItemMonitorObj v-for="obj in activeData" :key="obj.movid" :item="obj"> |
| | | <template #default="{ item }"> |
| | | <slot :item="item"> |
| | |
| | | </template> |
| | | </ItemMonitorObj> |
| | | </el-space> |
| | | <el-empty v-else description="ææ è®°å½" /> |
| | | </el-scrollbar> |
| | | </div> |
| | | </template> |
| | |
| | | return { |
| | | activeName: defaultTabName, |
| | | tabs: [], |
| | | checkList: [0, 1, 2] |
| | | checkList: [0] |
| | | }; |
| | | }, |
| | | computed: { |
| | |
| | | <template> |
| | | <el-row justify="space-between"> |
| | | <el-text>åæ¥è®¡å</el-text> |
| | | <div> |
| | | <div v-show="create && data && data.length > 0"> |
| | | <el-button |
| | | icon="IconPrinter" |
| | | type="success" |
| | | size="small" |
| | | plain |
| | | @click="handleInspectFileDownload" |
| | | >åæ®ä¸è½½</el-button |
| | | >åæ®æå°</el-button |
| | | > |
| | | <el-button |
| | | v-show="create && data && data.length > 0" |
| | | type="success" |
| | | size="small" |
| | | @click="add" |
| | | <el-button type="success" size="small" @click="add" icon="Switch" |
| | | >ä»»å¡è°æ´</el-button |
| | | > |
| | | </div> |
| | |
| | | plain |
| | | type="primary" |
| | | size="small" |
| | | icon="EditPen" |
| | | @click="edit(item)" |
| | | >ç¼è¾</el-button |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | <el-button |
| | | :disabled="item.status != 'æªæ§è¡'" |
| | | type="default" |
| | | type="danger" |
| | | size="small" |
| | | icon="Delete" |
| | | @click="remove(item)" |
| | | >ç§»é¤</el-button |
| | | > |
| | |
| | | @cancel="dialogVisible = false" |
| | | ></CompSubTaskEdit> |
| | | </el-dialog> |
| | | <SceneInspectFile v-model="downloadDialog" :value="downloadSceneList"></SceneInspectFile> |
| | | <SceneInspectFile |
| | | v-model="downloadDialog" |
| | | :value="downloadSceneList" |
| | | ></SceneInspectFile> |
| | | </template> |
| | | <script setup> |
| | | import { ref, computed, watch, onMounted, onUnmounted } from 'vue'; |
| | | import { ElMessageBox, ElNotification, ElMessage } from 'element-plus'; |
| | | import CompSubTaskEdit from './CompSubTaskEdit.vue'; |
| | | import SceneInspectFile from "@/views/fysp/scene/SceneInspectFile.vue"; |
| | | import SceneInspectFile from '@/views/fysp/scene/SceneInspectFile.vue'; |
| | | import subtaskApi from '@/api/fysp/subtaskApi'; |
| | | |
| | | const props = defineProps({ |
| | |
| | | const activeItem = ref(null); |
| | | const data = computed(() => props.modelValue); |
| | | const downloadDialog = ref(false); |
| | | const downloadSceneList = ref([]) |
| | | const downloadSceneList = ref([]); |
| | | |
| | | const emit = defineEmits(['submit', 'add', 'remove', 'update:modelValue']); |
| | | |
| | |
| | | }); |
| | | |
| | | function handleInspectFileDownload() { |
| | | downloadSceneList.value = data.value.map(v=>v.scenseid) |
| | | downloadDialog.value = true |
| | | downloadSceneList.value = data.value.map((v) => v.scenseid); |
| | | downloadDialog.value = true; |
| | | } |
| | | </script> |
| | |
| | | }); |
| | | function submit(v, success, fail) { |
| | | if (props.data.length == 0) { |
| | | // ElMessage({ |
| | | // message: 'æªéæ©çç®¡åºæ¯', |
| | | // type: 'warning' |
| | | // }); |
| | | fail('æªéæ©çç®¡åºæ¯'); |
| | | } else if (v.value.executor.length == 0) { |
| | | fail('æªéæ©æ§è¡äºº'); |
| | | } else { |
| | | success(); |
| | | // å°ä»»å¡æ§è¡äººæ ¼å¼åå¹¶ä¼ é |
| | |
| | | () => props.dayTask, |
| | | (nV, oV) => { |
| | | if (nV != oV) { |
| | | taskApi.fetchTaskById(nV.guid).then((res) => { |
| | | // æ ¹æ®æ¥ä»»å¡ï¼è·å对åºçæ»ä»»å¡ä¿¡æ¯ï¼åè·åæ§è¡äººåä¿¡æ¯ |
| | | taskApi.fetchTaskById(nV.tsGuid).then((res) => { |
| | | getExecutors(res); |
| | | }); |
| | | } |
| | |
| | | const scenes = computed(() => { |
| | | return props.plans |
| | | .filter((v) => { |
| | | if (!v.scene.longitude || !v.scene.latitude) { |
| | | return false; |
| | | } |
| | | // æç
§çç®¡ç¶æçé |
| | | if (supervisionStatus.value) { |
| | | switch (supervisionStatus.value.value) { |
| | |
| | | } else { |
| | | return true |
| | | } |
| | | // if (supervisionStatus.value) { |
| | | // supervisionStatus.value; |
| | | // } else { |
| | | // return true; |
| | | // } |
| | | }) |
| | | .map((p) => { |
| | | return p.scene; |