复制K2流程图实现记录

  开发K2流程中,很多时候流程都是相似的,所以希望通过复制一个现有流程图再进行修改,达到快速开发提高工作效率,但通过右键对一个现有的流程图进行复制,复制后流程图并不是一个全新的流程图,还会保留部分原流程图的相关信息。所以查阅了相关的资料,也有一些人也提出相同的问题,但并没有找到相应的解决方案。还有一种是通过K2 API类库使用代码的方式生成kprx文件,但这个并不是适合我们的需求,因为我们还对默认生成代码进行修改,所以才有下面的方案。

流程图分析

  先通过查看(*.kprx)文件,使用记事本查看文件内容,了解K2流程图使用XML格式进行数据存储。接下来我们就可以创建两个新流程图,然后使用对比工具进行比对,查找差异。通过对比后发现只有GUID还有流程名称会有变化。

K2 GUID格式定义

  • GUID小写,格式”D”。

    98873e50-a321-439b-8c40-991f82d90005

  • GUID小写,格式”N”,也可能是格式”D”的变种。

    98873e50a321439b8c40991f82d90005

  • GUID小写,格式”B”。

    {b7b8c232-de89-446f-99e1-23d203cda63a}

  • GUID大写,格式”D”,不需要替换。

    FDA04D27-504A-4D24-A5BC-854E8CF395E0

GUID格式参考

说明符返回值的格式
N

32 位数字:

00000000000000000000000000000000

D

由连字符分隔的 32 位数字:

00000000-0000-0000-0000-000000000000

B

由连字符,括在大括号分隔的 32 位数字:

{00000000-0000-0000-0000-000000000000}

P

由括在括号中的连字符分隔的 32 位数字:

(00000000-0000-0000-0000-000000000000)

X

四个十六进制值括在大括号,其中第四个值是也括在大括号的八个十六进制值的子集:

{0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}

K2 GUID作用补充

  虽然说K2流程图是以XML格式进行存储,但通过K2 设计器或者进行编译项目操作,K2会对流程图进行转换生成代码项目。

  • 所以通过一个现有流程进行复制,会提示以下类似问题。

  

  • 生成代码的路径
  C:\Users\用户名\AppData\Local\Temp\ExtenderProjects
  • 各个流程图以CSWinWF-GUID为项目名称。
  
  • 同样的,节点相关代码也是含有GUID的。
  

实现方案

  通过上述分析的结果,我们就可以用正则表达式查找出所有小写的GUID,然后过滤掉重复(包括格式"D"的变种),之后使用替换方法,对旧的GUID生成一个新的GUID。

示例代码:

            var processes = Directory.GetFiles(OutputFolderPath, "*.kprx", SearchOption.AllDirectories);
            foreach (var fileName in processes)
            {
                var file = new FileInfo(fileName);
                var fileContent = File.ReadAllText(fileName, Encoding.UTF8);
                //获取K2流程图所有小写字母GUID
                var pattern = "[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}|[a-f0-9]{8}([a-f0-9]{4}){3}[a-f0-9]{12}";
                Regex regex = new Regex(pattern);
                MatchCollection matchCollection = regex.Matches(fileContent);
                var guidList = new List<Guid>();
                foreach (Match match in matchCollection)
                {
                    var guid = new Guid(match.Value);
                    if (!guidList.Contains(guid))
                    {
                        guidList.Add(guid);
                    }
                }
                //将所有GUID替换为新的GUID
                foreach (var guid in guidList)
                {
                    if (guid != Guid.Empty)
                    {
                        var newGuid = Guid.NewGuid();
                        fileContent = fileContent.Replace(guid.ToString("D"), newGuid.ToString("D"));
                        fileContent = fileContent.Replace(guid.ToString("N"), newGuid.ToString("N"));
                    }
                }
                //写入文件
                File.WriteAllText(fileName, fileContent, Encoding.UTF8);
            }

总结

  虽然最终实现复制流程图的想法,对K2流程图的分析也没有错,但在这个过程中碰到的坑还不少,尝试了无数种可能,生成了无数次,生成出来的流程图打开都报错了,将生成出来的流程图对比原来的流程图,都没有发现任何问题。

想过是不是GUID正则表达式有问题?
想过是不是GUID替换有问题?
想过是不是有些GUID是固定的?

  纠结了无数天,比较两个流程图眼睛都看花了,还是没有找到根源。最后索性新建一个只有一个K2节点流程图,减少生成的内容,通过手工比对依次一个个替换,重新加载流程图,直到替换到出现错误。最终发现一个相同GUID使用了有两种格式"D"和"N",差点没吐血。总之,有成功的喜悦,也有失败的启示。

参考资料

https://msdn.microsoft.com/zh-cn/library/97af8hh4.aspx
http://community.k2.com/t5/K2-blackpearl/copy-and-rename-a-process/td-p/24383
https://www.k2.com/onlinehelp/k2blackpearl/devref/current/default.htm#Create_Process.html

 

posted @ 2016-03-25 11:38  优易应软件工作室  阅读(960)  评论(0编辑  收藏  举报