Browse Source

Merge branch 'master' of http://git.12345lm.cn/Fengwo/hotline

Dun.Jason 1 year ago
parent
commit
7b288b142b

+ 1 - 1
src/Hotline.Api/Controllers/DataSharing/ProvinceController.cs

@@ -394,7 +394,7 @@ namespace Hotline.Api.Controllers.DataSharing
 
             if (!string.IsNullOrEmpty(id))
             {
-                await _mediator.Send(new ScreenProvinceResultNotify { ProvinceScreenResult = _mapper.Map<ProvinceScreenResult>(dto) });
+                await _mediator.Publish(new ScreenProvinceResultNotify { ProvinceScreenResult = _mapper.Map<ProvinceScreenResult>(dto) }, HttpContext.RequestAborted);
 
                 return OpenResponse.Ok(Reponse.Success("您已成功提交数据!"));
             }

+ 0 - 5
src/Hotline.Api/Program.cs

@@ -1,10 +1,5 @@
-using System.Text.Json.Serialization;
-using System.Xml.Linq;
 using Hotline.Api;
-using Newtonsoft.Json;
-using RestSharp;
 using Serilog;
-using Tr.Sdk;
 
 Log.Logger = new LoggerConfiguration()
     .WriteTo.Console()

+ 1 - 1
src/Hotline.Api/StartupExtensions.cs

@@ -115,7 +115,7 @@ internal static class StartupExtensions
             .AddValidatorsFromAssembly(typeof(AppContractsStartupExtensions).Assembly);
 
         //mq
-        services.AddMq(configuration);
+        //services.AddMq(configuration);
 
         services.AddSingleton<IAuthorizationPolicyProvider, AuthorizationPolicyProvider>();
         services.AddSingleton<IAuthorizationHandler, PermissionHandler>();

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

@@ -276,8 +276,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     public async Task JumpAsync(RecallDto dto, CancellationToken cancellationToken)
     {
         var workflow =
-            await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true,
-                cancellationToken: cancellationToken);
+            await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
 
         await _orderDomainService.ReadyToRecallAsync(workflow.ExternalId, cancellationToken);
 
@@ -294,14 +293,19 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     public async Task JumpToEndAsync(string workflowId, string opinion, CancellationToken cancellationToken)
     {
         var workflow =
-            await _workflowDomainService.GetWorkflowAsync(workflowId, withDefine: true, cancellationToken: cancellationToken);
+            await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
         var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
         if (endStepDefine is null)
             throw new UserFriendlyException("未正确配置结束节点");
+        var currentStep = workflow.GetActualStep();
+        if (currentStep is null)
+            throw new UserFriendlyException("未找到实际办理节点");
         
-        //todo
-        // var endTrace = await WorkflowEndAsync(workflow, dto, nextStepDefine, currentStep, EReviewResult.Approval, cancellationToken);
-        
+        var endTrace = await _workflowDomainService.EndAsync(workflow, new BasicWorkflowDto
+            {
+                Opinion = opinion,
+            }, endStepDefine, currentStep,
+            EReviewResult.Unknown, cancellationToken);
     }
 
     /// <summary>
@@ -683,7 +687,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         foreach (var stepDefine in stepDefines)
         {
             var nextStepOption = await GetConfigStepAsync(flowType, stepDefine, cancellationToken);
-            nextStepOption.InputRealHandler = currentStepType == EStepType.Normal && stepDefine.StepType is EStepType.Summary or EStepType.End;
+            nextStepOption.InputRealHandler = currentStepType == EStepType.Normal &&
+                                              stepDefine.StepType is EStepType.Summary or EStepType.End;
             stepOptions.Add(nextStepOption);
 
             if (stepDefine.StepType is EStepType.End)

+ 18 - 17
src/Hotline.Application/Handlers/Order/DelayProvinceResultNotifyHandler.cs

@@ -45,23 +45,24 @@ namespace Hotline.Application.Handlers.Order
 
             if (dto.IsPass)
             {
-                //todo workflow优化
-                var nextDtos =
-                    await _workflowApplication.GetNextStepsAsync(orderDelay.WorkflowId, cancellationToken);
-                var nextStep = nextDtos.Steps.FirstOrDefault(d => d.StepType == EStepType.End);
-                if (nextStep is null)
-                    throw new UserFriendlyException("未查询到结束节点");
+                await _workflowApplication.JumpToEndAsync(orderDelay.WorkflowId, dto.Opinion, cancellationToken);
 
-                var nextDto = new NextWorkflowDto
-                {
-                    WorkflowId = orderDelay.WorkflowId,
-                    //StepExpiredTime = orderDelay.Workflow.ExpiredTime,
-                    NextStepCode = nextStep.Key,
-                    NextStepName = nextStep.Value,
-                    NextMainHandler = nextStep.Key,
-                    Opinion = dto.Opinion
-                };
-                await _workflowApplication.NextAsync(nextDto, cancellationToken);
+                // var nextDtos =
+                //     await _workflowApplication.GetNextStepsAsync(orderDelay.WorkflowId, cancellationToken);
+                // var nextStep = nextDtos.Steps.FirstOrDefault(d => d.StepType == EStepType.End);
+                // if (nextStep is null)
+                //     throw new UserFriendlyException("未查询到结束节点");
+                //
+                // var nextDto = new NextWorkflowDto
+                // {
+                //     WorkflowId = orderDelay.WorkflowId,
+                //     //StepExpiredTime = orderDelay.Workflow.ExpiredTime,
+                //     NextStepCode = nextStep.Key,
+                //     NextStepName = nextStep.Value,
+                //     NextMainHandler = nextStep.Key,
+                //     Opinion = dto.Opinion
+                // };
+                // await _workflowApplication.NextAsync(nextDto, cancellationToken);
             }
             else
             {
@@ -74,4 +75,4 @@ namespace Hotline.Application.Handlers.Order
             }
         }
     }
