|
@@ -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;
|
|
@@ -16,17 +18,25 @@ using Hotline.FlowEngine.Workflows;
|
|
|
using Hotline.Identity.Roles;
|
|
|
using Hotline.Import;
|
|
|
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;
|
|
@@ -44,6 +54,7 @@ using NewRock.Sdk;
|
|
|
using NewRock.Sdk.Security;
|
|
|
using SqlSugar;
|
|
|
using SqlSugar.SplitTableExtensions;
|
|
|
+using StackExchange.Redis;
|
|
|
using Tr.Sdk;
|
|
|
using XC.RSAUtil;
|
|
|
using XF.Domain.Authentications;
|
|
@@ -55,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;
|
|
|
|
|
@@ -75,7 +87,7 @@ public class TestController : BaseController
|
|
|
private readonly IBlacklistDomainService _blacklistDomainService;
|
|
|
private readonly IIvrDomainService _ivrDomainService;
|
|
|
private readonly ISugarUnitOfWork<HotlineDbContext> _uow;
|
|
|
- private readonly IRepository<Role> _roleRepository;
|
|
|
+ private readonly IRepository<Identity.Roles.Role> _roleRepository;
|
|
|
private readonly IMediator _mediator;
|
|
|
|
|
|
private readonly IDistributedLock _distributedLock;
|
|
@@ -93,11 +105,17 @@ 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;
|
|
|
|
|
|
|
|
|
//private readonly ITypedCache<List<User>> _cache;
|
|
@@ -118,7 +136,7 @@ public class TestController : BaseController
|
|
|
IBlacklistDomainService blacklistDomainService,
|
|
|
IIvrDomainService ivrDomainService,
|
|
|
ISugarUnitOfWork<HotlineDbContext> uow,
|
|
|
- IRepository<Role> roleRepository,
|
|
|
+ IRepository<Identity.Roles.Role> roleRepository,
|
|
|
IMediator mediator,
|
|
|
IDistributedLock distributedLock,
|
|
|
IRepository<OrderUrge> orderUrgeRepository,
|
|
@@ -133,10 +151,17 @@ public class TestController : BaseController
|
|
|
IAiVisitService aiVisitService,
|
|
|
IRepository<WorkflowTrace> workflowTraceRepository,
|
|
|
IRepository<WorkflowStep> workflowStepRepository,
|
|
|
+ IWorkflowRepository workflowRepository,
|
|
|
//IRepository<WorkflowStepHandler> workflowStepHandleRepository,
|
|
|
IRepository<SystemOrganize> systemOrganizeRepository,
|
|
|
IOrderRepository orderRepository,
|
|
|
- IMapper mapper
|
|
|
+ IRepository<TrCallRecord> trCallRecordRepository,
|
|
|
+ IQualityApplication qualityApplication,
|
|
|
+ IEnforcementApplication enforcementApplication,
|
|
|
+ IMapper mapper,
|
|
|
+
|
|
|
+
|
|
|
+ IOptionsSnapshot<SendSmsConfiguration> sendSmsConfiguration
|
|
|
)
|
|
|
{
|
|
|
_logger = logger;
|
|
@@ -164,16 +189,38 @@ 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;
|
|
|
}
|
|
|
|
|
|
[HttpGet("testo")]
|
|
|
+ [AllowAnonymous]
|
|
|
public async Task<OpenResponse> TestOrigin()
|
|
|
{
|
|
|
+ var messageDto = new Share.Dtos.Push.MessageDto
|
|
|
+ {
|
|
|
+ PushBusiness = EPushBusiness.OrderAccept,
|
|
|
+ ExternalId = "123456789",
|
|
|
+ OrderId = "123456789",
|
|
|
+ PushPlatform = EPushPlatform.Sms,
|
|
|
+ Remark =" order.Title",
|
|
|
+ Name ="张三",
|
|
|
+ TemplateCode = "1005",
|
|
|
+ Params = new List<string>() { "20240610000022", "12345" },
|
|
|
+ TelNumber = "15881689499",
|
|
|
+
|
|
|
+ };
|
|
|
+ await _mediator.Publish(new PushMessageNotify(messageDto), HttpContext.RequestAborted);
|
|
|
+
|
|
|
+ var t = _sendSmsConfiguration.Value.Url;
|
|
|
var now = DateTime.Now.ToString();
|
|
|
return OpenResponse.Ok(now);
|
|
|
}
|
|
@@ -316,7 +363,7 @@ public class TestController : BaseController
|
|
|
[HttpGet("pgsql")]
|
|
|
public async Task<string> Pgsql()
|
|
|
{
|
|
|
- var role = new Role
|
|
|
+ var role = new Identity.Roles.Role
|
|
|
{
|
|
|
Name = $"test_role_{TimeOnly.FromDateTime(DateTime.Now)}",
|
|
|
DisplayName = "test_role_display",
|
|
@@ -331,7 +378,7 @@ public class TestController : BaseController
|
|
|
|
|
|
[AllowAnonymous]
|
|
|
[HttpGet("roles")]
|
|
|
- public async Task<List<Role>> GetRoles()
|
|
|
+ public async Task<List<Identity.Roles.Role>> GetRoles()
|
|
|
{
|
|
|
using var lockManager = new LockManager(_distributedLock, $"{nameof(TestController)}.{nameof(GetRoles)}");
|
|
|
lockManager.InvokeInLock(() => { Console.WriteLine("do something"); }, TimeSpan.FromSeconds(10));
|
|
@@ -531,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")]
|