Ver código fonte

fix: 修复流程已办结,工单未办结数据

xf 10 meses atrás
pai
commit
fd1b9187b0
1 arquivos alterados com 100 adições e 25 exclusões
  1. 100 25
      src/Hotline.Api/Controllers/TestController.cs

+ 100 - 25
src/Hotline.Api/Controllers/TestController.cs

@@ -7,6 +7,8 @@ using Fw.Utility.Client;
 using Google.Protobuf.WellKnownTypes;
 using Hotline.Ai.Visit;
 using Hotline.Application.ExportExcel;
+using Hotline.Application.JudicialManagement;
+using Hotline.Application.Quality;
 using Hotline.CallCenter.BlackLists;
 using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Devices;
@@ -19,17 +21,22 @@ using Hotline.Orders;
 using Hotline.Push.Notifies;
 using Hotline.Realtimes;
 using Hotline.Repository.SqlSugar;
+using Hotline.Repository.SqlSugar.CallCenter;
 using Hotline.Repository.SqlSugar.System;
 using Hotline.Repository.SqlSugar.Ts;
 using Hotline.Settings;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Dtos.SendSms;
+using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Push;
+using Hotline.Share.Enums.Quality;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Mq;
 using Hotline.Tools;
@@ -59,6 +66,7 @@ using XF.Domain.Locks;
 using XF.Domain.Queues;
 using XF.Domain.Repository;
 using XF.EasyCaching;
+using Order = Hotline.Orders.Order;
 
 namespace Hotline.Api.Controllers;
 
@@ -97,10 +105,15 @@ public class TestController : BaseController
     private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
 
     private readonly IRepository<WorkflowStep> _workflowStepRepository;
+
+    private readonly IWorkflowRepository _workflowRepository;
     //private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
 
     private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
     private readonly IOrderRepository _orderRepository;
+    private readonly IRepository<TrCallRecord> _trCallRecordRepository;
+    private readonly IQualityApplication _qualityApplication;
+    private readonly IEnforcementApplication _enforcementApplication;
     private readonly IMapper _mapper;
     private readonly IOptionsSnapshot<SendSmsConfiguration> _sendSmsConfiguration;
 
@@ -138,9 +151,13 @@ public class TestController : BaseController
         IAiVisitService aiVisitService,
         IRepository<WorkflowTrace> workflowTraceRepository,
         IRepository<WorkflowStep> workflowStepRepository,
+        IWorkflowRepository workflowRepository,
         //IRepository<WorkflowStepHandler> workflowStepHandleRepository,
         IRepository<SystemOrganize> systemOrganizeRepository,
         IOrderRepository orderRepository,
+        IRepository<TrCallRecord> trCallRecordRepository,
+        IQualityApplication qualityApplication,
+        IEnforcementApplication enforcementApplication,
         IMapper mapper,
 
 
@@ -172,9 +189,13 @@ public class TestController : BaseController
         _aiVisitService = aiVisitService;
         _workflowTraceRepository = workflowTraceRepository;
         _workflowStepRepository = workflowStepRepository;
+        _workflowRepository = workflowRepository;
         //_workflowStepHandleRepository = workflowStepHandleRepository;
         _systemOrganizeRepository = systemOrganizeRepository;
         _orderRepository = orderRepository;
+        _trCallRecordRepository = trCallRecordRepository;
+        _qualityApplication = qualityApplication;
+        _enforcementApplication = enforcementApplication;
         _orderRepository = orderRepository;
         _mapper = mapper;
         _sendSmsConfiguration = sendSmsConfiguration;
