Bladeren bron

Merge branch 'develop' of http://132.232.92.186:3000/XinXiBu/OA2023 into develop

yuanrf 1 week geleden
bovenliggende
commit
2282d47e0f

+ 9 - 1
OASystem/EntitySync/Program.cs

@@ -154,6 +154,14 @@ db.CodeFirst.SetStringDefaultLength(50).BackupTable().InitTables(new Type[]
     //typeof(Grp_OrderPreInfo), //团组下单前信息
     //typeof(Grp_OrderPreItem), //团组下单前信息Item
     //typeof(Grp_GroupShareFile),//团组共享文件 
-    typeof(Pm_GoodsAudit),//物品确认审核表 
+    //typeof(Pm_GoodsAudit),//物品确认审核表 
+    
+    typeof(Pm_GoodsReceiveDetails),//物品领用明细表 
+    /*审核流程相关表*/
+    typeof(Sys_AuditFlow),//审核流程表 
+    typeof(Sys_AuditRecord),//审核记录表 
+    typeof(Sys_AuditTemplate),//审核模板表 
+    typeof(Sys_AuditTemplateNode),//审核模板节点表 
+    typeof(Sys_AuditTemplateNodeUser),//审核模板节点人员表 
 }); 
 Console.WriteLine("数据库结构同步完成!");

+ 0 - 4
OASystem/OASystem.Api/Controllers/GroupsController.cs

@@ -20398,8 +20398,6 @@ AirHotelPrice
 
                 #endregion
 
-
-
                 #region 设置页眉
 
                 builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary);
@@ -20443,8 +20441,6 @@ AirHotelPrice
 
 
                 #endregion
-
-
             }
             catch (Exception ex)
             {

+ 24 - 1
OASystem/OASystem.Api/Controllers/SystemController.cs

@@ -38,6 +38,7 @@ namespace OASystem.API.Controllers
         private readonly UserAuthorityRepository _UserAuthorityRepository;
         private readonly List<int> _operationTypeList = new() { 1, 2, 3, 4, 5 }; //操作通知所属类型
         private readonly List<int> _taskTypeList = new() { 6 };//任务通知 TaskNotification
+        private readonly ApprovalProcessRepository _approvalProcessRep;
 
 
         public SystemController(
@@ -55,7 +56,8 @@ namespace OASystem.API.Controllers
             JobPostRepository jobRep,
             UserAuthorityRepository userAuthorityRepository,
             MessageRepository messageRep,
-            SetDataTypeRepository setDataTypeRep
+            SetDataTypeRepository setDataTypeRep,
+            ApprovalProcessRepository approvalProcessRep
             )
         {
             _syscomRep = syscom;
@@ -74,6 +76,7 @@ namespace OASystem.API.Controllers
             _jobRep = jobRep;
             _setDataTypeRep = setDataTypeRep;
             _config = config;
+            _approvalProcessRep = approvalProcessRep;
         }
         #region 消息
 
@@ -3238,5 +3241,25 @@ And u.UId = {0} And u.FId = 1 ", dto.UserId);
 
         #endregion
 
+        #region 审批模板
+
+
+        /// <summary>
+        /// 审批模板 - 创建模板
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> AuditTempCreate()
+        {
+            //领用-其他物品
+            //var result = await _approvalProcessRep.CreateAuditTemplate(ApprovalProcessDto.AuditTempOtherGoods());
+            //领用-贵重物品
+            var result = await _approvalProcessRep.CreateAuditTemplateAsync(ApprovalProcessDto.AuditTempValuableGoods());
+            return Ok(JsonView(result));
+        }
+
+        #endregion
+
     }
 }

+ 47 - 49
OASystem/OASystem.Api/Program.cs

@@ -134,55 +134,53 @@ builder.Services.AddScoped(options =>
             DbType = DbType.SqlServer,
             IsAutoCloseConnection = true },
     }
