ruby-on-rails - 为员工安排假期任务
问题描述
我正在尝试实现一项功能,员工根据创建的时间表轮换任务分配。在大多数情况下,员工每天、每周、每两周或每月轮换一次任务。
例如,我们有 4 名员工:John、Peter、Avit、Jane 对于每日日程安排,John 可能负责第一周的任务,Peter 负责第二周等
有时员工可能正在休假。例如,John 在分配给任务的前 2 天在 PTO,而 Avit 在这 2 天接管,当 John 在第 3 天回来时,他收回了任务分配。我试图弄清楚如何使用 ice_cube 实现这样的调度功能。
我知道如何创建一个重复发生和例外的时间表。但是我不确定如何将其与在一组具有覆盖的用户之间轮换的概念结合起来。
我已经实现了一个名为 ScheduleUser 的模型,它存储了 user_id 和优先级值。我有一个在每个发生日期/时间运行的延迟作业,它会为每个用户轮换优先级列中的值。分配给任务的人是具有最高优先级的人。
这适用于简单的用例,但是当我必须覆盖(部分或整个持续时间)员工分配时,这不起作用。
解决方案
根据您关于此主题的其他 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 天接管任务的方法,您只需要destroy
或edit
现有的活动ice_cube
时间表,对吗?
推荐阅读
- python - 如何修复 numpy TypeError:不支持的操作数类型 -:'str' 和 'str'
- java - Selenium: java.awt.image.RasterFormatException: (y + height) 在使用元素大小和位置时在 Raster 之外
- machine-learning - 在机器学习的大型数据集中编码分类数据(URL)的最佳方法?
- c# - 如何将基类重新设计为泛型
- visual-studio-code - VS Code 中使用 JSONSchema 的 JSON 路径自动完成
- php - PHPSpreadsheet 将电子表格作为流读取
- swift - 自动生成 ID 的 Firestore updateData FieldValue
- r - 半融化数据的 Tidyr 解决方案
- c# - VpnManagementAgent 总是返回零配置文件,而且我似乎无法创建新配置文件
- java - JDialog 不会显示在设计选项卡中