WholeProcessPlatform/frontend/src/modules/huanbaoMod/TwoLayers/HuanbaoModTwoLayers.vue

391 lines
9.1 KiB
Vue
Raw Normal View History

<template>
<div class="huanbao-two-layers-container">
<!-- 搜索表单 -->
<div class="search-form">
<a-space size="middle">
<div>所属基地:</div>
<a-select
v-model:value="searchData.baseid"
placeholder="请选择基地"
style="width: 200px"
show-search
:filter-option="filterOption"
:options="baseOptions"
@change="handleBaseChange"
/>
<div>类型:</div>
<a-select
v-model:value="searchData.type"
placeholder="请选择类型"
style="width: 200px"
:options="typeOptions"
@change="handleTypeChange"
/>
<div>建设状态:</div>
<a-select
v-model:value="searchData.bldstt"
placeholder="请选择状态"
style="width: 150px"
:options="bldsttOptions"
@change="handleBldsttChange"
/>
<a-input
v-model:value="searchData.search"
placeholder="搜索名称/电站"
style="width: 200px"
allow-clear
@press-enter="handleSearch"
/>
<a-button type="primary" @click="handleSearch">查询</a-button>
<a-tooltip title="重置">
<a-button @click="handleReset">重置</a-button>
</a-tooltip>
</a-space>
</div>
<!-- 数据表格 -->
<div class="table-wrapper">
<BasicTable
ref="tableRef"
:columns="columns"
:scroll-y="500"
:list-url="envOpdGetKendoListCust"
:search-params="tableSearchParams"
:transform-data="customTransform"
row-key="stcd"
>
<template #stnm="{ record }">
<a
v-if="record.stnm && record.stnm !== '-'"
@click="handleViewDetail(record, 'DW')"
class="text_hocer"
>{{ record.stnm }}</a
>
</template>
<template #ennm="{ record }">
<a
v-if="record.ennm && record.ennm !== '-'"
@click="handleViewDetail(record, 'ENG')"
class="text_hocer"
>{{ record.ennm }}</a
>
</template>
</BasicTable>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, computed, onMounted } from 'vue';
import BasicTable from '@/components/BasicTable/index.vue';
import { envOpdGetKendoListCust, getBaseList } from '@/api/home';
import { useModelStore } from '@/store/modules/model';
const modelStore = useModelStore();
// ==================== Props 定义 ====================
const props = defineProps<{
data?: any;
currentJidiInfo?: any;
res?: any;
}>();
// ==================== 状态管理 ====================
const tableRef = ref();
const baseList = ref<any[]>([]);
// 搜索数据
const searchData = ref<any>({
baseid: props.currentJidiInfo?.wbsCode || 'all',
type: props.data?.type || '',
bldstt: props.res?.bldstt || '',
hydrodtin: props.res?.hydrodtin || '',
search: ''
});
// 基地选项
const baseOptions = computed(() => {
const options = [];
baseList.value.forEach(item => {
options.push({
label: item.wbsName || item.basename,
value: item.wbsCode || item.baseid
});
});
return options;
});
// 类型选项
const typeOptions = [
{ label: '全部', value: '' },
{ label: '鱼类增殖站', value: 'FB' },
{ label: '过鱼设施', value: 'FP' },
{ label: '珍稀植物园', value: 'VP' },
{ label: '动物救助站', value: 'VA' },
{ label: '低温水减缓设施', value: 'DW' },
{ label: '鱼类栖息地', value: 'FH' },
{ label: '生态流量泄放设施', value: 'EQ' }
];
// 建设状态选项
const bldsttOptions = [
{ label: '全部', value: '' },
{ label: '未建', value: '0' },
{ label: '在建', value: '1' },
{ label: '已建', value: '2' }
];
// ==================== 列配置 ====================
const columns = [
{
title: '名称',
key: 'stnm',
dataIndex: 'stnm',
width: 150
},
{
title: '建设情况',
key: 'bldsttCcodeName',
dataIndex: 'bldsttCcodeName',
width: 120
},
{
title: '类型',
key: 'sttpName',
dataIndex: 'sttpName',
width: 120
},
{
title: '接入日期',
key: 'dtinTm',
dataIndex: 'dtinTm',
width: 120
},
{
title: '关联电站',
key: 'ennm',
dataIndex: 'ennm',
width: 150
},
{
title: '关联基地',
key: 'baseName',
dataIndex: 'baseName',
width: 150
}
];
// ==================== 表格搜索参数 ====================
const tableSearchParams = computed(() => {
return {
sort: [
{ field: 'baseStepSort', dir: 'asc' },
{ field: 'dtin', dir: 'desc' },
{ field: 'rvcdStepSort', dir: 'asc' },
{ field: 'rstcdStepSort', dir: 'asc' },
{ field: 'siteStepSort', dir: 'asc' }
],
select: [
'stnm',
'bldsttCcodeName',
'sttpName',
'dtinTm',
'ennm',
'baseName',
'stcd',
'sttpCode'
],
group: [],
groupResultFlat: false
};
});
// 数据转换
const customTransform = (res: any) => {
return {
records: res?.data?.data || [],
total: res?.data?.total || 0
};
};
// ==================== 过滤条件构建 ====================
const buildSearchFilter = () => {
const filters: any[] = [];
if (searchData.value.baseid && searchData.value.baseid !== 'all') {
filters.push({
field: 'baseId',
operator: 'eq',
value: searchData.value.baseid
});
}
if (searchData.value.type) {
const operator = searchData.value.type === 'EQ' ? 'contains' : 'eq';
filters.push({
field: 'sttpCode',
operator: operator,
value: searchData.value.type
});
}
if (searchData.value.bldstt !== undefined && searchData.value.bldstt !== '') {
filters.push({
field: 'bldsttCcode',
operator: 'eq',
value: searchData.value.bldstt
});
}
if (
searchData.value.hydrodtin !== undefined &&
searchData.value.hydrodtin !== ''
) {
filters.push({
field: 'dtin',
operator: 'eq',
value: searchData.value.hydrodtin
});
}
if (searchData.value.search) {
filters.push({
logic: 'or',
filters: [
{
field: 'baseName',
operator: 'contains',
value: searchData.value.search
},
{ field: 'stnm', operator: 'contains', value: searchData.value.search },
{ field: 'ennm', operator: 'contains', value: searchData.value.search }
]
});
}
return {
logic: 'and',
filters: filters.filter(
f => f.value !== undefined && f.value !== null && f.value !== ''
)
};
};
// ==================== 获取基地列表 ====================
const fetchBaseList = async () => {
try {
const params = {
filter: {
logic: 'and',
filters: [
{
field: 'wbsType',
operator: 'eq',
dataType: 'string',
value: 'PSB'
},
{ field: 'treeLevel', operator: 'eq', dataType: 'string', value: '1' }
]
},
sort: [{ field: 'orderIndex', dir: 'asc' }]
};
const res = await getBaseList(params);
if (res?.data?.data) {
baseList.value = res.data.data;
}
} catch (error) {
console.error('获取基地列表失败:', error);
}
};
// ==================== 事件处理 ====================
const filterOption = (input: string, option: any) => {
return option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
const handleBaseChange = () => {
handleSearch();
};
const handleTypeChange = () => {
handleSearch();
};
const handleBldsttChange = () => {
handleSearch();
};
const handleSearch = () => {
const filter = buildSearchFilter();
tableRef.value?.getList(filter);
};
const handleReset = () => {
searchData.value = {
baseid: props.currentJidiInfo?.wbsCode || 'all',
type: props.data?.type || '',
bldstt: '',
hydrodtin: '',
search: ''
};
const filter = buildSearchFilter();
tableRef.value?.reset();
tableRef.value?.getList(filter);
};
const handleViewDetail = (record: any, type: any) => {
console.log('查看详情:', record);
if (type == 'ENG') {
modelStore.modalVisible = true;
modelStore.params = record;
modelStore.params.sttp = 'ENG';
modelStore.title = record.ennm;
modelStore.params.stcd = record.stcd;
} else {
console.log('查看详情:', record);
modelStore.modalVisible = true;
modelStore.params = record;
modelStore.params.sttp = record.sttpCode;
// debugger
modelStore.title = record.stnm;
modelStore.params.stcd = record.stcd;
}
// TODO: 后续实现详情查看功能
};
// ==================== 生命周期 ====================
onMounted(() => {
fetchBaseList();
handleSearch();
});
</script>
<style scoped lang="scss">
.huanbao-two-layers-container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
background-color: #ffffff;
box-sizing: border-box;
.search-form {
margin-bottom: 16px;
border-radius: 4px;
}
.table-wrapper {
flex: 1;
overflow: hidden;
}
}
.text_hocer {
color: #2f6b98;
}
.text_hocer:hover {
color: #40a9ff;
}
</style>