using DataSharing.Province.SendTask.SubmitCaseRecord;
using DataSharing.RawData;
using DataSharing.SendTask;
using DataSharing.Share.Dtos.Province;
using DataSharing.Share.Enums;
using MapsterMapper;
using Microsoft.Extensions.Logging;
using Quartz;
using System.Text.Json;
using XF.Domain.Repository;
namespace DataSharing.Province.SendTask
{
///
/// 电话记录
///
public class TaskSubmitCaseRecordJob : IJob, IDisposable
{
private readonly IMapper _mapper;
private readonly ILogger _logger;
private readonly IRepository _sendTaskSubmitCaseRecordRepository;
private readonly IRepository _waitSendTaskSubmitCaseRecordRepository;
private readonly IChannelConfigurationManager _channelConfigurationManager;
private readonly HuiJuClient _huiJuClient;
private readonly IRepository _sendTaskDetailInfoRepository;
private readonly IRepository _dsTelCallRepository;
///
///
///
///
///
///
///
///
///
///
///
public TaskSubmitCaseRecordJob(IMapper mapper, ILogger logger,
IRepository sendTaskSubmitCaseRecordRepository,
IRepository waitSendTaskSubmitCaseRecordRepository,
IChannelConfigurationManager channelConfigurationManager,
HuiJuClient huiJuClient,
IRepository sendTaskDetailInfoRepository,
IRepository dsTelCallRepository)
{
_mapper = mapper;
_logger = logger;
_sendTaskSubmitCaseRecordRepository = sendTaskSubmitCaseRecordRepository;
_waitSendTaskSubmitCaseRecordRepository = waitSendTaskSubmitCaseRecordRepository;
_channelConfigurationManager = channelConfigurationManager;
_huiJuClient = huiJuClient;
_sendTaskDetailInfoRepository = sendTaskDetailInfoRepository;
_dsTelCallRepository = dsTelCallRepository;
}
///
///
///
///
///
public async Task Execute(IJobExecutionContext context)
{
var configProvince = _channelConfigurationManager.GetConfigurationProvince();
//加载数据
var tasks = await _waitSendTaskSubmitCaseRecordRepository.Queryable()
.Where(d => d.State == EWaitSendTaskState.WaitPush && d.SendTimes <= 6)
.OrderBy(d => d.CreationTime)
.Take(50)
.ToListAsync(context.CancellationToken);
_logger.LogWarning("业务汇聚-电话记录读取数据条数--------------------------------------" + tasks.Count);
if (tasks.Count != 0)
{
#region 处理请求参数
var request = new ProvinceListRequest(configProvince.ClientId, configProvince.ClientSecret);
List listOrder = [];
#endregion
List taskData = [];
//处理推送数据
foreach (var sendTask in tasks)
{
//状态更改为推送中
sendTask.State = EWaitSendTaskState.Pushing;
//使用乐观锁,控制数据
if (await _waitSendTaskSubmitCaseRecordRepository.Updateable(sendTask).ExecuteCommandWithOptLockAsync() > 0)
{
//组装这一条数据
listOrder.Add(sendTask.RequestData);
taskData.Add(sendTask);
}
}
_logger.LogWarning("业务汇聚-电话记录锁定条数--------------------------------------" + taskData.Count);
if (listOrder != null && listOrder.Count > 0)
{
request.SetData(listOrder);
var jsonData = request.ToString();
_logger.LogWarning("业务汇聚-电话记录请求参数--------------------------------------" + jsonData);
ProvinceResponse result = new();
string error = "";
//执行推送任务
try
{
result = await _huiJuClient.RequestAsync(configProvince.HuiJu + PtahDefaults.SubmitCaseRecord, "Post", jsonData, context.CancellationToken);
}
catch (Exception ex)
{
error = ex.Message;
}
_logger.LogWarning("业务汇聚-电话记录返回参数--------------------------------------" + JsonSerializer.Serialize(result));
if (result != null)
{
//处理数据
foreach (var item in taskData)
{
//查询是否有错误
//有错误处理
//没有错误删除待推送表,更新主表
bool isError = false;
if (result == null || result.Custom == null || result.ReturnInfo == null)
{
//请求报错,那么则所有的推送失败
isError = true;
}
else
{
if (result.Custom.ErrorObjs.Exists(p => p.CaseSerial == item.ProvinceNo))
isError = true;
}
#region 处理待推送表数据
//处理待推送数据
if (isError)
{
//修改
item.LastTime = DateTime.Now;
item.SendTimes = item.SendTimes + 1;
if (item.FirstTime is null)
item.FirstTime = DateTime.Now;
if (item.SendTimes >= 7)
item.State = EWaitSendTaskState.PushFail;
else
item.State = EWaitSendTaskState.WaitPush;
//修改待推送表
await _waitSendTaskSubmitCaseRecordRepository.UpdateAsync(item, context.CancellationToken);
}
else
{
//删除
await _waitSendTaskSubmitCaseRecordRepository.RemoveAsync(item, cancellationToken: context.CancellationToken);
}
#endregion
#region 处理推送主表数据
//查询主表
var sendData = await _sendTaskSubmitCaseRecordRepository.GetAsync(p => p.Id == item.Id, context.CancellationToken);
if (sendData != null)
{
sendData.LastTime = DateTime.Now;
sendData.SendTimes = sendData.SendTimes + 1;
if (sendData.FirstTime is null)
sendData.FirstTime = DateTime.Now;
sendData.IsSuccess = isError == false ? ESendTaskState.PushSuccess : ESendTaskState.PushFail;
await _sendTaskSubmitCaseRecordRepository.UpdateAsync(sendData, cancellationToken: context.CancellationToken);
}
#endregion
#region 新增推送明细
//新增明细
DsSendTaskDetailInfo dsSendTaskDetailInfo = new()
{
TaskId = item.Id,
IsSuccess = !isError,
Result = JsonSerializer.Serialize(result),
ResultErrorData = error,
ProcessingServices = _channelConfigurationManager.GetConfigurationProcessingServices()
};
await _sendTaskDetailInfoRepository.AddAsync(dsSendTaskDetailInfo, context.CancellationToken);
#endregion
#region 处理通话记录的上传时间,用于统计
//处理通话记录的上传时间,用于统计
var telCall = await _dsTelCallRepository.GetAsync(p => p.TaskId == item.Id, context.CancellationToken);
if (telCall != null)
{
if (telCall.FirstSendProvinceTime is null)
telCall.FirstSendProvinceTime = DateTime.Now;
telCall.LastSendProvinceTime = DateTime.Now;
await _dsTelCallRepository.UpdateAsync(telCall, context.CancellationToken);
}
#endregion
}
}
}
}
}
public void Dispose()
{
}
}
}