using EntrustSettle.Common;
using EntrustSettle.IServices;
using EntrustSettle.Model;
using EntrustSettle.Model.Dtos;
using EntrustSettle.Model.Models;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Quartz;
//using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
///
/// 这里要注意下,命名空间和程序集是一样的,不然反射不到(任务类要去JobSetup添加注入)
///
namespace EntrustSettle.Tasks
{
[DisallowConcurrentExecution]
public class JobHydStatusQuartz : JobBase, IJob
{
private readonly ILogger _logger;
private readonly IHYDService hydService;
private readonly IOrderService orderService;
private readonly IOrderHistoryService orderHistoryService;
private readonly IQueueService queueService;
private readonly IOrderFeeService orderFeeService;
public JobHydStatusQuartz(ILogger logger,
ITasksQzServices tasksQzServices,
ITasksLogServices tasksLogServices,
IHYDService hydService,
IOrderService orderService,
IOrderHistoryService orderHistoryService,
IQueueService queueService,
IOrderFeeService orderFeeService)
: base(tasksQzServices, tasksLogServices)
{
_tasksQzServices = tasksQzServices;
_logger = logger;
this.hydService = hydService;
this.orderService = orderService;
this.orderHistoryService = orderHistoryService;
this.queueService = queueService;
this.orderFeeService = orderFeeService;
}
public async Task Execute(IJobExecutionContext context)
{
// 可以直接获取 JobDetail 的值
var jobKey = context.JobDetail.Key;
var jobId = jobKey.Name;
var executeLog = await ExecuteJob(context, async () => await Run(context, jobId.ObjToInt()));
}
public async Task Run(IJobExecutionContext context, int jobid)
{
if (jobid > 0)
{
Console.WriteLine($"{nameof(JobHydStatusQuartz)} 执行 {DateTime.Now.ToShortTimeString()}");
// 查询所有已接收但是还未完成的订单,进行轮询查询订单状态
var pendingOrderList = await orderService.Query(x => x.IsSend == true
&& x.Status != (int)OrderStatusEnum.已完结
&& x.CreateTime <= DateTime.Now.AddMonths(6));
if (pendingOrderList.Count == 0)
{
return;
}
foreach (Order orderItem in pendingOrderList)
{
try
{
List result = await hydService.Query(orderItem.Mblno);
foreach (HydQueryResultDto item in result)
{
var orderList = await orderService.Query(x => x.Bsno == item.id);
if (orderList == null || orderList.Count == 0)
{
_logger.LogInformation($"提单号{orderItem.Mblno}接收到回推后未查询到本地订单");
continue;
}
if (orderList.Count > 1)
{
_logger.LogInformation($"提单号{orderItem.Mblno}接收到回推后根据bsno查询到多个本地订单");
continue;
}
var order = orderList[0];
if (item.status != null && order.Status != item.status)
{
order.Status = item.status;
var updateSuccess = await orderService.Update(order, x => new { x.Status });
_logger.LogInformation($"提单号{orderItem.Mblno}状态更新{(updateSuccess ? "成功" : "失败")},status:{item.status}");
// 记录订单状态变更历史
await orderHistoryService.Add(new OrderHistory()
{
Pid = order.Id,
Status = item.status ?? 0,
StatusTime = DateTime.Now,
CreateBy = "系统",
Remark = "(后台任务自动设置)"
});
// 将更新后的状态及费用推送到消息队列
if (AppSettings.app("RabbitMQ", "Enabled").ObjToBool())
{
_ = Task.Run(() =>
{
string msg = $"Id:[{order.Id}],提单号:[{order.Mblno}],自动更新状态后推送队列";
try
{
StatusPushDto pushDto = new()
{
OrderId = order.Id,
Mblno = order.Mblno,
MessageType = 1,
MessageDesc = "状态更新推送",
Remark = "",
Status = item.status ?? 0,
StatusDesc = item.status switch
{
0 => "已下单",
1 => "已接单",
2 => "待缴费",
3 => "已缴费",
4 => "已完结",
_ => "未知状态",
}
};
var feeList = orderFeeService.AsQueryable().Where(x => x.OrderId == order.Id).ToList();
if (feeList.Count > 0)
{
pushDto.FeeList = feeList.Select(x => new StatusPushDto.FeeDto()
{
FeeId = x.Id,
FeeName = x.Name,
FeeAmount = x.Amount
}).ToList();
}
var json = JsonConvert.SerializeObject(pushDto, Formatting.Indented, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore });
queueService.Push(msg, order.CompanyId, json);
}
catch (Exception ex)
{
_logger.LogError(ex, $"{msg},失败");
}
});
}
}
else
{
_logger.LogInformation($"提单号{orderItem.Mblno}状态不变");
}
}
await Task.Delay(500);
}
catch (Exception ex)
{
_logger.LogError(ex, $"提单号{orderItem.Mblno}查询状态失败时发生未知异常,继续处理下一票");
continue;
}
}
}
}
}
}