背景

搭建一个适合公司erp业务的开发平台。

架构概要图
 

 

流程引擎开发平台
  包含流程引擎设计器,流程管理平台,流程引擎服务。目前只使用单个数据库进行管理。
  流程引擎设计器

采用silverlight进行开发,本质是对流程模型进行设计,并生成xml。包含:人工节点,自动节点,并行开始节点,并行结束节点,消息节点,文本节点。
  示例模型定义图形:
    
  示例模型定义xml:

<?xml version="1.0" encoding="gb2312"?>
<ProcessModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><BaseInfo><Key>ddd</Key><Title>新建模型</Title><Description>发起人</Description><CreateTime>0001-01-01T00:00:00</CreateTime><Author><StaffNo>34</StaffNo><UserName>车江毅1</UserName></Author><Type>Common</Type><Compilation>Debug</Compilation></BaseInfo><Variables><Variable Name="myValue1" Value="今天天气好晴朗" Mode="Flow" /><Variable Name="myValue2" Value="v2" Mode="Flow" /><Variable Name="myValue3" Value="v3" Mode="Flow" /><Variable Name="myValue4" Value="true" Mode="Flow" /></Variables><Nodes><BaseNode xsi:type="StartNode" Key="start1" Text="开始" Location="236 10"><Routes><Route To="auto1" Text="" Location="0 0"><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /></BaseNode><BaseNode xsi:type="AutoNode" Key="auto1" Text="系统判断" Location="236 95"><Routes><Route To="man1" Text="线1" Location="0 0"><Code><![CDATA[myValue4=='true']]></Code><RouteScripts /></Route><Route To="人工2" Text="线" Location="0 0"><Code><![CDATA[myValue4=='false']]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /><Scripts><Script><Code><![CDATA[api.Forword('http://webservice.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx','getTVstationDataSet','theAreaID:2')]]></Code></Script><Script><Code><![CDATA[api.UpdateVariable('063550')]]></Code></Script></Scripts></BaseNode><BaseNode xsi:type="ManNode" Key="man1" Text="人工1" Location="167 205"><Routes><Route To="并行开始1" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /><Participants><Participant Mode="Code"><Code><![CDATA[api.Split('034','#')]]></Code></Participant><Participant Mode="Variable"><Code><![CDATA[myValue3]]></Code></Participant></Participants><Solt OrderCount="2" Mode="Once" /><Decisions><Decision Text="同意" /><Decision Text="不同意" /></Decisions></BaseNode><BaseNode xsi:type="EndNode" Key="结束" Text="结束" Location="238 732"><Routes /><BeginScripts /><EndScripts /></BaseNode><BaseNode xsi:type="ManNode" Key="人工2" Text="人工2" Location="324 203"><Routes><Route To="并行开始1" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /><Participants /><Decisions /></BaseNode><BaseNode xsi:type="ParallelBeginNode" Key="并行开始1" Text="并行签入" Location="237.047607421875 312"><Routes><Route To="人工3" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route><Route To="人工4" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /></BaseNode><BaseNode xsi:type="ParallelFinishNode" Key="并行结束1" Text="并行结束1" Location="240 571"><Routes><Route To="消息1" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /></BaseNode><BaseNode xsi:type="ManNode" Key="人工3" Text="人工3" Location="95 378"><Routes><Route To="自动1" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /><Participants /><Decisions /></BaseNode><BaseNode xsi:type="ManNode" Key="人工4" Text="人工4" Location="392 379"><Routes><Route To="自动2" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /><Participants /><Decisions /></BaseNode><BaseNode xsi:type="AutoNode" Key="自动1" Text="自动1" Location="98 483"><Routes><Route To="并行结束1" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /><Scripts /></BaseNode><BaseNode xsi:type="AutoNode" Key="自动2" Text="自动2" Location="394.714294433594 474.952362060547"><Routes><Route To="并行结束1" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /><Scripts /></BaseNode><BaseNode xsi:type="MessageNode" Key="消息1" Text="消息1" Location="239 656"><Routes><Route To="结束" Text="线" Location="0 0"><Code><![CDATA[]]></Code><RouteScripts /></Route></Routes><BeginScripts /><EndScripts /><Participants /><MessageVariables /><TemplateKey>0</TemplateKey><TemplateName /></BaseNode></Nodes>
</ProcessModel>

