xf 9 months ago
parent
commit
bd1894253b

+ 131 - 93
src/Hotline.Api/Controllers/TestController.cs

@@ -1,5 +1,6 @@
 using System.Collections.Concurrent;
 using System.Data;
+using System.Diagnostics;
 using System.IO;
 using System.Threading;
 using DotNetCore.CAP;
@@ -15,6 +16,9 @@ using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Configs;
 using Hotline.CallCenter.Devices;
 using Hotline.CallCenter.Ivrs;
+using Hotline.FlowEngine;
+using Hotline.FlowEngine.Definitions;
+using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Identity.Roles;
@@ -120,6 +124,7 @@ public class TestController : BaseController
     private readonly IRepository<TrCallRecord> _trCallRecordRepository;
     private readonly IQualityApplication _qualityApplication;
     private readonly IEnforcementApplication _enforcementApplication;
+    private readonly IWorkflowDomainService _workflowDomainService;
     private readonly IMapper _mapper;
     private readonly IOptionsSnapshot<SendSmsConfiguration> _sendSmsConfiguration;
     private readonly IOrderReportApplication _orderReportApplication;
@@ -167,6 +172,7 @@ public class TestController : BaseController
         IRepository<TrCallRecord> trCallRecordRepository,
         IQualityApplication qualityApplication,
         IEnforcementApplication enforcementApplication,
+        IWorkflowDomainService workflowDomainService,
         IMapper mapper,
 
 
@@ -209,6 +215,7 @@ IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository
         _trCallRecordRepository = trCallRecordRepository;
         _qualityApplication = qualityApplication;
         _enforcementApplication = enforcementApplication;
+        _workflowDomainService = workflowDomainService;
         _orderRepository = orderRepository;
         _mapper = mapper;
         _sendSmsConfiguration = sendSmsConfiguration;
