首页  ·  知识 ·  软件项目
工作流协同过程建模
储静辉 宋斌恒  本站原创  综合  编辑:dezai  图片来源:网络
摘要:首先分析了生产流程和管理流程的特点,给出了协同过程模型的形式化定义,最后用一个例子说明该方法与现有过程建模方法的差异。   关键词:工作流
摘要:首先分析了生产流程和管理流程的特点,给出了协同过程模型的形式化定义,最后用一个例子说明该方法与现有过程建模方法的差异。
  关键词:工作流; 协同; 过程建模; 异常; 柔性
  中图分类号:TP3016文献标志码:A
  文章编号:10013695(2007)04012005
  
  0引言
  
  工作流系统软件起源于企业办公自动化的应用需求中,它将企业中的各种文档按照预先定义好的路由路径和路由条件进行路由。当文档路由到某个节点并满足预先规定的路由条件时,它将该节点对应的文档处理任务指派给企业中各种有能力完成该任务的资源来处理(资源包括人、机器、软件等),并根据任务处理结果和路由方向判定条件将被该节点处理完的文档路由到下一个节点继续处理,直到最后路由到路径的终点完成文档处理流程[1~3]。但是现实生活中的流程没有那么简单。现实中的流程总是存在着两种流程,即生产流程(主流程)和管理流程(辅流程),这两种流程存在显著差异,并且相互协作。
  主流程直接面向顾客生产产品或提供服务,可以为企业直接带来利润。主流程上的业务活动(工作单元、任务、工种)之间的执行先后关系一般都是偏序关系,因为如果不是偏序关系,将意味着主流程上会有任务重复执行,这会增加主流程上的生产成本。例如,假设一个企业目前有N个不同的工种,根据市场需求需要生产一种新产品或提供一种新服务X。那么在不采纳效率更高、成本更低的新工种的前提下,最经济地获得一个产品或一次服务X的生产流程设计方法是:在N个工种中选定最少的工种并且每个选定的工种只执行一次,也就是要设法使得这些选定工种之间的执行先后关系是偏序的。
  此外,在一个生产成本最低的主流程上的业务活动之间,执行先后关系也不会存在条件分支。也就是说,不会存在一个业务活动完成后,执行业务活动A或执行业务活动B的情况。因为如果把主流程看成是一个人要达到的某个目标的话,那么条件分支就意味着,达到一个相同的目标会有多种途径。在现实中,人们总会选择一条最有利的途径来达到目标,并且在实践过程中不断用新的更加有利的目标实现途径来取代已有的目标实现途径。因此,在生产成本最低的主流程上,业务活动之间的执行先后关系也不会出现条件分支的情况。
  任何一个生产成本最低的主流程设计都是一种非常理想化的设计,主流程上既没有“Or”(条件分支)也没有“Loop”(业务活动之间的执行关系是偏序的)。但是现实总不会那么轻易如人所愿,主流程上任何一个业务活动的执行都可能会产生各种预想不到的意外。然而主流程上的任务执行者一般是企业的基层员工,他们对于特定工种的专业技能很强,并且在没有被上级授权的情况下不容许违反企业制定的流程或者规章制度。当主流程上出现无法处理的意外后,基层员工应该立刻将这些意外汇报给上级管理人员来处理,而上级管理人员所处的流程就是辅流程。
  辅流程并不为企业直接带来利润,但却是企业必不可少的一部分。辅流程专门负责处理主流程中出现的各种意外情况,并且要根据各种制约因素随机应变地制定相应的处理策略。辅流程上的业务活动执行者一般是企业的中层和基层管理人员。他们有权调度所管辖的企业资源,以处理主流程上出现的意外;同时还要分析主流程的不合理之处,并不断优化调整主流程,使得主流程与时俱进。
  由此可见,主流程与辅流程是有显著差异并且相互协作的。但是现有的主流程建模方法,如EPC和WFNet等,都无法表达出这两种流程的差异和协作关系。本文研究的目标是设计一种新型的过程建模方法,把现实生活中的主、辅流程之间的动态协作关系模拟出来。
  
  1模型基本术语
  
  (1)案例(Case)。它是指工作流系统要处理的业务对象。例如,一个客户订单、为某个顾客提供的一次理发服务、一个公文文档、一条上级传达的指令等。案例驱动了工作流系统运作;工作流系统的一切行为都是以案例为中心。
  (2)约束(Constraint)。它是一阶谓词公式,并且该一阶谓词公式中的每个谓词都是以案例为论域的一元谓词。
  (3)主流程(Main Process)。它是一系列工作单元的集合及其工作单元执行先后关系的总称。由它负责当案例使得每个工作单元上绑定的约束为真的情况下系统该如何处理案例。
  (4)辅流程(Ministrant Process)。它也是一系列工作单元的集合及其工作单元执行先后关系的总称,但是它负责当出现案例使得主流程的工作单元上绑定的约束为假的情况时,系统该如何处理案例。
  (5)任务(Task)。它是主流程和辅流程上的工作单元。根据任务是否可以再分解,可以划分为原子任务(Atomic Task)和复合任务(Composite Task)。原子任务的完成不依赖于其他任务是否完成,仅仅取决于工作流系统中是否存在有能力完成该任务的资源,并且系统指定的资源是否可以在规定的时间内完成该任务。复合任务的完成依赖于其他原子任务或复合任务是否完成。根据复合任务所处的流程,复合任务可以划分为主流程上的复合任务(Composite Task in Main Process,主任务)和辅流程上的复合任务(Composite Task in Ministrant Process,辅任务)。(6)主、辅流程上的原子任务所绑定的约束可以划分为三类,即前置约束(Prepositional Constraint)、授权约束(Empower Constraint)和后置约束(Postpositional Constraint)。前置约束用于判定与之绑定的原子任务是否可以被执行;授权约束用于判定与之绑定的原子任务应该指派给系统中的哪个资源来执行;后置约束用于判定与之绑定的原子任务是否已经被指定的资源完成。
  (7)原子任务的状态可以划分为初始态(Initial)、触发态(Triggered)、授权态(Empowered)和完成态(Completed)。一个原子任务处于初始态,表明该任务的所有前置任务都已经完成;一个原子任务处于触发态,表明该任务绑定的所有前置约束均为真;一个原子任务处于授权态,表明该任务绑定的所有授权约束均为真;一个原子任务处于完成态,表明该任务绑定的所有后置约束均为真。
  (8)复合任务的状态可以划分为初始态和完成态。一个复合任务处于初始态,表明该复合任务的所有前置任务都已经完成;一个复合任务处于完成态,表明该复合任务的所有子任务都处于完成态。
  (9)异常(Exception)。它是指同时满足如下条件的案例:①该案例使得主流程上的一个原子任务绑定的一个约束为假;②在辅流程上存在一个可以继续处理该案例的辅任务。
  (10)意外(Accident)。它是指满足如下条件的案例:①该案例使得主流程上的一个原子任务绑定的一个约束为假,并且在辅流程上不存在可以继续处理该案例的辅任务;②该案例使得辅流程上一个原子任务绑定的一个约束为假。
  (11)案例的状态可以划分为正常态(Normal)、异常态(Exceptional)、意外态(Accidental)和完成态。一个案例处于正常态,表明该案例当前至少使一个主任务处于初始态,并且该案例不满足异常或者意外规定的条件;一个案例处于异常态,表明该案例满足异常规定的条件;一个案例处于意外态,表明该案例满足意外规定的条件;一个案例处于完成态,表明该案例已经初始化的所有主任务都处于完成态。
  