常规界面如下:
  
 

流程管理平台
  包含:流程模型管理,流程管理,流程任务管理,流程操作记录,流程服务接口日志查询,流程异常查询,流程流转调试日志查询,开发者用户管理等。
  可以管理流程模型历史版本及版本切换,流程异常时候的流程节点切换,流程任务的转交等。
 界面如下:

 

流程服务
  包含:流程接口和流程任务接口。

   
/// <summary>/// 业务流程服务接口/// </summary>public interface IProcessService{/// <summary>/// 获取业务流程/// </summary>/// <param name="guid">业务流程ID</param>
        ProcessInfo GetProcessById(Guid guid);/// <summary>/// 批量获取业务流程/// </summary>/// <param name="guids">多个业务流程ID</param>ProcessListInfo GetProcessesByIds(List<Guid> guids);/// <summary>/// 根据流程发布者,获取业务流程列表/// </summary>/// <param name="user">用户的信息 参看UserInfo对象注释</param>/// <param name="modelkeys">模型key  可选(多个)</param>/// <param name="keyword">关键词(标题) 可选</param>/// <param name="pageIndex"></param>/// <param name="pageSize"></param>/// <returns></returns>ProcessListInfo GetProcessListByOriginator(UserInfo user, List<string> modelkeys, string keyword, int pageIndex, int pageSize);/// <summary>/// 根据流程参与者,获取业务流程列表/// </summary>/// <param name="user">用户的信息 参看UserInfo对象注释</param>/// <param name="modelkeys">模型key 可选(多个)</param>/// <param name="keyword">关键词(标题) 可选</param>/// <param name="nodekey">任务所在节点key 可选</param>/// <param name="state">任务完成状态</param>/// <param name="pageIndex"></param>/// <param name="pageSize"></param>/// <returns></returns>ProcessListInfo GetProcessListByParticipant(UserInfo user, List<string> modelkeys, string keyword, string nodekey, EnumTaskStateQuery state, int pageIndex, int pageSize);/// <summary>/// 根据模型keys, 获取业务流程列表/// </summary>/// <param name="modelkeys">模型关键词 (多个)</param>/// <param name="keyword">关键词(标题) 可选</param>/// <param name="pageIndex"></param>/// <param name="pageSize"></param>/// <returns></returns>ProcessListInfo GetProcessListByModel(List<string> modelkeys, string keyword, int pageIndex, int pageSize);/// <summary>/// 创建业务流程/// </summary>/// <param name="modelkey">业务流程对应的模型key</param>/// <param name="title">业务流程标题</param>/// <param name="description">业务流程描述</param>/// <param name="variables">业务流程使用变量 可选</param>/// <param name="user">业务流程发起人 参看UserInfo对象注释</param>/// <param name="operationArgs">操作记录 可选</param>/// <returns></returns>ProcessInfo CreateProcess(string modelkey, string title, string description, List<Variable> variables, UserInfo user, OperationRecordInfoArgs operationArgs);/// <summary>/// 更新业务流程/// </summary>/// <param name="guid">业务流程的ID</param>/// <param name="title">业务流程的标题</param>/// <param name="description">业务流程的描述</param>/// <param name="variables">业务员流程的变量 可选</param>void UpdateProcess(Guid guid, string title, string description, List<Variable> variables);/// <summary>/// 结束业务流程/// </summary>/// <param name="guid">业务流程的ID</param>void FinishProcess(Guid guid, UserInfo user, OperationRecordInfoArgs operationArgs);/// <summary>/// 创建流程操作记录/// </summary>/// <param name="user">操作用户不能为空</param>/// <param name="operationArgs">操作记录不能为空</param>void CreateProcessOperationRecord(Guid guid, UserInfo user, OperationRecordInfoArgs operationArgs);}

   /// <summary>/// 任务服务接口/// </summary>public interface ITaskService{/// <summary>/// 根据任务id,获取任务/// </summary>/// <param name="id">任务id</param>/// <returns></returns>TaskInfo GetTaskByID(string id);/// <summary>/// 根据任务id,批量获取任务/// </summary>/// <param name="ids">多个任务id</param>/// <returns></returns>TaskListInfo GetTasksByIDs(List<string> ids);/// <summary>/// 根据业务流程id,获取任务信息列表/// </summary>/// <param name="state">任务状态</param>/// <param name="processId">业务流程id</param>/// <returns></returns>
        TaskListInfo GetTaskListByProcessID(EnumTaskStateQuery state, Guid processId);/// <summary>/// 根据用户,获取任务信息列表/// </summary>/// <param name="user">用户的信息 参看UserInfo对象注释</param>/// <param name="state">任务状态</param>/// <param name="pageIndex"></param>/// <param name="pageSize"></param>/// <returns></returns>TaskListInfo GetTaskListByUser(UserInfo user, EnumTaskStateQuery state, int pageIndex, int pageSize);/// <summary>/// 根据用户和流程,获取任务信息列表/// </summary>/// <param name="user">用户的信息 参看UserInfo对象注释</param>/// <param name="processId">业务流程id</param>/// <param name="nodekey">当前活动节点key 可选</param>/// <param name="state">任务状态</param>/// <param name="pageIndex"></param>/// <param name="pageSize"></param>/// <returns></returns>TaskListInfo GetTaskListByUserAndProcess(UserInfo user, Guid processId, string nodekey,EnumTaskStateQuery state, int pageIndex, int pageSize);/// <summary>/// 根据业务流程模型key,获取任务信息列表/// </summary>/// <param name="user">用户的信息 参看UserInfo对象注释</param>/// <param name="modelkeys">业务模型key 可选(多个)</param>/// <param name="nodekey">当前活动节点key 可选</param>/// <param name="state">任务状态</param>/// <param name="pageIndex"></param>/// <param name="pageSize"></param>/// <returns></returns>TaskListInfo GetTaskListByUserAndModel(UserInfo user, List<string> modelkeys, string nodekey, EnumTaskStateQuery state, int pageIndex, int pageSize);/// <summary>/// 执行任务/// </summary>/// <param name="id">任务id</param>/// <param name="action">任务的动作 例如:“同意”“不同意”</param>/// <param name="variables">流程参数 可选</param>/// <param name="operationArgs">操作信息 必填</param>TaskInfo ExecuteTask(string id, string action, List<Variable> variables, OperationRecordInfoArgs operationArgs);/// <summary>/// 转交任务/// </summary>/// <param name="id">任务id</param>/// <param name="toUser">任务转交人信息 参看UserInfo对象注释</param>/// <param name="operationArgs">操作信息 传null则无转交操作记录</param>TaskInfo TransferTaskWithOperationRecordInfoArgs(string id, UserInfo toUser, OperationRecordInfoArgs operationArgs);

