如何使用Django基于员工任务得分计算绩效百分比
员工绩效计算实现方案
实现逻辑说明
你完全不需要新建Performance模型,基于现有的User和Task模型就能实现动态周期的绩效计算,实时计算的方式更适配你灵活周期的需求,避免存储多维度冗余数据。如果后续需要归档历史绩效,再加存储层即可。
步骤1:新增绩效计算公用函数
在tasks模块下新建utils.py文件,编写可复用的计算逻辑:
from django.db.models import Sum from .models import Task def calculate_user_performance(user, start_date, end_date, total_score): """ 计算指定用户在指定周期内的绩效百分比 :param user: 用户对象 :param start_date: 周期开始日期 datetime类型 :param end_date: 周期结束日期 datetime类型 :param total_score: 自定义的周期总得分上限 :return: 绩效百分比,保留2位小数,最高100% """ # 过滤用户在周期内完成的任务,聚合实际得分 actual_score = Task.objects.filter( assignedto=user, status="COMPLETED", updated_at__range=(start_date, end_date) ).aggregate(total=Sum('scores', default=0))['total'] # 异常处理:总得分不能为0,绩效最高不超过100% if total_score <= 0: return 0.00 performance = round(actual_score / total_score * 100, 2) return min(performance, 100.00)
步骤2:改造dashboard视图支持动态周期
修改dashboard视图,接收前端传递的周期参数、总得分参数,默认展示最近30天的绩效:
from tasks.utils import calculate_user_performance from datetime import datetime, timedelta def dashboard(request): # 基础统计逻辑保持不变 completed_tasks = Task.objects.filter(status="COMPLETED", assignedto=request.user).count() failed_tasks = Task.objects.filter(status="FAILED", assignedto=request.user).count() debt_complt_goal = DepartmentGoal.objects.filter(status="COMPLETED", department=request.user.department).count() debt_failed_goal = DepartmentGoal.objects.filter(status="FAILED", department=request.user.department).count() complt_org_goals = OrganisationGoal.objects.filter(status="COMPLETED").count() failed_org_goals = OrganisationGoal.objects.filter(status="FAILED").count() # 新增绩效计算逻辑 # 获取前端传的参数,没有的话给默认值 start_date_str = request.GET.get('start_date') end_date_str = request.GET.get('end_date') total_score = int(request.GET.get('total_score', 80)) # 默认30天总得分80(4周*20) # 处理日期参数 if start_date_str and end_date_str: start_date = datetime.strptime(start_date_str, "%Y-%m-%d").date() end_date = datetime.strptime(end_date_str, "%Y-%m-%d").date() else: # 默认最近30天 end_date = timezone.now().date() start_date = end_date - timedelta(days=30) # 计算绩效 user_performance = calculate_user_performance(request.user, start_date, end_date, total_score) return render (request, 'home.html', { 'completed_tasks':completed_tasks, 'failed_tasks':failed_tasks, 'debt_complt_goal':debt_complt_goal, 'debt_failed_goal':debt_failed_goal, 'complt_org_goals':complt_org_goals, 'failed_org_goals':failed_org_goals, 'user_performance': user_performance, 'start_date': start_date, 'end_date': end_date, 'total_score': total_score })
步骤3:前端模板添加周期选择和绩效展示
在home.html中添加上传参数的表单和绩效展示区域:
<!-- 周期选择表单 --> <div class="performance-filter"> <form method="get"> <div> <label>开始日期:</label> <input type="date" name="start_date" value="{{ start_date|date:'Y-m-d' }}" required> </div> <div> <label>结束日期:</label> <input type="date" name="end_date" value="{{ end_date|date:'Y-m-d' }}" required> </div> <div> <label>周期总得分上限:</label> <input type="number" name="total_score" value="{{ total_score }}" min="1" required> </div> <button type="submit">查询绩效</button> </form> </div> <!-- 绩效展示 --> <div class="performance-card"> <h3>当前周期绩效</h3> <p>{{ user_performance }}%</p> </div>
可选扩展:历史绩效归档
如果你需要固化历史周期的绩效数据,避免后续任务数据修改导致历史绩效变化,可以新增Performance模型,配合定时任务自动归档:
class Performance(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='performances') start_date = models.DateField() end_date = models.DateField() total_score = models.IntegerField() actual_score = models.IntegerField() performance_percent = models.FloatField() created_at = models.DateTimeField(auto_now_add=True) class Meta: unique_together = ('user', 'start_date', 'end_date') def __str__(self): return f"{self.user.get_full_name()} - {self.start_date}至{self.end_date} 绩效:{self.performance_percent}%"
写个Django定时任务,每月/每季度自动计算上一个周期的所有用户绩效存入该表,查询时优先从该表取历史数据,未归档的周期实时计算即可。
内容的提问来源于stack exchange,提问作者Thaddeaus Iorbee
相关产品推荐
相关产品推荐

