You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 15:15:02