@@ -557,41 +578,95 @@ public class TestController : BaseController
     [HttpPost("t4")]
     public async Task TestExportExcel1()
     {
-        var steps = await _workflowStepRepository.Queryable()
-            .Includes(d => d.WorkflowTrace)
-            .Where(d => SqlFunc.Exists(d.WorkflowTrace.Id) &&
-                        d.Status != EWorkflowStepStatus.Handled &&
-                        d.HandlerId == null &&
-                        d.FlowAssignType != null &&
-                        SqlFunc.JsonArrayLength(d.Handlers) == 1)
+        var orders = await _orderRepository.Queryable()
+            .Includes(d=>d.OrderExtension)
+            .InnerJoin<Workflow>((o, w) => o.WorkflowId == w.Id)
+            .Where((o, w) => o.Status < EOrderStatus.Filed && w.Status == EWorkflowStatus.Completed)
             .ToListAsync(HttpContext.RequestAborted);
+        _logger.LogWarning($"order count: {orders.Count}");
 
-        var list = new List<WorkflowStep>();
-        foreach (var step in steps)
+        var workflowIds = orders.Select(d => d.WorkflowId).ToList();
+        var workflows = await _workflowRepository.Queryable()
+            .Includes(d=>d.Steps)
+            .Includes(d=>d.Traces)
+            .Where(d => workflowIds.Contains(d.Id))
+            .ToListAsync(HttpContext.RequestAborted);
+
+        var updateOrders = new List<Order>();
+        foreach (var order in orders)
         {
-            var handler = step.Handlers.First();
-            if (string.IsNullOrEmpty(handler.Key)) continue;
-            if (step.FlowAssignType == EFlowAssignType.User)
+            var workflow = workflows.First(d => d.Id == order.WorkflowId);
+
+            _mapper.Map(workflow, order);
+            var now = DateTime.Now;
+            var handleDuration = order.StartTime.HasValue
+                ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
+                now, order.ProcessType is EProcessType.Zhiban)
+                : 0;
+            var fileDuration = order.CenterToOrgTime.HasValue
+                ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
+                    now, order.ProcessType is EProcessType.Zhiban)
+                : 0;
+            var allDuration = order.StartTime.HasValue
+                ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
+                order.ProcessType is EProcessType.Zhiban)
+                : 0;
+            order.File(now, handleDuration, fileDuration, allDuration);
+
+            var endTrace = workflow.Traces.FirstOrDefault(d => d.StepType == EStepType.End);
+            if(endTrace is null) continue;
+            var trace = workflow.Traces.FirstOrDefault(d => d.Id == endTrace.PrevStepId);
+            if(trace is null) continue;
+
+            order.FileUserId = trace.HandlerId;
+            order.FileUserName = trace.HandlerName;
+            order.FileUserOrgId = trace.HandlerOrgId;
+            order.FileUserOrgName = trace.HandlerOrgName;
+            order.FileOpinion = trace.Opinion;
+
+            //记录冗余归档数据
+            if (workflow.Steps.Any(x => x.BusinessType == Share.Enums.FlowEngine.EBusinessType.Send))
             {
-                step.HandlerId = handler.Key;
-                step.HandlerName = handler.Value;
-                step.WorkflowTrace.HandlerId = step.HandlerId;
-                step.WorkflowTrace.HandlerName = step.HandlerName;
+                order.FileUserRole = EFileUserType.Dispatch;
             }
             else
             {
-                step.HandlerOrgId = handler.Key;
-                step.HandlerOrgName = handler.Value;
-                step.WorkflowTrace.HandlerOrgId = step.HandlerOrgId;
-                step.WorkflowTrace.HandlerOrgName = step.HandlerOrgName;
+                order.FileUserRole = EFileUserType.Seat;
             }
-            list.Add(step);
+            if (order.ProcessType == EProcessType.Jiaoban)
+            {
+                order.FileUserRole = EFileUserType.Org;
+            }
+
+            //是否已解决
+            order.IsResolved = true;//notification.Dto.External == null ? false : notification.Dto.External.IsResolved;
+
+            //await _orderRepository.UpdateAsync(order, cancellationToken);
+            updateOrders.Add(order);
+
+            //var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken); //由CallAccept改为OtherAccept
+            var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, HttpContext.RequestAborted);
+            var orderFlowDto = new OrderFlowDto
+            {
+                Order = _mapper.Map<OrderDto>(order),
+                WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
+            };
+            if (callRecord != null)
+            {
+                orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
+            }
+            //这里需要判断是否是警情退回
+            orderFlowDto.IsNonPoliceReturn = false;//notification.Dto.External == null ? false : notification.Dto.External.IsPoliceReturn;
+            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFiled, orderFlowDto, cancellationToken: HttpContext.RequestAborted);
+            //写入质检  针对受理之后直接结束的工单
+            await _qualityApplication.AddQualityAsync(EQualitySource.Accepted, order.Id, HttpContext.RequestAborted);
+
+            //司法行政监督管理-工单处理
+            await _enforcementApplication.AddEnforcementOrderAsync(order, HttpContext.RequestAborted);
         }
 
-        await _workflowStepRepository
-            .UpdateNav(list)
-            .Include(d => d.WorkflowTrace)
-            .ExecuteCommandAsync();
+        _logger.LogWarning($"更新orders:{updateOrders.Count}");
+        await _orderRepository.UpdateRangeAsync(updateOrders, HttpContext.RequestAborted);
     }
 
     [HttpGet("rsa")]