Explorar o código

团组总览进程
1. 更新节点状态 接口代码编写

Lyyyi hai 10 horas
pai
achega
e9444e422c

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

@@ -28410,6 +28410,24 @@ WHERE
             return Ok(JsonView(false, res.Msg));
         }
 
+        /// <summary>
+        /// 团组总览进程 - 更新节点状态
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost]
+        [ProducesResponseType(typeof(JsonView), StatusCodes.Status200OK)]
+        public async Task<IActionResult> GroupProcessUpdateNodeStatus(GroupProcessUpdateNodeStatusDto dto)
+        {
+            var res = await _processOverviewRep.UpdateNodeStatusAsync(dto.NodeId,dto.CurrUserId);
+
+            if (res.Code == StatusCodes.Status200OK)
+            {
+                return Ok(JsonView(res.Data));
+            }
+
+            return Ok(JsonView(false, res.Msg));
+        }
+
         #endregion
 
         /// <summary>

+ 7 - 0
OASystem/OASystem.Domain/Dtos/Groups/VisaProcessDtos.cs

@@ -57,4 +57,11 @@ namespace OASystem.Domain.Dtos.Groups
 
         public int CurrUserId { get; set; }
     }
+
+
+    public class GroupProcessUpdateNodeStatusDto {
+
+        public int NodeId { get; set; }
+        public int CurrUserId { get; set; }
+    }
 }

+ 139 - 62
OASystem/OASystem.Domain/Entities/Groups/Grp_ProcessOverview.cs

@@ -1,12 +1,7 @@
 using AutoMapper.Configuration.Annotations;
 using Newtonsoft.Json;
 using OASystem.Domain.Enums;
