刘妍 2024-07-10 16:19:16 +08:00
commit be7da1ea87
12 changed files with 923 additions and 63 deletions

View File

@ -285,10 +285,14 @@
function handlerLayerChange(){
var allLayers = map.getStyle().layers;
allLayers.forEach(function(layer){
map.moveLayer('detailsLayer', layer.id);
map.moveLayer('detailsLayerLine', layer.id);
if(map.getLayer("detailsLayerLine"))
map.moveLayer('detailsLayerLine', allLayers[allLayers.length-1].id);
allLayers.forEach(function(layer){
});
// allLayers.forEach(function(layer){
// console.log("layersssss",layer.id);
// // map.moveLayer('detailsLayer', layer.id);
// });
}
//
const handlerLoadMapLayer = ()=>{
@ -353,6 +357,7 @@
handlerLayerChange()
}
}
console.log("layersssss",layers);
baseLayers.push(layers)
});
configlayers["地图底图"] = {
@ -369,6 +374,9 @@
layerGroups:configlayers
});
map.addControl(switchLayerControler,"top-left");
handlerLayerChange()
}
//
@ -392,7 +400,6 @@
'tileSize': 512,
'maxzoom': 14
});
map.setTerrain({ 'source': 'mapbox-dem', 'exaggeration': 1.5 });
}
//

View File