-    //    , db =>
-    //{
-    //    //SQL执行完
-    //    db.Aop.OnLogExecuted = (sql, pars) =>
-    //    {
-    //        //if (db.Ado.SqlExecutionTime.TotalSeconds > 1)
-    //        //{
-    //            //代码CS文件名
-    //            var fileName = db.Ado.SqlStackTrace.FirstFileName;
-    //            //代码行数
-    //            var fileLine = db.Ado.SqlStackTrace.FirstLine;
-    //            //方法名
-    //            var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName;
-
-    //            //执行完了可以输出SQL执行时间 (OnLogExecutedDelegate) 
-    //            Console.WriteLine("NowTime:" + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"));
-    //            Console.WriteLine("MethodName:" + FirstMethodName);
-    //            Console.WriteLine("ElapsedTime:" + db.Ado.SqlExecutionTime.ToString());
-    //            Console.WriteLine("ExecuteSQL:" + sql);
-
-    //        //}
-    //    };
-    //    //SQL执行前
-    //    db.Aop.OnLogExecuting = (sql, pars) => 
-    //    {
-    //        //获取原生SQL推荐 5.1.4.63  性能OK
-    //        //UtilMethods.GetNativeSql(sql, pars);
-
-    //        //获取无参数化SQL 影响性能只适合调试
-    //        //UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)
-    //    };
-    //    //SQL报错
-    //    db.Aop.OnError = (exp) =>
-    //    {
-    //        //获取原生SQL推荐 5.1.4.63  性能OK
-    //        //UtilMethods.GetNativeSql(exp.sql, exp.parameters);
-
-    //        //获取无参数SQL对性能有影响,特别大的SQL参数多的,调试使用
-    //        //UtilMethods.GetSqlString(DbType.SqlServer, exp.sql, exp.parameters);
-    //    };
-    //    //修改SQL和参数的值
-    //    db.Aop.OnExecutingChangeSql = (sql, pars) => 
-    //    {
-    //        //sql=newsql
-    //        //foreach(var p in pars) //修改
-    //        return new KeyValuePair<string, SugarParameter[]>(sql, pars);
-    //    };
-
-    //}
+    , db =>
+    {
+        //SQL执行完
+        db.Aop.OnLogExecuted = (sql, pars) =>
+        {
+            //if (db.Ado.SqlExecutionTime.TotalSeconds > 1)
+            //{
+            //代码CS文件名
+            var fileName = db.Ado.SqlStackTrace.FirstFileName;
+            //代码行数
+            var fileLine = db.Ado.SqlStackTrace.FirstLine;
+            //方法名
+            var FirstMethodName = db.Ado.SqlStackTrace.FirstMethodName;
+            //执行完了可以输出SQL执行时间 (OnLogExecutedDelegate) 
+            Console.WriteLine("NowTime:" + DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss"));
+            Console.WriteLine("MethodName:" + FirstMethodName);
+            Console.WriteLine("ElapsedTime:" + db.Ado.SqlExecutionTime.ToString());
+            Console.WriteLine("ExecuteSQL:" + sql);
+
+            //}
+        };
+        //SQL执行前
+        db.Aop.OnLogExecuting = (sql, pars) =>
+        {
+            //获取原生SQL推荐 5.1.4.63  性能OK
+            //UtilMethods.GetNativeSql(sql, pars);
+
+            //获取无参数化SQL 影响性能只适合调试
+            //UtilMethods.GetSqlString(DbType.SqlServer,sql,pars)
+        };
+        //SQL报错
+        db.Aop.OnError = (exp) =>
+        {
+            //获取原生SQL推荐 5.1.4.63  性能OK
+            //UtilMethods.GetNativeSql(exp.sql, exp.parameters);
+
+            //获取无参数SQL对性能有影响,特别大的SQL参数多的,调试使用
+            //UtilMethods.GetSqlString(DbType.SqlServer, exp.sql, exp.parameters);
+        };
+        //修改SQL和参数的值
+        db.Aop.OnExecutingChangeSql = (sql, pars) =>
+        {
+            //sql=newsql
+            //foreach(var p in pars) //修改
+            return new KeyValuePair<string, SugarParameter[]>(sql, pars);
+        };
+    }
     );
 });
 #endregion

+ 9 - 0
OASystem/OASystem.Domain/AutoMappers/_baseMappingProfile.cs

@@ -82,6 +82,13 @@ namespace OASystem.Domain.AutoMappers
             CreateMap<OperationFunInitDta, Sys_PageFunctionPermission>();
             #endregion
 
+            #region 审核流程
+
+            CreateMap<ApprovalProcessDto, Sys_AuditTemplate>();
+            CreateMap<AuditTemplateNodeView, Sys_AuditTemplateNode>();
+            CreateMap<AuditTemplateNodeUserView, Sys_AuditTemplateNodeUser>();
+
+            #endregion
             #endregion
 
             #region Group
@@ -355,6 +362,8 @@ namespace OASystem.Domain.AutoMappers
             CreateMap<GoodsReceiveOpDto, Pm_GoodsReceive>();
             CreateMap<GoodsReceiveInfoMobileView, GoodsReceiveInfoView>(); //
             CreateMap<GoodsReceiveListMobileView, GoodsReceiveListView>();
+
+            CreateMap<GoodsReceiveDetailsView, Pm_GoodsReceiveDetails>();
             #endregion
             #endregion
 

+ 65 - 0
OASystem/OASystem.Domain/Dtos/PersonnelModule/GoodsDTO.cs

@@ -345,6 +345,71 @@ namespace OASystem.Domain.Dtos.PersonnelModule
         }
     }
 
+
+    public class GoodsReceiveBatchOpDto
+    {
+        /// <summary>
+        /// ID
+        /// Id > 0 修改
+        /// Id < 1 添加
+        /// </summary>
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 团组Id
+        /// Grp_DelegationInfo Id
+        /// </summary>
+        public int GroupId { get; set; }
+
+        /// <summary>
+        /// 领用详情
+        /// </summary>
+        public GoodsReceiveDetailsView[] ReceiveDetails { get; set; }
+
+        /// <summary>
+        /// 领用原因
+        /// </summary>
+        public string? Reason { get; set; }
+
+        /// <summary>
+        /// 备注
+        /// </summary>
+        public string? Remark { get; set; }
+
+        public int CurrUserId { get; set; }
+    }
+
+    public class GoodsReceiveAuditDto
+    {
+        public int Id { get; set; }
+        public int CurrUserId { get; set; }
+    }
+
+    public class GoodsReceiveDetailsView
+    {
+        public int Id { get; set; }
+        /// <summary>
+        /// 物品领用Id
+        /// </summary>
+        public int GoodsReceiveId { get; set; }
+        /// <summary>
+        /// 物品Id
+        /// Pm_GoodsInfo Id
+        /// </summary>
+        public int GoodsId { get; set; }
+        /// <summary>
+        /// 物资入库批次信息
+        /// {storageId:1,quantity:10}
+        /// </summary>
+        public string? GoodsStorageInfo { get; set; }
+        /// <summary>
+        /// 领用数量
+        /// </summary>
+        public decimal Quantity { get; set; }
+
+    }
+
+
     /// <summary>
     /// 物品领用 Audit DTO
     /// </summary>

+ 92 - 0
OASystem/OASystem.Domain/Dtos/System/ApprovalProcessDto.cs