-using System;
-using System.Collections.Generic;
 using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 
 namespace OASystem.Domain.Entities.Groups
 {
@@ -37,7 +32,7 @@ namespace OASystem.Domain.Entities.Groups
         /// <summary>
         /// 整体状态 
         /// </summary>
-        [SugarColumn(ColumnName = "OverallStatus", ColumnDescription = "流程整体状态",ColumnDataType = "int")]
+        [SugarColumn(ColumnName = "OverallStatus", ColumnDescription = "流程整体状态", ColumnDataType = "int")]
         public ProcessStatus OverallStatus { get; set; } = ProcessStatus.UnStarted;
 
         /// <summary>
@@ -83,31 +78,25 @@ namespace OASystem.Domain.Entities.Groups
         public static List<Grp_ProcessOverview> ProcessInit(int groupId, int currUserId, List<string> visaCountries)
         {
             //单独处理签证流程节点
-            var visaDefualtNodes = new List<VisaNode>() {
-                new(){NodeOrder = 1, NodeName = "收集资料",IsHandle = false,HandleTime = "" },
-                new(){NodeOrder = 2, NodeName = "取护照资料",IsHandle = false,HandleTime = "" },
-                new(){NodeOrder = 3, NodeName = "填资料",IsHandle = false,HandleTime = "" },
-                new(){NodeOrder = 4, NodeName = "送签",IsHandle = false,HandleTime = "" },
-                new(){NodeOrder = 5, NodeName = "出签+取护照",IsHandle = false,HandleTime = "" },
-                new(){NodeOrder = 6, NodeName = "归还护照",IsHandle = false,HandleTime = "",Returner="" }
-            };
-
             var visaNodes = new List<Grp_ProcessNode>();
 
             if (visaCountries != null && visaCountries.Count > 0)
             {
-                for (int i = 0; i < visaCountries.Count; i++)
+                var visaDefualtNodes = new List<VisaProcessNode>();
+                for (int i = 1; i < visaCountries.Count + 1; i++)
                 {
-                    visaNodes.Add(new Grp_ProcessNode()
-                    {
-                        NodeOrder = i,
-                        NodeName = visaCountries[i].ToString(),
-                        OverallStatus = ProcessStatus.UnStarted,
-                        IsCurrent = i == 1,
-                        CreateUserId = currUserId,
-                        Remark = JsonConvert.SerializeObject(visaDefualtNodes)
-                    });
+                    visaDefualtNodes.Add(VisaProcessNode.Info(i, visaCountries[i - 1].ToString()));
                 }
+
+                visaNodes.Add(new Grp_ProcessNode()
+                {
+                    NodeOrder = 1,
+                    NodeName = "签证流程",
+                    OverallStatus = ProcessStatus.InProgress,
+                    IsCurrent = true,
+                    CreateUserId = currUserId,
+                    Remark = JsonConvert.SerializeObject(visaDefualtNodes)
+                });
             }
 
             return new List<Grp_ProcessOverview>
@@ -118,17 +107,17 @@ namespace OASystem.Domain.Entities.Groups
                     GroupId = groupId,
                     ProcessOrder = 1,
                     ProcessType = GroupProcessType.Invitation,
-                    OverallStatus = ProcessStatus.UnStarted,
+                    OverallStatus = ProcessStatus.InProgress,
                     StartTime = DateTime.Now,
                     UpdatedUserId = currUserId,
                     CreateUserId = currUserId,
                     Nodes = new List<Grp_ProcessNode>()
-                {
-                    new(){NodeOrder = 1, NodeName="报批资料准备", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
-                    new(){NodeOrder = 2, NodeName="开始报批", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
-                    new(){NodeOrder = 3, NodeName="报批中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
-                    new(){NodeOrder = 4, NodeName="报批已出", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId }
-                }
+                    {
+                        new(){NodeOrder = 1, NodeName="报批资料准备", OverallStatus=ProcessStatus.InProgress, IsCurrent=true,CreateUserId = currUserId },
+                        new(){NodeOrder = 2, NodeName="开始报批", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                        new(){NodeOrder = 3, NodeName="报批中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                        new(){NodeOrder = 4, NodeName="报批已出", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId }
+                    }
                 },
 
                 //签证流程
@@ -137,7 +126,7 @@ namespace OASystem.Domain.Entities.Groups
                     GroupId = groupId,
                     ProcessOrder = 2,
                     ProcessType = GroupProcessType.Visa,
-                    OverallStatus = ProcessStatus.UnStarted,
+                    OverallStatus = ProcessStatus.InProgress,
                     StartTime = DateTime.Now,
                     UpdatedUserId = currUserId,
                     CreateUserId = currUserId,
@@ -150,15 +139,15 @@ namespace OASystem.Domain.Entities.Groups
                     GroupId = groupId,
                     ProcessOrder = 3,
                     ProcessType = GroupProcessType.AirTicket,
-                    OverallStatus = ProcessStatus.UnStarted,
+                    OverallStatus = ProcessStatus.InProgress,
                     StartTime = DateTime.Now,
                     UpdatedUserId = currUserId,
                     CreateUserId = currUserId,
                     Nodes = new List<Grp_ProcessNode>()
-                {
-                    new(){NodeOrder = 1, NodeName="机票占位中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
-                    new(){NodeOrder = 2, NodeName="机票已出", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
-                }
+                    {
+                        new(){NodeOrder = 1, NodeName="机票占位中", OverallStatus=ProcessStatus.InProgress, IsCurrent=true,CreateUserId = currUserId },
+                        new(){NodeOrder = 2, NodeName="机票已出", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                    }
                 },
 
                 //酒店流程
@@ -167,13 +156,13 @@ namespace OASystem.Domain.Entities.Groups
                     GroupId = groupId,
                     ProcessOrder = 4,
                     ProcessType = GroupProcessType.Hotel,
-                    OverallStatus = ProcessStatus.UnStarted,
+                    OverallStatus = ProcessStatus.InProgress,
                     StartTime = DateTime.Now,
                     UpdatedUserId = currUserId,
                     CreateUserId = currUserId,
                     Nodes = new List<Grp_ProcessNode>()
                 {
-                    new(){NodeOrder = 1, NodeName="酒店占房中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
+                    new(){NodeOrder = 1, NodeName="酒店占房中", OverallStatus=ProcessStatus.InProgress, IsCurrent=true,CreateUserId = currUserId },
                     new(){NodeOrder = 2, NodeName="酒店已订", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
                 }
                 },
@@ -184,16 +173,16 @@ namespace OASystem.Domain.Entities.Groups
                     GroupId = groupId,
                     ProcessOrder = 5,
                     ProcessType = GroupProcessType.LocalGuide,
-                    OverallStatus = ProcessStatus.UnStarted,
+                    OverallStatus = ProcessStatus.InProgress,
                     StartTime = DateTime.Now,
                     UpdatedUserId = currUserId,
                     CreateUserId = currUserId,
                     Nodes = new List<Grp_ProcessNode>()
-                {
-                    new(){NodeOrder = 1, NodeName="地接对接中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
-                    new(){NodeOrder = 2, NodeName="地接已安排好", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
-                    new(){NodeOrder = 2, NodeName="出行物资准备完毕", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
-                }
+                    {
+                        new(){NodeOrder = 1, NodeName="地接对接中", OverallStatus=ProcessStatus.InProgress, IsCurrent=true,CreateUserId = currUserId },
+                        new(){NodeOrder = 2, NodeName="地接已安排好", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                        new(){NodeOrder = 2, NodeName="出行物资准备完毕", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                    }
                 },
 
                 //费用结算流程
@@ -202,15 +191,15 @@ namespace OASystem.Domain.Entities.Groups
                     GroupId = groupId,
                     ProcessOrder = 6,
                     ProcessType = GroupProcessType.FeeSettle,
-                    OverallStatus = ProcessStatus.UnStarted,
+                    OverallStatus = ProcessStatus.InProgress,
                     StartTime = DateTime.Now,
                     UpdatedUserId = currUserId,
                     CreateUserId = currUserId,
                     Nodes = new List<Grp_ProcessNode>()
-                {
-                    new(){NodeOrder = 1, NodeName="费用结算中", OverallStatus=ProcessStatus.UnStarted, IsCurrent=true,CreateUserId = currUserId },
-                    new(){NodeOrder = 2, NodeName="费用结算完毕", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
-                }
+                    {
+                        new(){NodeOrder = 1, NodeName="费用结算中", OverallStatus=ProcessStatus.InProgress, IsCurrent=true,CreateUserId = currUserId },
+                        new(){NodeOrder = 2, NodeName="费用结算完毕", OverallStatus=ProcessStatus.UnStarted, IsCurrent=false,CreateUserId = currUserId },
+                    }
                 }
             };
         }
@@ -238,7 +227,7 @@ namespace OASystem.Domain.Entities.Groups
         /// 节点顺序 
         /// </summary>
         [SugarColumn(ColumnName = "NodeOrder", ColumnDescription = "节点顺序", ColumnDataType = "int")]
-        public int NodeOrder { get; set; } 
+        public int NodeOrder { get; set; }
 
         /// <summary>
         /// 节点状态 
@@ -280,32 +269,120 @@ namespace OASystem.Domain.Entities.Groups
     }
 
 
-    public class VisaNode
+    public class VisaProcessNode
     {
         /// <summary>
-        /// 节点顺序
+        /// 国家名称
         /// </summary>
-        public int NodeOrder { get; set; }
+        public string CountryName { get; set; }
 
         /// <summary>
-        /// 节点名称
+        /// 序号
         /// </summary>
-        public string NodeName { get; set; }
+        public int OrderNo { get; set; }
+
+        /// <summary>
+        /// 收集资料 - 节点名称
+        /// </summary>
+        public string NodeName1 { get; set; } = "收集资料";
 
         /// <summary>
-        /// 是否办理
+        /// 收集资料 - 是否办理
         /// </summary>
-        public bool IsHandle { get; set; }
+        public bool IsHandle1 { get; set; } = false;
 
         /// <summary>
-        /// 办理时间
+        /// 收集资料 - 办理时间
         /// </summary>
-        public string HandleTime { get; set; }
+        public string HandleTime1 { get; set; } = "";
+
+        /// <summary>
+        /// 取护照资料 - 节点名称
+        /// </summary>
+        public string NodeName2 { get; set; } = "取护照资料";
+
+        /// <summary>
+        /// 取护照资料 - 是否办理
+        /// </summary>
+        public bool IsHandle2 { get; set; } = false;
+
+        /// <summary>
+        /// 取护照资料 - 办理时间
+        /// </summary>
+        public string HandleTime2 { get; set; } = "";
+
+        /// <summary>
+        /// 填资料 - 节点名称
+        /// </summary>
+        public string NodeName3 { get; set; } = "填资料";
+
+        /// <summary>
+        /// 填资料 - 是否办理
+        /// </summary>
+        public bool IsHandle3 { get; set; } = false;
+
+        /// <summary>
+        /// 填资料 - 办理时间
+        /// </summary>
+        public string HandleTime3 { get; set; } = "";
+
+        /// <summary>
+        /// 送签 - 节点名称
+        /// </summary>
+        public string NodeName4 { get; set; } = "送签";
+
+        /// <summary>
+        /// 送签 - 是否办理
+        /// </summary>
+        public bool IsHandle4 { get; set; } = false;
+
+        /// <summary>
+        /// 送签 - 办理时间
+        /// </summary>
+        public string HandleTime4 { get; set; } = "";
+
+        /// <summary>
+        /// 出签+取护照 - 节点名称
+        /// </summary>
+        public string NodeName5 { get; set; } = "签+取护照";
+
+        /// <summary>
+        /// 出签+取护照 - 是否办理
+        /// </summary>
+        public bool IsHandle5 { get; set; } = false;
+
+        /// <summary>
+        /// 出签+取护照 - 办理时间
+        /// </summary>
+        public string HandleTime5 { get; set; } = "";
+
+        /// <summary>
+        /// 归还护照 - 节点名称
+        /// </summary>
+        public string NodeName6 { get; set; } = "归还护照";
+
+        /// <summary>
+        /// 归还护照 - 是否办理
+        /// </summary>
+        public bool IsHandle6 { get; set; } = false;
+
+        /// <summary>
+        /// 归还护照 - 办理时间
+        /// </summary>
+        public string HandleTime6 { get; set; } = "";
 
         /// <summary>
         /// 归还人
         /// NodeName = "归还护照" 时使用
         /// </summary>
-        public string Returner { get; set; }
+        public string Returner { get; set; } = "";
+
+        public VisaProcessNode() { }
+
+        public static VisaProcessNode Info(int orderNo, string countryName)
+        {
+
+            return new VisaProcessNode() { OrderNo = orderNo, CountryName = countryName };
+        }
     }
 }

+ 39 - 0
OASystem/OASystem.Domain/Result.cs

@@ -21,6 +21,45 @@ namespace OASystem.Domain
         }
     }
 
+    /// <summary>
+    /// 业务异常基类
+    /// </summary>
+    public class BusinessException : Exception
+    {
+        /// <summary>
+        /// 错误代码
+        /// </summary>
+        public int Code { get; set; }
+
+        /// <summary>
+        /// 错误详情
+        /// </summary>
+        public object Data { get; set; }
+
+        public BusinessException(string message) : base(message)
+        {
+            Code = 400;
+        }
+
+        public BusinessException(int code, string message) : base(message)
+        {
+            Code = code;
+        }
+
+        public BusinessException(string message, object details) : base(message)
+        {
+            Code = 400;
+            Data = details;
+        }
+
+        public BusinessException(int code, string message, object details) : base(message)
+        {
+            Code = code;
+            Data = details;
+        }
+    }
+
+
     /// <summary>
     /// 公共静态数据
     /// </summary>

+ 163 - 13
OASystem/OASystem.Infrastructure/Repositories/Groups/ProcessOverviewRepository.cs

@@ -29,7 +29,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
         /// </summary>
         /// <param name="request">创建流程请求参数</param>
         /// <returns>创建的流程信息</returns>
-        public async Task<Result> ProcessInitAsync(int groupId,int currUserId)
+        public async Task<Result> ProcessInitAsync(int groupId, int currUserId)
         {
             //团组验证
             var groupInfo = await _sqlSugar.Queryable<Grp_DelegationInfo>().FirstAsync(g => g.Id == groupId);
@@ -49,7 +49,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
             var visaCountries = _groupRep.GroupSplitCountry(groupInfo.VisitCountry);
 
             // 定义默认的流程节点
-            var processs = Grp_ProcessOverview.ProcessInit(groupId,currUserId,visaCountries);
+            var processs = Grp_ProcessOverview.ProcessInit(groupId, currUserId, visaCountries);
 
             _sqlSugar.BeginTran();
 
@@ -57,7 +57,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
             {
                 var processId = await _sqlSugar.Insertable(item).ExecuteReturnIdentityAsync();
 
-                if (processId < 1 )
+                if (processId < 1)
                 {
                     _sqlSugar.RollbackTran();
                     return new Result { Code = 400, Msg = "团组流程进度总览表添加失败!" };
@@ -68,10 +68,10 @@ namespace OASystem.Infrastructure.Repositories.Groups
                     ProcessId = processId,
                     NodeName = nodeDto.NodeName,
                     NodeOrder = nodeDto.NodeOrder,
-                    OverallStatus = ProcessStatus.UnStarted,
+                    OverallStatus = nodeDto.OverallStatus,
                     //Country = nodeDto.Country,
                     IsCurrent = nodeDto.IsCurrent,
-                    Remark =nodeDto.Remark
+                    Remark = nodeDto.Remark
                 }).ToList();
 
                 var nodeIds = await _sqlSugar.Insertable(nodes).ExecuteCommandAsync();
@@ -82,7 +82,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 }
             }
             _sqlSugar.CommitTran();
-           return new Result { Code = 200, Msg = "添加成功!" }; ;
+            return new Result { Code = 200, Msg = "添加成功!" }; ;
         }
 
         /// <summary>
@@ -110,7 +110,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
 
             var processData = await _sqlSugar.Queryable<Grp_ProcessOverview>()
                 .Where(p => p.GroupId == groupId && p.IsDel == 0)
-                .Mapper(p => p.Nodes, p => p.Nodes.First().ProcessId) 
+                .Mapper(p => p.Nodes, p => p.Nodes.First().ProcessId)
                 .ToListAsync();
 
             var processes = processData.Select(p => new
@@ -121,16 +121,17 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 ProcessName = p.ProcessType.GetEnumDescription(),
                 //p.OverallStatus,
                 //StatusText = p.OverallStatus.GetDescription(),
-                Nodes = p.Nodes.Select(n => {
+                Nodes = p.Nodes.Select(n =>
+                {
 
                     //单独处理签证板块
-                    var visaSubNodes = new List<VisaNode>();
+                    var visaSubNodes = new List<VisaProcessNode>();
                     string remark = string.Empty;
+
                     if (p.ProcessType == GroupProcessType.Visa)
                     {
-                        visaSubNodes = JsonConvert.DeserializeObject<List<VisaNode>>(n.Remark);
+                        visaSubNodes = JsonConvert.DeserializeObject<List<VisaProcessNode>>(n.Remark);
                     }
-
                     return new
                     {
                         n.Id,
@@ -138,7 +139,7 @@ namespace OASystem.Infrastructure.Repositories.Groups
                         n.NodeOrder,
                         n.NodeName,
                         n.OverallStatus,
-                        StatusText = p.OverallStatus.GetEnumDescription(),
+                        StatusText = n.OverallStatus.GetEnumDescription(),
                         Operator = users.FirstOrDefault(u => u.Id == n.Operator)?.CnName ?? "-",
                         OpeateTime = n.OperationTime.HasValue ? n.OperationTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : "-",
                         //节点类型为签证时使用
@@ -147,7 +148,156 @@ namespace OASystem.Infrastructure.Repositories.Groups
                 }).OrderBy(n => n.NodeOrder).ToList()
             }).ToList();
 
-            return new Result { Code = 200,Data = processes, Msg = "查询成功!" }; 
+            return new Result { Code = 200, Data = processes, Msg = "查询成功!" };
+        }
+
+        /// <summary>
+        /// 更新节点状态
+        /// </summary>
+        /// <param name="nodeId">节点ID</param>
+        /// <param name="currUserId">当前用户ID</param>
+        /// <param name="processStatus">流程状态,默认为已完成</param>
+        /// <returns>操作结果</returns>
+        public async Task<Result> UpdateNodeStatusAsync(int nodeId, int currUserId, ProcessStatus processStatus = ProcessStatus.Completed)
+        {
+            try
+            {
+                // 使用事务确保数据一致性
+                var result = await _sqlSugar.Ado.UseTranAsync(async () =>
+                {
+                    // 1. 获取并验证节点
+                    var node = await _sqlSugar.Queryable<Grp_ProcessNode>()
+                        .FirstAsync(n => n.Id == nodeId && n.IsDel == 0);
+
+                    if (node == null)
+                    {
+                        throw new BusinessException("当前节点不存在或已被删除。");
+                    }
+
+                    // 2. 更新节点状态
+                    node.OverallStatus = processStatus;
+                    node.Operator = currUserId;
+                    node.OperationTime = DateTime.Now;
+
+                    var updateCount = await _sqlSugar.Updateable(node)
+                        .UpdateColumns(n => new
+                        {
+                            n.OverallStatus,
+                            n.Operator,
+                            n.OperationTime
+                        })
+                        .ExecuteCommandAsync();
+
+                    if (updateCount == 0)
+                    {
+                        throw new BusinessException("节点状态更新失败。");
+                    }
+
+                    // 3. 如果是完成当前节点,处理流程流转
+                    if (processStatus == ProcessStatus.Completed && node.IsCurrent)
+                    {
+                        await ProcessCurrentNodeCompletionAsync(node, currUserId);
+                    }
+
+                    return new Result { Code = StatusCodes.Status200OK, Msg = "操作成功。" };
+                });
+
+                return result.IsSuccess ? result.Data : new Result
+                {
+                    Code = StatusCodes.Status500InternalServerError,
+                    Msg = result.ErrorMessage
+                };
+            }
+            catch (BusinessException ex)
+            {
+                // 业务异常
+                return new Result { Code = StatusCodes.Status400BadRequest, Msg = ex.Message };
+            }
+            catch (Exception ex)
+            {
+                // 系统异常
+                return new Result { Code = StatusCodes.Status500InternalServerError, Msg = "系统错误,请稍后重试" };
+            }
+        }
+
+        /// <summary>
+        /// 处理当前节点完成后的流程流转
+        /// </summary>
+        private async Task ProcessCurrentNodeCompletionAsync(Grp_ProcessNode currentNode, int currUserId)
+        {
+            // 1. 获取流程信息
+            var process = await _sqlSugar.Queryable<Grp_ProcessOverview>()
+                .FirstAsync(p => p.Id == currentNode.ProcessId && p.IsDel == 0);
+
+            if (process == null)
+            {
+                throw new BusinessException("关联的流程不存在。");
+            }
+
+            // 2. 取消当前节点的当前状态
+            currentNode.IsCurrent = false;
+            await _sqlSugar.Updateable(currentNode)
+                .UpdateColumns(n => new { n.IsCurrent })
+                .ExecuteCommandAsync();
+
+            // 3. 查找并激活下一个节点
+            var nextNode = await _sqlSugar.Queryable<Grp_ProcessNode>()
+                .Where(n => n.ProcessId == currentNode.ProcessId
+                         && n.NodeOrder == currentNode.NodeOrder + 1
+                         && n.IsDel == 0)
+                .FirstAsync();
+
+            if (nextNode != null)
+            {
+                // 激活下一个节点
+                nextNode.IsCurrent = true;
+                nextNode.OverallStatus = ProcessStatus.InProgress;
+                nextNode.Operator = currUserId;
+                nextNode.OperationTime = DateTime.Now;
+
+                var updateCount = await _sqlSugar.Updateable(nextNode)
+                    .UpdateColumns(n => new
+                    {
+                        n.IsCurrent,
+                        n.OverallStatus,
+                        n.Operator,
+                        n.OperationTime
+                    })
+                    .ExecuteCommandAsync();
+
+                if (updateCount == 0)
+                {
+                    throw new BusinessException("激活下一节点失败");
+                }
+
+                // 更新流程状态为进行中
+                process.OverallStatus = ProcessStatus.InProgress;
+            }
+            else
+            {
+                // 下一节点不存在,整个流程完成
+                process.OverallStatus = ProcessStatus.Completed;
+                process.EndTime = DateTime.Now;
+            }
+
+            // 4. 更新流程信息
+            process.UpdatedUserId = currUserId;
+            process.UpdatedTime = DateTime.Now;
+
+            var processUpdateCount = await _sqlSugar.Updateable(process)
+                .UpdateColumns(p => new
+                {
+                    p.OverallStatus,
+                    p.EndTime,
+                    p.UpdatedUserId,
+                    p.UpdatedTime
+                })
+                .ExecuteCommandAsync();
+
+            if (processUpdateCount == 0)
+            {
+                throw new BusinessException("流程状态更新失败。");
+            }
         }
     }
 }