分布式架构概想
  分布式拆库方案:流程维度和用户维度,流程维度数据库按照流程定义模型的唯一标识hash,来拆分到不同的数据库。所有流程创建和流程任务的创建都在不同的数据库中。用户维度数据库按照用户标识hash,来拆分到不同的数据库。
  拆库优点:数据被拆分,不影响同一个业务流程流转,性能会得到提升。
  拆库缺点:采用异步消息通知,做用户代办任务和完成任务冗余及同步。采用BI工具或者hadoop等进行数据报表等分析。开发,维护复杂度等都会提升。
  结论:如果不是做大型产品或服务,不会进行分布式架构。

(此文只做阶段性的总结,也许对同样做流程引擎的人有些启发,也欢迎交流。分布式相关架构可以参考本人其他文章)

转载于:https://www.cnblogs.com/chejiangyi/p/5113358.html

.net erp(办公oa)开发平台架构之流程服务概要介绍相关推荐

  1. 开源办公OA开发平台使用说明:用车管理应用

    目前,越来越多的企业迈入信息化转型,其中有一项车辆管理(也叫用车管理.公车管理)也是OA中常用的一个功能.传统的车辆管理方式中,公车私用现象频繁,并且难以管控:报销流程复杂,人力劳力费用大-- 用开源 ...

  2. .net erp(办公oa)开发平台架构概要说明之表单设计器

    2019独角兽企业重金招聘Python工程师标准>>> 背景:搭建一个适合公司erp业务的开发平台. 架构概要图: 表单设计开发部署示例图   表单设计开发部署示例说明 1)每个开发 ...

  3. 视频教程-ERP二次开发平台-ERP

    ERP二次开发平台 20年IT从业经历,精通C#.NET编程,C/C++编程,数据库SQL,嵌入式开发,企业信息化,ERP,OA,企业网络技术. 一直在企业IT领域工作,所谓的人才就是要有动手解决问题 ...

  4. 快速 开发平台 架构_快速介绍清洁架构

    快速 开发平台 架构 by Daniel Deutsch 由Daniel Deutsch 快速介绍清洁架构 (A quick introduction to clean architecture) I ...

  5. 低代码开发平台如何支撑微服务/云原生架构

    目前"低代码"."微服务"这两个IT词汇很流行,国内主流的低代码开发平台很多:宜搭.简道云.明道云.云程.氚云.伙伴云.道一云.JEPaaS.华炎魔方.搭搭云. ...

  6. 开源OA开发平台:合同管理使用手册

    简介 开源OA开发平台--O2OA平台可以搭建合同管理平台,内容包括档案管理.过程管理.收款管理.付款管理.签约方档案.合同管理配置等等.可以对合同的档案.收付款计划进行管理,以及签约方的管理. 功能 ...

  7. 《微店大数据开发平台架构演进》阅读有感

    <微店大数据开发平台架构演进>阅读有感 一.为什么需要大数据开发平台 微店在16年4月份之前,数据开发流程基本是这样的: 开发人员通过公共账号登录安装了Hive.Hadoop客户端的gat ...

  8. 《微店大数据开发平台架构演进》读后感

    <微店大数据开发平台架构演进>读后感 <微店大数据开发平台架构演进>这篇文章向我们介绍了八个问题,其中对Mars大数据平台构成.Mars系统架构设计.分布式系统架构.定时.依赖 ...

  9. 云时代架构之微店大数据开发平台架构演进

    微店大数据开发平台架构演进 为什么需要大数据开发平台? 微店在16年4月份之前,数据开发流程基本是这样的: 开发人员通过公共账号登录安装了Hive.Hadoop客户端的gateway机器:编写自己的脚 ...

