起因
需求的来源是这样式儿的,我们公司某个部门,原来由副总分管,本月做了组织架构调整,副总和部门经理之间增加了总监,导致不得不大量的修改涉及到的路径,给路径创建一个新版本,增加总监节点,再修各节点的表单。整个调整周期会很长,甚至有调漏掉了的路径。而且还发生了在我发布新版本之前,已经有同事已经发起了流程。
归纳一下其实就是路径的版本切换不及时,有按旧版本发起的流程需要调整成新版本。局限是新版本相比旧版本变化不大,仅是新增了节点。这种问题可以按下面的方法处理。
为了更新这些本该用新版本发起的流程,我写了一个存储过程,输入参数是要更新的requestid,输出参数状态标识@returnFlg、状态文本@returnMsg。
经过
数据结构并不复杂,最大的困难在找节点之间的关系,在泛微其自身的数据结构里是没有记录不同版本的节点之间的关系的。在这存储过程里我先后 了节点的名称和节点的位置作为线索去做判定的,如果两个版本中存在同名的节点,认为是同一个节点。如果根据节点名称没有找到相同节点的话,那就看两个版本中存在不存在位置相近的节点,如果存在,认为是同一个节点。
CREATE procedure workflow_RequestVersion_Update as
@nodeidOld int, -- 节点id(当前的) -- 0.2 设置坐标位置容差,虽然不知道是按节点的什么位置记录的坐标位置,但能肯定的是坐标的单位是像素。 IF OBJECT_ID('tempdb..#workflow_currentoperator_v') IS NOT NULL -- 0,3 创建临时表,存储当前流程实例的节点信息 -- 1、 用传入的参数@requestid找到对应的workflowid等表头里的信息。 -- 2、 用获得的@workflowid找对应的workflowname和activeVersionID, -- 找每个节点的新的nodeid,给它们都先存到临时表里 declare workflowidold_Cursor CURSOR for open workflowidold_Cursor while @@FETCH_STATUS = 0 -- 3、 有了新版本的ID,找对应的节点的ID select @nodename = nodename -- 节点名称 -- 3.1.1 找“名称相同”的节点 select @nodeidnew = id -- 3.1.2 如果按名称没有找到对应的节点, -- 3.1.2 如果没有“名称相同”的节点,再去根据位置找节点。 -- 3.1.4 根据@currentnodeidnew,判断是报异常并退出,还是更新临时表。 -- 退出整个存储过程 end -- 3.1.5 比对表头里的当前节点ID、操作节点ID,是不是和现在正处理的节点ID相同,如果是,取新ID if @lastnodeIdOld = @nodeidOld end FETCH NEXT FROM workflowidold_Cursor into @currentoperatorid, @nodeidOld -- 4. 关闭并释放游标 -- 5、更新表头workflow_requestbase,更新wrokflowid、lastnodeid、currentnodeid update workflow_requestbase update a select @returnFlg = 'S', COMMIT tran; END CATCH; GO |
结果
写到这里基本可以满足我自己的要求,并且测试通过了。不得不承认它有一定的局限性,如果工作流的活动版本比当前流程对应的工作流版本少节点的话,缺少的那个节点就更新不到了。
写到这里呢,这次想分享的知识点就全部分享结束了。用那句老掉牙的话收个尾吧,希望这篇文章对已经看到这儿的小伙伴们有所帮助。还是那句话,喜欢的小伙伴们请关注、点赞、评论。大家的鼓励是我持续创作的动力。感谢!