@@ -0,0 +1,92 @@
+using OASystem.Domain.ViewModels.System;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Dtos.System
+{
+    /// <summary>
+    /// 审核模板Dto
+    /// </summary>
+    public class ApprovalProcessDto : AuditTemplateView
+    {
+        public int CurrUserId { get; set; }
+
+        public ApprovalProcessDto() { }
+
+        /// <summary>
+        /// 物资领用-其他物品
+        /// </summary>
+        public static ApprovalProcessDto AuditTempOtherGoods()
+        {
+            var tempInfo = new ApprovalProcessDto()
+            {
+                TemplateName = $"物资进销存领用审批-其他物品模板",
+                TemplateCode = $"InvAppTplCode-001‌",
+                BusinessType = 1,
+                Status = 1,
+                CurrUserId = 208,
+                TempNodes = new List<AuditTemplateNodeView>() {
+                   new AuditTemplateNodeView(){
+                       TemplateId = 0,
+                       NodeName="前台审核",
+                       NodeOrder = 0,
+                       ApproveType=2,
+                       IsRequired=true,
+                       NodeUsers = new List<AuditTemplateNodeUserView>(){
+                            new(){ NodeId = 0 ,UserId = 374,UserName = $"罗颖" }
+                        }
+                   }
+                }
+            };
+            return tempInfo;
+        }
+
+        /// <summary>
+        /// 物资领用-贵重物品
+        /// </summary>
+        public static ApprovalProcessDto AuditTempValuableGoods()
+        {
+            var tempInfo = new ApprovalProcessDto()
+            {
+                TemplateName = $"物资进销存领用审批-贵重物品模板",
+                TemplateCode = $"InvAppTplCode-002‌",
+                BusinessType = 1,
+                Status = 1,
+                CurrUserId = 208,
+                TempNodes = new List<AuditTemplateNodeView>() {
+                   new AuditTemplateNodeView(){
+                       TemplateId = 0,
+                       NodeName = "前台审核",
+                       NodeOrder = 0,
+                       ApproveType = 2,
+                       IsRequired = true,
+                       NodeUsers = new List<AuditTemplateNodeUserView>(){
+                            new (){ NodeId = 0 ,UserId = 374,UserName = $"罗颖" }
+                        }
+                   },
+                   new AuditTemplateNodeView(){
+                       TemplateId = 0,
+                       NodeName = "人事部主管/经理审核",
+                       NodeOrder = 1,
+                       ApproveType = 2,
+                       IsRequired = true,
+                       NodeUsers = new List<AuditTemplateNodeUserView>(){
+                            new (){ NodeId = 0 ,UserId = 343,UserName = $"陈湘" }
+                       }
+                   }
+                }
+            };
+            return tempInfo;
+        }
+
+    }
+
+   
+
+
+
+    
+}

+ 38 - 0
OASystem/OASystem.Domain/Entities/PersonnelModule/Pm_GoodsReceiveDetails.cs

@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.PersonnelModule
+{
+    /// <summary>
+    /// 物品领用明细表
+    /// </summary>
+    [SugarTable(tableName: "Pm_GoodsReceiveDetails", tableDescription: "物品领用明细表")]
+    public class Pm_GoodsReceiveDetails: EntityBase
+    {
+        /// <summary>
+        /// 物品领用Id
+        /// </summary>
+        [SugarColumn(ColumnDescription = "物品领用Id", IsNullable = true, ColumnDataType = "int")]
+        public int GoodsReceiveId { get; set; }
+        /// <summary>
+        /// 物品Id
+        /// Pm_GoodsInfo Id
+        /// </summary>
+        [SugarColumn(ColumnDescription = "物品Id", IsNullable = true, ColumnDataType = "int")]
+        public int GoodsId { get; set; }
+        /// <summary>
+        /// 物资入库批次信息
+        /// {storageId:1,quantity:10}
+        /// </summary>
+        [SugarColumn(ColumnDescription = "物资入库批次信息", IsNullable = true, ColumnDataType = "varchar(200)")]
+        public string? GoodsStorageInfo { get; set; }
+        /// <summary>
+        /// 领用数量
+        /// </summary>
+        [SugarColumn(ColumnDescription = "领用数量", IsNullable = true, ColumnDataType = "decimal(8,2)")]
+        public decimal Quantity { get; set; }
+    }
+}

+ 41 - 0
OASystem/OASystem.Domain/Entities/System/Sys_AuditFlow.cs

@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.System
+{
+    /// <summary>
+    /// 审核流程表
+    /// </summary>
+    [SugarTable(tableName: "Sys_AuditFlow", tableDescription: "审核流程表")]
+    public class Sys_AuditFlow : EntityBase
+    {
+        /// <summary>
+        /// 业务ID(领用单ID)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "业务ID(领用单ID)", IsNullable = true, ColumnDataType = "int")]
+        public int BusinessId { get; set; }
+        /// <summary>
+        /// 业务类型(1-物资领用)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "业务类型(1-物资领用)", IsNullable = true, ColumnDataType = "int")]
+        public int BusinessType { get; set; }
+        /// <summary>
+        /// 模板ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "模板ID", IsNullable = true, ColumnDataType = "int")]
+        public int TemplateId { get; set; }
+        /// <summary>
+        /// 当前节点ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "当前节点ID", IsNullable = true, ColumnDataType = "int")]
+        public int CurrentNodeId { get; set; }
+        /// <summary>
+        /// 状态(0-未开始,1-审核中,2-已完成,3-已拒绝)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "状态(0-未开始,1-审核中,2-已完成,3-已拒绝)", IsNullable = true, ColumnDataType = "int")]
+        public int Status { get; set; }
+    }
+}

+ 51 - 0
OASystem/OASystem.Domain/Entities/System/Sys_AuditRecord.cs

