From 2d7e63ebade5bdc19e18b37fa5e062b64d7d5e0a Mon Sep 17 00:00:00 2001 From: wintel Date: Sun, 6 Apr 2025 02:02:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20#IBYEGX=20=E4=B8=9A=E5=8A=A1=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=A2=9E=E5=8A=A0=E9=80=81=E5=AE=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Infrastructure/Define.cs | 1 + OpenAuth.App/FlowInstance/FlowInstanceApp.cs | 7 +-- .../Request/AddFlowInstanceReq.cs | 7 +++ OpenAuth.App/FlowScheme/FlowSchemeApp.cs | 16 +++++ .../ModuleManager/ModuleManagerApp.cs | 12 ++++ OpenAuth.Repository/Domain/FlowScheme.cs | 7 +++ .../Controllers/FlowInstancesController.cs | 7 ++- .../Controllers/FlowSchemesController.cs | 12 ++++ .../Controllers/ModulesController.cs | 20 ++++++ docs/.vuepress/config.js | 4 +- docs/core/flowinstance.md | 62 ++++--------------- 11 files changed, 96 insertions(+), 59 deletions(-) diff --git a/Infrastructure/Define.cs b/Infrastructure/Define.cs index a878c86f..5466c212 100644 --- a/Infrastructure/Define.cs +++ b/Infrastructure/Define.cs @@ -12,6 +12,7 @@ public const string ROLEMODULE = "RoleModule"; //角色模块关联KEY public const string ROLEDATAPROPERTY = "RoleDataProperty"; //角色数据字段权限 public const string MODULEPRINTERPLAN = "ModulePrinterPlan"; //模块配置打印方案 + public const string MODULE_FLOWSCHEME = "ModuleFlowScheme"; //模块挂载流程模板 public const string DBTYPE_SQLSERVER = "SqlServer"; //sql server public const string DBTYPE_MYSQL = "MySql"; //mysql diff --git a/OpenAuth.App/FlowInstance/FlowInstanceApp.cs b/OpenAuth.App/FlowInstance/FlowInstanceApp.cs index 67b24f66..6d9cbcd7 100644 --- a/OpenAuth.App/FlowInstance/FlowInstanceApp.cs +++ b/OpenAuth.App/FlowInstance/FlowInstanceApp.cs @@ -2,7 +2,7 @@ * @Author: yubaolee | ahfu~ <954478625@qq.com> * @Date: 2024-12-13 16:55:17 * @Description: 工作流实例表操作 - * @LastEditTime: 2025-04-04 23:30:39 + * @LastEditTime: 2025-04-05 15:22:30 * Copyright (c) 2024 by yubaolee | ahfu~ , All Rights Reserved. */ @@ -49,7 +49,7 @@ namespace OpenAuth.App /// 创建一个实例 /// /// - public bool CreateInstance(AddFlowInstanceReq addFlowInstanceReq) + public string CreateInstance(AddFlowInstanceReq addFlowInstanceReq) { CheckNodeDesignate(addFlowInstanceReq); FlowScheme scheme = null; @@ -91,7 +91,6 @@ namespace OpenAuth.App var user = _auth.GetCurrentUser(); #region 根据运行实例改变当前节点状态 - flowInstance.ActivityId = wfruntime.nextNodeId; flowInstance.ActivityType = wfruntime.GetNextNodeType(); flowInstance.ActivityName = wfruntime.nextNode.name; @@ -203,7 +202,7 @@ namespace OpenAuth.App wfruntime.SaveTransitionHis(); SugarClient.Ado.CommitTran(); - return true; + return flowInstance.Id; } /// diff --git a/OpenAuth.App/FlowInstance/Request/AddFlowInstanceReq.cs b/OpenAuth.App/FlowInstance/Request/AddFlowInstanceReq.cs index 01f80238..6a30a568 100644 --- a/OpenAuth.App/FlowInstance/Request/AddFlowInstanceReq.cs +++ b/OpenAuth.App/FlowInstance/Request/AddFlowInstanceReq.cs @@ -119,5 +119,12 @@ namespace OpenAuth.App.Request /// [Description("知会的用户或角色ID列表")] public List NoticeIds { get; set; } + + /// + /// 业务ID + /// 当流程实例与业务单据关联时,记录关联的业务ID + /// + [Description("业务ID")] + public string BusinessId { get; set; } } } \ No newline at end of file diff --git a/OpenAuth.App/FlowScheme/FlowSchemeApp.cs b/OpenAuth.App/FlowScheme/FlowSchemeApp.cs index 7299a102..4c40b61d 100644 --- a/OpenAuth.App/FlowScheme/FlowSchemeApp.cs +++ b/OpenAuth.App/FlowScheme/FlowSchemeApp.cs @@ -1,6 +1,8 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Infrastructure; using Microsoft.EntityFrameworkCore; using OpenAuth.App.Interface; using OpenAuth.App.Request; @@ -40,6 +42,7 @@ namespace OpenAuth.App UnitWork.Update(u => u.Id == flowScheme.Id, u => new FlowScheme { + FrmUrlTemplate = flowScheme.FrmUrlTemplate, SchemeContent = flowScheme.SchemeContent, SchemeName = flowScheme.SchemeName, ModifyDate = DateTime.Now, @@ -51,6 +54,19 @@ namespace OpenAuth.App }); } + /// + /// 加载所有流程表单为URL表单的流程模板 + /// + /// 目前业务系统只挂载URL表单,后期优化挂载其他表单类型 + /// + /// + /// + public List LoadUrlFormFlowScheme() + { + return Repository.Find(u => u.FrmType == Define.FORM_TYPE_URL).ToList(); + } + + public async Task Load(QueryFlowSchemeListReq request) { var result = new TableData(); diff --git a/OpenAuth.App/ModuleManager/ModuleManagerApp.cs b/OpenAuth.App/ModuleManager/ModuleManagerApp.cs index 653542ac..b18dd383 100644 --- a/OpenAuth.App/ModuleManager/ModuleManagerApp.cs +++ b/OpenAuth.App/ModuleManager/ModuleManagerApp.cs @@ -92,6 +92,18 @@ namespace OpenAuth.App return query; } + /// + /// 获取模块的流程模板列表 + /// + /// 模块id + /// + public IEnumerable LoadFlowSchemes(string moduleId) + { + var planids = _revelanceApp.Get(Define.MODULE_FLOWSCHEME, true, moduleId); + var query = UnitWork.Find(u => planids.Contains(u.Id)); + return query; + } + #region 菜单操作 diff --git a/OpenAuth.Repository/Domain/FlowScheme.cs b/OpenAuth.Repository/Domain/FlowScheme.cs index 33146ccb..742c2ed6 100644 --- a/OpenAuth.Repository/Domain/FlowScheme.cs +++ b/OpenAuth.Repository/Domain/FlowScheme.cs @@ -84,6 +84,12 @@ namespace OpenAuth.Repository.Domain /// [Description("表单类型")] public int FrmType { get; set; } + + /// + /// URL表单模板 + /// + [Description("URL表单模板")] + public string FrmUrlTemplate { get; set; } /// /// 模板权限类型:0完全公开,1指定部门/人员 /// @@ -104,6 +110,7 @@ namespace OpenAuth.Repository.Domain /// [Description("有效")] public int Disabled { get; set; } + /// /// 备注 /// diff --git a/OpenAuth.WebApi/Controllers/FlowInstancesController.cs b/OpenAuth.WebApi/Controllers/FlowInstancesController.cs index b8e07a62..52b1db1b 100644 --- a/OpenAuth.WebApi/Controllers/FlowInstancesController.cs +++ b/OpenAuth.WebApi/Controllers/FlowInstancesController.cs @@ -68,12 +68,12 @@ namespace OpenAuth.WebApi.Controllers /// 创建一个新的流程实例 /// www.cnblogs.com/yubaolee, 2019-03-06. [HttpPost] - public Response Add([FromBody]AddFlowInstanceReq obj) + public Response Add([FromBody]AddFlowInstanceReq obj) { - var result = new Response(); + var result = new Response(); try { - _app.CreateInstance(obj); + result.Result = _app.CreateInstance(obj); } catch (Exception ex) { @@ -197,6 +197,7 @@ namespace OpenAuth.WebApi.Controllers return await _app.Load(request); } + [HttpPost] public Response Delete([FromBody]string[] ids) { diff --git a/OpenAuth.WebApi/Controllers/FlowSchemesController.cs b/OpenAuth.WebApi/Controllers/FlowSchemesController.cs index 440a1e07..3642e55f 100644 --- a/OpenAuth.WebApi/Controllers/FlowSchemesController.cs +++ b/OpenAuth.WebApi/Controllers/FlowSchemesController.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Infrastructure; using Microsoft.AspNetCore.Mvc; @@ -83,6 +84,17 @@ namespace OpenAuth.WebApi.Controllers return await _app.Load(request); } + /// + /// 加载URL表单的流程模板 + /// + [HttpGet] + public Response> LoadUrlFormFlowScheme() + { + var result = new Response>(); + result.Result = _app.LoadUrlFormFlowScheme(); + return result; + } + [HttpPost] public Response Delete([FromBody]string[] ids) { diff --git a/OpenAuth.WebApi/Controllers/ModulesController.cs b/OpenAuth.WebApi/Controllers/ModulesController.cs index 09e193a1..3010d360 100644 --- a/OpenAuth.WebApi/Controllers/ModulesController.cs +++ b/OpenAuth.WebApi/Controllers/ModulesController.cs @@ -269,5 +269,25 @@ namespace OpenAuth.WebApi.Controllers return result; } + + /// + /// 获取模块的流程模板列表 + /// + [HttpGet] + public Response> LoadFlowSchemes(string moduleId) + { + var result = new Response>(); + try + { + result.Result = _app.LoadFlowSchemes(moduleId).ToList(); + } + catch (Exception ex) + { + result.Code = 500; + result.Message = ex.InnerException?.Message ?? ex.Message; + } + + return result; + } } } \ No newline at end of file diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index f19b7d46..e0c539c2 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -1,7 +1,7 @@ /* * @Author: yubaolee | ahfu~ <954478625@qq.com> * @Date: 2023-08-12 10:48:24 - * @LastEditTime: 2025-03-31 10:24:25 + * @LastEditTime: 2025-04-06 00:45:14 * @Description: * @ * @Copyright (c) 2023 by yubaolee | ahfu~ , All Rights Reserved. @@ -104,7 +104,7 @@ module.exports = { title: '工作流', // 必要的 sidebarDepth: 1, // 可选的, 默认值是 1 collapsable: false, - children: ['flowinstance', 'flowinstancestatus', 'thirdparty'], + children: ['flowinstance','flowinstanceconcept', 'flowinstancestatus', 'thirdparty'], }, { title: '前端开发', // 必要的 diff --git a/docs/core/flowinstance.md b/docs/core/flowinstance.md index 45a0f24a..f098fd45 100644 --- a/docs/core/flowinstance.md +++ b/docs/core/flowinstance.md @@ -1,59 +1,21 @@ -# 概念 +# 工作流介绍 -## 会签 +OpenAuth.Net工作流基于国际标准的BPMN2.0规范,并在此基础上做了一些扩展,以满足国内各种需求。系统工作流分为两个大类: -会签又称为联名签署,指需要得到两个或多个相关参与者的签名批准。目前支持两种模式:全部通过和至少一个通过,在【会签开始】节点进行配置。如下: -![20240417112438](http://img.openauth.net.cn/20240417112438.png) +1. 无业务关联流程,如请假、报销等。 -全部通过:会签中的所有人员都通过,节点审批通过。 +2. 有业务关联流程,如采购、销售等。 -至少一个通过:会签中任何一个人通过,节点即审批通过。 +这两种流程的差异有以下几点: -具体的会签人员或角色,需要在【会签开始】和【会签结束】之间的节点配置,如上图中的admin、test。 +| 对比维度 | 无业务关联流程 | 有业务关联流程 | +|---------|--------------|--------------| +| 适用场景 | 请假、报销等日常办公 | 采购、销售、入库等业务操作 | +| 发起方式 | 流程中心 -> 我的流程 -> 新的申请 | 直接在业务模块中发起(如:仓储中心 -> 入库订单 -> 送审) | +| 表单类型 | 简单表单,适用拖拽表单设计器 | 复杂表单,需要自定义表单或URL表单 | +| 审批结束处理 | 仅更新流程状态 | 需要修改业务数据状态 | -::: warning 特别注意 - -【会签开始】【会签结束】执行权限配置为所有人 - -会签不能在分支上加判断条件 -::: - -## 加签 - -有时需要在原有审批流程中**临时**增加一个或多个审批节点,这时就需要用到加签的功能。它通常有以下特性: - -* 临时性:加签是在流程执行过程中临时增加的,并非流程设计时就已经固定的审批节点。 - -* 发起主体:加签通常由当前审批人发起,他们认为需要额外的人员进行审核或批准。 - -* 新增审批节点:加签会在当前审批节点之后,插入一个或多个新的审批节点,这些节点需要审批通过后,原流程才能继续执行。 - -* 不改变流程结构:加签不会改变原有流程的整体逻辑或终点,只是插入临时节点,完成后流程继续按原定路径执行。 - - -#### 与会签的区别: - -* 加签:在已有审批流程上临时添加审批人,原审批人仍有审批权。 - -* 会签:多个审批人同时审批,所有会签人均需审批,才能通过节点。 - -加签功能常用在遇到不明确的情况时,需要其他人协助处理。 - - -![2024-10-22-15-24-08](http://img.openauth.net.cn/2024-10-22-15-24-08.png) - -## 条件分支 - -有时需要根据提交数据不同(如报销金额、请假天数等)流程转向不同的审批者。这时需要在连线上面配置分支条件,如下图: - -![20240417114340](http://img.openauth.net.cn/20240417114340.png) - - -## 知会 - -知会指的是在流程执行过程中,将审批结果通知给指定人员,但这些人员不参与实际审批或决策过程。知会的目的是确保相关人员知晓流程的进展或结果,但他们不会影响流程的走向。如下图: - -![2024-10-22-15-42-49](http://img.openauth.net.cn/2024-10-22-15-42-49.png) +表中提到的表单类型差异可以查看:[表单设计](./form.md) # 基本操作