xf 10 сар өмнө
parent
commit
581d5889b3

+ 13 - 13
src/Hotline.Api/Controllers/OrderController.cs

@@ -2890,9 +2890,9 @@ public class OrderController : BaseController
     {
         var isHandled = dto.IsHandled.HasValue && dto.IsHandled.Value;
         if (dto.EndTime.HasValue)
-	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 
-		var (total, items) = await _orderRepository
+        var (total, items) = await _orderRepository
             .Queryable(canView: true, hasHandled: !isHandled)
             .Includes(d => d.OrderSpecials)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
@@ -2905,9 +2905,9 @@ public class OrderController : BaseController
             .Where(d => d.Status != EOrderStatus.BackToProvince)
             //.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id).NotAny())
             .Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State == 0) == false)
-            .WhereIF(dto.StartTime.HasValue ,d=>d.StartTime >= dto.StartTime)
-            .WhereIF(dto.EndTime.HasValue, d=> d.StartTime <= dto.EndTime)
-			.OrderByDescending(d => d.StartTime)
+            .WhereIF(dto.StartTime.HasValue, d => d.StartTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
+            .OrderByDescending(d => d.StartTime)
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
         return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
@@ -2926,9 +2926,9 @@ public class OrderController : BaseController
                     : d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept)
             .ToArray();
         if (dto.EndTime.HasValue)
-	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 
-		var (total, items) = await _orderRepository.Queryable(canView: false)
+        var (total, items) = await _orderRepository.Queryable(canView: false)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status))
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.No.Contains(dto.Keyword!) || d.Title.Contains(dto.Keyword!))
@@ -2939,7 +2939,7 @@ public class OrderController : BaseController
             .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false, d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now)//即将超期 未办
             .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
             .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
-			.Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
+            .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
             .Where(x => x.Status != EOrderStatus.BackToProvince)
             .OrderBy(d => d.Status)
             .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Desc)
@@ -2973,7 +2973,7 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), x => x.ActualHandleOrgName!.Contains(dto.ActualHandleOrgName!))
             .WhereIF(dto.Status.HasValue, x => x.Status == dto.Status)
             .WhereIF(!string.IsNullOrEmpty(dto.AcceptorName), x => x.AcceptorName!.Contains(dto.AcceptorName!))
-			.WhereIF(dto.ExpiredStatus is EExpiredStatus.Normal, x => DateTime.Now < x.NearlyExpiredTime)
+            .WhereIF(dto.ExpiredStatus is EExpiredStatus.Normal, x => DateTime.Now < x.NearlyExpiredTime)
             .WhereIF(dto.ExpiredStatus is EExpiredStatus.GoingToExpired, x => DateTime.Now > x.NearlyExpiredTime && DateTime.Now < x.ExpiredTime)
             .WhereIF(dto.ExpiredStatus is EExpiredStatus.Expired, x => DateTime.Now >= x.ExpiredTime)
             .OrderBy(x => x.Status)
@@ -3011,8 +3011,8 @@ public class OrderController : BaseController
 
         var isHandled = dto.IsHandled.HasValue && dto.IsHandled.Value;
         if (dto.EndTime.HasValue)
-	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-		var (total, items) = await _orderRepository
+            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+        var (total, items) = await _orderRepository
             .Queryable(canView: true, hasHandled: !isHandled)
             .Includes(d => d.OrderSpecials)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
@@ -3023,7 +3023,7 @@ public class OrderController : BaseController
             .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false, d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now)//即将超期 未办
             .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
             .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
-			.Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
+            .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
             .Where(d => d.Status != EOrderStatus.BackToProvince)
             //.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id).NotAny())
             .Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State == 0) == false)
@@ -3080,7 +3080,7 @@ public class OrderController : BaseController
         if (oneSendBack || twoSendBack)
         {
             var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
-                dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, HttpContext.RequestAborted);
+                dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, HttpContext.RequestAborted);
             var sendBack = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == workflow.ExternalId && x.State == ESendBackAuditState.Apply).AnyAsync();
             if (sendBack)
                 throw UserFriendlyException.SameMessage("当前工单已经生成退回记录");

+ 1 - 1
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -88,7 +88,7 @@ namespace Hotline.Application.FlowEngine
         /// 检查退回节点信息
         /// </summary>
         Task<(WorkflowStep currentStep, WorkflowStep prevStep, bool isOrgToCenter, bool isSecondToFirstOrgLevel)>
-            GetPreviousInformationAsync(string workflowId, string operatorId, string operatorOrgId,
+            GetPreviousInformationAsync(string workflowId, string operatorId, string operatorOrgId, string[] roles,
                 CancellationToken cancellationToken);
 
         /// <summary>

+ 7 - 5
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -219,7 +219,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
 
         var currentStep = _workflowDomainService.FindCurrentStepWaitForHandle(workflow,
-            current.RequiredUserId, current.RequiredOrgId);
+            current.RequiredUserId, current.RequiredOrgId, current.Roles);
         if (currentStep.Status is EWorkflowStepStatus.Handled)
             throw new UserFriendlyException("该状态不支持继续办理");
 