@@ -728,12 +735,30 @@ IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository
     [HttpPost("t4")]
     public async Task TestExportExcel1()
     {
-        //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 numbers = new List<string>
+        {
+            "20240623000180",
+            "20240622000097",
+            "20240621000055",
+            "20240622000185",
+            "20240623000025",
+            "20240621000099",
+            "20240621000270",
+            "20240622000060",
+            "20240621000144",
+        };
+        
+        var orders = await _orderRepository.Queryable()
+            .Includes(d => d.OrderExtension)
+            .Where(d => numbers.Contains(d.No))
+            .ToListAsync(HttpContext.RequestAborted);
+        _logger.LogWarning($"order count: {orders.Count}");
+
+        var workflowIds = orders.Select(d => d.WorkflowId).ToList();
+        var workflows = await _workflowRepository.Queryable()
+            .Includes(d => d.Steps, x => x.WorkflowTrace)
+            .Where(d => workflowIds.Contains(d.Id))
+            .ToListAsync(HttpContext.RequestAborted);
 
         //var workflowIds = orders.Select(d => d.WorkflowId).ToList();
         //var workflows = await _workflowRepository.Queryable()
@@ -742,99 +767,112 @@ IRepository<EnforcementOrdersHandler> enforcementOrdersHandlerRepository
         //    .Where(d => workflowIds.Contains(d.Id))
         //    .ToListAsync(HttpContext.RequestAborted);
 
-        //var updateOrders = new List<Order>();
-        //foreach (var order in orders)
-        //{
-        //    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;
-        //    var creationTimeHandleDurationWorkday = order.ActualHandleTime.HasValue
-        //           ? _timeLimitDomainService.CalcWorkTime(order.CreationTime, order.ActualHandleTime.Value,
-        //           order.ProcessType is EProcessType.Zhiban)
-        //           : 0;
-        //    var centerToOrgHandleDurationWorkday = order.ActualHandleTime.HasValue && order.CenterToOrgTime.HasValue
-        //        ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value, order.ActualHandleTime.Value,
-        //        order.ProcessType is EProcessType.Zhiban)
-        //        : 0;
-
-        //    order.File(now, handleDuration, fileDuration, allDuration, creationTimeHandleDurationWorkday, centerToOrgHandleDurationWorkday);
-
-        //    var endStep = workflow.Steps.FirstOrDefault(d => d.StepType == EStepType.End);
-        //    //var endTrace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.StepType == EStepType.End)?.WorkflowTrace;
-        //    if (endStep is null)
-        //    {
-        //        _logger.LogWarning($"endStep 为空, orderNo:{order.No}");
-        //        continue;
-        //    }
+        var updateOrders = new List<Order>();
+        foreach (var order in orders)
+        {
+            var workflow = workflows.First(d => d.Id == order.WorkflowId);
 
-        //    var step = workflow.Steps.FirstOrDefault(d => d.Id == endStep.PrevStepId);
-        //    //var trace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.Id == endTrace.PrevStepId)?.WorkflowTrace;
-        //    if (step is null)
-        //    {
-        //        _logger.LogWarning($"step 为空, orderNo:{order.No}");
-        //        continue;
-        //    }
+            _mapper.Map(workflow, order);
+            var now = order.FiledTime.Value;//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;
+            var creationTimeHandleDurationWorkday = order.ActualHandleTime.HasValue
+                   ? _timeLimitDomainService.CalcWorkTime(order.CreationTime, now,
+                   order.ProcessType is EProcessType.Zhiban)
+                   : 0;
+            var centerToOrgHandleDurationWorkday = order.ActualHandleTime.HasValue && order.CenterToOrgTime.HasValue
+                ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value, now,
+                order.ProcessType is EProcessType.Zhiban)
+                : 0;
 
-        //    var trace = step.WorkflowTrace;
-        //    order.FileUserId = trace.HandlerId;
-        //    order.FileUserName = trace.HandlerName;
-        //    order.FileUserOrgId = trace.HandlerOrgId;
-        //    order.FileUserOrgName = trace.HandlerOrgName;
-        //    order.FileOpinion = trace.Opinion;
+            //order.File(now, handleDuration, fileDuration, allDuration, creationTimeHandleDurationWorkday, centerToOrgHandleDurationWorkday);
 
-        //    //记录冗余归档数据
-        //    if (workflow.Steps.Any(x => x.BusinessType == Share.Enums.FlowEngine.EBusinessType.Send))
-        //    {
-        //        order.FileUserRole = EFileUserType.Dispatch;
-        //    }
-        //    else
-        //    {
-        //        order.FileUserRole = EFileUserType.Seat;
-        //    }
-        //    if (order.ProcessType == EProcessType.Jiaoban)
-        //    {
-        //        order.FileUserRole = EFileUserType.Org;
-        //    }
+            order.HandleDurationWorkday = handleDuration;
+            order.FileDurationWorkday = fileDuration;
+            order.AllDurationWorkday = allDuration;
+            order.CreationTimeHandleDurationWorkday = creationTimeHandleDurationWorkday;
+            order.CenterToOrgHandleDurationWorkday = centerToOrgHandleDurationWorkday;
 
-        //    //是否已解决
-        //    order.IsResolved = true;//notification.Dto.External == null ? false : notification.Dto.External.IsResolved;
+            //计算实际办结时长
+            order.SetHandleDuration();
+            order.SetFileDuration();
+            order.SetAllDuration();
+            order.SetCreationTimeHandleDurationWorkday();
+            order.SetCenterToOrgHandleDurationWorkday();
 
-        //    //await _orderRepository.UpdateAsync(order, cancellationToken);
-        //    updateOrders.Add(order);
+            var endStep = workflow.Steps.FirstOrDefault(d => d.StepType == EStepType.End);
+            //var endTrace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.StepType == EStepType.End)?.WorkflowTrace;
+            if (endStep is null)
+            {
+                _logger.LogWarning($"endStep 为空, orderNo:{order.No}");
+                continue;
+            }
 
-        //    //var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken); //由CallAccept改为OtherAccept
-        //    var orderFlowDto = new OrderFlowDto
-        //    {
-        //        Order = _mapper.Map<OrderDto>(order),
-        //        WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
-        //    };
-        //    var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, HttpContext.RequestAborted);
-        //    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);
-        //}
+            var step = workflow.Steps.FirstOrDefault(d => d.Id == endStep.PrevStepId);
+            //var trace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.Id == endTrace.PrevStepId)?.WorkflowTrace;
+            if (step is null)
+            {
+                _logger.LogWarning($"step 为空, orderNo:{order.No}");
+                continue;
+            }
+
+            var trace = step.WorkflowTrace;
+            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))
+            {
+                order.FileUserRole = EFileUserType.Dispatch;
+            }
+            else
+            {
+                order.FileUserRole = EFileUserType.Seat;
+            }
+            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 orderFlowDto = new OrderFlowDto
+            {
+                Order = _mapper.Map<OrderDto>(order),
+                WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
+            };
+            var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, HttpContext.RequestAborted);
+            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);
+        }
 
         //_logger.LogWarning($"更新orders:{updateOrders.Count}");
         //await _orderRepository.UpdateRangeAsync(updateOrders, HttpContext.RequestAborted);