-}
+}

+ 50 - 9
src/Hotline.Application/Handlers/Order/ReceiveOrderNotifyHandler.cs

@@ -15,7 +15,7 @@ using XF.Domain.Exceptions;
 
 namespace Hotline.Application.Handlers.Order
 {
-    public class ReceiveOrderNotifyHandler : IRequestHandler<ReceiveOrderNotify, AddOrderResponse>
+    public class ReceiveOrderNotifyHandler : IRequestHandler<ReceiveOrderNotify, AddOrderResponse?>
     {
         private readonly IOrderRepository _orderRepository;
         private readonly IOrderDomainService _orderDomainService;
@@ -38,9 +38,53 @@ namespace Hotline.Application.Handlers.Order
         /// <param name="request">The request</param>
         /// <param name="cancellationToken">Cancellation token</param>
         /// <returns>Response from the request</returns>
-        public async Task<AddOrderResponse> Handle(ReceiveOrderNotify request, CancellationToken cancellationToken)
+        public Task<AddOrderResponse?> Handle(ReceiveOrderNotify request, CancellationToken cancellationToken)
         {
             var dto = request.AddOrderDto;
+            switch (dto.Source)
+            {
+                case ESource.ProvinceStraight:
+                    return ReceiveOrderFromProvinceAsync(dto, cancellationToken);
+                case ESource.Police110:
+                case ESource.CityDataExchangeLz:
+                case ESource.ConvergenceMedia:
+                    return ReceiveOrderFromOtherPlatformAsync(dto, cancellationToken);
+                case ESource.Hotline:
+                case ESource.HotlineImport:
+                default:
+                    throw new ArgumentOutOfRangeException();
+            }
+        }
+
+        /// <summary>
+        /// 接受外部工单(除省平台)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        private async Task<AddOrderResponse?> ReceiveOrderFromOtherPlatformAsync(AddOrderDto dto,
+            CancellationToken cancellationToken)
+        {
+            if (string.IsNullOrEmpty(dto.ExternalId))
+                throw new UserFriendlyException("工单外部编号不能为空");
+
+            var exists = await _orderRepository.AnyAsync(d => d.ExternalId == dto.ExternalId, cancellationToken);
+            if (exists) return null;
+            var order = _mapper.Map<Hotline.Orders.Order>(dto);
+            var orderId = await _orderDomainService.AddAsync(order, cancellationToken);
+            return new AddOrderResponse
+            {
+                Id = orderId,
+                No = order.No,
+                Password = order.Password!
+            };
+        }
+
+        /// <summary>
+        /// 接受省平台工单
+        /// </summary>
+        private async Task<AddOrderResponse?> ReceiveOrderFromProvinceAsync(AddOrderDto dto, CancellationToken cancellationToken)
+        {
             if (string.IsNullOrEmpty(dto.ProvinceNo))
                 throw new UserFriendlyException("无效省工单编号");
 
@@ -64,19 +108,16 @@ namespace Hotline.Application.Handlers.Order
                 {
                     Id = orderId,
                     No = order.No,
-                    Password = order.Password
+                    Password = order.Password!
                 };
             }
             else
             {
-                if (order.Source is ESource.ProvinceStraight)
-                {
-                    //todo 特提(撤回至发起)
+                // 特提(撤回至发起)
+                if (!string.IsNullOrEmpty(order.WorkflowId))
                     await _workflowApplication.RecallToStartAsync(order.WorkflowId, "省工单重派", cancellationToken);
-                }
-
                 return _mapper.Map<AddOrderResponse>(order);
             }
         }
     }
-}
+}

+ 17 - 16
src/Hotline.Application/Handlers/Order/ScreenProvinceResultNotifyHandler.cs