@@ -282,7 +282,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var user = await _userRepository.Queryable()
             .Includes(x => x.Organization)
             .FirstAsync(x => x.Id == _sessionContext.RequiredUserId, cancellationToken);
-        return await _workflowDomainService.PreviousAsync(workflow, dto, user, _sessionContext, cancellationToken);
+        return await _workflowDomainService.PreviousAsync(workflow, dto,
+            _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles,
+            _sessionContext, cancellationToken);
     }
 
     /// <summary>
@@ -444,7 +446,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withDefine: true, withSteps: true,
             cancellationToken: cancellationToken);
         var currentStep = _workflowDomainService.FindCurrentStepWaitForHandle(workflow,
-            _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
+            _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles);
         if (currentStep.StepType is EStepType.End)
             throw new UserFriendlyException("结束节点无需办理");
 
@@ -1261,12 +1263,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// 检查退回节点信息
     /// </summary>
     public async Task<(WorkflowStep currentStep, WorkflowStep prevStep, bool isOrgToCenter, bool isSecondToFirstOrgLevel)>
-        GetPreviousInformationAsync(string workflowId, string operatorId, string operatorOrgId,
+        GetPreviousInformationAsync(string workflowId, string operatorId, string operatorOrgId, string[] roles,
             CancellationToken cancellationToken)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withSteps: true,
             withCountersigns: true, cancellationToken: cancellationToken);
-        var (currentStep, prevStep, _) = _workflowDomainService.GetPreviousStep(workflow, operatorId, operatorOrgId);
+        var (currentStep, prevStep, _) = _workflowDomainService.GetPreviousStep(workflow, operatorId, operatorOrgId, roles);
         var isOrgToCenter = currentStep.BusinessType is EBusinessType.Department &&
                             prevStep.BusinessType is EBusinessType.Center or EBusinessType.Send;
         var isSecondToFirstOrgLevel = currentStep.HandlerType is EHandlerType.OrgLevel &&

+ 8 - 7
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -56,9 +56,10 @@ namespace Hotline.FlowEngine.Workflows
         /// 退回(返回前一节点)
         /// </summary>
         /// <returns></returns>
-        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, User operater, ISessionContext current,
-            CancellationToken cancellationToken);
-
+        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, 
+            string applicantId, string applicantOrgId, string[] applicantRoleIds, 
+            ISessionContext current, CancellationToken cancellationToken);
+        
         /// <summary>
         /// 撤回(返回到之前任意节点)
         /// </summary>
@@ -110,7 +111,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 查询当前待办理节点
         /// </summary>
-        WorkflowStep FindCurrentStepWaitForHandle(Workflow workflow, string userId, string orgId);
+        WorkflowStep FindCurrentStepWaitForHandle(Workflow workflow, string userId, string orgId, string[] roleIds);
 
         /// <summary>
         /// 查询当前节点中最后一个节点
@@ -153,10 +154,10 @@ namespace Hotline.FlowEngine.Workflows
         /// 查询未完成节点
         /// </summary>
         /// <param name="steps"></param>
-        /// <param name="orgCode"></param>
+        /// <param name="orgId"></param>
         /// <param name="userId"></param>
         /// <returns></returns>
-        WorkflowStep GetUnHandleStep(List<WorkflowStep> steps, string orgCode, string userId);
+        WorkflowStep GetUnHandleStep(List<WorkflowStep> steps, string orgId, string userId, string[] roleIds);
 
         /// <summary>
         /// 检查当前办理节点是否为开始节点
@@ -206,7 +207,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 查询退回节点信息
         /// </summary>
         (WorkflowStep currentStep, WorkflowStep prevStep, WorkflowStep? countersignStartStep) GetPreviousStep(
-            Workflow workflow, string operaterId, string operaterOrgId);
+            Workflow workflow, string operaterId, string operaterOrgId, string[] roleIds);
 
         /// <summary>
         /// 查询派单池中流程节点id