@ -0,0 +1,549 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<div class="form">
<Form
label-align="left"
layout="vertical"
description="图斑控件"
size="small"
style="padding:0px 15px"
>
<a-row :gutter="12">
<a-col :span="12" >
<a-card title="基本设置" class="card-item">
<FormItem label="是否显示">
<Switch v-model:checked="mapConfig.isShowMap" />
</FormItem>
<FormItem label="地图宽度" >
<a-input-number
v-model:value="mapConfig.width"
placeholder="请输入地图宽度"
:min="1"
:max="100"
>
<template #addonAfter><PercentageOutlined /></template>
</a-input-number>
</FormItem>
<FormItem label=" &nbsp;"></FormItem>
</a-card>
</a-col>
<a-col :span="12" >
<a-card title="地图配置" class="card-item" >
<FormItem label="地图模式">
<a-radio-group v-model:value="mapConfig.mode">
<a-radio :value="'2D'">二维地图</a-radio>
<a-radio :value="'3D'">三维地图</a-radio>
</a-radio-group>
</FormItem>
<a-row :gutter="12">
<a-col :span="12" >
<FormItem label="倾斜角度">
<a-input-number v-model:value="mapConfig.angle" :min="0"
:max="90" />
</FormItem>
</a-col>
<a-col :span="12" >
<FormItem label="中心位置">
<a-input v-model:value="mapConfig.center" />
</FormItem>
</a-col>
</a-row>
<a-row :gutter="12">
<a-col :span="8" >
<FormItem label="初始缩放级别">
<a-input-number v-model:value="mapConfig.zoom" :min="1"
:max="18" />
</FormItem>
</a-col>
<a-col :span="8" >
<FormItem label="最小缩放级别">
<a-input-number v-model:value="mapConfig.minZoom" :min="1"
:max="18" />
</FormItem>
</a-col>
<a-col :span="8" >
<FormItem label="最大缩放级别">
<a-input-number v-model:value="mapConfig.maxZoom" :min="1"
:max="18" />
</FormItem>
</a-col>
</a-row>
</a-card>
</a-col>
</a-row>
<a-card title="底图设置" class="card-item" >
<template #extra>
<a-tooltip>
<template #title>添加地图底图</template>
<PlusOutlined @click="handlerAddBaseLayer()"/>
</a-tooltip>
</template>
<!-- <a-table :row-selection="rowSelection" :dataSource="baseLayers" :columns="baselayercolumns" :pagination="false" >
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'checked'">
<a-switch v-model:checked="record.checked" checked-children="" un-checked-children="" />
</template>
</template>
</a-table> -->
<a-table :dataSource="mapConfig.baseLayers" :columns="baselayercolumns" :pagination="false" >
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'checked'">
<a-switch v-model:checked="record.checked" checked-children="" un-checked-children="" />
</template>
<template v-if="column.key === 'operation'">
<span>
<a-tooltip>
<template #title>删除图层</template>
<DeleteOutlined @click="hanelerDeleteBaseLayer(column, record)" />
</a-tooltip>
</span>
</template>
</template>
</a-table>
</a-card>
<a-card title="图层设置" class="card-item" >
<template #extra>
<a-tooltip>
<template #title>添加图层分类</template>
<PlusOutlined @click="handleAddSource()"/>
</a-tooltip>
</template>
<a-collapse v-model:activeKey="activeKey" v-for="item in mapConfig.layers" :key="item.name" ghost>
<a-collapse-panel :key="item.name" :header="item.name">
<!-- <template #header>
<a-input v-model:value="item.name"/>
</template> -->
<template #extra>
<a-tooltip>
<template #title>添加图层</template>
<PlusOutlined @click="hanelerAddLayer(item.name)" style="margin-right: 10px"/>
</a-tooltip>
<a-tooltip>
<template #title>修改图层分类标题</template>
<EditOutlined @click="openLayerModal(item.name)" style="margin-right: 10px"/>
</a-tooltip>
<a-tooltip>
<template #title>删除图层分类</template>
<DeleteOutlined @click="hanelerDeleteSource(item.name)"/>
</a-tooltip>
<a-modal :open="open" title="修改标题名" @ok="submitLayerModal" @cancel="closeLayerModal">
<a-input v-model:value="newLayerName" />
</a-modal>
</template>
<a-table :dataSource="item.layers" :columns="columns" :pagination="false" >
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'checked'">
<a-switch v-model:checked="record.checked" checked-children="" un-checked-children="" />
</template>
<template v-if="column.key === 'operation'">
<span>
<a-tooltip>
<template #title>删除图层</template>
<DeleteOutlined @click="hanelerDeleteLayer(item.name, record)" />
</a-tooltip>
</span>
</template>
</template>
</a-table>
</a-collapse-panel>
</a-collapse>
</a-card>
<a-button type="primary" size="middle" style="margin-top:12px;" @click="saveMapConfig"></a-button>
</Form>
</div>
<a-modal
class="insert-shp-modal"
width="1290px"
title="选择图层"
:destroyOnClose="true"
:open="openModal"
@cancel="changeOpenModal"
>
<SelectLayer v-model:openModal="changeOpenModal" @handlerAddToLayerList="handlerAddToLayerList" />
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { ref, inject, watch, onMounted,reactive,computed,unref } from 'vue';
import { Form, FormItem, message, Switch,TableProps } from 'ant-design-vue';
import { PageWrapper } from '@/components/Page';
import { ShpLayerSourceLoadPage, GetTableAndViewColumnList } from '@/api/demo/formScheme';
import{fun_GetForm} from '@/api/demo/formModule'
import {updateConfig,getConfig} from '@/api/sys/layerManagement'
import { EditOutlined, DeleteOutlined, PercentageOutlined ,PlusOutlined} from '@ant-design/icons-vue';
import SelectLayer from '@/components/MapboxMaps/Modal/ServeResource/index.vue'
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
const mapConfig = ref({});
getConfig({code:"mapsetting"}).then(res=>{
mapConfig.value = JSON.parse(res.codeValue)
})
// const mapConfig = reactive({
// baseConfig:{
// state:true,
// width:50
// },
// viewerConfig:{
// mode:"2D",
// angle:90,
// center:null,
// zoom:12,
// minZoom:3,
// maxZoom:18
// },
interface BaseLayerDataType {
key: string | number;
name: string;
checked:boolean;
layer:Object;
}
// baseLayers:[
// {
// name: '',
// show:false,
// layer:{
// }
// },{
// name: '',
// show:false,
// layer:{
// }
// },{
// name: '',
// show:false,
// layer:{
// }
// }
// ],
// layers:[
// {
// name: '',
// show:true,
// layer:{
// }
// },
// {
// name: '',
// show:false,
// layer:{
// }
// }
// ]
// })
const baseLayers = reactive([
{
key:1,
name: '天地图注记图层',
checked:false,
layer:{
id: "tiandituzhuji",
type: "raster",
source: {
type: "raster",
tiles: [
"https://t0.tianditu.gov.cn/DataServer?T=cia_w&x={x}&y={y}&l={z}&tk=b6585bc41ee16251dbe6b1af64f375d9",
],
tileSize: 256,
},
layout: {
visibility: "visible",
},
}
},{
key:2,
name: '高清影像图层',
checked:false,
layer:{
id: "gaoqingyingxiang",
type: "raster",
source: {
type: "raster",
tiles: [
"http://60.213.14.14:8060/geoserver/feixian/wms?service=WMS&version=1.1.0&request=GetMap&layers=feixian:yingxiang&styles=&bbox={bbox-epsg-3857}&width=256&height=256&srs=EPSG:3857&format=image/png&TRANSPARENT=TRUE",
],
tileSize: 256,
},
layout: {
visibility: "visible",
},
paint: {},
}
}
])
const columns = reactive([
{
title: '图层名称',
dataIndex: 'name',
key: 'name',
},
{
title: '默认',
dataIndex: 'checked',
key: 'checked',
},
{
title: '操作',
dataIndex: 'operation',
key: 'operation',
},
])
const baselayercolumns = reactive([
{
title: '图层名称',
dataIndex: 'name',
key: 'name',
},
{
title: '默认',
dataIndex: 'checked',
key: 'checked',
},{
title: '操作',
dataIndex: 'operation',
key: 'operation',
},
])
// config
// const config: any = inject('formConfig');
const config = {}
// const mapConfig = ref(config.table.maps);
watch(
() => config.table.maps,
() => {
mapConfig.value = config.table.maps;
//
mapConfig.value?.baseLayers?.forEach((item,index)=>{
selectedRowKeys.value.push(item.key)
})
},
);
const selectedBaseLyaers:BaseLayerDataType[] = [];
const selectedRowKeys = ref<BaseLayerDataType['key'][]>([]);
mapConfig.value?.baseLayers?.forEach((item,index)=>{
selectedBaseLyaers.push(item);
selectedRowKeys.value.push(item.key)
})
const onSelectChange = (changableRowKeys:number[],changeRows:BaseLayerDataType[]) => {
selectedRowKeys.value = changableRowKeys;
mapConfig.value.baseLayers = changeRows;
};
const rowSelection = computed(() => {
return {
selectedRowKeys: unref(selectedRowKeys),
onChange: onSelectChange,
hideDefaultSelections: false,
};
});
const openModal = ref(false);
const insertShpModal = ref(true);
const changeOpenModal = (value) => {
openModal.value = !openModal.value
};
const changeOpenInsertShpModal = (value) => {
insertShpModal.value = value;
};
onMounted(() => {
});
const activeKey: any = ref([]);
let nowCollapseName = null;
//
const handleAddSource = () => {
if(!mapConfig.value.layers){
mapConfig.value.layers = [];
}
mapConfig.value?.layers.push(
{
name: '',
layers: [],
}
);
activeKey.value.push('');
};
//
const hanelerDeleteSource = (collapseName) =>{
mapConfig.value.layers.forEach((item, index)=>{
if(item.name == collapseName){
mapConfig.value.layers.splice(index, 1);
activeKey.value.splice(index, 1);
}
});
}
//
let oldLayerName = '';
const newLayerName = ref('');
const open = ref(false);
//
const openLayerModal = (name) => {
open.value = true;
oldLayerName = name;
newLayerName.value = name;
activeKey.value.push(name);
}
//
const submitLayerModal = () => {
if (oldLayerName != newLayerName.value) {
let number = mapConfig.value?.layers?.filter(la => la.name == newLayerName.value).length;
if(number > 0) {
message.warn('图层标题名不能重复!');
return;
}
mapConfig.value?.layers?.forEach((item, index) => {
if(item.name == oldLayerName) {
activeKey.value.push(newLayerName.value);
activeKey.value.splice(oldLayerName, 1);
mapConfig.value.layers[index].name = newLayerName.value;
}
})
}
open.value = false;
}
//
const closeLayerModal = (name) => {
open.value = false;
}
const addType = ref<String>("");
//
const hanelerAddLayer = (collapseName) =>{
addType.value = "layer";
if(collapseName) {
nowCollapseName = collapseName;
changeOpenModal(true);
} else {
message.warn('请先命名图层分类名');
}
activeKey.value.push(collapseName);
}
//
const handlerAddBaseLayer = ()=>{
addType.value = "baselayer";
changeOpenModal(true);
}
//
const hanelerDeleteLayer = (name, record)=>{
mapConfig.value?.layers?.forEach((item, item_index)=>{
if (item.name == name) {
item.layers.forEach((it, it_index) => {
if(it.id == record.id){
mapConfig.value.layers[item_index].layers.splice(it_index, 1);
}
});
}
})
}
//
const hanelerDeleteBaseLayer = (item,record)=>{
console.log(mapConfig.value,item,record)
mapConfig.value?.baseLayers?.forEach((item, item_index)=>{
if (item.name == record.name) {
mapConfig.value.baseLayers.splice(item_index, 1);
}
})
}
//
const handlerAddToLayerList = (item)=>{
if(addType.value == 'layer'){
mapConfig.value.layers.forEach((layer, index)=>{
if(layer.name == nowCollapseName) {
activeKey.value.push(layer.name);
mapConfig.value.layers[index].layers.push(item);
}
});
}else if(addType.value == 'baselayer'){
mapConfig.value.baseLayers?.push(item);
}
console.log(mapConfig.value.baseLayers);
}
const handlerBaseLayerChange = (item) => {
if(!mapConfig.value?.baseLayers){
mapConfig.value.baseLayers = [];
}
if(item.show == true){
mapConfig.value.baseLayers.push(item);
}else{
mapConfig.value.baseLayers?.forEach((it,idx)=>{
if(it.name == item.name){
mapConfig.value.baseLayers?.splice(idx,1);
}
})
}
}
const saveMapConfig = ()=>{
let form = {
code:"mapsetting",
codeValue:JSON.stringify(mapConfig.value)
}
updateConfig(form).then(res=>{
createMessage.success("保存成功!");
})
}
</script>
<style lang="less" scoped>
.form {
overflow-y: auto;
height: calc(100vh - 120px);
width: 100%;
}
.card-item{
margin-top:30px!important;
}
</style>