本文原文
  
  2协同过程模型的形式化定义
  
  定义1协同过程模型(Coordinated Process Model,CPM)是一个十三元组。
  CPM=。其中:
  (1)Scase表示系统接收到的所有案例的非空有穷集合,O∈Scase,O叫做案例。
  (2)T表示原子任务的非空有穷集合,τ∈T,τ叫做原子任务。
  (3)Tα表示主流程上复合任务的非空有穷集合,τα∈Tα,τα叫做主流程上的复合任务,简称主任务。
  (4)Tβ表示辅流程上复合任务的非空有穷集合,τβ∈Tβ,τβ叫做辅流程上的复合任务,简称辅任务。
  T、Tα、Tβ两两相关为空集。τx∈T∪Tα∪Tβ,τx叫做任务,τy∈Tα∪Tβ,τy叫做复合任务。
  (51)Rαcomposite表示主流程上任务之间的复合关系。
  ①RαcompositeTa×2Sα×2Sα×Sα。其中Sα=T∪Tα。
  ②τα∈Tα<τα,V,E>∈Rαcomposite[(ταV)∧(V≠)∧(是一个有向无环图)]。
  ③<τα1,V1,E1>,<τα2,V2,E2>∈Rαcomposite[(τα1=τα2)→(V1=V2)∧(E1=E2)]。
  <τα,V,E>∈Rαcompositeτx∈V<τx1,τx2>∈E,称为τx是τα的子任务;V是τα的所有子任务集合;τα是τx的父任务;在τα上,τx1是τx2的前置任务;在τα上,τx2是τx1的后置任务;是τα的子任务复合关系图。
  (52)Rαdependency表示主流程上复合任务之间的依赖关系。
  ①RαdependencyTα×Tα。
  ②<τα1,V,E>∈Rαcompositeτα2∈(V∩Tα)(<τα1,τα2>∈Rαdependency)。
  ③是一个有向无环图。由此定义保证系统中所有主任务之间的执行先后关系不会出现循环依赖。
  <τα1,τα2>∈Rαdependency,称为τα2是τα1的子主任务。
  (53)Aτα|τ表示主流程上复合任务与原子任务之间的依赖关系。
  ①Aτα|τTα×T。
  ②<τα,V,E>∈Rαcompositeτ∈(V∩T)(<τα,τ>∈Aτα|τ)。
  <τα,τ>∈Aτα|τ,称为τ是τα的子原子任务。
