|
|
|
@ -54,8 +54,8 @@ |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="select_item"> |
|
|
|
<label class="select_time">时间筛选</label> |
|
|
|
<el-date-picker v-model="dateRange" type="daterange" range-separator="至" value-format="YYYY-MM-DD" clearable @change="refreshAll" /> |
|
|
|
<label class="select_time" :class="{ active: datePickerOpen }" @click="datePickerOpen = !datePickerOpen">时间筛选<a></a></label> |
|
|
|
<el-date-picker v-if="datePickerOpen" v-model="dateRange" type="daterange" range-separator="至" value-format="YYYY-MM-DD" clearable @change="refreshAll" /> |
|
|
|
<span>综合数据</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -195,6 +195,7 @@ const cssVars = computed(() => { |
|
|
|
}); |
|
|
|
|
|
|
|
const dateRange = ref<[string, string] | null>(null); |
|
|
|
const datePickerOpen = ref(false); |
|
|
|
const deptPanelOpen = ref(false); |
|
|
|
const detailPanelOpen = ref(false); |
|
|
|
const detailTab = ref(0); |
|
|
|
@ -212,83 +213,7 @@ const rankSizeEnt = ref(10); |
|
|
|
const rankSizeInspect = ref(10); |
|
|
|
const rankSizeComplaint = ref(10); |
|
|
|
|
|
|
|
/* ======================== 开发调试用假数据 ======================== */ |
|
|
|
const MOCK_STATS: Partial<CollectStatisticsData> = { |
|
|
|
singleLaw: { count: 1285, yesterday: 35, thisMonth: 142, yoy: 4.2, mom: 1.8, completed: 0, unCompleted: 0 }, |
|
|
|
unionLaw: { count: 86, yesterday: 2, thisMonth: 12, yoy: -1.5, mom: 3.1, completed: 0, unCompleted: 0 }, |
|
|
|
enfEnt: { count: 928, yesterday: 41, thisMonth: 168, yoy: 6.3, mom: 2.5, completed: 0, unCompleted: 0 }, |
|
|
|
entEeduction: { count: 142, yesterday: 5, thisMonth: 18, yoy: -3.5, mom: 0.8, rate: '2.36%' }, |
|
|
|
entComplaint: { count: 85, yesterday: 2, thisMonth: 10, yoy: 8.2, mom: 4.1, completed: 62, unCompleted: 23 }, |
|
|
|
ent: { count: 48560, yesterday: 8, thisMonth: 22, yoy: 0.5, mom: 0.2, completed: 0, unCompleted: 0 }, |
|
|
|
lawCategoryTotal: 1438, |
|
|
|
lawCategory: [ |
|
|
|
{ 行政检查: 1220 }, { 行政处罚: 125 }, { 行政许可: 42 }, { 行政强制: 32 }, |
|
|
|
{ 行政征收: 5 }, { 行政给付: 8 }, { 行政确认: 6 }, { 行政登记: 0 }, |
|
|
|
{ 行政裁决: 0 }, { 文书送达: 0 } |
|
|
|
], |
|
|
|
totalCaseType: 35, |
|
|
|
caseType: [ |
|
|
|
{ 违规执法: 21 }, { 违法执法: 6 }, { 入企不扫码: 4 }, { 其他: 4 } |
|
|
|
], |
|
|
|
lawFieldTotal: 1285, |
|
|
|
lawField: [ |
|
|
|
{ 卫生健康: 320 }, { 应急管理: 215 }, { 生态环境: 168 }, { 市场监督管理资源: 380 }, { 规划和自然资源: 202 } |
|
|
|
], |
|
|
|
eva: { high: 62, mid: 17, low: 3, un: 3 }, |
|
|
|
law_comp: { count: 85, mom: 4.1, yoy: 8.2, completed: 62 }, |
|
|
|
district: { |
|
|
|
福田: { singleLaw: 420, unionLaw: 30, enfEnt: 380, entEeduction: 5, compAddress: 25, entAddress: 4800 }, |
|
|
|
罗湖: { singleLaw: 260, unionLaw: 20, enfEnt: 220, entEeduction: 3, compAddress: 18, entAddress: 3200 }, |
|
|
|
南山: { singleLaw: 320, unionLaw: 25, enfEnt: 300, entEeduction: 4, compAddress: 22, entAddress: 5000 }, |
|
|
|
盐田: { singleLaw: 60, unionLaw: 8, enfEnt: 45, entEeduction: 1, compAddress: 6, entAddress: 300 }, |
|
|
|
宝安: { singleLaw: 580, unionLaw: 45, enfEnt: 520, entEeduction: 8, compAddress: 35, entAddress: 18500 }, |
|
|
|
龙岗: { singleLaw: 510, unionLaw: 35, enfEnt: 440, entEeduction: 7, compAddress: 28, entAddress: 16500 }, |
|
|
|
龙华: { singleLaw: 150, unionLaw: 15, enfEnt: 130, entEeduction: 2, compAddress: 12, entAddress: 2500 }, |
|
|
|
坪山: { singleLaw: 80, unionLaw: 10, enfEnt: 75, entEeduction: 1, compAddress: 7, entAddress: 4500 }, |
|
|
|
光明: { singleLaw: 110, unionLaw: 12, enfEnt: 95, entEeduction: 2, compAddress: 9, entAddress: 16500 }, |
|
|
|
大鹏新: { singleLaw: 40, unionLaw: 5, enfEnt: 35, entEeduction: 0, compAddress: 3, entAddress: 17500 }, |
|
|
|
深汕: { singleLaw: 25, unionLaw: 3, enfEnt: 20, entEeduction: 0, compAddress: 2, entAddress: 200 } |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
const MOCK_ENF_ENT_SORT = [ |
|
|
|
{ enterprise_name: '深圳市某某科技有限公司', cnt: 56 }, |
|
|
|
{ enterprise_name: '某某电子(深圳)有限公司', cnt: 42 }, |
|
|
|
{ enterprise_name: '深圳市某某食品有限公司', cnt: 38 }, |
|
|
|
{ enterprise_name: '某某集团股份有限公司', cnt: 31 }, |
|
|
|
{ enterprise_name: '某某环保科技深圳分公司', cnt: 27 }, |
|
|
|
{ enterprise_name: '深圳市某某医疗器械公司', cnt: 24 }, |
|
|
|
{ enterprise_name: '某某光电股份有限公司', cnt: 19 }, |
|
|
|
{ enterprise_name: '深圳市某某化工有限公司', cnt: 16 }, |
|
|
|
{ enterprise_name: '深圳市某某物流有限公司', cnt: 13 }, |
|
|
|
{ enterprise_name: '某某商贸(深圳)有限公司', cnt: 9 } |
|
|
|
]; |
|
|
|
|
|
|
|
const MOCK_ENFORCEMENT_SORT = [ |
|
|
|
{ bureau_dept_name: '福田区市场监督管理局', cnt: 152 }, |
|
|
|
{ bureau_dept_name: '宝安区应急管理局', cnt: 138 }, |
|
|
|
{ bureau_dept_name: '龙岗区生态环境局', cnt: 115 }, |
|
|
|
{ bureau_dept_name: '南山区市场监督管理局', cnt: 98 }, |
|
|
|
{ bureau_dept_name: '罗湖区卫生健康局', cnt: 82 }, |
|
|
|
{ bureau_dept_name: '龙华区应急管理局', cnt: 68 }, |
|
|
|
{ bureau_dept_name: '光明区市场监督管理局', cnt: 54 }, |
|
|
|
{ bureau_dept_name: '坪山区应急管理局', cnt: 43 }, |
|
|
|
{ bureau_dept_name: '盐田区卫生健康局', cnt: 32 }, |
|
|
|
{ bureau_dept_name: '大鹏新区应急管理局', cnt: 18 } |
|
|
|
]; |
|
|
|
|
|
|
|
const MOCK_ENT_C_SORT = [ |
|
|
|
{ bureau_dept_name: '福田区市场监督管理局', cnt: 28 }, |
|
|
|
{ bureau_dept_name: '宝安区市场监督管理局', cnt: 24 }, |
|
|
|
{ bureau_dept_name: '南山区卫生健康局', cnt: 18 }, |
|
|
|
{ bureau_dept_name: '龙岗区应急管理局', cnt: 15 }, |
|
|
|
{ bureau_dept_name: '罗湖区市场监督管理局', cnt: 12 }, |
|
|
|
{ bureau_dept_name: '龙华区应急管理局', cnt: 9 }, |
|
|
|
{ bureau_dept_name: '盐田区卫生健康局', cnt: 7 }, |
|
|
|
{ bureau_dept_name: '光明区市场监督管理局', cnt: 5 }, |
|
|
|
{ bureau_dept_name: '坪山区应急管理局', cnt: 4 }, |
|
|
|
{ bureau_dept_name: '大鹏新区卫生健康局', cnt: 2 } |
|
|
|
]; |
|
|
|
/* ======================== 开发调试用假数据(已删除) ======================== */ |
|
|
|
|
|
|
|
const districtBarRef = ref<HTMLElement>(); |
|
|
|
const complaintHandlingRef = ref<HTMLElement>(); |
|
|
|
@ -374,7 +299,8 @@ function initChart(key: string, el?: HTMLElement) { |
|
|
|
|
|
|
|
async function loadStatistics() { |
|
|
|
const res = await safeLoad(() => collectStatistics(getParams())); |
|
|
|
const data = (res ? unwrapData(res) : MOCK_STATS) as Partial<CollectStatisticsData>; |
|
|
|
if (!res) return; |
|
|
|
const data = (unwrapData(res) ?? {}) as Partial<CollectStatisticsData>; |
|
|
|
stats.value = data; |
|
|
|
|
|
|
|
if (data.law_comp) { |
|
|
|
@ -443,33 +369,34 @@ function renderRank( |
|
|
|
nameKey: 'enterprise_name' | 'bureau_dept_name', |
|
|
|
title: string |
|
|
|
) { |
|
|
|
if (!el || !data.length) return; |
|
|
|
if (!el) return; |
|
|
|
const chart = initChart(key, el); |
|
|
|
if (!data.length) { |
|
|
|
chart?.clear(); |
|
|
|
return; |
|
|
|
} |
|
|
|
const names = data.map((d) => d[nameKey] || ''); |
|
|
|
const values = data.map((d) => toNum(d.cnt)); |
|
|
|
chart?.setOption(buildRankBarOption(names, values, title), true); |
|
|
|
} |
|
|
|
|
|
|
|
async function loadEnfEntSort() { |
|
|
|
const size = rankSizeEnt.value; |
|
|
|
const res = await safeLoad(() => queryEnfEntSort({ ...getParams(), pageSize: size })); |
|
|
|
const list = res ? unwrapData(res) : MOCK_ENF_ENT_SORT.slice(0, size); |
|
|
|
const res = await safeLoad(() => queryEnfEntSort({ ...getParams(), pageSize: rankSizeEnt.value })); |
|
|
|
const list = res ? unwrapData(res) : []; |
|
|
|
await nextTick(); |
|
|
|
renderRank(rankCompanyRef.value, 'rankCompany', normalizeRankList(list), 'enterprise_name', '被执法企业次数'); |
|
|
|
} |
|
|
|
|
|
|
|
async function loadEnforcementSort() { |
|
|
|
const size = rankSizeInspect.value; |
|
|
|
const res = await safeLoad(() => queryEnforcementSort({ ...getParams(), pageSize: size })); |
|
|
|
const list = res ? unwrapData(res) : MOCK_ENFORCEMENT_SORT.slice(0, size); |
|
|
|
const res = await safeLoad(() => queryEnforcementSort({ ...getParams(), pageSize: rankSizeInspect.value })); |
|
|
|
const list = res ? unwrapData(res) : []; |
|
|
|
await nextTick(); |
|
|
|
renderRank(rankInspectRef.value, 'rankInspect', normalizeRankList(list), 'bureau_dept_name', '执法数量'); |
|
|
|
} |
|
|
|
|
|
|
|
async function loadEntCSort() { |
|
|
|
const size = rankSizeComplaint.value; |
|
|
|
const res = await safeLoad(() => queryEntCSort({ ...getParams(), pageSize: size })); |
|
|
|
const list = res ? unwrapData(res) : MOCK_ENT_C_SORT.slice(0, size); |
|
|
|
const res = await safeLoad(() => queryEntCSort({ ...getParams(), pageSize: rankSizeComplaint.value })); |
|
|
|
const list = res ? unwrapData(res) : []; |
|
|
|
await nextTick(); |
|
|
|
renderRank(rankComplaintRef.value, 'rankComplaint', normalizeRankList(list), 'bureau_dept_name', '投诉次数'); |
|
|
|
} |
|
|
|
|