View File

@ -12,7 +12,7 @@ export const columns: BasicColumn[] = [
title: '县区',
dataIndex: 'countyname',
width: 150,
// fixed: 'left',
fixed: 'left',
},
{
title: '下发图斑',

View File

@ -116,9 +116,9 @@
<a-modal
v-model:open="showRecordList"
width="1500px"
width="1710px"
:footer="null"
style="top: 100px"
style="top: 50px; left: 105px"
@ok="handleOk"
>
<template #closeIcon>
@ -154,14 +154,17 @@
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { PageWrapper } from '@/components/Page';
import { cloneDeep } from 'lodash-es';
import { getCaseOffence } from '@/api/demo/system';
import { getCaseOffence, postCaseOffenceToExcel } from '@/api/demo/system';
import { columns, searchFormSchema } from './index.data';
import { useMessage } from '@/hooks/web/useMessage';
import { MinusOutlined, CloseOutlined, CloudDownloadOutlined } from '@ant-design/icons-vue';
import dayjs from 'dayjs';
import { RecordList } from './page';
import { MinusOutlined, CloseOutlined, CloudDownloadOutlined } from '@ant-design/icons-vue';
import { getAppEnvConfig } from '@/utils/env';
import axios from 'axios';
import dayjs from 'dayjs';
const { createMessage } = useMessage();
const { VITE_GLOB_API_URL } = getAppEnvConfig();
//
const searchParams = ref();
@ -177,9 +180,9 @@
showIndexColumn: false,
striped: false,
bordered: true,
showSummary: true,
canResize: false,
useSearchForm: true,
// showTableSetting: true,
pagination: false,
size: 'small',
handleSearchInfoFn(info) {
@ -189,8 +192,8 @@
beforeFetch: (data) => {
//
var temp = {
startTime: dayjs(data.startTime).format('YYYY-MM'),
endTime: dayjs(data.endTime).format('YYYY-MM'),
startTime: dayjs(data.startTime).startOf('month').format('YYYY-MM-DD'),
endTime: dayjs(data.endTime).endOf('month').format('YYYY-MM-DD'),
};
return temp;
},
@ -220,8 +223,8 @@
const searchForm = reactive<searchListSchema>({
AreaId: record.countyid,
CaseType: CaseType,
startTime: dayjs(searchParams.value?.startTime).format('YYYY-MM'),
endTime: dayjs(searchParams.value?.endTime).format('YYYY-MM'),
startTime: dayjs(searchParams.value?.startTime).startOf('month').format('YYYY-MM-DD'),
endTime: dayjs(searchParams.value?.endTime).endOf('month').format('YYYY-MM-DD'),
page: 1,
limit: 10,
});
@ -265,6 +268,18 @@
//
currentListQuery.listQuery = searchForm;
}
function onEdit(targetKey: string) {
tablist.splice(parseInt(targetKey), 1);
if (tablist.length == 0) {
showRecordList.value = false;
}
if (parseInt(targetKey) > 1) {
activeKey.value = (parseInt(targetKey) - 1).toString();
} else {
activeKey.value = '0';
}
currentListQuery.listQuery = tablist[activeKey.value].listQuery;
}
function handleTabChange(e) {
currentListQuery.listQuery = tablist[e].listQuery;
}
@ -280,8 +295,43 @@
}
showRecordList.value = false;
}
//
function handleExport() {
let params = {
startTime: dayjs(searchParams.value?.startTime).startOf('month').format('YYYY-MM-DD'),
endTime: dayjs(searchParams.value?.endTime).endOf('month').format('YYYY-MM-DD'),
};
axios({
method: 'post',
url: VITE_GLOB_API_URL + '/api/DroneCaseInfoSingle/CaseOffenceToExcel',
params: params,
headers: {
'X-Token': localStorage.getItem('X-Token'),
},
responseType: 'blob',
}).then((res) => {
let fileName = '无人机发现违法行为情况统计明细表' + new Date().getTime() + '.xls';
const elink = document.createElement('a');
elink.download = fileName;
elink.style.display = 'none';
elink.href = URL.createObjectURL(res.data);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href);
document.body.removeChild(elink);
});
}
//
const buttonClick = async (type) => {
switch (type) {
case 'btnExport':
handleExport();
break;
}
};
</script>
<style>
<style lang="less" scoped>
#closeIconButton {
width: 30px;
height: 40px;
@ -290,4 +340,27 @@
text-align: center;
cursor: pointer;
}
/* 整个滚动条的样式 */
::-webkit-scrollbar {
width: 12px;
height: 12px;
}
/* 滚动条轨道 */
::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 10px;
}
/* 滚动条滑块 */
::-webkit-scrollbar-thumb {
background: #888;
border-radius: 10px;
}
/* 当鼠标悬停在滚动条滑块上时的样式 */
::-webkit-scrollbar-thumb:hover {
background: #555;
}
</style>