(61)Rβcomposite表示辅流程上任务之间的复合关系。
  ①RβcompositeTβ×2Sβ×2Sβ×Sβ。其中Sβ=T∪Tβ。
  ②τβ∈Tβ<τβ,V,E>∈Rβcomposite[(τβV)∧(V≠)∧(是一个有向无环图)]。
  ③<τβ1,V1,E1>,<τβ2,V2,E2>∈Rβcomposite[(τβ1=τβ2)→(V1=V2)∧(E1=E2)]。
  <τβ,V,E>∈Rβcompositeτx∈V<τx1,τx2>∈E,称为τx是τβ的子任务;V是τβ的所有子任务集合;τβ是τx的父任务;在τβ上,τx1是τx2的前置任务;在τβ上,τx2是τx1的后置任务;是τβ的子任务复合关系图。
  (62)Rβdependency表示辅流程上复合任务之间的依赖关系。
  ①RβdependencyTβ×Tβ。
  ②<τβ1,V,E>∈Rβcompositeτβ2∈(V∩Tβ)(<τβ1,τβ2>∈Rβdependency)。
  ③是一个有向无环图。由此定义,保证系统中所有辅任务之间的执行先后关系不会出现循环依赖。
  <τβ1,τβ2>∈Rβdependency,称为τβ2是τβ1的子辅任务。
  (63)Aτβ|τ表示辅流程上复合任务与原子任务之间的依赖关系。①Aτβ|τTβ×T。②<τβ,V,E>∈Rβcompositeτ∈(V∩T)(<τβ,τ>∈Aτβ|τ)。
  <τβ,τ>∈Aτβ|τ,称为τ是τβ的子原子任务。
  (7)λpre表示前置约束的非空有穷集合,cpre∈λpre,cpre叫做前置约束。
  (8)λemp表示授权约束的非空有穷集合,cemp∈λemp,cemp叫做授权约束。
  (9)λpost表示后置约束的非空有穷集合,cpost∈λpost,cpost叫做后置约束。
  λpre、λemp、λpost两两相交为空集,c∈λpre∪λemp∪λpost,c叫做约束。约束是一阶谓词公式,并且该一阶谓词公式中的每个谓词都是以Scase为论域的一元谓词。
  (101)δτ2c表示复合任务上子原子任务的约束集映射,δτ2c∶Aτα|τ∪Aτβ|τ→2(λpre∪λemp∪λpost)。
  (102)Aτα|τ|c表示主任务上子原子任务与约束的绑定关系。①Aτα|τ|cAτα|τ×(λpre∪λemp∪λpost)。②<τα,τ>∈Aτα|τc∈δτ2c(τα,τ)(<τα,τ,c>∈Aτα|τ|c)。
  <τα,τ,c>∈Aτα|τ|c,<τα,τ,c>叫做主任务τα的子原子任务τ绑定一个约束c。
  (11)δα2β表示主流程向辅流程变迁的变迁函数,δα2β∶Aτα|τ|c→Tβ∪{ε}。其中ε表示空元素并且εTβ。
  (12)δβ2α表示辅流程向主流程变迁的变迁函数,δβ2α∶δα2β(Aτα|τ|c)→2(T∪Tα):①<τα,τ,c>∈Aτα|τ|c<τα,V,E>∈Rαcomposite,令t(E)是E的传递闭包,(δβ2α(δα2β(τα,τ,c))V)∧(τx∈δβ2α(δα2β(τα,τ,c))τy∈δβ2α(δα2β(τα,τ,c))(<τy,τx>∈t(E)))∧(τx∈(V-δβ2α(δα2β(τα,τ,c)))
  τy∈δβ2α(δα2β(τα,τ,c))((<τx,τy>∈t(E))∨(<τy,τx>∈t(E))))。②δβ2α(ε)=。
  (13)δo2τα表示案例的主任务集映射,δo2τα∶Scase→2Tα,o∈Scase,δo2τα≠。o∈Scase,δo2τα(o)表示案例o请求系统完成的所有主任务集合。
  定义2o∈Scase<τα,τ,c>∈Aτα|τ|c,<τα,τ,c,o>是系统中一个关于案例o的异常,当且仅当c(o)∧(δα2β(τα,τ,c)≠ε)。
  定义3o∈Scase<τα,τ,c>∈Aτα|τ|c,<τα,τ,c,o>是系统中一个关于案例o的意外,当且仅当c(o)∧δα2β(τα,τ,c)=ε,或者(<τα,τ,c,o>是一个异常)∧(<δα2β(τα,τ,c),τ′>∈Aτβ|τc′∈δτ2c(δα2β(τα,τ,c),τ′)(c′(o)))。
  规则1o∈Scase<τx,V,E>∈Rαcomposite∪Rβcomposite。如果案例o已经使得复合任务τx处于初始态,那么案例o将使得τx的所有没有前置任务的子任务都处于初始状态(任务处于初始态的传递规则1)。
  
  规则2o∈Scase<τx,V,E>∈Rαcomposite∪Rβcompositeτ′x∈V。如果案例o已经使得复合任务τx处于初始态并且τ′x在τx上的所有前置任务都为完成态,那么案例o将使得τ′x处于初始态(任务处于初始态的传递规则2)。
 规则3o∈Scase<τx,τ>∈Aτα|τ∪Aτβ|τ。如果案例o已经使得复合任务τx的子原子任务τ处于初始态并且(λpre∩δτ2c(τx,τ)=或者cpre∈λpre∩δτ2c(τx,τ))(cpre(o)),那么案例o将使得该原子任务处于触发态(原子任务从初始态到触发态的变迁规则)。
  规则4o∈Scase<τx,τ>∈Aτα|τ∪Aτβ|τ。如果案例o已经使得复合任务τx的子原子任务τ处于触发态并且(λemp∩δτ2c(τx,τ)=或者cemp∈λemp∩δτ2c(τx,τ)(cemp(o))),那么案例o将使得该原子任务处于授权态(原子任务从触发态到授权态的变迁规则)。
  规则5o∈Scase<τx,τ>∈Aτα|τ∪Aτβ|τ。如果案例o已经使得复合任务τx的子原子任务τ处于授权态并且(λpost∩δτ2c(τx,τ)=或者cpost∈λpost∩δτ2c(τx,τ)(cpost(o))),那么案例o将使得该原子任务处于完成态(原子任务从授权态到完成态的变迁规则)。
  定理1τx∈Tα∪Tβ((<τx,τy>∈Rαdependency∪Rβdependency)→(复合任务τx的所有子任务都是原子任务))(由定义1中的子定义(51)、(52)、(61)、(62)易证)。
  规则6o∈Scase<τx,V,E>∈Rαcomposite∪Rβcomposite。如果案例o已经使得复合任务τx处于初始态并且τx的所有子任务都处于完成态,那么案例o将使得τx处于完成态(复合任务完成态的传递规则)。
  定义41o∈Scase,案例o处于正常态的充要条件是,系统中没有关于案例o的异常或意外,并且在δo2τα(o)中至少有一个主任务该案例没有使其处于完成态。
  定义42o∈Scase,案例o处于异常态的充要条件是,系统中存在关于案例o的异常。
  定义43o∈Scase,案例o处于意外态的充要条件是,系统中存在关于案例o的意外。
  定义44o∈Scase,案例o处于完成态的充要条件是,系统中没有关于案例o的异常或者意外,并且案例o已经使δo2τα(o)中的每个主任务都处于完成态。
  基于协同过程模型的工作流引擎算法案例o相关过程信息的基本数据结构如下:
  (1)state(o)是案例o的当前状态,state(o)∈{ε,正常态,异常态,意外态,完成态}。
  o∈Scase,如果state(o)=ε,表明该案例是工作流系统已经接收但尚未开始处理的案例。
  (2)Sτx1|τx2|q(o)是案例o已经触发的所有复合任务的状态表。①Sτx1|τx2|q(o)(Tα∪Tβ∪{ε})×(Tα∪Tβ)×{初始态,完成态}。②<τx1,τx2,q>∈Sτx1|τx2|q(o),如果τx1=ε,那么复合任务τx2没有父任务并且τx1的当前状态为q;如果τx1≠ε,那么τx1是τx2的父任务并且τx1的当前状态为q。
  (3)Sτx1|τx2|τ|q(o)是案例o已经触发的所有原子任务的状态表。①Sτx1|τx2|τ|q(o)(Tα∪Tβ∪{ε})×(Tα∪Tβ)×T×{初始态,触发态,授权态,完成态}。②<τx1,τx2,τ,q>∈Sτx1|τx2|τ|q(o),如果τx1=ε,那么复合任务τx2没有父任务并且τ是τx2的子原子任务;如果τx1≠ε,那么τx1是τx2的父任务并且τx2是τ的父任务。
  (4)<τα,τ,c,o>∈Aτα|τ|c×Scase是案例o处于异常态时相应的异常或者是处于意外态时相应的意外。
  输入:案例o∈Scase
  begin
  while(true) {
  if (State(o)等于ε){Sτx1|τx2|q(o)=Sτx1|τx2|τ|q(o):=;state(o):=正常态;将δo2τα(o)中的所有主任务设置为初始态并保存到Sτx1|τx2|q(o)中;}
  /*案例正在被主流程处理*/
  while (state(o)等于正常态){
  对主流程上的任务使用一遍规则1~6,并将相应的任务状态信息保存在Sτx1|τx2|q(o)或者Sτx1|τx2|τ|q(o)中;
  /*案例从正常态向异常态变迁*/
  如果系统中存在关于案例o的异常<τα,τ,c,o>,那么{state(o):=异常态;清除Sτx1|τx2|q(o)中的所有辅助任务相关状态信息;将辅任务δα2β(τα,τ,c)设置为初始态并保存到Sτx1|τx2|q(o)中;break;}
  /*案例从正常态向意外态变迁*/
  如果系统中存在关于案例o的意外,那么{state(o):=意外态,return;}
  /*案例从正常态向完成态变迁*/
  如果δo2τα(o)中的每个主任务都在Sτx1|τx2|q(o)中处于完成态,那么{state(o):=完成态;return;}
  }
  /*案例正在被辅流程处理*/
  while(state(o)等于异常态)}
  对辅流程上的任务使用一遍规则1~6,并将相应的任务状态信息保存在Sτx1|τx2|q(o)和Sτx1|τx2|τ|q(o)中;
