jy-safe-app/pages/performance/index.vue

310 lines
7.8 KiB
Vue
Raw Permalink Normal View History

2025-10-14 15:17:30 +08:00
<template>
<view class="performance">
<view class="grid-card">
<uni-grid :show-border="false">
<uni-grid-item>
<view class="grid-item-box">
<view class="num">{{chartData.TotalCount || 0}}</view>
<text class="text">总任务数</text>
</view>
</uni-grid-item>
<uni-grid-item>
<view class="grid-item-box">
<view class="num" style="color: #91CB74">{{chartData.unfinishCount || 0}}</view>
<text class="text">待办数</text>
</view>
</uni-grid-item>
<uni-grid-item>
<view class="grid-item-box">
<view class="num" style="color: #FAC858">{{chartData.timeOverWaitCount || 0}}</view>
<text class="text">超时待办数</text>
</view>
</uni-grid-item>
<uni-grid-item>
<view class="grid-item-box">
<view class="num" style="color: #EE6666">{{
(chartData.doneCount || 0) + (chartData.timeOverCount || 0)
}}</view>
<text class="text">已办事项</text>
</view>
</uni-grid-item>
<uni-grid-item>
<view class="grid-item-box">
<view class="num" style="color: #73C0DE">{{allFinishRate}}</view>
<text class="text">完成率</text>
</view>
</uni-grid-item>
<uni-grid-item>
<view class="grid-item-box">
<view class="num" style="color: #3CA272">{{finishRate}}</view>
<text class="text">及时完成率</text>
</view>
</uni-grid-item>
</uni-grid>
</view>
<!-- <view class="word-chart">-->
<!-- <qiun-data-charts-->
<!-- type="word"-->
<!-- :opts="wordOpts"-->
<!-- :chartData="wordChartData"-->
<!-- />-->
<!-- </view>-->
<view class="line-chart">
<view class="line-chart-title">任务及时完成率近6个月</view>
<qiun-data-charts
type="line"
:opts="lineOpts"
:chartData="lineChartData"
/>
</view>
<view class="table">
<uni-table style="width: 100%" border stripe emptyText="暂无更多数据" >
<!-- 表头行 -->
<uni-tr>
<uni-th width="100" align="center">月份</uni-th>
<uni-th width="60" align="center">任务数</uni-th>
<uni-th width="60" align="center">完成率</uni-th>
<uni-th width="90" align="center">及时完成率</uni-th>
</uni-tr>
<!-- 表格数据行 -->
<uni-tr v-for="(item, key) in tableData" :key="key">
<uni-td align="center">{{item.MONTHStr}}</uni-td>
<uni-td align="center">{{item.TOTAL_QTY}}</uni-td>
<uni-td align="center">{{item.FINISH_RATE}}%</uni-td>
<uni-td align="center">{{item.NORMAL_FINISH_RATE}}%</uni-td>
</uni-tr>
</uni-table>
</view>
</view>
</template>
<script>
import {
getChartData,
} from '../../services/app'
import { initFilter } from '../../utils/common'
let uChartsInstance = {}
export default {
data() {
return {
chartData: {},
tableData: [],
lineChartData: {},
wordChartData: {},
wordOpts: {
color: ["#1890FF","#91CB74","#FAC858","#EE6666","#73C0DE","#3CA272","#FC8452","#9A60B4","#ea7ccc"],
padding: undefined,
enableScroll: false,
extra: {
word: {
type: "normal",
autoColors: false
}
}
},
lineOpts: {
color: ["#1890FF","#91CB74","#FAC858","#EE6666","#73C0DE","#3CA272","#FC8452","#9A60B4","#ea7ccc"],
padding: [15,10,0,15],
enableScroll: false,
legend: {},
xAxis: {
disableGrid: true
},
yAxis: {
gridType: "dash",
dashLength: 2,
unit: '%'
},
extra: {
line: {
type: "curve",
width: 2,
activeType: "hollow"
}
}
}
}
},
onReady() {
// this.getLineServerData();
// this.getWordServerData();
},
async onShow() {
const orgId = uni.getStorageSync('orgId')
const { User } = uni.getStorageSync('appInfo')
const curDate = new Date()
const curYear = curDate.getFullYear()
const curMonth = curDate.getMonth()
let y, m;
if (curMonth > 5) {
y = curYear
m = curMonth - 5
} else {
y = curYear - 1
m = 11 - (curMonth - 6)
}
const startTime = uni.$u.timeFormat(new Date(y, m, 1), 'yyyy-mm-dd')
const endTime = uni.$u.timeFormat(new Date(), 'yyyy-mm-dd')
let json = initFilter(orgId,User.NAME,"","","",startTime, endTime);
const res = await getChartData(json)
if (res.IsSuccessful) {
this.chartData = res.Data
const preLineChartData = (res.Data?.groupDataLine || []).splice(-6, 6)
const lineChartConfig = {
categories: preLineChartData.map(i => i.MONTHStr.split('年')[1]),
series: [
{
name: "完成率",
data: preLineChartData.map(i => i.FINISH_RATE)
},
{
name: "及时完成率",
data: preLineChartData.map(i => i.NORMAL_FINISH_RATE)
}
]
}
this.lineChartData = JSON.parse(JSON.stringify(lineChartConfig));
this.tableData = res.Data?.groupData || []
}
},
methods: {
// getLineServerData() {
// //模拟从服务器获取数据时的延时
// setTimeout(() => {
// //模拟服务器返回数据,如果数据格式和标准格式不同,需自行按下面的格式拼接
// let res = {
// categories: ["202201","202201","202201","202201","202201","202201"],
// series: [
// {
// name: "完成率",
// data: [35,8,25,37,4,20]
// },
// {
// name: "及时完成率B",
// data: [70,40,65,100,44,68]
// }
// ]
// };
// this.lineChartData = JSON.parse(JSON.stringify(res));
// }, 500);
// },
// getWordServerData() {
// //模拟从服务器获取数据时的延时
// setTimeout(() => {
// //模拟服务器返回数据,如果数据格式和标准格式不同,需自行按下面的格式拼接
// let res = {
// series: [
// {
// name: "总任务数(484)",
// textSize: 25,
// data: undefined
// },
// {
// name: "待办数(1)",
// textSize: 20,
// data: undefined
// },
// {
// name: "超时待办数(24)",
// textSize: 20,
// data: undefined
// },
// {
// name: "已办事项(58)",
// textSize: 20,
// data: undefined
// },
// {
// name: "完成率(98%)",
// textSize: 20,
// data: undefined
// },
// {
// name: "及时完成率(66)",
// textSize: 20,
// data: undefined
// }
// ]
// };
// this.wordChartData = JSON.parse(JSON.stringify(res));
// }, 500);
// }
},
computed: {
allFinishRate() {
const { TotalCount, timeOverCount, doneCount } = this.chartData
if (TotalCount) {
return ((doneCount + timeOverCount) / TotalCount * 100).toFixed(1)
}
return 0
},
finishRate() {
const { TotalCount, doneCount } = this.chartData
if (TotalCount) {
return (doneCount / TotalCount * 100).toFixed(1)
}
return 0
},
}
}
</script>
<style scoped>
.performance {
padding: 16px;
}
.word-chart {
border: 1px solid #e5e5e5;
padding: 10px;
margin-bottom: 16px;
}
.line-chart {
margin-bottom: 26px;
}
.line-chart-title {
font-weight: bold;
font-size: 18px;
text-align: center;
margin-bottom: 16px;
}
.grid-card {
margin-bottom: 26px;
border: 1px solid #e5e5e5;
border-radius: 8px;
padding: 8px;
}
.grid-item-box {
flex: 1;
// position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: column;
align-items: center;
justify-content: center;
padding: 15px 0;
}
.grid-item-box-row {
flex: 1;
// position: relative;
/* #ifndef APP-NVUE */
display: flex;
/* #endif */
flex-direction: row;
align-items: center;
justify-content: center;
padding: 15px 0;
}
.grid-item-box .num {
font-size: 30px;
font-weight: bold;
}
.grid-item-box .text {
color: rgba(0, 0, 0, .65);
font-size: 14px;
}
</style>