CaiYuanYiTiHua/src/views/demo/statistical/index.vue

758 lines
23 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div>
<BasicTable @register="registerTable" :searchInfo="searchInfo">
<template #toolbar>
<PermissionBtn @btn-event="onBtnClicked" />
</template>
<template #bodyCell="{ column, record }">
<!-- 乡镇 -->
<template v-if="column.key === 'streetname'">
<a v-if="currentOrgLevel == 'country'" @click="getOrgCaseList(column,record)">{{record.streetname}}</a>
<span v-if="currentOrgLevel == 'street'">{{record.streetname}}</span>
</template>
<!-- 无人机发现数量 -->
<template v-if="column.key === 'allCount'">
<a @click="handlePreViewData(column,record)">{{record.allCount}}</a>
</template>
<!-- 完成外业核查数量 -->
<template v-if="column.key === 'handleStatus'">
<a @click="handlePreViewData(column,record)">{{record.handleStatus}}</a>
</template>
<!-- 24H内为核查 -->
<template v-if="column.key === 'notDealHour24'">
<a @click="handlePreViewData(column,record)">{{record.notDealHour24}}</a>
</template>
<!-- 房屋翻新 -->
<template v-if="column.key === 'typeFanxinCount'">
<a @click="handlePreViewData(column,record)">{{record.typeFanxinCount}}</a>
</template>
<!-- 房屋加盖 -->
<template v-if="column.key === 'typeJiagaiCount'">
<a @click="handlePreViewData(column,record)">{{record.typeJiagaiCount}}</a>
</template>
<!-- 房屋翻建 -->
<template v-if="column.key === 'typeFanjianCount'">
<a @click="handlePreViewData(column,record)">{{record.typeFanjianCount}}</a>
</template>
<!-- 存量建设 -->
<template v-if="column.key === 'typeCunliangCount'">
<a @click="handlePreViewData(column,record)">{{record.typeCunliangCount}}</a>
</template>
<!-- 推土 -->
<template v-if="column.key === 'typeTuituCount'">
<a @click="handlePreViewData(column,record)">{{record.typeTuituCount}}</a>
</template>
<!-- 其他 -->
<!-- <template v-if="column.key === 'typeOtherCount'">
<a @click="handlePreViewData(column,record)">{{record.typeOtherCount}}</a>
</template> -->
<!-- 合法 -->
<template v-if="column.key === 'illegal0Count'">
<a @click="handlePreViewData(column,record)">{{record.illegal0Count}}</a>
</template>
<!-- 违法 -->
<template v-if="column.key === 'illegal1Count'">
<a @click="handlePreViewData(column,record)">{{record.illegal1Count}}</a>
</template>
<!-- 伪变化 -->
<template v-if="column.key === 'illegal2Count'">
<a @click="handlePreViewData(column,record)">{{record.illegal2Count}}</a>
</template>
<!-- 外业核实后确定违法数量 -->
<template v-if="column.key === 'illegal1Count1'">
<a @click="handlePreViewData(column,record)">{{record.illegal1Count}}</a>
</template>
<!-- 违法面积 -->
<!-- <template v-if="column.key === 'illegalHandleAreaList'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandleAreaList}}</a>
</template> -->
<!-- 整改销号数 -->
<template v-if="column.key === 'illegalHandle2Status'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandle2Status}}</a>
</template>
<!-- 销号面积 -->
<!-- <template v-if="column.key === 'illegalHandle2AreaList'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandle2AreaList}}</a>
</template> -->
<!-- 尚未整改宗数 -->
<template v-if="column.key === 'illegalHandle01Status'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandle01Status}}</a>
</template>
<!-- 尚未整改面积 -->
<!-- <template v-if="column.key === 'illegalHandle01AreaList'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandle01AreaList}}</a>
</template> -->
<!-- 3日内未整改完成 -->
<template v-if="column.key === 'notComplete3'">
<a @click="handlePreViewData(column,record)">{{record.notComplete3}}</a>
</template>
<!-- 7日内未整改完成 -->
<template v-if="column.key === 'notComplete7'">
<a @click="handlePreViewData(column,record)">{{record.notComplete7}}</a>
</template>
<!-- 30日内未整改完成 -->
<template v-if="column.key === 'notComplete30'">
<a @click="handlePreViewData(column,record)">{{record.notComplete30}}</a>
</template>
<!-- 30日以上未整改完成 -->
<template v-if="column.key === 'notComplete30More'">
<a @click="handlePreViewData(column,record)">{{record.notComplete30More}}</a>
</template>
</template>
</BasicTable>
<div class="data-preview-container" v-if="showRecordList">
<a-tabs v-model:activeKey="activeKey" hide-add type="editable-card" @edit="onEdit" @change="handleTabChange">
<a-tab-pane v-for="(pane,index) in tablist" :key="index.toString()" :tab="pane.streetname+'-'+pane.label" :closable="pane.closable">
</a-tab-pane>
</a-tabs>
<RecordList :tablist="tablist" :currentListQuery="currentListQuery.listQuery"></RecordList>
<div class="data-preview-container-option">
<div @click="exportList()">
<CloudDownloadOutlined />
</div>
<div @click="handleCloseRecordList()">
<MinusOutlined />
</div>
<div @click="handleCloseAllRecordList()">
<CloseOutlined />
</div>
</div>
</div>
<a-modal
v-model:open="printOpen"
title="打印预览"
width="100%"
wrap-class-name="full-modal"
>
<template #footer>
<a-button type="primary" v-print="printObj">打印</a-button>
</template>
<div id="printMe">
<BasicTable size="small" @register="registerPrintTable" :searchInfo="searchInfo" style="transform: scale(1);">
<template #bodyCell="{ column, record }">
<!-- 乡镇 -->
<template v-if="column.key === 'streetname'">
<a v-if="currentOrgLevel == 'country'" @click="getOrgCaseList(column,record)">{{record.streetname}}</a>
<span v-if="currentOrgLevel == 'street'">{{record.streetname}}</span>
</template>
<!-- 无人机发现数量 -->
<template v-if="column.key === 'allCount'">
<a @click="handlePreViewData(column,record)">{{record.allCount}}</a>
</template>
<!-- 完成外业核查数量 -->
<template v-if="column.key === 'handleStatus'">
<a @click="handlePreViewData(column,record)">{{record.handleStatus}}</a>
</template>
<!-- 24H内为核查 -->
<template v-if="column.key === 'notDealHour24'">
<a @click="handlePreViewData(column,record)">{{record.notDealHour24}}</a>
</template>
<!-- 房屋翻新 -->
<template v-if="column.key === 'typeFanxinCount'">
<a @click="handlePreViewData(column,record)">{{record.typeFanxinCount}}</a>
</template>
<!-- 房屋加盖 -->
<template v-if="column.key === 'typeJiagaiCount'">
<a @click="handlePreViewData(column,record)">{{record.typeJiagaiCount}}</a>
</template>
<!-- 房屋翻建 -->
<template v-if="column.key === 'typeFanjianCount'">
<a @click="handlePreViewData(column,record)">{{record.typeFanjianCount}}</a>
</template>
<!-- 存量建设 -->
<template v-if="column.key === 'typeCunliangCount'">
<a @click="handlePreViewData(column,record)">{{record.typeCunliangCount}}</a>
</template>
<!-- 推土 -->
<template v-if="column.key === 'typeTuituCount'">
<a @click="handlePreViewData(column,record)">{{record.typeTuituCount}}</a>
</template>
<!-- 其他 -->
<!-- <template v-if="column.key === 'typeOtherCount'">
<a @click="handlePreViewData(column,record)">{{record.typeOtherCount}}</a>
</template> -->
<!-- 合法 -->
<template v-if="column.key === 'illegal0Count'">
<a @click="handlePreViewData(column,record)">{{record.illegal0Count}}</a>
</template>
<!-- 违法 -->
<template v-if="column.key === 'illegal1Count'">
<a @click="handlePreViewData(column,record)">{{record.illegal1Count}}</a>
</template>
<!-- 伪变化 -->
<template v-if="column.key === 'illegal2Count'">
<a @click="handlePreViewData(column,record)">{{record.illegal2Count}}</a>
</template>
<!-- 外业核实后确定违法数量 -->
<template v-if="column.key === 'illegal1Count1'">
<a @click="handlePreViewData(column,record)">{{record.illegal1Count}}</a>
</template>
<!-- 违法面积 -->
<!-- <template v-if="column.key === 'illegalHandleAreaList'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandleAreaList}}</a>
</template> -->
<!-- 整改销号数 -->
<template v-if="column.key === 'illegalHandle2Status'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandle2Status}}</a>
</template>
<!-- 销号面积 -->
<!-- <template v-if="column.key === 'illegalHandle2AreaList'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandle2AreaList}}</a>
</template> -->
<!-- 尚未整改宗数 -->
<template v-if="column.key === 'illegalHandle01Status'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandle01Status}}</a>
</template>
<!-- 尚未整改面积 -->
<!-- <template v-if="column.key === 'illegalHandle01AreaList'">
<a @click="handlePreViewData(column,record)">{{record.illegalHandle01AreaList}}</a>
</template> -->
<!-- 3日内未整改完成 -->
<template v-if="column.key === 'notComplete3'">
<a @click="handlePreViewData(column,record)">{{record.notComplete3}}</a>
</template>
<!-- 7日内未整改完成 -->
<template v-if="column.key === 'notComplete7'">
<a @click="handlePreViewData(column,record)">{{record.notComplete7}}</a>
</template>
<!-- 30日内未整改完成 -->
<template v-if="column.key === 'notComplete30'">
<a @click="handlePreViewData(column,record)">{{record.notComplete30}}</a>
</template>
<!-- 30日以上未整改完成 -->
<template v-if="column.key === 'notComplete30More'">
<a @click="handlePreViewData(column,record)">{{record.notComplete30More}}</a>
</template>
</template>
</BasicTable>
</div>
</a-modal>
</div>
</template>
<script lang="ts" setup>
import { ref,reactive } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { getStatisticalList, deleteRole } from '@/api/demo/system';
// import {DataPreivew} from './RecordList.vue'
import { useMessage } from '@/hooks/web/useMessage';
import { useModal } from '@/components/Modal';
import { RecordList } from './page';
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { columns, columnsDataPreview,searchFormSchema } from './statistical.data';
import {MinusOutlined,CloseOutlined,CloudDownloadOutlined} from '@ant-design/icons-vue'
import axios from 'axios';
import print from "vue3-print-nb";
import { getAppEnvConfig } from '@/utils/env';
const { VITE_GLOB_API_URL } = getAppEnvConfig();
const vPrint = print;
const printOpen = ref<boolean>(false);
const printObj = reactive({
id:"printMe",
popTitle: "",
beforeOpenCallback() {
},
openCallback() {
},
closeCallback() {
}
})
defineOptions({ name: 'RoleManagement' });
let activeKey = ref('0')
const { createConfirm, createMessage } = useMessage();
const [registerModal, { openModal: openRoleModal }] = useModal();
const [registerModulesModal, { openModal: openModulesModal }] = useModal();
const [registerAccountModal, { openModal: openAccountModal }] = useModal();
const searchInfo = reactive<Recordable>({
countyid:null
});
const currentOrgLevel = ref<string>("country")
const showRecordList = ref<boolean>(false);
const panes = reactive<{ title: string; content: string; key: string; closable?: boolean}[]>([])
const searchParams = ref();
const [registerTable, { reload, getSelectRows, clearSelectedRowKeys, updateTableData}] = useTable({
// 表格名称
title: '统计报表',
// 获取数据的接口
api: getStatisticalList,
// 表单列信息 BasicColumn[]
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
// 使用搜索表单
useSearchForm: true,
// 显示表格设置工具
showTableSetting: true,
// 是否显示分页
pagination:false,
// 是否显示表格边框
bordered: true,
// 序号列
showIndexColumn: false,
// 勾选列
rowSelection: false,
// 搜索
handleSearchInfoFn(info) {
searchParams.value = info;
return info;
},
});
const [registerPrintTable] = useTable({
// 表格名称
title: '',
// 获取数据的接口
api: getStatisticalList,
// 表单列信息 BasicColumn[]
columns,
rowKey: 'id',
formConfig: {
labelWidth: 120,
schemas: searchFormSchema,
},
// 使用搜索表单
useSearchForm: false,
// 显示表格设置工具
showTableSetting: false,
// 是否显示分页
pagination:false,
// 是否显示表格边框
bordered: true,
// 序号列
showIndexColumn: false,
// 勾选列
rowSelection: false,
// 搜索
handleSearchInfoFn(info) {
searchParams.value = info;
return info;
},
});
const [registerTableDataPreview,{ reloadDataPreview, getSelectRowsDataPreview, clearSelectedRowKeysDataPreview }] = useTable({
// 表格名称
title: '',
// 获取数据的接口
api: getStatisticalList,
// 表单列信息 BasicColumn[]
columnsDataPreview,
rowKey: 'id',
formConfig: {
labelWidth: 120,
// schemas: searchFormSchema,
},
// 使用搜索表单
useSearchForm: false,
// 显示表格设置工具
showTableSetting: false,
// 是否显示表格边框
bordered: true,
// 序号列
showIndexColumn: false,
// 勾选列
rowSelection: false,
// 搜索
handleSearchInfoFn(info) {
return info;
},
});
function handleCloseRecordList(){
showRecordList.value = false;
}
function exportList(){
createMessage.success("接口待对接!")
}
function handleCreate() {
openRoleModal(true, {
isUpdate: false,
});
}
function viewAccount(record: Recordable) {
openAccountModal(true, {
record,
});
}
function onEdit(targetKey: string){
tablist.splice(parseInt(targetKey),1);
if(tablist.length==0){
showRecordList.value = false;
}
if(parseInt(targetKey)>1){
activeKey.value = (parseInt(targetKey)-1).toString();
}else{
activeKey.value = '0';
}
currentListQuery.listQuery = tablist[activeKey.value].listQuery
}
let currentListQuery = reactive({listQuery:{}});
function handleTabChange(e){
currentListQuery.listQuery = tablist[e].listQuery
console.log(currentListQuery)
}
// function remvoeTab(){
// }
const tablist = reactive<{streetname:string;label:string;listQuery:searchListSchema}[]>([])
// 查询条件
interface searchListSchema{
is_intact?:number;
streetid?:number;
countyid?:number;
identification_start_time?:string;
identification_end_time?:string;
page?:number;
limit?:number;
is_deal?:number;
is_not_deal_hour24?:number;
is_drawback?:number;
typeid?:number;
is_illegal?:number;
is_complete?:number;
handle_status_id?:number;
out_time_flag?:number;
}
// const searchForm = reactive<searchListSchema>({
// })
function handlePreViewData(column,record:Recordable){
const searchForm = reactive<searchListSchema>({
identification_start_time:searchParams.value?.identification_start_time,
identification_end_time:searchParams.value?.identification_end_time,
is_intact:1,
page:1,
limit:10,
})
if(currentOrgLevel.value == 'country'){
searchForm.countyid = record.streetid;
}else if(currentOrgLevel.value == 'street'){
searchForm.streetid = record.streetid;
}
console.log("searchForm",searchForm);
switch(column.dataIndex){
case 'allCount':
break;
case 'handleStatus':
searchForm.is_deal = 1;
break;
case 'notDealHour24':
searchForm.is_not_deal_hour24 = 1;
searchForm.is_drawback = 0;
break;
case 'notDealHour24':
searchForm.is_not_deal_hour24 = 1;
searchForm.is_drawback = 0;
break;
case 'typeFanxinCount':
searchForm.typeid = record.typeid
case 'typeJiagaiCount':
searchForm.typeid = record.typeid
case 'typeFanjianCount':
searchForm.typeid = record.typeid
case 'typeCunliangCount':
searchForm.typeid = record.typeid
case 'typeTuituCount':
searchForm.typeid = record.typeid
case 'illegal0Count':
searchForm.is_illegal = 0;
searchForm.is_deal = 1;
break;
case 'illegal1Count':
searchForm.is_illegal = 1;
searchForm.is_deal = 1;
break;
case 'illegal2Count':
searchForm.is_illegal = 2;
searchForm.is_deal = 1;
break;
case 'illegal1Count1':
searchForm.is_illegal = 1;
searchForm.is_deal = 1;
break;
case 'illegalHandle2Status':
searchForm.handle_status_id = 1;
searchForm.is_deal = 1;
break;
case 'illegalHandle01Status':
searchForm.is_illegal = 1;
searchForm.is_deal = 1;
searchForm.is_complete = 0;
break;
case 'notComplete3':
searchForm.is_illegal = 1;
searchForm.is_complete = 0;
searchForm.out_time_flag = 1;
break;
case 'notComplete7':
searchForm.is_illegal = 1;
searchForm.is_complete = 0;
searchForm.out_time_flag = 2;
break;
case 'notComplete30':
searchForm.is_illegal = 1;
searchForm.is_complete = 0;
searchForm.out_time_flag = 4;
break;
case 'notComplete30More':
searchForm.is_illegal = 1;
searchForm.is_complete = 0;
searchForm.out_time_flag = 5;
break;
}
let tabItem = {
streetname:record.streetname,
label:column.title,
listQuery:searchForm,
}
tablist.push(tabItem)
activeKey.value = tablist.length > 1 ? (tablist.length-1).toString() : '0';
showRecordList.value = true;
currentListQuery.listQuery = searchForm
}
// 获取下级行政结构图斑统计
function getOrgCaseList(column,record:Recordable){
if(currentOrgLevel.value == 'country'){
currentOrgLevel.value = 'street'
}else if(currentOrgLevel.value == 'street'){
currentOrgLevel.value = 'country'
}
searchInfo.countyid = record.streetid;
console.log("searchInfo",searchInfo);
reload();
console.log("searchInfo",searchInfo);
}
function handleCloseAllRecordList(){
for(let i=0;i<tablist.length;i++){
tablist.pop();
}
showRecordList.value = false;
}
function handleEdit() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('');
}
const record = rows[0];
openRoleModal(true, {
record,
isUpdate: true,
});
}
async function handleDelete() {
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('');
}
const query = [rows[0].id];
createConfirm({
iconType: 'info',
title: '',
content: '',
onOk: async () => {
const data = await deleteRole(query);
if (data) {
handleSuccess();
createMessage.success('删除成功');
} else {
createMessage.error('删除失败');
}
},
});
}
function handlePrint(){
printOpen.value = true;
}
// 直接下载接口返回的二进制流
function handleExport(){
let params = {...searchParams.value}
params.countyid = searchInfo?.countyid;
axios({
method:"post",
url:VITE_GLOB_API_URL+"/api/DroneCaseinfo/ExportCaseSynthesisCensusStreet",
params:params,
headers:{
"X-Token":localStorage.getItem("X-Token")
},
responseType:"blob"
}).then(res=>{
console.log("excel",res);
let fileName = "统计报表" + new Date().getTime() + ".xls";
const elink = document.createElement('a')
elink.download = fileName;
elink.style.display = 'none'
elink.href = URL.createObjectURL(res.data)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
})
}
function handleExcelDownload(data) {
// 将二进制数据转换为Excel文件
const workbook = XLSX.read(data, { type: 'array' });
// 可以进一步处理workbook对象例如提取工作表数据等
const firstSheetName = workbook.SheetNames[0];
const worksheet = workbook.Sheets[firstSheetName];
const excelData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
console.log('Excel Data:', excelData);
// 下载Excel文件
XLSX.writeFile(workbook, 'example.xlsx');
}
function handleSuccess() {
clearSelectedRowKeys();
reload();
reloadDataPreview();
}
function onBtnClicked(domId) {
switch (domId) {
case 'btnBack':
currentOrgLevel.value = 'street'
getOrgCaseList({},{streetid:null});
break;
case 'btnAdd':
handleCreate();
break;
case 'btnEdit':
handleEdit();
break;
case 'btnDelete':
handleDelete();
break;
case 'btnModules':
let rows = getSelectRows();
if (rows.length == 0) {
return createMessage.warn('请勾选一个角色进行编辑');
}
const record = rows[0];
openModulesModal(true, {
record,
});
break;
case 'btnPrint':
handlePrint();
break;
case 'btnExport':
handleExport();
break;
default:
break;
}
}
</script>
<style>
.data-preview-container{
width:100%;
height: calc( 100% - 0px);
position:absolute;
padding:30px 10px;
top:0px;
left:0px;
background:#fff;
}
.data-preview-container-option{
width:120px;
height: 40px;
position:absolute;
top:30px;
right:0px;
}
.data-preview-container-option div{
width:40px;
height:40px;
line-height:40px;
float:left;
text-align: center;
cursor:pointer;
}
</style>