首页 > 解决方案 > 为员工安排假期任务

问题描述

我正在尝试实现一项功能,员工根据创建的时间表轮换任务分配。在大多数情况下,员工每天、每周、每两周或每月轮换一次任务。

例如,我们有 4 名员工:John、Peter、Avit、Jane 对于每日日程安排,John 可能负责第一周的任务,Peter 负责第二周等

有时员工可能正在休假。例如,John 在分配给任务的前 2 天在 PTO,而 Avit 在这 2 天接管,当 John 在第 3 天回来时,他收回了任务分配。我试图弄清楚如何使用 ice_cube 实现这样的调度功能。

我知道如何创建一个重复发生和例外的时间表。但是我不确定如何将其与在一组具有覆盖的用户之间轮换的概念结合起来。

我已经实现了一个名为 ScheduleUser 的模型,它存储了 user_id 和优先级值。我有一个在每个发生日期/时间运行的延迟作业,它会为每个用户轮换优先级列中的值。分配给任务的人是具有最高优先级的人。

这适用于简单的用例,但是当我必须覆盖(部分或整个持续时间)员工分配时,这不起作用。

标签: ruby-on-railsrubyice-cube

解决方案


根据您关于此主题的其他 SO 问题,我建议您在数据库中有一个字段,允许您从该schedule_users方法中排除用户。

validates_presence_of :name, :start, :frequency, :project
    
  def next_occurrence
    ice_cube_schedule.next_occurrence.start_time
  end

  def jobs
    Delayed::Job.where('handler LIKE ?', "%Schedule/#{id}\%")
  end

  def on_call_user
    # This should not include any users that are unavailable
    schedule_users.max_by(&:priority).user if users.present?
  end

  def priority(user)
    # This should not include any users that are unavailable
    schedule_users.where(user: user).first.try(:priority)
  end

  ...
end

因此,在您的User模型中,您可以有一个scope阻止unavailable用户被选中的:

class User
  # we will need a boolean database field called "unavailable"

  scope :available, -> { where(unavailable: false) }

  ...
end

然后您可以调用User.all.available(或@users.available) 以仅获取“可用”用户。

互相掩护怎么样?

也许我过度简化了这一点,你的例子是一个相当复杂的逻辑:

John 在前 2 天在 PTO 上,而他被分配到任务中,而 Avit 在这 2 天中接管,当 John 在第 3 天回来时,他收回了任务分配

如果 John 已经在 PTO 上,为什么要为他分配任务?为什么它不默认为 Avit?这就是我上面所说的。

如果您想要一种手动让约翰在第 3 天接管任务的方法,您只需要destroyedit现有的活动ice_cube时间表,对吗?


推荐阅读