添加链接

This commit is contained in:
chenlin
2025-12-29 17:37:38 +08:00
parent 07331d0e15
commit 260cacb8dd
10 changed files with 281 additions and 218 deletions

View File

@@ -31,7 +31,7 @@
<span class="card-icon">👥</span> <span class="card-icon">👥</span>
外协管理 外协管理
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openOutsourcingManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="donut-chart-wrapper"> <div class="donut-chart-wrapper">
@@ -58,7 +58,7 @@
<span class="card-icon">🛡</span> <span class="card-icon">🛡</span>
风险管理 风险管理
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openRiskManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="donut-chart-wrapper"> <div class="donut-chart-wrapper">
@@ -85,7 +85,7 @@
<span class="card-icon warning"></span> <span class="card-icon warning"></span>
隐患管理 隐患管理
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openHiddenDangerManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="line-chart-wrapper"> <div class="line-chart-wrapper">
@@ -114,7 +114,7 @@
<span class="card-icon">🚧</span> <span class="card-icon">🚧</span>
高危作业 高危作业
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openHighRiskManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="high-risk-top"> <div class="high-risk-top">
@@ -151,7 +151,7 @@
<span class="card-icon">📄</span> <span class="card-icon">📄</span>
应急预案 应急预案
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openEmergencyPlanManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="emergency-plan-top"> <div class="emergency-plan-top">
@@ -191,7 +191,7 @@
<span class="card-icon">📚</span> <span class="card-icon">📚</span>
安全培训 安全培训
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openTrainingManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="bar-chart-wrapper"> <div class="bar-chart-wrapper">
@@ -283,6 +283,32 @@ const getInitialDateRange = () => {
} }
const dateRange = ref(getInitialDateRange()) const dateRange = ref(getInitialDateRange())
// 外协管理:/person/table/view/1959187451673116674
// 风险管理:
// fx/table/view/1978723750599790594
// 隐患管理:/fx/table/view/1963446160885366786
// 高危作业:/low/table/view/1964253329070571521
// 应急预案:/yayl/table/view/1966394259751907330
// 安全培训:/pxks/table/view/1968225010550091777
const openOutsourcingManagement = () => {
window.open('/person/table/view/1959187451673116674', '_blank')
}
const openRiskManagement = () => {
window.open('/fx/table/view/1978723750599790594', '_blank')
}
const openHiddenDangerManagement = () => {
window.open('/fx/table/view/1963446160885366786', '_blank')
}
const openHighRiskManagement = () => {
window.open('/low/table/view/1964253329070571521', '_blank')
}
const openEmergencyPlanManagement = () => {
window.open('/yayl/table/view/1966394259751907330', '_blank')
}
const openTrainingManagement = () => {
window.open('/pxks/table/view/1968225010550091777', '_blank')
}
// 外协管理数据 // 外协管理数据
const outsourcingTotal = ref<number>(0) // 外协人员总数 const outsourcingTotal = ref<number>(0) // 外协人员总数
const outsourcingDistribution = ref<DistributionItem[]>([]) const outsourcingDistribution = ref<DistributionItem[]>([])

View File

