TaskSubmitCaseRecordJob.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using DataSharing.Province.SendTask.SubmitCaseRecord;
  2. using DataSharing.RawData;
  3. using DataSharing.SendTask;
  4. using DataSharing.Share.Dtos.Province;
  5. using DataSharing.Share.Enums;
  6. using MapsterMapper;
  7. using Microsoft.Extensions.Logging;
  8. using Quartz;
  9. using System.Text.Json;
  10. using XF.Domain.Repository;
  11. namespace DataSharing.Province.SendTask
  12. {
  13. /// <summary>
  14. /// 电话记录
  15. /// </summary>
  16. public class TaskSubmitCaseRecordJob : IJob, IDisposable
  17. {
  18. private readonly IMapper _mapper;
  19. private readonly ILogger<TaskSubmitCaseRecordJob> _logger;
  20. private readonly IRepository<DsSendTaskSubmitCaseRecord> _sendTaskSubmitCaseRecordRepository;
  21. private readonly IRepository<DsWaitSendTaskSubmitCaseRecord> _waitSendTaskSubmitCaseRecordRepository;
  22. private readonly IChannelConfigurationManager _channelConfigurationManager;
  23. private readonly HuiJuClient _huiJuClient;
  24. private readonly IRepository<DsSendTaskDetailInfo> _sendTaskDetailInfoRepository;
  25. private readonly IRepository<DsTelCall> _dsTelCallRepository;
  26. /// <summary>
  27. ///
  28. /// </summary>
  29. /// <param name="mapper"></param>
  30. /// <param name="logger"></param>
  31. /// <param name="sendTaskSubmitCaseRecordRepository"></param>
  32. /// <param name="waitSendTaskSubmitCaseRecordRepository"></param>
  33. /// <param name="channelConfigurationManager"></param>
  34. /// <param name="huiJuClient"></param>
  35. /// <param name="sendTaskDetailInfoRepository"></param>
  36. /// <param name="dsTelCallRepository"></param>
  37. public TaskSubmitCaseRecordJob(IMapper mapper, ILogger<TaskSubmitCaseRecordJob> logger,
  38. IRepository<DsSendTaskSubmitCaseRecord> sendTaskSubmitCaseRecordRepository,
  39. IRepository<DsWaitSendTaskSubmitCaseRecord> waitSendTaskSubmitCaseRecordRepository,
  40. IChannelConfigurationManager channelConfigurationManager,
  41. HuiJuClient huiJuClient,
  42. IRepository<DsSendTaskDetailInfo> sendTaskDetailInfoRepository,
  43. IRepository<DsTelCall> dsTelCallRepository)
  44. {
  45. _mapper = mapper;
  46. _logger = logger;
  47. _sendTaskSubmitCaseRecordRepository = sendTaskSubmitCaseRecordRepository;
  48. _waitSendTaskSubmitCaseRecordRepository = waitSendTaskSubmitCaseRecordRepository;
  49. _channelConfigurationManager = channelConfigurationManager;
  50. _huiJuClient = huiJuClient;
  51. _sendTaskDetailInfoRepository = sendTaskDetailInfoRepository;
  52. _dsTelCallRepository = dsTelCallRepository;
  53. }
  54. /// <summary>
  55. ///
  56. /// </summary>
  57. /// <param name="context"></param>
  58. /// <returns></returns>
  59. public async Task Execute(IJobExecutionContext context)
  60. {
  61. var configProvince = _channelConfigurationManager.GetConfigurationProvince();
  62. //加载数据
  63. var tasks = await _waitSendTaskSubmitCaseRecordRepository.Queryable()
  64. .Where(d => d.State == EWaitSendTaskState.WaitPush && d.SendTimes <= 6)
  65. .OrderBy(d => d.CreationTime)
  66. .Take(50)
  67. .ToListAsync(context.CancellationToken);
  68. _logger.LogWarning("业务汇聚-电话记录读取数据条数--------------------------------------" + tasks.Count);
  69. if (tasks.Count != 0)
  70. {
  71. #region 处理请求参数
  72. var request = new ProvinceListRequest<Share.Dtos.Province.HuiJu.SubmitCaseRecordInfo>(configProvince.ClientId, configProvince.ClientSecret);
  73. List<Share.Dtos.Province.HuiJu.SubmitCaseRecordInfo> listOrder = [];
  74. #endregion
  75. List<DsWaitSendTaskSubmitCaseRecord> taskData = [];
  76. //处理推送数据
  77. foreach (var sendTask in tasks)
  78. {
  79. //状态更改为推送中
  80. sendTask.State = EWaitSendTaskState.Pushing;
  81. //使用乐观锁,控制数据
  82. if (await _waitSendTaskSubmitCaseRecordRepository.Updateable(sendTask).ExecuteCommandWithOptLockAsync() > 0)
  83. {
  84. //组装这一条数据
  85. listOrder.Add(sendTask.RequestData);
  86. taskData.Add(sendTask);
  87. }
  88. }
  89. _logger.LogWarning("业务汇聚-电话记录锁定条数--------------------------------------" + taskData.Count);
  90. if (listOrder != null && listOrder.Count > 0)
  91. {
  92. request.SetData(listOrder);
  93. var jsonData = request.ToString();
  94. _logger.LogWarning("业务汇聚-电话记录请求参数--------------------------------------" + jsonData);
  95. ProvinceResponse result = new();
  96. string error = "";
  97. //执行推送任务
  98. try
  99. {
  100. result = await _huiJuClient.RequestAsync<ProvinceResponse>(configProvince.HuiJu + PtahDefaults.SubmitCaseRecord, "Post", jsonData, context.CancellationToken);
  101. }
  102. catch (Exception ex)
  103. {
  104. error = ex.Message;
  105. }
  106. _logger.LogWarning("业务汇聚-电话记录返回参数--------------------------------------" + JsonSerializer.Serialize(result));
  107. if (result != null)
  108. {
  109. //处理数据
  110. foreach (var item in taskData)
  111. {
  112. //查询是否有错误
  113. //有错误处理
  114. //没有错误删除待推送表,更新主表
  115. bool isError = false;
  116. if (result == null || result.Custom == null || result.ReturnInfo == null)
  117. {
  118. //请求报错,那么则所有的推送失败
  119. isError = true;
  120. }
  121. else
  122. {
  123. if (result.Custom.ErrorObjs.Exists(p => p.CaseSerial == item.ProvinceNo))
  124. isError = true;
  125. }
  126. #region 处理待推送表数据
  127. //处理待推送数据
  128. if (isError)
  129. {
  130. //修改
  131. item.LastTime = DateTime.Now;
  132. item.SendTimes = item.SendTimes + 1;
  133. if (item.FirstTime is null)
  134. item.FirstTime = DateTime.Now;
  135. if (item.SendTimes >= 7)
  136. item.State = EWaitSendTaskState.PushFail;
  137. else
  138. item.State = EWaitSendTaskState.WaitPush;
  139. //修改待推送表
  140. await _waitSendTaskSubmitCaseRecordRepository.UpdateAsync(item, context.CancellationToken);
  141. }
  142. else
  143. {
  144. //删除
  145. await _waitSendTaskSubmitCaseRecordRepository.RemoveAsync(item, cancellationToken: context.CancellationToken);
  146. }
  147. #endregion
  148. #region 处理推送主表数据
  149. //查询主表
  150. var sendData = await _sendTaskSubmitCaseRecordRepository.GetAsync(p => p.Id == item.Id, context.CancellationToken);
  151. if (sendData != null)
  152. {
  153. sendData.LastTime = DateTime.Now;
  154. sendData.SendTimes = sendData.SendTimes + 1;
  155. if (sendData.FirstTime is null)
  156. sendData.FirstTime = DateTime.Now;
  157. sendData.IsSuccess = isError == false ? ESendTaskState.PushSuccess : ESendTaskState.PushFail;
  158. await _sendTaskSubmitCaseRecordRepository.UpdateAsync(sendData, cancellationToken: context.CancellationToken);
  159. }
  160. #endregion
  161. #region 新增推送明细
  162. //新增明细
  163. DsSendTaskDetailInfo dsSendTaskDetailInfo = new()
  164. {
  165. TaskId = item.Id,
  166. IsSuccess = !isError,
  167. Result = JsonSerializer.Serialize(result),
  168. ResultErrorData = error,
  169. ProcessingServices = _channelConfigurationManager.GetConfigurationProcessingServices()
  170. };
  171. await _sendTaskDetailInfoRepository.AddAsync(dsSendTaskDetailInfo, context.CancellationToken);
  172. #endregion
  173. #region 处理通话记录的上传时间,用于统计
  174. //处理通话记录的上传时间,用于统计
  175. var telCall = await _dsTelCallRepository.GetAsync(p => p.TaskId == item.Id, context.CancellationToken);
  176. if (telCall != null)
  177. {
  178. if (telCall.FirstSendProvinceTime is null)
  179. telCall.FirstSendProvinceTime = DateTime.Now;
  180. telCall.LastSendProvinceTime = DateTime.Now;
  181. await _dsTelCallRepository.UpdateAsync(telCall, context.CancellationToken);
  182. }
  183. #endregion
  184. }
  185. }
  186. }
  187. }
  188. }
  189. public void Dispose()
  190. {
  191. }
  192. }
  193. }