“违法用地”模块持续监管新需求

main
刘妍 2026-03-24 09:15:43 +08:00
parent 864fd87ba0
commit 44817bebf7
12 changed files with 724 additions and 61 deletions

View File

@ -30,7 +30,10 @@ enum Api {
// 判读-导出shp文件 // 判读-导出shp文件
ExportapprovalCaseInfoShapefile = 'ExportapprovalCaseInfoShapefile', ExportapprovalCaseInfoShapefile = 'ExportapprovalCaseInfoShapefile',
// 查询是否有复提条件 // 查询是否有复提条件
IsReSubmit = '/api/DroneCaseInfoSingle/IsReSubmit' IsReSubmit = '/api/DroneCaseInfoSingle/IsReSubmit',
LoadCaseInfoCXJG = '/api/DroneCaseInfoTask/LoadCaseInfoCXJG',
ImportCaseInfoCXJGShpData = '/api/DroneCaseInfoTask/ImportCaseInfoCXJGShpData',
DeleteCaseInfoCXJG = '/api/DroneCaseInfoTask/DeleteCaseInfoCXJG',
} }
const typeObj = { const typeObj = {
@ -149,9 +152,32 @@ export function ExportapprovalCaseInfoShapefile(type, params?){
responseType: 'blob', responseType: 'blob',
}) })
} }
export function IsReSubmit(params: { originalcaseno: string, subjectkey: string }){ export function IsReSubmit(params: { originalcaseno: string, subjectkey: string }){
return defHttp.get({ return defHttp.get({
url: Api.IsReSubmit, url: Api.IsReSubmit,
params params
}) })
} }
export function loadCaseInfoCXJG(params: any){
return defHttp.get({
url: Api.LoadCaseInfoCXJG,
params
})
}
export function importCaseInfoCXJGShpData(params: {zipFilePath: string, srid: string}){
return defHttp.post({
url: `${Api.ImportCaseInfoCXJGShpData}?zipFilePath=${params.zipFilePath}&srid=${params.srid}`,
data: params,
})
}
export function deleteCaseInfoCXJG (id: string) {
return defHttp.post({
url: Api.DeleteCaseInfoCXJG+'?id='+id,
})
}

View File