View File

@ -95,7 +95,7 @@
>
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark"/>
<img src="/positioning.png" class="map-mark" @click="locationFun(item)"/>
<div class="label-div">
<div class="item-label">{{item.countyname}}</div>
<div class="item-sub-label">
@ -119,19 +119,19 @@
</div>
<div class="data-list-info-div">
<div class="info-layout-div">
<div class="info-item" style="width: 79px;">
<div class="info-item">
<div class="info-label"></div>
<div class="info-data">{{item.area}}</div>
</div>
<div class="info-item" style="width: 79px;">
<div class="info-item">
<div class="info-label"></div>
<div class="info-data">{{item.gengdi_area}}</div>
</div>
<div class="info-item" style="width: 90px;">
<div class="info-item">
<div class="info-label"></div>
<div class="info-data">{{item.yongjiujibennongtian_area}}</div>
</div>
<div class="info-item" style="width: 90px;">
<div class="info-item">
<div class="info-label"></div>
<div class="info-data">{{item.nongyongdi_area}}</div>
</div>
@ -452,7 +452,7 @@
.screen-div {
padding: 10px 10px 19px 10px;
display: flex;
width: 565px;
width: 590px;
// margin-top: 10px;
flex-wrap: wrap;
// background: @component-background;
@ -530,6 +530,8 @@
padding: 10px;
// margin-top: 10px;
height: 60vh;
scrollbar-width: none; /* firefox */
-ms-overflow-style: none; /* IE 10+ */
.data-list-item{
background:#fff;
padding:10px;
@ -547,6 +549,7 @@
.map-mark{
width:17px;
height:17px;
cursor:pointer;
}
.label-div{
display: flex;
@ -650,6 +653,9 @@
border-bottom-right-radius: 6px;
}
}
.data-list-div::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
.pagination-div {
background: @component-background;
padding: 0 10px 10px;

View File

@ -45,7 +45,6 @@
import { getGeom,getConfig } from '@/api/sys/layerManagement';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
const MapboxMap = defineAsyncComponent(() => import('@/components/MapboxMaps/MapComponent.vue'));
@ -196,7 +195,7 @@
height: 100%;
display: flex;
.show-list {
width: 565px;
width: 590px;
background: #EFEFEF;
}
.map-box-div {

View File

@ -41,12 +41,49 @@
@click="emits('showInfo', true, item)"
v-if="dataList.length > 0"
>
<div class="name-div">
<div class="name-div">
<div class="item-mark"></div>
<div class="item-label">{{ item.areaname }}</div>
<div class="progress-div">
<div class="progress-label progress-color">进度</div>
<div class="progress-data" style="width:97px">
<span style="color: #086DEC;">{{item.verificatedtask}}</span>/{{item.totaltask}}
</div>
</div>
<div class="progress-div">
<div class="progress-label extended-color">超期</div>
<div class="progress-data" style="width:50px">
<span style="color: #D03542">{{item.overduetask}}</span>
</div>
</div>
<div class="progress-div">
<div class="progress-label reviewed-color" style="width:70px;">待审核</div>
<div class="progress-data" style="width:50px">
<span style="color: #EC7908;">{{item.verifytask}}</span>
</div>
</div>
</div>
<div class="data-div">
<span>{{ item.count }}</span>
<div class="info-data-div">
<div class="info-data-item">
<div class="info-data-label">合法</div>
<div class="info-data-data">{{item.legalcase}}</div>
</div>
<div class="info-data-item">
<div class="info-data-label">其他</div>
<div class="info-data-data">{{item.ilegalcase}}</div>
</div>
<div class="info-data-item">
<div class="info-data-label">非粮化</div>
<div class="info-data-data">{{item.nonfoodcase}}</div>
</div>
<div class="info-data-item">
<div class="info-data-label">复耕</div>
<div class="info-data-data">{{item.rehabilitationcase}}</div>
</div>
<div class="info-data-item">
<div class="info-data-label">补手续</div>
<div class="info-data-data">{{item.makeupcase}}</div>
</div>
</div>
</div>
<div v-else class="no-data">
@ -58,10 +95,10 @@
<script setup lang="ts">
import { ref, defineProps, defineEmits, toRefs } from 'vue';
import { batchOptions, yearOptions } from '@/views/demo/tiankongdi/curbspotcity/util.ts';
import { batchOptions, yearOptions,patchSourceOptions } from '@/views/demo/tiankongdi/curbspotcity/util.ts';
import { Empty } from 'ant-design-vue';
const props = defineProps(['year', 'batch', 'dataList']);
const props = defineProps(['year', 'batch', 'dataList','patchSource']);
const emits = defineEmits(['auditProgressScreenChange', 'showInfo']);
const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
</script>
@ -73,23 +110,27 @@
.screen-row {
display: flex;
.screen-item {
flex: 1;
font-family: Alibaba PuHuiTi;
font-weight: 500;
font-size: 17px;
color: #000000;
width: 50%;
display: flex;
.screen-item-label {
width: 55px;
width: 56px;
padding-left: 10px;
display: flex;
align-items: center;
font-size: 15px;
}
}
}
}
.data-list {
height: calc(100% - 52px);
background: @component-background;
margin-top: 10px;
height: calc(100% - 62px);
// background: darkgoldenrod;
// background: @component-background;
margin-top: 10px;
padding: 0px 10px;
.data-title {
height: 40px;
background: #bab9b7;
@ -102,17 +143,58 @@
}
.show-data-list-content {
.data-item {
cursor: pointer;
width: 100%;
background: #fff;
border-radius: 11px;
padding: 10px;
margin-bottom: 10px;
.name-div {
display: flex;
display: flex;
height: 50px;
align-items: center;
padding: 10px;
justify-content: space-between;
border-bottom: 1px solid #ececec;
cursor: pointer;
.name-div {
display: flex;
height: 50px;
align-items: center;
padding: 10px 0px;
border-bottom: 1px solid #E5E5E5;
}
.info-data-div{
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 10px;
.info-data-item{
display: flex;
align-items: center;
flex: 1;
justify-content: center;
border-right: 1px solid #EDEDED;
.info-data-label{
font-family: Alibaba PuHuiTi;
font-weight: 400;
font-size: 16px;
color: #959494;
display: flex;
justify-content: end;
flex: 1;
padding-right: 5px;
}
.info-data-data{
font-family: HarmonyOS Sans;
font-weight: 500;
font-size: 16px;
color: #000000;
line-height: 30px;
flex: 1;
display: flex;
justify-content: start;
padding-left: 5px;
}
}
.info-data-item:nth-last-child(1){
border-right: 0px;
}
}
.data-div {
font-weight: 500;
@ -126,17 +208,52 @@
margin-right: 7px;
}
.item-label {
width: 100px;
font-size: 16px;
font-weight: 600;
margin-left: 5px;
}
.progress-div{
display:flex;
font-weight: 500;
font-size: 16px;
line-height: 30px;
margin-right: 17px;
.progress-label{
font-family: Alibaba PuHuiTi;
color: #FFFFFF;
width: 50px;
height: 27px;
border-radius: 13px 0px 0px 13px;
display: flex;
align-items: center;
justify-content: center;
}
.progress-data{
background: #EFEFEF;
height: 27px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 0px 0px 11px 0px;
}
.progress-color{
background: #086DEC;
}
.extended-color{
background: #D03542
}
.reviewed-color{
background: #EC7908
}
}
}
.data-item:hover {
background-color: rgba(8, 109, 236, 0.08);
}
.data-item:nth-child(2n) {
background: #ececec;
}
// .data-item:nth-child(2n) {
// background: #ececec;
// }
}
}
.no-data {

View File

@ -51,6 +51,8 @@
import { batchOptions, yearOptions } from '@/views/demo/tiankongdi/curbspotcity/util.ts';
import { getChildrenTree } from '@/api/demo/system.ts';
import { getGeom,getConfig } from '@/api/sys/layerManagement';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
const MapboxMap = defineAsyncComponent(() => import('@/components/MapboxMaps/MapComponent.vue'));
const MapboxComponent = ref();

View File

@ -170,6 +170,8 @@ import { defineProps,ref,computed } from "vue"
import MapboxMap from '@/components/MapboxMaps/MapComponent.vue'
import {getConfig} from '@/api/sys/layerManagement'
import { getGeom } from '@/api/sys/layerManagement';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
import Icon from '@/components/Icon/Icon.vue';
const MapboxComponent = ref();

View File

@ -3,7 +3,7 @@
<div class="top-radio-button-div">
<a-radio-group
v-model:value="props.infoScreenData.landType"
@change="(value) => emits('mapListScreenChange','landType')"
@change="(e) => emits('mapListScreenChange',e.target.value,'landType')"
button-style="solid"
style="width:100%">
<a-radio-button :value="0" class="radio-item">农用地</a-radio-button>
@ -88,8 +88,8 @@
</div>
<div class="sift-div">
<div class="layout-div">
<RollbackOutlined class="back-button" @click="emits('closeShowInfo', false)"/>
<div class="interval-div"></div>
<!-- <RollbackOutlined class="back-button" @click="emits('closeShowInfo', false)"/> -->
<!-- <div class="interval-div"></div> -->
<div class="sift-item" @click="dataListSort('area')">
<div class="sift-label">总面积</div>
<div class="sift-icon">
@ -181,7 +181,7 @@
<div v-for="(item, index) in props.infoDataList" :key="index" class="data-list-item">
<div class="data-list-layout-div">
<div class="data-list-title-div">
<img src="/positioning.png" class="map-mark"/>
<img src="/positioning.png" class="map-mark" style="cursor:pointer;" @click="locationFun(item)"/>
<div class="label-div">
<div class="item-label">{{item.countyname}}</div>
<div class="item-sub-label">
@ -191,26 +191,26 @@
</div>
<div class="item-mark" v-if="item.isbuildname">{{item.isbuildname}}</div>
</div>
<div class="data-item-type-div" style="cursor:pointer;" @click="() => {}">
<div class="data-item-type-div" style="cursor:pointer;" @click="goAudit(item)">
{{item.unitname}}
</div>
</div>
<div class="data-list-info-div">
<div class="info-layout-div">
<div class="info-item" style="width: 67px;">
<div class="info-item">
<div class="info-label"></div>
<div class="info-data">{{item.area}}</div>
</div>
<div class="info-item" style="width: 67px;">
<div class="info-item">
<div class="info-label"></div>
<div class="info-data">{{item.gengdiarea}}</div>
</div>
<div class="info-item">
<div class="info-label" style="width: 80px;"></div>
<div class="info-label"></div>
<div class="info-data">{{item.yongjiujibennongtianarea}}</div>
</div>
<div class="info-item">
<div class="info-label" style="width: 80px;"></div>
<div class="info-label"></div>
<div class="info-data">{{item.nongyongdiarea}}</div>
</div>
</div>
@ -251,6 +251,36 @@
<ShowInfoModal :showInfoData="showInfoData"/>
</div>
</a-modal>
<a-modal
width="100%"
wrap-class-name="full-modal"
v-model:open="auditOpen"
title="审核"
footer=""
:destroyOnClose="true"
>
<template #footer> </template>
<div class="handoff">
<a-button
type="primary"
style="margin-right: 25px;"
@click="prevData"
>上一条</a-button>
<a-button
type="primary"
@click="nextData"
>下一条</a-button>
</div>
<Audit
v-if="handoffShow"
ref="posRef"
:processId="processId"
:taskId="taskId"
:isRead="isRead"
:type="type"
@closeModel="closeMolder"
/>
</a-modal>
</div>
</template>
@ -273,8 +303,11 @@ import {
import { useUserStore } from '@/store/modules/user.ts'
import { message } from "ant-design-vue";
import ShowInfoModal from './ShowInfoModal/index.vue'
import { flowStore } from '@/store/modules/flow';
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { Audit } from '@/views/demo/workflow/task/process/page';
const userStore = useUserStore()
const flowWfDataStore = flowStore();
const emits = defineEmits([
"closeShowInfo",
"mapListScreenChange",
@ -310,6 +343,13 @@ const orderMark = () => {
}
}
const showInfoOpen = ref(false)
const showDataIndex = ref()
const auditOpen = ref(false);
const processId = ref('');
const taskId = ref('');
const type = ref('');
const handoffShow = ref(true)
const isRead: any = ref(0);
const openCollect = computed(() => {
if(props.infoScreenData.type === '') return false
return true
@ -382,9 +422,70 @@ const showInfo = (item) => {
showInfoOpen.value = true
})
}
async function goAudit(record) {
showDataIndex.value = props.infoDataList.findIndex(item => item.taskeid === record.taskeid)
let data = await getDetail({ code: record.processcode });
let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData;
flowWfDataStore.setWfDataAll(wfData);
auditOpen.value = true;
processId.value = record.processid;
taskId.value = record.taskeid;
type.value = record.type;
}
const prevData = async () => {
if(showDataIndex.value === 0){
if(props.pageNo === 1){
message.warning('已经是第一条数据了')
return
}
await emits('changeInfoPage',props.pageNo - 1,props.pageSize)
showDataIndex.value = props.infoDataList.length -1
}else{
showDataIndex.value = showDataIndex.value -1
}
handoffShow.value = false
let record = props.infoDataList[showDataIndex.value]
let data = await getDetail({ code: record.processcode });
let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData;
flowWfDataStore.setWfDataAll(wfData);
processId.value = record.processid;
taskId.value = record.taskeid;
type.value = record.type;
handoffShow.value = true
}
const nextData = async () => {
if(showDataIndex.value === props.infoDataList.length -1){
if(Math.ceil(props.total / props.pageSize) === props.pageNo){
message.warning('已经是最后一条数据了')
return
}
await emits('changeInfoPage',props.pageNo + 1,props.pageSize)
showDataIndex.value = 0
}else{
showDataIndex.value = showDataIndex.value + 1
}
handoffShow.value = false
let record = props.infoDataList[showDataIndex.value]
let data = await getDetail({ code: record.processcode });
let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData;
flowWfDataStore.setWfDataAll(wfData);
processId.value = record.processid;
taskId.value = record.taskeid;
type.value = record.type;
handoffShow.value = true
}
</script>
<style lang="scss" scoped>
.handoff{
width: 100%;
display: flex;
justify-content: flex-end;
padding-right: 25px;
}
.full-modal {
.ant-modal {
min-width: 100vw;
@ -422,7 +523,7 @@ const showInfo = (item) => {
.screen-div{
padding: 10px;
display: flex;
width:565px;
width:590px;
flex-wrap: wrap;
.screen-item{
width: 33.3%;
@ -513,6 +614,8 @@ const showInfo = (item) => {
flex: 1;
overflow: auto;
padding: 10px;
scrollbar-width: none; /* firefox */
-ms-overflow-style: none; /* IE 10+ */
.data-list-item{
background:#fff;
padding:10px;
@ -619,6 +722,9 @@ const showInfo = (item) => {
border-bottom-right-radius: 6px
}
}
.data-list-div::-webkit-scrollbar {
display: none; /* Chrome Safari */
}
.pagination-div{
height: 60px;
display: flex;

View File

@ -2,7 +2,7 @@
<div class="curb-spot-city">
<div class="show-list">
<a-spin :spinning="spinning">
<AuditProgress
<!-- <AuditProgress
v-if="!showInfo"
:year="year"
:batch="batch"
@ -11,9 +11,8 @@
:dataList="dataList"
@auditProgressScreenChange="auditProgressScreenChange"
@showInfo="changeShowInfo"
/>
/> -->
<MapList
v-if="showInfo"
:infoScreenData="infoScreenData"
:cityType="cityType"
:pageNo="pageNo"
@ -136,6 +135,7 @@ const mapListScreenChange = (value, type) => {
switch(type){
case 'landType':
infoScreenData.value.landType = value
getInfoList()
break
case 'year':
infoScreenData.value.year = value
@ -351,10 +351,10 @@ const getInfoList = () => {
spinning.value = false
})
}
const changeInfoPage = (page, limit) => {
const changeInfoPage = async(page, limit) => {
pageNo.value = page
pageSize.value = limit
getInfoList()
await getInfoList()
}
const collectChange = (value) => {
pageNo.value = 1
@ -440,7 +440,7 @@ onMounted(() => {
height: 100%;
display: flex;
.show-list{
width: 565px;
width: 590px;
background: #EFEFEF;
:deep(.ant-spin-nested-loading){
height: 100%;

View File

@ -148,11 +148,10 @@
import { designerDataType, logsType } from './processModel';
import { auditInfo } from './page';
import { getGeom } from '@/api/sys/layerManagement';
import { useMessage } from '@/hooks/web/useMessage';
import { storeToRefs } from 'pinia';
import ImagePreview from "@/components/Upload/src/components/image_preview.vue";
import { userFormFileStore } from '@/store/modules/formFileUrl';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage } = useMessage();
const MapboxMap = defineAsyncComponent(() => import('@/components/MapboxMaps/MapComponent.vue'));
const mapConfig = ref({ isShowMap: false });