310 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
		
		
			
		
	
	
			310 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| 
								 | 
							
								<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>
							 |