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

Django中基于双周周期批量生成员工空白工时表表单的方法

解决方案

首先需要完善你的工时表模型(Foo),添加与CreateNewTimesheet的关联,确保每条工时记录能对应到具体的双周周期工时表:

from django.db import models
from django.utils.translation import gettext_lazy as _

class Foo(models.Model):  # 修正拼写错误:model.Models → models.Model
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
    # 添加关联到CreateNewTimesheet,明确归属的双周工时表
    timesheet = models.ForeignKey(CreateNewTimesheet, on_delete=models.CASCADE, related_name='work_entries')
    work_date = models.DateField(_("工作日期"))  # 记录单日工时的日期
    time_in = models.DateTimeField(_("上班时间"), null=True, blank=True)  # 允许空白,用于后续录入
    time_out = models.DateTimeField(_("下班时间"), null=True, blank=True)

    class Meta:
        verbose_name = "工时记录"
        verbose_name_plural = "工时记录"
        # 避免同一员工在同一周期的同一天重复生成记录
        unique_together = ('employee', 'timesheet', 'work_date')

接下来,创建Django自定义管理命令,实现批量生成空白工时表的功能:

1. 创建管理命令文件

在你的Django应用目录下,新建management/commands/generate_timesheets.py(如果management或commands目录不存在,需手动创建,且每个目录都要有__init__.py文件):

from django.core.management.base import BaseCommand
from django.utils import timezone
from datetime import timedelta
from your_app.models import Employee, CreateNewTimesheet, Foo

class Command(BaseCommand):
    help = '为所有活跃员工批量生成下一双周周期的空白工时表'

    def handle(self, *args, **options):
        # 计算下一个双周周期的起止日期
        today = timezone.now().date()
        # 从现有双周周期中获取最近的结束日期,推算下一个周期的开始
        last_period = CreateNewTimesheet.objects.order_by('-end_date').first()
        if last_period:
            next_start = last_period.end_date + timedelta(days=1)
        else:
            # 若没有历史周期,以当前日期所在双周的下一个周期为起点
            days_since_monday = (today.weekday() - 0) % 7  # 周一为0
            current_period_start = today - timedelta(days=days_since_monday)
            next_start = current_period_start + timedelta(days=14)
        next_end = next_start + timedelta(days=13)  # 双周包含14天(起止日期均算在内)

        # 获取所有活跃员工(可根据业务需求调整筛选条件)
        employees = Employee.objects.filter(is_active=True)

        created_count = 0
        for employee in employees:
            # 为员工创建/获取对应周期的CreateNewTimesheet记录
            # 利用其save方法自动关联TwoWeekPeriod
            timesheet, _ = CreateNewTimesheet.objects.get_or_create(
                employee=employee,
                start_date=next_start,
                end_date=next_end
            )

            # 收集需要生成的空白工时记录(跳过已存在的日期)
            existing_dates = Foo.objects.filter(timesheet=timesheet).values_list('work_date', flat=True)
            new_work_entries = []
            
            current_date = next_start
            while current_date <= next_end:
                # 仅生成工作日的空白记录(若不需要过滤周末可删除此判断)
                if current_date.weekday() < 5 and current_date not in existing_dates:
                    new_work_entries.append(
                        Foo(
                            employee=employee,
                            timesheet=timesheet,
                            work_date=current_date
                        )
                    )
                current_date += timedelta(days=1)
            
            # 批量创建空白记录,提升效率
            if new_work_entries:
                Foo.objects.bulk_create(new_work_entries)
                created_count += len(new_work_entries)

        self.stdout.write(self.style.SUCCESS(f"成功生成{created_count}条空白工时记录"))

2. 使用方法

在项目根目录下执行命令:

python manage.py generate_timesheets

3. 扩展优化

  • 定时执行:可以通过系统定时任务(如Linux的cron、Windows的任务计划程序)每两周自动运行该命令,实现无人值守生成。
  • 自定义筛选:修改Employee.objects.filter(is_active=True)的条件,可针对特定部门、岗位的员工生成工时表。
  • 周期计算调整:如果你的双周周期起始规则不同(比如从周日开始),可修改weekday()的判断逻辑(周日为6)。

内容的提问来源于stack exchange,提问作者ckcAdmin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:56:19