You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BookingHeChuan/Myshipping.Application/Job/GetLaraBlnoWorker.cs

137 lines
5.6 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Furion;
using Furion.DataEncryption;
using Furion.LinqBuilder;
using Furion.Logging;
using Furion.RemoteRequest.Extensions;
using Furion.TaskScheduler;
using Microsoft.Extensions.Logging;
using Myshipping.Application.Entity;
using Myshipping.Application.Enum;
using Myshipping.Application.MQ;
using Myshipping.Core;
using Myshipping.Core.Entity;
using Myshipping.Core.Helper;
using Myshipping.Core.Service;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NPOI.HSSF.Record.Cont;
using RabbitMQ.Client;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Runtime.ConstrainedExecution;
using System.Text;
using System.Threading.Tasks;
namespace Myshipping.Application.Job
{
/// <summary>
/// 获取LARA提单号
/// </summary>
public class GetLaraBlnoWorker : ISpareTimeWorker
{
private const string ListKey = "LaraBlnoTaskList";
[SpareTime(60000, "GetLaraBlnoWorker", Description = "获取LARA提单号", DoOnce = false, StartNow = true, ExecuteType = SpareTimeExecuteTypes.Serial)]
public async void GetLaraBlno(SpareTimer timer, long count)
{
Log.Information($"GetLaraBlnoWorker {DateTime.Now}");
var cache = App.GetService<ISysCacheService>();
var sysConfig = await cache.GetAllSysConfig();
var cfgCsrToBlnoSpiderUrl = sysConfig.FirstOrDefault(x => x.Code == "LaraCsrToBlnoSpiderUrl" && x.GroupCode == "DJY_CONST");
if (cfgCsrToBlnoSpiderUrl == null || string.IsNullOrEmpty(cfgCsrToBlnoSpiderUrl.Value))
{
var msg = $"根据CS号从lara获取提单号未配置爬虫URL地址";
Log.Error(msg);
return;
}
var list = await cache.GetAsync<List<GetLaraBlnoModel>>(ListKey);
if (list != null)
{
list = list.Where(x => x.Start > DateTime.Now.AddHours(-8)).ToList(); //超过8小时不再处理
var toDoList = list.Where(x => x.Last < DateTime.Now.AddMinutes(-10)).ToList(); //10分钟处理一次
toDoList.ForEach(x => x.Last = DateTime.Now);
cache.Set(ListKey, list);
foreach (var item in toDoList)
{
Log.Information($"请求爬虫根据CS号从lara获取提单号CSR{item.CsrCode}");
string response = null;
try
{
var apiUrl = $"{cfgCsrToBlnoSpiderUrl.Value}?mblno=&refno={item.CsrCode}";
response = await apiUrl
.SetClientTimeout(30)
.GetAsStringAsync();
}
catch (Exception ex)
{
Log.Error($"请求爬虫根据CS号从lara获取提单号执行出错{ex.Message}CSR{item.CsrCode}");
Log.Error(ex.StackTrace);
return;
}
Log.Information($"请求爬虫根据CS号从lara获取提单号({item.CsrCode}),返回:{response}");
var jobjResp = JObject.Parse(response);
if (jobjResp.GetIntValue("status") == 1)
{
var jobjData = jobjResp.GetJObjectValue("data");
var bno = jobjData.GetStringValue("bno");
if (bno != item.CsrCode) //不是CS号
{
//推送订舱自动化消息
var dto = new
{
Carrier = item.Carrier,
CompanyId = item.CompanyId,
TenantId = item.TenantId,
MBLNO = bno,
CsrCode = item.CsrCode
};
Log.Information($"准备推送订舱自动化消息LARA提单号{JsonConvert.SerializeObject(dto)}");
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = new Uri(App.Configuration["MQBookingAuto"]);
var mqConn = factory.CreateConnection("GetLaraBlnoWorker");
var exchangeName = "djy.booking.auto";
IModel model = mqConn.CreateModel();
model.ExchangeDeclare(exchange: exchangeName, type: ExchangeType.Topic);
model.BasicPublish(exchange: exchangeName,
routingKey: "LaraBlno",
basicProperties: null,
body: Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dto)));
mqConn.Close();
Log.Information($"推送订舱自动化消息LARA提单号完成");
//移除已完成
list = await cache.GetAsync<List<GetLaraBlnoModel>>(ListKey);
list = list.Where(x => x.CsrCode != item.CsrCode).ToList();
cache.Set(ListKey, list);
}
}
}
}
}
}
public class GetLaraBlnoModel
{
public string CsrCode { get; set; }
public string Carrier { get; set; }
public string CompanyId { get; set; }
public long TenantId { get; set; }
public DateTime Start { get; set; } = DateTime.Now;
public DateTime Last { get; set; } = DateTime.Now;
}
}