CaiYuanYiTiHua/src/views/demo/inspectionaudit/patchsummary/index.vue

418 lines
12 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>
<PageWrapper dense contentFullHeight fixedHeight>
<div class="search-box">
<BasicForm
@register="registerForm"
:labelWidth="100"
:schemas="searchFormSchema"
:actionColOptions="{ span: 24 }"
>
<template #dangqianzhuangtai>
<a-select
allowClear
showArrow
mode="multiple"
v-model:value="nowStatus"
:options="nowStatusOptions"
:max-tag-count="1"
placeholder="请选择"
@change="changeStatus"
/>
</template>
<template #tubanmianji>
<div class="scope-box">
<a-input v-model:value="areaParams.tubanArea1" placeholder="请输入" />
-
<a-input v-model:value="areaParams.tubanArea2" placeholder="请输入" />
</div>
</template>
<template #gengdimianji>
<div class="scope-box">
<a-input v-model:value="areaParams.gengdiArea1" placeholder="请输入" />
-
<a-input v-model:value="areaParams.gengdiArea2" placeholder="请输入" />
</div>
</template>
<template #jibennongtianmianji>
<div class="scope-box">
<a-input v-model:value="areaParams.jibenArea1" placeholder="请输入" />
-
<a-input v-model:value="areaParams.jibenArea2" placeholder="请输入" />
</div>
</template>
</BasicForm>
</div>
<div class="table-box">
<BasicTable @register="registerTable" :searchInfo="searchInfo" @change="handleChange">
<template #toolbar>
<PermissionBtn @btn-event="onBtnClicked" />
</template>
<template #bodyCell="{ column, record }">
<template v-if="['area', 'gengdiarea', 'nongyongdiarea'].includes(column.key)">
{{ dataProcessingCount(record[column.key]) }}
</template>
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
// icon: 'ant-design:ellipsis-outlined',
label: '查看',
onClick: viewAccount.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
</div>
<a-modal v-model:open="open" title="导出文件类型" :footer="null">
<div>
<a-button class="exportbutton" @click="handleExport('excel')">
execl
</a-button>
<a-button class="exportbutton" @click="handleExport('shp')">
shp
</a-button>
</div>
</a-modal>
<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">
<div class="handoff">
<a-button type="primary" style="margin-right: 25px" @click="prevData"></a-button>
<a-button type="primary" @click="nextData"></a-button>
</div>
<ShowInfoModal :showInfoData="showInfoData" />
</div>
</a-modal>
</PageWrapper>
</template>
<script lang="ts" setup>
import { ref, reactive, onMounted, watch } from 'vue';
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { PermissionBtn } from '@/components/PermissionBtn/index';
import { columns, searchFormSchema } from './patchsummary.data';
import { getAppEnvConfig } from '@/utils/env';
import axios from 'axios';
import ShowInfoModal from '@/views/demo/inspectionaudit/curbspotcity/MapList/ShowInfoModal/index.vue';
import { getCaseInfoById, loadCaseInfoTuBanList } from '@/api/inspectionaudit/index';
import { dataProcessingCount } from '@/views/demo/tiankongdi/util';
import { BasicForm, useForm } from '@/components/Form';
import { PageWrapper } from '@/components/Page';
import dayjs from 'dayjs';
import { message } from 'ant-design-vue';
import { nowStatusOptions } from '@/utils/global';
const { VITE_GLOB_API_URL } = getAppEnvConfig();
defineOptions({ name: 'RoleManagement' });
const nextShowDataId = ref();
const prevShowDataId = ref();
const showInfoId = ref();
const searchInfo = reactive<Recordable>({
countyid: null,
});
const showInfoData = ref();
const showInfoOpen = ref(false);
const searchParams = ref({
page: 1,
limit: 10,
});
const nowStatus = ref(undefined);
const areaParams = ref({
tubanArea1: null,
tubanArea2: null,
gengdiArea1: null,
gengdiArea2: null,
jibenArea1: null,
jibenArea2: null,
nowStatus: undefined,
});
const tableData = ref([]);
const tablePaginationRight = ref({
current: 1,
pageSize: 10,
size: 'small',
defaultPageSize: 10,
showSizeChanger: true,
pageSizeOptions: ['10', '50', '80', '100'],
showQuickJumper: true,
total: 0,
});
const [registerForm, { validate, getFieldsValue }] = useForm({
schemas: searchFormSchema,
labelWidth: 100,
baseColProps: { span: 6 },
actionColOptions: { span: 24 },
autoSubmitOnEnter: true,
submitFunc: handleSubmit,
resetFunc: handleReset,
autoSubmitOnEnter: handleSubmit,
});
const [registerTable, { setTableData, reload, clearSelectedRowKeys, setPagination, setLoading }] =
useTable({
title: '图斑列表',
dataSource: tableData.value,
columns,
rowKey: 'id',
useSearchForm: false,
showTableSetting: true,
bordered: true,
// 搜索
handleSearchInfoFn(info) {
searchParams.value = info;
return info;
},
actionColumn: {
width: 80,
title: '操作',
dataIndex: 'action',
// slots: { customRender: 'action' },
fixed: 'right',
},
pagination: tablePaginationRight.value,
});
// 直接下载接口返回的二进制流
function handleExport(exportType) {
console.log(searchParams);
let params = { ...searchParams.value };
let url = '';
let fileName = '';
if (exportType == 'excel') {
url = VITE_GLOB_API_URL + '/api/DroneCaseInfoXcsj/ExportCaseInfoTuBanList';
fileName = '图斑列表统计报表' + new Date().getTime() + '.xls';
} else if (exportType == 'shp') {
url = VITE_GLOB_API_URL + '/api/DroneCaseInfoXcsj/ExportCaseInfoShapefile';
fileName = '图斑列表矢量数据' + new Date().getTime() + '.zip';
}
axios({
method: 'post',
url: url,
params: params,
headers: {
'X-Token': localStorage.getItem('X-Token'),
},
responseType: 'blob',
}).then((res) => {
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);
});
}
const open = ref<boolean>(false);
function onBtnClicked(domId) {
switch (domId) {
case 'btnExport':
open.value = true;
break;
default:
break;
}
}
function viewAccount(record) {
showInfoId.value = record.Id;
getDetailData();
}
function getDetailData() {
getCaseInfoById({ id: showInfoId.value }).then((res) => {
showInfoData.value = res;
showInfoOpen.value = true;
});
}
function handleChange(data) {
searchParams.value.page = data.current;
searchParams.value.limit = data.pageSize;
tablePaginationRight.value = data;
const querys = Object.assign(searchParams.value, areaParams.value);
getTableData(querys);
}
function changeStatus(val) {
areaParams.value.nowStatus = val.join(',');
}
function handleSubmit() {
searchParams.value = getFieldsValue();
searchParams.value.page = 1;
tablePaginationRight.value.current = 1;
searchParams.value.limit = tablePaginationRight.value.pageSize;
const querys = Object.assign(searchParams.value, areaParams.value);
getTableData(querys);
}
async function getTableData(querys) {
if (querys.startTime && querys.endTime) {
querys.startTime = dayjs(querys.startTime).format('YYYY-MM-DD');
querys.endTime = dayjs(querys.endTime).endOf('day').format('YYYY-MM-DD HH:mm:ss');
}
setLoading(true);
await loadCaseInfoTuBanList(querys).then((res) => {
tableData.value = res.items;
tablePaginationRight.value.total = res.total;
setTableData(tableData.value);
setPagination(tablePaginationRight.value);
setLoading(false);
});
}
function handleReset() {
searchParams.value = {
page: 1,
limit: 10,
};
areaParams.value = {
tubanArea1: null,
tubanArea2: null,
gengdiArea1: null,
gengdiArea2: null,
jibenArea1: null,
jibenArea2: null,
nowStatus: undefined,
};
nowStatus.value = undefined;
tablePaginationRight.value.current = 1;
getTableData(searchParams.value);
}
onMounted(() => {
getTableData(searchParams.value);
});
watch(
() => showInfoId.value,
() => {
let index = tableData.value.findIndex((item) => item.Id == showInfoId.value);
getDetailData();
if (index < tableData.value.length - 1) {
nextShowDataId.value = tableData.value[index + 1].Id;
} else {
nextShowDataId.value = 0;
}
if (index > 0) {
prevShowDataId.value = tableData.value[index - 1].Id;
} else {
prevShowDataId.value = 0;
}
},
);
async function prevData() {
if (prevShowDataId.value === 0) {
if (searchParams.value.page === 1) {
message.warning('已经是第一条数据了');
return;
}
searchParams.value.page--;
tablePaginationRight.value.current--;
await getTableData(searchParams.value);
setTimeout(() => {
showInfoId.value = tableData.value[tableData.value.length - 1].Id;
}, 10);
return;
} else {
showInfoId.value = prevShowDataId.value;
}
}
async function nextData() {
if (nextShowDataId.value === 0) {
if (
Math.ceil(tablePaginationRight.value.total / searchParams.value.limit) <=
searchParams.value.page
) {
message.warning('已经是最后一条数据了');
return;
}
searchParams.value.page++;
tablePaginationRight.value.current++;
await getTableData(searchParams.value);
setTimeout(() => {
showInfoId.value = tableData.value[0].Id;
}, 10);
} else {
showInfoId.value = nextShowDataId.value;
}
}
</script>
<style lang="less" scoped>
.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;
}
.full-modal {
.ant-modal {
min-width: 100vw;
top: 0px;
padding: 0px;
margin: 0px;
}
.ant-modal-content {
display: flex;
flex-direction: column;
}
.ant-modal-body {
flex: 1;
}
}
.exportbutton {
width: 510px;
height: 60px;
margin: 5px;
}
.search-box {
background: @component-background;
margin: 16px;
padding: 16px;
}
::v-deep .ant-col-24 {
display: inline-block;
max-width: fit-content;
margin-left: 20px;
}
.table-box {
margin: 16px;
}
.scope-box {
display: flex;
width: 100%;
.ant-input {
width: 48% !important;
max-width: 48%;
min-width: 48%;
}
}
.handoff {
width: 100%;
display: flex;
justify-content: flex-end;
padding-right: 25px;
}
</style>