编辑代码

import datetime
import random

# 员工类
class Employee:
  def __init__(self, name, id, title, post):
      self.name = name
      self.id = id
      self.title = title 
      self.post = post
      self.last_rest_day = None
      
# 班次类
class Shift:
  def __init__(self, id, time, post):
      self.id = id
      self.time = time
      self.post = post
     
# 排班类  
class Schedule:

  def __init__(self):
      self.employees = []
      self.shifts = []
      self.schedules = {}
      self.holidays = []
    
  def add_employee(self, employee):
      self.employees.append(employee)
      
  def add_shift(self, shift):
      self.shifts.append(shift)
      
  def add_holiday(self, date):
      self.holidays.append(date)  
      
  # 生成排班
  def generate(self, start, end):
      for date in self.get_dates(start, end):
          self.schedule_for_date(date)
          
  # 单日排班
  def schedule_for_date(self, date):
      if date in self.holidays:
          self.assign_holiday(date) # 休息
      else:
          self.assign_night_shift(date) # 夜班
          
          for emp in self.employees:
              if self.is_rest_day(emp, date):
                  self.assign_rest(emp, date) # 休息 
              else:
                  self.assign_shift(emp, date) # 正常班次

  # 分配特定员工  
  def assign_shift(self, emp, date):
      shift = self.get_shift(emp.post)
      if shift:
          print(f'{emp.name} 的班次是 {shift.time}')
          self.update_last_rest_day(emp, date)
          
  # 判断是否休息
  def is_rest_day(self, emp, date):
      # 每7天休息一次
      if emp.last_rest_day is None or (date - emp.last_rest_day).days >= 7:
          return True
      else:
          return False
          
  # 更新最后休息日 
  def update_last_rest_day(self, emp, date):
      emp.last_rest_day = date
      
  # 获取对应岗位的班次
  def get_shift(self, post):
      for s in self.shifts:
          if s.post == post:
              return s
      return None
  
  # 其他函数    
  def assign_holiday(self, date):
    ...
    
  def assign_night_shift(self, date):
    ...

# 主程序  
sched = Schedule()
sched.add_holiday(datetime.date(2023, 2, 5)) 

# 添加员工、班次

start = datetime.date(2023, 2, 1)
end = datetime.date(2023, 2, 28)  
sched.generate(start, end)