learn-tech/专栏/领域驱动设计实践(完)/104实践培训上下文的业务需求.md
2024-10-16 11:38:31 +08:00

9.5 KiB
Raw Blame History

                        因收到Google相关通知网站将会择期关闭。相关通知内容
                        
                        
                        104 实践  培训上下文的业务需求
                        在开始 EAS 系统的设计与开发之后客户的需求又引入了培训功能希望通过培训提高开发人员的技能水平。由于培训业务相对独立因而为其单独建立了培训上下文Training Context。这个独立的培训上下文牵涉到相对复杂的业务流程与业务规则非常适合用于描述完整的领域建模过程。因此从本章开始我将完整介绍培训上下文的业务需求并利用事件风暴结合场景驱动设计和测试驱动开发完整地展示该上下文领域分析建模、领域设计建模和领域实现建模的过程。

业务需求

培训的目的是为了提高员工的技能水平需要根据员工的职业规划与企业发展制定培训计划Training Plan开展培训。培训的整个管理由人力资源部的培训专员Program Owner负责。在培训流程中除了培训专员还牵涉到部门协调者DU Coordinator、员工主管Report Manager和员工Employee本人。

业务流程

系统将分配给员工的培训机会称之为票Ticket这实际上是领域概念的一种隐喻。培训专员发起培训的过程实际上就是分配票的过程整个流程如下图所示

培训专员在分配票之前会事先设定过滤器和有效日期。过滤器主要用于过滤员工名单获得一个与该培训相匹配的培训提名Nomination候选名单。培训专员设置的有效日期主要用于判断票的有效期限。培训专员会将票分配给部门协调者再由部门协调者将票分配给员工。员工在收到培训邮件后可以选择“确认”或“拒绝”若员工拒绝了分配的票票会退回给部门协调者由部门协调者对票进行再分配。

在发起培训开始到培训结束一共有四个重要的截止时间Deadline

提名截止时间Name List Deadline 缺席截止时间No Show Deadline 培训开始前Before Training Start 培训期间Training

在不同的截止日期员工取消Cancel票的流程都不一样处理票的规则也不相同

在提名截止时间之前员工可以取消票。取消后系统会分别发送邮件给部门协调者与员工主管只要任意一人批准了该取消请求就认为取消成功该票又会恢复到可用状态。在缺席截止时间之前员工可以取消票。取消后系统会发送邮件通知部门协调者和员工主管但无需他们审批而是直接由培训专员负责处理该票。处理票时会先检查分配该票时设置的活动Action策略要么由系统自动处理要么由培训专员处理该票。处理票有三种活动策略

将票分享给别的协调者Share to Coordinator 分配给员工Assign to Employee 让票作废Lost Ticket

在培训开始前,不允许员工再显式地取消票。如果员工在收到票后一直未确认,系统会检查分配该票时设置的策略,要么由系统自动处理,要么由培训专员处理该票,处理票的策略与前相同。一旦培训开始后,就不再允许员工取消票,如果有事未能出席,应提交请假申请。

部门协调者在将票分配给员工后,也可以取消已经分配出去的票。不同截止日期的取消流程不同,如下图所示:

部门协调者取消票的流程与员工取消票的流程比较相似,不同之处在于取消票时无需审批,直接就可处理。在报名截止日期之间,处理票的策略有三种:

提名备选名单竞争票即先到先得Backup Parallel 按照提名备选名单的优先级自动分配票Backup Priority 手动从提名备选名单中选择Manual Assign from Backup

这里的提名备选名单Backup就是之前设置过滤器生成的提名候选名单中剔除掉已经被提名的员工列表。

培训专员也可以取消票,流程如下图所示:

该执行流程与部门协调者取消票的流程几乎完全相同,这里不再赘述。

培训期间每个参与培训的员工都要签到Checkin。培训结束后系统会比较培训提名名单与出勤记录由此可以获得缺席No Show列表。培训专员确认了缺席列表后会根据黑名单规则确定是否将该员工放入到黑名单Black List中。若员工被列入到培训黑名单在将来就不会再出现在培训候选名单中除非又被移出了黑名单。流程如下图所示

