You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

709 lines
26 KiB
Vue

<template>
<div class="detail-container">
<div class="map-container" v-if="!props.hiddenInfoMap">
<MapboxMap
:caseno="caseInfo.case_no"
:countyname="caseInfo.countyname"
:imageList="imageList"
:geomsList="geomsList"
:mapConfig="mapConfig"
@handlerDrawComplete="handlerDrawComplete"
@mapOnLoad="onMapboxLoad"
ref="MapboxComponent"
/>
</div>
<div class="info-container" id="info-container">
<a-tabs v-model:activeKey="activeKey">
<a-tab-pane key="1" tab="线索详情">
<a-descriptions
:column="2"
bordered
:contentStyle="{
'text-align': 'center',
'min-width': '250px',
'word-break': 'break-all',
}"
>
<a-descriptions-item label="线索编号">{{ caseInfo.case_no }}</a-descriptions-item>
<a-descriptions-item label="所属年度">{{ caseInfo.syear_base }}</a-descriptions-item>
<a-descriptions-item label="接收时间">{{ caseInfo.jieshou_time }}</a-descriptions-item>
<a-descriptions-item label="发放批次">{{
caseInfo.fafangpici_base
}}</a-descriptions-item>
<a-descriptions-item label="经纬度"
>{{ caseInfo.centerlng_base }} / {{ caseInfo.centerlat_base }}</a-descriptions-item
>
<a-descriptions-item label="线索来源">{{ caseInfo.tubanlaiyuan }}</a-descriptions-item>
<a-descriptions-item label="疑似违法涉矿线索面积(亩)">{{
caseInfo.weifaarea_base
}}</a-descriptions-item>
<a-descriptions-item label="区/县">{{ caseInfo.countyname }}</a-descriptions-item>
<a-descriptions-item label="镇/街">{{ caseInfo.streetname }}</a-descriptions-item>
<a-descriptions-item label="村/社">{{ caseInfo.communityname }}</a-descriptions-item>
<a-descriptions-item label="是否符合土地利用总体规划">{{
caseInfo.tudiliyongflag_base
}}</a-descriptions-item>
<a-descriptions-item label="是否重点矿区">{{
caseInfo.zhongdianflag_base
}}</a-descriptions-item>
<a-descriptions-item label="重点矿区名称">{{
caseInfo.zhongdianname_base
}}</a-descriptions-item>
<a-descriptions-item label="是否在国家自然保护区范围内">{{
getLabel('ziranbaohuflag_base', caseInfo.ziranbaohuflag_base)
}}</a-descriptions-item>
<a-descriptions-item label="所属国家自然保护区名称">{{
caseInfo.ziranbaohuname_base
}}</a-descriptions-item>
<a-descriptions-item label="违法开采面积(亩)">{{
caseInfo.weifakaicaiarea_base
}}</a-descriptions-item>
<a-descriptions-item label="违法占地面积(亩)">{{
caseInfo.weifazhandiarea_base
}}</a-descriptions-item>
<a-descriptions-item label="基本农田面积(亩)">{{
caseInfo.jbntarea_base
}}</a-descriptions-item>
<a-descriptions-item label="耕地面积(亩)">{{
caseInfo.gengdi_area
}}</a-descriptions-item>
<a-descriptions-item label="城市开发边界面积(亩)">{{
caseInfo.cskfbjarea_base
}}</a-descriptions-item>
<a-descriptions-item label="生态保护红线面积(亩)">{{
caseInfo.stbhhxarea_base
}}</a-descriptions-item>
<a-descriptions-item label="下发时间">{{
caseInfo.xiafatime_base
}}</a-descriptions-item>
<a-descriptions-item label="到期时限">{{
caseInfo.chulishixian_base
}}</a-descriptions-item>
<a-descriptions-item label="线索描述">{{
caseInfo.miaoshu_base
}}</a-descriptions-item>
<a-descriptions-item label="线索图片">
<div class="image-div">
<a-image-preview-group
:preview="{
getContainer: getContainer,
}"
>
<template v-for="(imageItem, imageIndex) in anjianzhaopianList" :key="imageIndex">
<a-image
v-if="imageItem"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
/>
</template>
</a-image-preview-group>
</div>
</a-descriptions-item>
</a-descriptions>
</a-tab-pane>
<a-tab-pane key="2" tab="线索填报" force-render>
<a-descriptions
:column="2"
bordered
:contentStyle="{
'text-align': 'center',
'min-width': '250px',
'word-break': 'break-all',
}"
>
<a-descriptions-item label="合法性判定">{{
getLabel('hefapanding_fill', caseInfo.hefapanding_fill)
}}</a-descriptions-item>
<!-- 合法 -->
<template v-if="caseInfo.hefapanding_fill == 1">
<a-descriptions-item label="合法情形">{{
getLabel('hefaqingxing_kcfill', caseInfo.hefaqingxing_kcfill)
}}</a-descriptions-item>
<a-descriptions-item label="审批类型">{{
caseInfo.shenpitype_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="审批时间">{{
caseInfo.shenpitime_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="审批文号">{{
caseInfo.shenpinum_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="有效期">{{
caseInfo.youxiaoqi_kcfill
}}</a-descriptions-item>
</template>
<!-- 违法 -->
<template v-if="caseInfo.hefapanding_fill == 2">
<a-descriptions-item label="违法类型">{{
getLabel('weifaleixing', caseInfo.weifaleixing)
}}</a-descriptions-item>
<a-descriptions-item label="是否属于国家规划矿区">{{
caseInfo.isguihua_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="是否重大典型问题">{{
caseInfo.iszhongda_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="是否重点敏感区域范围内">{{
caseInfo.iszhongdian_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="开采主体">{{
caseInfo.kaicaizhuti_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="主体类型">{{
getLabel('zhutitype_kcfill', caseInfo.zhutitype_kcfill)
}}</a-descriptions-item>
<a-descriptions-item label="发生时间">{{
caseInfo.fashentime_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="结束时间">{{
caseInfo.endtime_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="矿种">{{
caseInfo.kuangzhong_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="开采面积(亩)">{{
caseInfo.kaicaiarea_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="方量(吨)">{{
caseInfo.fangliang_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="采出的矿产品查封方量(吨)">{{
caseInfo.chafengliang_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="采出的矿产品价值(万元)">{{
caseInfo.caichujiazhi_kcfill
}}</a-descriptions-item>
<a-descriptions-item label="是否新增">{{
caseInfo.isnewadd_kcfill
}}</a-descriptions-item>
</template>
<!-- 开采-其他 -->
<template v-if="caseInfo.hefapanding_fill == 3">
<a-descriptions-item label="是否河道采砂">{{
caseInfo.ishedaocaisha_kcfill
}}</a-descriptions-item>
</template>
<a-descriptions-item label="线索变化情况说明">{{
caseInfo.shuoming_fill
}}</a-descriptions-item>
<a-descriptions-item label="现场照片">
<div class="image-div">
<a-image-preview-group
:preview="{
getContainer: getContainer,
onVisibleChange: handlerImageChange,
}"
>
<template
v-for="(imageItem, imageIndex) in xianchangzhaopianList"
:key="imageIndex"
>
<a-image
v-if="imageItem"
@click="handlerPreviewImage(imageIndex, imageItem)"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
/>
</template>
</a-image-preview-group>
</div>
</a-descriptions-item>
<a-descriptions-item 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 }"
/>
<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="填报人">{{ caseInfo.tianbaoren_fill }}</a-descriptions-item>
<a-descriptions-item label="填报时间">{{
caseInfo.tianbaotime_fill
}}</a-descriptions-item>
</a-descriptions>
</a-tab-pane>
<a-tab-pane
key="3"
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="确认结果">{{
caseInfo.xianshenhejieguo_fill
}}</a-descriptions-item>
<a-descriptions-item label="确认意见">{{
caseInfo.xianbohuinote_fill
}}</a-descriptions-item>
<a-descriptions-item label="确认人">{{
caseInfo.xianshenheren_fill
}}</a-descriptions-item>
<a-descriptions-item label="确认时间">{{
caseInfo.xianshenhetime_fill
}}</a-descriptions-item>
<a-descriptions-item label="无人机复飞照片">
<div class="image-div">
<a-image-preview-group
:preview="{
getContainer: getContainer,
onVisibleChange: handlerImageChange,
}"
>
<template
v-for="(imageItem, imageIndex) in wrjffzhaopianList"
:key="imageIndex"
>
<a-image
v-if="imageItem"
@click="handlerPreviewImage(imageIndex, imageItem)"
width="100px"
height="100px"
:src="`${VITE_GLOB_INFO_IMAGE_URL}/${imageItem}`"
:preview="{
getContainer,
}"
/>
</template>
</a-image-preview-group>
</div>
</a-descriptions-item>
</a-descriptions>
</a-tab-pane>
</a-tabs>
<div style="height: 40px;display: flex;align-items: center;" v-if="props.selectImportent">
<a-button type="primary" @click="changeImportent()">重点线索</a-button>
</div>
</div>
<!-- File Preview && Download Start -->
<a-modal
v-model:open="previewFileModalVisible"
style="width: 100vw"
title="文件预览"
wrap-class-name="full-modal"
>
<FilePreview v-if="previewFileModalVisible" :fileUrl="previewFileUrl"></FilePreview>
<template #footer>
<a-button key="cancel" @click="handleCancelPreviewFile"></a-button>
<a-button key="confirm" type="primary" @click="handlerDownloadFle"></a-button>
</template>
</a-modal>
<!--File Preview && Download End -->
</div>
</template>
<script setup lang="ts">
import { defineProps, ref, computed, onBeforeMount, onMounted, watch } from 'vue';
import MapboxMap from '@/components/MapboxMaps/MapComponent.vue';
import { getConfig, getGeom } from '@/api/sys/layerManagement';
import { getLoadCaseImgList } from '@/api/tiankongdi';
import { useMessage } from '@/hooks/web/useMessage';
import axios from 'axios';
import Icon from '@/components/Icon/Icon.vue';
import { getAppEnvConfig } from '@/utils/env';
import { asyncGetOptions } from '@/utils/global';
import { MineralsNewGetCaseInfoById } from '@/api/illegalmining/index';
import { AddImportantXianSuo } from '@/api/illegalmining/index'
const { createMessage } = useMessage();
const { VITE_GLOB_INFO_IMAGE_URL } = getAppEnvConfig();
const MapboxComponent = ref();
const mapConfig = ref({});
const props = defineProps(['id', 'hiddenInfoMap','selectImportent','showInfoData']);
const activeKey = ref('1');
const geomsList = ref();
const caseInfo: any = ref({});
function getCaseInfo() {
MineralsNewGetCaseInfoById({ id: props.showInfoData.id }).then((res) => {
caseInfo.value = res;
getConfig({ code: 'mapsetting' }).then((res) => {
mapConfig.value = JSON.parse(res.codeValue);
});
changeTask();
});
}
watch(
() => props.showInfoData.id,
() => {
getCaseInfo();
getOptions();
},
);
onMounted(() => {
getCaseInfo();
getOptions();
});
const imageList = ref([]);
async function getCaseImgList() {
imageList.value = await getLoadCaseImgList({ caseid: props.showInfoData.id, category: '非法采矿工作管理' });
MapboxComponent.value.handlerLoadPictureAzimuth(imageList.value);
// 匹配去除无效图片
// let zhengshiImageList = [];
// console.log("anjianzhaopianList",anjianzhaopianList.value)
// imageList.value?.forEach((item, index) => {
// let obj = anjianzhaopianList.value?.find((it, idx) => {
// return item.filePath == it;
// });
// if (obj) {
// zhengshiImageList.push(imageList.value[index]);
// }
// });
// console.log("imageList",imageList.value);
// console.log("anjianzhaopianList",anjianzhaopianList.value);
// console.log("zhengshiImageList",zhengshiImageList);
// console.log("zhengshiImageList",zhengshiImageList);
// MapboxComponent.value.handlerLoadPictureAzimuth(zhengshiImageList);
}
function handlerPreviewImage(index, url) {
const regex = /([^/\\]+)(?=\.[^/\\]*$|$)/;
const match = url.match(regex);
if (match) {
MapboxComponent.value.handlerCurrentImageChange(match[1]);
}
}
const isInitImageLisener = ref<Boolean>(false);
// 监听预览图片地址变化进行箭头切换
function handlerImageChange(e): void {
isInitImageLisener.value = false;
if (e && !isInitImageLisener.value) {
setTimeout(function () {
const targetNode = document.getElementsByClassName('ant-image-preview-img');
targetNode?.forEach((node, index) => {
let imageObserver = new MutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
if (node.getAttribute(mutation.attributeName).match('http')) {
handlerPreviewImage(0, node.getAttribute(mutation.attributeName));
}
}
});
const config = { attributes: true };
imageObserver.observe(node, config);
isInitImageLisener.value = true;
});
}, 250);
}
}
onBeforeMount(() => {});
const anjianzhaopianList = computed(() => {
getCaseImgList();
return caseInfo.value.tubanpic_base ? caseInfo.value.tubanpic_base.split(',') : [];
});
const xianchangzhaopianList = computed(() => {
return caseInfo.value.zhaopian_fill ? caseInfo.value.zhaopian_fill.split(',') : [];
});
const zhenggaizhaopianList = computed(() => {
return caseInfo.value.zhaopian_reform ? caseInfo.value.zhaopian_reform.split(',') : [];
});
const zhenggaiqianzhaopianList = computed(() => {
return caseInfo.value.zhaopianqian_jgzhg ? caseInfo.value.zhaopianqian_jgzhg.split(',') : [];
});
const zhenggaihouzhaopianList = computed(() => {
return caseInfo.value.zhaopianhou_jgzhg ? caseInfo.value.zhaopianhou_jgzhg.split(',') : [];
});
const wrjffzhaopianList = computed(() => {
return caseInfo.value.wrjffzhaopian ? caseInfo.value.wrjffzhaopian.split(',') : [];
});
const qitafujianList = computed(() => {
return caseInfo.value.fujian ? caseInfo.value.fujian.split(',') : [];
});
const chufafujianList = computed(() => {
return caseInfo.value.chufafile_punish ? caseInfo.value.chufafile_punish.split(',') : [];
});
const luoshidaoweiwenjianList = computed(() => {
return caseInfo.value.luoshifile_punish ? caseInfo.value.luoshifile_punish.split(',') : [];
});
const zhenggaifujianList = computed(() => {
return caseInfo.value.zhenggaifujian ? caseInfo.value.zhenggaifujian.split(',') : [];
});
const jiagongzhenggaifujianList = computed(() => {
return caseInfo.value.fujian_jgzhg ? caseInfo.value.fujian_jgzhg.split(',') : [];
});
function onMapboxLoad() {
// changeTask();
}
const kcpandingjieguo = ref([]);
// const hefaqingxing = ref([
// {}
// ]);
const kaicaiweifa = ref([]);
const zhutileixing = ref([]);
const jiagongweifa = ref([]);
async function getOptions() {
kcpandingjieguo.value = await asyncGetOptions('kcpandingjieguo');
// hefaqingxing.value = await asyncGetOptions('hefaqingxing');
kaicaiweifa.value = await asyncGetOptions('kaicaiweifa');
zhutileixing.value = await asyncGetOptions('zhutileixing');
jiagongweifa.value = await asyncGetOptions('jiagongweifa');
}
const getLabel = (type, value) => {
let result: any[] = [];
let label = '';
switch (type) {
case 'hefapanding_fill':
result = kcpandingjieguo.value;
break;
case 'hefaqingxing_kcfill':
result = [
{ label: '临时用地(取土场)', value: 1},
{ label: '生态修复项目新产生的土石料用于本工程,确有剩余的,由县级政府组织纳入公共资源交易平台进行销售,销售所得收益纳入本级人民政府财政账户', value: 2 },
{ label: '个人为生活自用采挖零星分散资源和只能用作普通建筑材料的砂石土', value: 3 },
{ label: '建设单位在能源、交通、水利等基础设施、线性工程等建设项目(不含临时用地)范围内,因工程施工产生的砂石料用于本工程建设,自用仍有剩余的砂石料,由所在地的自然资源主管部门报县级以上人民政府纳入公共资源交易平台处置', value: 4 },
];
break;
case 'weifaleixing':
result = kaicaiweifa.value;
break;
case 'zhutitype_kcfill':
result = zhutileixing.value;
break;
case 'weifatype_jgfill':
result = jiagongweifa.value;
break;
case 'ziranbaohuflag_base':
result = [
{ label: '是', value: 1 },
{ label: '否', value: 0 },
];
break;
}
result.forEach((item) => {
if (item.value == value) {
label = item.label;
}
});
return label;
};
const getName = (value) => {
let name = '';
if (value == 1) {
name = '是';
} else if (value == 2) {
name = '否';
}
return name;
};
async function changeTask() {
let getGeomPrams = {
TableName: 'drone_shp_data ',
FieldName: 'gid',
FieldValue: caseInfo.value.geomid?.split(','),
page: 1,
limit: 999,
key: null,
};
if (caseInfo.value.geomid) {
getGeom(getGeomPrams).then((res) => {
let geoms = [];
if (res) {
if (res.items?.length > 0) {
res.items.forEach((item, index) => {
let geom = {
key: item.gid,
mapgeom: item.geometry,
};
geoms.push(geom);
geomsList.value = geoms;
});
}
// MapboxComponent.value.handlerDraw(status,mapgemoList.value, false);
MapboxComponent.value.handlerDraw('Details', geoms, false);
} else {
geomsList.value = null;
createMessage.error('当前数据没有线索!');
}
});
} else {
createMessage.error('当前数据没有线索!');
}
}
// const hanlderPreViewFile = (url) => {
// if (url.indexOf('.pdf') !== -1) {
// axios({
// method: 'get',
// url: `${VITE_GLOB_INFO_IMAGE_URL}/${url}`,
// responseType: 'blob',
// headers: {
// 'Content-Disposition': 'inline',
// },
// })
// .then((response) => {
// let blob = new Blob([response.data], { type: 'application/pdf' });
// let url = window.URL.createObjectURL(blob);
// window.open(url);
// })
// .catch((error) => {
// console.error(error);
// });
// } else {
// window.open(`${VITE_GLOB_INFO_IMAGE_URL}/${url}`, '_blank');
// }
// };
///////// File Preview && Download ////////
import FilePreview from '@/components/Upload/src/components/FilePreview.vue';
import { message } from 'ant-design-vue';
const previewFileModalVisible = ref(false);
const previewFileUrl = ref('');
const hanlderPreViewFile = (url) => {
previewFileUrl.value = `${VITE_GLOB_INFO_IMAGE_URL}/${url}`;
previewFileModalVisible.value = true;
};
const handlerDownloadFle = () => {
window.open(previewFileUrl.value, 'mozillaTab');
};
const handleCancelPreviewFile = () => {
previewFileModalVisible.value = false;
};
///////
const getContainer = () => {
return document.getElementById('info-container');
};
const dataProcessing = (value) => {
if (!value) {
return '0';
}
if (value.indexOf('.') == -1) {
return value;
} else {
if (value.split('.')[1].length <= 2) {
return value;
}
let resultString = value.replace('㎡', '');
return Number(resultString).toFixed(2);
}
};
const showImage = (url) => {
if (url.indexOf('.png') !== -1 || url.indexOf('.jpg') !== -1 || url.indexOf('.jpeg') !== -1) {
return true;
} else {
return false;
}
};
const changeImportent = () => {
let params = {
caseNo: caseInfo.value.case_no
}
AddImportantXianSuo(params).then(res => {
message.success('添加成功')
})
}
defineExpose({
caseInfo,
});
</script>
<style lang="scss" scoped>
.image-div {
min-width: 340px;
max-height: 220px;
overflow: auto;
}
.detail-container {
width: 100%;
height: calc(100vh - 120px);
display: flex;
padding: 0px 20px;
}
.detail-container::after {
content: '';
display: block;
clear: both;
height: 0;
visibility: none;
}
.map-container {
float: left;
width: 45vw;
height: calc(100vh - 100px);
margin-right: 20px;
}
:deep(.ant-image) {
margin-right: 10px;
margin-bottom: 10px;
}
:deep(.ant-image-preview-switch-left) {
position: absolute;
}
:deep(.ant-image-preview-switch-right) {
position: absolute;
}
.info-container {
// float: left;
position: relative;
flex: 1;
:deep(.ant-image-preview-wrap) {
position: absolute;
}
:deep(.ant-image-preview-mask) {
position: absolute;
}
:deep(.ant-image-preview-operations-wrapper) {
height: 100%;
position: absolute;
.ant-image-preview-operations {
position: absolute;
top: 0;
width: 100%;
.ant-image-preview-operations-operation {
// flex:1;
}
}
.ant-image-preview-operations-operation:nth-last-child(1) {
display: none;
}
.ant-image-preview-operations-operation:nth-last-child(2) {
display: none;
}
}
}
::v-deep .ant-tabs .ant-tabs-content-holder {
overflow: auto;
height: calc(80vh - 40px);
overflow: auto;
padding-right: 10px;
}
</style>