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

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文件
ExportapprovalCaseInfoShapefile = 'ExportapprovalCaseInfoShapefile',
// 查询是否有复提条件
IsReSubmit = '/api/DroneCaseInfoSingle/IsReSubmit'
IsReSubmit = '/api/DroneCaseInfoSingle/IsReSubmit',
LoadCaseInfoCXJG = '/api/DroneCaseInfoTask/LoadCaseInfoCXJG',
ImportCaseInfoCXJGShpData = '/api/DroneCaseInfoTask/ImportCaseInfoCXJGShpData',
DeleteCaseInfoCXJG = '/api/DroneCaseInfoTask/DeleteCaseInfoCXJG',
}
const typeObj = {
@ -149,9 +152,32 @@ export function ExportapprovalCaseInfoShapefile(type, params?){
responseType: 'blob',
})
}
export function IsReSubmit(params: { originalcaseno: string, subjectkey: string }){
return defHttp.get({
url: Api.IsReSubmit,
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',
// 大屏下发线索统计
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",
CopyImg = "/api/DroneCaseInfoSingle/CopyImg",
rebackzhuantipic = '/api/DroneCaseInfoSingle/rebackzhuantipic',
CopyImg = '/api/DroneCaseInfoSingle/CopyImg',
// 获取其他专题或历史线索附件
rebackzhuantifujian = "/api/DroneCaseInfoSingle/rebackzhuantifujian",
Copyfujian = "/api/DroneCaseInfoSingle/Copyfujian",
DroneCasePushToSdt="/api/DroneCaseInfoSingle/DroneCasePushToSdt",
rebackzhuantifujian = '/api/DroneCaseInfoSingle/rebackzhuantifujian',
Copyfujian = '/api/DroneCaseInfoSingle/Copyfujian',
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 });
}
export function splitCase(params){
export function splitCase(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 });
}
export function getPolygonCenter(params){
export function getPolygonCenter(params) {
return defHttp.get({ url: Api.GetPolygonCenter, params });
}
export function getUserOrgs(params){
export function getUserOrgs(params) {
return defHttp.get({ url: Api.GetUserOrgs, params });
}
export function getIssuedStatitical(params) {
return defHttp.get({
url: Api.IssuedStatitical,
@ -173,49 +175,62 @@ export function getRectificationStatitical(params) {
});
}
export function getLoadCaseImgList(params){
export function getLoadCaseImgList(params) {
return defHttp.get({
url: Api.LoadCaseImgList,
params,
});
}
export function getIntersectTif(params){
export function getIntersectTif(params) {
return defHttp.get({ url: Api.GetIntersects, params });
}
export function getNetworkType(){
return defHttp.get({ url: Api.GetNetWorkEev });
export function getNetworkType() {
return defHttp.get({ url: Api.GetNetWorkEev });
}
export function rebackzhuantipic(params:{ zhuanti, CaseId }){
return defHttp.get({
export function rebackzhuantipic(params: { zhuanti; CaseId }) {
return defHttp.get({
url: Api.rebackzhuantipic,
params
});
params,
});
}
export function CopyImg(params: { caseid, images}){
return defHttp.post({
export function CopyImg(params: { caseid; images }) {
return defHttp.post({
url: Api.CopyImg,
data:params,
});
data: params,
});
}
export function rebackzhuantifujian(params:{ zhuanti, CaseId }){
return defHttp.get({
export function rebackzhuantifujian(params: { zhuanti; CaseId }) {
return defHttp.get({
url: Api.rebackzhuantifujian,
params
});
params,
});
}
export function Copyfujian(params:string[]){
return defHttp.post({
export function Copyfujian(params: string[]) {
return defHttp.post({
url: Api.Copyfujian,
data:params,
});
data: params,
});
}
export function droneCasePushToSdt(params:any ){
return defHttp.get({
export function droneCasePushToSdt(params: any) {
return defHttp.get({
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 class="row">
<div class="row">
<div class="item" v-if="props.infoData.close_user">
<div class="label">关闭人</div>
<div class="item-value" style="flex: 2">
@ -297,8 +297,28 @@
</div>
</div>
</div>
<div style="width: 50%; height: 300px; margin-bottom: 10px">
<MapboxMap @mapOnLoad="onMapboxLoad" ref="MapboxComponent" />
<div class="map-history">
<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 class="footer">
<div class="button-div">
@ -325,11 +345,31 @@
</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>
</template>
<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 { Upload, message, Modal } from 'ant-design-vue';
import { uploadFile } from '@/api/formrender/index';
@ -343,6 +383,11 @@
import { tubanbiaoqian1Options, tubanbiaoqian2Options } from './util';
import { IsReSubmit } from '@/api/audit/index';
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 emits = defineEmits(['handleOk', 'closeModal', 'closeCase', 'reSubmit', 'changeLoading']);
@ -365,6 +410,55 @@
const caseDescription = ref(['', '']);
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(() => {
if (props.type == '违法用地') {
if (props.infoData.case_description) {
@ -479,13 +573,19 @@
originalcaseno: props.infoData.original_case_no,
subjectkey: SubjectKeyObj[props.type],
}).then((res) => {
console.log(res);
if (res) {
let caseIds = [];
if (props.type == '违法用地') {
props.infoData.case_description = caseDescription.value.join('-');
if(props.infoData.reboundcase == true && getSelectRows().length > 0){
caseIds = getSelectRows().map((item) => item.Id);
}
}
let params = {
...props.infoData,
subject: props.type,
caseIds: caseIds,
};
emits('handleOk', params);
} else {
@ -569,6 +669,11 @@
});
}
MapboxComponent.value.handlerDraw('Details', geoms, false);
if(props.infoData.reboundcase == true){
getHistoryCase(res.items).then((historyData) => {
setTableData(historyData);
});
}
} else {
geomsList.value = null;
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>

View File

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

View File

@ -87,13 +87,35 @@
>
<div class="modal-content">
<div class="handoff">
<a-button type="primary" style="margin-right: 25px" @click="prevData"></a-button>
<a-button type="primary" @click="nextData"></a-button>
<a-button type="primary" @click="prevData"></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>
<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" />
</div>
</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>
</template>
<script lang="ts" setup>
@ -113,6 +135,7 @@
import dayjs from 'dayjs';
import { nowStatusOptions } from '@/utils/global';
import { message } from 'ant-design-vue';
import HistoryListModel from '@/views/demo/tiankongdi/curbspotcity/MapList/HistoryListModel/index.vue';
const { VITE_GLOB_API_URL } = getAppEnvConfig();
@ -139,7 +162,7 @@
jibenArea2: null,
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 tablePaginationRight = ref({
current: 1,
@ -151,6 +174,14 @@
showQuickJumper: true,
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({
schemas: searchFormSchema,
labelWidth: 100,
@ -261,8 +292,8 @@
querys.startTime = dayjs(querys.startTime).format('YYYY-MM-DD');
querys.endTime = dayjs(querys.endTime).endOf('day').format('YYYY-MM-DD HH:mm:ss');
}
if(querys.tubanlaiyuan && typeof(querys.tubanlaiyuan) == 'object'){
querys.tubanlaiyuan = querys.tubanlaiyuan.join(',')
if (querys.tubanlaiyuan && typeof querys.tubanlaiyuan == 'object') {
querys.tubanlaiyuan = querys.tubanlaiyuan.join(',');
}
setLoading(true);
await loadCaseInfoTuBanList(querys).then((res) => {

View File

@ -77,10 +77,17 @@
>
<div class="modal-content">
<div class="handoff">
<a-button type="primary" style="margin-right: 25px" @click="prevData"></a-button>
<a-button type="primary" @click="nextData"></a-button>
<a-button type="primary" @click="prevData"></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>
<NewShowInfoModal :showInfoData="showInfoData" :showInfoRecord="showInfoRecord" :isAuditList="true"/>
<NewShowInfoModal
:showInfoData="showInfoData"
:showInfoRecord="showInfoRecord"
:isAuditList="true"
/>
</div>
</a-modal>
<a-modal
@ -97,6 +104,20 @@
>
<UploadModal :allTableData="allTableData" />
</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>
</template>
<script lang="ts" setup>
@ -118,6 +139,7 @@
import dayjs from 'dayjs';
import { nowStatusOptions } from '@/utils/global';
import { message } from 'ant-design-vue';
import HistoryListModel from '@/views/demo/tiankongdi/curbspotcity/MapList/HistoryListModel/index.vue';
const { VITE_GLOB_API_URL } = getAppEnvConfig();
@ -157,6 +179,14 @@
showQuickJumper: true,
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({
schemas: searchFormSchema,
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">
<a-button
type="primary"
style="margin-right: 25px;"
@click="prevData"
>上一条</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>
<Audit
v-if="handoffShow"
@ -284,6 +289,20 @@
@closeModel="closeMolder"
/>
</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>
</template>
@ -311,6 +330,10 @@ import { getDetail } from '@/api/sys/WFSchemeInfo';
import { Audit } from '@/views/demo/workflow/task/process/page';
import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
import HistoryListModel from '@/views/demo/tiankongdi/curbspotcity/MapList/HistoryListModel/index.vue';
const userStore = useUserStore()
const flowWfDataStore = flowStore();
const emits = defineEmits([
@ -335,6 +358,7 @@ const props = defineProps([
"total",
"infoDataList"
])
console.log(props)
const order = ref(0) // 0: 1: 2:
const landType = ref(0)
const orderMark = () => {
@ -379,6 +403,14 @@ const showInfoData = ref()
const streetsAreaOptions = ref([
{ label: '全部', value: '' },
])
// 线
const historyVisible = ref(false)
const historyData = ref([])
const historyView = () => {
console.log('record', showInfoData);
historyData.value = showInfoData.value;
historyVisible.value = true;
};
onMounted(() => {
getLoadStreet().then(res => {
@ -467,6 +499,9 @@ const showInfo = (item) => {
}
async function goAudit(record) {
showDataId.value = record.id
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
let data = await getDetail({ code: record.processcode });
let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData;
@ -513,6 +548,9 @@ const prevData = async () => {
type.value = record.type;
handoffShow.value = true
auditData.value = record;
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
}
const nextData = async () => {
if(nextShowDataId.value === 0){
@ -550,6 +588,9 @@ const nextData = async () => {
type.value = record.type;
handoffShow.value = true
auditData.value = record;
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
}
const closeMolder = () => {
emits('getInfoList')

View File

@ -207,13 +207,18 @@
<div class="handoff">
<a-button
type="primary"
style="margin-right: 25px;"
@click="prevData"
>上一条</a-button>
<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>
<Audit
v-if="handoffShow"
@ -226,6 +231,20 @@
@closeModel="closeMolder"
/>
</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>
</template>
@ -252,6 +271,9 @@ import { getDetail } from '@/api/sys/WFSchemeInfo';
import { Audit } from '@/views/demo/workflow/task/process/page';
import { dataProcessing, tubanlaiyuanOptions } from '@/views/demo/tiankongdi/util.ts'
import {showDrawBack, drawBackSpan} from '@/views/demo/util'
import HistoryListModel from '@/views/demo/tiankongdi/curbspotcity/MapList/HistoryListModel/index.vue';
const userStore = useUserStore()
const flowWfDataStore = flowStore();
const emits = defineEmits([
@ -318,7 +340,15 @@ const openCollect = computed(() => {
const streetsAreaOptions = ref([
{ 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(() => {
getLoadStreet().then(res => {
console.log(res)
@ -396,6 +426,9 @@ const dataListSort = (type) => {
}
async function goAudit(record) {
showDataId.value = record.id
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
let data = await getDetail({ code: record.processcode });
let scheme = JSON.parse(data.scheme.content);
let wfData = scheme.wfData;
@ -442,6 +475,9 @@ const prevData = async () => {
type.value = record.type;
handoffShow.value = true
auditData.value = record;
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
}
const nextData = async () => {
if(nextShowDataId.value === 0){
@ -479,6 +515,9 @@ const nextData = async () => {
type.value = record.type;
handoffShow.value = true
auditData.value = record;
getCaseInfoById({id:showDataId.value}).then(res => {
showInfoData.value = res
})
}
const closeMolder = () => {
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: {
clientFiles: ['./index.html', './src/{views,components}/*'],
},
port: 5173,
},
define: {
'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