CREATE procedure workflow_RequestVersion_Update @requestid int, @returnFlg nvarchar(1) output, @returnMsg nvarchar(1000) output as -- 0.1 定义需要用取的变量 declare @workflowidOld int, -- 工作流id(当前的) @workflowidNew int, -- 工作流id(新的) @workflowname varchar(1000), -- 工作流名称 @currentnodeidOld int, -- 当前节点id(当前的) @currentnodeidNew int, -- 当前节点id(新的) @lastnodeidOld int, -- @lastnodeidNew int,
@nodeidOld int, -- 节点id(当前的) @nodeidNew int, -- 节点id(新的) @nodename varchar(1000), -- 当前节点名称(现在的) @drawxpos int, -- 节点图形显示横坐标 @drawypos int, -- 节点图形显示纵坐标 @currentoperatorid int, -- 工作流请求节点操作人信息ID @tolerancex int, -- 横坐标容差 @tolerancey int -- 纵坐标容差 -- 0.2 设置坐标位置容差,虽然不知道是按节点的什么位置记录的坐标位置,但能肯定的是坐标的单位是像素。 select @tolerancex = 5, @tolerancey = 5 IF OBJECT_ID('tempdb..#workflow_currentoperator_v') IS NOT NULL DROP TABLE #workflow_currentoperator_v; -- 0,3 创建临时表,存储当前流程实例的节点信息 create table #workflow_currentoperator_v ( id int, requestid int, nodeidold int, nodeidnew int, workflowidold int, workflowidnew int ) -- 1、 用传入的参数@requestid找到对应的workflowid等表头里的信息。 select @workflowidOld = workflowid, -- 工作流id(当前的) @currentnodeidOld = currentnodeid, -- 当前节点id(当前的) @lastnodeidOld = lastnodeid -- 最后操作节点id(当前的) from workflow_requestbase -- 工作流请求基本信息表 where requestid = @requestid -- 2、 用获得的@workflowid找对应的workflowname和activeVersionID, -- 测试过,发现一旦修改了路径名称,所有版本会同时修改,具备用workflowname作为主键的条件。 select @workflowname = workflowname, -- 工作流名称 @workflowidNew = activeVersionID -- 当前流程所属活动版本ID, 这里记录的是活动的那个版本的workflowbase.id from workflow_base -- 工作流基本信息表 where id = @workflowidOld -- 找每个节点的新的nodeid,给它们都先存到临时表里 insert into #workflow_currentoperator_v (id, requestid, nodeidold, workflowidold ) select id, requestid, nodeid, workflowid from workflow_currentoperator where requestid = @requestid declare workflowidold_Cursor CURSOR for SELECT id, nodeidold FROM #workflow_currentoperator_v open workflowidold_Cursor FETCH NEXT FROM workflowidold_Cursor into @currentoperatorid, @nodeidOld while @@FETCH_STATUS = 0 begin -- 3、 有了新版本的ID,找对应的节点的ID -- “是同一个节点”的判断原则:要么名称相同,要么位置相同。 select @nodename = nodename -- 节点名称 from workflow_nodebase where id = @nodeidOld --当前节点id(现在的) -- 3.1.1 找“名称相同”的节点 select @nodeidnew = id from workflow_nodebase where id in ( select nodeid from workflow_nodehtmllayout where workflowid = @workflowidNew) and nodename = @nodename -- 3.1.2 如果按名称没有找到对应的节点, if isnull(@nodeidNew ,0) = 0 begin -- 这里应该是个存储过程,因为坐标可能存在误差。 -- 坐标是以像素为单位记的。 -- 取当前节点的坐标 select @drawxpos = drawxpos, @drawypos = drawypos from workflow_nodebase where id = @nodeidOld --当前节点id(现在的) -- 3.1.2 如果没有“名称相同”的节点,再去根据位置找节点。 select @nodeidNew = id from workflow_nodebase where id in ( select nodeid from workflow_nodehtmllayout where workflowid = @workflowidNew) and drawxpos between @drawxpos - @tolerancex and @drawxpos + @tolerancex and drawypos between @drawypos - @tolerancey and @drawypos + @tolerancey end -- 3.1.4 根据@currentnodeidnew,判断是报异常并退出,还是更新临时表。 if isnull(@nodeidNew ,0) = 0 begin -- 没找到的话,报错退出 select @returnFlg = 'E', @returnMsg = '更新失败!流程ID:' + CAST(@requestid AS NVARCHAR(10)) + ',节点:' + @nodename + ',没找到对应节点。' -- 退出整个存储过程 CLOSE workflowidold_Cursor DEALLOCATE workflowidold_Cursor IF OBJECT_ID('tempdb..#workflow_currentoperator_v') IS NOT NULL begin DROP TABLE #workflow_currentoperator_v end RETURN end else begin -- 找到的话,更新临时表 update #workflow_currentoperator_v set nodeidnew = @nodeidNew, workflowidnew = @workflowidNew where id = @currentoperatorid -- 3.1.5 比对表头里的当前节点ID、操作节点ID,是不是和现在正处理的节点ID相同,如果是,取新ID if @currentnodeidOld = @nodeidOld begin select @currentnodeidNew = @nodeidNew end if @lastnodeIdOld = @nodeidOld begin select @lastnodeIdNew = @nodeidNew end end FETCH NEXT FROM workflowidold_Cursor into @currentoperatorid, @nodeidOld end -- 4. 关闭并释放游标 CLOSE workflowidold_Cursor DEALLOCATE workflowidold_Cursor -- 5、更新表头workflow_requestbase,更新wrokflowid、lastnodeid、currentnodeid begin tran BEGIN TRY update workflow_requestbase set workflowid = @workflowidNew, lastnodeid = isnull(@lastnodeidNew, lastnodeid), currentnodeid = isnull(@currentnodeidNew, currentnodeid) where requestid = @requestid update a set a.nodeid = b.nodeidNew, a.workflowid = b.workflowidNew from workflow_currentoperator a inner join #workflow_currentoperator_v b on a.id = b.id where a.requestid = @requestid select @returnFlg = 'S', @returnMsg = '更新成功!流程ID:' + CAST(@requestid AS NVARCHAR(10)) + ',更新完毕。' COMMIT tran; END TRY BEGIN CATCH -- 3. 如果发生任何错误,回滚事务 ROLLBACK TRANSACTION; -- 可以在此处记录错误信息 select @returnFlg = 'E', @returnMsg = '更新失败!流程ID:' + CAST(@requestid AS NVARCHAR(10)) + ',更新失败。' END CATCH; GO |