|
@@ -0,0 +1,259 @@
|
|
|
+using DataSharing.Province;
|
|
|
+using DataSharing.RawData;
|
|
|
+using DataSharing.Share.Consts;
|
|
|
+using DataSharing.Share.Dtos.HotlineWeb;
|
|
|
+using DataSharing.Share.Dtos.Province;
|
|
|
+using DataSharing.Share.Dtos.Province.XieTong;
|
|
|
+using DataSharing.Share.Dtos.Province.XieTong.Receive;
|
|
|
+using DataSharing.Share.Dtos.Province.XieTong.Send;
|
|
|
+using DataSharing.Share.Enums;
|
|
|
+using DotNetCore.CAP;
|
|
|
+using MapsterMapper;
|
|
|
+using Microsoft.Extensions.Logging;
|
|
|
+using Quartz;
|
|
|
+using SqlSugar;
|
|
|
+using XF.Domain.Cache;
|
|
|
+using XF.Domain.Repository;
|
|
|
+
|
|
|
+namespace DataSharing.SendTask
|
|
|
+{
|
|
|
+ public class TaskCaseDistrecordJob : IJob, IDisposable
|
|
|
+ {
|
|
|
+ private readonly ILogger<TaskLoadJob> _logger;
|
|
|
+ private readonly IRepository<DsSendCaseInfo> _sendCaseInfoRepository;
|
|
|
+ private readonly IChannelConfigurationManager _channelConfigurationManager;
|
|
|
+ private readonly XieTongClient _xieTongClient;
|
|
|
+ private readonly IMapper _mapper;
|
|
|
+ private readonly IRepository<DsGetCaseDistrecordSend> _getCaseDistrecordSendRepository;
|
|
|
+ private readonly ICapPublisher _capPublisher;
|
|
|
+ private readonly ITypedCache<ConfigurationInformationDto> _configurationInformationCache;
|
|
|
+ private readonly IRepository<DsOrder> _dsOrderRepository;
|
|
|
+ private readonly IRepository<DsTelCall> _dsTelCallRepository;
|
|
|
+ private readonly IRepository<DsSendTask> _dsSendTaskRepository;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ ///
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="logger"></param>
|
|
|
+ /// <param name="sendCaseInfoRepository"></param>
|
|
|
+ /// <param name="channelConfigurationManager"></param>
|
|
|
+ /// <param name="xieTongClient"></param>
|
|
|
+ /// <param name="mapper"></param>
|
|
|
+ /// <param name="getCaseDistrecordSendRepository"></param>
|
|
|
+ /// <param name="capPublisher"></param>
|
|
|
+ /// <param name="configurationInformationCache"></param>
|
|
|
+ /// <param name="dsOrderRepository"></param>
|
|
|
+ /// <param name="dsTelCallRepository"></param>
|
|
|
+ /// <param name="dsSendTaskRepository"></param>
|
|
|
+ public TaskCaseDistrecordJob(ILogger<TaskLoadJob> logger,
|
|
|
+ IRepository<DsSendCaseInfo> sendCaseInfoRepository,
|
|
|
+ IChannelConfigurationManager channelConfigurationManager,
|
|
|
+ XieTongClient xieTongClient,
|
|
|
+ IMapper mapper,
|
|
|
+ IRepository<DsGetCaseDistrecordSend> getCaseDistrecordSendRepository,
|
|
|
+ ICapPublisher capPublisher,
|
|
|
+ ITypedCache<ConfigurationInformationDto> configurationInformationCache,
|
|
|
+ IRepository<DsOrder> dsOrderRepository,
|
|
|
+ IRepository<DsTelCall> dsTelCallRepository,
|
|
|
+ IRepository<DsSendTask> dsSendTaskRepository)
|
|
|
+ {
|
|
|
+ _logger = logger;
|
|
|
+ _sendCaseInfoRepository = sendCaseInfoRepository;
|
|
|
+ _channelConfigurationManager = channelConfigurationManager;
|
|
|
+ _xieTongClient = xieTongClient;
|
|
|
+ _mapper = mapper;
|
|
|
+ _getCaseDistrecordSendRepository = getCaseDistrecordSendRepository;
|
|
|
+ _capPublisher = capPublisher;
|
|
|
+ _configurationInformationCache = configurationInformationCache;
|
|
|
+ _dsOrderRepository = dsOrderRepository;
|
|
|
+ _dsTelCallRepository = dsTelCallRepository;
|
|
|
+ _dsSendTaskRepository = dsSendTaskRepository;
|
|
|
+ }
|
|
|
+
|
|
|
+ public async Task Execute(IJobExecutionContext context)
|
|
|
+ {
|
|
|
+ //实时服务上报
|
|
|
+ await SendRealTimeStatusAsync(context.CancellationToken);
|
|
|
+
|
|
|
+ #region 定时拉取12315的数据
|
|
|
+ //定时拉取12315的数据
|
|
|
+ var listSendCaseInfo = await _sendCaseInfoRepository
|
|
|
+ .Queryable()
|
|
|
+ .Where(p => p.IsEnd == false)
|
|
|
+ .OrderBy(p => p.CreationTime)
|
|
|
+ .ToListAsync();
|
|
|
+ //处理数据
|
|
|
+ if (listSendCaseInfo.Any())
|
|
|
+ {
|
|
|
+ foreach (var itemData in listSendCaseInfo)
|
|
|
+ {
|
|
|
+ GetCaseDistrecordSendInfo distrecordSendInfo = new() { CaseSerial = itemData.CaseSerial };
|
|
|
+
|
|
|
+ #region 处理请求参数
|
|
|
+ var configProvince = _channelConfigurationManager.GetConfigurationProvince();
|
|
|
+ var request = new ProvinceRequest<GetCaseDistrecordSendInfo>(configProvince.ClientId, configProvince.ClientSecret);
|
|
|
+ request.SetData(distrecordSendInfo);
|
|
|
+ var jsonData = request.ToString();
|
|
|
+
|
|
|
+ var baseAddress = configProvince.XieTong;
|
|
|
+ if (!baseAddress.EndsWith('/'))
|
|
|
+ baseAddress += "/";
|
|
|
+
|
|
|
+ var url = baseAddress + "rest/market/get_case_distrecord_send";
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ var response = await _xieTongClient.RequestAsync<ProvinceDistrecordResponse>(url, "Post", jsonData, context.CancellationToken);
|
|
|
+
|
|
|
+ if (response is null || response.status is null || response.custom is null)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (response.status.code != "1")
|
|
|
+ continue;
|
|
|
+
|
|
|
+ //这里处理业务
|
|
|
+ if (response.custom.STEP_List != null && response.custom.STEP_List.Count > 0)
|
|
|
+ {
|
|
|
+ //这里调用业务接口,推送办理数据
|
|
|
+ List<SharingWorkflowTraceDto> Traces = new();
|
|
|
+ //遍历返回的数据
|
|
|
+ foreach (var item in response.custom.STEP_List)
|
|
|
+ {
|
|
|
+ //检测当前数据是否存在,如果存在不处理,不存在新增到数据库并推送到业务系统
|
|
|
+ if (!await _getCaseDistrecordSendRepository.AnyAsync(p => p.CaseSerial == response.custom.CASE_SERIAL && p.RowGuid == item.RowGuid, context.CancellationToken))
|
|
|
+ {
|
|
|
+ var tempData = _mapper.Map<DsGetCaseDistrecordSend>(item);
|
|
|
+ await _getCaseDistrecordSendRepository.AddAsync(tempData);
|
|
|
+
|
|
|
+ Traces.Add(new()
|
|
|
+ {
|
|
|
+ HandlerName = item.OperatorName,
|
|
|
+ HandlerOrgName = item.OperatorouName,
|
|
|
+ HandleTime = item.HandleTime,
|
|
|
+ Opinion = item.HandleOpinion
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ SharingAddOrderTracesDto addOrderTracesDto = new()
|
|
|
+ {
|
|
|
+ OrderId = itemData.OrderID,
|
|
|
+ Traces = Traces
|
|
|
+ };
|
|
|
+ //往业务系统推送数据
|
|
|
+ await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderAddTraces, addOrderTracesDto, cancellationToken: context.CancellationToken);
|
|
|
+ }
|
|
|
+
|
|
|
+ Thread.Sleep(2000);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
+ _logger.LogError($"进来了时间是{DateTime.Now}");
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Dispose()
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 实时服务上报
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="cancellationToken"></param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private async Task SendRealTimeStatusAsync(CancellationToken cancellationToken = default)
|
|
|
+ {
|
|
|
+ var areaInfo = _channelConfigurationManager.GetConfigurationCityCode();
|
|
|
+ //实时服务信息
|
|
|
+ SendRealTimeStatusInfo dto = new()
|
|
|
+ {
|
|
|
+ AreaCode = areaInfo.AreaCode,
|
|
|
+ AreaName = areaInfo.AreaName
|
|
|
+ };
|
|
|
+
|
|
|
+ //获取系统配置的数据
|
|
|
+ var configurationInformation = await _configurationInformationCache.GetAsync(ConstantSettings.ConfigurationInformationCacheKey, cancellationToken);
|
|
|
+ if (configurationInformation != null)
|
|
|
+ {
|
|
|
+ dto.CrntSeatNum = configurationInformation.CrntSeatNum;
|
|
|
+ dto.CrntTelNum = configurationInformation.CrntTelNum;
|
|
|
+ }
|
|
|
+
|
|
|
+ #region 数据查询
|
|
|
+ //数据查询
|
|
|
+ var list = await _dsOrderRepository.Queryable()
|
|
|
+ .Where(p => p.CaseDate >= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")))
|
|
|
+ .Where(p => p.CaseDate <= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59")))
|
|
|
+ .Select(it => new
|
|
|
+ {
|
|
|
+ it.CaseSourceCode
|
|
|
+ })
|
|
|
+ //.MergeTable()//将查询出来的结果合并成一个新表
|
|
|
+ // .GroupBy(it => new { it.CaseSourceCode })//对新表进行分组
|
|
|
+ .Select(it => new SendRealTimeStatusInfo
|
|
|
+ {
|
|
|
+ TdyNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.CaseSourceCode != "", 1, 0)),
|
|
|
+ TdyTelNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.CaseSourceCode == "RGDH", 1, 0)),
|
|
|
+ TdyZwNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.CaseSourceCode == "SCZWFWW", 1, 0)),
|
|
|
+ TdyWzNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.CaseSourceCode == "YTW" || it.CaseSourceCode == "WZ", 1, 0)),
|
|
|
+ TdyWxNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.CaseSourceCode == "WX", 1, 0)),
|
|
|
+ TdyApNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.CaseSourceCode == "AP", 1, 0)),
|
|
|
+ TdyOtNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.CaseSourceCode != "RGDH" && it.CaseSourceCode != "SCZWFWW"
|
|
|
+ && it.CaseSourceCode != "YTW" && it.CaseSourceCode != "WZ" && it.CaseSourceCode != "WX" && it.CaseSourceCode != "AP", 1, 0)),
|
|
|
+ })
|
|
|
+ .ToListAsync();
|
|
|
+ if (list != null && list.Count > 0)
|
|
|
+ {
|
|
|
+ dto.TdyNum = list.Sum(x => x.TdyNum);
|
|
|
+ dto.TdyTelNum = list.Sum(x => x.TdyTelNum);
|
|
|
+ dto.TdyZwNum = list.Sum(x => x.TdyZwNum);
|
|
|
+ dto.TdyWzNum = list.Sum(x => x.TdyWzNum);
|
|
|
+ dto.TdyWxNum = list.Sum(x => x.TdyWxNum);
|
|
|
+ dto.TdyApNum = list.Sum(x => x.TdyApNum);
|
|
|
+ dto.TdyOtNum = list.Sum(x => x.TdyOtNum);
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+ #region 计算今日接通率
|
|
|
+ //计算今日接通率
|
|
|
+ ///电话
|
|
|
+ var callRate = await _dsTelCallRepository.Queryable()
|
|
|
+ .Where(p => p.OverTime >= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")) && p.OverTime <= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59")))
|
|
|
+ .Select(p => new TelCallInfoDto
|
|
|
+ {
|
|
|
+ CountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.CallId != null, 1, 0)),//总数
|
|
|
+ ConnectNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.OnState == "1", 1, 0)),//接通
|
|
|
+ })
|
|
|
+ .ToListAsync();
|
|
|
+ if (callRate != null && callRate.Count > 0)
|
|
|
+ {
|
|
|
+ var data = callRate[0];
|
|
|
+ dto.TdyTelRate = data.ConnectionRate;
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+
|
|
|
+
|
|
|
+ #region 处理请求参数
|
|
|
+ var configProvince = _channelConfigurationManager.GetConfigurationProvince();
|
|
|
+ var request = new ProvinceRequest<SendRealTimeStatusInfo>(configProvince.ClientId, configProvince.ClientSecret);
|
|
|
+ request.SetData(dto);
|
|
|
+ var jsonData = request.ToString();
|
|
|
+ var url = configProvince.HuiJu + "sendrealtimestatus";
|
|
|
+ #endregion
|
|
|
+ //组装参数
|
|
|
+ DsSendTask dsSendTask = new()
|
|
|
+ {
|
|
|
+ TaskPriority = 0,
|
|
|
+ TaskType = "SendRealTimeStatus",
|
|
|
+ HttpMethod = "Post",
|
|
|
+ Path = "sendrealtimestatus",
|
|
|
+ PlatformSource = EPlatformSource.Province,
|
|
|
+ FileJson = null,
|
|
|
+ Request = jsonData,
|
|
|
+ GenerationTime = null,
|
|
|
+ PathType = EPathType.HuiJu
|
|
|
+ };
|
|
|
+ await _dsSendTaskRepository.AddAsync(dsSendTask, cancellationToken);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|