祁阳图书馆智慧大屏
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

408 lines
16 KiB

<!-- eslint-disable no-prototype-builtins -->
<template>
<div class="page-wrapper ">
<div class="page-three">
<div class="three-item three01">
<div class="database-title">本年累计借阅数量</div>
<div class="three-lending">
<div class="three-lending-left">
<h5>本年累计借阅</h5>
<ul class="totalItem">
<li
v-for="(item, index) in yearTotal"
:key="index"
:class="[{'yearTotal': item.id === 'yearTotal'}]"
>
<div class="pageLeft-flop-box">
<div>
<span v-for="(ls, i) in item.valueArr" :key="item.id + i" :class="[{'flop-figure': !isNaN(ls)}, {'flop-comma': isNaN(ls)}]">
<i v-if="!isNaN(ls)">0123456789</i>
<!-- <span v-else>{{ ls }}</span> -->
</span>
</div>
</div>
</li>
</ul>
<YearCircle :year-all-num="yearAllNum" />
</div>
<div class="three-lending-right lending-ranking">
<h5>分馆累计借阅排行榜</h5>
<div class="ranking-cont">
<ul class="ranking-title">
<li style="width: 0.625rem;">排名</li>
<li style="width: 1.5rem; text-align: left;">图书馆名称</li>
<li style="flex:1;" />
<li style="width: 1.25rem; padding-right: .125rem; text-align: right;">借阅数量</li>
</ul>
<ul class="ranking-list">
<li v-for="(item,index) in rankingYearWithPercentage" :key="index" :class="{ 'hovered': index === currentHover }">
<div style="width: .625rem; color: #79B8FF;" :class="[{'ranking-num1':index===0},{'ranking-num2':index===1},{'ranking-num3':index===2}]">{{ index>=3 ? index+1 : null }}</div>
<div style="width: 1.5rem; text-align: left;">{{ item.name }}</div>
<div class="ranking-progress" style="flex:1; align-self: center;">
<el-progress :percentage="item.percentage" :stroke-width="8" :show-text="false" color="#009afb" />
</div>
<div style="width: 1.25rem; padding-right: .125rem; text-align: right;">{{ item.JCC_YEAR }}<i style="padding-left:.0625rem;">本</i></div>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="three-item three02">
<div class="database-title">今日借阅数量</div>
<div class="three-lending">
<div class="three-lending-left">
<h5>今日累计借阅</h5>
<ul class="totalItem">
<li
v-for="(item, index) in todayTotal"
:key="index"
:class="[{'todayTotal': item.id === 'todayTotal'}]"
>
<div class="pageLeft-flop-box">
<div>
<span v-for="(ls, i) in item.valueArr" :key="item.id + i" :class="[{'flop-figure': !isNaN(ls)}, {'flop-comma': isNaN(ls)}]">
<i v-if="!isNaN(ls)">0123456789</i>
<!-- <span v-else>{{ ls }}</span> -->
</span>
</div>
</div>
</li>
</ul>
<TodayCircle :today-all-num="todayAllNum" />
</div>
<div class="three-lending-right lending-ranking">
<h5>分馆今日借阅排行榜 </h5>
<div class="ranking-cont">
<ul class="ranking-title">
<li style="width: 0.625rem;">排名</li>
<li style="width: 1.5rem; text-align: left;">图书馆名称</li>
<li style="flex:1;" />
<li style="width: 1.25rem; padding-right: .125rem; text-align: right;">借阅数量</li>
</ul>
<ul class="ranking-list">
<li v-for="(item,index) in rankingTodayWithPercentage" :key="index" :class="{ 'hovered': index === currentHover }">
<div style="width: 0.625rem; color: #79B8FF;" :class="[{'ranking-num1':index===0},{'ranking-num2':index===1},{'ranking-num3':index===2}]">{{ index>=3 ? index+1 : null }}</div>
<div style="width: 1.5rem; text-align: left;">{{ item.name }}</div>
<div class="ranking-progress" style="flex:1; align-self: center;">
<el-progress :percentage="item.percentage" :stroke-width="8" :show-text="false" color="#009afb" />
</div>
<div style="width: 1.25rem; padding-right: .125rem; text-align: right;">{{ item.JCC_DAY }}<i style="padding-left:.0625rem;">本</i></div>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="three-item three03">
<div class="database-title">今日借阅趋势</div>
<div class="chart-wrapper" style="width: 11.25rem;height: calc(100% - 35px);">
<LineChart :chart-day-data="chartDayData" />
</div>
</div>
<div class="three-item three04">
<div class="database-title">近7日借阅统计</div>
<div class="chart-wrapper" style="width: 11.25rem;height: calc(100% - 20px);">
<BarEcharts ref="weeklyRef" :chart-weekly-data="chartWeeklyData" />
</div>
</div>
</div>
</div>
</template>
<script>
import { FetchLibcodeDetails, FetchLendingTotal, FetchTodayJH, FetchWeekJH } from '@/api/library'
import LineChart from '@/components/echart/lineChart'
import BarEcharts from '@/components/echart/barEcharts'
import YearCircle from '@/components/echart/yearCircle'
import TodayCircle from '@/components/echart/todayCircle'
export default {
name: 'PageThree',
components: {
LineChart,
BarEcharts,
YearCircle,
TodayCircle
},
data() {
return {
currentHover: -1,
chartDayData: {
timeData: [],
returnData: [],
borrowedData: []
},
chartWeeklyData: {
date: [],
inchartWeeklyData: [],
outchartWeeklyData: []
},
todayTotal: [],
yearTotal: [],
rankingYearData: [],
rankingTodayData: [],
rankingYearWithPercentage: [],
rankingTodayWithPercentage: [],
yearAllNum: {
headerLib: 0,
branchLib: 0
},
todayAllNum: {
headerLib: 0,
branchLib: 0
},
rankInterval: null
}
},
computed: {
},
beforeDestroy() {
clearInterval(this.rankInterval)
this.rankInterval = null
},
created() {
},
activated() {
this.getLendingTotal()
this.getTodayJH()
// if (this.rankingYearWithPercentage.length !== 0) {
// this.currentHover = -1
// this.rankInterval = setInterval(() => {
// this.currentHover = (this.currentHover + 1) % this.rankingYearWithPercentage.length
// }, 1000)
// }
},
deactivated() {
clearInterval(this.rankInterval)
this.rankInterval = null
},
mounted() {
// this.getLendingTotal()
// this.getTodayJH()
this.getWeekJH()
},
methods: {
paddingNum(num, length) {
for (var len = (num + '').length; len < length; len = num.length) {
num = '0' + num
}
return num
},
// 获取本年今年借阅情况
getLendingTotal() {
this.todayTotal = []
this.yearTotal = []
FetchLendingTotal().then(res => {
const result = JSON.parse(res.data)
if (result.success & result.resultlist.length !== 0) {
// console.log('result.resultlist', result.resultlist)
// JCC_YEAR 本年借阅册数
// JCC_DAY 今日借阅册数
const dayNum = result.resultlist.filter(item => item.LIBCODE !== '999').reduce((acc, obj) => acc + obj.JCC_DAY, 0)
const yearNum = result.resultlist.filter(item => item.LIBCODE !== '999').reduce((acc, obj) => acc + obj.JCC_YEAR, 0)
this.todayTotal.push({
id: 'todayTotal',
name: '今日累计借阅',
value: this.$parent.formatter(this.paddingNum(dayNum, 5)),
valueArr: this.$parent.formatter(this.paddingNum(dayNum, 5)).split('')
})
this.yearTotal.push({
id: 'yearTotal',
name: '本年累计借阅',
value: this.$parent.formatter(yearNum),
valueArr: this.$parent.formatter(yearNum).split('')
})
// 总管就是QYTSG的数据,分馆就是其他除去999以为的合计
this.yearAllNum = {
'headerLib': result.resultlist.filter(item => item.LIBCODE === 'QYTSG')[0].JCC_YEAR,
'branchLib': result.resultlist.filter(item => item.LIBCODE !== 'QYTSG' && item.LIBCODE !== '999').reduce((acc, obj) => acc + obj.JCC_YEAR, 0)
}
this.todayAllNum = {
'headerLib': result.resultlist.filter(item => item.LIBCODE === 'QYTSG')[0].JCC_DAY,
'branchLib': result.resultlist.filter(item => item.LIBCODE !== 'QYTSG' && item.LIBCODE !== '999').reduce((acc, obj) => acc + obj.JCC_DAY, 0)
}
// 排行榜显示前6的
this.getLibcodeDetails(result.resultlist)
this.$parent.timedRefresh(this.todayTotal, 'todayTotal')
this.$parent.timedRefresh(this.yearTotal, 'yearTotal')
console.log('this.todayTotal', this.todayTotal)
console.log('this.yearTotal', this.yearTotal)
} else {
this.todayTotal = []
this.yearTotal = []
}
}).catch(error => {
console.error('Error', error)
})
},
// 分管显示内容
getLibcodeDetails(data) {
FetchLibcodeDetails().then(res => {
const result = JSON.parse(res.data)
if (result.length !== 0) {
const newDataArray = []
data.forEach(item => {
const foundItem = result.find(library => library.tcId === item.LIBCODE)
if (foundItem) {
const yearValue = item.JCC_YEAR || 0
const dayValue = item.JCC_DAY || 0
const newObj = {
name: foundItem.name,
JCC_YEAR: yearValue,
JCC_DAY: dayValue
}
newDataArray.push(newObj)
}
})
// 2. 根据JCC_YEAR的值进行降序排序
this.rankingYearData = newDataArray.sort((a, b) => b.JCC_YEAR - a.JCC_YEAR).slice(0, 6)
this.rankingYearWithPercentage = this.rankingDataComputed(this.rankingYearData, 'JCC_YEAR')
// 3. 根据JCC_DAY的值进行降序排序
this.rankingTodayData = newDataArray.sort((a, b) => b.JCC_DAY - a.JCC_DAY).slice(0, 6)
this.rankingTodayWithPercentage = this.rankingDataComputed(this.rankingTodayData, 'JCC_DAY')
this.rankInterval = setInterval(() => {
this.currentHover = (this.currentHover + 1) % this.rankingYearWithPercentage.length
}, 1000)
}
}).catch(error => {
console.error('Error', error)
})
},
rankingDataComputed(rankingData, numType) {
if (!rankingData || rankingData.length === 0) {
console.log('没有数据')
return []
}
// eslint-disable-next-line no-prototype-builtins
if (typeof rankingData[0] !== 'object' || !rankingData[0].hasOwnProperty(numType)) {
return []
}
const firstPlaceNum = rankingData[0][numType] // NAN
if (firstPlaceNum === 0) {
// 处理除数为0的情况
console.log('firstPlaceNum为0,不可用于被除')
return []
}
return rankingData.map(item => {
const percentage = (item[numType] / firstPlaceNum) * 100
return { ...item, percentage }
})
},
// 今日借还
getTodayJH() {
FetchTodayJH().then(res => {
const result = res.data
if (result.length !== 0) {
this.chartDayData = {
timeData: [],
returnData: [],
borrowedData: []
}
const time = ['07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00']
time.forEach((hour, index) => {
// 查找 result 中是否有对应的 logHour
const foundItem = result.find(item => item.logHour === index + 7) // 因为 logHour 是从 7 开始,所以需要加上 7
if (foundItem) {
// 如果找到了对应的 logHour,则将数据加入 chartDayData
this.chartDayData.timeData.push(`${foundItem.logHour}:00`)
this.chartDayData.returnData.push(foundItem.hccDay)
this.chartDayData.borrowedData.push(foundItem.jccDay)
} else {
// 如果没找到对应的 logHour,则将默认值加入 chartDayData
this.chartDayData.timeData.push(`${hour}`)
this.chartDayData.returnData.push(0) // 默认值为 0
this.chartDayData.borrowedData.push(0) // 默认值为 0
}
})
} else {
this.chartDayData = {
timeData: [],
returnData: [],
borrowedData: []
}
}
}).catch(error => {
console.error('Error', error)
})
},
getWeekJH() {
FetchWeekJH().then(res => {
const result = res.data
if (result.length !== 0) {
// 获取当天日期
const currentDate = new Date()
const today = currentDate.toISOString().slice(0, 10)
// 根据数据排除当天的数据
const filteredData = result.filter(entry => {
const entryDate = new Date(entry.createTime).toISOString().slice(0, 10)
return entryDate !== today
})
// 获取过去一周的
const pastWeekDates = []
for (let i = 1; i <= 7; i++) {
const date = new Date()
date.setDate(currentDate.getDate() - i)
pastWeekDates.push(date.toISOString().slice(0, 10))
}
const matchData = filteredData.reduce((accData, item) => {
// 根据已有的数据获取相关日期
const entryDate = new Date(item.createTime).toISOString().slice(0, 10)
if (accData[entryDate]) {
accData[entryDate].jccDayTotal += item.jccDayTotal
accData[entryDate].hccDayTotal += item.hccDayTotal
} else {
accData[entryDate] = {
jccDayTotal: item.jccDayTotal,
hccDayTotal: item.hccDayTotal
}
}
return accData
}, {})
const completeData = pastWeekDates.map(date => ({
date: date.split('-').join('/'),
jccDayTotal: matchData[date] ? matchData[date].jccDayTotal : 0,
hccDayTotal: matchData[date] ? matchData[date].hccDayTotal : 0
}))
// 根据时间排序
completeData.sort((a, b) => new Date(a.date) - new Date(b.date))
// 日期X轴数据
this.chartWeeklyData.date = completeData.map(item => item.date)
// in 归还
this.chartWeeklyData.inchartWeeklyData = completeData.map(item => item.hccDayTotal)
// // out 借出
this.chartWeeklyData.outchartWeeklyData = completeData.map(item => item.jccDayTotal)
console.log(this.chartWeeklyData.date)
} else {
this.chartWeeklyData = {
date: [],
inchartWeeklyData: [],
outchartWeeklyData: []
}
}
}).catch(error => {
console.error('Error', error)
})
}
}
}
</script>
<style lang="scss">
@import "~@/assets/styles/index.scss";
@import "~@/assets/styles/font-some.css";
</style>