
画状态图分 4 步列全订单会经历的状态用箭头连出转换并写上触发事件按条件分去向时加守卫条件最后画出起点和终态。下文用一个虚构的电商订单把整套流转画成一张图。核心观点状态图只盯一个对象圆角框是状态箭头是转换箭头上写「事件 [守卫条件]」每个状态都要有出路结束处画上终态。状态图的5个基本元素状态图由状态、转换、事件、守卫条件、起点和终态 5 种元素组成画法出自 UML 状态机图。元素画法订单里的例子状态圆角矩形待支付、待发货转换带箭头的线待支付 → 待发货事件箭头上的文字商家发货守卫条件事件后的方括号[金额一致]起点、终态实心圆圆圈套实心圆提交订单进入待支付UML 2.5.1 规范里转换文字写作「事件 [守卫条件] / 动作」如「支付回调 [金额一致] / 通知商家」用不到的可省略。第1步列全订单状态状态是订单停留的一种情况用「待…」「已…」「…中」命名正常和异常流程都要列。正常流程待支付、待发货、待收货、已完成。异常流程已取消、退款中、已退款。别混进动作「支付」「发货」是事件不是状态状态说的是订单现在怎样。第2步连转换写事件每条箭头写一个触发事件如「商家发货」先填转换表再画图方便和研发、测试逐行核对。当前状态事件 [守卫条件]下一状态待支付支付回调 [金额一致]待发货待支付支付回调 [金额不一致]待支付人工核对待支付用户取消或超时未支付已取消待发货商家发货待收货待发货申请退款退款中退款中退款到账已退款待收货确认收货或超时自动确认已完成第3步加守卫条件同一个事件要按条件走不同的路时在事件后面用方括号写守卫条件条件成立才转换。示例支付回调后金额与订单一致进入待发货不一致留在待支付等人工核对。分支多时画菱形选择节点每条出线写一个条件UML 规范建议留一条 [else]免得无路可走。第4步画起点和终态从实心圆画箭头到待支付写上「提交订单」已完成、已取消、已退款之后不再变化各画一条箭头到终态。Mermaid写状态图订单示例Mermaid 的 stateDiagram-v2 一行写一条转换冒号后面是箭头上的文字状态名可直接写中文。[*]在箭头左边是起点在右边是终态选择节点用choice声明。官方文档没有单独的守卫语法方括号直接写进冒号后的文字。下面的代码按官方文档写法我们在本机用 Mermaid 11.17.2 渲染通过提交订单用户取消或超时未支付支付回调[else][金额一致]申请退款商家发货退款到账确认收货或超时自动确认待支付已取消待发货退款中待收货已退款已完成状态图常见的4个错误把动作画成状态框里写「支付」「发货」分不清状态和事件。箭头上不写事件看不出什么时候会变开发和测试只能猜。漏掉异常流程只画下单到完成一条线取消、退款都没画。进得去出不来「退款中」只有进来的箭头、没有出去的订单会一直卡住。总结画状态图先列全状态再连转换、写事件按条件分去向时加守卫最后画起点和终态。画完顺着箭头走一遍每个状态都有出路规则就讲清了。互动问题你们系统里哪个对象状态多、规则乱评论区写出它的状态我们挑几条帮你看漏了哪条转换。