mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-09-20 02:29:24 +08:00
feat: #IBYEGX 业务系统增加送审功能
This commit is contained in:
@@ -12,6 +12,7 @@
|
|||||||
public const string ROLEMODULE = "RoleModule"; //角色模块关联KEY
|
public const string ROLEMODULE = "RoleModule"; //角色模块关联KEY
|
||||||
public const string ROLEDATAPROPERTY = "RoleDataProperty"; //角色数据字段权限
|
public const string ROLEDATAPROPERTY = "RoleDataProperty"; //角色数据字段权限
|
||||||
public const string MODULEPRINTERPLAN = "ModulePrinterPlan"; //模块配置打印方案
|
public const string MODULEPRINTERPLAN = "ModulePrinterPlan"; //模块配置打印方案
|
||||||
|
public const string MODULE_FLOWSCHEME = "ModuleFlowScheme"; //模块挂载流程模板
|
||||||
|
|
||||||
public const string DBTYPE_SQLSERVER = "SqlServer"; //sql server
|
public const string DBTYPE_SQLSERVER = "SqlServer"; //sql server
|
||||||
public const string DBTYPE_MYSQL = "MySql"; //mysql
|
public const string DBTYPE_MYSQL = "MySql"; //mysql
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
* @Author: yubaolee <yubaolee@163.com> | ahfu~ <954478625@qq.com>
|
* @Author: yubaolee <yubaolee@163.com> | ahfu~ <954478625@qq.com>
|
||||||
* @Date: 2024-12-13 16:55:17
|
* @Date: 2024-12-13 16:55:17
|
||||||
* @Description: 工作流实例表操作
|
* @Description: 工作流实例表操作
|
||||||
* @LastEditTime: 2025-04-04 23:30:39
|
* @LastEditTime: 2025-04-05 15:22:30
|
||||||
* Copyright (c) 2024 by yubaolee | ahfu~ , All Rights Reserved.
|
* Copyright (c) 2024 by yubaolee | ahfu~ , All Rights Reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -49,7 +49,7 @@ namespace OpenAuth.App
|
|||||||
/// 创建一个实例
|
/// 创建一个实例
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool CreateInstance(AddFlowInstanceReq addFlowInstanceReq)
|
public string CreateInstance(AddFlowInstanceReq addFlowInstanceReq)
|
||||||
{
|
{
|
||||||
CheckNodeDesignate(addFlowInstanceReq);
|
CheckNodeDesignate(addFlowInstanceReq);
|
||||||
FlowScheme scheme = null;
|
FlowScheme scheme = null;
|
||||||
@@ -91,7 +91,6 @@ namespace OpenAuth.App
|
|||||||
var user = _auth.GetCurrentUser();
|
var user = _auth.GetCurrentUser();
|
||||||
|
|
||||||
#region 根据运行实例改变当前节点状态
|
#region 根据运行实例改变当前节点状态
|
||||||
|
|
||||||
flowInstance.ActivityId = wfruntime.nextNodeId;
|
flowInstance.ActivityId = wfruntime.nextNodeId;
|
||||||
flowInstance.ActivityType = wfruntime.GetNextNodeType();
|
flowInstance.ActivityType = wfruntime.GetNextNodeType();
|
||||||
flowInstance.ActivityName = wfruntime.nextNode.name;
|
flowInstance.ActivityName = wfruntime.nextNode.name;
|
||||||
@@ -203,7 +202,7 @@ namespace OpenAuth.App
|
|||||||
|
|
||||||
wfruntime.SaveTransitionHis();
|
wfruntime.SaveTransitionHis();
|
||||||
SugarClient.Ado.CommitTran();
|
SugarClient.Ado.CommitTran();
|
||||||
return true;
|
return flowInstance.Id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -119,5 +119,12 @@ namespace OpenAuth.App.Request
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("知会的用户或角色ID列表")]
|
[Description("知会的用户或角色ID列表")]
|
||||||
public List<string> NoticeIds { get; set; }
|
public List<string> NoticeIds { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 业务ID
|
||||||
|
/// 当流程实例与业务单据关联时,记录关联的业务ID
|
||||||
|
/// </summary>
|
||||||
|
[Description("业务ID")]
|
||||||
|
public string BusinessId { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,6 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Infrastructure;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using OpenAuth.App.Interface;
|
using OpenAuth.App.Interface;
|
||||||
using OpenAuth.App.Request;
|
using OpenAuth.App.Request;
|
||||||
@@ -40,6 +42,7 @@ namespace OpenAuth.App
|
|||||||
|
|
||||||
UnitWork.Update<FlowScheme>(u => u.Id == flowScheme.Id, u => new FlowScheme
|
UnitWork.Update<FlowScheme>(u => u.Id == flowScheme.Id, u => new FlowScheme
|
||||||
{
|
{
|
||||||
|
FrmUrlTemplate = flowScheme.FrmUrlTemplate,
|
||||||
SchemeContent = flowScheme.SchemeContent,
|
SchemeContent = flowScheme.SchemeContent,
|
||||||
SchemeName = flowScheme.SchemeName,
|
SchemeName = flowScheme.SchemeName,
|
||||||
ModifyDate = DateTime.Now,
|
ModifyDate = DateTime.Now,
|
||||||
@@ -51,6 +54,19 @@ namespace OpenAuth.App
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载所有流程表单为URL表单的流程模板
|
||||||
|
/// <para>
|
||||||
|
/// 目前业务系统只挂载URL表单,后期优化挂载其他表单类型
|
||||||
|
/// </para>
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public List<FlowScheme> LoadUrlFormFlowScheme()
|
||||||
|
{
|
||||||
|
return Repository.Find(u => u.FrmType == Define.FORM_TYPE_URL).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task<TableData> Load(QueryFlowSchemeListReq request)
|
public async Task<TableData> Load(QueryFlowSchemeListReq request)
|
||||||
{
|
{
|
||||||
var result = new TableData();
|
var result = new TableData();
|
||||||
|
@@ -92,6 +92,18 @@ namespace OpenAuth.App
|
|||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取模块的流程模板列表
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="moduleId">模块id</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public IEnumerable<FlowScheme> LoadFlowSchemes(string moduleId)
|
||||||
|
{
|
||||||
|
var planids = _revelanceApp.Get(Define.MODULE_FLOWSCHEME, true, moduleId);
|
||||||
|
var query = UnitWork.Find<FlowScheme>(u => planids.Contains(u.Id));
|
||||||
|
return query;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#region 菜单操作
|
#region 菜单操作
|
||||||
|
|
||||||
|
@@ -84,6 +84,12 @@ namespace OpenAuth.Repository.Domain
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("表单类型")]
|
[Description("表单类型")]
|
||||||
public int FrmType { get; set; }
|
public int FrmType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// URL表单模板
|
||||||
|
/// </summary>
|
||||||
|
[Description("URL表单模板")]
|
||||||
|
public string FrmUrlTemplate { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 模板权限类型:0完全公开,1指定部门/人员
|
/// 模板权限类型:0完全公开,1指定部门/人员
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -104,6 +110,7 @@ namespace OpenAuth.Repository.Domain
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("有效")]
|
[Description("有效")]
|
||||||
public int Disabled { get; set; }
|
public int Disabled { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 备注
|
/// 备注
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@@ -68,12 +68,12 @@ namespace OpenAuth.WebApi.Controllers
|
|||||||
/// <summary>创建一个新的流程实例</summary>
|
/// <summary>创建一个新的流程实例</summary>
|
||||||
/// <remarks> www.cnblogs.com/yubaolee, 2019-03-06. </remarks>
|
/// <remarks> www.cnblogs.com/yubaolee, 2019-03-06. </remarks>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public Response Add([FromBody]AddFlowInstanceReq obj)
|
public Response<string> Add([FromBody]AddFlowInstanceReq obj)
|
||||||
{
|
{
|
||||||
var result = new Response();
|
var result = new Response<string>();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
_app.CreateInstance(obj);
|
result.Result = _app.CreateInstance(obj);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -197,6 +197,7 @@ namespace OpenAuth.WebApi.Controllers
|
|||||||
return await _app.Load(request);
|
return await _app.Load(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public Response Delete([FromBody]string[] ids)
|
public Response Delete([FromBody]string[] ids)
|
||||||
{
|
{
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Infrastructure;
|
using Infrastructure;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@@ -83,6 +84,17 @@ namespace OpenAuth.WebApi.Controllers
|
|||||||
return await _app.Load(request);
|
return await _app.Load(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 加载URL表单的流程模板
|
||||||
|
/// </summary>
|
||||||
|
[HttpGet]
|
||||||
|
public Response<List<FlowScheme>> LoadUrlFormFlowScheme()
|
||||||
|
{
|
||||||
|
var result = new Response<List<FlowScheme>>();
|
||||||
|
result.Result = _app.LoadUrlFormFlowScheme();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public Response Delete([FromBody]string[] ids)
|
public Response Delete([FromBody]string[] ids)
|
||||||
{
|
{
|
||||||
|
@@ -269,5 +269,25 @@ namespace OpenAuth.WebApi.Controllers
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取模块的流程模板列表
|
||||||
|
/// </summary>
|
||||||
|
[HttpGet]
|
||||||
|
public Response<List<FlowScheme>> LoadFlowSchemes(string moduleId)
|
||||||
|
{
|
||||||
|
var result = new Response<List<FlowScheme>>();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result.Result = _app.LoadFlowSchemes(moduleId).ToList();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
result.Code = 500;
|
||||||
|
result.Message = ex.InnerException?.Message ?? ex.Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* @Author: yubaolee <yubaolee@163.com> | ahfu~ <954478625@qq.com>
|
* @Author: yubaolee <yubaolee@163.com> | ahfu~ <954478625@qq.com>
|
||||||
* @Date: 2023-08-12 10:48:24
|
* @Date: 2023-08-12 10:48:24
|
||||||
* @LastEditTime: 2025-03-31 10:24:25
|
* @LastEditTime: 2025-04-06 00:45:14
|
||||||
* @Description:
|
* @Description:
|
||||||
* @
|
* @
|
||||||
* @Copyright (c) 2023 by yubaolee | ahfu~ , All Rights Reserved.
|
* @Copyright (c) 2023 by yubaolee | ahfu~ , All Rights Reserved.
|
||||||
@@ -104,7 +104,7 @@ module.exports = {
|
|||||||
title: '工作流', // 必要的
|
title: '工作流', // 必要的
|
||||||
sidebarDepth: 1, // 可选的, 默认值是 1
|
sidebarDepth: 1, // 可选的, 默认值是 1
|
||||||
collapsable: false,
|
collapsable: false,
|
||||||
children: ['flowinstance', 'flowinstancestatus', 'thirdparty'],
|
children: ['flowinstance','flowinstanceconcept', 'flowinstancestatus', 'thirdparty'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '前端开发', // 必要的
|
title: '前端开发', // 必要的
|
||||||
|
@@ -1,59 +1,21 @@
|
|||||||
# 概念
|
# 工作流介绍
|
||||||
|
|
||||||
## 会签
|
OpenAuth.Net工作流基于国际标准的BPMN2.0规范,并在此基础上做了一些扩展,以满足国内各种需求。系统工作流分为两个大类:
|
||||||
|
|
||||||
会签又称为联名签署,指需要得到两个或多个相关参与者的签名批准。目前支持两种模式:全部通过和至少一个通过,在【会签开始】节点进行配置。如下:
|
1. 无业务关联流程,如请假、报销等。
|
||||||

|
|
||||||
|
|
||||||
全部通过:会签中的所有人员都通过,节点审批通过。
|
2. 有业务关联流程,如采购、销售等。
|
||||||
|
|
||||||
至少一个通过:会签中任何一个人通过,节点即审批通过。
|
这两种流程的差异有以下几点:
|
||||||
|
|
||||||
具体的会签人员或角色,需要在【会签开始】和【会签结束】之间的节点配置,如上图中的admin、test。
|
| 对比维度 | 无业务关联流程 | 有业务关联流程 |
|
||||||
|
|---------|--------------|--------------|
|
||||||
|
| 适用场景 | 请假、报销等日常办公 | 采购、销售、入库等业务操作 |
|
||||||
|
| 发起方式 | 流程中心 -> 我的流程 -> 新的申请 | 直接在业务模块中发起(如:仓储中心 -> 入库订单 -> 送审) |
|
||||||
|
| 表单类型 | 简单表单,适用拖拽表单设计器 | 复杂表单,需要自定义表单或URL表单 |
|
||||||
|
| 审批结束处理 | 仅更新流程状态 | 需要修改业务数据状态 |
|
||||||
|
|
||||||
::: warning 特别注意
|
表中提到的表单类型差异可以查看:[表单设计](./form.md)
|
||||||
|
|
||||||
【会签开始】【会签结束】执行权限配置为所有人
|
|
||||||
|
|
||||||
会签不能在分支上加判断条件
|
|
||||||
:::
|
|
||||||
|
|
||||||
## 加签
|
|
||||||
|
|
||||||
有时需要在原有审批流程中**临时**增加一个或多个审批节点,这时就需要用到加签的功能。它通常有以下特性:
|
|
||||||
|
|
||||||
* 临时性:加签是在流程执行过程中临时增加的,并非流程设计时就已经固定的审批节点。
|
|
||||||
|
|
||||||
* 发起主体:加签通常由当前审批人发起,他们认为需要额外的人员进行审核或批准。
|
|
||||||
|
|
||||||
* 新增审批节点:加签会在当前审批节点之后,插入一个或多个新的审批节点,这些节点需要审批通过后,原流程才能继续执行。
|
|
||||||
|
|
||||||
* 不改变流程结构:加签不会改变原有流程的整体逻辑或终点,只是插入临时节点,完成后流程继续按原定路径执行。
|
|
||||||
|
|
||||||
|
|
||||||
#### 与会签的区别:
|
|
||||||
|
|
||||||
* 加签:在已有审批流程上临时添加审批人,原审批人仍有审批权。
|
|
||||||
|
|
||||||
* 会签:多个审批人同时审批,所有会签人均需审批,才能通过节点。
|
|
||||||
|
|
||||||
加签功能常用在遇到不明确的情况时,需要其他人协助处理。
|
|
||||||
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 条件分支
|
|
||||||
|
|
||||||
有时需要根据提交数据不同(如报销金额、请假天数等)流程转向不同的审批者。这时需要在连线上面配置分支条件,如下图:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
## 知会
|
|
||||||
|
|
||||||
知会指的是在流程执行过程中,将审批结果通知给指定人员,但这些人员不参与实际审批或决策过程。知会的目的是确保相关人员知晓流程的进展或结果,但他们不会影响流程的走向。如下图:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
|
|
||||||
# 基本操作
|
# 基本操作
|
||||||
|
Reference in New Issue
Block a user