最新文章

  1. ribbon设置url级别的超时时间
  2. Grunt的配置和使用
  3. 玩转u8g2 OLED库,一篇就够
  4. ubuntu下面的背光键盘的使用
  5. 三级嵌入式 汇编指令汇总
  6. leetcode35. 搜索插入位置(二分搜索)
  7. 使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件
  8. 【转】Google Maps Android API V2的使用及问题解决
  9. mysql 命令 示例,mysql语句大全
  10. appium_android-常见的问题
  11. PCM音频压缩A-Law算法,uLaw
  12. 微软商店和防火墙打不开解决方法
  13. Unknown host ‘raw.githubusercontent.com‘. You may need to adjust the proxy settings in Gradle
  14. 腾讯云服务器挂载云硬盘
  15. 爬取华为手机数据(六)
  16. 带宽与码元的关系_通信中的带宽关系、以及码元、波特率、比特率、奈奎斯特带宽...
  17. 入门必学 | R语言数据的独立性,正态性及方差齐性检验
  18. 永信至诚发起亿元创投基金 助力网络安全创业者成长
  19. 区块链如何支持物联网行业
  20. OneNote2007产品密钥及激活方法

热门文章

  1. usaco ★Agri-Net 最短网络
  2. php 英文小写变大写,PHP英文字母大小写转换函数
  3. mysql本地导入导出_MySQL本地登录及数据库导入导出
  4. python规则网格插值_Python中规则网格上的插值
  5. x86架构手机_都是芯片,为什么电脑CPU不能用在手机里?
  6. python安装包_迈出Python学习第一步:Python开发环境的下载与安装
  7. php不可执行会怎样,从PHP运行可执行文件而不会产生shell
  8. wordpress php教程 pdf,wordpress二次开发全能教程.pdf
  9. java calendar与date_Java中date和calendar的用法
  10. php 面试mysql,mysql中优化必读