票的状态

显然,分配票的业务流程相对简单,复杂之处在于取消票的流程,不同阶段不同角色的取消操作会产生不同的结果,从而带来票状态的变更。在分析业务需求时,梳理票状态的变更很有必要。票的状态迁移以及触发状态迁移的动作如下图所示:

票在分配给员工后状态为“等待确认WaitForConfirm”。若员工一直不确认当时间到达培训专员截止时间PO Deadline状态就变更为“截止Deadline”。若员工拒绝状态变更为“已拒绝Declined否则就确认为“已注册Enrolled”状态。在该状态下若培训专员确认状态变更为“已确认Confirmed”状态。若票已确认而员工未参与培训又或者在缺席截止时间之后取消状态置为“缺席NoShow若正常参加培训最后状态为“关闭Closed”。

在缺席截止时间之前若票的状态为“等待确认WaitForConfirm那么培训专员、部门协调者与员工主管都可以取消票状态变更为“已取消Cancelled”。在“已注册Enrolled”或“已确认Confirmed”状态下只要当前时间在培训专员截止时间之前培训专员、部门协调者与员工主管也可以取消票员工自己也可以取消但状态会变更为“等待审批WaitForApprove”。此时倘若部门协调者或员工主管不批准则票的状态变更为“已确认Confirmed如果批准了又或者在24小时内没有执行任何操作状态就变更为“已取消Cancelled”。处于“已取消Cancelled”状态的票如果被再分配reassign就会重新回到起点——“等待确认WaitForConfirm否则认为该票作废状态为“作废Lost”。

设置有效日期和活动策略

有效日期Valid Date的设置与系统自动触发的活动有关直接影响了培训流程。通常在创建一个培训Training系统会自动将培训的开始时间作为其中一个系统类型的有效日期。同时系统会为培训专员创建两个系统类型的有效日期

缺席截止时间No Show Deadline 培训专员截止时间Program Owner Deadline

系统还为部门协调者创建一个系统类型的有效日期主管截止时间Manager Deadline用户也可以添加自定义的有效日期。在添加有效日期时除了可以指定日期和时间之外还可以定义日期时间的计算公式。

在设置了有效日期之后用户还可以设置当有效日期满足条件会触发的活动Action策略。活动策略包括

发送邮件提醒Send email to remind 在公告栏上显示提醒Show remind in portal 从提名备选名单中分配票Find backup

先到先得Backup Parallel 优先级Backup Priority 手动选择Reassign by Manually

让票作废Lost Ticket

除了可以为有效日期设置处理票的活动策略之外,在培训专员或其他角色分配票时也可以设置这些活动,作为取消票时对票的处理策略。

确定关键概念的统一语言

培训上下文的业务需求在一些领域概念上存在模糊不清的定义,需要为它们确定统一语言,以扫清领域建模工作的障碍。

对于培训票Ticket培训专员可以将票“分配”给部门协调者部门协调者在得到票后又可以将票再“分配”给别的协调者也可以将票直接“分配”给员工。虽然都是在“分配”票含义却完全不同。为避免这两个概念的混淆可以将票直接分配给员工的操作视为对员工的提名Nomination。于是明确了如下概念

分配票给协调者Assign ticket to coordinator获得票的员工为协调者并非参加培训的员工 提名员工Nominate employee意味着将票分给员工使得他具备了参加培训的资格

对于部门的员工而言,在不同场景也具有不同的身份,体现了员工与培训的不同关系:

候选人Candidate利用过滤器删选或直接添加的员工都是培训的候选人。这些候选人具备被培训专员或协调者提名参加培训的资格但并不意味着候选人已经被提名了。 被提名人Nominee指获得培训票要求参加培训的员工即被提名的对象。 备选人Backup提名候选名单中剔除掉已经被提名的员工列表。 学员Trainee被提名人在收到培训票后确认参加就会成为该培训的学员。