状态机实际业务的抽象与实现

jasmine 于 2023-07-01 发布

前言

有限状态机(英语:finite-state machine,縮寫:FSM)又稱有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。(FROM WIKI)

核心

状态机中的核心内容:有限个状态、通过外部操作引起状态的转移。 用来对状态的流转进行解耦,使代码逻辑更加清楚和更容易维护

FSM的组成和分类

组成

所有的状态转换都可以概括为:F(S, E) -> (A, S’),即如果当前状态为S,接收到一个事件E,则执行动作A,同时状态转换为下个状态S’。

分类

状态机的实际业务设计和抽象

1、状态机组件的抽象

1)开始组件

代表流程开始

{
    "id":1,
    "stageId":"start",
    "stageName":"开始",
    "conditions":[
        {
            "cond":"next",
            "condName":"流转到下一阶段",
            "stageId":"preLabel"
        }
    ]
}

2)预标注组件

调用执行算法模型,实现支持自动标注过程
输入

输出

{
  "id":2,
  "stageId":"preLabel",
  "stageName":"预标注",
  "conditions":[
    {
      "cond":"fail",
      "condName":"预标注失败",
      "stageId":"end"
    },
    {
      "cond":"succ",
      "condName":"预标注成功",
      "stageId":"label"
    }
  ],
  "params":[
    {
      "paramId":1,
      "paramName":"模型",
      "paramType":"model",
      "paramVal":"1"
    }
  ]
}

3)标注组件

人工标注过程
输入

输出

{
    "id":3,
    "stageId":"label",
    "stageName":"标注",
    "conditions":[
        {
            "cond":"save",
            "condName":"标注保存",
            "stageId":"label"
        },
        {
            "cond":"submit",
            "condName":"标注提交",
            "stageId":"approve"
        },
        {
            "cond":"finish",
            "condName":"标注结束",
            "stageId":"end"
        }
    ],
    "params":[
        {
            "paramId":1,
            "paramName":"标注人",
            "paramType":"user",
            "paramVal":"张三"
        },
        {
            "paramId":2,
            "paramName":"标注工具",
            "paramType":"labelTool",
            "paramVal":"1"
        },
        {
            "paramId":3,
            "paramName":"填槽,标注结果(根据工具的不同,值不同)",
            "paramType":"@slotLabel",
            "paramVal":null
        }
    ]
}

说明:参数中带有@的是接口交互的时候补充进来的参数,不带@的是流程初始化的时候给到的参数

4)审核

审核视频是否通过
输入

输出

{
    "id":4,
    "stageId":"approve",
    "stageName":"审核",
    "conditions":[
        {
            "cond":"relabel",
            "condName":"打回,重新标注",
            "stageId":"label"
        },
        {
            "cond":"pass",
            "condName":"通过",
            "stageId":"end"
        }
    ],
    "params":[
        {
            "paramId":1,
            "paramName":"审核人",
            "paramType":"user",
            "paramVal":"李四"
        },
        {
            "paramId":2,
            "paramName":"填槽,审核结果",
            "paramType":"@slotApprove",
            "paramVal":null
        }
    ]
}

5)结束

代表流程的结束
输入

输出

{
    "id":5,
    "stageId":"end",
    "stageName":"结束",
    "conditions":null,
    "params":[
        {
            "paramId":1,
            "paramName":"结束标识",
            "paramType":"@end",
            "paramVal":null
        }
    ]
}

2、状态机流程的抽象

状态机流程,这个流程是可以以绘图的方式生成

{
    "id":1,
    "flowName":"预标注+标注+审核",
    "stages":[
        {
            "id":1,
            "stageId":"start",
            "stageName":"开始",
            "conditions":[
                {
                    "cond":"next",
                    "condName":"流转到下一阶段",
                    "stageId":"preLabel"
                }
            ],
            "params":null
        },
        {
            "id":2,
            "stageId":"preLabel",
            "stageName":"预标注",
            "conditions":[
                {
                    "cond":"fail",
                    "condName":"预标注失败",
                    "stageId":"end"
                },
                {
                    "cond":"succ",
                    "condName":"预标注成功",
                    "stageId":"label"
                }
            ],
            "params":[
                {
                    "paramId":1,
                    "paramName":"模型",
                    "paramType":"model",
                    "paramVal":"1"
                }
            ]
        },
        {
            "id":3,
            "stageId":"label",
            "stageName":"标注",
            "conditions":[
                {
                    "cond":"save",
                    "condName":"标注保存",
                    "stageId":"label"
                },
                {
                    "cond":"submit",
                    "condName":"标注提交",
                    "stageId":"approve"
                },
                {
                    "cond":"finish",
                    "condName":"标注结束",
                    "stageId":"end"
                }
            ],
            "params":[
                {
                    "paramId":1,
                    "paramName":"标注人",
                    "paramType":"user",
                    "paramVal":"张三"
                },
                {
                    "paramId":2,
                    "paramName":"标注工具",
                    "paramType":"labelTool",
                    "paramVal":"1"
                },
                {
                    "paramId":3,
                    "paramName":"填槽,标注结果(根据工具的不同,值不同)",
                    "paramType":"@slotLabel",
                    "paramVal":null
                }
            ]
        },
        {
            "id":4,
            "stageId":"approve",
            "stageName":"审核",
            "conditions":[
                {
                    "cond":"relabel",
                    "condName":"打回,重新标注",
                    "stageId":"label"
                },
                {
                    "cond":"pass",
                    "condName":"通过",
                    "stageId":"end"
                }
            ],
            "params":[
                {
                    "paramId":1,
                    "paramName":"审核人",
                    "paramType":"user",
                    "paramVal":"李四"
                },
                {
                    "paramId":2,
                    "paramName":"填槽,审核结果",
                    "paramType":"@slotApprove",
                    "paramVal":null
                }
            ]
        },
        {
            "id":5,
            "stageId":"end",
            "stageName":"结束",
            "conditions":null,
            "params":[
                {
                    "paramId":1,
                    "paramName":"结束标识",
                    "paramType":"@end",
                    "paramVal":null
                }
            ]
        }
    ],
    "flowDesc":""
}

3、状态机的抽象

1)类图

状态机类图

2)时序图