.net erp(办公oa)开发平台架构之流程服务概要介绍
背景
搭建一个适合公司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)开发平台架构之流程服务概要介绍相关推荐
- 开源办公OA开发平台使用说明:用车管理应用
目前,越来越多的企业迈入信息化转型,其中有一项车辆管理(也叫用车管理.公车管理)也是OA中常用的一个功能.传统的车辆管理方式中,公车私用现象频繁,并且难以管控:报销流程复杂,人力劳力费用大-- 用开源 ...
- .net erp(办公oa)开发平台架构概要说明之表单设计器
2019独角兽企业重金招聘Python工程师标准>>> 背景:搭建一个适合公司erp业务的开发平台. 架构概要图: 表单设计开发部署示例图 表单设计开发部署示例说明 1)每个开发 ...
- 视频教程-ERP二次开发平台-ERP
ERP二次开发平台 20年IT从业经历,精通C#.NET编程,C/C++编程,数据库SQL,嵌入式开发,企业信息化,ERP,OA,企业网络技术. 一直在企业IT领域工作,所谓的人才就是要有动手解决问题 ...
- 快速 开发平台 架构_快速介绍清洁架构
快速 开发平台 架构 by Daniel Deutsch 由Daniel Deutsch 快速介绍清洁架构 (A quick introduction to clean architecture) I ...
- 低代码开发平台如何支撑微服务/云原生架构
目前"低代码"."微服务"这两个IT词汇很流行,国内主流的低代码开发平台很多:宜搭.简道云.明道云.云程.氚云.伙伴云.道一云.JEPaaS.华炎魔方.搭搭云. ...
- 开源OA开发平台:合同管理使用手册
简介 开源OA开发平台--O2OA平台可以搭建合同管理平台,内容包括档案管理.过程管理.收款管理.付款管理.签约方档案.合同管理配置等等.可以对合同的档案.收付款计划进行管理,以及签约方的管理. 功能 ...
- 《微店大数据开发平台架构演进》阅读有感
<微店大数据开发平台架构演进>阅读有感 一.为什么需要大数据开发平台 微店在16年4月份之前,数据开发流程基本是这样的: 开发人员通过公共账号登录安装了Hive.Hadoop客户端的gat ...
- 《微店大数据开发平台架构演进》读后感
<微店大数据开发平台架构演进>读后感 <微店大数据开发平台架构演进>这篇文章向我们介绍了八个问题,其中对Mars大数据平台构成.Mars系统架构设计.分布式系统架构.定时.依赖 ...
- 云时代架构之微店大数据开发平台架构演进
微店大数据开发平台架构演进 为什么需要大数据开发平台? 微店在16年4月份之前,数据开发流程基本是这样的: 开发人员通过公共账号登录安装了Hive.Hadoop客户端的gateway机器:编写自己的脚 ...
最新文章
- ribbon设置url级别的超时时间
- Grunt的配置和使用
- 玩转u8g2 OLED库,一篇就够
- ubuntu下面的背光键盘的使用
- 三级嵌入式 汇编指令汇总
- leetcode35. 搜索插入位置(二分搜索)
- 使用Unoconv和LibreOffice进行格式转换实现在线预览 doc,doxc,xls,xlsx,ppt,pptx 文件
- 【转】Google Maps Android API V2的使用及问题解决
- mysql 命令 示例,mysql语句大全
- appium_android-常见的问题
- PCM音频压缩A-Law算法,uLaw
- 微软商店和防火墙打不开解决方法
- Unknown host ‘raw.githubusercontent.com‘. You may need to adjust the proxy settings in Gradle
- 腾讯云服务器挂载云硬盘
- 爬取华为手机数据(六)
- 带宽与码元的关系_通信中的带宽关系、以及码元、波特率、比特率、奈奎斯特带宽...
- 入门必学 | R语言数据的独立性,正态性及方差齐性检验
- 永信至诚发起亿元创投基金 助力网络安全创业者成长
- 区块链如何支持物联网行业
- OneNote2007产品密钥及激活方法
热门文章
- usaco ★Agri-Net 最短网络
- php 英文小写变大写,PHP英文字母大小写转换函数
- mysql本地导入导出_MySQL本地登录及数据库导入导出
- python规则网格插值_Python中规则网格上的插值
- x86架构手机_都是芯片,为什么电脑CPU不能用在手机里?
- python安装包_迈出Python学习第一步:Python开发环境的下载与安装
- php不可执行会怎样,从PHP运行可执行文件而不会产生shell
- wordpress php教程 pdf,wordpress二次开发全能教程.pdf
- java calendar与date_Java中date和calendar的用法
- php 面试mysql,mysql中优化必读