/*案例从异常态向意外态变迁*/
  如果系统中存在关于案例o的意外,那么{state(o):=意外态;return;}
  /*案例从异常态向正常态变迁*/
  如果辅任务δα2β(τα,τ,c)在Sτx1|τx2|q(o)中处于完成态,那么{state(o):=正常态;
  for each τx∈δβ2α(δα2β(τα,τ,c)){
  令τα的子任务复合关系图的顶点集和边集分别为V和E,t(E)是E的传递闭包;
  for each τy∈(V-δβ2α(δα2β(τα,τ,c))){
  如果<τy,τx>∈t(E),那么将τy的状态设置为完成态,并保存到Sτx1|τx2|τ|q(o)或者Sτx1|τx2|q(o)中;如果<τx,τy>∈t(E),那么将τy的状态信息从Sτx1|τx2|τ|q(o)或者Sτx1|τx2|q(o)中删除;}}break;}
  }}end;
  
  3过程建模例子
  
  在本章中引入的过程建模实例是一个企业的订单处理流程。首先用EPC和WFNet这两种目前主流的过程建模方法对该流程进行建模;然后用CPM方法对该流程进行建模;最后比较了三种建模方法,并讨论了基于CPM方法的过程模型如何动态扩展从而体现柔性。
  
  3.1基于EPC和WFNet的过程建模
  EPC(Eventdriven Process Chain)是目前已经被数千家企业广泛使用的过程建模方法,并且是高端ERP产品供应商SAP公司的核心技术SAP/R3所采纳的过程建模方法[1,2,4]。图1给出了基于EPC的订单处理流程建模。WFNet(Workflow Net)是Aalst先生基于传统Petri网提出的一种过程建模方法。这种建模方法继承了Petri网的良好的形式化基础,并且克服了直接用Petri网进行过程建模时存在的一些弊端,因此备受学术界的推宠[1,3,5]。图2给出了基于WFNet的订单处理流程建模。
  
  
  3.2基于CPM的过程建模
  (1)模型初始化定义
  谓词定义:p0(o)中案例o是订单;p1(o)中订单o是有效订单;p2(o)中订单o的所有订购货物都有库存;p3(o)中订单o的货款已经付清。
  案例向系统发出的请求定义:
  o∈Scase(p0(o)),δo2τα(o)={订单处理}Tα
  (2)主流程上复合任务设计(图3、表1、2)
  表1主任务的子原子任务的约束绑定关系定义
  主任务原子任务前置约束集授权约束集后置约束集
  订单处理验单p0(o)p1(o)
  订单处理取货p2(o)
  订单处理发货
  订单处理收款p3(o)
  表2主/辅流程之间的变迁关系定义
  主任务原子任务约束辅任务变迁回子任务集
  订单处理取货p2(o)缺货自主生产处理取货
  订单处理收款p3(o)货款未付清处理收款
  (3)辅流程上复合任务设计(图4、5,表3)
  表3辅任务的子原子任务的约束绑定关系定义
  辅任务原子任务前置约束集授权约束集后置约束集
  缺货自主生产处理供料
  缺货自主生产处理排产
  缺货自主生产处理生产p2(o)
  货款未付清处理讨债p3(o)
  
  3.3三种建模方法比较
  (1)在EPC和WFNet方法中,从取货任务之后,流程出现了一个条件分支;从收款任务之后,流程出现了一个循环。从此例中可以看出,条件分支和循环的本质都是一种异常。前者是对订购货物库存不足情况的一种解决方法;后者是对于货款未收齐情况的一种解决方法。
  在CPM方法中,订单处理流程被分解为三个复合任务,一个是主任务“订单处理”;另外两个是辅任务“缺货生产处理”和“货款未付清处理”,分别用于处理主任务中对应的两种异常。这三个复合任务的设计是相互独立的,并且每一个复合任务的设计都非常简单:任务之间执行先后关系是偏序的;一个复合任务是否完成仅仅取决于是不是该复合任务的所有子任务都已经完成。该定义有助于案例相关过程信息的事务性处理设计。对于原子任务绑定的约束而言,仅仅考虑在执行过程中约束为真的情况而无须考虑约束为假的情况,从而将正常处理情况和非正常的处理情况隔离开。
  (2)从理论上来说,对于给定案例,流程上任何一个任务的执行都可能失败或者任何一个任务绑定的约束都可能会为假。在CPM方法中,充分考虑到这种特点,形式化定义了异常和意外两个概念,并通过主流程和辅流程之间的变迁函数的定义,将所有约束为假的情况和应该由哪个辅助任务处理定义出来,从理论上保证了过程建模在逻辑上是完备的,不会遗漏任何一个约束为假的情况该如何处理。
  WFNet尽管也是有着严格形式化定义的过程建模方法,但是它并没有对给定案例的约束为假的情况进行考虑。例如,当一个Token路由到一个Place中,如果Token满足Place中定义的条件,那么该Token不继续被路由;如果Token不满足Place中定义的所有条件,那么Token就会停滞在该Place中。这种Token停滞在Place中的情况,在CPM中给出了相应的意外定义,并且在增加了辅任务后意外就可以变为异常从而使案例可以继续被处理。在WFNet中并没有给出该定义,更没有给出在这种情况下流程该如何后置处理。
本文作者:储静辉 宋斌恒 来源:本站原创
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读