徐景良 2025-02-21 14:39:10 +08:00
commit f320438374
41 changed files with 715 additions and 453 deletions

View File

@ -27,6 +27,8 @@ enum Api {
LoadDroneCaseInfoTaskByUser = '/api/DroneCaseInfoTask/LoadDroneCaseInfoTaskByUser',
// 判读-预览最后一次数据
LoadCaseImportInfoLast = '/api/DroneCaseInfoTask/LoadCaseImportInfoLast',
// 判读-导出shp文件
ExportapprovalCaseInfoShapefile = 'ExportapprovalCaseInfoShapefile'
}
const typeObj = {
@ -34,8 +36,8 @@ const typeObj = {
'非法采矿': '/api/DroneCaseInfoMinerals/',
'卫片下发': '/api/DroneCaseInfoSatellite/',
'耕地非粮化': '/api/DroneCaseInfoFLH/',
'重点问题I类': '/api/DroneCaseInfoZdwt1/',
'重点问题II类': '/api/DroneCaseInfoZdwt2/',
'重点问题类': '/api/DroneCaseInfoZdwt1/',
'重点问题类': '/api/DroneCaseInfoZdwt2/',
'巡察审计': '/api/DroneCaseInfoXcsj/',
'生态保护红线监管': '/api/DroneCaseInfoSTHX/',
'生态修复': '/api/DroneCaseInfoSTXF/',
@ -45,8 +47,8 @@ const infoShpData = {
'非法采矿': 'UpdateCaseInfoShpDataMinerals',
'卫片下发': 'UpdateCaseInfoShpDataWPXF',
'耕地非粮化': '',
'重点问题I类': 'UpdateCaseInfoShpDataZDWT1',
'重点问题II类': 'UpdateCaseInfoShpDataZDWT2',
'重点问题类': 'UpdateCaseInfoShpDataZDWT1',
'重点问题类': 'UpdateCaseInfoShpDataZDWT2',
'巡察审计': '',
}
const closeCaseApi = {
@ -54,8 +56,8 @@ const closeCaseApi = {
'非法采矿': 'CloseMineralCaseInfo',
'卫片下发': 'CloseCaseInfoSatellite',
'耕地非粮化': 'CloseCaseInfoFLH',
'重点问题I类': 'CloseCaseInfoZdwt1',
'重点问题II类': 'CloseCaseInfoZdwt2',
'重点问题类': 'CloseCaseInfoZdwt1',
'重点问题类': 'CloseCaseInfoZdwt2',
'巡察审计': 'CloseCaseInfoXCSJ',
'生态保护红线监管': 'CloseSTHXCaseInfo',
'生态修复': 'CloseSTXFCaseInfo',
@ -135,4 +137,15 @@ export function LoadCaseImportInfoLast(params: { subjectname: string, page?: num
url: Api.LoadCaseImportInfoLast,
params
})
}
export function ExportapprovalCaseInfoShapefile(type, params?){
let url = typeObj[type] + Api.ExportapprovalCaseInfoShapefile
if(params){
url = url + `?nowStatus=${params.nowStatus}`
}
return defHttp.post({
url,
params,
responseType: 'blob',
})
}

View File

@ -3,19 +3,19 @@ enum Api {
// 非粮化 接收办理 和图斑调整
LoadCaiKuangTaskList = '/api/DroneCaseInfoFLH/LoadFLHTaskList',
// 添加收藏
AddCaiKuangTaskFavorite = '/api/DroneCaseInfoFLH/LoadFLHTaskList',
AddCaiKuangTaskFavorite = '/api/DroneCaseInfoFLH/AddFLHTaskFavorite',
// 取消收藏
DeleteCaiKuangTaskCase = '/api/DroneCaseInfoFLH/DeleteFLHTaskCase',
// 非粮化 图斑列表
LoadCaseInfoWpxfTuBanList = '/api/DroneCaseInfoFLH/LoadCaseInfoTuBanList',
LoadCaseInfoWpxfTuBanList = '/api/DroneCaseInfoFLH/LoadCaseInfoTuBanListV1',
// 非粮化 填报审核第一层
LoadReportCaseCount = '/api/DroneCaseInfoFLH/LoadTaskCount',
LoadReportCaseCount = '/api/DroneCaseInfoFLH/LoadTaskCountV1',
// 非粮化 填报审核第二层
LoadTaskDetailList = '/api/DroneCaseInfoFLH/LoadTaskDetailList',
LoadTaskDetailList = '/api/DroneCaseInfoFLH/LoadTaskDetailListV1',
// 非粮化 整改审核第一层
LoadReformCaseCount = '/api/DroneCaseInfoFLH/LoadTaskCount',
LoadReformCaseCount = '/api/DroneCaseInfoFLH/LoadTaskCountV1',
// 非粮化 整改审核第二层
LoadTaskIllegalDetailList = '/api/DroneCaseInfoFLH/LoadTaskIllegalDetailList',
LoadTaskIllegalDetailList = '/api/DroneCaseInfoFLH/LoadTaskIllegalDetailListV1',
// 图斑详情
GetCaseInfoById = '/api/DroneCaseInfoFLH/GetCaseInfoById',
// 非粮化 图斑调整 更新图斑行政区划

View File

@ -440,9 +440,9 @@ export function LoadCaseInfoById(params: { id: string }) {
params,
});
}
export function UpdateCaseInfo(data) {
export function UpdateCaseInfo(data,shppath='') {
return defHttp.post({
url: Api.UpdateCaseInfo,
url: `${Api.UpdateCaseInfo}?shppath=${shppath}`,
data,
});
}

View File

@ -59,6 +59,8 @@ enum Api {
MainCloseCaseInfo = '/api/DroneCaseInfoMinerals/CloseMineralCaseInfo',
// 判读-导入数据
MainUpdateCaseInfoShpData = '/api/DroneCaseInfoTask/ImportMineralShpData',
// 判读-导出SHP
MainExportapprovalCaseInfoShapefile = '/api/DroneCaseInfoMinerals/ExportApprovalCaseInfoShapefile'
}
export function LoadCaiKuangTaskList(params) {
@ -161,4 +163,15 @@ export function MainUpdateCaseInfoShpData(params: {zipFilePath: string, srid: st
url: `${Api.MainUpdateCaseInfoShpData}?zipFilePath=${params.zipFilePath}&srid=${params.srid}&subjectname=${params.subjectname}`,
data: params,
})
}
}
export function MainExportapprovalCaseInfoShapefile(params?){
let url: string = Api.MainExportapprovalCaseInfoShapefile
if(params){
url = url + `?nowStatus=${params.nowStatus}`
}
return defHttp.post({
url,
params,
responseType: 'blob',
})
}

View File

@ -64,6 +64,100 @@
}
const initMap = () => {
let mapDataSources: any =
networkType.value == 'LAN'
? {
'raster-tiles': {
type: 'raster',
tiles: [
`http://t0.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
],
tileSize: 256,
minzoom: 1,
maxzoom: 17,
},
'raster-tiles-font': {
type: 'raster',
tiles: [
`https://t0.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
],
tileSize: 256,
},
yaogan: {
type: 'raster',
tiles: [VITE_GLOB_YAOGANYINGXIANG_SERVER],
tileSize: 256,
minzoom: 16,
maxzoom: 24,
},
yingxiang: {
type: 'raster',
tiles: [VITE_GLOB_YINGXIANG_SERVER],
tileSize: 256,
minzoom: 16,
maxzoom: 24,
},
}
: {
'raster-tiles': {
type: 'raster',
tiles: [
`http://t0.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
],
tileSize: 256,
minzoom: 1,
maxzoom: 17,
},
'raster-tiles-font': {
type: 'raster',
tiles: [
`https://t0.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
],
tileSize: 256,
},
};
let mapDataLayers: any =
networkType.value == 'LAN'
? [
{
id: 'tdt-vec-tiles',
type: 'raster',
source: 'raster-tiles-font',
},
{
id: 'tdt-img-tiles',
type: 'raster',
source: 'raster-tiles',
},
{
id: 'yaogan',
type: 'raster',
source: 'yaogan',
minzoom: 9,
maxzoom: 15,
},
{
id: 'yingxiang',
type: 'raster',
source: 'yingxiang',
minzoom: 13,
maxzoom: 24,
},
]
: [
{
id: 'tdt-vec-tiles',
type: 'raster',
source: 'raster-tiles-font',
},
{
id: 'tdt-img-tiles',
type: 'raster',
source: 'raster-tiles',
},
];
return new mapboxgl.Map({
container: mapId,
language: 'zh-cmn',
@ -71,72 +165,8 @@
style: {
glyphs: 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf',
version: 8,
sources: {
'raster-tiles': {
type: 'raster',
tiles: [
`http://t0.tianditu.gov.cn/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
],
tileSize: 256,
minzoom: 1,
maxzoom: 17,
},
'raster-tiles-font': {
type: 'raster',
tiles: [
`https://t0.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=${MapboxConfig.TDT_TOKEN}`,
],
tileSize: 256,
},
yaogan: {
type: 'raster',
tiles: [VITE_GLOB_YAOGANYINGXIANG_SERVER],
tileSize: 256,
minzoom: 16,
maxzoom: 24,
},
yingxiang: {
type: 'raster',
tiles: [VITE_GLOB_YINGXIANG_SERVER],
tileSize: 256,
minzoom: 16,
maxzoom: 24,
},
},
layers: [
{
id: 'tdt-vec-tiles',
type: 'raster',
source: 'raster-tiles-font',
maxZoom: 32,
},
{
id: 'tdt-img-tiles',
type: 'raster',
source: 'raster-tiles',
maxZoom: 32,
},
{
id: 'yaogan',
type: 'raster',
source: 'yaogan',
layout: {
visibility: networkType.value == 'LAN' ? 'visible' : 'none',
},
minzoom: 9,
maxzoom: 15,
},
{
id: 'yingxiang',
type: 'raster',
source: 'yingxiang',
layout: {
visibility: networkType.value == 'LAN' ? 'visible' : 'none',
},
minzoom: 13,
maxzoom: 24,
},
],
sources: mapDataSources,
layers: mapDataLayers,
},
maxZoom: 22,
minZoom: 8,

View File

@ -353,11 +353,8 @@
//
map.addSource('radar', {
type: 'image',
url: url,
url: dataURL,
coordinates: fourpoint,
paint: {
'raster-opacity': 1,
},
});
map.addLayer({
id: 'radar-layer',

View File

@ -35,6 +35,7 @@ import { IconPicker } from '@/components/Icon';
import { CountdownInput } from '@/components/CountDown';
import { BasicTitle } from '@/components/Basic';
import { CropperAvatar } from '@/components/Cropper';
import CustomSelect from './components/CustomSelect.vue';
const componentMap = new Map<ComponentType | string, Component>();
@ -49,7 +50,7 @@ componentMap.set('ImageUpload', ImageUpload);
componentMap.set("VideoUpload",VideoUpload);
componentMap.set("FileUpload",FileUpload);
componentMap.set("Location",Location);
componentMap.set('Select', Select);
componentMap.set('Select', CustomSelect);
componentMap.set('ApiSelect', ApiSelect);
componentMap.set('ApiTree', ApiTree);
componentMap.set('TreeSelect', TreeSelect);

View File

@ -0,0 +1,50 @@
<script setup>
import { Select } from 'ant-design-vue'
import { computed } from 'vue'
const props = defineProps({
value: [String, Array],
mode: String,
separator: {
type: String,
default: ','
}
})
const emit = defineEmits(['update:value', 'change'])
//
const internalValue = computed({
get() {
if (['multiple', 'tags'].includes(props.mode)) {
if (typeof props.value === 'string') {
return props.value ? props.value.split(props.separator) : []
}
return props.value || []
}
return props.value
},
set(newVal) {
if (['multiple', 'tags'].includes(props.mode)) {
const strValue = Array.isArray(newVal)
? newVal.join(props.separator)
: ''
emit('update:value', strValue)
emit('change', strValue)
} else {
emit('update:value', newVal)
emit('change', newVal)
}
}
})
</script>
<template>
<Select
v-model:value="internalValue"
:mode="mode"
v-bind="$attrs"
>
<slot></slot>
</Select>
</template>

View File

@ -28,6 +28,7 @@
:formData="props.formData"
v-if="childItem"
:callModal="props.callModal"
@changeRadioVal="radioVal"
/>
</template>
</template>
@ -77,10 +78,6 @@
if (props.callModal) {
tableData.ifShow = true;
}
watch(() => childItem.value,(newValue) => {
console.log('卡片组中的嵌套卡片组Item数据进行变化', newValue)
},{immediate:true, deep:true})
const [
registerForm,
{ getFieldsValue, setFieldsValue, updateSchema, resetFields, validate, clearValidate },
@ -189,7 +186,6 @@ watch(() => childItem.value,(newValue) => {
...childElement,
show: index == 0 ? true : false,
index: element.value,
requiredString: childElement.itemProps.required,
});
if (childElement.component == 'CardGroup') {
childGourp.value.push({
@ -292,6 +288,13 @@ watch(() => childItem.value,(newValue) => {
});
return data;
}
function radioVal() {
clearValidate();
//form
setFieldsValue({
...subTableDataStore.getGroupData,
});
}
defineExpose({
verify,
changeForm,

View File

@ -91,11 +91,6 @@
const { proxy } = getCurrentInstance();
const emit = defineEmits(['getFormSuccess']);
const subTableDataStore = subTableStore();
const tabsFormRef0 = ref();
const tabsFormRef1 = ref();
const tabsFormRef2 = ref();
const tabsFormRef3 = ref();
const tabsFormRef4 = ref();
const formRef = ref();
const activeTabsKey = ref();
let formColumns: FormSchema[] = [];
@ -269,10 +264,26 @@
//
if (element.component === 'CardGroup') {
element.slot = 'CardGroup';
if (cardGroupData.value.length !== index) {
// if (cardGroupData.value.length !== index) {
// cardGroupData.value.push(null);
// }
while(cardGroupData.value.length !== index){
cardGroupData.value.push(null);
}
cardGroupData.value.push(element);
let copyElement = {...element}
copyElement.componentProps.options.forEach(option => {
option.children.forEach(item => {
item['requiredString'] = item.itemProps.required? true: false
if(item.component == "CardGroup"){
item.componentProps.options.forEach(deepOption => {
deepOption.children.forEach(deepItem => {
deepItem['requiredString'] = deepItem.itemProps.required? true: false
})
})
}
})
})
cardGroupData.value.push(copyElement);
// cardGroupData.value.push({
// ...element,
// });
@ -320,6 +331,7 @@
}
}, 10);
}
console.log(111111111111,cardGroupData.value)
}
function tabsChange(e) {
tabsKey.value = e;

View File

@ -228,5 +228,5 @@ export const isChuliOptions = [
export const keyIssusesIPatchSourceOptions = await asyncGetOptions('zd1tbly');
export const keyIssusesIIPatchSourceOptions = await asyncGetOptions('zd2tbly');
export const inspectionAuditPatchSourceOptions = await asyncGetOptions('xcsjtbly');
export const degrainingPatchSourceOptions = await asyncGetOptions('gdflhtbly');
export const degrainingPatchSourceOptions = await asyncGetOptions('gdflhbly');
export const redLinePatchSourceOptions = await asyncGetOptions('redlinetbly');

View File

@ -1,6 +1,9 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #toolbar>
<a-button type="primary" @click="downloadSHP" v-if="false">SHP</a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
@ -27,7 +30,7 @@ import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '@/components/Audit/InfoModal/index.vue'
import { columns, searchFormSchemaFunction } from '@/views/demo/audit/util';
import { LoadCaseInfoLists, GetCaseInfo } from '@/api/audit/index';
import { LoadCaseInfoLists, GetCaseInfo, ExportapprovalCaseInfoShapefile } from '@/api/audit/index';
import { useRouter } from 'vue-router';
const router = useRouter()
@ -82,4 +85,19 @@ const handleOk = () => {
const closeModal = () => {
openModal.value = false
}
const downloadSHP = () => {
let params = {
nowStatus: '已审核'
}
ExportapprovalCaseInfoShapefile(type,params).then(res => {
const elink = document.createElement('a');
elink.download = '已审核矢量数据' + new Date().getTime() + '.zip';
elink.style.display = 'none';
elink.href = URL.createObjectURL(res);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href);
document.body.removeChild(elink);
})
}
</script>

View File

@ -12,6 +12,7 @@
>
<a-button type="primary">导入</a-button>
</a-upload>
<a-button type="primary" @click="downloadSHP" v-if="['违法用地','非法采矿'].includes(type)">SHP</a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
@ -61,7 +62,15 @@ import { create, saveDraft, GetDraft } from '@/api/sys/WFProcess';
import { message, Modal, Input } from 'ant-design-vue';
import { SaveReSubmitInfo } from '@/api/demo/resubmit';
import { uploadFile } from '@/api/formrender/index';
import { LoadCaseInfoLists, GetCaseInfo, CloseCaseInfo, ImportCaseInfoShpData, UpdateCaseNoBySubject, LoadCaseImportInfoLast } from '@/api/audit/index';
import {
LoadCaseInfoLists,
GetCaseInfo,
CloseCaseInfo,
ImportCaseInfoShpData,
UpdateCaseNoBySubject,
LoadCaseImportInfoLast,
ExportapprovalCaseInfoShapefile,
} from '@/api/audit/index';
import { useRouter } from 'vue-router';
const router = useRouter()
@ -259,6 +268,18 @@ const preview = () => {
openImportModal.value = true
})
}
const downloadSHP = () => {
ExportapprovalCaseInfoShapefile(type).then(res => {
const elink = document.createElement('a');
elink.download = '待审核矢量数据' + new Date().getTime() + '.zip';
elink.style.display = 'none';
elink.href = URL.createObjectURL(res);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href);
document.body.removeChild(elink);
})
}
</script>
<style lang="scss">

View File

@ -8,8 +8,8 @@ export const typenameKey = {
'非法采矿': 'kctubanleixing',
'卫片下发': 'kctubanleixing',
'耕地非粮化': 'gdflhtblx',
'重点问题I类': 'zd1tblx',
'重点问题II类': 'zd2tblx',
'重点问题类': 'zd1tblx',
'重点问题类': 'zd2tblx',
'巡察审计': 'xcsjtblx',
'生态保护红线监管': 'stbhhxjgtblx',
'生态修复': 'stxftblx',
@ -20,8 +20,8 @@ export const SubjectKeyObj = {
'非法采矿': 'Subject_FFCK', //非法采矿
'卫片下发': 'Subject_WPCK', //非法采矿(卫片)
'耕地非粮化': 'Subject_GDFLH', //耕地非粮化
'重点问题I类': 'Subject_ZDWT1', //重点问题I
'重点问题II类': 'Subject_ZDWT2', //重点问题II
'重点问题Ⅰ类': 'Subject_ZDWT1', //重点问题Ⅰ
'重点问题Ⅱ类': 'Subject_ZDWT2', //重点问题Ⅱ
'生态保护红线监管': 'Subject_STHX', //生态保护红线监管
'生态修复': 'Subject_STXF', //生态修复
}
@ -31,8 +31,8 @@ export const codeObj = {
'非法采矿': '100001',
'卫片下发': '0000003',
'耕地非粮化': '0000004',
'重点问题I类': '0000005',
'重点问题II类': '0000006',
'重点问题类': '0000005',
'重点问题类': '0000006',
'生态保护红线监管': '0000007',
'生态修复': '0000008',
}

View File

@ -166,25 +166,22 @@
<div class="info-data-label">下发</div>
<div class="info-data-data">{{ item.totaltask }}</div>
</div>
<!-- <div style="width: 1px;margin-right:27px;margin-left:31px;background-color:#EDEDED;height: 15px;"></div> -->
<div class="info-data-item">
<div class="info-data-label">接收</div>
<div class="info-data-data">{{ item.receivetask }}</div>
</div>
<div class="info-data-item">
<!-- <div class="info-data-item">
<div class="info-data-label">非农化</div>
<div class="info-data-data">{{ item.nonfoodcase }}</div>
</div>
<!-- <div style="width: 1px;margin-right:15px;margin-left:30px;background-color:#EDEDED;height: 15px;"></div> -->
<div class="info-data-item">
<div class="info-data-label">举证合法</div>
<div class="info-data-data">{{ item.legalcase }}</div>
</div>
<!-- <div style="width: 1px;margin-right:18px;margin-left:17px;background-color:#EDEDED;height: 15px;"></div> -->
<div class="info-data-item">
<div class="info-data-label">举证其他</div>
<div class="info-data-data">{{ item.ilegalcase }}</div>
</div>
</div> -->
</div>
</div>
<div v-else class="no-data">

View File

@ -28,7 +28,7 @@
:options="props.batchOptions"
/>
</div>
<div class="screen-item" style="margin-right:13px;">
<!-- <div class="screen-item" style="margin-right:13px;">
<div class="screen-item-label">举证</div>
<a-select
allowClear
@ -36,10 +36,9 @@
v-model:value="params.is_build_name"
:options="markTypeOptions"
/>
</div>
</div> -->
<div class="screen-item" style="margin-right:10px;">
<!-- <div class="screen-item-label">图斑号</div> -->
<a-input style="width:270px;" allowClear v-model:value="params.geomid" class="item-input" placeholder="请输入图斑编号"/>
<a-input style="width:455px;" allowClear v-model:value="params.geomid" class="item-input" placeholder="请输入图斑编号"/>
</div>
<div class="screen-item" style="display: flex; justify-content: end;margin-bottom: 0px;">
<a-button type="primary" class="item-button" :icon="h(SearchOutlined)" @click="query"></a-button>

View File

@ -98,7 +98,7 @@
<a-tab-pane
key="2"
v-if="!['建设用地', '推堆土'].includes(props.showInfoData.typename)"
tab="线索填报"
tab="图斑填报"
force-render
>
<a-descriptions
@ -110,22 +110,16 @@
'word-break': 'break-all',
}"
>
<a-descriptions-item label="判定结果">{{
getLabel('is_illegal', props.showInfoData.is_illegal)
<a-descriptions-item label="发生时间">{{
props.showInfoData.fashengshijian
}}</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.is_illegal == 1" label="项目名称">{{
props.showInfoData.xiangmumc
<a-descriptions-item label="图斑类型">{{
getLabel('tianbaoleixing', props.showInfoData.tianbaoleixing)
}}</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.is_illegal == 1" label="项目主体">{{
props.showInfoData.xiangmuzhuti
<a-descriptions-item label="现场情况">{{
props.showInfoData.pandingyijushuoming
}}</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.is_illegal == 1" label="实际用途">{{
props.showInfoData.actual_use_to
}}</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.is_illegal == 1" label="违法类型">{{
getLabel('weifaleixing', props.showInfoData.weifaleixing)
}}</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.is_illegal == 1" label="附件">
<a-descriptions-item label="附件">
<a-image-preview-group :preview="{ getContainer }">
<template v-for="(item, itemIndex) in fujianList" :key="itemIndex">
<a-image
@ -146,54 +140,6 @@
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.is_illegal == 0" label="附件">
<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="hanlderPreViewFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.is_illegal == 2" label="实际用途">{{
getLabel('qita_use_to', props.showInfoData.qita_use_to)
}}</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.is_illegal == 2" label="附件">
<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="hanlderPreViewFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item label="判定依据说明">{{
props.showInfoData.pandingyijushuoming
}}</a-descriptions-item>
<a-descriptions-item label="照片">
<div class="image-div">
<a-image-preview-group
@ -227,124 +173,8 @@
</a-tab-pane>
<a-tab-pane
key="3"
tab="整改情况"
v-if="
props.showInfoData.is_illegal == 1 &&
props.showInfoData.weifaleixing == 1 &&
!['建设用地', '推堆土'].includes(props.showInfoData.typename)
"
>
<a-descriptions
:column="2"
bordered
:contentStyle="{
'text-align': 'center',
'min-width': '250px',
'word-break': 'break-all',
}"
>
<a-descriptions-item label="整改措施">{{
getLabel('measure_name', props.showInfoData.measure_name)
}}</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.measure_name == 0" label="附件">
<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="hanlderPreViewFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.measure_name == 0" label="照片">
<div class="image-div">
<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="props.showInfoData.measure_name == 1" label="附件">
<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="hanlderPreViewFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.measure_name == 1" label="照片">
<div class="image-div">
<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="办理人">{{
props.showInfoData.transactor_name
}}</a-descriptions-item>
<a-descriptions-item label="办理时间">{{
props.showInfoData.transact_time
}}</a-descriptions-item>
</a-descriptions>
</a-tab-pane>
<a-tab-pane
key="4"
v-if="!['建设用地', '推堆土'].includes(props.showInfoData.typename)"
tab="审核"
tab="填报审核"
>
<a-divider>区县审核</a-divider>
<a-descriptions
@ -391,7 +221,128 @@
<a-descriptions-item label="审核时间">{{
props.showInfoData.hexiaotime?.split('.')[0]
}}</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.weifaleixing == 0" label="无人机复飞照片">
</a-descriptions>
</a-tab-pane>
<a-tab-pane
key="4"
v-if="!['建设用地', '推堆土'].includes(props.showInfoData.typename)"
tab="图斑整改"
>
<a-descriptions
:column="2"
bordered
:contentStyle="{
'text-align': 'center',
'min-width': '250px',
'word-break': 'break-all',
}"
>
<a-descriptions-item label="整改措施">{{
getLabel('measure_name', props.showInfoData.measure_name)
}}</a-descriptions-item>
<a-descriptions-item v-if="props.showInfoData.measure_name == 0" label="整改后照片">
<div class="image-div">
<a-image-preview-group
:preview="{
getContainer: getContainer,
onVisibleChange: handlerImageChange,
}"
>
<template v-for="(imageItem, imageIndex) in chaichufugenghoupicList" :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 v-if="props.showInfoData.measure_name == 1" label="整改后附件">
<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="hanlderPreViewFile(item)"
/>
{{ item }}
</div>
</template>
</a-image-preview-group>
</a-descriptions-item>
<a-descriptions-item label="办理人">{{
props.showInfoData.transactor_name
}}</a-descriptions-item>
<a-descriptions-item label="办理时间">{{
props.showInfoData.transact_time
}}</a-descriptions-item>
</a-descriptions>
</a-tab-pane>
<a-tab-pane
key="5"
v-if="!['建设用地', '推堆土'].includes(props.showInfoData.typename)"
tab="整改审核"
>
<a-divider>区县审核</a-divider>
<a-descriptions
:column="2"
bordered
:contentStyle="{
'text-align': 'center',
'min-width': '250px',
'word-break': 'break-all',
}"
>
<a-descriptions-item label="审核结果">{{
props.showInfoData.zg_xjshenhejieguo
}}</a-descriptions-item>
<a-descriptions-item label="审核意见">{{
props.showInfoData.zg_xianjiyijian
}}</a-descriptions-item>
<a-descriptions-item label="审核人">{{
props.showInfoData.zg_xianjiren
}}</a-descriptions-item>
<a-descriptions-item label="审核时间">{{
props.showInfoData.zg_xjshenheshijian
}}</a-descriptions-item>
</a-descriptions>
<a-divider>市局审核</a-divider>
<a-descriptions
:column="2"
bordered
:contentStyle="{
'text-align': 'center',
'min-width': '250px',
'word-break': 'break-all',
}"
>
<a-descriptions-item label="审核结果">{{
props.showInfoData.zg_sjshenhejieguo
}}</a-descriptions-item>
<a-descriptions-item label="审核意见">{{
props.showInfoData.zg_shijiyijian
}}</a-descriptions-item>
<a-descriptions-item label="审核人">{{
props.showInfoData.zg_shijiren
}}</a-descriptions-item>
<a-descriptions-item label="审核时间">{{
props.showInfoData.zg_sjshenheshijian?.split('.')[0]
}}</a-descriptions-item>
<!-- <a-descriptions-item v-if="props.showInfoData.weifaleixing == 0" label="无人机复飞照片">
<div class="image-div">
<a-image-preview-group
:preview="{
@ -411,7 +362,7 @@
</template>
</a-image-preview-group>
</div>
</a-descriptions-item>
</a-descriptions-item> -->
</a-descriptions>
</a-tab-pane>
</a-tabs>
@ -447,11 +398,11 @@
import { getAppEnvConfig } from '@/utils/env';
import {
mapTypeOptions,
measureOptions,
illegalTypeList,
resultOptions,
qitaUseTOOptions,
} from '@/utils/global';
import { tubanleixingOptions, measureOptions } from './util'
const { createMessage } = useMessage();
const { VITE_GLOB_INFO_IMAGE_URL } = getAppEnvConfig();
@ -589,6 +540,9 @@
case 'qita_use_to':
result = qitaUseTOOptions;
break;
case 'tianbaoleixing':
result = tubanleixingOptions;
break;
}
result.forEach((item) => {
if (item.value == value) {

View File

@ -0,0 +1,8 @@
import { asyncGetOptions } from '@/utils/global'
export const tubanleixingOptions = await asyncGetOptions('gdflhtianbaolx');
export const measureOptions = [
{ label: '恢复耕种条件', value: 0 },
{ label: '办理相关手续', value: 1 },
];

View File

@ -291,6 +291,7 @@
sortType: infoScreenData.value.sort,
order: infoScreenData.value.order,
type: infoScreenData.value.type,
receive:1,
};
Object.keys(params).forEach((key) => {
if (params[key] !== '' && params[key] !== null) {

View File

@ -179,62 +179,19 @@
<div class="info-data-label">下发</div>
<div class="info-data-data">{{ item.totaltask }}</div>
</div>
<!-- <div
style="
width: 1px;
margin-right: 15px;
margin-left: 15px;
background-color: #ededed;
height: 15px;
"
></div> -->
<div class="info-data-item">
<div class="info-data-label">接收</div>
<div class="info-data-data">{{ item.receivetask }}</div>
</div>
<!-- <div
style="
width: 1px;
margin-right: 15px;
margin-left: 15px;
background-color: #ededed;
height: 15px;
"
></div> -->
<!-- <div class="info-data-item">
<div class="info-data-label">非粮化</div>
<div class="info-data-data">{{ item.nonfoodcase }}</div>
</div> -->
<!-- <div
style="
width: 1px;
margin-right: 15px;
margin-left: 15px;
background-color: #ededed;
height: 15px;
"
></div> -->
<div class="info-data-item">
<div class="info-data-label">拆除复耕</div>
<div class="info-data-data">{{ item.rehabilitationcase }}</div>
</div>
<!-- <div
style="
width: 1px;
margin-right: 15px;
margin-left: 15px;
background-color: #ededed;
height: 15px;
"
></div> -->
<div class="info-data-item">
<div class="info-data-label">补办手续</div>
<div class="info-data-data">{{ item.makeupcase }}</div>
</div>
</div> -->
</div>
<!-- <div class="data-div">
<spam style="color: #086dec">{{ item.count }}</spam>
</div> -->
</div>
<div v-else class="no-data">
<a-empty :image="simpleImage" />

View File

@ -28,7 +28,7 @@
:options="props.batchOptions"
/>
</div>
<div class="screen-item" style="margin-right:13px;">
<!-- <div class="screen-item" style="margin-right:13px;">
<div class="screen-item-label">举证</div>
<a-select
allowClear
@ -36,10 +36,9 @@
v-model:value="params.is_build_name"
:options="markTypeOptions"
/>
</div>
</div> -->
<div class="screen-item" style="margin-right:10px;">
<!-- <div class="screen-item-label">图斑号</div> -->
<a-input style="width:270px;" allowClear v-model:value="params.geomid" class="item-input" placeholder="请输入图斑编号"/>
<a-input style="width:455px;" allowClear v-model:value="params.geomid" class="item-input" placeholder="请输入图斑编号"/>
</div>
<div class="screen-item" style="display: flex; justify-content: end;margin-bottom: 0px;">
<a-button type="primary" class="item-button" :icon="h(SearchOutlined)" @click="query"></a-button>

View File

@ -100,7 +100,7 @@
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { LoadCaseInfoWpxfTuBanList } from '@/api/degraining/index.ts';
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { columns, searchFormSchema } from './patchsummary.data';
import { columns, searchFormSchema, nowStatusOptions } from './patchsummary.data';
import { getAppEnvConfig } from '@/utils/env';
import axios from 'axios';
import ShowInfoModal from '@/views/demo/degraining/curbspotcity/MapList/ShowInfoModal/index.vue';
@ -108,7 +108,6 @@
import { dataProcessingCount } from '@/views/demo/tiankongdi/util';
import { BasicForm, useForm } from '@/components/Form';
import { PageWrapper } from '@/components/Page';
import { nowStatusOptions } from '@/utils/global';
import { message } from 'ant-design-vue';
const { VITE_GLOB_API_URL } = getAppEnvConfig();
@ -187,10 +186,10 @@
let url = '';
let fileName = '';
if (exportType == 'excel') {
url = VITE_GLOB_API_URL + '/api/DroneCaseInfoFLH/ExportCaseInfoTuBanList';
url = VITE_GLOB_API_URL + '/api/DroneCaseInfoFLH/ExportCaseInfoTuBanListV1';
fileName = '图斑汇总统计报表' + new Date().getTime() + '.xls';
} else if (exportType == 'shp') {
url = VITE_GLOB_API_URL + '/api/DroneCaseInfoFLH/ExportCaseInfoShapefile';
url = VITE_GLOB_API_URL + '/api/DroneCaseInfoFLH/ExportCaseInfoShapefileV1';
fileName = '图斑汇总矢量数据' + new Date().getTime() + '.zip';
}
axios({

View File

@ -5,9 +5,11 @@ import {
patchSourceOptions,
yearOptions,
markTypeOptions,
nowStatusOptions,
mapTypeOptions,
} from '@/utils/global';
import { asyncGetOptions } from '@/utils/global'
export const nowStatusOptions = await asyncGetOptions('gdflhdqzt');
export const columns: BasicColumn[] = [
{
@ -61,30 +63,21 @@ export const columns: BasicColumn[] = [
dataIndex: 'handlestatusname',
width: 80,
},
{
title: '判定结果',
dataIndex: 'isillegal',
width: 80,
},
{
title: '下发时间',
dataIndex: 'identificationtime',
},
{
title: '项目名称',
dataIndex: 'xiangmumc',
title: '发生时间',
dataIndex: 'fashengshijian',
},
{
title: '项目主体',
dataIndex: 'xiangmuzhuti',
title: '填报类型',
dataIndex: 'tianbaoleixingname',
},
{
title: '实际用途',
dataIndex: 'actualuseto',
},
{
title: '违法类型',
dataIndex: 'weifaleixing',
title: '现场情况',
dataIndex: 'pandingyijushuoming',
},
{
title: '整改措施',
@ -110,7 +103,7 @@ export const searchFormSchema: FormSchema[] = [
componentProps: ({ formModel }) => {
return {
api: getLoad,
params: { code: 'gdflhtbly' },
params: { code: 'gdflhbly' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
@ -118,15 +111,6 @@ export const searchFormSchema: FormSchema[] = [
};
},
},
{
field: 'picihao',
label: '批次',
component: 'Select',
colProps: { span: 4 },
componentProps: {
options: [],
},
},
{
field: 'typename',
label: '图斑类型',
@ -135,7 +119,7 @@ export const searchFormSchema: FormSchema[] = [
componentProps: ({ formModel }) => {
return {
api: getLoad,
params: { code: 'gdflhtblx' },
params: { code: 'gdflhblx' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
@ -144,12 +128,19 @@ export const searchFormSchema: FormSchema[] = [
},
},
{
field: 'isBuildName',
label: '标注类型',
component: 'Select',
field: 'tianbaoleixing',
label: '填报类型',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: {
options: markTypeOptions,
componentProps: ({ formModel }) => {
return {
api: getLoad,
params: { code: 'gdflhtianbaolx' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{
@ -191,44 +182,34 @@ export const searchFormSchema: FormSchema[] = [
{
field: 'nowStatus',
label: '当前状态',
component: 'Select',
componentProps: {
options: nowStatusOptions,
},
// component: 'ApiSelect',
// componentProps: ({ formModel }) => {
// return {
// api: getLoad,
// params: { code: 'gdflhdqzt' },
// // 接口参数
// resultField: 'result',
// labelField: 'itemName',
// valueField: 'itemValue',
// };
// },
colProps: { span: 4 },
slot: 'dangqianzhuangtai',
},
{
field: 'isIllegal',
label: '判定结果',
component: 'Select',
colProps: { span: 4 },
componentProps: {
options: mapTypeOptions,
},
},
{
field: 'weifaleixing',
label: '违法类型',
component: 'Select',
colProps: { span: 4 },
componentProps: {
options: [
{ label: '非农化违法用地', value: '0' },
{ label: '非粮化违法用地', value: '1' },
],
},
},
{
field: 'measureName',
label: '整改措施',
component: 'Select',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: {
options: [
{ label: '拆除复耕', value: '0' },
{ label: '补办手续', value: '1' },
],
componentProps: ({ formModel }) => {
return {
api: getLoad,
params: { code: 'gdflhzgcs' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
@ -251,12 +232,6 @@ export const searchFormSchema: FormSchema[] = [
colProps: { span: 4 },
slot: 'jibennongtianmianji',
},
{
field: 'originalcaseno',
label: '标识号',
component: 'Input',
colProps: { span: 3 },
},
{
field: '[startTime, endTime]',
label: '下发时间',

View File

@ -1,6 +1,9 @@
<template>
<PageWrapper dense contentFullHeight fixedHeight contentClass="flex">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #toolbar>
<a-button type="primary" @click="downloadSHP">SHP</a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
@ -27,7 +30,7 @@ import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import InfoModal from '../mainaudit/InfoModal/index.vue'
import { columns, searchFormSchema } from './util';
import { MainLoadCaseInfoLists, MainGetCaseInfo } from '@/api/illegalmining/index';
import { MainLoadCaseInfoLists, MainGetCaseInfo, MainExportapprovalCaseInfoShapefile } from '@/api/illegalmining/index';
const infoData = ref({})
const openModal = ref(false)
@ -78,4 +81,19 @@ const handleOk = () => {
const closeModal = () => {
openModal.value = false
}
const downloadSHP = () => {
let params = {
nowStatus: '已审核'
}
MainExportapprovalCaseInfoShapefile(params).then(res => {
const elink = document.createElement('a');
elink.download = '已审核矢量数据' + new Date().getTime() + '.zip';
elink.style.display = 'none';
elink.href = URL.createObjectURL(res);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href);
document.body.removeChild(elink);
})
}
</script>

View File

@ -12,6 +12,7 @@
>
<a-button type="primary">导入</a-button>
</a-upload>
<a-button type="primary" @click="downloadSHP">SHP</a-button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
@ -60,7 +61,7 @@ import { create, saveDraft, GetDraft } from '@/api/sys/WFProcess';
import { message, Modal, Input } from 'ant-design-vue';
import { SaveReSubmitInfo } from '@/api/demo/resubmit';
import { uploadFile } from '@/api/formrender/index';
import { MainLoadCaseInfoLists, MainGetCaseInfo, MainCloseCaseInfo, MainUpdateCaseInfoShpData } from '@/api/illegalmining/index';
import { MainLoadCaseInfoLists, MainGetCaseInfo, MainCloseCaseInfo, MainUpdateCaseInfoShpData, MainExportapprovalCaseInfoShapefile } from '@/api/illegalmining/index';
import ImportDataModal from '@/components/Audit/ImportDataModal/index.vue'
import { UpdateCaseNoBySubject, LoadCaseImportInfoLast } from '@/api/audit/index';
@ -250,6 +251,18 @@ const preview = () => {
openImportModal.value = true
})
}
const downloadSHP = () => {
MainExportapprovalCaseInfoShapefile().then(res => {
const elink = document.createElement('a');
elink.download = '待审核矢量数据' + new Date().getTime() + '.zip';
elink.style.display = 'none';
elink.href = URL.createObjectURL(res);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href);
document.body.removeChild(elink);
})
}
</script>
<style lang="scss">

View File

@ -384,7 +384,7 @@
async function getCaseImgList() {
imageList.value = await getLoadCaseImgList({
caseid: props.showInfoData.id,
category: '重点问题I类',
category: '重点问题类',
});
MapboxComponent.value.handlerLoadPictureAzimuth(imageList.value);

View File

@ -368,7 +368,7 @@
async function getCaseImgList() {
imageList.value = await getLoadCaseImgList({
caseid: props.showInfoData.id,
category: '重点问题II类',
category: '重点问题类',
});
MapboxComponent.value.handlerLoadPictureAzimuth(imageList.value);

View File

@ -21,7 +21,7 @@
allowClear
style="width: 142px"
v-model:value="props.patchSource"
:options="patchSourceOptions"
:options="tubanlaiyuanOptions"
@change="
(value) => {
emits('auditProgressScreenChange', value, 'patchSource');
@ -144,7 +144,7 @@
<div class="progress-div">
<div class="progress-label reviewed-color" style="width: 70px">待审核</div>
<div class="progress-data" style="width: 40px">
<span style="color: #ec7908">{{ item.verifytask }}</span>
<span style="color: #ec7908">{{ item.verifytask1 }}</span>
</div>
</div>
</div>
@ -247,7 +247,7 @@
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { flowStore } from '@/store/modules/flow';
import { Audit } from '@/views/demo/workflow/task/process/page';
import { dataProcessing } from '@/views/demo/tiankongdi/util'
import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util'
import { useUserStore } from '@/store/modules/user'

View File

@ -16,7 +16,7 @@
allowClear
style="width:130px;"
v-model:value="params.tubanlaiyuan"
:options="patchSourceOptions"
:options="tubanlaiyuanOptions"
/>
</div>
<div class="screen-item" style="margin-bottom:15px;">
@ -217,7 +217,7 @@
import { useUserStore } from '@/store/modules/user.ts'
import { SearchOutlined, RollbackOutlined } from '@ant-design/icons-vue';
import { patchSourceOptions, auditMapStatusOptions } from '@/utils/global'
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()

View File

@ -1,5 +1,6 @@
import { BasicColumn, FormSchema } from '@/components/Table';
import { getChildrenTree } from '@/api/demo/system';
import { getLoad } from '@/api/sys/sysDataItemDetail';
import {
patchSourceOptions,
yearOptions,
@ -104,10 +105,17 @@ export const searchFormSchema: FormSchema[] = [
{
field: 'tubanlaiyuan',
label: '图斑来源',
component: 'Select',
component: 'ApiSelect',
colProps: { span: 4 },
componentProps: {
options: patchSourceOptions,
componentProps: ({ formModel }) => {
return {
api: getLoad,
params: { code: 'wfydtbly' },
// 接口参数
resultField: 'result',
labelField: 'itemName',
valueField: 'itemValue',
};
},
},
{

View File

@ -122,13 +122,14 @@
proj4.defs(
'EPSG:4548',
'+proj=tmerc +lat_0=37.56666666666666 +lon_0=126.93333333333333 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +towgs84=-119.819,-78.445,-112.283,0,0,0,0 +units=m +no_defs',
'+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs',
);
// -----------------------------------------------------------------------------------------------
const [registerTable, { reload, getSelectRows }] = useTable({
title: '影像管理',
api: GeoTiffManagerLoadPage,
// dataSource: data,
columns: columns,
useSearchForm: true,
formConfig: {
@ -285,6 +286,13 @@
numValue = 1,
) {
if (bbox) {
// bboxESG:4326
let bboxSplit = bbox.split(',');
const result1 = isProjectedCoordinates(parseFloat(bboxSplit[0]), parseFloat(bboxSplit[1]));
if (result1) {
const result2 = isProjectedCoordinates(parseFloat(bboxSplit[2]), parseFloat(bboxSplit[3]));
bbox = result1.concat(result2).toString();
}
GeoTiffManagerUpdateLayerGroupThumb({
layerGroups: layerNames,
bbox: bbox,

View File

@ -1,6 +1,6 @@
<template>
<div style="padding: 20px;">
<a-descriptions bordered>
<a-descriptions :column="3" bordered>
<a-descriptions-item label="图斑编号">{{case_no}}</a-descriptions-item>
<a-descriptions-item label="图斑描述">{{case_description}}</a-descriptions-item>
<a-descriptions-item label="区县">{{countyname}}</a-descriptions-item>
@ -17,17 +17,48 @@
<a-descriptions-item label="生态保护红线面积">{{shengtaibaohuhongxian_area}}</a-descriptions-item>
<a-descriptions-item label="国土空间规划面积">{{guotukongjianguihua_area}}</a-descriptions-item>
<a-descriptions-item label="无人机编号">{{drone_no}}</a-descriptions-item>
<a-descriptions-item label="备注" :span="2">{{remark}}</a-descriptions-item>
<a-descriptions-item label="图片" :span="4">
<div class="image-div">
<a-image-preview-group>
<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}`"
></a-image>
</template>
</a-image-preview-group>
</div>
</a-descriptions-item>
</a-descriptions>
</div>
</template>
<script setup lang="ts">
import {defineProps} from "vue"
import {defineProps, computed} from "vue"
import { getAppEnvConfig } from '@/utils/env';
const props = defineProps(['info'])
const { VITE_GLOB_INFO_IMAGE_URL } = getAppEnvConfig();
const { id, case_no, case_description, countyid,
countyname, streetid, streetname,communityid, communityname, address, drone_no, lng, lat,
area, nongyongdi_area, gengdi_area, yongjiujibennongtian_area, zhongdianquyu_area, shengtaibaohuhongxian_area,
guotukongjianguihua_area } = props.info
guotukongjianguihua_area, remark, casepic } = props.info
const casepicList = computed(() => {
return casepic ? casepic.split(',') : [];
});
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
.image-div {
min-width: 340px;
max-height: 220px;
overflow: auto;
}
:deep(.ant-image) {
margin-right: 10px;
margin-bottom: 10px;
}
</style>

View File

@ -3,7 +3,7 @@
<div class="row">
<div class="item" style="flex: 1;">
<div class="label">图斑编号</div>
<div class="item-input"><a-input v-model:value="props.infoResult.case_no"/></div>
<div class="item-input"><a-input v-model:value="props.infoResult.case_no" disabled/></div>
</div>
<div class="item" style="flex: 1;">
<div class="label">图斑描述</div>
@ -96,22 +96,83 @@
<div class="label">无人机编号</div>
<div class="item-input"><a-input v-model:value="props.infoResult.drone_no"/></div>
</div>
<div class="item" style="width: 33.3%;">
<div class="label">备注</div>
<div class="item-input"><a-input v-model:value="props.infoResult.remark"/></div>
</div>
</div>
<div class="row">
<div class="item" style="width: 100%;">
<div class="label">图片</div>
<div style="flex:9;display:flex;">
<a-image-preview-group>
<div class="video-item" v-for="(item, index) in fileList" :key="index" style="display: inline-block;position:relative;">
<div class="video-delete-btn" @click="handlerDelete(index)">
<CloseOutlined />
</div>
<a-image :src="item.url" style="width:100px;height:100px;" />
</div>
</a-image-preview-group>
<Upload
list-type="picture-card"
:showUploadList="false"
:custom-request="customRequest"
@change="handleChange"
>
<div>
<plus-outlined />
<div style="margin-top: 8px">Upload</div>
</div>
</Upload>
</div>
</div>
</div>
<div class="row">
<div class="item" style="width: 100%;">
<div class="label">上传SHP</div>
<div style="flex:9;display:flex;">
<a-upload
v-model:file-list="shpList"
accept=".zip"
:maxCount="1"
:custom-request="shpCustomRequest"
>
<a-button>
<upload-outlined></upload-outlined>
上传SHP
</a-button>
<template #itemRender="{ file, actions }">
<a-space>
<span>{{ file.name }}</span>
</a-space>
</template>
</a-upload>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { defineProps, onMounted, ref } from "vue"
import { defineProps, onMounted, ref, watch, defineEmits } from "vue"
import { getChildrenTree } from '@/api/demo/system'
const props = defineProps(['infoData','infoResult'])
import { getAppEnvConfig } from '@/utils/env';
import axios from "axios";
import { Upload } from 'ant-design-vue';
import { PlusOutlined, CloseOutlined, ExclamationCircleOutlined, UploadOutlined } from '@ant-design/icons-vue';
import { uploadFile } from '@/api/formrender/index';
const props = defineProps(['infoData','infoResult','shppath'])
const emits = defineEmits(['update:shppath'])
const countyOptions = ref([])
const streetOptions = ref([])
const communityOptions = ref([])
const fileList = ref<any>([])
const shpList = ref([])
onMounted(() => {
const { id, case_no, case_description, countyid,
countyname, streetid, streetname,communityid, communityname, address, drone_no, lng, lat,
area, nongyongdi_area, gengdi_area, yongjiujibennongtian_area, zhongdianquyu_area, shengtaibaohuhongxian_area,
guotukongjianguihua_area} = props.infoData
guotukongjianguihua_area, remark, casepic} = props.infoData
getChildrenTree({parentId:371300}).then(res =>{
countyOptions.value = res.map(item => {
return {
@ -160,7 +221,56 @@ onMounted(() => {
props.infoResult.zhongdianquyu_area = zhongdianquyu_area
props.infoResult.shengtaibaohuhongxian_area = shengtaibaohuhongxian_area
props.infoResult.guotukongjianguihua_area = guotukongjianguihua_area
props.infoResult.remark = remark
props.infoResult.casepic = casepic
const { VITE_GLOB_INFO_IMAGE_URL } = getAppEnvConfig();
props.infoData.casepic && props.infoData.casepic.split(',').forEach(item => {
fileList.value.push({
uid: '-1',
name: item,
status: 'done',
url: VITE_GLOB_INFO_IMAGE_URL + '/' + item,
})
})
})
watch(() => fileList.value.length, (val) => {
props.infoResult.casepic = fileList.value.map(item => item.name).join(',')
})
const handleChange = (info) => {
if (info.file.status !== 'uploading') {
}
if (info.file.status === 'done') {
} else if (info.file.status === 'error') {
}
};
const customRequest = (file) => {
console.log('handleCustomRequest',file)
const { VITE_GLOB_INFO_IMAGE_URL } = getAppEnvConfig();
const formData = new FormData()
formData.append('files', file.file)
axios({
method: 'post',
url: `${VITE_GLOB_INFO_IMAGE_URL}/api/Platform/Upload`,
params: { project: 'DroneEnforcement'},
data: formData,
headers: {
'Content-type': 'multipart/form-data',
},
}).then(res => {
let data = res.data.result
console.log(res)
fileList.value?.push({
uid: '-1',
name: data[0].filePath,
status: 'done',
url: VITE_GLOB_INFO_IMAGE_URL + '/' + data[0].filePath,
});
})
}
const handlerDelete = (index) => {
fileList.value.splice(index, 1);
}
const changeCounty = (val) => {
props.infoResult.countyname = countyOptions.value.find(item => item.value == val)?.label
props.infoResult.streetid = ''
@ -193,6 +303,13 @@ const changeStreet = (val) => {
const changeCommunity = (val) => {
props.infoResult.communityname = communityOptions.value.find(item => item.value == val)?.label
}
const shpCustomRequest = (file) => {
const formData = new FormData()
formData.append('files', file.file)
uploadFile(formData).then(res => {
emits('update:shppath',res[0].filePath)
})
}
</script>
<style lang="scss" scoped>
.content{
@ -214,4 +331,21 @@ const changeCommunity = (val) => {
}
}
}
:deep(.ant-image){
margin-right: 10px;
margin-bottom: 10px;
}
.video-delete-btn {
position: absolute;
top: 0px;
right: 10px;
width: 30px;
height: 30px;
border-bottom-left-radius: 80%;
background: rgb(0 0 0 / 20%);
color: #fff;
line-height: 30px;
text-align: center;
z-index: 999;
}
</style>

View File

@ -31,7 +31,7 @@
:destroyOnClose="true"
@ok="submit"
@cancel="closeInfoModal">
<InfoModal :infoData="infoData" :infoResult="infoResult"/>
<InfoModal :infoData="infoData" :infoResult="infoResult" v-model:shppath="shppath"/>
</a-modal>
<a-modal
width="50%"
@ -59,6 +59,7 @@ const historyModal = ref(false)
const historyCaseId = ref()
const infoData = ref({})
const infoResult = ref({})
const shppath = ref()
const [registerTable, { setTableData, reload, clearSelectedRowKeys, setPagination, setLoading }] =
useTable({
title: '图斑汇总',
@ -98,8 +99,7 @@ const getHistoryList = (record) => {
}
const submit = () => {
console.log('submit',infoResult.value)
UpdateCaseInfo(infoResult.value).then(res => {
UpdateCaseInfo(infoResult.value,shppath.value).then(res => {
console.log(res)
message.success('修改成功')
closeInfoModal()

View File

@ -21,7 +21,7 @@
allowClear
style="width: 142px"
v-model:value="props.patchSource"
:options="patchSourceOptions"
:options="tubanlaiyuanOptions"
@change="
(value) => {
emits('auditProgressScreenChange', value, 'patchSource');
@ -198,7 +198,7 @@
import { getDetail } from '@/api/sys/WFSchemeInfo';
import { flowStore } from '@/store/modules/flow';
import { Audit } from '@/views/demo/workflow/task/process/page';
import { dataProcessing } from '@/views/demo/tiankongdi/util'
import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util'
import { useUserStore } from '@/store/modules/user'
const props = defineProps([

View File

@ -16,7 +16,7 @@
allowClear
style="width:130px;"
v-model:value="params.tubanlaiyuan"
:options="patchSourceOptions"
:options="tubanlaiyuanOptions"
/>
</div>
<div class="screen-item" style="margin-bottom:15px;">
@ -216,7 +216,7 @@
import { useUserStore } from '@/store/modules/user.ts'
import { SearchOutlined, RollbackOutlined } from '@ant-design/icons-vue';
import { patchSourceOptions, auditMapStatusOptions } from '@/utils/global'
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()

View File

@ -17,7 +17,7 @@
allowClear
style="width: 130px"
v-model:value="infoScreenData.tubanlaiyuan"
:options="patchSourceOptions"
:options="tubanlaiyuanOptions"
@change="(value) => mapListScreenChange(value, 'tubanlaiyuan')"
/>
</div>
@ -336,7 +336,7 @@ import {recoverCase} from '@/api/tiankongdi'
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 { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts'
import { getChildrenTree } from '@/api/demo/system';

View File

@ -28,7 +28,7 @@
allowClear
style="width:120px;"
v-model:value="props.infoScreenData.patchSource"
:options="patchSourceOptions"
:options="tubanlaiyuanOptions"
@change="(value) => emits('mapListScreenChange',value,'patchSource')"
/>
</div>
@ -309,7 +309,7 @@ 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';
import { dataProcessing } from '@/views/demo/tiankongdi/util.ts'
import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
const userStore = useUserStore()
const flowWfDataStore = flowStore();

View File

@ -1,3 +1,4 @@
import { asyncGetOptions } from '@/utils/global'
export const dataProcessing = (value) => {
if (!value) {
return '0亩';
@ -27,3 +28,4 @@ export const dataProcessingCount = (value) => {
return Number(resultString).toFixed(2);
}
};
export const tubanlaiyuanOptions = await asyncGetOptions('wfydtbly');

View File

@ -50,8 +50,8 @@ export const SubjectKeyList = {
'违法用地(卫片)': 'Subject_WPWF',
'0000003': 'Subject_WPCK', //非法采矿(卫片)
'0000004': 'Subject_GDFLH', //耕地非粮化
'0000005': 'Subject_ZDWT1', //重点问题I
'0000006': 'Subject_ZDWT2', //重点问题II
'0000005': 'Subject_ZDWT1', //重点问题
'0000006': 'Subject_ZDWT2', //重点问题
'0000007': 'Subject_STBHHXJG', //生态保护红线监管
'0000008': 'Subject_STXF', //生态修复
}

View File

@ -165,6 +165,7 @@
<a-form-item
label=""
:class="btnVisble ? 'l-task-btns' : 'l-task-btns btn-hidden'"
v-if="formVisble"
>
<a-button
v-for="(btn, index) in designerData.taskBtns"