@@ -34,7 +34,7 @@
<span class="card-icon">👥</span> <span class="card-icon">👥</span>
外协管理 外协管理
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openOutsourcingManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="donut-chart-wrapper"> <div class="donut-chart-wrapper">
@@ -61,7 +61,7 @@
<span class="card-icon">🛡</span> <span class="card-icon">🛡</span>
风险管理 风险管理
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openRiskManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="donut-chart-wrapper"> <div class="donut-chart-wrapper">
@@ -102,7 +102,7 @@
<span class="card-icon warning"></span> <span class="card-icon warning"></span>
隐患管理 隐患管理
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openHiddenDangerManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="line-chart-wrapper"> <div class="line-chart-wrapper">
@@ -154,7 +154,7 @@
<span class="card-icon">🚧</span> <span class="card-icon">🚧</span>
高危作业 高危作业
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openHighRiskManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="high-risk-top"> <div class="high-risk-top">
@@ -191,7 +191,7 @@
<span class="card-icon">📄</span> <span class="card-icon">📄</span>
应急预案 应急预案
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openEmergencyPlanManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="emergency-plan-top"> <div class="emergency-plan-top">
@@ -231,7 +231,7 @@
<span class="card-icon">📚</span> <span class="card-icon">📚</span>
安全培训 安全培训
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openTrainingManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="bar-chart-wrapper"> <div class="bar-chart-wrapper">
@@ -322,6 +322,30 @@ const selectedPark = ref<string>('')
const parkSelectorVisible = ref<boolean>(false) const parkSelectorVisible = ref<boolean>(false)
const parkOption = ref<ParkItem[]>([]) const parkOption = ref<ParkItem[]>([])
// 外协管理:/person/table/view/1959187451673116674
// 风险管理:/fx/table/view/1978723750599790594
// 隐患管理:/fx/table/view/1963446160885366786
// 高危作业:/low/table/view/1964253329070571521
// 应急预案:/yayl/table/view/1966394259751907330
// 安全培训:/pxks/table/view/1968225010550091777
const openOutsourcingManagement = () => {
window.open('/person/table/view/1959187451673116674', '_blank')
}
const openRiskManagement = () => {
window.open('/fx/table/view/1978723750599790594', '_blank')
}
const openHiddenDangerManagement = () => {
window.open('/fx/table/view/1963446160885366786', '_blank')
}
const openHighRiskManagement = () => {
window.open('/low/table/view/1964253329070571521', '_blank')
}
const openEmergencyPlanManagement = () => {
window.open('/yayl/table/view/1966394259751907330', '_blank')
}
const openTrainingManagement = () => {
window.open('/pxks/table/view/1968225010550091777', '_blank')
}
// 时间选择相关 - 默认当前月起止,如果路由中有日期范围参数则使用 // 时间选择相关 - 默认当前月起止,如果路由中有日期范围参数则使用
const getCurrentMonthRange = () => { const getCurrentMonthRange = () => {
const start = dayjs().startOf('month').format('YYYY-MM-DD') const start = dayjs().startOf('month').format('YYYY-MM-DD')

View File

@@ -31,7 +31,7 @@
<span class="card-icon">👥</span> <span class="card-icon">👥</span>
外协管理 外协管理
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openOutsourcingManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="donut-chart-wrapper"> <div class="donut-chart-wrapper">
@@ -58,7 +58,7 @@
<span class="card-icon">🛡</span> <span class="card-icon">🛡</span>
风险管理 风险管理
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openRiskManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="donut-chart-wrapper"> <div class="donut-chart-wrapper">
@@ -99,7 +99,7 @@
<span class="card-icon warning"></span> <span class="card-icon warning"></span>
隐患管理 隐患管理
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openHiddenDangerManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="line-chart-wrapper"> <div class="line-chart-wrapper">
@@ -151,7 +151,7 @@
<span class="card-icon">🚧</span> <span class="card-icon">🚧</span>
高危作业 高危作业
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openHighRiskManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="high-risk-top"> <div class="high-risk-top">
@@ -188,7 +188,7 @@
<span class="card-icon">📄</span> <span class="card-icon">📄</span>
应急预案 应急预案
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openEmergencyPlanManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="emergency-plan-top"> <div class="emergency-plan-top">
@@ -230,7 +230,7 @@
<span class="card-icon">📚</span> <span class="card-icon">📚</span>
安全培训 安全培训
</div> </div>
<!-- <el-button type="text" class="manage-btn">管理</el-button> --> <el-button type="text" class="manage-btn" @click="openTrainingManagement">管理</el-button>
</div> </div>
<div class="card-content"> <div class="card-content">
<div class="bar-chart-wrapper"> <div class="bar-chart-wrapper">
@@ -312,6 +312,30 @@ interface RecentDrillItem {
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
// 外协管理:/person/table/view/1959187451673116674
// 风险管理:/fx/table/view/1978723750599790594
// 隐患管理:/fx/table/view/1963446160885366786
// 高危作业:/low/table/view/1964253329070571521
// 应急预案:/yayl/table/view/1966394259751907330
// 安全培训:/pxks/table/view/1968225010550091777
const openOutsourcingManagement = () => {
window.open('/person/table/view/1959187451673116674', '_blank')
}
const openRiskManagement = () => {
window.open('/fx/table/view/1978723750599790594', '_blank')
}
const openHiddenDangerManagement = () => {
window.open('/fx/table/view/1963446160885366786', '_blank')
}
const openHighRiskManagement = () => {
window.open('/low/table/view/1964253329070571521', '_blank')
}
const openEmergencyPlanManagement = () => {
window.open('/yayl/table/view/1966394259751907330', '_blank')
}
const openTrainingManagement = () => {
window.open('/pxks/table/view/1968225010550091777', '_blank')
}
// 园区名称 - 从路由参数获取 // 园区名称 - 从路由参数获取
const selectedPark = ref<string>('') const selectedPark = ref<string>('')

View File

@@ -208,7 +208,7 @@
</div> </div>
</div> </div>
<div style=" display: flex; width: 100%;margin-top: 1vw; flex: 1; justify-content: flex-end;"> <div style=" display: flex; width: 100%;margin-top: 1vw; flex: 1; justify-content: flex-end;">
<AlertList style="margin-right: 1vw;" title="告警详情" :list-data="mockData.alertData.details" /> <AlertList linkUrl="http://10.0.64.20/security/console/command-center?p=tabl" style="margin-right: 1vw;" title="告警详情" :list-data="mockData.alertData.details" />
</div> </div>
</div> </div>
<!-- 右下区域 --> <!-- 右下区域 -->
@@ -231,7 +231,7 @@
</div> </div>
</div> </div>
<div style=" display: flex; width: 100%;margin-top: 1vw; flex: 1; justify-content: flex-end;"> <div style=" display: flex; width: 100%;margin-top: 1vw; flex: 1; justify-content: flex-end;">
<AlertList style="margin-right: 1vw;" title="工单详情" :list-data="mockData.timeoutWorkOrders.details" /> <AlertList linkUrl="http://10.0.64.20/pms/workorder-list" style="margin-right: 1vw;" title="工单详情" :list-data="mockData.timeoutWorkOrders.details" />
</div> </div>
</div> </div>
</div> </div>
@@ -680,6 +680,50 @@ interface RegionItem {
code: string code: string
pic_url: string pic_url: string
} }
// 缓存工具函数 - 三个页面共享的缓存
const CACHE_KEY = 'shared_regionOption_cache'
const CACHE_DURATION = 5 * 60 * 1000 // 5分钟
interface CacheData {
records: any[] // 原始接口返回的数据
timestamp: number
}
const getCachedRegionOption = (): any[] | null => {
try {
const cached = sessionStorage.getItem(CACHE_KEY)
if (cached) {
const cacheData: CacheData = JSON.parse(cached)
const now = Date.now()
// 检查缓存是否在有效期内
if (now - cacheData.timestamp < CACHE_DURATION) {
console.log('使用缓存的 regionOption 数据')
return cacheData.records
} else {
console.log('缓存已过期,清除缓存')
sessionStorage.removeItem(CACHE_KEY)
}
}
} catch (error) {
console.error('读取缓存失败:', error)
sessionStorage.removeItem(CACHE_KEY)
}
return null
}
const setCachedRegionOption = (records: any[]) => {
try {
const cacheData: CacheData = {
records,
timestamp: Date.now()
}
sessionStorage.setItem(CACHE_KEY, JSON.stringify(cacheData))
console.log('regionOption 数据已缓存')
} catch (error) {
console.error('保存缓存失败:', error)
}
}
const regionOption = ref<RegionItem[]>([]) const regionOption = ref<RegionItem[]>([])
onMounted(async () => { onMounted(async () => {
updateTime() updateTime()
@@ -692,50 +736,40 @@ onMounted(async () => {
handleRiskTabChange('安全类') handleRiskTabChange('安全类')
try { // 先检查缓存
let { records } = await getTableList( const cachedRecords = getCachedRegionOption()
'park_info_list' let records = cachedRecords
)
// records = [
// {
// "region_id": "130601",
// "park_code": "1825468527486140416",
// "region": "北京",
// "park_name": "雄安新区总部",
// "pic_url": "1"
// },
// {
// "region_id": "130601",
// "park_code": "1825468527486140417",
// "region": "北京",
// "park_name": "雄安地面站",
// "pic_url": "2"
// },
// {
// "region_id": "130603",
// "park_code": "1825468527486140426",
// "region": "武汉",
// "park_name": "花山新区总部",
// "pic_url": "3"
// }
// ]
if (records && records.length > 0) {
// 更新为新的数据格式
regionOption.value = records.map(el => ({
name: el.park_name,
code: el.park_code,
pic_url: el.pic_url
}))
for (let i = 0; i < regionOption.value.length; i++) { if (!records || records.length === 0) {
const el = regionOption.value[i]; // 缓存不存在或已过期,调用接口
if (el.code == query.campus_id && el.pic_url) { try {
backgroundImage.value = el.pic_url let result = await getTableList('park_info_list')
} records = result.records || []
if (records && records.length > 0) {
// 保存到缓存
setCachedRegionOption(records)
}
} catch (error) {
console.error('初始化园区数据失败:', error)
records = []
}
}
if (records && records.length > 0) {
// 更新为新的数据格式
regionOption.value = records.map(el => ({
name: el.park_name,
code: el.park_code,
pic_url: el.pic_url
}))
for (let i = 0; i < regionOption.value.length; i++) {
const el = regionOption.value[i];
if (el.code == query.campus_id && el.pic_url) {
backgroundImage.value = el.pic_url
} }
} }
} catch (error) {
console.error('初始化园区数据失败:', error)
} }
// 初始化数据 // 初始化数据
await loadDashboardData() await loadDashboardData()

View File

@@ -58,6 +58,7 @@ interface Props {
scrollSpeed?: number scrollSpeed?: number
scrollInterval?: number, scrollInterval?: number,
tableTitle?: TableTitle[] tableTitle?: TableTitle[]
linkUrl?: string
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
@@ -73,7 +74,7 @@ let scrollTimer: NodeJS.Timeout | null = null
let isScrolling = false let isScrolling = false
const handleItemClick = (item: AlertItem) => { const handleItemClick = (item: AlertItem) => {
window.open(`http://10.0.64.20/pms/workorder-list`, '_blank') window.open(props.linkUrl, '_blank')
} }
// 自动滚动功能 // 自动滚动功能

View File

@@ -45,7 +45,7 @@
</div> </div>
</div> </div>
</div> --> </div> -->
<AlertList style="margin-right: 1vw;" title="告警详情" :list-data="alertDetails" ></AlertList> <AlertList style="margin-right: 1vw;" title="告警详情" :list-data="alertDetails" :linkUrl="linkUrl"></AlertList>
</div> </div>
</template> </template>
@@ -72,6 +72,7 @@ interface Props {
alertData?: AlertData alertData?: AlertData
alertDetails?: AlertItem[] alertDetails?: AlertItem[]
sourceIndex?: number sourceIndex?: number
linkUrl?: string
} }
// 默认值 // 默认值

View File

@@ -11,7 +11,7 @@
<div class="chart-grid"> <div class="chart-grid">
<div class="chart-card" v-for="item in currentCharts" :key="`${activeTab}-${item.title}`"> <div class="chart-card" v-for="item in currentCharts" :key="`${activeTab}-${item.title}`">
<div class="chart-title">{{ item.title }}</div> <div class="chart-title" @click="handleChartTitleClick()">{{ item.title }}</div>
<div class="chart-content"> <div class="chart-content">
<div class="chart-wrapper"> <div class="chart-wrapper">
<Echart class="donut-chart" :options="buildOption(item)" /> <Echart class="donut-chart" :options="buildOption(item)" />
@@ -75,6 +75,10 @@ const defaultChart: ChartItem[] = [
{ title: '每年检查(巡检类)', total: 6, rate: 0, status: { notStarted: 3, inProgress: 0, done: 3, voided: 0 } } { title: '每年检查(巡检类)', total: 6, rate: 0, status: { notStarted: 3, inProgress: 0, done: 3, voided: 0 } }
] ]
const handleChartTitleClick = () => {
window.open('http://10.0.64.20/pms/workorder-list', '_blank')
}
const tabCharts = ref<Record<TabType, ChartItem[]>>({ const tabCharts = ref<Record<TabType, ChartItem[]>>({
安全类: [...defaultChart], 安全类: [...defaultChart],
工程类: [...defaultChart] 工程类: [...defaultChart]
@@ -204,6 +208,7 @@ const handleTabClick = (tab: TabType) => {
font-size: 13px; font-size: 13px;
text-align: center; text-align: center;
margin-bottom: 6px; margin-bottom: 6px;
cursor: pointer;
} }
.chart-content { .chart-content {

View File

@@ -30,9 +30,11 @@
<div class="right-wrapper"> <div class="right-wrapper">
<HighRiskAlertPanel :alertData="dashboardData?.alertData" <HighRiskAlertPanel :alertData="dashboardData?.alertData"
:alertDetails="dashboardData?.alertData.details" :alertDetails="dashboardData?.alertData.details"
linkUrl="http://10.0.64.20/security/console/command-center?p=tabl"
:sourceIndex="sourceIndex"/> :sourceIndex="sourceIndex"/>
<TimeoutWorkOrderPanel :timeoutWorkOrders="dashboardData?.timeoutWorkOrders" <TimeoutWorkOrderPanel :timeoutWorkOrders="dashboardData?.timeoutWorkOrders"
:alertDetails="dashboardData?.timeoutWorkOrders.details" :alertDetails="dashboardData?.timeoutWorkOrders.details"
linkUrl="http://10.0.64.20/pms/workorder-list"
:sourceIndex="sourceIndex"/> :sourceIndex="sourceIndex"/>
</div> </div>
<HiddenDangerPanel :hiddenDangerData="dashboardData?.hiddenDangerData"/> <HiddenDangerPanel :hiddenDangerData="dashboardData?.hiddenDangerData"/>
@@ -215,25 +217,25 @@ const query = reactive({
campus_id: "", campus_id: "",
}) })
// 缓存工具函数 // 缓存工具函数 - 三个页面共享的缓存
const CACHE_KEY = 'regionOption_cache' const CACHE_KEY = 'shared_regionOption_cache'
const CACHE_DURATION = 5 * 60 * 1000 // 5分钟 const CACHE_DURATION = 5 * 60 * 1000 // 5分钟
interface CacheData { interface CacheData {
regionOption: RegionItem[] records: any[] // 原始接口返回的数据
campus_id: string timestamp: number
} }
const getCachedRegionOption = (): CacheData | null => { const getCachedRegionOption = (): any[] | null => {
try { try {
const cached = sessionStorage.getItem(CACHE_KEY) const cached = sessionStorage.getItem(CACHE_KEY)
if (cached) { if (cached) {
const {data, timestamp} = JSON.parse(cached) const cacheData: CacheData = JSON.parse(cached)
const now = Date.now() const now = Date.now()
// 检查缓存是否在有效期内 // 检查缓存是否在有效期内
if (now - timestamp < CACHE_DURATION) { if (now - cacheData.timestamp < CACHE_DURATION) {
console.log('使用缓存的 regionOption 数据') console.log('使用缓存的 regionOption 数据')
return data return cacheData.records
} else { } else {
console.log('缓存已过期,清除缓存') console.log('缓存已过期,清除缓存')
sessionStorage.removeItem(CACHE_KEY) sessionStorage.removeItem(CACHE_KEY)
@@ -246,17 +248,13 @@ const getCachedRegionOption = (): CacheData | null => {
return null return null
} }
const setCachedRegionOption = (regionOption: RegionItem[], campus_id: string) => { const setCachedRegionOption = (records: any[]) => {
try { try {
const cacheData: CacheData = { const cacheData: CacheData = {
regionOption, records,
campus_id
}
const cache = {
data: cacheData,
timestamp: Date.now() timestamp: Date.now()
} }
sessionStorage.setItem(CACHE_KEY, JSON.stringify(cache)) sessionStorage.setItem(CACHE_KEY, JSON.stringify(cacheData))
console.log('regionOption 数据已缓存') console.log('regionOption 数据已缓存')
} catch (error) { } catch (error) {
console.error('保存缓存失败:', error) console.error('保存缓存失败:', error)
@@ -269,75 +267,55 @@ onMounted(async () => {
timeUpdateTimerId.value = setInterval(updateTime, 1000) timeUpdateTimerId.value = setInterval(updateTime, 1000)
// 先检查缓存 // 先检查缓存
const cachedData = getCachedRegionOption() const cachedRecords = getCachedRegionOption()
if (cachedData && cachedData.regionOption && cachedData.regionOption.length > 0) { let records = cachedRecords
regionOption.value = cachedData.regionOption
query.campus_id = cachedData.campus_id || '' if (!records || records.length === 0) {
console.log('从缓存加载 regionOption:', regionOption.value, 'campus_id:', query.campus_id)
} else {
// 缓存不存在或已过期,调用接口 // 缓存不存在或已过期,调用接口
try { try {
let {records} = await getTableList( let result = await getTableList('park_info_list')
'park_info_list' records = result.records || []
)
// records = [
// {
// "region_id": "130601",
// "park_code": "1825468527486140416",
// "region": "北京",
// "park_name": "雄安新区总部"
// },
// {
// "region_id": "130601",
// "park_code": "1825468527486140417",
// "region": "北京",
// "park_name": "雄安地面站"
// },
// {
// "region_id": "130603",
// "park_code": "1825468527486140426",
// "region": "武汉",
// "park_name": "花山新区总部"
// }
// ]
if (records && records.length > 0) { if (records && records.length > 0) {
// 去重region字段使用Map来确保唯一性
const regionMap = new Map()
records.forEach(el => {
if (!regionMap.has(el.region)) {
regionMap.set(el.region, {
name: el.region,
code: el.region_id // 使用region_code作为code
})
}
})
// 转换为数组
regionOption.value = Array.from(regionMap.values())
console.log('regionOption.value>>>>', regionOption.value);
// 将园区信息去重
const parkMap = new Map();
records.forEach(el => {
if (!parkMap.has(el.park_code)) {
parkMap.set(el.park_code, {
name: el.park_name,
code: el.park_code
})
}
})
// 将parkMap转换为数组
query.campus_id = Array.from(parkMap.values()).map(e1 => e1.code).join();
// 保存到缓存 // 保存到缓存
setCachedRegionOption(regionOption.value, query.campus_id) setCachedRegionOption(records)
} }
} catch (error) { } catch (error) {
console.error('初始化园区数据失败:', error) console.error('初始化园区数据失败:', error)
records = []
} }
} }
if (records && records.length > 0) {
// 去重region字段使用Map来确保唯一性
const regionMap = new Map()
records.forEach(el => {
if (!regionMap.has(el.region)) {
regionMap.set(el.region, {
name: el.region,
code: el.region_id // 使用region_id作为code
})
}
})
// 转换为数组
regionOption.value = Array.from(regionMap.values())
console.log('regionOption.value>>>>', regionOption.value);
// 将园区信息去重
const parkMap = new Map();
records.forEach(el => {
if (!parkMap.has(el.park_code)) {
parkMap.set(el.park_code, {
name: el.park_name,
code: el.park_code
})
}
})
// 将parkMap转换为数组
query.campus_id = Array.from(parkMap.values()).map(e1 => e1.code).join();
}
// 初始化数据 // 初始化数据
await loadDashboardData() await loadDashboardData()

View File

@@ -109,7 +109,7 @@
<a <a
:class="['detail-link', row.hasAlarm ? 'detail-alarm' : 'detail-normal']" :class="['detail-link', row.hasAlarm ? 'detail-alarm' : 'detail-normal']"
@click="handleViewDetail(row)" @click="handleViewDetail(row)"
:href="'http://10.0.64.20/configcenter/console/device-manage'" :href="'http://10.0.64.20/ibms/render/configure/render?formUuid=LCC-1840031646260649984'"
target="_blank" target="_blank"
> >
<span v-if="row.hasAlarm" class="alarm-badge">异常</span> <span v-if="row.hasAlarm" class="alarm-badge">异常</span>

View File

@@ -33,9 +33,11 @@
<div class="right-wrapper"> <div class="right-wrapper">
<HighRiskAlertPanel :alertData="dashboardData?.alertData" <HighRiskAlertPanel :alertData="dashboardData?.alertData"
:alertDetails="dashboardData?.alertData.details" :alertDetails="dashboardData?.alertData.details"
linkUrl="http://10.0.64.20/security/console/command-center?p=tabl"
:sourceIndex="sourceIndex"/> :sourceIndex="sourceIndex"/>
<TimeoutWorkOrderPanel :timeoutWorkOrders="dashboardData?.timeoutWorkOrders" <TimeoutWorkOrderPanel :timeoutWorkOrders="dashboardData?.timeoutWorkOrders"
:alertDetails="dashboardData?.timeoutWorkOrders.details" :alertDetails="dashboardData?.timeoutWorkOrders.details"
linkUrl="http://10.0.64.20/pms/workorder-list"
:sourceIndex="sourceIndex"/> :sourceIndex="sourceIndex"/>
</div> </div>
<HiddenDangerPanel :hiddenDangerData="dashboardData?.hiddenDangerData"/> <HiddenDangerPanel :hiddenDangerData="dashboardData?.hiddenDangerData"/>
@@ -221,55 +223,45 @@ const query = reactive({
regionCode: "" regionCode: ""
}) })
// 缓存工具函数 // 缓存工具函数 - 三个页面共享的缓存
const CACHE_KEY_PREFIX = 'regionOption_cache_' const CACHE_KEY = 'shared_regionOption_cache'
const CACHE_DURATION = 5 * 60 * 1000 // 5分钟 const CACHE_DURATION = 5 * 60 * 1000 // 5分钟
interface CacheData { interface CacheData {
regionOption: RegionItem[] records: any[] // 原始接口返回的数据
campus_id: string timestamp: number
} }
const getCachedRegionOption = (regionCode: string): CacheData | null => { const getCachedRegionOption = (): any[] | null => {
if (!regionCode) return null
try { try {
const cacheKey = CACHE_KEY_PREFIX + regionCode const cached = sessionStorage.getItem(CACHE_KEY)
const cached = sessionStorage.getItem(cacheKey)
if (cached) { if (cached) {
const { data, timestamp } = JSON.parse(cached) const cacheData: CacheData = JSON.parse(cached)
const now = Date.now() const now = Date.now()
// 检查缓存是否在有效期内 // 检查缓存是否在有效期内
if (now - timestamp < CACHE_DURATION) { if (now - cacheData.timestamp < CACHE_DURATION) {
console.log('使用缓存的 regionOption 数据regionCode:', regionCode) console.log('使用缓存的 regionOption 数据')
return data return cacheData.records
} else { } else {
console.log('缓存已过期,清除缓存regionCode:', regionCode) console.log('缓存已过期,清除缓存')
sessionStorage.removeItem(cacheKey) sessionStorage.removeItem(CACHE_KEY)
} }
} }
} catch (error) { } catch (error) {
console.error('读取缓存失败:', error) console.error('读取缓存失败:', error)
if (regionCode) { sessionStorage.removeItem(CACHE_KEY)
sessionStorage.removeItem(CACHE_KEY_PREFIX + regionCode)
}
} }
return null return null
} }
const setCachedRegionOption = (regionCode: string, regionOption: RegionItem[], campus_id: string) => { const setCachedRegionOption = (records: any[]) => {
if (!regionCode) return
try { try {
const cacheKey = CACHE_KEY_PREFIX + regionCode
const cacheData: CacheData = { const cacheData: CacheData = {
regionOption, records,
campus_id
}
const cache = {
data: cacheData,
timestamp: Date.now() timestamp: Date.now()
} }
sessionStorage.setItem(cacheKey, JSON.stringify(cache)) sessionStorage.setItem(CACHE_KEY, JSON.stringify(cacheData))
console.log('regionOption 数据已缓存regionCode:', regionCode) console.log('regionOption 数据已缓存')
} catch (error) { } catch (error) {
console.error('保存缓存失败:', error) console.error('保存缓存失败:', error)
} }
@@ -288,66 +280,44 @@ onMounted(async () => {
} }
// 先检查缓存 // 先检查缓存
const cachedData = getCachedRegionOption(query.regionCode) const cachedRecords = getCachedRegionOption()
if (cachedData && cachedData.regionOption && cachedData.regionOption.length > 0) { let records = cachedRecords
regionOption.value = cachedData.regionOption
query.campus_id = cachedData.campus_id || '' if (!records || records.length === 0) {
console.log('从缓存加载 regionOption:', regionOption.value, 'campus_id:', query.campus_id)
} else {
// 缓存不存在或已过期,调用接口 // 缓存不存在或已过期,调用接口
try { try {
let {records} = await getTableList( let result = await getTableList('park_info_list')
'park_info_list' records = result.records || []
)
// records = [
// {
// "region_id": "130601",
// "park_code": "1825468527486140416",
// "region": "北京",
// "park_name": "雄安新区总部"
// },
// {
// "region_id": "130601",
// "park_code": "1825468527486140417",
// "region": "北京",
// "park_name": "雄安地面站"
// },
// {
// "region_id": "130603",
// "park_code": "1825468527486140426",
// "region": "武汉",
// "park_name": "花山新区总部"
// }
// ]
if (records && records.length > 0) {
// 去重region字段使用Map来确保唯一性
const regionMap = new Map()
records.filter((el) => el.region_id == query.regionCode)
.map(el => {
return el
})
.forEach(el => {
if (!regionMap.has(el.park_name)) {
regionMap.set(el.park_name, {
name: el.park_name,
code: el.park_code // 使用region_code作为code
})
}
})
// // 转换为数组
regionOption.value = Array.from(regionMap.values())
console.log('regionOption.value>>>>', regionOption.value);
query.campus_id = regionOption.value.map(el => el.code).join() if (records && records.length > 0) {
// 保存到缓存
// 保存到缓存 setCachedRegionOption(records)
setCachedRegionOption(query.regionCode, regionOption.value, query.campus_id) }
}
} catch (error) { } catch (error) {
console.error('初始化园区数据失败:', error) console.error('初始化园区数据失败:', error)
records = []
} }
} }
if (records && records.length > 0) {
// 根据regionCode过滤去重park_name字段
const regionMap = new Map()
records.filter((el) => el.region_id == query.regionCode)
.forEach(el => {
if (!regionMap.has(el.park_name)) {
regionMap.set(el.park_name, {
name: el.park_name,
code: el.park_code
})
}
})
// 转换为数组
regionOption.value = Array.from(regionMap.values())
console.log('regionOption.value>>>>', regionOption.value);
query.campus_id = regionOption.value.map(el => el.code).join()
}
// 初始化数据 // 初始化数据
await loadDashboardData() await loadDashboardData()