一、背景
前两篇文章向您展示了一种相对新颖的建模方法,但也是一个简单的实际战斗。在这里,我通过生活中的一个例子来模拟快递业务中的模型建设过程。本文将完全展示基于上下文的业务流程建设模式的操作过程。
事情的原因是我媳妇在家乡的生活把包裹邮寄到杭州。不幸的是,五个包裹中有两个重复了快递订单号,也就是说,我们只收到了四个快递到杭州作为用户。经过一系列的沟通,第五个快递运来了。当然,中间的快递体验有点差。毕竟里面有父母做的年货,容易坏。
当然,作为一名技术人员,我们必须知道这是一种异常情况,但重复运单号确实会产生一些业务问题。因此,如果我们在网上查看这种情况,最终的结果是很容易丢失快递。因此,我们不关心为什么快递运单号重复。相反,我们将看看如何通过基于上下文的业务流程建设模式构建快递物流模型。
二、基于快递物流领域的建模案例
2.1 需求说明(模拟各大快递物流公司的经营场景)
其实这里有很多快递业务场景,比如电商快递,个人邮寄快递。大型货运快递或航运快递等。 所以我们在这里模拟两种最常见的情况
- 快递公司参与电子商务业务的商品邮寄业务)
- 快递公司参与个人邮寄业务(私人)
2.2 角色参与
在建模之前,我们将首先明确与角色相关的参与者和参与职责。
角色名称 | 角色职责 | 说明 |
---|---|---|
发件人 | 快递动作执行人 | 企业、个人、公司 |
快递公司 | 负责快递收集、发送、收件人签收的整体业务流程管理 | 快递公司是整个业务流程系统数据的维护者 |
收件人 | 快递收货签收行动执行人 | 企业、个人、公司 |
快递员 | 负责快递收集和快递到收货人 | 快递员负责联通快递物品,收件人 |
快递站点 | 快递负责从发件人手中发送给快递公司, | |
快递负责从快递公司发送给收件人 | 快递站负责区域快递业务,与发件人和收件人沟通 | |
快递中心 | 负责快递在不同城市的运输,不同于仓库,快递中心的快递长期保存和维护 | 不同的城市和地区有不同的转运中心来承担长途快递 |
2.3 连接业务流程
在这里,因为我没有从事快递业务的发展,我也咨询了相关的学生。这里只列出了一些过程的一般内容和快递拒绝场景。更详细的场景将更复杂,当然,更符合业务需求。
-
正业务流程-个人快递业务
-
正业务流程-电子商务公司快递业务
- 逆向过程-快递拒收场景
2.4 统一语言和隐喻
从上面的节目中,我们可以看到,如果从统一语言的角度,我们可以列出一些与统一语言和隐喻相关的单词,以帮助我们更好地理解业务和辅助建模。下表是快递物流业务的统一语言:
统一语言词语 | 隐喻 | 说明 |
---|---|---|
顺丰 | 顺丰快递公司 | 快递平台公司,以顺丰为简称 |
韵达 | 韵达快递公司 | 云达是快递平台公司的简称 |
EMS | 邮政快递服务 | 中国是中国邮政快递公司,EMS为简称 |
快递,快件 | 快递物品或商品 | 这里的快递是名词,快递是隐喻或快递业务的特殊词 |
快递站点 | 快递公司与各城市社区合作的快递网点,又称快递网点 | 快递网点又称快递网点,负责辐射区域内的快递收发业务,按类型有专门合作的快递,支持不同快递公司的快递业务 |
发件人 | 快递的发货人也是发货人 | 发件人一般按业务类型分为个人、公司或企业 |
收件人 | 快递的收货人也是收货人 | 收件人一般按业务类型分为个人、公司或企业 |
快递员 | 快递公司员工 | 负责收集快递,并将快递发送给收件人 |
转运中心 | 大型物流处理仓库 | 长途快递集中收发调度中心 |
快递订单 | 邮寄快递凭证 | 记录快递所需的核心信息,类似于商品订单 |
签收 | 快递送达 | 快递签收意味着快递订单正常结束。一般情况下,快递员与收件人协调存放地点后自动签收 |
拒签 | 收货人拒绝签收快递 | 拒绝也意味着快递订单异常结束,相关方需要解释拒绝的原因和后续快递处理事项 |
运单号 | 快递订单的单据号 | 运单号代表一个或一个快递订单 |
此外,还有其他统一的快递业务语言,如上门、到付、退货等。由于篇幅有限,这里不再继续。
三、建模过程
在这里,我们根据以上梳理的一般流程,结合以下业务流建模法的步骤,逐步构建快递公司的快递业务领域模型。
3.1 上下文在识别领域
在这里,我们从快递公司的角度来看,快递业务的核心领域是什么?核心领域也意味着商业价值带来利润的领域,所以核心领域应该是基于快递衍生快递订单的快递。在这里,我们将快递订单作为订单领域,快递本身作为核心领域,然后查看其他统一语言背后的业务领域。因此,对于发件人来说,收件人也是基于快递货物的,这是业务流程的核心对象或上下文。但隐喻是,发件人必须是快递公司的用户,收件人不一定是。但如果收件人是,也就是说,发件人和收件人是系统用户,此时我们可以将发件人或可能的收件人用户视为用户的上下文或用户子领域。
另一方面,快递网点、快递员、快递中心与快递公司合作,所以从业务快递网点可以计算上下文,快递员工包括客户服务我们计算上下文,运输中心具有存储功能,也是大型物流中心的核心领域,快递公司需要依靠运输中心等机构在不同城市做业务,然后我们可以在仓库或仓库中上下文。
同时在长途物流过程中会涉及到大型货车的运输转运,这里在快递业务中对于参与的角色来说大型货车和司机其实存在感不强,按照现实场景来一般也有合作运输车队也有快递公司自己的运输车队。因此,在建模过程中,我们可能需要单独作为上下文来看待这种合作关系或物流团队,以避免在建模过程中遗漏。当然,如果我们不关注这个领域,这是可以理解的。毕竟,我们需要关注核心领域和一些明显的领域。在建模过程中,我们可以随时调整和增加该领域,以改善整个快递业务的业务模式。
现在,让我们根据基本的演绎和识别结果绘制该领域的上下文图。当然,如果团队中的每个人都能发布一份,然后一起讨论最合适的领域,并将其视为建模结果的第一步。在这里,我们首先给出一个粗略的领域上下文图,具体来说,我们可以给出每个领域的核心对象,并将继续丰富整个业务流程模型。
3.2 创建画布
这里我们构建一个比较宽的画布,然后分领域服务和上下文,通过标红的框来识别核心领域内容。这个画布的作用类似于一种大纲或者草稿,从这里开始我们可以基于这个画布来构建相对详细的业务流模型。
3.3 建模
这一步需要花费的时间会比较多,我在构建画布中的内容时也做了多次调整,看上去很简单,但是不懂业务或者没做过则会难一点。还是之前的套路,我们将画布分为三个部分,然后分别填充不同的内容。
3.4 归纳推演
在这一步中我们可以针对不同的用户故事来补充和调整不同的实体所处的上下文,同时补充对应的角色和实体的属性。然后不断完善基于不同用例场景的建模字段和业务语意。当然涉及到相对关键的地方也可以通过UML类图来对某个上下文的业务操作流程进行详细展开,这样可以快速得到一个业务组件的基本模型,只不过这里的UML类图文档可能就不在业务流图中展示了。
3.5 整理沉淀
这一步可以具体消化下上面的业务流图中的内容,我们可以构建一个相对完整的领域模型,如下图:
这里我们看一下简单归纳总结之后的数据库e-r图:
由于上面的是业务流图,所以可以抽取业务用例,作为用例图或者用户故事。另外一方面需求文档上也会有一些泳道图之类的需求说明,可以将需求文档与业务流图结合起来构建业务调用时序图。这里我们如果深入模块或者服务组件级别则可能需要从技术的角度来画一下业务操作是从哪个端发起的,中间经历哪些服务的哪些层,然后其他端如何与系统交互完成整个业务操作。这里也简单给一下业务时序图,仅供参考:
3.6 不断优化
通过上面的建模过程,我们最终得到了很多我们想要的文档,而且这些文档可以作为系统的基石存在,所以不管是从0-1建设的需求还是迭代式的需求这些文档都将是软件系统的宝贵财富,需求不断变化,所以这些文档也会有一些变化。 通过不断的维护和优化文档模型我们最终会得到一个当前系统的相对客观的业务模型和业务流程。所以这个过程也需要体现在建模方法中,不是用了一次建模方法后续就不需要了。
3.7 落地建模
这一步是可选操作,因为前面的建模内容都可以认为是技术讨论,方案和模型设计环节,所以算是编码前的一些设计准备,那么在落地建模的时候我们就可以将模型落实到代码上来看看是否符合预期,当然更多的不止于模型,还有一些别的代码,所以如果要快速验证代码内容还是需要团队和相应的工具的。这里推荐一下天画-codeMaker,支持将领域模型UML文档转换成代码,如果有数据库e-r图模型的话则可以支持后端低代码生成: 天画的开源gitee地址是:https://gitee.com/sky-painting/code-maker 另外关于建模相关的文档资料都会在上面这个工程和另外一个DDDinaction的gitee项目中,可以关注下,开源地址如下: https://gitee.com/codergit.com/dddin-action
四、总结
本篇基于一个现实场景的行业建模来演示一下基于上下文的业务流建模法的操作过程,当然整个建模方法还需要一些改良,欢迎有需要用到建模的地方使用该方法一起改进。 另外上一篇文章的微信公众号图片不够清晰,这里放出原版文章链接,方便串联整个建模方法的内容: https://www.yuque.com/docs/share/eb019d37-bf5e-40d1-95e3-2b208c8c82d0?# 《基于上下文的业务流建模法(二)》