|
@@ -7,6 +7,8 @@ using Fw.Utility.Client;
|
|
using Google.Protobuf.WellKnownTypes;
|
|
using Google.Protobuf.WellKnownTypes;
|
|
using Hotline.Ai.Visit;
|
|
using Hotline.Ai.Visit;
|
|
using Hotline.Application.ExportExcel;
|
|
using Hotline.Application.ExportExcel;
|
|
|
|
+using Hotline.Application.JudicialManagement;
|
|
|
|
+using Hotline.Application.Quality;
|
|
using Hotline.CallCenter.BlackLists;
|
|
using Hotline.CallCenter.BlackLists;
|
|
using Hotline.CallCenter.Calls;
|
|
using Hotline.CallCenter.Calls;
|
|
using Hotline.CallCenter.Devices;
|
|
using Hotline.CallCenter.Devices;
|
|
@@ -19,17 +21,22 @@ using Hotline.Orders;
|
|
using Hotline.Push.Notifies;
|
|
using Hotline.Push.Notifies;
|
|
using Hotline.Realtimes;
|
|
using Hotline.Realtimes;
|
|
using Hotline.Repository.SqlSugar;
|
|
using Hotline.Repository.SqlSugar;
|
|
|
|
+using Hotline.Repository.SqlSugar.CallCenter;
|
|
using Hotline.Repository.SqlSugar.System;
|
|
using Hotline.Repository.SqlSugar.System;
|
|
using Hotline.Repository.SqlSugar.Ts;
|
|
using Hotline.Repository.SqlSugar.Ts;
|
|
using Hotline.Settings;
|
|
using Hotline.Settings;
|
|
using Hotline.Settings.TimeLimits;
|
|
using Hotline.Settings.TimeLimits;
|
|
using Hotline.Share.Dtos;
|
|
using Hotline.Share.Dtos;
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
using Hotline.Share.Dtos.FlowEngine;
|
|
|
|
+using Hotline.Share.Dtos.FlowEngine.Workflow;
|
|
using Hotline.Share.Dtos.Order;
|
|
using Hotline.Share.Dtos.Order;
|
|
using Hotline.Share.Dtos.Realtime;
|
|
using Hotline.Share.Dtos.Realtime;
|
|
using Hotline.Share.Dtos.SendSms;
|
|
using Hotline.Share.Dtos.SendSms;
|
|
|
|
+using Hotline.Share.Dtos.TrCallCenter;
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
using Hotline.Share.Enums.FlowEngine;
|
|
|
|
+using Hotline.Share.Enums.Order;
|
|
using Hotline.Share.Enums.Push;
|
|
using Hotline.Share.Enums.Push;
|
|
|
|
+using Hotline.Share.Enums.Quality;
|
|
using Hotline.Share.Enums.Settings;
|
|
using Hotline.Share.Enums.Settings;
|
|
using Hotline.Share.Mq;
|
|
using Hotline.Share.Mq;
|
|
using Hotline.Tools;
|
|
using Hotline.Tools;
|
|
@@ -59,6 +66,7 @@ using XF.Domain.Locks;
|
|
using XF.Domain.Queues;
|
|
using XF.Domain.Queues;
|
|
using XF.Domain.Repository;
|
|
using XF.Domain.Repository;
|
|
using XF.EasyCaching;
|
|
using XF.EasyCaching;
|
|
|
|
+using Order = Hotline.Orders.Order;
|
|
|
|
|
|
namespace Hotline.Api.Controllers;
|
|
namespace Hotline.Api.Controllers;
|
|
|
|
|
|
@@ -97,10 +105,15 @@ public class TestController : BaseController
|
|
private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
|
|
private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
|
|
|
|
|
|
private readonly IRepository<WorkflowStep> _workflowStepRepository;
|
|
private readonly IRepository<WorkflowStep> _workflowStepRepository;
|
|
|
|
+
|
|
|
|
+ private readonly IWorkflowRepository _workflowRepository;
|
|
//private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
|
|
//private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
|
|
|
|
|
|
private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
|
|
private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
|
|
private readonly IOrderRepository _orderRepository;
|
|
private readonly IOrderRepository _orderRepository;
|
|
|
|
+ private readonly IRepository<TrCallRecord> _trCallRecordRepository;
|
|
|
|
+ private readonly IQualityApplication _qualityApplication;
|
|
|
|
+ private readonly IEnforcementApplication _enforcementApplication;
|
|
private readonly IMapper _mapper;
|
|
private readonly IMapper _mapper;
|
|
private readonly IOptionsSnapshot<SendSmsConfiguration> _sendSmsConfiguration;
|
|
private readonly IOptionsSnapshot<SendSmsConfiguration> _sendSmsConfiguration;
|
|
|
|
|
|
@@ -138,9 +151,13 @@ public class TestController : BaseController
|
|
IAiVisitService aiVisitService,
|
|
IAiVisitService aiVisitService,
|
|
IRepository<WorkflowTrace> workflowTraceRepository,
|
|
IRepository<WorkflowTrace> workflowTraceRepository,
|
|
IRepository<WorkflowStep> workflowStepRepository,
|
|
IRepository<WorkflowStep> workflowStepRepository,
|
|
|
|
+ IWorkflowRepository workflowRepository,
|
|
//IRepository<WorkflowStepHandler> workflowStepHandleRepository,
|
|
//IRepository<WorkflowStepHandler> workflowStepHandleRepository,
|
|
IRepository<SystemOrganize> systemOrganizeRepository,
|
|
IRepository<SystemOrganize> systemOrganizeRepository,
|
|
IOrderRepository orderRepository,
|
|
IOrderRepository orderRepository,
|
|
|
|
+ IRepository<TrCallRecord> trCallRecordRepository,
|
|
|
|
+ IQualityApplication qualityApplication,
|
|
|
|
+ IEnforcementApplication enforcementApplication,
|
|
IMapper mapper,
|
|
IMapper mapper,
|
|
|
|
|
|
|
|
|
|
@@ -172,9 +189,13 @@ public class TestController : BaseController
|
|
_aiVisitService = aiVisitService;
|
|
_aiVisitService = aiVisitService;
|
|
_workflowTraceRepository = workflowTraceRepository;
|
|
_workflowTraceRepository = workflowTraceRepository;
|
|
_workflowStepRepository = workflowStepRepository;
|
|
_workflowStepRepository = workflowStepRepository;
|
|
|
|
+ _workflowRepository = workflowRepository;
|
|
//_workflowStepHandleRepository = workflowStepHandleRepository;
|
|
//_workflowStepHandleRepository = workflowStepHandleRepository;
|
|
_systemOrganizeRepository = systemOrganizeRepository;
|
|
_systemOrganizeRepository = systemOrganizeRepository;
|
|
_orderRepository = orderRepository;
|
|
_orderRepository = orderRepository;
|
|
|
|
+ _trCallRecordRepository = trCallRecordRepository;
|
|
|
|
+ _qualityApplication = qualityApplication;
|
|
|
|
+ _enforcementApplication = enforcementApplication;
|
|
_orderRepository = orderRepository;
|
|
_orderRepository = orderRepository;
|
|
_mapper = mapper;
|
|
_mapper = mapper;
|
|
_sendSmsConfiguration = sendSmsConfiguration;
|
|
_sendSmsConfiguration = sendSmsConfiguration;
|
|
@@ -557,41 +578,95 @@ public class TestController : BaseController
|
|
[HttpPost("t4")]
|
|
[HttpPost("t4")]
|
|
public async Task TestExportExcel1()
|
|
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);
|
|
.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
|
|
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")]
|
|
[HttpGet("rsa")]
|