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>
 |