+ 16 - 14
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -236,7 +236,7 @@ namespace Hotline.FlowEngine.Workflows
             var canPrevious = false;
             if (canHandle)
             {
-                var currentStep = FindCurrentStepWaitForHandle(workflow, userId, orgId);
+                var currentStep = FindCurrentStepWaitForHandle(workflow, userId, orgId, roleIds);
                 if (currentStep.Status is not EWorkflowStepStatus.Handled)
                 {
                     canPrevious = !(currentStep.IsInCountersign() &&
@@ -268,7 +268,7 @@ namespace Hotline.FlowEngine.Workflows
             if (workflow.Status != EWorkflowStatus.Runnable) return;
 
             var currentStep = GetUnHandleStep(workflow.Steps, _sessionContext.RequiredOrgId,
-                _sessionContext.RequiredUserId);
+                _sessionContext.RequiredUserId, _sessionContext.Roles);
             if (currentStep.Status is not EWorkflowStepStatus.WaitForAccept) return;
 
             if (currentStep.Handlers.All(d => d.Key != orgId && d.Key != userId)) return;
@@ -514,12 +514,13 @@ namespace Hotline.FlowEngine.Workflows
         /// 退回(返回前一节点)
         /// </summary>
         /// <returns></returns>
-        public async Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, User operater,
-           ISessionContext current, CancellationToken cancellationToken)
+        public async Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto,
+            string applicantId, string applicantOrgId, string[] applicantRoleIds,
+            ISessionContext current, CancellationToken cancellationToken)
         {
             //ValidatePermission(workflow, operater.OrgId, operater.Id);
 
-            var (currentStep, prevStep, countersignStartStep) = GetPreviousStep(workflow, operater.Id, operater.OrgId);
+            var (currentStep, prevStep, countersignStartStep) = GetPreviousStep(workflow, applicantId, applicantOrgId, applicantRoleIds);
 
             //保存附件
             if (dto.Files.Any())
@@ -579,7 +580,7 @@ namespace Hotline.FlowEngine.Workflows
             workflow.UpdateActualStepWhenAssign(newPrevStep, prevStep.HandlerOrgName, prevStep.HandlerOrgId);
 
             //更新流程可办理对象
-            workflow.UpdatePreviousHandlers(operater.Id, operater.OrgId, prevStep);
+            workflow.UpdatePreviousHandlers(applicantId, applicantOrgId, prevStep);
 
             //orgToCenter会触发重新计算期满时间,1.无需审核按当前时间进行计算 2.需审核按审核通过时间计算
             var isOrgToCenter = prevStep.BusinessType is EBusinessType.Send && prevStep.IsOrigin;
@@ -595,9 +596,9 @@ namespace Hotline.FlowEngine.Workflows
         /// 查询退回节点信息
         /// </summary>
         public (WorkflowStep currentStep, WorkflowStep prevStep, WorkflowStep? countersignStartStep) GetPreviousStep(
-            Workflow workflow, string operaterId, string operaterOrgId)
+            Workflow workflow, string operaterId, string operaterOrgId, string[] roleIds)
         {
-            var currentStep = GetUnHandleStep(workflow.Steps, operaterOrgId, operaterId);
+            var currentStep = GetUnHandleStep(workflow.Steps, operaterOrgId, operaterId, roleIds);
             var isCurrentTopCountersignEndStep = workflow.IsInCountersign &&
                                                  currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId);
             if (currentStep.IsInCountersign() && !isCurrentTopCountersignEndStep)
@@ -1110,8 +1111,8 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 查询当前待办理节点
         /// </summary>
-        public WorkflowStep FindCurrentStepWaitForHandle(Workflow workflow, string userId, string orgId) =>
-            GetUnHandleStep(workflow.Steps, orgId, userId);
+        public WorkflowStep FindCurrentStepWaitForHandle(Workflow workflow, string userId, string orgId, string[] roleIds) =>
+            GetUnHandleStep(workflow.Steps, orgId, userId, roleIds);
 
         /// <summary>
         /// 查询当前节点中最后一个节点
@@ -1181,7 +1182,7 @@ namespace Hotline.FlowEngine.Workflows
                 cancellationToken: cancellationToken);
 
             var currentStep = GetUnHandleStep(workflow.Steps, _sessionContext.RequiredOrgId,
-                _sessionContext.RequiredUserId);
+                _sessionContext.RequiredUserId, _sessionContext.Roles);
             //var (currentStepBox, currentStep) = GetUnCompleteStep(workflow.Steps, _sessionContext.RequiredOrgId, _sessionContext.RequiredUserId);
 
             var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
@@ -2133,12 +2134,13 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 查询未完成节点
         /// </summary>
-        public WorkflowStep GetUnHandleStep(List<WorkflowStep> steps, string orgCode, string userId)
+        public WorkflowStep GetUnHandleStep(List<WorkflowStep> steps, string orgId, string userId, string[] roleIds)
         {
-            var step = GetStep(steps, orgCode, userId, d => d != EWorkflowStepStatus.Handled);
+            //var step = GetStep(steps, orgCode, userId, d => d != EWorkflowStepStatus.Handled);
+            var step = steps.FirstOrDefault(d => d.IsCanHandle(userId, orgId, roleIds));
             if (step == null)
                 throw new UserFriendlyException(
-                    $"未找到对应节点, workflowId: {steps.FirstOrDefault()?.WorkflowId} orgCode:{orgCode}, userId: {userId}",
+                    $"未找到对应节点, workflowId: {steps.FirstOrDefault()?.WorkflowId} orgCode:{orgId}, userId: {userId}, roleIds: {string.Join(',', roleIds)}",
                     "未找到对应节点");
             return step;
         }