Browse Source

表格接口调试

dev-V1.10.0
wangmingyong@163.com 2 weeks ago
parent
commit
05d9a57e45
  1. 5
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/key-enterprise/index.vue
  2. 118
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-district/index.vue
  3. 173
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-field/index.vue
  4. 12
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/situation-trend/components/SituationPane.vue
  5. 43
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/trend-behavior/components/TrendPane.vue

5
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/key-enterprise/index.vue

@ -114,11 +114,14 @@ const handleReset = () => {
const handleExport = async () => { const handleExport = async () => {
try { try {
const numbers = selectedRows.value const numbers = selectedRows.value
.map((r) => r.enterpriseId) .map((r) => r.enterpriseNumber)
.filter(Boolean) .filter(Boolean)
.join(','); .join(',');
const res = await exportKeyEnterprises({ const res = await exportKeyEnterprises({
enterpriseNumber: numbers || undefined, enterpriseNumber: numbers || undefined,
enterpriseName: queryParams.enterpriseName || undefined,
districtName: queryParams.districtName,
streetName: queryParams.streetName,
statYear: queryParams.statYear, statYear: queryParams.statYear,
statMonth: statMonthValue() statMonth: statMonthValue()
}); });

118
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-district/index.vue

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, reactive, ref } from 'vue'; import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data'; import { getDicts } from '@/api/system/dict/data';
import { listScanArea, listScanAreaDetails, exportScanArea, type ScanTimeParams } from '@/api/efcode/report/scan-data-situation'; import { listScanArea, listScanAreaDetails, exportScanArea, type ScanTimeParams } from '@/api/efcode/report/scan-data-situation';
@ -113,18 +113,6 @@ const handleMonthChange = (val: string) => {
queryParams.dateSearch = val; queryParams.dateSearch = val;
}; };
/** 时段文本 */
const timePeriodText = computed(() => {
if (timeMode.value === 'year') {
return `${selectedYear.value}年`;
} else if (timeMode.value === 'quarter') {
return `${selectedYear.value}年第${selectedQuarter.value}季度`;
} else if (timeMode.value === 'month') {
return selectedMonth.value || '全部时段';
}
return '全部时段';
});
// ======================== 所属区字典 ======================== // ======================== 所属区字典 ========================
const areaOptions = ref<any[]>([]); const areaOptions = ref<any[]>([]);
@ -250,24 +238,24 @@ const handlePageChange = (page: number) => {
getList(); getList();
}; };
// ======================== 详情弹窗 ======================== // ======================== 详情弹窗(区 → 街道) ========================
interface ScanDetailRow { interface StreetRow {
id: number; id?: number | string;
enterpriseName: string; streetName?: string;
scanTime: string; districtName?: string;
scanType: string; enterpriseCount?: number | null;
bureauDeptName: string; xzzfCount?: number | null;
lawEnforcer: string; xzzfslpm?: number | string | null;
enforcementItem: string; xzzfslzb?: number | string | null;
fxzzfsl?: number | null;
fxzzfslpm?: number | string | null;
fxzzfslzb?: number | string | null;
} }
const detailDialogVisible = ref(false); const detailDialogVisible = ref(false);
const detailArea = ref<DistrictRow | null>(null); const detailArea = ref<DistrictRow | null>(null);
const detailLoading = ref(false); const detailLoading = ref(false);
const detailTableData = ref<ScanDetailRow[]>([]); const detailTableData = ref<StreetRow[]>([]);
const detailTotal = ref(0);
const detailPage = ref(1);
const detailPageSize = ref(20);
const getDetailList = async () => { const getDetailList = async () => {
detailLoading.value = true; detailLoading.value = true;
@ -275,13 +263,10 @@ const getDetailList = async () => {
if (!detailArea.value) return; if (!detailArea.value) return;
const res = await listScanAreaDetails({ const res = await listScanAreaDetails({
...buildTimeParams(), ...buildTimeParams(),
pageNum: detailPage.value,
pageSize: detailPageSize.value,
districtCode: detailArea.value.districtCode || queryParams.area, districtCode: detailArea.value.districtCode || queryParams.area,
districtName: detailArea.value.districtName || detailArea.value.areaName || currentDistrict().districtName districtName: detailArea.value.districtName || detailArea.value.areaName || currentDistrict().districtName
}); });
detailTableData.value = (res as any)?.rows || []; detailTableData.value = (res as any)?.rows || (Array.isArray(res) ? res : []);
detailTotal.value = (res as any)?.total || 0;
} catch (e) { } catch (e) {
console.warn('[scan-district] 详情接口调用失败', e); console.warn('[scan-district] 详情接口调用失败', e);
} finally { } finally {
@ -291,22 +276,10 @@ const getDetailList = async () => {
const handleDetail = (row: DistrictRow) => { const handleDetail = (row: DistrictRow) => {
detailArea.value = row; detailArea.value = row;
detailPage.value = 1;
detailDialogVisible.value = true; detailDialogVisible.value = true;
getDetailList(); getDetailList();
}; };
const handleDetailSizeChange = (size: number) => {
detailPageSize.value = size;
detailPage.value = 1;
getDetailList();
};
const handleDetailPageChange = (page: number) => {
detailPage.value = page;
getDetailList();
};
onMounted(() => { onMounted(() => {
loadAreaDict(); loadAreaDict();
applyYearFilter(); applyYearFilter();
@ -416,24 +389,15 @@ onUnmounted(() => {
</div> </div>
</div> </div>
<!-- ==================== 扫码详情弹窗 ==================== --> <!-- ==================== 区 → 街道详情弹窗 ==================== -->
<el-dialog <el-dialog
v-model="detailDialogVisible" v-model="detailDialogVisible"
width="1100px" width="1400px"
:title="`${detailArea?.areaName || ''} — ${timePeriodText} 扫码明细`" :title="detailArea?.districtName || detailArea?.areaName || ''"
append-to-body append-to-body
top="5vh" top="5vh"
destroy-on-close destroy-on-close
> >
<el-alert
v-if="detailArea"
:closable="false"
show-icon
:title="`商事主体:${detailArea.enterpriseCount}户 | 行政执法:${detailArea.adminEnforceCount}条 | 非行政执法:${detailArea.nonAdminEnforceCount}条 | 时段:${timePeriodText}`"
type="info"
class="mb-4"
/>
<el-table <el-table
v-loading="detailLoading" v-loading="detailLoading"
:data="detailTableData" :data="detailTableData"
@ -442,25 +406,32 @@ onUnmounted(() => {
style="width: 100%" style="width: 100%"
max-height="55vh" max-height="55vh"
> >
<el-table-column label="序号" type="index" width="80" align="center" /> <el-table-column label="序号" type="index" width="70" align="center" />
<el-table-column label="企业名称" prop="enterpriseName" min-width="220" align="center" /> <el-table-column label="所属街道" min-width="160" align="center">
<el-table-column label="扫码时间" prop="scanTime" min-width="180" align="center" /> <template #default="{ row }">{{ row.streetName || row.districtName || '-' }}</template>
<el-table-column label="扫码类型" prop="scanType" width="120" align="center" /> </el-table-column>
<el-table-column label="执法单位" prop="bureauDeptName" min-width="220" align="center" /> <el-table-column label="商事主体数量(户)" min-width="160" align="center">
<el-table-column label="执法人员" prop="lawEnforcer" width="120" align="center" /> <template #default="{ row }">{{ row.enterpriseCount ?? '-' }}</template>
<el-table-column label="执法事项" prop="enforcementItem" min-width="200" align="center" /> </el-table-column>
<el-table-column label="行政执法数量(条)" min-width="170" align="center">
<template #default="{ row }">{{ row.xzzfCount ?? '-' }}</template>
</el-table-column>
<el-table-column label="行政执法数量排名" min-width="170" align="center">
<template #default="{ row }">{{ row.xzzfslpm ?? '-' }}</template>
</el-table-column>
<el-table-column label="行政执法数量占比(%)" min-width="160" align="center">
<template #default="{ row }">{{ row.xzzfslzb ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量(条)" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfsl ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量排名" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfslpm ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量占比(%)" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfslzb ?? '-' }}</template>
</el-table-column>
</el-table> </el-table>
<el-pagination
v-model:current-page="detailPage"
v-model:page-size="detailPageSize"
:page-sizes="[10, 20, 50, 100]"
:total="detailTotal"
layout="total, sizes, prev, pager, next, jumper"
class="mt-4"
@size-change="handleDetailSizeChange"
@current-change="handleDetailPageChange"
/>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@ -507,7 +478,4 @@ onUnmounted(() => {
margin-top: 16px; margin-top: 16px;
justify-content: flex-end; justify-content: flex-end;
} }
.mb-4 {
margin-bottom: 16px;
}
</style> </style>

173
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-field/index.vue

@ -6,7 +6,6 @@ import {
listScanDomain, listScanDomain,
listScanDomainDetails, listScanDomainDetails,
exportScanDomain, exportScanDomain,
type ScanDetailRow,
type ScanTimeParams type ScanTimeParams
} from '@/api/efcode/report/scan-data-situation'; } from '@/api/efcode/report/scan-data-situation';
import { getDomainInfo, type DashboardDomainVo } from '@/api/efcode/dashboard/area-info'; import { getDomainInfo, type DashboardDomainVo } from '@/api/efcode/dashboard/area-info';
@ -28,7 +27,10 @@ const queryParams = reactive({
area: undefined as string | undefined, area: undefined as string | undefined,
field: undefined as string | undefined, field: undefined as string | undefined,
periodType: 'month' as string, periodType: 'month' as string,
year: String(new Date().getFullYear()) year: String(new Date().getFullYear()),
quarter: Math.ceil((new Date().getMonth() + 1) / 3) as number,
month: String(new Date().getMonth() + 1).padStart(2, '0') as string,
week: '' as string
}); });
const periodOptions = [ const periodOptions = [
@ -38,6 +40,14 @@ const periodOptions = [
{ label: '年度', value: 'year' } { label: '年度', value: 'year' }
]; ];
// 季度选项
const quarterOptions = [
{ label: '第一季度', value: 1 },
{ label: '第二季度', value: 2 },
{ label: '第三季度', value: 3 },
{ label: '第四季度', value: 4 }
];
/** 年份选项(近 5 年) */ /** 年份选项(近 5 年) */
const yearOptions = (() => { const yearOptions = (() => {
const curr = new Date().getFullYear(); const curr = new Date().getFullYear();
@ -86,18 +96,18 @@ const calcTableHeight = () => {
/** 按当前时段类型拼装接口时间参数 */ /** 按当前时段类型拼装接口时间参数 */
const buildTimeParams = (): ScanTimeParams => { const buildTimeParams = (): ScanTimeParams => {
const year = queryParams.year; const year = queryParams.year;
const n = new Date();
if (queryParams.periodType === 'quarter') { if (queryParams.periodType === 'quarter') {
return { year, quarter: String(Math.ceil((n.getMonth() + 1) / 3)) }; return { year, quarter: String(queryParams.quarter) };
} }
if (queryParams.periodType === 'month') { if (queryParams.periodType === 'month') {
return { year, month: String(n.getMonth() + 1) }; return queryParams.month ? { year, month: queryParams.month } : { year };
} }
if (queryParams.periodType === 'week') { if (queryParams.periodType === 'week') {
// 周度:取本周一 ~ 本周日 // 周度:以选择周(取周一)为起点,拼本周一 ~ 本周日
const day = n.getDay() || 7; const base = queryParams.week ? new Date(queryParams.week) : new Date();
const monday = new Date(n); const day = base.getDay() || 7;
monday.setDate(n.getDate() - (day - 1)); const monday = new Date(base);
monday.setDate(base.getDate() - (day - 1));
const sunday = new Date(monday); const sunday = new Date(monday);
sunday.setDate(monday.getDate() + 6); sunday.setDate(monday.getDate() + 6);
const fmt = (d: Date) => const fmt = (d: Date) =>
@ -113,6 +123,12 @@ const currentField = () => {
return { domainId: queryParams.field, domainName: item?.domainName }; return { domainId: queryParams.field, domainName: item?.domainName };
}; };
/** 当前选中的所属区(dictValue→districtCode,dictLabel→districtName) */
const currentArea = () => {
const item = areaOptions.value.find((i: any) => i.dictValue === queryParams.area);
return { districtCode: queryParams.area, districtName: item?.dictLabel };
};
const getList = async () => { const getList = async () => {
loading.value = true; loading.value = true;
try { try {
@ -120,7 +136,8 @@ const getList = async () => {
...buildTimeParams(), ...buildTimeParams(),
pageNum: currentPage.value, pageNum: currentPage.value,
pageSize: pageSize.value, pageSize: pageSize.value,
...currentField() ...currentField(),
...currentArea()
}); });
tableData.value = (res as any)?.rows || []; tableData.value = (res as any)?.rows || [];
total.value = (res as any)?.total || 0; total.value = (res as any)?.total || 0;
@ -137,10 +154,14 @@ const handleSearch = () => {
}; };
const handleReset = () => { const handleReset = () => {
const n = new Date();
queryParams.area = undefined; queryParams.area = undefined;
queryParams.field = undefined; queryParams.field = undefined;
queryParams.periodType = 'month'; queryParams.periodType = 'month';
queryParams.year = String(new Date().getFullYear()); queryParams.year = String(n.getFullYear());
queryParams.quarter = Math.ceil((n.getMonth() + 1) / 3);
queryParams.month = String(n.getMonth() + 1).padStart(2, '0');
queryParams.week = '';
currentPage.value = 1; currentPage.value = 1;
pageSize.value = 20; pageSize.value = 20;
getList(); getList();
@ -181,14 +202,23 @@ const handlePageChange = (page: number) => {
getList(); getList();
}; };
// ======================== 详情弹窗 ======================== // ======================== 详情弹窗(领域 → 街道) ========================
interface StreetRow {
id?: number | string;
streetName?: string;
districtName?: string;
xzzfCount?: number | null;
xzzfslpm?: number | string | null;
xzzfslzb?: number | string | null;
fxzzfsl?: number | null;
fxzzfslpm?: number | string | null;
fxzzfslzb?: number | string | null;
}
const detailDialogVisible = ref(false); const detailDialogVisible = ref(false);
const detailField = ref<FieldRow | null>(null); const detailField = ref<FieldRow | null>(null);
const detailLoading = ref(false); const detailLoading = ref(false);
const detailTableData = ref<ScanDetailRow[]>([]); const detailTableData = ref<StreetRow[]>([]);
const detailTotal = ref(0);
const detailPage = ref(1);
const detailPageSize = ref(20);
const getDetailList = async () => { const getDetailList = async () => {
detailLoading.value = true; detailLoading.value = true;
@ -196,13 +226,11 @@ const getDetailList = async () => {
if (!detailField.value) return; if (!detailField.value) return;
const res = await listScanDomainDetails({ const res = await listScanDomainDetails({
...buildTimeParams(), ...buildTimeParams(),
pageNum: detailPage.value,
pageSize: detailPageSize.value,
domainId: detailField.value.domainId || queryParams.field, domainId: detailField.value.domainId || queryParams.field,
domainName: detailField.value.domainName || detailField.value.fieldName || currentField().domainName domainName: detailField.value.domainName || detailField.value.fieldName || currentField().domainName,
...currentArea()
}); });
detailTableData.value = (res as any)?.rows || []; detailTableData.value = (res as any)?.rows || (Array.isArray(res) ? res : []);
detailTotal.value = (res as any)?.total || 0;
} catch (e) { } catch (e) {
console.warn('[scan-field] 详情接口调用失败', e); console.warn('[scan-field] 详情接口调用失败', e);
} finally { } finally {
@ -212,22 +240,10 @@ const getDetailList = async () => {
const handleDetail = (row: FieldRow) => { const handleDetail = (row: FieldRow) => {
detailField.value = row; detailField.value = row;
detailPage.value = 1;
detailDialogVisible.value = true; detailDialogVisible.value = true;
getDetailList(); getDetailList();
}; };
const handleDetailSizeChange = (size: number) => {
detailPageSize.value = size;
detailPage.value = 1;
getDetailList();
};
const handleDetailPageChange = (page: number) => {
detailPage.value = page;
getDetailList();
};
onMounted(() => { onMounted(() => {
loadAreaDict(); loadAreaDict();
loadFieldDict(); loadFieldDict();
@ -272,10 +288,37 @@ onUnmounted(() => {
<el-option v-for="item in periodOptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in periodOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item v-if="queryParams.periodType !== 'week'">
<el-select v-model="queryParams.year" class="year-select"> <el-select v-model="queryParams.year" v-if="queryParams.periodType === 'year'" class="year-select">
<el-option v-for="y in yearOptions" :key="y" :label="`${y}年`" :value="y" /> <el-option v-for="y in yearOptions" :key="y" :label="`${y}年`" :value="y" />
</el-select> </el-select>
<!-- 季度:年份 + 季度 -->
<el-select
v-if="queryParams.periodType === 'quarter'"
v-model="queryParams.quarter"
class="quarter-select"
>
<el-option v-for="q in quarterOptions" :key="q.value" :label="q.label" :value="q.value" />
</el-select>
<!-- 月度:年份 + 月份 -->
<el-date-picker
v-if="queryParams.periodType === 'month'"
v-model="queryParams.month"
type="month"
value-format="MM"
placeholder="选择月份"
class="month-picker"
/>
</el-form-item>
<!-- 周度:选择具体周 -->
<el-form-item v-if="queryParams.periodType === 'week'">
<el-date-picker
v-model="queryParams.week"
type="week"
value-format="YYYY-MM-DD"
placeholder="选择周"
class="week-picker"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleSearch">搜索</el-button> <el-button type="primary" @click="handleSearch">搜索</el-button>
@ -327,11 +370,11 @@ onUnmounted(() => {
</div> </div>
</div> </div>
<!-- ==================== 扫码明细弹窗 ==================== --> <!-- ==================== 领域 → 街道详情弹窗 ==================== -->
<el-dialog <el-dialog
v-model="detailDialogVisible" v-model="detailDialogVisible"
width="1100px" width="1400px"
:title="`${detailField?.fieldName || ''} — 扫码明细`" :title="detailField?.domainName || detailField?.fieldName || ''"
append-to-body append-to-body
top="5vh" top="5vh"
destroy-on-close destroy-on-close
@ -344,25 +387,29 @@ onUnmounted(() => {
style="width: 100%" style="width: 100%"
max-height="55vh" max-height="55vh"
> >
<el-table-column label="序号" type="index" width="80" align="center" /> <el-table-column label="序号" type="index" width="70" align="center" />
<el-table-column label="企业名称" prop="enterpriseName" min-width="220" align="center" /> <el-table-column label="所属街道" min-width="160" align="center">
<el-table-column label="扫码时间" prop="scanTime" min-width="180" align="center" /> <template #default="{ row }">{{ row.streetName || row.districtName || '-' }}</template>
<el-table-column label="扫码类型" prop="scanType" width="120" align="center" /> </el-table-column>
<el-table-column label="执法单位" prop="bureauDeptName" min-width="220" align="center" /> <el-table-column label="行政执法数量(条)" min-width="170" align="center">
<el-table-column label="执法人员" prop="lawEnforcer" width="120" align="center" /> <template #default="{ row }">{{ row.xzzfCount ?? '-' }}</template>
<el-table-column label="执法事项" prop="enforcementItem" min-width="200" align="center" /> </el-table-column>
<el-table-column label="行政执法数量排名" min-width="170" align="center">
<template #default="{ row }">{{ row.xzzfslpm ?? '-' }}</template>
</el-table-column>
<el-table-column label="行政执法数量占比(%)" min-width="160" align="center">
<template #default="{ row }">{{ row.xzzfslzb ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量(条)" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfsl ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量排名" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfslpm ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量占比(%)" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfslzb ?? '-' }}</template>
</el-table-column>
</el-table> </el-table>
<el-pagination
v-model:current-page="detailPage"
v-model:page-size="detailPageSize"
:page-sizes="[10, 20, 50, 100]"
:total="detailTotal"
layout="total, sizes, prev, pager, next, jumper"
class="mt-4"
@size-change="handleDetailSizeChange"
@current-change="handleDetailPageChange"
/>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@ -403,6 +450,20 @@ onUnmounted(() => {
.year-select { .year-select {
width: 110px; width: 110px;
} }
.quarter-select {
width: 110px;
margin-left: 4px;
}
.month-picker {
width: 120px;
margin-left: 4px;
}
.week-picker {
width: 220px;
}
} }
.table-panel { .table-panel {

12
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/situation-trend/components/SituationPane.vue

@ -240,25 +240,27 @@ defineExpose({ calcTableHeight });
border border
stripe stripe
style="width: 100%" style="width: 100%"
:height="tableHeight" height="600"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="90" align="center" type="index" /> <el-table-column label="序号" width="90" align="center" type="index" />
<el-table-column <el-table-column
prop="dimensionName" prop="districtName"
:label="dimension === 'area' ? '所属区' : '所属领域'" :label="dimension === 'area' ? '所属区' : '所属领域'"
min-width="220" min-width="220"
align="center" align="center"
/> ><template #default="{ row }">
{{ row.districtName || row.lymc || '' }}
</template> </el-table-column>
<el-table-column label="年+季度" width="160" align="center"> <el-table-column label="年+季度" width="160" align="center">
<template #default="{ row }"> <template #default="{ row }">
{{ row.yearQuarter || '' }} {{ row.year + 'Q' + row.quarter || '' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="行政执法综合评分" min-width="180" align="center"> <el-table-column label="行政执法综合评分" min-width="180" align="center">
<template #default="{ row }"> <template #default="{ row }">
<span v-if="row.score !== null && row.score !== undefined">{{ row.score }}</span> <span>{{ row.zhpjDescription }}</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

43
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/trend-behavior/components/TrendPane.vue

@ -2,6 +2,7 @@
import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue'; import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data'; import { getDicts } from '@/api/system/dict/data';
import { getDomainInfo, type DashboardDomainVo } from '@/api/efcode/dashboard/area-info';
import { import {
listTrendBehaviorArea, listTrendBehaviorArea,
listTrendBehaviorDomain, listTrendBehaviorDomain,
@ -42,19 +43,12 @@ const quarterOptions = [
{ label: '第四季度', value: '4' } { label: '第四季度', value: '4' }
]; ];
/** 拼接 quarterTime 传给后端(格式:2026-Q3) */ /** 拼接 quarterTime 传给后端(格式:2026Q3) */
const buildQuarterTime = () => `${queryParams.year}-Q${queryParams.quarter}`; const buildQuarterTime = () => `${queryParams.year}Q${queryParams.quarter}`;
// ======================== 字典 ======================== // ======================== 字典 ========================
const areaOptions = ref<any[]>([]); const areaOptions = ref<any[]>([]);
const fieldOptions = [ const fieldOptions = ref<DashboardDomainVo[]>([]);
{ label: '食品安全', value: 'food' },
{ label: '药品安全', value: 'drug' },
{ label: '特种设备', value: 'special_equipment' },
{ label: '产品质量', value: 'product' },
{ label: '计量', value: 'metrology' },
{ label: '认证认可', value: 'certification' }
];
const loadAreaDict = async () => { const loadAreaDict = async () => {
try { try {
@ -65,6 +59,15 @@ const loadAreaDict = async () => {
} }
}; };
const loadFieldDict = async () => {
try {
const res = await getDomainInfo();
fieldOptions.value = res.data || [];
} catch (e) {
console.error('加载所属领域字典失败', e);
}
};
// ======================== 表格数据 ======================== // ======================== 表格数据 ========================
const loading = ref(false); const loading = ref(false);
const tableData = ref<TrendBehaviorRow[]>([]); const tableData = ref<TrendBehaviorRow[]>([]);
@ -160,6 +163,7 @@ const handleSelectionChange = (selection: TrendBehaviorRow[]) => {
onMounted(() => { onMounted(() => {
loadAreaDict(); loadAreaDict();
loadFieldDict();
getList(); getList();
nextTick(() => calcTableHeight()); nextTick(() => calcTableHeight());
window.addEventListener('resize', calcTableHeight); window.addEventListener('resize', calcTableHeight);
@ -194,7 +198,7 @@ defineExpose({ calcTableHeight });
class="search-select" class="search-select"
clearable clearable
> >
<el-option v-for="item in fieldOptions" :key="item.value" :label="item.label" :value="item.label" /> <el-option v-for="item in fieldOptions" :key="item.domainId" :label="item.domainName" :value="item.domainName" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="年份"> <el-form-item label="年份">
@ -230,19 +234,22 @@ defineExpose({ calcTableHeight });
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="90" align="center" type="index" /> <el-table-column label="序号" width="90" align="center" type="index" />
<el-table-column <el-table-column
prop="dimensionName" prop="districtName"
:label="dimension === 'area' ? '所属区' : '所属领域'" :label="dimension === 'area' ? '所属区' : '所属领域'"
min-width="220"
align="center" align="center"
/> >
<el-table-column label="年+季度" width="160" align="center"> <template #default="{ row }">
{{ row.districtName || row.domainName || '' }}
</template>
</el-table-column>
<el-table-column label="年+季度" align="center">
<template #default="{ row }"> <template #default="{ row }">
{{ row.yearQuarter || '' }} {{ row.quarterTime || '' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="行政执法次数" width="180" align="center"> <el-table-column label="行政执法次数" align="center">
<template #default="{ row }"> <template #default="{ row }">
<span v-if="row.enforcementCount !== null && row.enforcementCount !== undefined">{{ row.enforcementCount }}次</span> <span>{{ row.jccs }}次</span>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>

Loading…
Cancel
Save