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.

170 lines
7.0 KiB
C#

using DS.Module.Core;
using DS.WMS.Core.HangfireJob.Dtos;
using DS.WMS.Core.Op.Entity;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using MiniExcelLibs;
using Quartz;
using SqlSugar;
namespace DS.WMS.Core.QuarztJobs
{
/// <summary>
/// WSL报表服务
/// </summary>
public class WSLReportJob : IJob
{
const string SOURCE_CODE = "FOB-WSL";
static readonly ApiFox api;
ISqlSugarClient? db;
Microsoft.Extensions.Configuration.IConfiguration config;
IWebHostEnvironment hostEnvironment;
static WSLReportJob()
{
api = new ApiFox();
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="serviceProvider"></param>
public WSLReportJob(IServiceProvider serviceProvider)
{
db = serviceProvider.GetRequiredService<ISqlSugarClient>();
config = serviceProvider.GetRequiredService<Microsoft.Extensions.Configuration.IConfiguration>();
hostEnvironment = serviceProvider.GetRequiredService<IWebHostEnvironment>();
}
public async Task Execute(IJobExecutionContext context)
{
string path = Path.Combine(hostEnvironment.WebRootPath, "templates", "WSL.xlsx");
1 month ago
FileInfo templateFile = new(path);
if (!templateFile.Exists)
1 month ago
{
var ex = new ApplicationException("【WSL报表服务】未能在下列路径找到模板文件" + path);
await ex.LogAsync(db);
throw ex;
}
//时间计算
var today = DateTime.Now.Date;
var yesterday = today.AddDays(-1).Date;
var lastMonth = today.AddMonths(-1);
var nextMonth = today.AddMonths(1);
var startDate = new DateTime(lastMonth.Year, lastMonth.Month, 1);
var endDate = new DateTime(nextMonth.Year, nextMonth.Month, DateTime.DaysInMonth(nextMonth.Year, nextMonth.Month), 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
});
1 month ago
tenantDb.QueryFilter.Clear();
WSLModel model = new()
{
Date = today.ToString("yyyy.MM.dd"),
Month = today.ToString("yyyy.MM")
};
1 month ago
var list = await tenantDb.Queryable<SeaExport>().Where(x => x.SourceCode == SOURCE_CODE && SqlFunc.Between(x.ETD, startDate, endDate) && !x.Deleted)
.Select(x => new
{
x.Id,
x.CustomerId,
x.CustomerName,
x.ETD,
x.TEU
}).ToListAsync();
if (list.Count == 0)
return;
var ids = list.Select(x => x.Id.ToString());
var ctnList = await tenantDb.Queryable<OpCtn>().Where(x => ids.Contains(x.BSNO) &&
1 month ago
!SqlFunc.IsNullOrEmpty(x.CntrNo) && !SqlFunc.IsNullOrEmpty(x.SealNo) && !x.Deleted)
.Select(x => new
{
x.BSNO,
x.TEU
}).ToListAsync();
model.List = list.GroupBy(x => new { x.CustomerId, x.CustomerName }).Select(x => new WSLItem
{
CustomerId = x.Key.CustomerId,
CustomerName = x.Key.CustomerName,
Date = model.Date,
1 month ago
YesterdayTeu = x.Where(x => x.ETD >= yesterday && x.ETD <= yesterday).Sum(x => x.TEU),
TodayTeu = x.Where(x => x.ETD >= today && x.ETD <= today).Sum(x => x.TEU),
NextMonthTEU = x.Where(x => x.ETD.Value.Year == nextMonth.Year && x.ETD.Value.Month == nextMonth.Month).Sum(x => x.TEU),
LastMonthTEU = x.Where(x => x.ETD.Value.Year == lastMonth.Year && x.ETD.Value.Month == lastMonth.Month).Sum(x => x.TEU),
}).ToList();
foreach (var item in model.List)
{
var ids2 = list.Where(x => x.CustomerId == item.CustomerId).Select(x => x.Id.ToString());
item.TodayTeuCTNPickup = ctnList.Where(x => ids2.Contains(x.BSNO)).Sum(x => x.TEU);
}
1 month ago
MemoryStream ms = new();
await MiniExcel.SaveAsByTemplateAsync(ms, path, model);
string base64Str = Convert.ToBase64String(ms.ToArray());
ms.Dispose();
var attaches = new List<Attachment>
{
1 month ago
new() { AttachName = config["TaskMail:DefaultSetting:Title"] + ".xlsx", AttachContent = base64Str}
};
dynamic[] mailParams = [new
{
SendTo = config["TaskMail:DefaultSetting:Receivers"],
1 month ago
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"],
1 month ago
UseSSL = config["TaskMail:DefaultSetting:UseSSL"]?.ToLowerInvariant(),
Attaches = attaches
}];
var mailResult = await api.SendRequestAsync(HttpMethod.Post, config["TaskMail:MailApiUrl"], mailParams);
if (!mailResult.IsSuccessStatusCode)
throw new ApplicationException("发送邮件失败");
}
}
1 month ago
catch (Exception ex)
{
await ex.LogAsync(db);
}
finally
{
tenantDb?.Dispose();
}
}
class Attachment
{
public string? AttachName { get; set; }
public string? AttachContent { get; set; }
}
}
}