一,系统介绍 这是一个运力系统,用于把车辆从工厂运往经销商,运输方式是司机开过去。大概经过以下几个步骤,以此说明操作场景以及对应运单状态,如下 1.运单创建,上游下发数据生成运单,初始状态【未指派】 2.车队长把运单指派给司机或者司机自己扫码,与运单建立关系,状态变为【已指派】 3.司机拿到车后,在app操作发运按钮,运单进入【执行中】状态 4.司机到达目的后,完成交车动作,在app操作交车按钮,运单进入【已完成】状态 5.关于取消,前置状态未指派/已指派/取消(幂等),在pc后台可取消运单,状态变为【已取消】 状态 状态流如下 【未指派】- 【已指派】- 【执行中】 - 【已完成】- 【已取消】 状态变更前置 【未指派】- 【未指派】 【未指派】- 【已指派】 【已指派】- 【执行中】 【执行中】- 【已完成】 【未指派】- 【已取消】 【已指派】- 【已取消】 【已取消】- 【已取消】 取消有多个前置条件 事件 创建 - 指派 - 发运 - 交车完成 - 取消 二,如何使用状态机实现以上需求 <dependency> <groupId>org.squirrelframework</groupId> <artifactId>squirrel-foundation</artifactId> <version>0.3.8</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
设计方案 触发点:操作某个步骤,入参:事件,当前状态,业务参数,就可以进入对应的状态机,触发执行方法 业务执行逻辑:进入状态机后,具体业务逻辑怎么执行,根据当前状态/目的状态/事件/其他业务入参,可进入相应的方法 幂等:对应同一个运单,状态变更时,无法进行多次操作的,需要分布式锁控制 通用的校验-前置校验:对于所有状态变更场景,有统一校验逻辑,状态机可实现 通用的业务逻辑:可实现通用的逻辑校验 DPStateMachine - 状态机