徐景良 2024-08-24 17:20:19 +08:00
commit 800d3a5209
34 changed files with 1241 additions and 416 deletions

View File

@ -435,8 +435,8 @@ export const getGeomData = (params) =>
// 影像管理
// 更新tiff影像
export const GeoTiffManagerUpdateGeoTiff = (params) =>
defHttp.post({ url: Api.GeoTiffManagerUpdateGeoTiff, params });
export const GeoTiffManagerUpdateGeoTiff = () =>
defHttp.post({ url: Api.GeoTiffManagerUpdateGeoTiff });
// 影像列表
export const GeoTiffManagerLoadPage = (params) =>
defHttp.get({ url: Api.GeoTiffManagerLoadPage, params });

View File

@ -3,18 +3,22 @@
</template>
<script setup lang="ts">
import { defineProps, ref, onMounted, onUnmounted } from "vue"
import { defineProps, ref, onMounted, onUnmounted, defineEmits } from "vue"
import { v4 as uuidv4 } from 'uuid';
import mapboxgl, { Map, } from 'mapbox-gl';
import { MapboxConfig, MapboxDefaultStyle } from '@/components/MapboxMaps/src/config.ts'
const props = defineProps(["width", "height"])
const emits = defineEmits(["getMap"])
const { width, height } = props
const mapId = `modal-map-${uuidv4()}`
let map: Map;
onMounted(() => {
mapboxgl.accessToken = MapboxConfig.ACCESS_TOKEN;
map = initMap();
map.on('load', () => {
emits("getMap",map)
})
})
const initMap = () => {
return new mapboxgl.Map({

View File

@ -1,29 +1,31 @@
<template>
<div class="show-map-div">
<div class="select-menu">
<div class="add-on-map" v-if="selectType !== 2"><a-checkbox v-model:checked="addOnMap"></a-checkbox></div>
<div class="add-on-map" v-if="selectType !== 2">
<a-checkbox v-model:checked="addOnMap" @change="(e) => addOnMapChange(e.target.checked)">叠加到地图</a-checkbox>
</div>
<a-radio-group v-model:value="selectType" button-style="solid" size="small">
<a-radio-button :value="0">专题图</a-radio-button>
<a-radio-button :value="1">截图</a-radio-button>
<a-radio-button :value="2">天地图</a-radio-button>
</a-radio-group>
</div>
<template v-if="selectType === 0">
<template v-if="selectType === 0 && !addOnMap">
<a-image
:width="470"
:height="470"
:src="showData.image"
:src="showData?.url"
/>
</template>
<template v-if="selectType === 1">
<template v-if="selectType === 1 && !addOnMap">
<a-image
:width="470"
:height="470"
:src="showData.screenshotImage"
/>
</template>
<template v-if="selectType === 2">
<ModalMap :width="'470px'" :height="'470px'"/>
<template v-if="selectType === 2 || addOnMap">
<ModalMap :width="'470px'" :height="'470px'" @getMap="getMap"/>
</template>
</div>
@ -31,31 +33,67 @@
<a-tab-pane key="1" tab="土地分类">
<ShowTableList
:columns="landClassificationColumns"
:data="props.data?.landClassify.list"
:data="landClassifyTable"
:title="'土地利用现状查询结果'"/>
</a-tab-pane>
<a-tab-pane key="2" tab="耕地占用">
<ShowTableList
:columns="landPlanningColumns"
:data="props.data?.plowLandOccupy.list"
:data="plowLandOccupyTable"
:title="'土地规划查询结果'"/>
</a-tab-pane>
</a-tabs>
</template>
<script setup lang="ts">
import { ref, defineProps, computed } from "vue"
import { ref, defineProps, computed, watch, onMounted } from "vue"
import ShowTableList from '@/views/dashboard/test/components/ShowTableList/index.vue'
import ModalMap from './ModalMap/index.vue'
const props = defineProps(['data'])
let map
onMounted(() => {
if(props.data){
type.value = props.data[0].name
}
})
const type = ref('1')
const landClassifyTable = computed(() => {
let data
props.data?.forEach(item => {
if(item.name == '土地分类'){
data = {...item}
}
})
return data && data.list
})
const plowLandOccupyTable = computed(() => {
let data
props.data?.forEach(item => {
if(item.name == '耕地分类'){
data = {...item}
}
})
return data && data.list
})
const showData = computed(() => {
let data
switch(type.value){
case '1':
return props.data?.landClassify || {image:'',screenshotImage:'',list:[]}
props.data?.forEach(item => {
if(item.name == '土地分类'){
data = {...item}
}
})
return data
case '2':
return props.data?.plowLandOccupy || {image:'',screenshotImage:'',list:[]}
props.data?.forEach(item => {
if(item.name == '耕地分类'){
data = {...item}
}
})
return data
}
})
const addOnMap = ref(false)
@ -63,8 +101,8 @@ const selectType = ref(0)
const landClassificationColumns = [
{
title: '地类名称',
dataIndex: 'landName',
key: 'landName',
dataIndex: 'type',
key: 'type',
sorter:(a,b) => a.landName - b.landName,
sortDirections: ['descend', 'ascend'],
},
@ -99,6 +137,62 @@ const landPlanningColumns = [
sortDirections: ['descend', 'ascend'],
},
]
const getMap = (value) => {
map = value
}
const addOnMapChange = (value) => {
setTimeout(() => {
let url= ''
let fourpoint = ''
if(value){
let data = {}
if(type.value == '1'){
props.data.forEach(item => {
if(item.name == '土地分类'){
data = {...item}
}
})
}else if(type.value == '2'){
props.data.forEach(item => {
if(item.name == '耕地分类'){
data = {...item}
}
})
}
if(selectType.value == 0){
url = data.url
fourpoint = JSON.parse(`[${data.fourpoint}]`)
}
}
map.addSource('radar', {
type: 'image',
url:url,
coordinates: fourpoint
});
map.addLayer({
id: 'radar-layer',
type: 'raster',
source: 'radar',
paint: {
'raster-fade-duration': 0
}
});
let x = 0
let y = 0
let length = fourpoint.length
for(let i = 0; i < fourpoint.length; i++){
x = x + fourpoint[i][0]
y = y + fourpoint[i][1]
}
x = x / length
y = y / length
map.flyTo({
center: [x,y],
zoom: 14,
});
},500)
}
</script>
<style lang="scss" scoped>

View File

@ -5,7 +5,7 @@
<template #footer>
<div class="footer-div">
<span style="margin-left: 35px">{{ item.specialText }}</span>
<span style="margin-right: 40px;">拍摄时间{{ item.time }}</span>
<span style="margin-right: 40px;">拍摄时间{{ item.shijian }}</span>
</div>
</template>
</ShowImage>

View File

@ -3,8 +3,8 @@
style="width: 100%;"
v-model:activeKey="activeKey"
>
<a-tab-pane key="1" tab="基础查询"><BasicQuery :data="props.info?.basicQuery"/></a-tab-pane>
<a-tab-pane key="2" tab="时序影像"><TimeImages :data="props.info?.timeImages"/> </a-tab-pane>
<a-tab-pane key="1" tab="基础查询"><BasicQuery :data="props.info?.result"/></a-tab-pane>
<a-tab-pane key="2" tab="时序影像"><TimeImages :data="props.info?.yingxiang"/> </a-tab-pane>
</a-tabs>
</template>

View File

@ -39,64 +39,8 @@ const changeCompare = () => {
onMounted(() => {
let id = useCloudQuery.getCloudQueryInfo.id
LoadCloudQueryById({id}).then(res => {
info.value = {
basicQuery:{
landClassify:{
image:'http://60.213.14.14:8060/geoserver/feixian/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fjpeg&TRANSPARENT=true&LAYERS=feixian%3Ayingxiang&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4527&STYLES=&WIDTH=1024&HEIGHT=1024&BBOX=39591762.54875996%2C3908085.3169043385%2C39592654.90645946%2C3909001.5344353705',
screenshotImage:'https://t0.tianditu.gov.cn/DataServer?T=img_w&x=216982&y=103419&l=18&tk=b6585bc41ee16251dbe6b1af64f375d9',
list:[
{landName: '乔木林地-0331',type: '限制建设区(030)',stats: '-',area: 3.05,},
{landName: '乔木林地-0332',type: '限制建设区(031)',stats: '-',area: 4.05,},
{landName: '乔木林地-0331',type: '建设区(030)',stats: '-',area: 3.05,},
{landName: '乔木林地-0332',type: '建设区(031)',stats: '-',area: 4.05,},
{landName: '乔木林地-0331',type: '限制(030)',stats: '-',area: 3.05,},
{landName: '乔木林地-0332',type: '限制(031)',stats: '-',area: 4.05,}
]
},
plowLandOccupy:{
image:'https://t0.tianditu.gov.cn/DataServer?T=img_w&x=217550&y=104260&l=18&tk=b6585bc41ee16251dbe6b1af64f375d9',
screenshotImage: 'https://t0.tianditu.gov.cn/DataServer?T=img_w&x=108774&y=52128&l=17&tk=b6585bc41ee16251dbe6b1af64f375d9',
list:[
{landName: '乔木林地-0331',type: '限制建设区(030)',stats: '-',area: 3.05,},
{landName: '乔木林地-0332',type: '限制建设区(031)',stats: '-',area: 4.05,},
{landName: '乔木林地-0331',type: '建设区(030)',stats: '-',area: 3.05,},
{landName: '乔木林地-0332',type: '建设区(031)',stats: '-',area: 4.05,},
{landName: '乔木林地-0331',type: '限制(030)',stats: '-',area: 3.05,},
{landName: '乔木林地-0332',type: '限制(031)',stats: '-',area: 4.05,}
]
},
},
timeImages:[
{
time: '20210111',
specialText: '卫星GF2',
specialUrl: 'https://gw.alipayobjects.com/zos/antfincdn/x43I27A55%26/photo-1438109491414-7198515b166b.webp',
screenshotText: '截图1',
screenshotUrl: 'https://gw.alipayobjects.com/zos/antfincdn/cV16ZqzMjW/photo-1473091540282-9b846e7965e3.webp',
},
{
time: '20210112',
specialText: '卫星GF3',
specialUrl: 'https://gw.alipayobjects.com/zos/antfincdn/x43I27A55%26/photo-1438109491414-7198515b166b.webp',
screenshotText: '截图2',
screenshotUrl: 'https://gw.alipayobjects.com/zos/antfincdn/cV16ZqzMjW/photo-1473091540282-9b846e7965e3.webp',
},
{
time: '20210113',
specialText: '卫星GF4',
specialUrl: 'https://gw.alipayobjects.com/zos/antfincdn/x43I27A55%26/photo-1438109491414-7198515b166b.webp',
screenshotText: '截图34',
screenshotUrl: 'https://gw.alipayobjects.com/zos/antfincdn/cV16ZqzMjW/photo-1473091540282-9b846e7965e3.webp',
},
{
time: '20210114',
specialText: '卫星GF5',
specialUrl: 'https://gw.alipayobjects.com/zos/antfincdn/x43I27A55%26/photo-1438109491414-7198515b166b.webp',
screenshotText: '截图4',
screenshotUrl: 'https://gw.alipayobjects.com/zos/antfincdn/cV16ZqzMjW/photo-1473091540282-9b846e7965e3.webp',
},
],
}
let data = JSON.parse(res.receiveContent)
info.value = data
})
})
</script>

View File

@ -31,6 +31,9 @@
<span class="delete-btn" @click="handlerPreviewFile(item.url)"
><CloudDownloadOutlined
/></span>
<span class="delete-btn" @click="openFile(item.url)" v-if="showIcon(item.url)"
><FolderOpenOutlined
/></span>
</div>
<Modal :open="previewOpen" :title="previewTitle" :footer="null" @cancel="handleCancel">
<img alt="" style="width: 100%" :src="previewImage" />
@ -45,6 +48,7 @@
InboxOutlined,
DeleteOutlined,
CloudDownloadOutlined,
FolderOpenOutlined,
} from '@ant-design/icons-vue';
import type { UploadFile, UploadProps } from 'ant-design-vue';
import { Modal, UploadDragger } from 'ant-design-vue';
@ -58,6 +62,7 @@
import { isImgTypeByName } from '../helper';
import { UploadResultStatus } from '@/components/Upload/src/types/typing';
import { fileUploadApi } from '@/api/sys/upload';
import axios from 'axios';
defineOptions({ name: 'ImageUpload' });
@ -129,7 +134,41 @@
});
},
);
const openFile = (url) => {
console.log(url)
if(url.indexOf('.pdf') !== -1){
axios({
method: 'get',
url: url,
responseType: 'blob',
headers: {
'Content-Disposition': 'inline',
}
})
.then(response => {
let blob = new Blob([response.data], {type: 'application/pdf'});
let pdfUrl = window.URL.createObjectURL(blob)
window.open(pdfUrl);
})
.catch(error => {
console.error(error);
});
}else{
window.open(url, '_blank');
}
}
const showIcon = (url) => {
if(
url.indexOf('.png') !== -1 ||
url.indexOf('.pdf') !== -1 ||
url.indexOf('.jpg') !== -1 ||
url.indexOf('.jpeg') !== -1
){
return true;
}
return false
}
function getBase64<T extends string | ArrayBuffer | null>(file: File) {
return new Promise<T>((resolve, reject) => {
const reader = new FileReader();

View File

@ -59,6 +59,7 @@
if (unref(getShowFullHeaderRef)) {
style.top = `${HEADER_HEIGHT}px`;
}
style.zIndex = 0;
return style;
});

View File

@ -43,8 +43,13 @@ export const mapStatusOptions = [
{ label: '待接收', value: '待接收' },
{ label: '待填报', value: '待填报' },
{ label: '待整改', value: '待整改' },
{ label: '已退回', value: '已退回' },
{ label: '市级驳回', value: '市级驳回' },
{ label: '县级驳回', value: '县级驳回' },
];
export const auditMapStatusOptions = [
{ label: '市级驳回', value: '市级驳回' },
{ label: '县级驳回', value: '县级驳回' },
]
// 标注类型
export const markTypeOptions = [
{ label: '在建', value: '在建' },

View File

@ -8,7 +8,7 @@
<a-image
:width="470"
:height="470"
:src="select === 0? specialUrl: screenshotUrl"
:src="select === 0? url: screenshotUrl"
/>
<div class="footer" v-if="haveFooter">
<slot name="footer" />
@ -19,7 +19,7 @@
import { ref, defineProps } from "vue"
const select = ref(0)
const props = defineProps(["data", "haveFooter"])
const { data:{ specialUrl, screenshotUrl }, haveFooter=false } = props
const { data:{ url, screenshotUrl }, haveFooter=false } = props
</script>
<style lang="scss" scoped>

View File

@ -79,6 +79,20 @@
</div>
</div>
<div style="display: flex;align-items: center;cursor: pointer;">
<a-popover placement="bottom">
<template #content>
<div style="display:flex;">
<div>当前状态</div>
<div>
<a-checkbox-group
v-model:value="params.nowStatus"
style="width: 100%"
:options="auditMapStatusOptions"></a-checkbox-group>
</div>
</div>
</template>
<img src="@/assets/images/tiankongdi/filt.png" class="img-box mr-r-20" />
</a-popover>
<img src="@/assets/images/tiankongdi/collect-active.png" class="img-box" @click="getCollectList" v-if="openCollect"/>
<img src="@/assets/images/tiankongdi/collect.png" class="img-box" @click="getCollectList" v-else/>
</div>
@ -90,7 +104,7 @@
class="data-list-item"
v-if="dataList.length > 0"
>
<div class="back-box" v-if="item.is_drawback == 1"></div>
<div class="back-box" v-if="showDrawBack(item)">{{ drawBackSpan(item) }}</div>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark" @click="locationFun(item)"/>
@ -200,8 +214,9 @@
import { message } from 'ant-design-vue';
import { useUserStore } from '@/store/modules/user.ts'
import { SearchOutlined, RollbackOutlined } from '@ant-design/icons-vue';
import { patchSourceOptions } from '@/utils/global'
import { patchSourceOptions, auditMapStatusOptions } from '@/utils/global'
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
@ -251,6 +266,7 @@
type: null,
sort: null,
order: null,
nowStatus: [],
});
const markTypeOptions = ref([
{ label: '合法', value: '合法' },
@ -268,8 +284,14 @@
}
async function getTaskList() {
console.log(params.value);
let requestData = {...params.value}
if(requestData.nowStatus.length > 0){
requestData.nowStatus = requestData.nowStatus.join(',')
}else{
requestData.nowStatus = null
}
emits('openLoading')
const data = await LoadTaskDetailList(params.value);
const data = await LoadTaskDetailList(requestData);
emits('closeLoading')
dataList.value = data.items;
total.value = data.total;

View File

@ -31,7 +31,17 @@
@change="(value) => mapListScreenChange(value, 'batch')"
/>
</div>
<div class="screen-item" style="margin-right: 18px">
<div class="screen-item" style="margin-right: 13px;margin-bottom: 12px">
<div class="screen-item-label">乡镇</div>
<a-select
allowClear
style="width:120px;"
v-model:value="infoScreenData.streetid"
:options="streetsAreaOptions"
@change="(value) => mapListScreenChange(value, 'streetid')"
/>
</div>
<div class="screen-item" style="margin-bottom: 12px;width:389px">
<a-input
allowClear
placeholder="请输入图斑编号"
@ -40,7 +50,7 @@
@change="(value) => mapListScreenChange(value.target.value, 'caseNo')"
/>
</div>
<div class="screen-item">
<div class="screen-item" style="flex: 1;justify-content: flex-end;">
<a-button class="item-button" style="background: #2B75E1;" type="primary" :icon="h(SearchOutlined)" @click="querysBtn"
>查询</a-button>
<a-button class="item-button img" type="primary" @click="changeArea">
@ -297,6 +307,7 @@
import { ref, onMounted, defineEmits, computed, h } from 'vue';
import { SearchOutlined, DownOutlined, SendOutlined } from '@ant-design/icons-vue';
import Icon from '@/components/Icon/Icon.vue';
import { getLoadStreet } from '@/api/tiankongdi/index';
import { LoadCaiKuangTaskList, GetCaseInfoById, CaseRecover } from '@/api/degraining/index';
import {
batchOptions,
@ -317,6 +328,7 @@ const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
const pageSize = ref(10);
const pageNo = ref(1);
const total = ref(0);
const streetsAreaOptions = ref<{ label: string; value: string}[]>([])
const mapStatusOptions = ref([
{
label: '正常',
@ -433,6 +445,15 @@ const openCollect = computed(() => {
});
const showInfoData = ref();
onMounted(() => {
getLoadStreet().then(res => {
console.log(res)
res.forEach(item => {
streetsAreaOptions.value.push({
label: item.Name,
value: item.Id,
})
})
})
getInfoList();
});
@ -634,7 +655,7 @@ function querysBtn(){
box-shadow: 2px 3px 3px 1px rgba(13, 13, 13, 0.05);
}
.item-input {
width: 223px;
width: 389px;
font-family: Alibaba PuHuiTi;
font-weight: 500;
font-size: 17px;

View File

@ -2,6 +2,7 @@
<div class="detail-container">
<div class="map-container">
<MapboxMap
:imageList="imageList"
:geomsList="geomsList"
:mapConfig="mapConfig"
@handlerDrawComplete="handlerDrawComplete"
@ -105,43 +106,70 @@
getLabel('weifaleixing', weifaleixing)
}}</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 1" label="附件">
<template v-for="(item, itemIndex) in fujianList" :key="itemIndex">
<div v-if="item" style="margin-top: 10px">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in fujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 0" label="附件">
<template v-for="(item, itemIndex) in hefafujianList" :key="itemIndex">
<div v-if="item" style="margin-top: 10px">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in hefafujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer,}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 2" label="实际用途">{{
getLabel('qita_use_to', qita_use_to)
}}</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 2" label="附件">
<template v-for="(item, itemIndex) in qitafujianList" :key="itemIndex">
<div v-if="item" style="margin-top: 10px">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in qitafujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item label="判定依据说明">{{
pandingyijushuoming
@ -151,18 +179,20 @@
<a-image-preview-group
:preview="{
getContainer:getContainer,
onVisibleChange:handlerImageChange
}"
>
<template v-for="(imageItem, imageIndex) in anjianzhaopianList" :key="imageIndex">
<a-image
v-if="imageItem"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
<a-image
v-if="imageItem"
@click="handlerPreviewImage(imageIndex,imageItem)"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
</template>
</a-image-preview-group>
</div>
@ -189,16 +219,25 @@
getLabel('measure_name', measure_name)
}}</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 0" label="附件">
<template v-for="(item, itemIndex) in yanshoubiaoList" :key="itemIndex">
<div v-if="item">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in yanshoubiaoList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer,}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 0" label="照片">
<div class="image-div">
@ -225,17 +264,25 @@
</div>
</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 1" label="附件">
<template v-for="(item, itemIndex) in zhenggaifujianList" :key="itemIndex">
<div v-if="item">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<!-- {{ zhenggaifujian }} -->
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in zhenggaifujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 1" label="照片">
<div class="image-div">
@ -338,15 +385,18 @@
</template>
<script setup lang="ts">
import { defineProps, ref, computed } from 'vue';
import { defineProps, ref, computed,onBeforeMount } from 'vue';
import MapboxMap from '@/components/MapboxMaps/MapComponent.vue';
import { getConfig } from '@/api/sys/layerManagement';
import { getGeom } from '@/api/sys/layerManagement';
import {getLoadCaseImgList} from '@/api/tiankongdi'
import { useMessage } from '@/hooks/web/useMessage';
import axios from 'axios';
const { createMessage } = useMessage();
import Icon from '@/components/Icon/Icon.vue';
import { getAppEnvConfig } from '@/utils/env';
const { VITE_GLOB_INFO_IMAGE_URL } = getAppEnvConfig();
import {
mapTypeOptions,
illegalTypeOptions,
@ -369,7 +419,7 @@
const props = defineProps(['showInfoData']);
const activeKey = ref('1');
console.log('showInfoData123', props.showInfoData);
const geomsList = ref();
const {
id,
@ -478,7 +528,77 @@
xchczhaopian,
synchronoustime,
} = props.showInfoData;
const imageList = ref([])
async function getCaseImgList(){
imageList.value = await getLoadCaseImgList({caseid:id});
//
let zhengshiImageList = [];
imageList.value?.forEach((item,index)=>{
let obj = anjianzhaopianList.value?.find((it,idx)=>{
return item.filePath == it;
})
if(obj){
zhengshiImageList.push(imageList.value[index]);
}
})
// console.log("imageList",imageList.value);
// console.log("anjianzhaopianList",anjianzhaopianList.value);
// console.log("zhengshiImageList",zhengshiImageList);
MapboxComponent.value.handlerLoadPictureAzimuth(zhengshiImageList);
}
function handlerPreviewImage(index,url){
const regex = /([^/\\]+)(?=\.[^/\\]*$|$)/;
const match = url.match(regex);
if (match) {
MapboxComponent.value.handlerCurrentImageChange(match[1]);
}
}
const isInitImageLisener = ref<Boolean>(false);
//
function handlerImageChange(e):void{
if(e && !isInitImageLisener.value){
setTimeout(function(){
const targetNode = document.getElementsByClassName('ant-image-preview-img');
//
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'attributes') {
if(targetNode[0].getAttribute(mutation.attributeName).match("http")){
handlerPreviewImage(0,targetNode[0].getAttribute(mutation.attributeName))
}
}
}
});
//
const config = { attributes: true };
//
observer.observe(targetNode[0], config);
isInitImageLisener.value = true;
},250)
}
}
onBeforeMount(()=>{
})
const anjianzhaopianList = computed(() => {
getCaseImgList();
return anjianzhaopian ? anjianzhaopian.split(',') : [];
});
const casepicList = computed(() => {
@ -542,7 +662,7 @@
});
return label;
};
function changeTask() {
async function changeTask() {
let getGeomPrams = {
TableName: 'drone_shp_data ',
FieldName: 'gid',
@ -552,6 +672,8 @@
key: null,
};
if (props.showInfoData.geomid) {
getGeom(getGeomPrams).then((res) => {
let geoms = [];
if (res) {
@ -577,7 +699,27 @@
}
}
const downLoadFile = (url) => {
window.open(`${VITE_GLOB_INFO_IMAGE_URL}/${url}`, 'mozillaTab');
if(url.indexOf('.pdf') !== -1){
axios({
method: 'get',
url: `${VITE_GLOB_INFO_IMAGE_URL}/${url}`,
responseType: 'blob',
headers: {
'Content-Disposition': 'inline',
}
})
.then(response => {
let blob = new Blob([response.data], {type: 'application/pdf'});
let url = window.URL.createObjectURL(blob)
window.open(url);
})
.catch(error => {
console.error(error);
});
}else{
window.open(`${VITE_GLOB_INFO_IMAGE_URL}/${url}`, '_blank');
}
};
const getContainer = () => {
return document.getElementById('info-container');
@ -596,6 +738,13 @@
return Number(resultString).toFixed(2);
}
};
const showImage = (url) => {
if(url.indexOf('.png') !== -1 || url.indexOf('.jpg') !== -1 || url.indexOf('.jpeg') !== -1 ){
return true
}else{
return false
}
}
</script>
<style lang="scss" scoped>

View File

@ -147,7 +147,7 @@
</div>
<div class="data-list-div" style="padding-top: 1px;">
<div v-for="(item, index) in props.infoDataList" :key="index" class="data-list-item">
<div class="back-box" v-if="item.isdrawback == 1"></div>
<div class="back-box" v-if="showDrawBack(item)">{{ drawBackSpan(item) }}</div>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark" style="cursor:pointer;" @click="locationFun(item)"/>
@ -253,6 +253,7 @@ import { flowStore } from '@/store/modules/flow';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { Audit } from '@/views/demo/workflow/task/process/page';
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
const flowWfDataStore = flowStore();
const emits = defineEmits([

View File

@ -79,6 +79,20 @@
</div>
</div>
<div class="collect-div">
<a-popover placement="bottom">
<template #content>
<div style="display:flex;">
<div>当前状态</div>
<div>
<a-checkbox-group
v-model:value="params.nowStatus"
style="width: 100%"
:options="auditMapStatusOptions"></a-checkbox-group>
</div>
</div>
</template>
<img src="@/assets/images/tiankongdi/filt.png" class="img-box mr-r-20" />
</a-popover>
<img src="@/assets/images/tiankongdi/collect-active.png" class="img-box" @click="getCollectList" v-if="openCollect"/>
<img src="@/assets/images/tiankongdi/collect.png" class="img-box" @click="getCollectList" v-else/>
</div>
@ -90,7 +104,7 @@
class="data-list-item"
v-if="dataList.length > 0"
>
<div class="back-box" v-if="item.is_drawback == 1"></div>
<div class="back-box" v-if="showDrawBack(item)">{{ drawBackSpan(item) }}</div>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark" @click="locationFun(item)"/>
@ -201,8 +215,9 @@
import { message } from 'ant-design-vue';
import { useUserStore } from '@/store/modules/user.ts'
import { SearchOutlined, RollbackOutlined } from '@ant-design/icons-vue';
import { patchSourceOptions } from '@/utils/global'
import { patchSourceOptions, auditMapStatusOptions } from '@/utils/global'
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
@ -252,6 +267,7 @@
type: null,
sort: null,
order: null,
nowStatus: [],
});
const markTypeOptions = ref([
{ label: '拆除复耕', value: '拆除复耕' },
@ -268,8 +284,14 @@
}
async function getTaskList() {
console.log(params.value);
let requestData = {...params.value}
if(requestData.nowStatus.length > 0){
requestData.nowStatus = requestData.nowStatus.join(',')
}else{
requestData.nowStatus = null
}
emits('openLoading')
const data = await LoadTaskIllegalDetailList(params.value);
const data = await LoadTaskIllegalDetailList(requestData);
emits('closeLoading')
dataList.value = data.items;
total.value = data.total;

View File

@ -79,6 +79,20 @@
</div>
</div>
<div style="display: flex;align-items: center;cursor: pointer;">
<a-popover placement="bottom">
<template #content>
<div style="display:flex;">
<div>当前状态</div>
<div>
<a-checkbox-group
v-model:value="params.nowStatus"
style="width: 100%"
:options="auditMapStatusOptions"></a-checkbox-group>
</div>
</div>
</template>
<img src="@/assets/images/tiankongdi/filt.png" class="img-box mr-r-20" />
</a-popover>
<img src="@/assets/images/tiankongdi/collect-active.png" class="img-box" @click="getCollectList" v-if="openCollect"/>
<img src="@/assets/images/tiankongdi/collect.png" class="img-box" @click="getCollectList" v-else/>
</div>
@ -90,7 +104,7 @@
class="data-list-item"
v-if="dataList.length > 0"
>
<div class="back-box" v-if="item.is_drawback == 1"></div>
<div class="back-box" v-if="showDrawBack(item)">{{ drawBackSpan(item) }}</div>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark" @click="locationFun(item)"/>
@ -200,8 +214,9 @@
import { message } from 'ant-design-vue';
import { useUserStore } from '@/store/modules/user.ts'
import { SearchOutlined, RollbackOutlined } from '@ant-design/icons-vue';
import { patchSourceOptions } from '@/utils/global'
import { patchSourceOptions, auditMapStatusOptions } from '@/utils/global'
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
@ -251,6 +266,7 @@
type: null,
sort: null,
order: null,
nowStatus: [],
});
const markTypeOptions = ref([
{ label: '合法', value: '合法' },
@ -268,8 +284,14 @@
}
async function getTaskList() {
console.log(params.value);
let requestData = {...params.value}
if(requestData.nowStatus.length > 0){
requestData.nowStatus = requestData.nowStatus.join(',')
}else{
requestData.nowStatus = null
}
emits('openLoading')
const data = await LoadTaskDetailList(params.value);
const data = await LoadTaskDetailList(requestData);
emits('closeLoading')
dataList.value = data.items;
total.value = data.total;

View File

@ -2,6 +2,7 @@
<div class="detail-container">
<div class="map-container">
<MapboxMap
:imageList="imageList"
:geomsList="geomsList"
:mapConfig="mapConfig"
@handlerDrawComplete="handlerDrawComplete"
@ -51,17 +52,23 @@
<a-descriptions-item label="下发时间">{{ synchronoustime }}</a-descriptions-item>
<a-descriptions-item label="图斑照片">
<div class="image-div">
<template v-for="(imageItem, imageIndex) in casepicList" :key="imageIndex">
<a-image
v-if="imageItem"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
</template>
<a-image-preview-group
:preview="{
getContainer:getContainer,
}"
>
<template v-for="(imageItem, imageIndex) in casepicList" :key="imageIndex">
<a-image
v-if="imageItem"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
</template>
</a-image-preview-group>
</div>
</a-descriptions-item>
<a-descriptions-item label="接收人">{{ jieshou_people }}</a-descriptions-item>
@ -99,60 +106,95 @@
getLabel('weifaleixing', weifaleixing)
}}</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 1" label="附件">
<template v-for="(item, itemIndex) in fujianList" :key="itemIndex">
<div v-if="item" style="margin-top: 10px">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in fujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 0" label="附件">
<template v-for="(item, itemIndex) in hefafujianList" :key="itemIndex">
<div v-if="item" style="margin-top: 10px">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in hefafujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer,}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 2" label="实际用途">{{
getLabel('qita_use_to', qita_use_to)
}}</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 2" label="附件">
<template v-for="(item, itemIndex) in qitafujianList" :key="itemIndex">
<div v-if="item" style="margin-top: 10px">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in qitafujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item label="判定依据说明">{{
pandingyijushuoming
}}</a-descriptions-item>
<a-descriptions-item label="照片">
<div class="image-div">
<template v-for="(imageItem, imageIndex) in anjianzhaopianList" :key="imageIndex">
<a-image
v-if="imageItem"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
</template>
<a-image-preview-group
:preview="{
getContainer:getContainer,
onVisibleChange:handlerImageChange
}"
>
<template v-for="(imageItem, imageIndex) in anjianzhaopianList" :key="imageIndex">
<a-image
v-if="imageItem"
@click="handlerPreviewImage(imageIndex,imageItem)"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
</template>
</a-image-preview-group>
</div>
</a-descriptions-item>
<a-descriptions-item label="填报人">{{ examiner_name }}</a-descriptions-item>
@ -177,61 +219,90 @@
getLabel('measure_name', measure_name)
}}</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 0" label="附件">
<template v-for="(item, itemIndex) in yanshoubiaoList" :key="itemIndex">
<div v-if="item">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in yanshoubiaoList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer,}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 0" label="照片">
<div class="image-div">
<template
v-for="(imageItem, imageIndex) in chaichufugenghoupicList"
:key="imageIndex"
>
<a-image
v-if="imageItem"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
</template>
<a-image-preview-group
:preview="{
getContainer:getContainer,
}"
>
<template
v-for="(imageItem, imageIndex) in chaichufugenghoupicList"
:key="imageIndex"
>
<a-image
v-if="imageItem"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
</template>
</a-image-preview-group>
</div>
</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 1" label="附件">
<template v-for="(item, itemIndex) in zhenggaifujianList" :key="itemIndex">
<div v-if="item">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<!-- {{ zhenggaifujian }} -->
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in zhenggaifujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 1" label="照片">
<div class="image-div">
<template v-for="(imageItem, imageIndex) in bubanzhaopianList" :key="imageIndex">
<a-image
v-if="imageItem"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
</template>
<a-image-preview-group
:preview="{
getContainer:getContainer,
}"
>
<template v-for="(imageItem, imageIndex) in bubanzhaopianList" :key="imageIndex">
<a-image
v-if="imageItem"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
></a-image>
</template>
</a-image-preview-group>
</div>
</a-descriptions-item>
<a-descriptions-item label="办理人">{{ transactor_name }}</a-descriptions-item>
@ -314,15 +385,18 @@
</template>
<script setup lang="ts">
import { defineProps, ref, computed } from 'vue';
import { defineProps, ref, computed,onBeforeMount } from 'vue';
import MapboxMap from '@/components/MapboxMaps/MapComponent.vue';
import { getConfig } from '@/api/sys/layerManagement';
import { getGeom } from '@/api/sys/layerManagement';
import {getLoadCaseImgList} from '@/api/tiankongdi'
import { useMessage } from '@/hooks/web/useMessage';
import axios from 'axios';
const { createMessage } = useMessage();
import Icon from '@/components/Icon/Icon.vue';
import { getAppEnvConfig } from '@/utils/env';
const { VITE_GLOB_INFO_IMAGE_URL } = getAppEnvConfig();
import {
mapTypeOptions,
illegalTypeOptions,
@ -345,7 +419,7 @@
const props = defineProps(['showInfoData']);
const activeKey = ref('1');
console.log('showInfoData123', props.showInfoData);
const geomsList = ref();
const {
id,
@ -454,7 +528,77 @@
xchczhaopian,
synchronoustime,
} = props.showInfoData;
const imageList = ref([])
async function getCaseImgList(){
imageList.value = await getLoadCaseImgList({caseid:id});
//
let zhengshiImageList = [];
imageList.value?.forEach((item,index)=>{
let obj = anjianzhaopianList.value?.find((it,idx)=>{
return item.filePath == it;
})
if(obj){
zhengshiImageList.push(imageList.value[index]);
}
})
// console.log("imageList",imageList.value);
// console.log("anjianzhaopianList",anjianzhaopianList.value);
// console.log("zhengshiImageList",zhengshiImageList);
MapboxComponent.value.handlerLoadPictureAzimuth(zhengshiImageList);
}
function handlerPreviewImage(index,url){
const regex = /([^/\\]+)(?=\.[^/\\]*$|$)/;
const match = url.match(regex);
if (match) {
MapboxComponent.value.handlerCurrentImageChange(match[1]);
}
}
const isInitImageLisener = ref<Boolean>(false);
//
function handlerImageChange(e):void{
if(e && !isInitImageLisener.value){
setTimeout(function(){
const targetNode = document.getElementsByClassName('ant-image-preview-img');
//
const observer = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (mutation.type === 'attributes') {
if(targetNode[0].getAttribute(mutation.attributeName).match("http")){
handlerPreviewImage(0,targetNode[0].getAttribute(mutation.attributeName))
}
}
}
});
//
const config = { attributes: true };
//
observer.observe(targetNode[0], config);
isInitImageLisener.value = true;
},250)
}
}
onBeforeMount(()=>{
})
const anjianzhaopianList = computed(() => {
getCaseImgList();
return anjianzhaopian ? anjianzhaopian.split(',') : [];
});
const casepicList = computed(() => {
@ -518,7 +662,7 @@
});
return label;
};
function changeTask() {
async function changeTask() {
let getGeomPrams = {
TableName: 'drone_shp_data ',
FieldName: 'gid',
@ -528,6 +672,8 @@
key: null,
};
if (props.showInfoData.geomid) {
getGeom(getGeomPrams).then((res) => {
let geoms = [];
if (res) {
@ -553,7 +699,27 @@
}
}
const downLoadFile = (url) => {
window.open(`${VITE_GLOB_INFO_IMAGE_URL}/${url}`, 'mozillaTab');
if(url.indexOf('.pdf') !== -1){
axios({
method: 'get',
url: `${VITE_GLOB_INFO_IMAGE_URL}/${url}`,
responseType: 'blob',
headers: {
'Content-Disposition': 'inline',
}
})
.then(response => {
let blob = new Blob([response.data], {type: 'application/pdf'});
let url = window.URL.createObjectURL(blob)
window.open(url);
})
.catch(error => {
console.error(error);
});
}else{
window.open(`${VITE_GLOB_INFO_IMAGE_URL}/${url}`, '_blank');
}
};
const getContainer = () => {
return document.getElementById('info-container');
@ -572,18 +738,26 @@
return Number(resultString).toFixed(2);
}
};
const showImage = (url) => {
if(url.indexOf('.png') !== -1 || url.indexOf('.jpg') !== -1 || url.indexOf('.jpeg') !== -1 ){
return true
}else{
return false
}
}
</script>
<style lang="scss" scoped>
.image-div {
min-width: 340px;
max-height: 200px;
max-height: 220px;
overflow: auto;
}
.detail-container {
width: 100vw;
height: calc(100vh - 120px);
display: flex;
padding: 0px 20px;
}
.detail-container::after {
content: '';
@ -594,10 +768,20 @@
}
.map-container {
float: left;
width: 50vw;
width: 45vw;
height: calc(100vh - 100px);
margin-right: 20px;
}
:deep(.ant-image){
margin-right: 10px;
margin-bottom: 10px;
}
:deep(.ant-image-preview-switch-left){
position: absolute;
}
:deep(.ant-image-preview-switch-right){
position: absolute;
}
.info-container {
// float: left;
position: relative;
@ -613,7 +797,7 @@
position: absolute;
.ant-image-preview-operations {
position: absolute;
bottom: 0;
top: 0;
width: 100%;
.ant-image-preview-operations-operation{
// flex:1;

View File

@ -147,7 +147,7 @@
</div>
<div class="data-list-div" style="padding-top: 1px;">
<div v-for="(item, index) in props.infoDataList" :key="index" class="data-list-item">
<div class="back-box" v-if="item.isdrawback == 1"></div>
<div class="back-box" v-if="showDrawBack(item)">{{ drawBackSpan(item) }}</div>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark" style="cursor:pointer;" @click="locationFun(item)"/>
@ -253,6 +253,7 @@ import { flowStore } from '@/store/modules/flow';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { Audit } from '@/views/demo/workflow/task/process/page';
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
const flowWfDataStore = flowStore();
const emits = defineEmits([

View File

@ -79,6 +79,20 @@
</div>
</div>
<div class="collect-div">
<a-popover placement="bottom">
<template #content>
<div style="display:flex;">
<div>当前状态</div>
<div>
<a-checkbox-group
v-model:value="params.nowStatus"
style="width: 100%"
:options="auditMapStatusOptions"></a-checkbox-group>
</div>
</div>
</template>
<img src="@/assets/images/tiankongdi/filt.png" class="img-box mr-r-20" />
</a-popover>
<img src="@/assets/images/tiankongdi/collect-active.png" class="img-box" @click="getCollectList" v-if="openCollect"/>
<img src="@/assets/images/tiankongdi/collect.png" class="img-box" @click="getCollectList" v-else/>
</div>
@ -90,7 +104,7 @@
class="data-list-item"
v-if="dataList.length > 0"
>
<div class="back-box" v-if="item.is_drawback == 1"></div>
<div class="back-box" v-if="showDrawBack(item)">{{ drawBackSpan(item) }}</div>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark" @click="locationFun(item)"/>
@ -201,8 +215,9 @@
import { message } from 'ant-design-vue';
import { useUserStore } from '@/store/modules/user.ts'
import { SearchOutlined, RollbackOutlined } from '@ant-design/icons-vue';
import { patchSourceOptions } from '@/utils/global'
import { patchSourceOptions, auditMapStatusOptions } from '@/utils/global'
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
@ -252,6 +267,7 @@
type: null,
sort: null,
order: null,
nowStatus: [],
});
const markTypeOptions = ref([
{ label: '拆除复耕', value: '拆除复耕' },
@ -268,8 +284,14 @@
}
async function getTaskList() {
console.log(params.value);
let requestData = {...params.value}
if(requestData.nowStatus.length > 0){
requestData.nowStatus = requestData.nowStatus.join(',')
}else{
requestData.nowStatus = null
}
emits('openLoading')
const data = await LoadTaskIllegalDetailList(params.value);
const data = await LoadTaskIllegalDetailList(requestData);
emits('closeLoading')
dataList.value = data.items;
total.value = data.total;

View File

@ -79,6 +79,20 @@
</div>
</div>
<div class="collect-div">
<a-popover placement="bottom">
<template #content>
<div style="display:flex;">
<div>当前状态</div>
<div>
<a-checkbox-group
v-model:value="params.nowStatus"
style="width: 100%"
:options="auditMapStatusOptions"></a-checkbox-group>
</div>
</div>
</template>
<img src="@/assets/images/tiankongdi/filt.png" class="img-box mr-r-20" />
</a-popover>
<img src="@/assets/images/tiankongdi/collect-active.png" class="img-box" @click="getCollectList" v-if="openCollect"/>
<img src="@/assets/images/tiankongdi/collect.png" class="img-box" @click="getCollectList" v-else/>
</div>
@ -90,7 +104,7 @@
class="data-list-item"
v-if="dataList.length > 0"
>
<div class="back-box" v-if="item.is_drawback == 1"></div>
<div class="back-box" v-if="showDrawBack(item)">{{ drawBackSpan(item) }}</div>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark" @click="locationFun(item)"/>
@ -201,8 +215,9 @@
import { message } from 'ant-design-vue';
import { useUserStore } from '@/store/modules/user.ts'
import { SearchOutlined, RollbackOutlined } from '@ant-design/icons-vue';
import { patchSourceOptions } from '@/utils/global'
import { patchSourceOptions, auditMapStatusOptions } from '@/utils/global'
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
@ -252,6 +267,7 @@
type: null,
sort: null,
order: null,
nowStatus: [],
});
const markTypeOptions = ref([
{ label: '拆除复耕', value: '拆除复耕' },
@ -268,8 +284,14 @@
}
async function getTaskList() {
console.log(params.value);
let requestData = {...params.value}
if(requestData.nowStatus.length > 0){
requestData.nowStatus = requestData.nowStatus.join(',')
}else{
requestData.nowStatus = null
}
emits('openLoading')
const data = await getLoadTaskIllegalDetailList(params.value);
const data = await getLoadTaskIllegalDetailList(requestData);
emits('closeLoading')
dataList.value = data.items;
total.value = data.total;

View File

@ -15,6 +15,7 @@
</template>
<script lang="ts" setup>
import { ref, watch, onMounted } from 'vue';
// vben
import { useMessage } from '@/hooks/web/useMessage';
import { BasicTable, useTable } from '@/components/Table';
@ -30,17 +31,16 @@
//
const [registerTable, { reload, getSelectRows }] = useTable({
title: '影像管理',
api: GeoTiffManagerLoadPage,
columns: columns,
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
showIndexColumn: false,
rowSelection: {
type: 'radio',
},
showIndexColumn: true,
useSearchForm: true,
ellipsis: false,
bordered: true,
showTableSetting: true,
handleSearchInfoFn(info) {
@ -51,12 +51,18 @@
// tiff
const updateGeoTiff = () => {
GeoTiffManagerUpdateGeoTiff({})
GeoTiffManagerUpdateGeoTiff()
.then((res) => {
if (res) {
reload();
}
})
.catch((error) => {});
.catch((error) => {
console.log(error);
});
};
onMounted(() => {
reload();
});
</script>

View File

@ -19,7 +19,8 @@ export const columns = [
{
title: 'accessUrl',
dataIndex: 'accessUrl',
width: 100,
ifShow: false,
width: 300,
},
{
title: 'shpPath',
@ -46,7 +47,7 @@ export const columns = [
export const searchFormSchema = [
{
field: 'key',
label: '关键字',
label: '数据表名',
component: 'Input',
colProps: { span: 8 },
},

View File

@ -1,10 +1,10 @@
<template>
<a-tabs v-model:activeKey="activeKey" tabPosition="left">
<a-tabs v-model:activeKey="activeKey" tabPosition="left" :centered="true" @change="changeTabs">
<a-tab-pane key="1" tab="图层管理">
<GeoserverManagement />
<GeoserverManagement ref="GeoserverManagementRef" />
</a-tab-pane>
<a-tab-pane key="2" tab="影像管理">
<GeoTiffManager />
<GeoTiffManager ref="GeoTiffManagerRef" />
</a-tab-pane>
<a-tab-pane key="3" tab="航飞图片"> 航飞图片 </a-tab-pane>
</a-tabs>
@ -12,9 +12,25 @@
<script setup lang="ts">
import { ref } from 'vue';
//
import GeoTiffManager from './GeoTiffManager/index.vue';
import GeoserverManagement from '@/views/demo/system/geoservermanagement/index.vue';
import GeoTiffManager from './GeoTiffManager/index.vue';
const activeKey = ref('1');
//
const GeoserverManagementRef = ref();
//
const GeoTiffManagerRef = ref();
//
function changeTabs(activeKey) {
console.log(activeKey);
if (activeKey == 1) {
//
} else if (activeKey == 2) {
//
} else if (activeKey == 3) {
//
}
}
</script>
<style lang="scss" scoped></style>

View File

@ -1,7 +1,7 @@
<template>
<div class="categories-modal-container">
<a-form
ref="formRef"
ref="modalFormRef"
:model="props.modalData.data"
:rules="props.modalData.type.indexOf('tree') > -1 ? treeRules : tableRules"
labelAlign="right"
@ -25,9 +25,9 @@
<a-form-item label="名称" name="name">
<a-input v-model:value="props.modalData.data.name" />
</a-form-item>
<a-form-item label="云查询分类" name="overlay">
<a-form-item label="云查询分类" name="code">
<a-select
v-model:value="props.modalData.data.overlay"
v-model:value="props.modalData.data.code"
:options="props.showTree"
:fieldNames="{ label: 'itemName', value: 'itemValue' }"
/>
@ -49,18 +49,27 @@
/>
</a-form-item>
<a-form-item label="叠加图层" name="overlayList">
<a-select v-model:value="props.modalData.data.overlayList" mode="multiple">
<a-select-option value="1" checked>天地图</a-select-option>
<a-select-option value="2">图层2</a-select-option>
<a-select-option value="3">图层3</a-select-option>
<a-select-option value="4">图层4</a-select-option>
</a-select>
<a-select
v-model:value="props.modalData.data.overlayList"
mode="multiple"
allowClear
:options="orverlayListOptioins"
:fieldNames="{ label: 'serverName', value: 'id' }"
/>
</a-form-item>
<a-form-item label="是否分类" name="isClass">
<a-switch
v-model:checked="props.modalData.data.isClass"
checked-children="是"
un-checked-children="否"
@change="
if (!props.modalData.data.isClass) {
props.modalData.data.classField = undefined;
props.modalData.data.classField = '';
props.modalData.data.className = undefined;
props.modalData.data.className = '';
}
"
/>
</a-form-item>
<a-form-item label="分类字段" name="classField" v-if="props.modalData.data.isClass">
@ -70,7 +79,7 @@
placeholder="请先选择图层"
:options="classFieldOptioins"
:fieldNames="{ label: 'column_name', value: 'column_name' }"
:disabled="classFieldOptioins.length == 0"
:disabled="props.modalData.data.layer == undefined"
@change="classFieldChange"
/>
</a-form-item>
@ -88,7 +97,7 @@
placeholder="请先选择图层"
:options="classFieldOptioins"
:fieldNames="{ label: 'column_name', value: 'column_name' }"
:disabled="props.modalData.data.classField == undefined"
:disabled="props.modalData.data.layer == undefined"
/>
</a-form-item>
<a-form-item label="是否合计" name="isSum">
@ -108,20 +117,26 @@
</template>
<script setup lang="ts">
import { defineProps, defineEmits, ref, onMounted } from 'vue';
import { defineProps, defineEmits, ref, watch } from 'vue';
import { ShpGeoLayerLoadPage } from '@/api/demo/system';
import { GetTableAndViewColumnList } from '@/api/demo/formScheme';
const props = defineProps(['modalData', 'showTree']);
const props = defineProps(['modalData', 'showTree', 'layerOptioins', 'orverlayListOptioins']);
const emit = defineEmits(['closeModal', 'submit']);
const formRef = ref();
//
const layerOptioins: any = ref(props.layerOptioins);
//
const orverlayListOptioins: any = ref(props.orverlayListOptioins);
const modalFormRef = ref();
const treeRules = {
itemName: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
itemValue: [{ required: true, message: '类型不能为空', trigger: 'blur' }],
};
const tableRules = {
name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
overlay: [{ required: true, message: '查询分类不能为空', trigger: 'blur' }],
code: [{ required: true, message: '查询分类不能为空', trigger: 'blur' }],
layer: [{ required: true, message: '图层不能为空', trigger: 'blur' }],
tableName: [{ required: true, message: '数据表不能为空', trigger: 'blur' }],
overlayList: [{ required: true, message: '叠加图层不能为空', trigger: 'blur' }],
@ -129,8 +144,20 @@
className: [{ required: true, message: '分类名称不能为空', trigger: 'blur' }],
areaField: [{ required: true, message: '选择面积计算字段不能为空', trigger: 'blur' }],
};
watch(
() => props.modalData.data.tableName,
(newVal) => {
getClassFieldOptioins(newVal);
},
{
immediate: true,
deep: true,
},
);
const submit = () => {
formRef.value
modalFormRef.value
.validate()
.then(() => {
emit('submit');
@ -139,23 +166,19 @@
console.log('error', error);
});
};
//
const closeModal = () => {
emit('closeModal');
clearModalData();
clearModal();
};
const clearModalData = () => {
formRef.value.resetFields();
//
const clearModal = () => {
modalFormRef.value.clearValidate();
classFieldOptioins.value = [];
};
//
const layerOptioins: any = ref([]);
//
const classFieldOptioins: any = ref([]);
function getLayerOptions() {
ShpGeoLayerLoadPage({}).then((res) => {
layerOptioins.value = res.items;
});
}
//
function layerChange(value, option) {
// console.log(value);
@ -165,6 +188,7 @@
//
props.modalData.data.classField = undefined;
props.modalData.data.className = undefined;
props.modalData.data.areaField = undefined;
classFieldOptioins.value = [];
} else {
//
@ -172,12 +196,20 @@
//
props.modalData.data.classField = undefined;
props.modalData.data.className = undefined;
let query = { tableName: props.modalData.data.tableName };
GetTableAndViewColumnList(query).then((res) => {
classFieldOptioins.value = res;
});
props.modalData.data.areaField = undefined;
// options
getClassFieldOptioins(props.modalData.data.tableName);
}
}
// options
function getClassFieldOptioins(tableName) {
let query = { tableName: tableName };
GetTableAndViewColumnList(query).then((res) => {
classFieldOptioins.value = res;
});
}
// description
function classFieldChange(value, option) {
if (value == undefined) {
@ -188,11 +220,8 @@
}
}
onMounted(() => {
getLayerOptions();
});
defineExpose({
clearModalData,
clearModal,
});
</script>
<style lang="scss" scoped>

View File

@ -1,6 +1,6 @@
<template>
<div class="page-div categories-page">
<div class="tree-div w-1/5 xl:w-1/6 m-4 mr-0">
<div class="tree-div w-1/7 xl:w-1/7 m-4 mr-0">
<div class="header">
<div class="buttons-div">
<a-button
@ -33,7 +33,7 @@
</div>
</div>
</div>
<div class="right-div w-4/5 xl:w-5/6">
<div class="right-div w-6/7 xl:w-6/7">
<BasicTable @register="registerTable">
<template #toolbar>
<PermissionBtn @btnEvent="buttonClick"></PermissionBtn>
@ -45,10 +45,23 @@
<template v-if="column.key == 'code'">
{{ getCode(record) }}
</template>
<template v-if="column.key == 'layer'">
{{ getLayer(record) }}
</template>
<template v-if="column.key == 'isClass'">
<a-tag v-if="record.isClass == 1" color="yellow"></a-tag>
<a-tag v-if="record.isClass == 0" color="gray"></a-tag>
</template>
<template v-if="column.key == 'overlayList'">
<div v-for="tag in record.overlayList" :key="tag">
<a-tag>{{ tag }}</a-tag>
</div>
<span class="content-full">
<a-tag color="green" v-for="tag in getOverlayList(record)" :key="tag">
{{ tag }}
</a-tag>
</span>
</template>
<template v-if="column.key == 'isSum'">
<a-tag v-if="record.isSum == 1" color="blue"></a-tag>
<a-tag v-if="record.isSum == 0" color="red"></a-tag>
</template>
</template>
</BasicTable>
@ -57,13 +70,16 @@
class="categories-modal"
v-model:open="openModal"
:title="modalData.title"
:maskClosable="false"
:afterClose="clearModal"
:footer="null"
>
<UseModal
ref="modalForm"
ref="modalFormRef"
:modalData="modalData"
:showTree="showTree"
:layerOptioins="layerOptioins"
:orverlayListOptioins="orverlayListOptioins"
@closeModal="closeModal"
@submit="submit"
/>
@ -87,6 +103,7 @@
Update,
Delete,
} from '@/api/sys/cloud';
import { ShpGeoLayerLoadPage } from '@/api/demo/system';
import {
columns,
emptyTableItem,
@ -98,21 +115,24 @@
import dayjs from 'dayjs';
import { cloneDeep, forEach } from 'lodash-es';
const modalForm = ref();
let lLoading = ref(false);
//
const treeRef = ref();
let showTree = ref([]);
let typeId = ref('');
let selectTreeId = ref('');
let showTree = ref([]);
let openModal = ref(false);
let lLoading = ref(false);
//
const modalFormRef = ref();
const modalData = reactive({
title: '',
data: {},
type: '',
});
const treeRef = ref();
const firstRequestCode = ref('');
const searchFormSchema = ref(searchFormSchema_1);
let openModal = ref(false);
watch(
() => typeId.value,
(newVal) => {
@ -127,12 +147,19 @@
},
);
//
const [registerTable, { reload, getSelectRows }] = useTable({
beforeFetch: (params) => {
if (params.StartTime) {
params.StartTime = dayjs(params.StartTime).startOf('day').format('YYYY-MM-DD');
}
if (params.EndTime) {
params.EndTime = dayjs(params.EndTime).endOf('day').format('YYYY-MM-DD HH:mm:ss');
}
if (firstRequestCode.value !== '') {
params = { ...params, code: firstRequestCode.value };
params = { ...params, Code: firstRequestCode.value };
} else if (typeId.value !== '') {
params = { ...params, code: typeId.value };
params = { ...params, Code: typeId.value };
} else {
params = { ...params };
}
@ -162,6 +189,7 @@
},
});
//
const getTreeData = (isMounted) => {
lLoading.value = true;
getLeftTree({ code: 'cloudQueryManagement' })
@ -180,10 +208,8 @@
lLoading.value = false;
});
};
onMounted(() => {
getTreeData(true);
});
//
const changeTypeId = (itemValue) => {
if (typeId.value != itemValue) {
typeId.value = itemValue;
@ -340,13 +366,29 @@
break;
}
};
//
const closeModal = () => {
openModal.value = false;
clearModal();
};
//
const clearModal = () => {
modalForm.value = cloneDeep(emptyTreeItem);
modalFormRef.value.clearModal();
};
// options
const layerOptioins: any = ref([]);
// options
const orverlayListOptioins: any = ref([{ serverName: '天地图', id: '天地图' }]);
function getLayerOptions() {
ShpGeoLayerLoadPage({}).then((res) => {
layerOptioins.value = res.items;
orverlayListOptioins.value = orverlayListOptioins.value.concat(layerOptioins.value);
});
}
// -
const getCode = (record) => {
let result = '';
showTree.value.forEach((item: any) => {
@ -356,6 +398,36 @@
});
return result;
};
// -
const getLayer = (record) => {
let result = '';
layerOptioins.value.forEach((item: any) => {
if (item.id === record.layer) {
result = item.serverName;
}
});
return result;
};
// -
const getOverlayList = (record) => {
let result: any = [];
orverlayListOptioins.value.forEach((item: any) => {
record.overlayList.forEach((over) => {
if (item.id == over) {
result.push(item.serverName);
}
});
});
// result = record.overlayList;
return result;
};
onMounted(() => {
getTreeData(true);
getLayerOptions();
});
</script>
<style lang="scss" scoped>
.page-div {
@ -424,4 +496,12 @@
}
}
// ant-table-header
.content-full {
white-space: pre-wrap;
word-break: break-all;
overflow-wrap: break-word;
max-width: 100%;
display: block;
}
</style>

View File

@ -9,32 +9,32 @@ export const columns = [
{
title: '名称',
dataIndex: 'name',
width: 100,
width: 80,
},
{
title: '云查询分类',
dataIndex: 'overlay',
width: 100,
dataIndex: 'code',
width: 80,
},
{
title: '图层',
dataIndex: 'layer',
width: 100,
// width: 100,
},
{
title: '数据表',
dataIndex: 'tableName',
width: 100,
// width: 120,
},
{
title: '叠加图层',
dataIndex: 'overlayList',
width: 100,
width: 150,
},
{
title: '是否分类',
dataIndex: 'isClass',
width: 100,
width: 80,
},
{
title: '分类字段',
@ -49,14 +49,20 @@ export const columns = [
{
title: '选择面积计算字段',
dataIndex: 'areaField',
width: 100,
// width: 100,
},
{
title: '是否合计',
dataIndex: 'isSum',
width: 100,
width: 80,
},
{
title: '创建时间',
dataIndex: 'createTime',
// width: 100,
}
];
export const emptyTreeItem = {
itemName: '',
itemValue: '',
@ -66,7 +72,7 @@ export const emptyTableItem = {
name: '',
layer: undefined,
tableName: '',
overlayList: ['1'],
overlayList: ['天地图'],
isClass: false,
classField: undefined,
className: undefined,
@ -77,21 +83,31 @@ export const emptyTableItem = {
export const searchFormSchema_1 = [
{
field: 'key',
label: '关键字',
label: '名称',
component: 'Input',
colProps: { span: 8 },
},
{
field: '[StartTime, EndTime]',
label: '日期范围',
component: 'RangePicker',
colProps: { span: 8 },
componentProps: {
format: 'YYYY-MM-DD',
placeholder: ['开始日期', '结束日期'],
},
},
];
export const searchFormSchema_2 = [
{
field: 'key',
label: '关键字',
label: '名称',
component: 'Input',
colProps: { span: 8 },
},
{
field: '[startTime, endTime]',
field: '[StartTime, EndTime]',
helpMessage: '查询范围只包含时序影像大类',
label: '日期范围',
component: 'RangePicker',

View File

@ -20,23 +20,23 @@ export const indexColumns: BasicColumn[] = [
{
title: '空间参考',
dataIndex: 'spatialRef',
width: 70,
width: 100,
},
{
title: '数据源类型',
dataIndex: 'dataSourceType',
ifShow: false,
width: 90,
width: 100,
},
{
title: '数据类型',
dataIndex: 'dataType',
width: 50,
width: 100,
},
{
title: '数据表名',
dataIndex: 'dataTable',
width: 120,
width: 150,
},
{
title: 'shp或者xls地址',
@ -53,12 +53,12 @@ export const indexColumns: BasicColumn[] = [
{
title: '创建时间',
dataIndex: 'createTime',
width: 120,
width: 150,
},
{
title: '修改时间',
dataIndex: 'updateTime',
width: 120,
width: 150,
},
];
@ -67,7 +67,7 @@ export const indexSearchFormSchema: FormSchema[] = [
field: 'SererName',
label: '服务名称',
component: 'Input',
colProps: { span: 8 },
colProps: { span: 12 },
},
];

View File

@ -175,9 +175,10 @@
// console.log(chooseRow);
getGeomData({ dataTable: chooseRow.dataTable })
.then((res) => {
let st = res.slice(6, -1);
let st: any = 'POINT(, )'.slice(6, -1);
st = st.split(' ');
handlerLocation([st[0], st[1]], 11);
// handlerLocation([118.32113719388846, 35.64528587987562], 11);
raster(chooseRow);
})
.catch((error) => {
@ -195,6 +196,8 @@
'&styles=&bbox={bbox-epsg-3857}&width=256&height=256&srs=' +
chooseRow.spatialRef +
'&format=image/png&TRANSPARENT=TRUE',
// 'http://192.168.10.131:8080/geoserver/my_workspace/wms?service=WMS&version=1.1.0&request=GetMap&layers=my_workspace:parse_shpinfo_text3&styles=&bbox=118.32113719388846%2C35.64528587987562%2C118.89333296872105%2C36.17725393199594&width=256&height=256&srs=EPSG:4326&format=image/png&TRANSPARENT=TRUE&exceptions=application%2Fvnd.ogc.se_inimage',
// 'http://175.27.168.120:8080/geoserver/yinanxian/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&FORMAT=image%2Fjpeg&TRANSPARENT=true&LAYERS=yinanxian%3Ayingxiang_01&exceptions=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A4548&STYLES=&WIDTH=529&HEIGHT=769&BBOX=607366.3276808303%2C3919435.438766631%2C612405.5241015075%2C3926765.179014889',
],
tileSize: 256,
});

View File

@ -136,7 +136,7 @@
</div>
</template>
<script lang="ts" setup>
import { ref, reactive, h } from 'vue';
import { ref, reactive, onMounted } from 'vue';
// vben
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { BasicTable, useTable, TableAction } from '@/components/Table';
@ -185,7 +185,7 @@
//
const searchParams = ref();
const [registerTable, { reload, getSelectRows, getDataSource, clearSelectedRowKeys }] = useTable({
title: '云查询图层',
title: '图层管理',
api: ShpGeoLayerLoadPage,
columns: indexColumns,
formConfig: {
@ -196,6 +196,7 @@
showTableSetting: true,
bordered: true,
showIndexColumn: true,
ellipsis: true,
rowSelection: {
type: 'radio',
},
@ -390,7 +391,9 @@
reload();
}
// ----------------------------
onMounted(() => {
reload();
});
</script>
<style lang="less" scoped>
.content {

View File

@ -79,6 +79,20 @@
</div>
</div>
<div style="display: flex;align-items: center;cursor: pointer;">
<a-popover placement="bottom">
<template #content>
<div style="display:flex;">
<div>当前状态</div>
<div>
<a-checkbox-group
v-model:value="params.nowStatus"
style="width: 100%"
:options="auditMapStatusOptions"></a-checkbox-group>
</div>
</div>
</template>
<img src="@/assets/images/tiankongdi/filt.png" class="img-box mr-r-20" />
</a-popover>
<img src="@/assets/images/tiankongdi/collect-active.png" class="img-box" @click="getCollectList" v-if="openCollect"/>
<img src="@/assets/images/tiankongdi/collect.png" class="img-box" @click="getCollectList" v-else/>
</div>
@ -90,7 +104,7 @@
class="data-list-item"
v-if="dataList.length > 0"
>
<div class="back-box" v-if="item.is_drawback == 1"></div>
<div class="back-box" v-if="showDrawBack(item)">{{ drawBackSpan(item) }}</div>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark" @click="locationFun(item)"/>
@ -200,8 +214,9 @@
import { message } from 'ant-design-vue';
import { useUserStore } from '@/store/modules/user.ts'
import { SearchOutlined, RollbackOutlined } from '@ant-design/icons-vue';
import { patchSourceOptions } from '@/utils/global'
import { patchSourceOptions, auditMapStatusOptions } from '@/utils/global'
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
@ -251,6 +266,7 @@
type: null,
sort: null,
order: null,
nowStatus: [],
});
const markTypeOptions = ref([
{ label: '合法', value: '合法' },
@ -268,8 +284,14 @@
}
async function getTaskList() {
console.log(params.value);
let requestData = {...params.value}
if(requestData.nowStatus.length > 0){
requestData.nowStatus = requestData.nowStatus.join(',')
}else{
requestData.nowStatus = null
}
emits('openLoading')
const data = await getLoadTaskDetailList(params.value);
const data = await getLoadTaskDetailList(requestData);
emits('closeLoading')
dataList.value = data.items;
total.value = data.total;

View File

@ -31,7 +31,17 @@
@change="(value) => mapListScreenChange(value, 'batch')"
/>
</div>
<div class="screen-item" style="margin-right: 18px">
<div class="screen-item" style="margin-right: 13px;margin-bottom: 12px">
<div class="screen-item-label">乡镇</div>
<a-select
allowClear
style="width:120px;"
v-model:value="infoScreenData.streetid"
:options="streetsAreaOptions"
@change="(value) => mapListScreenChange(value, 'streetid')"
/>
</div>
<div class="screen-item" style="margin-bottom: 12px;width:389px">
<a-input
allowClear
placeholder="请输入图斑编号"
@ -40,7 +50,7 @@
@change="(value) => mapListScreenChange(value.target.value, 'caseNo')"
/>
</div>
<div class="screen-item">
<div class="screen-item" style="flex: 1;justify-content: flex-end;">
<a-button class="item-button" style="background: #2B75E1;" type="primary" :icon="h(SearchOutlined)" @click="querysBtn"
>查询</a-button>
<a-button class="item-button img" type="primary" @click="changeArea">
@ -298,7 +308,7 @@
import { ref, onMounted, defineEmits, computed, h } from 'vue';
import { SearchOutlined, DownOutlined, SendOutlined } from '@ant-design/icons-vue';
import Icon from '@/components/Icon/Icon.vue';
import { getLoadDroneCaseInfoDetail, getCaseInfoById } from '@/api/tiankongdi/index';
import { getLoadDroneCaseInfoDetail, getCaseInfoById, getLoadStreet } from '@/api/tiankongdi/index';
import {
batchOptions,
yearOptions,
@ -339,6 +349,7 @@ const showSortMark = (key, sort) => {
return false;
};
const streetsAreaOptions = ref<{ label: string; value: string}[]>([])
const infoDataList = ref([]);
const infoScreenData: any = ref({
year: null,
@ -435,6 +446,15 @@ const openCollect = computed(() => {
});
const showInfoData = ref();
onMounted(() => {
getLoadStreet().then(res => {
console.log(res)
res.forEach(item => {
streetsAreaOptions.value.push({
label: item.Name,
value: item.Id,
})
})
})
getInfoList();
});
@ -636,7 +656,7 @@ function querysBtn(){
box-shadow: 2px 3px 3px 1px rgba(13, 13, 13, 0.05);
}
.item-input {
width: 223px;
width: 389px;
font-family: Alibaba PuHuiTi;
font-weight: 500;
font-size: 17px;

View File

@ -106,43 +106,70 @@
getLabel('weifaleixing', weifaleixing)
}}</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 1" label="附件">
<template v-for="(item, itemIndex) in fujianList" :key="itemIndex">
<div v-if="item" style="margin-top: 10px">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in fujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 0" label="附件">
<template v-for="(item, itemIndex) in hefafujianList" :key="itemIndex">
<div v-if="item" style="margin-top: 10px">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in hefafujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer,}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 2" label="实际用途">{{
getLabel('qita_use_to', qita_use_to)
}}</a-descriptions-item>
<a-descriptions-item v-if="is_illegal == 2" label="附件">
<template v-for="(item, itemIndex) in qitafujianList" :key="itemIndex">
<div v-if="item" style="margin-top: 10px">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in qitafujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item label="判定依据说明">{{
pandingyijushuoming
@ -192,16 +219,25 @@
getLabel('measure_name', measure_name)
}}</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 0" label="附件">
<template v-for="(item, itemIndex) in yanshoubiaoList" :key="itemIndex">
<div v-if="item">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in yanshoubiaoList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer,}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 0" label="照片">
<div class="image-div">
@ -228,17 +264,25 @@
</div>
</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 1" label="附件">
<template v-for="(item, itemIndex) in zhenggaifujianList" :key="itemIndex">
<div v-if="item">
<Icon
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
<!-- {{ zhenggaifujian }} -->
<a-image-preview-group :preview="{getContainer,}">
<template v-for="(item, itemIndex) in zhenggaifujianList" :key="itemIndex">
<a-image
v-if="showImage(item)"
style="width:100px;height:100px;"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${item}`"
:preview="{getContainer}"
></a-image>
<div v-else>
<Icon
v-if="item"
:style="`font-size: 30px; cursor: pointer;`"
icon="ion:document-attach-outline"
@click="downLoadFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="measure_name == 1" label="照片">
<div class="image-div">
@ -692,6 +736,13 @@
return Number(resultString).toFixed(2);
}
};
const showImage = (url) => {
if(url.indexOf('.png') !== -1 || url.indexOf('.jpg') !== -1 || url.indexOf('.jpeg') !== -1 ){
return true
}else{
return false
}
}
</script>
<style lang="scss" scoped>

View File

@ -180,7 +180,7 @@
</div>
<div class="data-list-div" style="padding-top: 1px;">
<div v-for="(item, index) in props.infoDataList" :key="index" class="data-list-item">
<div class="back-box" v-if="item.isdrawback == 1"></div>
<div class="back-box" v-if="showDrawBack(item)">{{ drawBackSpan(item) }}</div>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark" style="cursor:pointer;" @click="locationFun(item)"/>
@ -307,6 +307,7 @@ import { flowStore } from '@/store/modules/flow';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { Audit } from '@/views/demo/workflow/task/process/page';
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
const flowWfDataStore = flowStore();
const emits = defineEmits([

24
src/views/demo/util.ts Normal file
View File

@ -0,0 +1,24 @@
import { useUserStore } from '@/store/modules/user'
const userStore = useUserStore()
export const showDrawBack = (item) => {
let level = userStore.getUserInfo.orgMaxLevel
if((level == '0' && item.is_shijibohui == 1) || (level != '0' && (item.is_shijibohui == 1 || item.is_drawback == 1))){
return true
}else {
return false
}
}
export const drawBackSpan = (item) => {
let level = userStore.getUserInfo.orgMaxLevel
let title = ''
if(item.is_shijibohui){
title = '市'
}
if(item.is_drawback && level != '0'){
if(title != ''){
title = title + ','
}
title = title + '县'
}
return `${title} 驳回`
}