+ 2 - 2
src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs

@@ -168,11 +168,11 @@ public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
                     order.ProcessType is EProcessType.Zhiban)
                     : 0;
                 var creationTimeHandleDurationWorkday = order.ActualHandleTime.HasValue
-                    ? _timeLimitDomainService.CalcWorkTime(order.CreationTime, order.ActualHandleTime.Value,
+                    ? _timeLimitDomainService.CalcWorkTime(order.CreationTime, now,
                     order.ProcessType is EProcessType.Zhiban)
                     : 0;
                 var centerToOrgHandleDurationWorkday = order.ActualHandleTime.HasValue && order.CenterToOrgTime.HasValue
-                    ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value, order.ActualHandleTime.Value,
+                    ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value, now,
                     order.ProcessType is EProcessType.Zhiban)
                     : 0;
 

+ 2 - 2
src/Hotline.Application/Orders/OrderApplication.cs

@@ -193,11 +193,11 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 order.ProcessType is EProcessType.Zhiban)
             : 0;
         var creationTimeHandleDurationWorkday = order.ActualHandleTime.HasValue
-                    ? _timeLimitDomainService.CalcWorkTime(order.CreationTime, order.ActualHandleTime.Value,
+                    ? _timeLimitDomainService.CalcWorkTime(order.CreationTime, now,
                     order.ProcessType is EProcessType.Zhiban)
                     : 0;
         var centerToOrgHandleDurationWorkday = order.ActualHandleTime.HasValue && order.CenterToOrgTime.HasValue
-            ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value, order.ActualHandleTime.Value,
+            ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value, now,
             order.ProcessType is EProcessType.Zhiban)
             : 0;
 

+ 4 - 4
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -97,22 +97,22 @@ namespace Hotline.Share.Dtos.Order
         public double AllDuration { get; set; }
 
         /// <summary>
-        /// 办结时长(秒) 办结时间-受理时间(工单创建时间)
+        /// 办结时长(秒) 归档时间-受理时间(工单创建时间)
         /// </summary>
         public double? CreationTimeHandleDuration { get; set; }
 
         /// <summary>
-        /// 办结工作日时长(秒)办结时间-受理时间(工单创建时间)
+        /// 办结工作日时长(秒)归档时间-受理时间(工单创建时间)
         /// </summary>
         public double? CreationTimeHandleDurationWorkday { get; set; }
 
         /// <summary>
-        /// 办结时长(秒) 办结时间-派单时间(中心到部门时间)
+        /// 办结时长(秒) 归档时间-派单时间(中心到部门时间)
         /// </summary>
         public double? CenterToOrgHandleDuration { get; set; }
 
         /// <summary>
-        /// 办结工作日时长(秒)办结时间-派单时间(中心到部门时间)
+        /// 办结工作日时长(秒)归档时间-派单时间(中心到部门时间)
         /// </summary>
         public double? CenterToOrgHandleDurationWorkday { get; set; }