|
@@ -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);
|