@@ -0,0 +1,51 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.System
+{
+    /// <summary>
+    /// 审核记录表
+    /// </summary>
+    [SugarTable(tableName: "Sys_AuditRecord", tableDescription: "审核记录表")]
+    public class Sys_AuditRecord : EntityBase
+    {
+        /// <summary>
+        /// 流程ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "流程ID", IsNullable = true, ColumnDataType = "int")]
+        public int FlowId { get; set; }
+        /// <summary>
+        /// 节点ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "节点ID", IsNullable = true, ColumnDataType = "int")]
+        public int NodeId { get; set; }
+        /// <summary>
+        /// 节点名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "节点名称", IsNullable = true, ColumnDataType = "varchar(50)")]
+        public string NodeName { get; set; }
+        /// <summary>
+        /// 审核人ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审核人ID", IsNullable = true, ColumnDataType = "int")]
+        public int AuditorId { get; set; }
+        /// <summary>
+        /// 审核人姓名
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审核人姓名", IsNullable = true, ColumnDataType = "varchar(50)")]
+        public string AuditorName { get; set; }
+        /// <summary>
+        /// 审核结果(0-待审核,1-通过,2-拒绝,3-无需处理)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审核结果(0-待审核,1-通过,2-拒绝,3-无需处理)", IsNullable = true, ColumnDataType = "int")]
+        public int AuditResult { get; set; }
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审核意见", IsNullable = true, ColumnDataType = "varchar(200)")]
+        public string AuditOpinion { get; set; }
+    }
+}

+ 38 - 0
OASystem/OASystem.Domain/Entities/System/Sys_AuditTemplate.cs

@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.System
+{
+
+    /// <summary>
+    /// 审核模板表
+    /// </summary>
+    [SugarTable(tableName: "Sys_AuditTemplate", tableDescription: "审核模板表")]
+    public class Sys_AuditTemplate : EntityBase
+    {
+        /// <summary>
+        /// 模板名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "模板名称", IsNullable = true, ColumnDataType = "varchar(100)")]
+        public string TemplateName { get; set; }
+        /// <summary>
+        /// 模板编码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "模板编码", IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string TemplateCode { get; set; }
+        /// <summary>
+        /// 业务类型(1-物资领用)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "业务类型(1-物资领用)", IsNullable = true, ColumnDataType = "int")]
+        public int BusinessType { get; set; }
+
+        /// <summary>
+        /// 状态(0-禁用,1-启用)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "状态(0-禁用,1-启用)", IsNullable = true, ColumnDataType = "int")]
+        public int Status { get; set; }
+    }
+}

+ 42 - 0
OASystem/OASystem.Domain/Entities/System/Sys_AuditTemplateNode.cs

@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.System
+{
+    /// <summary>
+    ///  审核模板节点表 
+    /// </summary>
+    [SugarTable(tableName: "Sys_AuditTemplateNode", tableDescription: " 审核模板节点表")]
+    public class Sys_AuditTemplateNode : EntityBase
+    {
+        /// <summary>
+        /// 模板ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "模板ID", IsNullable = true, ColumnDataType = "int")]
+        public int TemplateId { get; set; }
+        /// <summary>
+        /// 节点名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "节点名称", IsNullable = true, ColumnDataType = "varchar(100)")]
+        public string? NodeName { get; set; }
+        /// <summary>
+        /// 节点顺序
+        /// </summary>
+        [SugarColumn(ColumnDescription = "节点顺序", IsNullable = true, ColumnDataType = "int")]
+        public int NodeOrder { get; set; } = 0;
+        /// <summary>
+        /// 审批类型(1-会签:必须所有审核人通过,2-或签:只要有一个审核人通过,整个节点就通过)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审批类型(1-会签,2-或签)", IsNullable = true, ColumnDataType = "int")]
+        public int ApproveType { get; set; } = 0;
+        /// <summary>
+        /// 是否必审
+        /// </summary>
+        [SugarColumn(ColumnDescription = "是否必审", IsNullable = true, ColumnDataType = "bit")]
+        public bool IsRequired { get; set; } 
+    }
+
+}

+ 31 - 0
OASystem/OASystem.Domain/Entities/System/Sys_AuditTemplateNodeUser.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.Entities.System
+{
+    /// <summary>
+    /// 审核模板节点人员表
+    /// </summary>
+    [SugarTable(tableName: "Sys_AuditTemplateNodeUser", tableDescription: "审核模板节点人员表")]
+    public class Sys_AuditTemplateNodeUser : EntityBase
+    {
+        /// <summary>
+        /// 审核节点Id
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审核节点Id", IsNullable = true, ColumnDataType = "int")]
+        public int NodeId { get; set; }
+        /// <summary>
+        /// 用户ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "审核人员Id", IsNullable = true, ColumnDataType = "int")]
+        public int UserId { get; set; }
+        /// <summary>
+        /// 用户姓名
+        /// </summary>
+        [SugarColumn(ColumnDescription = "用户姓名", IsNullable = true, ColumnDataType = "varchar(30)")]
+        public string UserName { get; set; }
+    }
+}

+ 1 - 1
OASystem/OASystem.Domain/Enums/GoodsAuditEnum.cs

@@ -38,7 +38,7 @@ namespace OASystem.Domain.Enums
         [Description("出库待确认")]
         OutPending,
         /// <summary>
-        /// 出库确认中
+        /// 出库确认中/确认中
         /// </summary>
         [Description("确认中")]
         OutConfirming,

+ 1 - 0
OASystem/OASystem.Domain/OASystem.Domain.csproj

@@ -17,6 +17,7 @@
 
   <ItemGroup>
     <None Include="..\.editorconfig" Link=".editorconfig" />
+    <None Include="Entities\System\Sys_AuditFlow.cs" />
   </ItemGroup>
 
   <ItemGroup>

+ 1 - 1
OASystem/OASystem.Domain/ViewModels/PersonnelModule/GoodsInfoView.cs

