根据每周计划确定可用性

时间:2013-07-18 16:37:48

标签: php mysql user-interface scheduler

这里有一个独特的问题,但我想我会看到是否有人从经验中得到了一些洞察力。

需要在Web应用程序中存储呼叫中心员工的每周计划。 Web应用程序有三个实体:

员工 - 属于团体 员工组 - 包含员工,具有应用于添加到组的新员工的基本计划 管理员 - 负责维护员工组。为了示例,管理员也可以是员工。

要求

  • 管理员可以更改员工组的基本计划

  • 管理员可以选择允许员工偏离 时间表,由管理员控制

  • 管理员可以进一步选择允许员工偏离计划 他们自己

  • 管理员使用UI小部件来确定员工组的计划。时间表有三种类型,按一般可怕性ASC

    排序
    • 类型1 - 24/7可用性(将此表示为计划中的简单标记与标记完整的Mon-Sun可用性)
    • 类型2 - 所选日期的设置开始/结束时间或开始/结束时间组。 (例如,9a-11a,1p-4p,周一至周五)
    • 类型3 - 一组可变的开始/结束时间,按天变化(例如9a-12p,Mon,1p-4p,5p-9p,Tue等)
  • 管理员可以随时通过UI

  • 更改计划类型
  • 允许偏离的员工也可以随时通过用户界面更改计划类型

  • 查询必须快速,因为我们必须进入单独的数据库以获取有关可用员工的更多信息

  • 为了更好地衡量,需要相对于来电者时区计算可用性。因此,具有类型2时间表的EST中的组可能实际上不可用,具体取决于呼叫者从哪里拨打电话

我确实把它们说成是允许我们在原始计划无法根据UI要求轻松转换为新计划的情况下,将计划条目分开。最好的例子是Type 3 - >输入2.

然而,昨天有一个额外的要求(截止日期为3个工作日),对于类型3,用户必须能够指定跨越午夜的时间范围。例如:

Start [Monday] at [9:00pm] until [Tuesday] at [3:00am] [Add new time block]
Start [Tuesday] at [8:00am] until [Tuesday] at [5:00pm] [Add new time block]

当通过Type 3 UI进行更改时,还需要在自动合并时检测计划重叠和邻接。

示例模式应该有助于快速查找给定时间,星期几和group_id

employee_schedule
_________________
id (int) auto-inc // PK
employee_id (int) // FK
employee_group_id (int) // FK
start_day (int) // 0-6
start_time (time)
end_day (int) // 0-6
end_time (time)

然而,至少对于类型3而言,UI会使得添加/编辑/更新练习变得乏味,因为您无法信任用户输入。

有没有人遇到过类似的问题?我试图弄清楚我是否应该做一堆前端验证来检测重叠/邻接并在将它们发送到服务器之前将它们合并,或者如果PHP更适合。或者如果对整个事情有坚如磐石的争论,哈哈。任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我的系统涉及两个表:

  • 定期约会等事件,以及任何其他义务。
  • 基于规则的重复性事件,可以是每日,每周等。其中包括节假日和午休时间的规则。

根据提供者或服务进行预约。因此,数据库的shedule表具有用于对不同类型的事件进行分类的系统,无论是涉及特定提供者还是特定服务。如果适用,它还包含每个事件的客户端ID。

我还为每个提供商提供了表格,以及他可以提供哪些服务。如果提供商在给定时间内可用,则根据其可用性以及其他提供商的可用性计算服务的可用性。它还取决于服务类型。

管理员可以编辑服务的特征:

  • 服务期限。
  • 每个供应商每单位持续时间的客户数量。对于某些服务,它只是一对一,但其他服务可能持续一个小时,在那个小时内,一个提供商可能能够参加多个客户。

系统基于平均工作量。如果服务的特征使提供者超载,管理员可以简单地调整数据库中的服务特征,以限制预定的约会数量。

我做的另一件事是将时间单位分解为15分钟的块(这实际上是一个可以根据需要更改的配置设置)。因此,所有调度和规则都以块开始和结束。我的类中有一组转换函数,例如,在时间戳和块单位之间进行转换,四舍五入到最近的块。

将所有这些放在一起是一项非常重要的任务。基于所有数据,规则,服务类型等,我必须在给定的持续时间内提出数组,以显示提供者和服务的可用性。例如,对于给定的一周和给定的服务,我的类必须生成一个数组来显示可以为任何时间段安排的数量约会。为此,我想到了可以叠加的“透明度”。如果给定服务有3个提供者,那么我必须将他们的时间表覆盖为透明度。如果给定的时间段有所有三个提供者可用,则可以认为透明度对于安排3 * Serviceload是明确的。但是,根据提供商的不可用性,透明度会越来越灰。如果所有这三个都不可用,则该块将被“遮挡”,以便不能安排任何约会。

在调度数组中提供了所有数据后,我将其全部与jQuery FullCalendar类合并,用于拖放调度。