|
|
using DS.Module.Core;
|
|
|
using DS.WMS.Core.HangfireJob.Dtos;
|
|
|
using DS.WMS.Core.Info.Entity;
|
|
|
using DS.WMS.Core.Op.Entity;
|
|
|
using DS.WMS.Core.QuarztJobs.Dtos;
|
|
|
using Microsoft.AspNetCore.Hosting;
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
using MiniExcelLibs;
|
|
|
using Quartz;
|
|
|
using SqlSugar;
|
|
|
using System.Diagnostics.Contracts;
|
|
|
using System.Globalization;
|
|
|
using System.Threading;
|
|
|
|
|
|
namespace DS.WMS.Core.QuarztJobs
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// WSL周报表服务
|
|
|
/// </summary>
|
|
|
public class WSLWeeklyReportJob : IJob
|
|
|
{
|
|
|
const string SOURCE_CODE = "FOB-WSL";
|
|
|
static readonly ApiFox api;
|
|
|
ISqlSugarClient? db;
|
|
|
Microsoft.Extensions.Configuration.IConfiguration config;
|
|
|
IWebHostEnvironment hostEnvironment;
|
|
|
ILogger<WSLWeeklyReportJob> logger;
|
|
|
|
|
|
static WSLWeeklyReportJob()
|
|
|
{
|
|
|
api = new ApiFox();
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 初始化
|
|
|
/// </summary>
|
|
|
/// <param name="serviceProvider"></param>
|
|
|
public WSLWeeklyReportJob(IServiceProvider serviceProvider)
|
|
|
{
|
|
|
db = serviceProvider.GetRequiredService<ISqlSugarClient>();
|
|
|
config = serviceProvider.GetRequiredService<Microsoft.Extensions.Configuration.IConfiguration>();
|
|
|
hostEnvironment = serviceProvider.GetRequiredService<IWebHostEnvironment>();
|
|
|
logger = serviceProvider.GetRequiredService<ILogger<WSLWeeklyReportJob>>();
|
|
|
}
|
|
|
|
|
|
public async Task Execute(IJobExecutionContext context)
|
|
|
{
|
|
|
logger.LogInformation("开始生成【SUNNINESS-CARGOO REPORT报表服务】...");
|
|
|
|
|
|
string path = Path.Combine(hostEnvironment.WebRootPath, "templates", "CargooWeeklyReport.xlsx");
|
|
|
FileInfo templateFile = new(path);
|
|
|
if (!templateFile.Exists)
|
|
|
{
|
|
|
var ex = new ApplicationException("【SUNNINESS-CARGOO REPORT报表服务】未能在下列路径找到模板文件:" + path);
|
|
|
await ex.LogAsync(db);
|
|
|
throw ex;
|
|
|
}
|
|
|
|
|
|
//时间计算
|
|
|
var today = DateTime.Now.Date;
|
|
|
var yesterday = today.AddDays(-1).Date;
|
|
|
|
|
|
|
|
|
var startDate = new DateTime(today.Year, today.Month, 1);
|
|
|
var endDate = new DateTime(today.Year, today.Month,today.Day, 23, 59, 59);
|
|
|
|
|
|
db.QueryFilter.Clear();
|
|
|
var dbLinks = await db.Queryable<Module.SqlSugar.SysTenantLink>().ToListAsync();
|
|
|
SqlSugarClient? tenantDb = null;
|
|
|
try
|
|
|
{
|
|
|
foreach (var dbLink in dbLinks)
|
|
|
{
|
|
|
if (config["TaskMail:DefaultSetting:Tenant"] != dbLink.TenantId.ToString())
|
|
|
continue;
|
|
|
|
|
|
tenantDb = new SqlSugarClient(new ConnectionConfig
|
|
|
{
|
|
|
ConfigId = dbLink.Id,
|
|
|
ConnectionString = dbLink.Connection,
|
|
|
DbType = dbLink.DbType,
|
|
|
IsAutoCloseConnection = true
|
|
|
});
|
|
|
tenantDb.QueryFilter.Clear();
|
|
|
|
|
|
WSLWeeklyModel model = new()
|
|
|
{
|
|
|
Date = today.ToString("yyyy.MM.dd"),
|
|
|
Month = today.ToString("yyyy.MM")
|
|
|
};
|
|
|
|
|
|
var list = await tenantDb.Queryable<SeaExport>().Where(x => !x.Deleted && x.IsChangeETD == false && x.IsRefund == false)//x.ContractClientName == "WSL" && && SqlFunc.Between(x.ETD, startDate, endDate)
|
|
|
.OrderBy(x=>x.ETD)
|
|
|
.Select(x => new WSLWeeklyItem()
|
|
|
{
|
|
|
|
|
|
BusinessStatusName = x.BusinessStatusName,
|
|
|
Carrier = x.Carrier,
|
|
|
Forwarder = x.Forwarder,
|
|
|
ContractClientName = x.ContractClientName,
|
|
|
ContractNo = x.ContractNo,
|
|
|
MBLNO = x.MBLNO,
|
|
|
CustomerNo = x.CustomerNo,
|
|
|
ETD = x.ETD.HasValue ? x.ETD.Value.ToString("yyyy-MM-dd") : string.Empty,
|
|
|
//Weeks = x.ETD.HasValue ? x.ETD.Value.GetWeekOfYear(CultureInfo.CurrentCulture),
|
|
|
LoadPort = x.LoadPort,
|
|
|
DischargePort = x.DischargePort,
|
|
|
MBLFrt = x.MBLFrt,
|
|
|
Sale = x.Sale,
|
|
|
CustomerServiceName = x.CustomerServiceName,
|
|
|
OperatorName = x.OperatorName,
|
|
|
Laner = x.Laner,
|
|
|
Vessel = x.Vessel,
|
|
|
Voyno = x.Voyno,
|
|
|
Shipper = x.Shipper,
|
|
|
Consignee = x.Consignee,
|
|
|
NotifyParty = x.NotifyParty,
|
|
|
CreateTime = x.CreateTime.ToString("yyyy-MM-dd")
|
|
|
|
|
|
|
|
|
}).ToListAsync();
|
|
|
|
|
|
|
|
|
model.List = list;
|
|
|
|
|
|
MemoryStream ms = new();
|
|
|
await MiniExcel.SaveAsByTemplateAsync(ms, path, model);
|
|
|
string base64Str = Convert.ToBase64String(ms.ToArray());
|
|
|
ms.Dispose();
|
|
|
var attaches = new List<Attachment>
|
|
|
{
|
|
|
new() { AttachName = config["TaskMail:DefaultSetting:Title"] + ".xlsx", AttachContent = base64Str}
|
|
|
};
|
|
|
|
|
|
dynamic[] mailParams = [new
|
|
|
{
|
|
|
SendTo = config["TaskMail:DefaultSetting:Receivers"],
|
|
|
CCTo = config["TaskMail:DefaultSetting:CCTo"],
|
|
|
Title = config["TaskMail:DefaultSetting:Title"],
|
|
|
Body = config["TaskMail:DefaultSetting:Body"],
|
|
|
Account = config["TaskMail:DefaultSetting:Account"],
|
|
|
Password = config["TaskMail:DefaultSetting:Password"],
|
|
|
Server = config["TaskMail:DefaultSetting:Host"],
|
|
|
Port = config["TaskMail:DefaultSetting:Port"],
|
|
|
UseSSL = config["TaskMail:DefaultSetting:UseSSL"]?.ToLowerInvariant(),
|
|
|
Attaches = attaches
|
|
|
}];
|
|
|
|
|
|
var mailResult = await api.SendRequestAsync(HttpMethod.Post, config["TaskMail:MailApiUrl"], mailParams);
|
|
|
if (mailResult.IsSuccessStatusCode)
|
|
|
logger.LogInformation("已发送【SUNNINESS-CARGOO REPORT报表服务】...");
|
|
|
else
|
|
|
logger.LogInformation("发送【SUNNINESS-CARGOO REPORT报表服务】失败!");
|
|
|
}
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
await ex.LogAsync(db);
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
tenantDb?.Dispose();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class Attachment
|
|
|
{
|
|
|
public string? AttachName { get; set; }
|
|
|
|
|
|
public string? AttachContent { get; set; }
|
|
|
}
|
|
|
}
|
|
|
}
|