diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Entity/ApprovalFlowRecord.cs b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Entity/ApprovalFlowRecord.cs new file mode 100644 index 00000000..9d231dab --- /dev/null +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Entity/ApprovalFlowRecord.cs @@ -0,0 +1,53 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Admin.NET.Core; + +namespace Admin.NET.Plugin.ApprovalFlow; + +/// +/// 审批流流程记录 +/// +[SugarTable("ApprovalFlowRecord", "审批流流程记录")] +public class ApprovalFlowRecord : EntityBaseData +{ + /// + /// 表单名称 + /// + [SugarColumn(ColumnName = "FormName", ColumnDescription = "表单名称", Length = 255)] + public string? FormName { get; set; } + + /// + /// 表单状态 + /// + [SugarColumn(ColumnName = "FormStatus", ColumnDescription = "表单状态", Length = 32)] + public string? FormStatus { get; set; } + + /// + /// 表单触发 + /// + [SugarColumn(ColumnName = "FormJson", ColumnDescription = "表单触发", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? FormJson { get; set; } + + /// + /// 表单结果 + /// + [SugarColumn(ColumnName = "FormResult", ColumnDescription = "表单结果", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? FormResult { get; set; } + + /// + /// 流程结构 + /// + [SugarColumn(ColumnName = "FlowJson", ColumnDescription = "流程结构", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? FlowJson { get; set; } + + /// + /// 流程结果 + /// + [SugarColumn(ColumnName = "FlowResult", ColumnDescription = "流程结果", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? FlowResult { get; set; } + +} diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Entity/ApprovalForm.cs b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Entity/ApprovalForm.cs new file mode 100644 index 00000000..65b7a1e6 --- /dev/null +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Entity/ApprovalForm.cs @@ -0,0 +1,65 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Admin.NET.Core; + +namespace Admin.NET.Plugin.ApprovalFlow; + +/// +/// 审批流表单 +/// +[SugarTable("ApprovalForm", "审批流表单")] +public class ApprovalForm : EntityBaseData +{ + /// + /// 编号 + /// + [SugarColumn(ColumnName = "Code", ColumnDescription = "编号", Length = 32)] + public string? Code { get; set; } + + /// + /// 名称 + /// + [SugarColumn(ColumnName = "Name", ColumnDescription = "名称", Length = 32)] + public string? Name { get; set; } + + /// + /// 表单名称 + /// + [SugarColumn(ColumnName = "FormName", ColumnDescription = "表单名称", Length = 32)] + public string? FormName { get; set; } + + /// + /// 表单属性 + /// + [SugarColumn(ColumnName = "FormType", ColumnDescription = "表单属性", Length = 32)] + public string? FormType { get; set; } + + /// + /// 表单状态 + /// + [SugarColumn(ColumnName = "FormStatus", ColumnDescription = "表单状态")] + public int? FormStatus { get; set; } + + /// + /// 表单结果 + /// + [SugarColumn(ColumnName = "FormResult", ColumnDescription = "表单结果", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? FormResult { get; set; } + + /// + /// 状态 + /// + [SugarColumn(ColumnName = "Status", ColumnDescription = "状态")] + public int? Status { get; set; } + + /// + /// 备注 + /// + [SugarColumn(ColumnName = "Remark", ColumnDescription = "备注", Length = 255)] + public string? Remark { get; set; } + +} diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Entity/ApprovalFormRecord.cs b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Entity/ApprovalFormRecord.cs new file mode 100644 index 00000000..5142870c --- /dev/null +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Entity/ApprovalFormRecord.cs @@ -0,0 +1,59 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Admin.NET.Core; + +namespace Admin.NET.Plugin.ApprovalFlow; + +/// +/// 审批流表单记录 +/// +[SugarTable("ApprovalFormRecord", "审批流表单记录")] +public class ApprovalFormRecord : EntityBaseData +{ + /// + /// 流程Id + /// + [SugarColumn(ColumnName = "FlowId", ColumnDescription = "流程Id")] + public long? FlowId { get; set; } + + /// + /// 表单名称 + /// + [SugarColumn(ColumnName = "FormName", ColumnDescription = "表单名称", Length = 32)] + public string? FormName { get; set; } + + /// + /// 表单类型 + /// + [SugarColumn(ColumnName = "FormType", ColumnDescription = "表单类型", Length = 32)] + public string? FormType { get; set; } + + /// + /// 表单状态 + /// + [SugarColumn(ColumnName = "FormStatus", ColumnDescription = "表单状态", Length = 11)] + public string? FormStatus { get; set; } + + /// + /// 修改前 + /// + [SugarColumn(ColumnName = "FormBefore", ColumnDescription = "修改前", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? FormBefore { get; set; } + + /// + /// 修改后 + /// + [SugarColumn(ColumnName = "FormAfter", ColumnDescription = "修改后", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? FormAfter { get; set; } + + /// + /// 表单结果 + /// + [SugarColumn(ColumnName = "FormResult", ColumnDescription = "表单结果", ColumnDataType = StaticConfig.CodeFirst_BigString)] + public string? FormResult { get; set; } + +} diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/GlobalUsings.cs b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/GlobalUsings.cs index 99f56f15..ed9f17ae 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/GlobalUsings.cs +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/GlobalUsings.cs @@ -1,19 +1,20 @@ -// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 -// -// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 -// -// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! - -global using Admin.NET.Core; -global using Furion; -global using Furion.DependencyInjection; -global using Furion.DynamicApiController; -global using Furion.FriendlyException; -global using Mapster; -global using Microsoft.AspNetCore.Mvc; -global using Microsoft.Extensions.DependencyInjection; -global using SqlSugar; -global using System; -global using System.Collections.Generic; -global using System.ComponentModel.DataAnnotations; +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +global using Admin.NET.Core; +global using Furion; +global using Furion.DependencyInjection; +global using Furion.DynamicApiController; +global using Furion.FriendlyException; +global using Mapster; +global using Microsoft.AspNetCore.Mvc; +global using Microsoft.Extensions.DependencyInjection; +global using SqlSugar; +global using System; +global using System.Collections.Generic; +global using System.ComponentModel; +global using System.ComponentModel.DataAnnotations; global using System.Threading.Tasks; \ No newline at end of file diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Middleware/ApprovalFlowMiddleware.cs b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Middleware/ApprovalFlowMiddleware.cs index ab8a80f0..59d64e25 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Middleware/ApprovalFlowMiddleware.cs +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Middleware/ApprovalFlowMiddleware.cs @@ -1,46 +1,47 @@ -// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 -// -// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 -// -// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! - -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; - -namespace Admin.NET.Plugin.ApprovalFlow; - -/// -/// 扩展审批流中间件 -/// -public static class ApprovalFlowMiddlewareExtensions -{ - /// - /// 使用审批流 - /// - /// - /// - public static IApplicationBuilder UseApprovalFlow(this IApplicationBuilder builder) - { - return builder.UseMiddleware(); - } -} - -/// -/// 审批流中间件 -/// -public class ApprovalFlowMiddleware -{ - private readonly RequestDelegate _next; - - public ApprovalFlowMiddleware(RequestDelegate next) - { - _next = next; - } - - public async Task Invoke(HttpContext context) - { - //await App.GetRequiredService().MatchApproval(context); - - await _next.Invoke(context); - } +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using Admin.NET.Plugin.ApprovalFlow.Service; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; + +namespace Admin.NET.Plugin.ApprovalFlow; + +/// +/// 扩展审批流中间件 +/// +public static class ApprovalFlowMiddlewareExtensions +{ + /// + /// 使用审批流 + /// + /// + /// + public static IApplicationBuilder UseApprovalFlow(this IApplicationBuilder builder) + { + return builder.UseMiddleware(); + } +} + +/// +/// 审批流中间件 +/// +public class ApprovalFlowMiddleware +{ + private readonly RequestDelegate _next; + + public ApprovalFlowMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke(HttpContext context) + { + await App.GetRequiredService().MatchApproval(context); + + await _next.Invoke(context); + } } \ No newline at end of file diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/ApprovalFlowService.cs b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/ApprovalFlowService.cs index 89ae520f..3b7e2bf8 100644 --- a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/ApprovalFlowService.cs +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/ApprovalFlowService.cs @@ -1,148 +1,156 @@ -// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 -// -// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 -// -// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! - -using Microsoft.AspNetCore.Http; - -namespace Admin.NET.Plugin.ApprovalFlow.Service; - -/// -/// 审批流程服务 -/// -[ApiDescriptionSettings(ApprovalFlowConst.GroupName, Order = 100)] -public class ApprovalFlowService : IDynamicApiController, ITransient -{ - private readonly SqlSugarRepository _approvalFlowRep; - - public ApprovalFlowService(SqlSugarRepository approvalFlowRep) - { - _approvalFlowRep = approvalFlowRep; - } - - /// - /// 分页查询审批流 - /// - /// - /// - [HttpPost] - [ApiDescriptionSettings(Name = "Page")] - public async Task> Page(ApprovalFlowInput input) - { - return await _approvalFlowRep.AsQueryable() - .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.Code.Contains(input.SearchKey.Trim()) || u.Name.Contains(input.SearchKey.Trim()) || u.Remark.Contains(input.SearchKey.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim())) - .Select() - .ToPagedListAsync(input.Page, input.PageSize); - } - - /// - /// 增加审批流 - /// - /// - /// - [ApiDescriptionSettings(Name = "Add"), HttpPost] - public async Task Add(AddApprovalFlowInput input) - { - var entity = input.Adapt(); - if (input.Code == null) - { - entity.Code = await LastCode(""); - } - await _approvalFlowRep.InsertAsync(entity); - return entity.Id; - } - - /// - /// 更新审批流 - /// - /// - /// - [ApiDescriptionSettings(Name = "Update"), HttpPost] - public async Task Update(UpdateApprovalFlowInput input) - { - var entity = input.Adapt(); - await _approvalFlowRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); - } - - /// - /// 删除审批流 - /// - /// - /// - [ApiDescriptionSettings(Name = "Delete"), HttpPost] - public async Task Delete(DeleteApprovalFlowInput input) - { - var entity = await _approvalFlowRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); - await _approvalFlowRep.FakeDeleteAsync(entity); // 假删除 - } - - /// - /// 获取审批流 - /// - /// - /// - public async Task GetDetail([FromQuery] QueryByIdApprovalFlowInput input) - { - return await _approvalFlowRep.GetFirstAsync(u => u.Id == input.Id); - } - - /// - /// 根据编码获取审批流信息 - /// - /// - /// - public async Task GetInfo([FromQuery] string code) - { - return await _approvalFlowRep.GetFirstAsync(u => u.Code == code); - } - - /// - /// 获取审批流列表 - /// - /// - /// - public async Task> GetList([FromQuery] ApprovalFlowInput input) - { - return await _approvalFlowRep.AsQueryable().Select().ToListAsync(); - } - - /// - /// 获取今天创建的最大编号 - /// - /// - /// - private async Task LastCode(string prefix) - { - var today = DateTime.Now.Date; - var count = await _approvalFlowRep.AsQueryable().Where(u => u.CreateTime >= today).CountAsync(); - return prefix + DateTime.Now.ToString("yyMMdd") + string.Format("{0:d2}", count + 1); - } - - /// - /// 匹配审批流程 - /// - /// - /// - [NonAction] - public async Task MatchApproval(HttpContext context) - { - var request = context.Request; - var response = context.Response; - - var path = request.Path.ToString().Split("/"); - - var method = request.Method; - var qs = request.QueryString; - var h = request.Headers; - var b = request.Body; - - var requestHeaders = request.Headers; - var responseHeaders = response.Headers; - - await Task.CompletedTask; - } +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Text.Json; +using Admin.NET.Plugin.ApprovalFlow.Const; +using Admin.NET.Plugin.ApprovalFlow.Entity; +using Microsoft.AspNetCore.Http; + +namespace Admin.NET.Plugin.ApprovalFlow.Service; + +/// +/// 审批流程服务 +/// +[ApiDescriptionSettings(ApprovalFlowConst.GroupName, Order = 100)] +public class ApprovalFlowService : IDynamicApiController, ITransient +{ + private readonly SqlSugarRepository _approvalFlowRep; + + public ApprovalFlowService(SqlSugarRepository approvalFlowRep) + { + _approvalFlowRep = approvalFlowRep; + } + + /// + /// 分页查询审批流 + /// + /// + /// + [HttpPost] + [ApiDescriptionSettings(Name = "Page")] + public async Task> Page(ApprovalFlowInput input) + { + return await _approvalFlowRep.AsQueryable() + .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.Code.Contains(input.SearchKey.Trim()) || u.Name.Contains(input.SearchKey.Trim()) || u.Remark.Contains(input.SearchKey.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Remark), u => u.Remark.Contains(input.Remark.Trim())) + .Select() + .ToPagedListAsync(input.Page, input.PageSize); + } + + /// + /// 增加审批流 + /// + /// + /// + [ApiDescriptionSettings(Name = "Add"), HttpPost] + public async Task Add(AddApprovalFlowInput input) + { + var entity = input.Adapt(); + if (input.Code == null) + { + entity.Code = await LastCode(""); + } + await _approvalFlowRep.InsertAsync(entity); + return entity.Id; + } + + /// + /// 更新审批流 + /// + /// + /// + [ApiDescriptionSettings(Name = "Update"), HttpPost] + public async Task Update(UpdateApprovalFlowInput input) + { + var entity = input.Adapt(); + await _approvalFlowRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); + } + + /// + /// 删除审批流 + /// + /// + /// + [ApiDescriptionSettings(Name = "Delete"), HttpPost] + public async Task Delete(DeleteApprovalFlowInput input) + { + var entity = await _approvalFlowRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); + await _approvalFlowRep.FakeDeleteAsync(entity); // 假删除 + } + + /// + /// 获取审批流 + /// + /// + /// + public async Task GetDetail([FromQuery] QueryByIdApprovalFlowInput input) + { + return await _approvalFlowRep.GetFirstAsync(u => u.Id == input.Id); + } + + /// + /// 根据编码获取审批流信息 + /// + /// + /// + public async Task GetInfo([FromQuery] string code) + { + return await _approvalFlowRep.GetFirstAsync(u => u.Code == code); + } + + /// + /// 获取审批流列表 + /// + /// + /// + public async Task> GetList([FromQuery] ApprovalFlowInput input) + { + return await _approvalFlowRep.AsQueryable().Select().ToListAsync(); + } + + /// + /// 获取今天创建的最大编号 + /// + /// + /// + private async Task LastCode(string prefix) + { + var today = DateTime.Now.Date; + var count = await _approvalFlowRep.AsQueryable().Where(u => u.CreateTime >= today).CountAsync(); + return prefix + DateTime.Now.ToString("yyMMdd") + string.Format("{0:d2}", count + 1); + } + + [HttpGet] + [ApiDescriptionSettings(Name = "FlowList")] + [DisplayName("获取审批流结构")] + public async Task FlowList([FromQuery] string code) + { + var result = await _approvalFlowRep.AsQueryable().Where(u => u.Code == code).Select().FirstAsync(); + var FlowJson = result.FlowJson != null ? JsonSerializer.Deserialize(result.FlowJson) : new ApprovalFlowItem(); + var FormJson = result.FormJson != null ? JsonSerializer.Deserialize(result.FormJson) : new ApprovalFormItem(); + return new { + FlowJson, + FormJson + }; + } + + [HttpGet] + [ApiDescriptionSettings(Name = "FormRoutes")] + [DisplayName("获取审批流规则")] + public async Task> FormRoutes() + { + var results = await _approvalFlowRep.AsQueryable().Select().ToListAsync(); + var list = new List(); + foreach (var item in results) + { + var FormJson = item.FormJson != null ? JsonSerializer.Deserialize(item.FormJson) : new ApprovalFormItem(); + if (item.FormJson != null) list.Add(FormJson.Route); + } + return list; + } } \ No newline at end of file diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/Dto/ApprovalFlowItem.cs b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/Dto/ApprovalFlowItem.cs new file mode 100644 index 00000000..8bd13b12 --- /dev/null +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/Dto/ApprovalFlowItem.cs @@ -0,0 +1,97 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Text.Json.Serialization; + +namespace Admin.NET.Plugin.ApprovalFlow.Service; + +public class ApprovalFlowItem +{ + [JsonPropertyName("nodes")] + public List Nodes { get; set; } + + [JsonPropertyName("edges")] + public List Edges { get; set; } +} + +public class ApprovalFlowNodeItem +{ + [JsonPropertyName("id")] + public string Id { get; set; } + + [JsonPropertyName("type")] + public string Type { get; set; } + + [JsonPropertyName("x")] + public float X { get; set; } + + [JsonPropertyName("y")] + public float Y { get; set; } + + [JsonPropertyName("properties")] + public FlowProperties Properties { get; set; } + + [JsonPropertyName("text")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public FlowTextItem Text { get; set; } +} + +public class ApprovalFlowEdgeItem +{ + [JsonPropertyName("id")] + public string Id { get; set; } + + [JsonPropertyName("type")] + public string Type { get; set; } + + [JsonPropertyName("sourceNodeId")] + public string SourceNodeId { get; set; } + + [JsonPropertyName("targetNodeId")] + public string TargetNodeId { get; set; } + + [JsonPropertyName("startPoint")] + public FlowEdgePointItem StartPoint { get; set; } + + [JsonPropertyName("endPoint")] + public FlowEdgePointItem EndPoint { get; set; } + + [JsonPropertyName("properties")] + public FlowProperties Properties { get; set; } + + [JsonPropertyName("text")] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public FlowTextItem Text { get; set; } + + [JsonPropertyName("pointsList")] + public List PointsList { get; set; } +} + +public class FlowProperties +{ + +} + +public class FlowTextItem +{ + [JsonPropertyName("x")] + public float X { get; set; } + + [JsonPropertyName("y")] + public float Y { get; set; } + + [JsonPropertyName("value")] + public string Value { get; set; } +} + +public class FlowEdgePointItem +{ + [JsonPropertyName("x")] + public float X { get; set; } + + [JsonPropertyName("y")] + public float Y { get; set; } +} \ No newline at end of file diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/Dto/ApprovalFormItem.cs b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/Dto/ApprovalFormItem.cs new file mode 100644 index 00000000..e80b4b1c --- /dev/null +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/ApprovalFlow/Dto/ApprovalFormItem.cs @@ -0,0 +1,27 @@ +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +using System.Text.Json.Serialization; + +namespace Admin.NET.Plugin.ApprovalFlow.Service; + +public class ApprovalFormItem +{ + [JsonPropertyName("configId")] + public string ConfigId { get; set; } + + [JsonPropertyName("tableName")] + public string TableName { get; set; } + + [JsonPropertyName("entityName")] + public string EntityName { get; set; } + + [JsonPropertyName("typeName")] + public string TypeName { get; set; } + + [JsonPropertyName("route")] + public string Route => EntityName[..1].ToLower() + EntityName[1..] + "/" + TypeName; +} \ No newline at end of file diff --git a/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/SysApproval/SysApprovalService.cs b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/SysApproval/SysApprovalService.cs new file mode 100644 index 00000000..c22a3c50 --- /dev/null +++ b/Admin.NET/Plugins/Admin.NET.Plugin.ApprovalFlow/Service/SysApproval/SysApprovalService.cs @@ -0,0 +1,74 @@ + +using Microsoft.AspNetCore.Http; + +namespace Admin.NET.Plugin.ApprovalFlow.Service; + +public class SysApprovalService : ITransient +{ + private readonly SqlSugarRepository _approvalFlowRep; + private readonly SqlSugarRepository _approvalFormRep; + + public SysApprovalService(SqlSugarRepository approvalFlowRep, SqlSugarRepository approvalFormRep) + { + _approvalFlowRep = approvalFlowRep; + _approvalFormRep = approvalFormRep; + } + + /// + /// 匹配审批流程 + /// + /// + /// + [NonAction] + public async Task MatchApproval(HttpContext context) + { + var request = context.Request; + var response = context.Response; + + var path = request.Path.ToString().Split("/"); + + var method = request.Method; + var qs = request.QueryString; + var h = request.Headers; + var b = request.Body; + + var requestHeaders = request.Headers; + var responseHeaders = response.Headers; + + var serviceName = path[1]; + if (serviceName.StartsWith("api")) + { + if (path.Length > 3) + { + var funcName = path[2]; + var typeName = path[3]; + + var list = await App.GetService().FormRoutes(); + if (list.Any(u => u.Contains(funcName) && u.Contains(typeName))) + { + var approvalFlow = new ApprovalFlowRecord + { + FormName = funcName, + CreateTime = DateTime.Now, + }; + + // 判断是否需要审批 + await _approvalFlowRep.InsertAsync(approvalFlow); + + var approvalForm = new ApprovalFormRecord + { + FlowId = approvalFlow.Id, + FormName = funcName, + FormType = typeName, + CreateTime = DateTime.Now, + }; + + // 判断是否需要审批 + await _approvalFormRep.InsertAsync(approvalForm); + } + } + } + + await Task.CompletedTask; + } +} \ No newline at end of file diff --git a/Web/src/views/approvalFlow/component/editFormDialog.vue b/Web/src/views/approvalFlow/component/editFormDialog.vue index 2758f90f..d3ded813 100644 --- a/Web/src/views/approvalFlow/component/editFormDialog.vue +++ b/Web/src/views/approvalFlow/component/editFormDialog.vue @@ -18,7 +18,7 @@ - + @@ -50,7 +50,7 @@ import { getAPI } from '/@/utils/axios-utils'; import { ApprovalFlowApi } from '/@/api-services/_approvalFlow/api'; import { ApprovalFlowOutput, UpdateApprovalFlowInput } from '/@/api-services/_approvalFlow/models'; import { SysDatabaseApi, SysCodeGenApi } from '/@/api-services/api'; -import { DbTableInfo } from '/@/api-services/models'; +import { DatabaseOutput, TableOutput } from '/@/api-services/models'; var props = defineProps({ title: { @@ -67,8 +67,9 @@ const state = reactive({ isShowDialog: false, ruleSource: {} as UpdateApprovalFlowInput, ruleForm: {} as any, - dbData: [] as any, - tableData: [] as Array, + dbData: [] as Array, + tableData: [] as Array, + tableName: "", typeData: [ { name: 'Add', @@ -131,11 +132,16 @@ const submit = async () => { // db改变 const dbChanged = async () => { if (state.ruleForm.configId === '') return; - var res = await getAPI(SysDatabaseApi).apiSysDatabaseTableListConfigIdGet(state.ruleForm.configId); state.tableData = res.data.result ?? []; }; +// table改变 +const tableChanged = (tableName: any) => { + var table = state.tableData.find((x) => x.tableName === tableName); + state.ruleForm.entityName = table?.entityName ?? ''; +}; + defineExpose({ openDialog });