@@ -177,6 +177,7 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
     {
         public int Id { get; set; }
         public int GroupId { get; set; }
+        public string GroupName { get; set; }
         public int GoodsId { get; set; }
         public string GoodsName { get; set; }
         public decimal Quantity { get; set; }
@@ -203,7 +204,6 @@ namespace OASystem.Domain.ViewModels.PersonnelModule
 
     public class GoodsReceiveListMobileView : GoodsReceiveListView
     {
-        public string GroupName { get; set; }
 
         public int GoodsTypeId { get; set; }
     }

+ 99 - 0
OASystem/OASystem.Domain/ViewModels/System/ApprovalProcessView.cs

@@ -0,0 +1,99 @@
+using OASystem.Domain.Dtos.System;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace OASystem.Domain.ViewModels.System
+{
+    /// <summary>
+    /// 审核模板View
+    /// </summary>
+    public class ApprovalProcessView : AuditTemplateView
+    {
+        public int Id { get; set; }
+    }
+
+    /// <summary>
+    /// 审核流程 View
+    /// </summary>
+    public class AuditTemplateView
+    {
+        /// <summary>
+        /// 模板名称
+        /// </summary>
+        public string TemplateName { get; set; }
+        /// <summary>
+        /// 模板编码
+        /// </summary>
+        public string TemplateCode { get; set; }
+        /// <summary>
+        /// 业务类型(1-物资领用)
+        /// </summary>
+        public int BusinessType { get; set; }
+
+        /// <summary>
+        /// 状态(0-禁用,1-启用)
+        /// </summary>
+        public int Status { get; set; }
+
+        /// <summary>
+        /// 模板审核节点
+        /// </summary>
+        public List<AuditTemplateNodeView> TempNodes { get; set; }
+    }
+
+    /// <summary>
+    /// 审核流程节点
+    /// </summary>
+    public class AuditTemplateNodeView
+    {
+        public int Id { get; set; }
+        /// <summary>
+        /// 模板ID
+        /// </summary>
+        public int TemplateId { get; set; }
+        /// <summary>
+        /// 节点名称
+        /// </summary>
+        public string? NodeName { get; set; }
+        /// <summary>
+        /// 节点顺序
+        /// </summary>
+        public int NodeOrder { get; set; } = 0;
+        /// <summary>
+        /// 审批类型(1-会签:必须所有审核人通过,2-或签:只要有一个审核人通过,整个节点就通过)
+        /// </summary>
+        public int ApproveType { get; set; } = 0;
+        /// <summary>
+        /// 是否必审
+        /// </summary>
+        public bool IsRequired { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public List<AuditTemplateNodeUserView> NodeUsers { get; set; }
+    }
+
+    /// <summary>
+    /// 审核流程节点用户
+    /// </summary>
+    public class AuditTemplateNodeUserView
+    {
+        public int Id { get; set; }
+        /// <summary>
+        /// 审核节点Id
+        /// </summary>
+        public int NodeId { get; set; }
+        /// <summary>
+        /// 用户ID
+        /// </summary>
+        public int UserId { get; set; }
+        /// <summary>
+        /// 用户姓名
+        /// </summary>
+        public string UserName { get; set; }
+    }
+}

+ 0 - 2
OASystem/OASystem.Infrastructure/Repositories/Groups/DecreasePaymentsRepository.cs

@@ -282,8 +282,6 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
                         #endregion
 
-
-
                         CommitTran();
                         var data = new { ccpId = cId, sign = 1,dataId = id };
                         return new JsonView() { Code = 200, Msg = "添加成功!", Data = data };

+ 309 - 5
OASystem/OASystem.Infrastructure/Repositories/PersonnelModule/GoodsRepository.cs

@@ -1,13 +1,17 @@
 using Aspose.Cells;
 using AutoMapper;
+using EyeSoft.Collections.Generic;
 using EyeSoft.Runtime.InteropServices;
 using Newtonsoft.Json;
 using OASystem.Domain;
 using OASystem.Domain.Dtos.PersonnelModule;
+using OASystem.Domain.Dtos.System;
 using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Domain.ViewModels.PersonnelModule;
+using OASystem.Infrastructure.Repositories.System;
 using OASystem.Infrastructure.Tools;
+using System.Text.RegularExpressions;
 
 namespace OASystem.Infrastructure.Repositories.PersonnelModule
 {
@@ -22,7 +26,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
         private string _url;
         private string _excelPath;
         private List<int> _goodsTypeIds; //多部门审核物品类型Id     
-        public GoodsRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
+        private readonly ApprovalProcessRepository _approvalProcessRep;
+        public GoodsRepository(SqlSugarClient sqlSugar, IMapper mapper, ApprovalProcessRepository approvalProcessRep) : base(sqlSugar)
         {
             _mapper = mapper;
             _jv = new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = "操作失败!" };
@@ -35,6 +40,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
             _goodsTypeIds = new List<int>() {
                 1423, //1423	贵重物品
             };
+            _approvalProcessRep = approvalProcessRep;
         }
 
         /// <summary>
@@ -43,7 +49,6 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
         /// <returns></returns>
         public async Task<JsonView> InitDataSource()
         {
-
             var typeData = await _sqlSugar.Queryable<GoodsTypeView>()
                 .Includes(x => x.SubTypeItems.Where(z => z.IsDel == 0)
                 //.Select(z => new {
@@ -1182,6 +1187,17 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 hrAuditPer = true;
             }
 
+            if (currUserId == 343) //陈湘OAId登录 只显示贵重物品审核信息
+            {
+                if (_goodsTypeIds.Any())
+                {
+                    var newArray = typeLabel.ToList();
+                    newArray.AddRange(_goodsTypeIds);
+                    typeLabel = newArray.ToArray();
+                }
+            }
+
+
             var beginBool = DateTime.TryParse(!string.IsNullOrEmpty(dto.BeginDt) ? $"{dto.BeginDt} 00:00:00" : string.Empty, out var begin);
             var endBool = DateTime.TryParse(!string.IsNullOrEmpty(dto.EndDt) ? $"{dto.EndDt} 00:00:00" : string.Empty, out var end);
 
@@ -1201,7 +1217,7 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
                 .WhereIF(isAllGroups, (gr, gi, sd, u1, u2, di) => gr.GroupId > 0)
                 .WhereIF(!isAllGroups && groupLabel.Length > 0, (gr, gi, sd, u1, u2, di) => groupLabel.Contains(gr.GroupId))
                 .WhereIF(beginBool && endBool, (gr, gi, sd, u1, u2, di) => gr.CreateTime >= begin && gr.CreateTime <= end)
-                .WhereIF(hrAuditPer, (gr, gi, sd, u1, u2, di) => _goodsTypeIds.Contains(gi.Type))
+                //.WhereIF((string.IsNullOrEmpty(dto.GoodsName) || !isAllGroups) && hrAuditPer, (gr, gi, sd, u1, u2, di) => _goodsTypeIds.Contains(gi.Type))
                 .Select((gr, gi, sd, u1, u2, di) => new GoodsReceiveListMobileView
                 {
                     Id = gr.Id,
@@ -1425,8 +1441,8 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
 
             if (isAuditPer)
             {
-                    goodsAuditInfos.Add(goodsAuditInfo2);
-                    stringBuilder.Append($"人事部:状态:待确认  审核人:-  审核时间:-;<br/>");
+                goodsAuditInfos.Add(goodsAuditInfo2);
+                stringBuilder.Append($"人事部:状态:待确认  审核人:-  审核时间:-;<br/>");
             }
 
             info.StatusDesc = stringBuilder.ToString();
@@ -2790,5 +2806,293 @@ namespace OASystem.Infrastructure.Repositories.PersonnelModule
 
             return _jv;
         }
+
+
+        #region New 物品领用、审核
+
+        /// <summary>
+        /// 物品领用 可批量 OP(Add Or Edit)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="currUserId"></param>
+        /// <returns></returns>
+        public async Task<JsonView> GoodsReceiveBatchOp(GoodsReceiveBatchOpDto dto)
+        {
+            var goodsReceiveId = dto.Id;
+            var currUserId = dto.CurrUserId;
+            //请求参数处理
+            var receiveInfo = new Pm_GoodsReceive()
+            {
+                Id = goodsReceiveId,
+                GroupId = dto.GroupId,
+                Reason = dto.Reason,
+                AuditStatus = GoodsAuditEnum.Pending,
+                CreateUserId = currUserId,
+            };
+            var receiveDetails = _mapper.Map<Pm_GoodsReceiveDetails[]>(dto.ReceiveDetails);
+            //receiveDetails.ForEach(x => { x.CreateUserId = dto.CurrUserId; });
+
+            _sqlSugar.BeginTran();
+
+
+            //审核状态验证 false:其他物品 true:贵重物品
+            var isBatchVail = false;
+
+            //物品库存验证
+            int goodsIndex = 1;
+            foreach (var item in receiveDetails)
+            {
+                item.CreateUserId = currUserId;
+                int goodsId = item.GoodsId;
+                //物品验证
+                var goodsInfo = _sqlSugar.Queryable<Pm_GoodsInfo>().First(x => x.IsDel == 0 && x.Id == goodsId);
+                if (goodsInfo == null)
+                {
+                    _jv.Msg = $"第{goodsIndex}项物品不存在!";
+                    _sqlSugar.RollbackTran();
+                    return _jv;
+                }
+
+                //物品库存验证
+                var stockQuantity = goodsInfo.StockQuantity;
+                var awaitAuditQuantity = await GoodsAwaitQuantity(goodsId);
+                stockQuantity -= awaitAuditQuantity;
+                if (item.Quantity > stockQuantity)
+                {
+                    _jv.Msg = $"“{goodsInfo.Name}”物品库存不足!剩余库存:{stockQuantity} {goodsInfo.Unit}(含待审数量:{awaitAuditQuantity});";
+                    _sqlSugar.RollbackTran();
+                    return _jv;
+                }
+
+                //物品类型验证
+                if (_goodsTypeIds.Contains(goodsInfo.Type)) isBatchVail = true;
+
+                goodsIndex++;
+            }
+
+            //验证领用 添加OR编辑
+            var goodsReceiveInfo = await _sqlSugar.Queryable<Pm_GoodsReceive>().FirstAsync(x => x.IsDel == 0 && x.Id == goodsReceiveId);
+            if (goodsReceiveInfo == null) //添加
+            {
+                goodsReceiveId = await _sqlSugar.Insertable(receiveInfo).ExecuteReturnIdentityAsync();
+                if (goodsReceiveId < 1)
+                {
+                    _jv.Msg = $"领用添加失败!";
+                    _sqlSugar.RollbackTran();
+                    return _jv;
+                }
+
+                receiveDetails.ForEach(x => { x.GoodsReceiveId = goodsReceiveId; });
+
+                var receiveDetailsStatus = await _sqlSugar.Insertable(receiveDetails).ExecuteCommandAsync();
+                if (receiveDetailsStatus < 1)
+                {
+                    _jv.Msg = $"领用明细添加失败!";
+                    _sqlSugar.RollbackTran();
+                    return _jv;
+                }
+            }
+            else //修改
+            {
+                //更改前状态验证
+                if (goodsReceiveInfo.AuditStatus != GoodsAuditEnum.Pending)
+                {
+                    _jv.Msg = $"领用状态在“领用待确认”,即可修改!";
+                    _sqlSugar.RollbackTran();
+                    return _jv;
+                }
+
+                var receiveStatus = await _sqlSugar.Updateable(receiveInfo).ExecuteCommandAsync();
+
+                if (receiveStatus < 1)
+                {
+                    _jv.Msg = $"领用更新失败!";
+                    _sqlSugar.RollbackTran();
+                    return _jv;
+                }
+
+                //删除旧数据
+                var delStatus = await _sqlSugar.Updateable<Pm_GoodsReceiveDetails>()
+                    .SetColumns(x => new Pm_GoodsReceiveDetails()
+                    {
+                        IsDel = 1,
+                        DeleteUserId = currUserId,
+                        DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+                    })
+                    .Where(x => x.GoodsReceiveId == goodsReceiveId)
+                    .ExecuteCommandAsync();
+
+                if (delStatus < 1)
+                {
+                    _jv.Msg = $"领用明细旧数据删除失败!";
+                    _sqlSugar.RollbackTran();
+                    return _jv;
+                }
+
+                //添加新明细数据
+                if (receiveDetails.Any())
+                {
+                    var addStatus = await _sqlSugar.Insertable(receiveDetails).ExecuteCommandAsync();
+                    if (addStatus < 1)
+                    {
+                        _jv.Msg = $"领用明细更新失败!";
+                        _sqlSugar.RollbackTran();
+                        return _jv;
+                    }
+                }
+            }
+
+            //审核验证 物品含有贵重物品 使用贵重物品审批流程
+            var auditTempInfo = new ApprovalProcessView();
+            if (isBatchVail)  //贵重物品审核模板
+            {
+                auditTempInfo = await _approvalProcessRep.GetTemplateByBusinessTypeAsync(3);
+            }
+            else //其他物品审核模板
+            {
+                auditTempInfo = await _approvalProcessRep.GetTemplateByBusinessTypeAsync(2);
+            }
+
+            if (auditTempInfo == null)
+            {
+                _jv.Msg = $"未配置审核模板!";
+                _sqlSugar.RollbackTran();
+                return _jv;
+            }
+
+            if (auditTempInfo == null && !auditTempInfo.TempNodes.Any())
+            {
+                _jv.Msg = $"审核模板未配置节点!";
+                _sqlSugar.RollbackTran();
+                return _jv;
+            }
+
+            //创建审核流程
+            var firstNode = auditTempInfo.TempNodes.OrderBy(x => x.NodeOrder).First();
+
+            var flow = await _approvalProcessRep.GetFlowByBusinessAsync(goodsReceiveId,1);
+
+            int flowId;
+            if (flow == null)
+            {
+                flow = new Sys_AuditFlow()
+                {
+                    BusinessId = goodsReceiveId,
+                    BusinessType = 1,
+                    TemplateId = auditTempInfo.Id,
+                    CurrentNodeId = firstNode.Id,
+                    Status = 1,
+                };
+
+                flowId = await _sqlSugar.Insertable(flow).ExecuteReturnIdentityAsync();
+                if (flowId < 1)
+                {
+                    _jv.Msg = $"审核流程添加失败!";
+                    _sqlSugar.RollbackTran();
+                    return _jv;
+                }
+            }
+            else flowId = flow.Id;
+
+            //获取第一个节点的审核人员
+            var nodeUsers = firstNode.NodeUsers;
+
+            //创建审核记录
+            var records = nodeUsers.Select(user => new Sys_AuditRecord
+            {
+                FlowId = flowId,
+                NodeId = firstNode.Id,
+                NodeName = firstNode.NodeName,
+                AuditorId = user.UserId,
+                AuditorName = user.UserName,
+                AuditResult = 0, // 审核中
+            }).ToList();
+
+            var recordStatus = await _sqlSugar.Insertable(records).ExecuteCommandAsync();
+            if (recordStatus < 1)
+            {
+                _jv.Msg = $"审核记录创建失败!";
+                _sqlSugar.RollbackTran();
+                return _jv;
+            }
+            _sqlSugar.CommitTran();
+            return _jv;
+        }
+
+        /// <summary>
+        /// 物品领用 审核
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="currUserId"></param>
+        /// <returns></returns>
+        public async Task<JsonView> GoodsReceiveAudit(GoodsReceiveAuditDto dto)
+        {
+            var appId = dto.Id;
+            var currUserId = dto.CurrUserId;
+
+            //验证审核流程
+            var flowInfo = await _approvalProcessRep.GetFlowByBusinessAsync(appId,1);
+            if (flowInfo == null)
+            {
+                _jv.Msg = $"审核流程不存在";
+                return _jv;
+            }
+
+
+
+            return _jv;
+        }
+
+
+        /// <summary>
+        /// 物品待审核数量
+        /// </summary>
+        /// <param name="goodsId"></param>
+        /// <returns></returns>
+        public async Task<decimal> GoodsAwaitQuantity(int goodsId)
+        {
+            decimal quantity = 0.00M;
+            //单条领用 待审核、确认中 物品数量
+            var waitAuditQuantity = await _sqlSugar.Queryable<Pm_GoodsReceive>().Where(x => x.IsDel == 0 &&
+                            x.GoodsId == goodsId &&
+                            (x.AuditStatus == GoodsAuditEnum.Pending || x.AuditStatus == GoodsAuditEnum.OutConfirming)
+                ).SumAsync(x => x.Quantity);
+
+            //批量领用 待审核、确认中 物品数量 
+            var waitAuditBatchQuantity = await _sqlSugar.Queryable<Pm_GoodsReceive>()
+                .InnerJoin<Pm_GoodsReceiveDetails>((gr, grd) => gr.Id == grd.GoodsReceiveId)
+                .Where((gr, grd) => gr.IsDel == 0 &&
+                                    (gr.AuditStatus == GoodsAuditEnum.Pending || gr.AuditStatus == GoodsAuditEnum.OutConfirming) &&
+                                    grd.GoodsId == goodsId
+                )
+                .Select((gr, grd) => new
+                {
+                    grd.GoodsReceiveId,
+                    gr.AuditStatus,
+                    grd.Quantity
+                })
+                .SumAsync(x => x.Quantity);
+
+            quantity = waitAuditQuantity + waitAuditBatchQuantity;
+
+            return quantity;
+        }
+
+        /// <summary>
+        /// 更改领用状态
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="status"></param>
+        /// <returns></returns>
+        public async Task<bool> UpdateStatusAsync(int id, GoodsAuditEnum status)
+        {
+            return await _sqlSugar.Updateable<Pm_GoodsReceive>()
+                .SetColumns(x => x.AuditStatus == status)
+                .Where(x => x.Id == id)
+                .ExecuteCommandHasChangeAsync();
+        }
+
+
+        #endregion
     }
 }

+ 136 - 0
OASystem/OASystem.Infrastructure/Repositories/System/ApprovalProcessRepository.cs

@@ -0,0 +1,136 @@
+using AutoMapper;
+using OASystem.Domain.Dtos.Groups;
+using OASystem.Domain.Dtos.System;
+using OASystem.Domain.Entities.Groups;
+
+namespace OASystem.Infrastructure.Repositories.System
+{
+    /// <summary>
+    /// 审核流程 仓储
+    /// </summary>
+    public class ApprovalProcessRepository : BaseRepository<Sys_AuditFlow, Sys_AuditFlow>
+    {
+        private readonly IMapper _mapper;
+        public ApprovalProcessRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
+        {
+            _mapper = mapper;
+        }
+
+        /// <summary>
+        /// 创建审核流程模板
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<bool> CreateAuditTemplateAsync(ApprovalProcessDto dto)
+        {
+            var currUserId = dto.CurrUserId;
+            var auditTemp = new Sys_AuditTemplate()
+            {
+                TemplateName = dto.TemplateName,
+                TemplateCode = dto.TemplateCode,
+                BusinessType = dto.BusinessType,
+                Status = dto.Status,
+            };
+
+            _sqlSugar.BeginTran();
+
+            var tempId = await _sqlSugar.Insertable(auditTemp).ExecuteReturnIdentityAsync();
+            if (tempId < 1)
+            {
+                _sqlSugar.RollbackTran();
+                return false;
+            }
+
+            foreach (var item in dto.TempNodes)
+            {
+                var auditTempNodes = _mapper.Map<Sys_AuditTemplateNode>(item);
+                auditTempNodes.TemplateId = tempId;
+                auditTempNodes.CreateUserId = currUserId;
+
+                var nodeId = await _sqlSugar.Insertable(auditTempNodes).ExecuteReturnIdentityAsync();
+                if (nodeId < 1)
+                {
+                    _sqlSugar.RollbackTran();
+                    return false;
+                }
+
+                var nodeUsers = _mapper.Map<List<Sys_AuditTemplateNodeUser>>(item.NodeUsers);
+                nodeUsers.ForEach(x =>
+                {
+                    x.NodeId = nodeId;
+                    x.CreateUserId = currUserId;
+                });
+                if (nodeUsers.Any())
+                {
+                    var nodeUsersStatus = await _sqlSugar.Insertable(nodeUsers).ExecuteCommandAsync();
+                    if (nodeUsersStatus < 1)
+                    {
+                        _sqlSugar.RollbackTran();
+                        return false;
+                    }
+                }
+            }
+            _sqlSugar.CommitTran();
+            return true;
+        }
+
+        /// <summary>
+        /// 获取审核流程模板
+        /// </summary>
+        /// <param name="auditTempId"></param>
+        /// <returns></returns>
+        public async Task<ApprovalProcessView> GetTemplateByBusinessTypeAsync(int auditTempId)
+        {
+            var tempInfo = new ApprovalProcessView();
+
+            var auditTempInfo = await _sqlSugar.Queryable<Sys_AuditTemplate>()
+                .FirstAsync(x => x.Id == auditTempId && x.IsDel == 0);
+            if (auditTempInfo == null) return tempInfo;
+            tempInfo.Id = auditTempInfo.Id;
+            tempInfo.TemplateName = auditTempInfo.TemplateName;
+            tempInfo.BusinessType = auditTempInfo.BusinessType;
+            tempInfo.Status = auditTempInfo.Status;
+
+            var nodes = await _sqlSugar.Queryable<Sys_AuditTemplateNode>()
+                .Where(x => x.TemplateId == auditTempId && x.IsDel == 0)
+                .Select(x => new AuditTemplateNodeView()
+                {
+                    Id = x.Id,
+                    TemplateId = x.TemplateId,
+                    NodeName = x.NodeName,
+                    NodeOrder = x.NodeOrder,
+                    ApproveType = x.ApproveType,
+                    IsRequired = x.IsRequired
+                })
+                .OrderBy(x => x.NodeOrder)
+                .ToListAsync();
+            foreach (var node in nodes)
+            {
+                node.NodeUsers = await _sqlSugar.Queryable<Sys_AuditTemplateNodeUser>()
+                    .Where(x => x.NodeId == node.Id && x.IsDel == 0)
+                    .Select(x => new AuditTemplateNodeUserView()
+                    {
+                        Id = x.Id,
+                        NodeId = x.NodeId,
+                        UserId = x.UserId,
+                        UserName = x.UserName
+                    })
+                    .ToListAsync();
+            }
+            tempInfo.TempNodes = nodes;
+            return tempInfo;
+        }
+
+        /// <summary>
+        /// 获取审核流程
+        /// </summary>
+        /// <param name="auditTempId"></param>
+        /// <returns></returns>
+        public async Task<Sys_AuditFlow> GetFlowByBusinessAsync(int businessId, int businessType)
+        {
+            return await _sqlSugar.Queryable<Sys_AuditFlow>()
+                .FirstAsync(x => x.IsDel == 0 && x.BusinessId == businessId && x.BusinessType == businessType);
+        }
+
+    }
+}