|
|
@ -3,7 +3,7 @@ |
|
|
<div class="wrap_all"> |
|
|
<div class="wrap_all"> |
|
|
<div class="select_set"> |
|
|
<div class="select_set"> |
|
|
<div class="select_item select_item--anchor"> |
|
|
<div class="select_item select_item--anchor"> |
|
|
<label class="select_area" :class="{ active: deptPanelOpen }" @click="deptPanelOpen = !deptPanelOpen"> |
|
|
<label class="select_area" :class="{ active: deptPanelOpen }" @click="toggleDeptPanel"> |
|
|
{{ deptName }}<a></a> |
|
|
{{ deptName }}<a></a> |
|
|
</label> |
|
|
</label> |
|
|
<dl v-show="deptPanelOpen" class="fold_cont" :class="{ 'is-open': deptPanelOpen }"> |
|
|
<dl v-show="deptPanelOpen" class="fold_cont" :class="{ 'is-open': deptPanelOpen }"> |
|
|
@ -27,22 +27,22 @@ |
|
|
<span :class="{ active: detailTab === 0 }" @click="detailTab = 0">区直单位</span> |
|
|
<span :class="{ active: detailTab === 0 }" @click="detailTab = 0">区直单位</span> |
|
|
<span :class="{ active: detailTab === 1 }" @click="detailTab = 1">街道</span> |
|
|
<span :class="{ active: detailTab === 1 }" @click="detailTab = 1">街道</span> |
|
|
</div> |
|
|
</div> |
|
|
<div v-show="detailTab === 0" class="tabcont"> |
|
|
<div v-if="detailTab === 0" class="tabcont tabcont--shown"> |
|
|
<div class="selcont"> |
|
|
<div class="selcont"> |
|
|
<a |
|
|
<a |
|
|
v-for="item in districtDetailList" |
|
|
v-for="item in districtDetailList" |
|
|
:key="String(item.deptId)" |
|
|
:key="'d-'+String(item.deptId)" |
|
|
class="selitem" |
|
|
class="selitem" |
|
|
:class="{ selected: selectedSubDeptId === item.deptId, active: selectedSubDeptId === item.deptId }" |
|
|
:class="{ selected: selectedSubDeptId === item.deptId, active: selectedSubDeptId === item.deptId }" |
|
|
@click="selectSubDept(item)" |
|
|
@click="selectSubDept(item)" |
|
|
>{{ item.deptName }}</a> |
|
|
>{{ item.deptName }}</a> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<div v-show="detailTab === 1" class="tabcont"> |
|
|
<div v-if="detailTab === 1" class="tabcont tabcont--shown"> |
|
|
<div class="selcont"> |
|
|
<div class="selcont"> |
|
|
<a |
|
|
<a |
|
|
v-for="item in streetDetailList" |
|
|
v-for="item in streetDetailList" |
|
|
:key="String(item.deptId)" |
|
|
:key="'s-'+String(item.deptId)" |
|
|
class="selitem" |
|
|
class="selitem" |
|
|
:class="{ selected: selectedSubDeptId === item.deptId, active: selectedSubDeptId === item.deptId }" |
|
|
:class="{ selected: selectedSubDeptId === item.deptId, active: selectedSubDeptId === item.deptId }" |
|
|
@click="selectSubDept(item)" |
|
|
@click="selectSubDept(item)" |
|
|
@ -54,7 +54,7 @@ |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<div class="select_item"> |
|
|
<div class="select_item"> |
|
|
<label class="select_time" :class="{ active: datePickerOpen }" @click="datePickerOpen = !datePickerOpen">时间筛选<a></a></label> |
|
|
<label class="select_time" :class="{ active: datePickerOpen }" @click="toggleDatePicker">时间筛选<a></a></label> |
|
|
<el-date-picker v-if="datePickerOpen" v-model="dateRange" type="daterange" range-separator="至" value-format="YYYY-MM-DD" clearable @change="refreshAll" /> |
|
|
<el-date-picker v-if="datePickerOpen" v-model="dateRange" type="daterange" range-separator="至" value-format="YYYY-MM-DD" clearable @change="refreshAll" /> |
|
|
<span>综合数据</span> |
|
|
<span>综合数据</span> |
|
|
</div> |
|
|
</div> |
|
|
@ -202,7 +202,7 @@ const detailTab = ref(0); |
|
|
const deptList = ref<(SysDeptVo & { deptId: string | number | null })[]>([]); |
|
|
const deptList = ref<(SysDeptVo & { deptId: string | number | null })[]>([]); |
|
|
const selectedDeptId = ref<string | number | null>(null); |
|
|
const selectedDeptId = ref<string | number | null>(null); |
|
|
const selectedSubDeptId = ref<string | number | null>(null); |
|
|
const selectedSubDeptId = ref<string | number | null>(null); |
|
|
const selectedForDetail = ref<SysDeptVo | null>(null); |
|
|
const selectedForDetail = ref<(SysDeptVo & { deptId: string | number | null }) | null>(null); |
|
|
const deptName = ref('各区'); |
|
|
const deptName = ref('各区'); |
|
|
const detailDistrictName = ref(''); |
|
|
const detailDistrictName = ref(''); |
|
|
const districtDetailList = ref<SysDeptVo[]>([]); |
|
|
const districtDetailList = ref<SysDeptVo[]>([]); |
|
|
@ -231,6 +231,22 @@ function isSelected(dept: SysDeptVo & { deptId: string | number | null }) { |
|
|
return String(dept.deptId) === String(selectedDeptId.value) || (dept.deptId === null && selectedDeptId.value === null); |
|
|
return String(dept.deptId) === String(selectedDeptId.value) || (dept.deptId === null && selectedDeptId.value === null); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** 旧项目:点击下拉菜单时关闭所有其他面板 */ |
|
|
|
|
|
function toggleDeptPanel() { |
|
|
|
|
|
deptPanelOpen.value = !deptPanelOpen.value; |
|
|
|
|
|
if (deptPanelOpen.value) { |
|
|
|
|
|
datePickerOpen.value = false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function toggleDatePicker() { |
|
|
|
|
|
datePickerOpen.value = !datePickerOpen.value; |
|
|
|
|
|
if (datePickerOpen.value) { |
|
|
|
|
|
deptPanelOpen.value = false; |
|
|
|
|
|
detailPanelOpen.value = false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
function getParams() { |
|
|
function getParams() { |
|
|
const bureauDeptId = selectedSubDeptId.value ?? selectedDeptId.value; |
|
|
const bureauDeptId = selectedSubDeptId.value ?? selectedDeptId.value; |
|
|
return { beginTime: dateRange.value?.[0], endTime: dateRange.value?.[1], zone: 2, bureauDeptId }; |
|
|
return { beginTime: dateRange.value?.[0], endTime: dateRange.value?.[1], zone: 2, bureauDeptId }; |
|
|
@ -248,21 +264,30 @@ async function loadDepts() { |
|
|
if (datas.length >= 11) { |
|
|
if (datas.length >= 11) { |
|
|
list.push({ deptId: null, deptName: '各区' }); |
|
|
list.push({ deptId: null, deptName: '各区' }); |
|
|
changeDept(null, '各区'); |
|
|
changeDept(null, '各区'); |
|
|
|
|
|
// 旧项目:初始化时预加载弹出面板数据 |
|
|
|
|
|
selectedForDetail.value = { deptId: null, deptName: '各区' }; |
|
|
|
|
|
detailDistrictName.value = '各区'; |
|
|
|
|
|
loadStreetAndDistrict(null); |
|
|
} else if (datas.length === 0) { |
|
|
} else if (datas.length === 0) { |
|
|
list.push({ deptId: -1, deptName: '无权限' }); |
|
|
list.push({ deptId: -1, deptName: '无权限' }); |
|
|
changeDept(-1, '无权限'); |
|
|
changeDept(-1, '无权限'); |
|
|
} else if (datas.length > 0) { |
|
|
} else if (datas.length > 0) { |
|
|
changeDept(datas[0].deptId, datas[0].deptName); |
|
|
changeDept(datas[0].deptId, datas[0].deptName); |
|
|
|
|
|
// 旧项目:初始化时预加载弹出面板数据 |
|
|
|
|
|
selectedForDetail.value = datas[0] as SysDeptVo & { deptId: string | number }; |
|
|
|
|
|
detailDistrictName.value = datas[0].deptName; |
|
|
|
|
|
loadStreetAndDistrict(datas[0].deptId); |
|
|
} |
|
|
} |
|
|
deptList.value = [...list, ...datas]; |
|
|
deptList.value = [...list, ...datas]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function onDeptClick(dept: SysDeptVo & { deptId: string | number | null }) { |
|
|
function onDeptClick(dept: SysDeptVo & { deptId: string | number | null }) { |
|
|
if (dept.deptId === null || dept.deptId === -1) { |
|
|
if (dept.deptId === -1) { |
|
|
changeDept(dept.deptId, dept.deptName); |
|
|
changeDept(dept.deptId, dept.deptName); |
|
|
detailPanelOpen.value = false; |
|
|
detailPanelOpen.value = false; |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
// 旧项目:无论点击哪个区(包括"各区"),都会显示弹出面板 |
|
|
selectedForDetail.value = dept; |
|
|
selectedForDetail.value = dept; |
|
|
detailDistrictName.value = dept.deptName; |
|
|
detailDistrictName.value = dept.deptName; |
|
|
detailPanelOpen.value = true; |
|
|
detailPanelOpen.value = true; |
|
|
@ -272,22 +297,31 @@ function onDeptClick(dept: SysDeptVo & { deptId: string | number | null }) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function selectSubDept(item: SysDeptVo) { |
|
|
function selectSubDept(item: SysDeptVo) { |
|
|
selectedSubDeptId.value = selectedSubDeptId.value === item.deptId ? null : item.deptId; |
|
|
if (selectedSubDeptId.value === item.deptId) { |
|
|
|
|
|
// 取消选中,恢复为区级名称 |
|
|
|
|
|
selectedSubDeptId.value = null; |
|
|
|
|
|
deptName.value = detailDistrictName.value; |
|
|
|
|
|
} else { |
|
|
|
|
|
// 选中子单位,更新下拉按钮显示子单位名称(旧项目 changeArea type=2 的行为) |
|
|
|
|
|
selectedSubDeptId.value = item.deptId; |
|
|
|
|
|
deptName.value = item.deptName; |
|
|
|
|
|
} |
|
|
refreshAll(); |
|
|
refreshAll(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function changeDept(id: string | number | null, name: string) { |
|
|
function changeDept(id: string | number | null, name: string) { |
|
|
selectedDeptId.value = id; |
|
|
selectedDeptId.value = id; |
|
|
deptName.value = name; |
|
|
deptName.value = name; |
|
|
deptPanelOpen.value = false; |
|
|
// 旧项目:下拉菜单保持打开,弹出面板显示在右侧,这里不需要关闭下拉菜单 |
|
|
|
|
|
// deptPanelOpen.value = false; |
|
|
refreshAll(); |
|
|
refreshAll(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
async function loadStreetAndDistrict(deptId: string | number) { |
|
|
async function loadStreetAndDistrict(deptId: string | number | null) { |
|
|
const res = await safeLoad(() => queryStreetAndDistrict({ zoneList: [3, 4], deptId })); |
|
|
const res = await safeLoad(() => queryStreetAndDistrict({ zoneList: [3, 4], deptId })); |
|
|
const list = unwrapData<SysDeptVo[]>(res) || []; |
|
|
const list = unwrapData<SysDeptVo[]>(res) || []; |
|
|
districtDetailList.value = list.filter((d) => d.zone === 3); |
|
|
districtDetailList.value = list.filter((d) => String(d.zone) === '3'); |
|
|
streetDetailList.value = list.filter((d) => d.zone === 4); |
|
|
streetDetailList.value = list.filter((d) => String(d.zone) === '4'); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function initChart(key: string, el?: HTMLElement) { |
|
|
function initChart(key: string, el?: HTMLElement) { |
|
|
|