发明内容
针对上述技术问题,本发明采用的技术方案为:一种任务状态转换***,所述***包括数据库、处理器和存储有计算机程序的存储器,其中,所述数据库中包括状态转换器tr,tr与t个实体绑定,t个实体具有t个状态转换映射表{M1,M2,…,Mq,…,Mt},Mq为第q个实体的状态转换映射表,q的取值范围为1到t,Mq包括n个映射关系m={m1,m2,…,mp,…,mn},其中,mp为m中的第p个映射关系,p的取值范围为1到n,n为映射关系的数量;mp={stp,tep,tcp,ttp},其中,stp为第q个实体的第p个当前状态、tep为stp发生状态转换的触发事件、tcp为stp发生状态转换的触发条件、ttp为stp状态转换后的次态且为n个当前状态之一;当所述计算机程序被处理器执行时,实现以下状态转换任务的步骤:
S100,获取第q个实体的当前状态stp。
S200,当stp发生状态转换的触发事件tep和/或触发条件tcp被触发时,根据stp以及tep和/或tcp调用查询函数Pft查询状态转换器tr中的映射关系,得到stp转换后的次态ttp。
本发明至少具有以下有益效果:
第一,首先获取状态转换任务的状态转换图,根据状态转换图配置各个节点对应的当前状态、触发条件、转换事件、次态和动作的映射关系生成映射表,将映射表存储到数据库中;并生成查询函数,查询函数用于查询映射表,当查询函数获取到当前状态、转换事件和触发条件后,即可通过查询函数查询映射表中存储的满足转换事件和触发条件的当前状态的次态和动作,从而实现任务状态之间的转换;本发明根据状态转换图配置并生成映射表,只需要简单的查询函数查询映射表就可获取当前状态的次态,查询函数实现简单,且复用性强,当状态转换关系发生改变时,只需要修改映射表,不需要修改查询函数,简化了***实现状态转换的操作。
第二,一个状态转换器可与多个实体绑定,每个实体具有对应的映射表,在添加新的状态转换任务时,根据新的预设转换图生成映射表,只需要将新的映射表存储到数据库中,即可实现新的状态转换任务;通过复用同一个查询函数查询映射表即可实现状态转化,节省了大量***资源,并且状态转换任务之间不具有依赖关系,能够实现多个状态转换任务的并行操作,提高任务转换效率。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供了一种任务状态转换***,该***包括数据库、处理器和存储有计算机程序的存储器,其中,数据库中包括状态转换器tr,tr与t个实体绑定,t个实体具有t个状态转换映射表{M1,M2,…,Mq,…,Mt},Mq为第q个实体的状态转换映射表,q的取值范围为1到t;Mq包括n个映射关系m={m1,m2,…,mp,…,mn},其中,mp为m中的第p个映射关系,p的取值范围为1到n,n为映射关系的数量;mp={stp,tep,tcp,ttp},其中,stp为第p个当前状态、tep为stp发生状态转换的触发事件、tcp为stp发生状态转换的触发条件、ttp为stp状态转换后的次态且为n个当前状态之一。
其中,状态转换器tr用于存储根据状态转换图生成各节点的当前状态、触发事件、触发条件、次态和动作之间的映射关系。
其中,当前状态stp是状态转换任务在执行过程中的当前所处状态;具体的,当前状态stp、触发条件tcp和触发事件tep之间的映射关系是预先配置的。
需要说明的是,当前状态stp在发生状态转换后的次态ttp可以是stp本身,也即虽然被相应的触发条件tcp和/或触发事件tep触发,但状态并没有发生改变。
其中,触发事件tep是引起正在执行的任务从当前状态stp转换到次态ttp的控制信息;具体的,触发事件tep为预设的对控件执行的点击操作,可选的,控件为确定按钮、单选按钮或者复选按钮,每一种控件具有本身代表的事件,例如:控件代表的事件为窗体的加载、单击、双击或文本框更改文本。
其中,触发条件tcp为状态转换任务在当前状态stp向次态ttp转换时的转换规则,具体的,触发条件根据状态转换图自定义,例如:用户已经执行过登录操作、某个数值到达预设数值或预设信号呈上升状态等。
其中,映射关系mp还包含动作ffp,ffp为当前状态由stp转换到ttp后执行的下一操作;具体的,动作不是必需的,当触发条件和触发事件满足后可不执行任何动作,只将当前状态转换到次态。
可选的,任务状态转换***执行的状态转换任务为用户下单;可选的,任务状态转换***执行的状态转换任务为提供维修服务。
其中,状态转换任务具有预先配置的状态转换图,映射关系m包括状态转换图中的所有状态转换映射关系;状态转换图包含n个节点{pn1,pn2,…,pnp,…,pnn},其中,pnp为第p个节点,p的取值范围为1到n;pnp的状态为mp中的第p个当前状态stp。
其中,状态转换图为描述当前状态、触发条件和触发事件,以及触发条件和触发事件触发的任务状态间的转换;状态转换图通过描述任务的状态及引起状态转换的触发条件和触发事件来表示状态转换任务的行为;具体的,在状态转换图中,每一个节点代表一个状态。
具体的,图2示出了当状态转换任务为用户下单时的状态转换图,状态转换图的节点分别为未下单、已下单未付款、已付款、已发货未收货和已收货;例如:第一个节点为未下单,其对应的第一个当前状态为未下单,当前状态的次态为已下单未付款;图3示出了当状态转换任务为提供维修服务时的状态转换图,状态转换图的节点分别为未预约、已预约未接单、已接单未上门维修、已上门维修和已付款;例如:第三个节点为已接单未上门维修,其对应的第三个当前状态为已接单未上门维修,当前状态的次态为已上门维修。
进一步,当所述计算机程序被处理器执行时,实现以下状态转换任务的步骤,如图1所示:
S100,获取第q个实体的当前状态stp。
其中,当前状态为用户在跳转到当前状态所在界面时同步到任务状态转换***中的状态。
S200,当stp发生状态转换的触发事件tep和/或触发条件tcp被触发时,根据stp以及tep和/或tcp调用查询函数Pft查询状态转换器中的映射关系,得到stp转换后的次态ttp。
其中,查询函数Pft为预设的封装函数,Pft能够实现当输入为当前状态以及触发事件和/或触发条件时,对映射表执行查询操作,Pft的输出为查询到的与当前状态以及触发事件/或转换条件具有映射关系的次态和动作;其中,封装函数为将一个或者多个功能函数封装起来,封装函数只提供一个函数接口,使得当用户在其他场景下需要执行同样的操作时,不需要写同样的函数,直接可以从函数库里调用,而不必考虑功能函数内部的结构。
其中,在通过当前状态以及触发事件/或转换条件获取次态时,利用查询函数Pft查询映射表中的映射关系。相比于现有技术中将状态转换图中具有的状态之间的转换关系全部转化为状态转换函数的形式,本发明利用映射表存放状态转换图中各个节点之间的状态转换映射关系,利用封装的查询函数查询映射表即可实现状态转换,不仅调用封装函数的代码简短,减少程序故障,方便维护,复用性强,当状态转换关系需要修改时,只需要修改映射表中的映射关系,不需要修改封装函数的源代码。
其中,映射关系mp的获取步骤包括:
S300,根据状态转换图配置第p个当前状态、发生状态转换的触发事件、发生状态转换的触发条件和状态转换后的次态。
S400,将第p个当前状态、发生状态转换的触发事件、发生状态转换的触发条件和状态转换后的次态解析为键值对。
可选的,键值对为JASON格式。
S500,提取键值对中的第p个当前状态stp、stp发生状态转换的触发事件tep、stp发生状态转换的触发条件tcp和stp状态转换后的次态ttp并保存为映射关系mp={stp,tep,tcp,ttp}。
其中,本实施例首先将状态转换图中各个节点具有的当前状态、发生状态转换的触发事件、发生状态转换的触发条件和状态转换后的次态之间的映射关系解析为键值对,然后存储到数据库中;相比于现有技术中通过状态转换函数实现所有节点对应的映射关系,本实施例减少了程序故障,通过查映射表实现状态转换不需要校验上一状态,且状态转换之间无依赖关系,当需要修改状态转换关系时能够在不需要修改源代码的前提下,通过配置映射表中映射关系实现对状态转换关系的更改。
进一步,任务状态转换***还包括集群,集群包括主节点和从节点,主节点用于根据从节点的资源配置调度状态转换任务,从节点用于并行执行多个状态转换任务,多个状态转换任务之间不存在依赖关系。
其中,本实施例中状态转换器与多个状态转换任务绑定,可以实现多个任务的并行操作;具体的,用户向集群发送任务请求,集群包括主节点和从节点;主节点和从节点为集群中不同的服务器,主节点获取从节点的硬件资源并调度任务,从节点执行主节点分配的任务;由于在执行时任务之间没有相互的依赖关系,因此能够实现多个任务的并发处理。
综上所述,本实施例首先获取状态转换任务的状态转换图,根据状态转换图中的各个节点对应的当前状态、触发事件、触发条件、次态和动作的映射关系生成映射表,将映射表存储到数据库中;并生成查询函数,查询函数用于查询映射表,当查询函数的输入为获取到的当前状态、触发事件和触发条件时,查询函数通过查询映射表获取对应的映射关系,输出满足转换事件和触发条件的当前状态的次态和动作,从而实现任务状态之间的转换;本实施例利用状态转换图生成映射表,只使用简单的查询函数就可获取当前状态的次态和动作,一定程度上减少冗余的状态转换代码;当添加新的状态转换任务时,根据新的任务的状态转换图生成新的映射表,只需要将新的任务的映射表与状态转换器进行绑定,即可实现新的任务的状态转换;实现了查询函数的复用,简化了操作流程。
虽然已经通过示例对本发明的一些特定实施例进行了详细说明,但是本领域的技术人员应该理解,以上示例仅是为了进行说明,而不是为了限制本发明的范围。本领域的技术人员还应理解,可以对实施例进行多种修改而不脱离本发明的范围和精神。本发明开的范围由所附权利要求来限定。