@@ -43,22 +43,23 @@ namespace Hotline.Application.Handlers.Order
             var pass = "1".Equals(dto.AuditResult);
             if (pass)
             {
-                //todo workflow优化
-                var nextDtos =
-                    await _workflowApplication.GetNextStepsAsync(orderScreen.WorkflowId, cancellationToken);
-                var nextStep = nextDtos.Steps.FirstOrDefault(d => d.Key == "end");
-                if (nextStep is null)
-                    throw new UserFriendlyException("未查询到结束节点");
-
-                var nextDto = new NextWorkflowDto
-                {
-                    WorkflowId = orderScreen.WorkflowId,
-                    NextStepCode = nextStep.Key,
-                    NextStepName = nextStep.Value,
-                    NextMainHandler = nextStep.Key,
-                    Opinion = dto.AuditOpinion
-                };
-                await _workflowApplication.NextAsync(nextDto, cancellationToken);
+                await _workflowApplication.JumpToEndAsync(orderScreen.WorkflowId, dto.AuditOpinion, cancellationToken);
+                
+                // var nextDtos =
+                //     await _workflowApplication.GetNextStepsAsync(orderScreen.WorkflowId, cancellationToken);
+                // var nextStep = nextDtos.Steps.FirstOrDefault(d => d.Key == "end");
+                // if (nextStep is null)
+                //     throw new UserFriendlyException("未查询到结束节点");
+                //
+                // var nextDto = new NextWorkflowDto
+                // {
+                //     WorkflowId = orderScreen.WorkflowId,
+                //     NextStepCode = nextStep.Key,
+                //     NextStepName = nextStep.Value,
+                //     NextMainHandler = nextStep.Key,
+                //     Opinion = dto.AuditOpinion
+                // };
+                // await _workflowApplication.NextAsync(nextDto, cancellationToken);
             }
             else
             {

+ 6 - 0
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -91,6 +91,12 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         Task TerminateAsync(TerminateDto dto, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 结束流程(流程直接流转至结束节点)
+        /// </summary>
+        Task<WorkflowTrace> EndAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine endStepDefine,
+            WorkflowStep currentStep, EReviewResult reviewResult, CancellationToken cancellationToken);
+
         StepDefine GetStepDefine(WorkflowDefinition workflowDefinition, string stepCode);
 
         /// <summary>

+ 6 - 0
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -801,6 +801,12 @@ public partial class Workflow
 
     public bool IsReviewType() => FlowType == EFlowType.Review;
 
+    /// <summary>
+    /// 查询实际办理节点
+    /// </summary>
+    /// <returns></returns>
+    public WorkflowStep? GetActualStep() => Steps.FirstOrDefault(d => d.Id == ActualHandleStepId);
+
     #endregion
 }
 

+ 4 - 4
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -357,7 +357,7 @@ namespace Hotline.FlowEngine.Workflows
             //检查是否流转到流程终点
             if (nextStepDefine.StepType is EStepType.End)
             {
-                var endTrace = await WorkflowEndAsync(workflow, dto, nextStepDefine, currentStep, EReviewResult.Approval, cancellationToken);
+                var endTrace = await EndAsync(workflow, dto, nextStepDefine, currentStep, EReviewResult.Approval, cancellationToken);
                 return;
             }
 
@@ -605,7 +605,7 @@ namespace Hotline.FlowEngine.Workflows
             await HandleStepAsync(currentStep, workflow, dto, null, cancellationToken);
 
             var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
-            var endTrace = await WorkflowEndAsync(workflow, dto, endStepDefine, currentStep, EReviewResult.Failed, cancellationToken);
+            var endTrace = await EndAsync(workflow, dto, endStepDefine, currentStep, EReviewResult.Failed, cancellationToken);
 
             //await _mediator.Publish(new RejectNotify(workflow, dto), cancellationToken);
         }
@@ -719,7 +719,7 @@ namespace Hotline.FlowEngine.Workflows
             var endStepDefine = workflow.WorkflowDefinition.FindEndStepDefine();
 
             var basicDto = _mapper.Map<BasicWorkflowDto>(dto);
-            var endTrace = await WorkflowEndAsync(workflow, basicDto, endStepDefine, currentStep, EReviewResult.Unknown, cancellationToken);
+            var endTrace = await EndAsync(workflow, basicDto, endStepDefine, currentStep, EReviewResult.Unknown, cancellationToken);
 
             await _mediator.Publish(new CancelWorkflowNotify(workflow), cancellationToken);
         }
@@ -918,7 +918,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 流程结束
         /// </summary>
-        private async Task<WorkflowTrace> WorkflowEndAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine endStepDefine,
+        public async Task<WorkflowTrace> EndAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine endStepDefine,
             WorkflowStep currentStep, EReviewResult reviewResult, CancellationToken cancellationToken)
         {
             //create endStep