@ -50,24 +50,27 @@ enum Api {
// 获取用户访问机构权限 // 获取用户访问机构权限
GetUserOrgs = '/api/Check/GetOrgs', GetUserOrgs = '/api/Check/GetOrgs',
// 大屏下发线索统计 // 大屏下发线索统计
IssuedStatitical = "/api/DroneScreenDisplay/CaseOffenceXiaFa", IssuedStatitical = '/api/DroneScreenDisplay/CaseOffenceXiaFa',
// 大屏核实新增统计 // 大屏核实新增统计
VerifyStatitical = "/api/DroneScreenDisplay/CaseOffenceCheckAdd", VerifyStatitical = '/api/DroneScreenDisplay/CaseOffenceCheckAdd',
// 大屏整改剩余统计 // 大屏整改剩余统计
RectificationStatitical = "/api/DroneScreenDisplay/CaseOffenceModifyRemain", RectificationStatitical = '/api/DroneScreenDisplay/CaseOffenceModifyRemain',
// 获取案件图片坐标、方位角信息 // 获取案件图片坐标、方位角信息
LoadCaseImgList = "/api/DroneCaseInfoSingle/LoadCaseImgList", LoadCaseImgList = '/api/DroneCaseInfoSingle/LoadCaseImgList',
// 获取范围内影像服务信息 // 获取范围内影像服务信息
GetIntersects = "/api/GeoTiffManager/GetIntersects", GetIntersects = '/api/GeoTiffManager/GetIntersects',
// 获取网络环境 // 获取网络环境
GetNetWorkEev = "/api/DroneCloudQuery/IsPublic", GetNetWorkEev = '/api/DroneCloudQuery/IsPublic',
// 获取其他专题或历史线索图片 // 获取其他专题或历史线索图片
rebackzhuantipic = "/api/DroneCaseInfoSingle/rebackzhuantipic", rebackzhuantipic = '/api/DroneCaseInfoSingle/rebackzhuantipic',
CopyImg = "/api/DroneCaseInfoSingle/CopyImg", CopyImg = '/api/DroneCaseInfoSingle/CopyImg',
// 获取其他专题或历史线索附件 // 获取其他专题或历史线索附件
rebackzhuantifujian = "/api/DroneCaseInfoSingle/rebackzhuantifujian", rebackzhuantifujian = '/api/DroneCaseInfoSingle/rebackzhuantifujian',
Copyfujian = "/api/DroneCaseInfoSingle/Copyfujian", Copyfujian = '/api/DroneCaseInfoSingle/Copyfujian',
DroneCasePushToSdt="/api/DroneCaseInfoSingle/DroneCasePushToSdt", DroneCasePushToSdt = '/api/DroneCaseInfoSingle/DroneCasePushToSdt',
// 查询图斑相交案件信息
GetHistoryCase = '/api/DroneCaseInfoSingle/GetHistoryCase',
GetHistoryCaseByCaseId = '/api/DroneCaseInfoSingle/GetHistoryCaseByCaseId',
} }
/** /**
@ -135,23 +138,22 @@ export function getLoadTaskIllegalDetailList(params?: taskInfoParams) {
return defHttp.get({ url: Api.LoadTaskIllegalDetailList, params }); return defHttp.get({ url: Api.LoadTaskIllegalDetailList, params });
} }
export function splitCase(params){ export function splitCase(params) {
return defHttp.post({ url: Api.SplitCase, data: params }); return defHttp.post({ url: Api.SplitCase, data: params });
} }
export function recoverCase(params){ export function recoverCase(params) {
return defHttp.post({ url: Api.RecoverCase, data: params }); return defHttp.post({ url: Api.RecoverCase, data: params });
} }
export function getPolygonCenter(params){ export function getPolygonCenter(params) {
return defHttp.get({ url: Api.GetPolygonCenter, params }); return defHttp.get({ url: Api.GetPolygonCenter, params });
} }
export function getUserOrgs(params){ export function getUserOrgs(params) {
return defHttp.get({ url: Api.GetUserOrgs, params }); return defHttp.get({ url: Api.GetUserOrgs, params });
} }
export function getIssuedStatitical(params) { export function getIssuedStatitical(params) {
return defHttp.get({ return defHttp.get({
url: Api.IssuedStatitical, url: Api.IssuedStatitical,
@ -173,49 +175,62 @@ export function getRectificationStatitical(params) {
}); });
} }
export function getLoadCaseImgList(params){ export function getLoadCaseImgList(params) {
return defHttp.get({ return defHttp.get({
url: Api.LoadCaseImgList, url: Api.LoadCaseImgList,
params, params,
}); });
} }
export function getIntersectTif(params) {
export function getIntersectTif(params){
return defHttp.get({ url: Api.GetIntersects, params }); return defHttp.get({ url: Api.GetIntersects, params });
} }
export function getNetworkType(){ export function getNetworkType() {
return defHttp.get({ url: Api.GetNetWorkEev }); return defHttp.get({ url: Api.GetNetWorkEev });
} }
export function rebackzhuantipic(params:{ zhuanti, CaseId }){ export function rebackzhuantipic(params: { zhuanti; CaseId }) {
return defHttp.get({ return defHttp.get({
url: Api.rebackzhuantipic, url: Api.rebackzhuantipic,
params params,
}); });
} }
export function CopyImg(params: { caseid, images}){ export function CopyImg(params: { caseid; images }) {
return defHttp.post({ return defHttp.post({
url: Api.CopyImg, url: Api.CopyImg,
data:params, data: params,
}); });
} }
export function rebackzhuantifujian(params:{ zhuanti, CaseId }){ export function rebackzhuantifujian(params: { zhuanti; CaseId }) {
return defHttp.get({ return defHttp.get({
url: Api.rebackzhuantifujian, url: Api.rebackzhuantifujian,
params params,
}); });
} }
export function Copyfujian(params:string[]){ export function Copyfujian(params: string[]) {
return defHttp.post({ return defHttp.post({
url: Api.Copyfujian, url: Api.Copyfujian,
data:params, data: params,
}); });
} }
export function droneCasePushToSdt(params:any ){ export function droneCasePushToSdt(params: any) {
return defHttp.get({ return defHttp.get({
url: Api.DroneCasePushToSdt, url: Api.DroneCasePushToSdt,
params params,
});
}
export function getHistoryCase(params: string[]) {
return defHttp.post({
url: Api.GetHistoryCase,
data: params,
});
}
export function getHistoryCaseByCaseId(params: string[]) {
return defHttp.post({
url: Api.GetHistoryCaseByCaseId + '?caseid=' + params.caseid,
data: params,
}); });
} }

View File

@ -244,7 +244,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="item" v-if="props.infoData.close_user"> <div class="item" v-if="props.infoData.close_user">
<div class="label">关闭人</div> <div class="label">关闭人</div>
<div class="item-value" style="flex: 2"> <div class="item-value" style="flex: 2">
@ -297,8 +297,28 @@
</div> </div>
</div> </div>
</div> </div>
<div style="width: 50%; height: 300px; margin-bottom: 10px"> <div class="map-history">
<MapboxMap @mapOnLoad="onMapboxLoad" ref="MapboxComponent" /> <div style="width: 50%; height: 300px; margin-bottom: 10px">
<MapboxMap @mapOnLoad="onMapboxLoad" ref="MapboxComponent" />
</div>
<div class="history-list" v-if="props.infoData.reboundcase == true">
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '查看',
onClick: () => {
handleView(record);
},
},
]"
/>
</template>
</template>
</BasicTable>
</div>
</div> </div>
<div class="footer"> <div class="footer">
<div class="button-div"> <div class="button-div">
@ -325,11 +345,31 @@
</div> </div>
</div> </div>
</div> </div>
<a-modal
style="width: 100vw; top: 0px; left: 0px; margin: 0px; padding: 0px"
wrap-class-name="full-modal"
v-model:open="showInfoOpen"
title="详情"
:footer="null"
:maskClosable="true"
:destroyOnClose="true"
@cancel="showInfoOpen = false"
>
<div class="modal-content">
<NewShowInfoModal
v-if="
showInfoData.hasOwnProperty('biaozhu') && [0, 1, 2].includes(showInfoData['biaozhu'])
"
:showInfoData="showInfoData"
/>
<ShowInfoModal v-else :showInfoData="showInfoData" />
</div>
</a-modal>
</a-spin> </a-spin>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { defineProps, ref, watch, onMounted, defineEmits, createVNode } from 'vue'; import { defineProps, ref, watch, onMounted, defineEmits, createVNode, computed } from 'vue';
import { PlusOutlined, CloseOutlined, ExclamationCircleOutlined } from '@ant-design/icons-vue'; import { PlusOutlined, CloseOutlined, ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { Upload, message, Modal } from 'ant-design-vue'; import { Upload, message, Modal } from 'ant-design-vue';
import { uploadFile } from '@/api/formrender/index'; import { uploadFile } from '@/api/formrender/index';
@ -343,6 +383,11 @@
import { tubanbiaoqian1Options, tubanbiaoqian2Options } from './util'; import { tubanbiaoqian1Options, tubanbiaoqian2Options } from './util';
import { IsReSubmit } from '@/api/audit/index'; import { IsReSubmit } from '@/api/audit/index';
import { SubjectKeyObj } from '@/views/demo/audit/util'; import { SubjectKeyObj } from '@/views/demo/audit/util';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getRoleListByPage, deleteRole } from '@/api/demo/system';
import ShowInfoModal from '@/views/demo/tiankongdi/curbspotcity/MapList/ShowInfoModal/index.vue';
import NewShowInfoModal from '@/views/demo/tiankongdi/curbspotcity/MapList/NewShowInfoModal/index.vue';
import { getCaseInfoById, getHistoryCase } from '@/api/tiankongdi/index';
const props = defineProps(['infoData', 'control', 'type', 'modalLoading']); const props = defineProps(['infoData', 'control', 'type', 'modalLoading']);
const emits = defineEmits(['handleOk', 'closeModal', 'closeCase', 'reSubmit', 'changeLoading']); const emits = defineEmits(['handleOk', 'closeModal', 'closeCase', 'reSubmit', 'changeLoading']);
@ -365,6 +410,55 @@
const caseDescription = ref(['', '']); const caseDescription = ref(['', '']);
const { VITE_GLOB_INFO_IMAGE_URL, VITE_GLOB_GEOSERVER_PREFECTURE_CITY } = getAppEnvConfig(); const { VITE_GLOB_INFO_IMAGE_URL, VITE_GLOB_GEOSERVER_PREFECTURE_CITY } = getAppEnvConfig();
const showInfoOpen = ref(false);
const showInfoId = ref();
const showInfoData = ref();
const [registerTable, { reload, getSelectRows, setTableData }] = useTable({
dataSource: [],
columns: [
{
title: '线索编号',
dataIndex: 'case_no',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '状态',
dataIndex: 'handle_status_name',
},
],
rowKey: 'Id',
striped: false,
rowSelection: {
type: 'checkbox',
},
//
showIndexColumn: false,
bordered: true,
pagination: false,
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
});
const handleView = (record) => {
console.log('record', record);
showInfoId.value = record.Id;
getDetailData();
};
function getDetailData() {
getCaseInfoById({ id: showInfoId.value }).then((res) => {
showInfoData.value = res;
showInfoOpen.value = true;
});
}
onMounted(() => { onMounted(() => {
if (props.type == '违法用地') { if (props.type == '违法用地') {
if (props.infoData.case_description) { if (props.infoData.case_description) {
@ -479,13 +573,19 @@
originalcaseno: props.infoData.original_case_no, originalcaseno: props.infoData.original_case_no,
subjectkey: SubjectKeyObj[props.type], subjectkey: SubjectKeyObj[props.type],
}).then((res) => { }).then((res) => {
console.log(res);
if (res) { if (res) {
let caseIds = [];
if (props.type == '违法用地') { if (props.type == '违法用地') {
props.infoData.case_description = caseDescription.value.join('-'); props.infoData.case_description = caseDescription.value.join('-');
if(props.infoData.reboundcase == true && getSelectRows().length > 0){
caseIds = getSelectRows().map((item) => item.Id);
}
} }
let params = { let params = {
...props.infoData, ...props.infoData,
subject: props.type, subject: props.type,
caseIds: caseIds,
}; };
emits('handleOk', params); emits('handleOk', params);
} else { } else {
@ -569,6 +669,11 @@
}); });
} }
MapboxComponent.value.handlerDraw('Details', geoms, false); MapboxComponent.value.handlerDraw('Details', geoms, false);
if(props.infoData.reboundcase == true){
getHistoryCase(res.items).then((historyData) => {
setTableData(historyData);
});
}
} else { } else {
geomsList.value = null; geomsList.value = null;
message.error('当前数据没有线索!'); message.error('当前数据没有线索!');
@ -668,4 +773,17 @@
} }
} }
} }
.map-history {
display: flex;
.history-list {
width: 50%;
height: 300px;
}
}
::v-deep .ant-table-container {
height: 280px;
}
::v-deep .ant-table-body {
height: 220px !important;
}
</style> </style>

View File

@ -142,6 +142,7 @@ function handleAudit(record) {
}) })
} }
const handleOk = async (params) => { const handleOk = async (params) => {
console.log('params',params)
changeLoading(true) changeLoading(true)
try { try {
const { id, case_description } = infoData.value.info const { id, case_description } = infoData.value.info

View File

@ -87,13 +87,35 @@
> >
<div class="modal-content"> <div class="modal-content">
<div class="handoff"> <div class="handoff">
<a-button type="primary" style="margin-right: 25px" @click="prevData"></a-button> <a-button type="primary" @click="prevData"></a-button>
<a-button type="primary" @click="nextData"></a-button> <a-button type="primary" @click="nextData" style="margin: 0 25px">下一条</a-button>
<a-button type="primary" @click="historyView" v-if="showInfoData.reboundcase == true"
>往期线索</a-button
>
</div> </div>
<NewShowInfoModal v-if="(showInfoData.hasOwnProperty('biaozhu') && [0, 1, 2].includes(showInfoData['biaozhu']))" :showInfoData="showInfoData" /> <NewShowInfoModal
v-if="
showInfoData.hasOwnProperty('biaozhu') && [0, 1, 2].includes(showInfoData['biaozhu'])
"
:showInfoData="showInfoData"
/>
<ShowInfoModal v-else :showInfoData="showInfoData" /> <ShowInfoModal v-else :showInfoData="showInfoData" />
</div> </div>
</a-modal> </a-modal>
<a-modal
style="width: 100vw; top: 0px; left: 0px; margin: 0px; padding: 0px"
wrap-class-name="full-modal"
v-model:open="historyVisible"
title="往期线索"
:footer="null"
:maskClosable="true"
:destroyOnClose="true"
@cancel="historyVisible = false"
>
<div class="modal-content">
<HistoryListModel :historyData="historyData" />
</div>
</a-modal>
</PageWrapper> </PageWrapper>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -113,6 +135,7 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { nowStatusOptions } from '@/utils/global'; import { nowStatusOptions } from '@/utils/global';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import HistoryListModel from '@/views/demo/tiankongdi/curbspotcity/MapList/HistoryListModel/index.vue';
const { VITE_GLOB_API_URL } = getAppEnvConfig(); const { VITE_GLOB_API_URL } = getAppEnvConfig();
@ -139,7 +162,7 @@
jibenArea2: null, jibenArea2: null,
nowStatus: undefined, nowStatus: undefined,
}); });
const newVersion = ref(dayjs('2025-07-28 23:59:59')) const newVersion = ref(dayjs('2025-07-28 23:59:59'));
const tableData = ref([]); const tableData = ref([]);
const tablePaginationRight = ref({ const tablePaginationRight = ref({
current: 1, current: 1,
@ -151,6 +174,14 @@
showQuickJumper: true, showQuickJumper: true,
total: 0, total: 0,
}); });
// 线
const historyVisible = ref(false);
const historyData = ref([]);
const historyView = () => {
console.log('record', showInfoData);
historyData.value = showInfoData.value;
historyVisible.value = true;
};
const [registerForm, { validate, getFieldsValue }] = useForm({ const [registerForm, { validate, getFieldsValue }] = useForm({
schemas: searchFormSchema, schemas: searchFormSchema,
labelWidth: 100, labelWidth: 100,
@ -261,8 +292,8 @@
querys.startTime = dayjs(querys.startTime).format('YYYY-MM-DD'); querys.startTime = dayjs(querys.startTime).format('YYYY-MM-DD');
querys.endTime = dayjs(querys.endTime).endOf('day').format('YYYY-MM-DD HH:mm:ss'); querys.endTime = dayjs(querys.endTime).endOf('day').format('YYYY-MM-DD HH:mm:ss');
} }
if(querys.tubanlaiyuan && typeof(querys.tubanlaiyuan) == 'object'){ if (querys.tubanlaiyuan && typeof querys.tubanlaiyuan == 'object') {
querys.tubanlaiyuan = querys.tubanlaiyuan.join(',') querys.tubanlaiyuan = querys.tubanlaiyuan.join(',');
} }
setLoading(true); setLoading(true);
await loadCaseInfoTuBanList(querys).then((res) => { await loadCaseInfoTuBanList(querys).then((res) => {

View File

@ -77,10 +77,17 @@
> >
<div class="modal-content"> <div class="modal-content">
<div class="handoff"> <div class="handoff">
<a-button type="primary" style="margin-right: 25px" @click="prevData"></a-button> <a-button type="primary" @click="prevData"></a-button>
<a-button type="primary" @click="nextData"></a-button> <a-button type="primary" @click="nextData" style="margin: 0 25px">下一条</a-button>
<a-button type="primary" @click="historyView" v-if="showInfoData.reboundcase == true"
>往期线索</a-button
>
</div> </div>
<NewShowInfoModal :showInfoData="showInfoData" :showInfoRecord="showInfoRecord" :isAuditList="true"/> <NewShowInfoModal
:showInfoData="showInfoData"
:showInfoRecord="showInfoRecord"
:isAuditList="true"
/>
</div> </div>
</a-modal> </a-modal>
<a-modal <a-modal
@ -97,6 +104,20 @@
> >
<UploadModal :allTableData="allTableData" /> <UploadModal :allTableData="allTableData" />
</a-modal> </a-modal>
<a-modal
style="width: 100vw; top: 0px; left: 0px; margin: 0px; padding: 0px"
wrap-class-name="full-modal"
v-model:open="historyVisible"
title="往期线索"
:footer="null"
:maskClosable="true"
:destroyOnClose="true"
@cancel="historyVisible = false"
>
<div class="modal-content">
<HistoryListModel :historyData="historyData" />
</div>
</a-modal>
</PageWrapper> </PageWrapper>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -118,6 +139,7 @@
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { nowStatusOptions } from '@/utils/global'; import { nowStatusOptions } from '@/utils/global';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import HistoryListModel from '@/views/demo/tiankongdi/curbspotcity/MapList/HistoryListModel/index.vue';
const { VITE_GLOB_API_URL } = getAppEnvConfig(); const { VITE_GLOB_API_URL } = getAppEnvConfig();
@ -157,6 +179,14 @@
showQuickJumper: true, showQuickJumper: true,
total: 0, total: 0,
}); });
// 线
const historyVisible = ref(false);
const historyData = ref([]);
const historyView = () => {
console.log('record', showInfoData);
historyData.value = showInfoData.value;
historyVisible.value = true;
};
const [registerForm, { validate, getFieldsValue }] = useForm({ const [registerForm, { validate, getFieldsValue }] = useForm({
schemas: searchFormSchema, schemas: searchFormSchema,
labelWidth: 100, labelWidth: 100,

View File

@ -0,0 +1,104 @@
<template>
<div>
<BasicTable class="w-4/4 xl:w-5/5" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
label: '查看',
onClick: () => {
handleView(record);
},
},
]"
/>
</template>
</template>
</BasicTable>
<a-modal
style="width: 100vw; top: 0px; left: 0px; margin: 0px; padding: 0px"
wrap-class-name="full-modal"
v-model:open="showInfoOpen"
title="详情"
:footer="null"
:maskClosable="true"
:destroyOnClose="true"
@cancel="showInfoOpen = false"
>
<div class="modal-content">
<NewShowInfoModal
v-if="
showInfoData.hasOwnProperty('biaozhu') && [0, 1, 2].includes(showInfoData['biaozhu'])
"
:showInfoData="showInfoData"
/>
<ShowInfoModal v-else :showInfoData="showInfoData" />
</div>
</a-modal>
</div>
</template>
<script lang="ts" setup>
import { defineProps, ref, watch, onMounted, defineEmits, createVNode, computed } from 'vue';
import ShowInfoModal from '@/views/demo/tiankongdi/curbspotcity/MapList/ShowInfoModal/index.vue';
import NewShowInfoModal from '@/views/demo/tiankongdi/curbspotcity/MapList/NewShowInfoModal/index.vue';
import { getCaseInfoById } from '@/api/tiankongdi/index';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getRoleListByPage, deleteRole } from '@/api/demo/system';
import { getHistoryCaseByCaseId } from '@/api/tiankongdi/index';
const props = defineProps(['historyData']);
const showInfoOpen = ref(false);
const showInfoId = ref();
const showInfoData = ref();
const [registerTable, { reload, getSelectRows, setTableData }] = useTable({
dataSource: [],
columns: [
{
title: '线索编号',
dataIndex: 'case_no',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '状态',
dataIndex: 'handle_status_name',
},
],
rowKey: 'id',
striped: false,
//
showIndexColumn: true,
bordered: true,
pagination: false,
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
},
});
const getList = () => {
getHistoryCaseByCaseId({ caseid: props.historyData.id }).then((res) => {
setTableData(res);
});
};
const handleView = (record) => {
showInfoId.value = record.Id;
getDetailData();
};
function getDetailData() {
getCaseInfoById({ id: showInfoId.value }).then((res) => {
showInfoData.value = res;
showInfoOpen.value = true;
});
}
onMounted(() => {
getList();
});
</script>

View File

@ -265,13 +265,18 @@
<div class="handoff"> <div class="handoff">
<a-button <a-button
type="primary" type="primary"
style="margin-right: 25px;"
@click="prevData" @click="prevData"
>上一条</a-button> >上一条</a-button>
<a-button <a-button
type="primary" type="primary"
@click="nextData" @click="nextData"
style="margin: 0 25px;"
>下一条</a-button> >下一条</a-button>
<a-button
type="primary"
@click="historyView"
v-if="showInfoData.reboundcase == true"
>往期线索</a-button>
</div> </div>
<Audit <Audit
v-if="handoffShow" v-if="handoffShow"
@ -284,6 +289,20 @@
@closeModel="closeMolder" @closeModel="closeMolder"
/> />
</a-modal> </a-modal>
<a-modal
style="width: 100vw; top: 0px; left: 0px; margin: 0px; padding: 0px"
wrap-class-name="full-modal"
v-model:open="historyVisible"
title="往期线索"
:footer="null"
:maskClosable="true"
:destroyOnClose="true"
@cancel="historyVisible = false"
>
<div class="modal-content">
<HistoryListModel :historyData="historyData" />
</div>
</a-modal>
</div> </div>
</template> </template>
@ -311,6 +330,10 @@ import { getDetail } from '@/api/sys/WFSchemeInfo';
import { Audit } from '@/views/demo/workflow/task/process/page'; import { Audit } from '@/views/demo/workflow/task/process/page';
import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts' import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util' import {showDrawBack, drawBackSpan} from '@/views/demo/util'
import HistoryListModel from '@/views/demo/tiankongdi/curbspotcity/MapList/HistoryListModel/index.vue';
const userStore = useUserStore() const userStore = useUserStore()
const flowWfDataStore = flowStore(); const flowWfDataStore = flowStore();
const emits = defineEmits([ const emits = defineEmits([
@ -335,6 +358,7 @@ const props = defineProps([
"total", "total",
"infoDataList" "infoDataList"
]) ])
console.log(props)
const order = ref(0) // 0: 1: 2: const order = ref(0) // 0: 1: 2:
const landType = ref(0) const landType = ref(0)
const orderMark = () => { const orderMark = () => {
@ -379,6 +403,14 @@ const showInfoData = ref()
const streetsAreaOptions = ref([ const streetsAreaOptions = ref([
{ label: '全部', value: '' }, { label: '全部', value: '' },
]) ])
// 线
const historyVisible = ref(false)
const historyData = ref([])
const historyView = () => {
console.log('record', showInfoData);
historyData.value = showInfoData.value;
historyVisible.value = true;
};
onMounted(() => { onMounted(() => {
getLoadStreet().then(res => { getLoadStreet().then(res => {
@ -467,6 +499,9 @@ const showInfo = (item) => {
} }
async function goAudit(record) { async function goAudit(record) {
showDataId.value = record.id showDataId.value = record.id
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
let data = await getDetail({ code: record.processcode }); let data = await getDetail({ code: record.processcode });
let scheme = JSON.parse(data.scheme.content); let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData; let wfData = scheme.wfData;
@ -513,6 +548,9 @@ const prevData = async () => {
type.value = record.type; type.value = record.type;
handoffShow.value = true handoffShow.value = true
auditData.value = record; auditData.value = record;
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
} }
const nextData = async () => { const nextData = async () => {
if(nextShowDataId.value === 0){ if(nextShowDataId.value === 0){
@ -550,6 +588,9 @@ const nextData = async () => {
type.value = record.type; type.value = record.type;
handoffShow.value = true handoffShow.value = true
auditData.value = record; auditData.value = record;
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
} }
const closeMolder = () => { const closeMolder = () => {
emits('getInfoList') emits('getInfoList')

View File

@ -207,13 +207,18 @@
<div class="handoff"> <div class="handoff">
<a-button <a-button
type="primary" type="primary"
style="margin-right: 25px;"
@click="prevData" @click="prevData"
>上一条</a-button> >上一条</a-button>
<a-button <a-button
type="primary" type="primary"
@click="nextData" @click="nextData"
style="margin: 0 25px;"
>下一条</a-button> >下一条</a-button>
<a-button
type="primary"
@click="historyView"
v-if="showInfoData.reboundcase == true"
>往期线索</a-button>
</div> </div>
<Audit <Audit
v-if="handoffShow" v-if="handoffShow"
@ -226,6 +231,20 @@
@closeModel="closeMolder" @closeModel="closeMolder"
/> />
</a-modal> </a-modal>
<a-modal
style="width: 100vw; top: 0px; left: 0px; margin: 0px; padding: 0px"
wrap-class-name="full-modal"
v-model:open="historyVisible"
title="往期线索"
:footer="null"
:maskClosable="true"
:destroyOnClose="true"
@cancel="historyVisible = false"
>
<div class="modal-content">
<HistoryListModel :historyData="historyData" />
</div>
</a-modal>
</div> </div>
</template> </template>
@ -252,6 +271,9 @@ import { getDetail } from '@/api/sys/WFSchemeInfo';
import { Audit } from '@/views/demo/workflow/task/process/page'; import { Audit } from '@/views/demo/workflow/task/process/page';
import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts' import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util' import {showDrawBack, drawBackSpan} from '@/views/demo/util'
import HistoryListModel from '@/views/demo/tiankongdi/curbspotcity/MapList/HistoryListModel/index.vue';
const userStore = useUserStore() const userStore = useUserStore()
const flowWfDataStore = flowStore(); const flowWfDataStore = flowStore();
const emits = defineEmits([ const emits = defineEmits([
@ -318,7 +340,15 @@ const openCollect = computed(() => {
const streetsAreaOptions = ref([ const streetsAreaOptions = ref([
{ label: '全部', value: '' }, { label: '全部', value: '' },
]) ])
// 线
const historyVisible = ref(false)
const historyData = ref([])
const showInfoData = ref()
const historyView = () => {
console.log('record', showInfoData);
historyData.value = showInfoData.value;
historyVisible.value = true;
};
onMounted(() => { onMounted(() => {
getLoadStreet().then(res => { getLoadStreet().then(res => {
console.log(res) console.log(res)
@ -396,6 +426,9 @@ const dataListSort = (type) => {
} }
async function goAudit(record) { async function goAudit(record) {
showDataId.value = record.id showDataId.value = record.id
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
let data = await getDetail({ code: record.processcode }); let data = await getDetail({ code: record.processcode });
let scheme = JSON.parse(data.scheme.content); let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData; let wfData = scheme.wfData;
@ -442,6 +475,9 @@ const prevData = async () => {
type.value = record.type; type.value = record.type;
handoffShow.value = true handoffShow.value = true
auditData.value = record; auditData.value = record;
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
} }
const nextData = async () => { const nextData = async () => {
if(nextShowDataId.value === 0){ if(nextShowDataId.value === 0){
@ -479,6 +515,9 @@ const nextData = async () => {
type.value = record.type; type.value = record.type;
handoffShow.value = true handoffShow.value = true
auditData.value = record; auditData.value = record;
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
} }
const closeMolder = () => { const closeMolder = () => {
emits('getInfoList') emits('getInfoList')

View File

@ -0,0 +1,188 @@
<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="preview"></a-button> -->
<!-- <a-button type="primary" @click="showProgress"></a-button> -->
<!-- <a-button type="primary" @click="downloadTemplate"></a-button> -->
<a-upload :accept="'.zip'" :showUploadList="false" :custom-request="customRequest">
<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'">
<TableAction
:actions="[
{
// icon: 'ant-design:ellipsis-outlined',
label: '删除',
onClick: deleteOperation.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
</PageWrapper>
</template>
<script lang="ts" setup>
import { ref, h } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PageWrapper } from '@/components/Page';
import { uploadFile } from '@/api/formrender/index';
import {
loadCaseInfoCXJG,
importCaseInfoCXJGShpData,
deleteCaseInfoCXJG,
} from '@/api/audit/index';
import { getAppEnvConfig } from '@/utils/env';
import { Tag } from 'ant-design-vue';
import axios from 'axios';
import { useMessage } from '@/hooks/web/useMessage';
const { VITE_GLOB_API_URL } = getAppEnvConfig();
const { createConfirm, createMessage } = useMessage();
const picihao = ref();
const columns = [
{
title: '线索编号',
dataIndex: 'case_no',
width: 200,
},
{
title: '线索来源',
dataIndex: 'tubanlaiyuan',
},
{
title: '县',
dataIndex: 'countyname',
},
{
title: '镇',
dataIndex: 'streetname',
},
{
title: '村',
dataIndex: 'communityname',
},
{
title: '持续监管',
dataIndex: 'chixujianguan',
customRender: ({ record }) => {
const { chixujianguan } = record;
if (chixujianguan == 1) {
return h(Tag, { color: 'green' }, () => '是');
} else {
return h(Tag, { color: 'yellow' }, () => '否');
}
return h(Tag, {}, () => chixujianguan);
},
},
];
const [registerTable, { reload, expandAll, getForm }] = useTable({
title: '',
api: loadCaseInfoCXJG,
columns,
rowKey: 'id',
//
showIndexColumn: false,
// 使
useSearchForm: true,
//
showTableSetting: true,
bordered: true,
formConfig: {
labelWidth: 120,
schemas: [
{
field: 'caseno',
label: '线索编号',
component: 'Input',
colProps: { span: 8 },
},
],
},
//
handleSearchInfoFn(info) {
return info;
},
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
// slots: { customRender: 'action' },
fixed: undefined,
},
pagination: {
defaultPageSize: 15,
},
});
const customRequest = (file) => {
console.log('handleCustomRequest', file);
const formData = new FormData();
formData.append('files', file.file);
uploadFile(formData).then((res) => {
importCaseInfoCXJGShpData({
zipFilePath: res[0].filePath.replace(/\\/g, '/'),
srid: '4326',
}).then((resultRes) => {
console.log('resultRes', resultRes);
picihao.value = resultRes;
reload();
});
});
};
const deleteOperation = (record) => {
console.log('deleteOperation', record);
createConfirm({
iconType: 'info',
title: '删除',
content: '确定要删除当前线索吗',
onOk: async () => {
deleteCaseInfoCXJG(record.id).then((res) => {
if (res) {
createMessage.success('删除成功');
reload();
} else {
createMessage.error('删除失败');
}
});
},
});
};
const downloadSHP = () => {
axios({
method: 'post',
url: VITE_GLOB_API_URL + '/api/DroneCaseInfoSingle/ExportCaseInfoCXJGsqShapefile',
headers: {
'X-Token': localStorage.getItem('X-Token'),
},
responseType: 'blob',
}).then((res) => {
const elink = document.createElement('a');
elink.download = '图斑分割矢量数据' + new Date().getTime() + '.zip';
elink.style.display = 'none';
elink.href = URL.createObjectURL(res.data);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href);
document.body.removeChild(elink);
});
};
</script>
<style lang="scss">
.reSubmitInput {
border: 1px solid;
width: 100%;
height: 35px;
border-radius: 5px;
padding: 0px 10px;
border-color: #000;
transition: 0.2s;
&:focus {
border-color: #6db8ff;
}
}
</style>

View File

@ -45,6 +45,7 @@ export default defineApplicationConfig({
warmup: { warmup: {
clientFiles: ['./index.html', './src/{views,components}/*'], clientFiles: ['./index.html', './src/{views,components}/*'],
}, },
port: 5173,
}, },
define: { define: {
'process.env': { 'process.env': {

View File

@ -0,0 +1,69 @@
// vite.config.ts
import { defineApplicationConfig } from "file:///E:/%E6%96%B0%E6%9E%B6%E6%9E%84%E9%A1%B9%E7%9B%AE/%E8%B4%A2%E6%BA%90%E4%B8%80%E4%BD%93%E5%8C%96/main/CaiYuanYiTiHua/internal/vite-config/dist/index.mjs";
var vite_config_default = defineApplicationConfig({
overrides: {
optimizeDeps: {
include: [
"echarts/core",
"echarts/charts",
"echarts/components",
"echarts/renderers",
"qrcode",
"@iconify/iconify",
"ant-design-vue/es/locale/zh_CN",
"ant-design-vue/es/locale/en_US",
"@/../lib/vform/designer.umd.js",
"jquery"
]
},
build: {
/* 其他build生产打包配置省略 */
//...
target: "esnext",
// chunkSizeWarningLimit:1500,
commonjsOptions: {
include: /node_modules|lib/
//这里记得把lib目录加进来否则生产打包会报错
}
},
server: {
proxy: {
"/basic-api": {
target: "http://localhost:3000",
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp(`^/basic-api`), "")
// only https
// secure: false
},
"/upload": {
target: "http://localhost:3300/upload",
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp(`^/upload`), "")
}
},
warmup: {
clientFiles: ["./index.html", "./src/{views,components}/*"]
},
port: 5173
},
define: {
"process.env": {
BASE_URL: "/"
}
},
css: {
preprocessorOptions: {
less: {
javascriptEnabled: true
}
}
},
plugins: []
}
});
export {
vite_config_default as default
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxcdTY1QjBcdTY3QjZcdTY3ODRcdTk4NzlcdTc2RUVcXFxcXHU4RDIyXHU2RTkwXHU0RTAwXHU0RjUzXHU1MzE2XFxcXG1haW5cXFxcQ2FpWXVhbllpVGlIdWFcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFx1NjVCMFx1NjdCNlx1Njc4NFx1OTg3OVx1NzZFRVxcXFxcdThEMjJcdTZFOTBcdTRFMDBcdTRGNTNcdTUzMTZcXFxcbWFpblxcXFxDYWlZdWFuWWlUaUh1YVxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovJUU2JTk2JUIwJUU2JTlFJUI2JUU2JTlFJTg0JUU5JUExJUI5JUU3JTlCJUFFLyVFOCVCNCVBMiVFNiVCQSU5MCVFNCVCOCU4MCVFNCVCRCU5MyVFNSU4QyU5Ni9tYWluL0NhaVl1YW5ZaVRpSHVhL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQXBwbGljYXRpb25Db25maWcgfSBmcm9tICdAdmJlbi92aXRlLWNvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUFwcGxpY2F0aW9uQ29uZmlnKHtcbiAgb3ZlcnJpZGVzOiB7XG4gICAgb3B0aW1pemVEZXBzOiB7XG4gICAgICBpbmNsdWRlOiBbXG4gICAgICAgICdlY2hhcnRzL2NvcmUnLFxuICAgICAgICAnZWNoYXJ0cy9jaGFydHMnLFxuICAgICAgICAnZWNoYXJ0cy9jb21wb25lbnRzJyxcbiAgICAgICAgJ2VjaGFydHMvcmVuZGVyZXJzJyxcbiAgICAgICAgJ3FyY29kZScsXG4gICAgICAgICdAaWNvbmlmeS9pY29uaWZ5JyxcbiAgICAgICAgJ2FudC1kZXNpZ24tdnVlL2VzL2xvY2FsZS96aF9DTicsXG4gICAgICAgICdhbnQtZGVzaWduLXZ1ZS9lcy9sb2NhbGUvZW5fVVMnLFxuICAgICAgICAnQC8uLi9saWIvdmZvcm0vZGVzaWduZXIudW1kLmpzJyxcbiAgICAgICAgJ2pxdWVyeScsXG4gICAgICBdLFxuICAgIH0sXG4gICAgYnVpbGQ6IHtcbiAgICAgIC8qIFx1NTE3Nlx1NEVENmJ1aWxkXHU3NTFGXHU0RUE3XHU2MjUzXHU1MzA1XHU5MTREXHU3RjZFXHU3NzAxXHU3NTY1ICovXG4gICAgICAvLy4uLlxuICAgICAgdGFyZ2V0OiAnZXNuZXh0JyxcbiAgICAgIC8vIGNodW5rU2l6ZVdhcm5pbmdMaW1pdDoxNTAwLFxuICAgICAgY29tbW9uanNPcHRpb25zOiB7XG4gICAgICAgIGluY2x1ZGU6IC9ub2RlX21vZHVsZXN8bGliLywgLy9cdThGRDlcdTkxQ0NcdThCQjBcdTVGOTdcdTYyOEFsaWJcdTc2RUVcdTVGNTVcdTUyQTBcdThGREJcdTY3NjVcdUZGMENcdTU0MjZcdTUyMTlcdTc1MUZcdTRFQTdcdTYyNTNcdTUzMDVcdTRGMUFcdTYyQTVcdTk1MTlcdUZGMDFcdUZGMDFcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIHByb3h5OiB7XG4gICAgICAgICcvYmFzaWMtYXBpJzoge1xuICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcsXG4gICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxuICAgICAgICAgIHdzOiB0cnVlLFxuICAgICAgICAgIHJld3JpdGU6IChwYXRoKSA9PiBwYXRoLnJlcGxhY2UobmV3IFJlZ0V4cChgXi9iYXNpYy1hcGlgKSwgJycpLFxuICAgICAgICAgIC8vIG9ubHkgaHR0cHNcbiAgICAgICAgICAvLyBzZWN1cmU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgICcvdXBsb2FkJzoge1xuICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzMwMC91cGxvYWQnLFxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICB3czogdHJ1ZSxcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYF4vdXBsb2FkYCksICcnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB3YXJtdXA6IHtcbiAgICAgICAgY2xpZW50RmlsZXM6IFsnLi9pbmRleC5odG1sJywgJy4vc3JjL3t2aWV3cyxjb21wb25lbnRzfS8qJ10sXG4gICAgICB9LFxuICAgICAgcG9ydDogNTE3MyxcbiAgICB9LFxuICAgIGRlZmluZToge1xuICAgICAgJ3Byb2Nlc3MuZW52Jzoge1xuICAgICAgICBCQVNFX1VSTDogJy8nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNzczoge1xuICAgICAgcHJlcHJvY2Vzc29yT3B0aW9uczoge1xuICAgICAgICBsZXNzOiB7XG4gICAgICAgICAgamF2YXNjcmlwdEVuYWJsZWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcGx1Z2luczogW1xuICAgIF0sXG4gIH0sXG59KTtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBa1gsU0FBUywrQkFBK0I7QUFFMVosSUFBTyxzQkFBUSx3QkFBd0I7QUFBQSxFQUNyQyxXQUFXO0FBQUEsSUFDVCxjQUFjO0FBQUEsTUFDWixTQUFTO0FBQUEsUUFDUDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQTtBQUFBLE1BR0wsUUFBUTtBQUFBO0FBQUEsTUFFUixpQkFBaUI7QUFBQSxRQUNmLFNBQVM7QUFBQTtBQUFBLE1BQ1g7QUFBQSxJQUNGO0FBQUEsSUFDQSxRQUFRO0FBQUEsTUFDTixPQUFPO0FBQUEsUUFDTCxjQUFjO0FBQUEsVUFDWixRQUFRO0FBQUEsVUFDUixjQUFjO0FBQUEsVUFDZCxJQUFJO0FBQUEsVUFDSixTQUFTLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLGFBQWEsR0FBRyxFQUFFO0FBQUE7QUFBQTtBQUFBLFFBRy9EO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDVCxRQUFRO0FBQUEsVUFDUixjQUFjO0FBQUEsVUFDZCxJQUFJO0FBQUEsVUFDSixTQUFTLENBQUMsU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPLFVBQVUsR0FBRyxFQUFFO0FBQUEsUUFDNUQ7QUFBQSxNQUNGO0FBQUEsTUFDQSxRQUFRO0FBQUEsUUFDTixhQUFhLENBQUMsZ0JBQWdCLDRCQUE0QjtBQUFBLE1BQzVEO0FBQUEsTUFDQSxNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sZUFBZTtBQUFBLFFBQ2IsVUFBVTtBQUFBLE1BQ1o7QUFBQSxJQUNGO0FBQUEsSUFDQSxLQUFLO0FBQUEsTUFDSCxxQkFBcUI7QUFBQSxRQUNuQixNQUFNO0FBQUEsVUFDSixtQkFBbUI7QUFBQSxRQUNyQjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxTQUFTLENBQ1Q7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K