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/Service/TaskManagePlat/RouteChangeAdvisoryService.cs

452 lines
20 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.DependencyInjection;
using Furion.DynamicApiController;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Myshipping.Application.Entity;
using Myshipping.Core.Entity;
using Myshipping.Core.Service;
using Myshipping.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Furion.FriendlyException;
using NPOI.POIFS.Storage;
using Yitter.IdGenerator;
using Furion.DistributedIDGenerator;
using System.Text.RegularExpressions;
using Furion;
using Myshipping.Application.Helper;
namespace Myshipping.Application
{
/// <summary>
/// 船舶相关截止时间的通知
/// </summary>
[ApiDescriptionSettings("Application", Name = "RouteChangeAdvisory", Order = 10)]
public class RouteChangeAdvisoryService : IRouteChangeAdvisoryService, IDynamicApiController, ITransient
{
private readonly ISysCacheService _cache;
private readonly ILogger<TaskCautionNoticeService> _logger;
private readonly SqlSugarRepository<TaskBaseInfo> _taskBaseRepository;
private readonly SqlSugarRepository<TaskRouteChangeAdvisoryInfo> _taskRouteChangeAdvisoryInfoRepository;
private readonly SqlSugarRepository<TaskRouteChangeAdvisoryDetailInfo> _taskRouteChangeAdvisoryDetailInfoRepository;
private readonly SqlSugarRepository<DjyUserMailAccount> _djyUserMailAccount;
private readonly SqlSugarRepository<BookingOrder> _bookingOrderRepository;
private readonly SqlSugarRepository<BookingOrderContact> _bookingOrderContactRepository;
private readonly SqlSugarRepository<SysUser> _sysUserRepository;
public RouteChangeAdvisoryService(ISysCacheService cache, ILogger<TaskCautionNoticeService> logger,
SqlSugarRepository<TaskBaseInfo> taskBaseRepository,
SqlSugarRepository<TaskRouteChangeAdvisoryInfo> taskRouteChangeAdvisoryInfoRepository,
SqlSugarRepository<TaskRouteChangeAdvisoryDetailInfo> taskRouteChangeAdvisoryDetailInfoRepository,
SqlSugarRepository<DjyUserMailAccount> djyUserMailAccount,
SqlSugarRepository<BookingOrderContact> bookingOrderContactRepository,
SqlSugarRepository<SysUser> sysUserRepository,
SqlSugarRepository<BookingOrder> bookingOrderRepository)
{
_cache = cache;
_logger = logger;
_taskBaseRepository = taskBaseRepository;
_taskRouteChangeAdvisoryInfoRepository = taskRouteChangeAdvisoryInfoRepository;
_taskRouteChangeAdvisoryDetailInfoRepository = taskRouteChangeAdvisoryDetailInfoRepository;
_djyUserMailAccount = djyUserMailAccount;
_bookingOrderRepository = bookingOrderRepository;
_bookingOrderContactRepository = bookingOrderContactRepository;
_sysUserRepository = sysUserRepository;
}
#region 获取船舶相关截止时间的通知详情
/// <summary>
/// 获取船舶相关截止时间的通知详情
/// </summary>
/// <param name="taskPkId">船舶相关截止时间的通知任务主键</param>
/// <returns>返回详情</returns>
[HttpGet("/RouteChangeAdvisory/GetInfoByTaskId")]
public async Task<TaskRouteChangeAdvisoryShowDto> GetInfoByTaskId(string taskPkId)
{
TaskRouteChangeAdvisoryShowDto dto = new TaskRouteChangeAdvisoryShowDto();
var taskBase = _taskBaseRepository.AsQueryable().First(a => a.PK_ID == taskPkId);
if (taskBase == null)
throw Oops.Oh($"任务主键{taskPkId}无法获取业务信息");
var advisoryInfo = _taskRouteChangeAdvisoryInfoRepository.AsQueryable().First(a => a.TASK_ID == taskBase.PK_ID);
if (advisoryInfo == null)
throw Oops.Oh($"船舶相关截止时间的通知主键{taskPkId}无法获取业务信息");
var detailList = _taskRouteChangeAdvisoryDetailInfoRepository.AsQueryable()
.Where(a => a.P_ID == advisoryInfo.PK_ID).ToList();
dto = new TaskRouteChangeAdvisoryShowDto
{
PKId = advisoryInfo.PK_ID,
TaskPKId = advisoryInfo.TASK_ID,
CarrierId = advisoryInfo.CARRIER,
CreateTime = advisoryInfo.CreatedTime,
AdvisoryTitle = advisoryInfo.EMAIL_SUBJECT,
CYCutDate = advisoryInfo.CY_CUT_DATE,
ETA = advisoryInfo.ETA,
ETD = advisoryInfo.ETD,
MDGFCutDate = advisoryInfo.MDGF_CUT_DATE,
origETD = advisoryInfo.ORIG_ETD,
RouteCode = advisoryInfo.ROUTE_CODE,
SICutDate = advisoryInfo.SI_CUT_DATE,
Vessel = advisoryInfo.VESSEL,
Voyno = advisoryInfo.VOYNO,
VGMCutDate = advisoryInfo.VGM_CUTOFF_TIME,
Week = advisoryInfo.WEEK,
TerminalShiftCutDate = advisoryInfo.TM_SHIFT_CUT_DATE,
LoadPort = advisoryInfo.READ_PORTLOAD,
LoadPortId = advisoryInfo.PORTLOADID,
LoadPortName = advisoryInfo.PORTLOAD,
BuisList = new List<TaskRouteChangeAdvisoryBusiShowDto>()
};
if (detailList.Count > 0)
{
var queryList = detailList.Where(a => a.BOOKING_ID.HasValue).Select(a => a.BOOKING_ID.Value).ToList();
if (queryList.Count > 0)
{
//查询整船的订舱订单列表
var bookList = _bookingOrderRepository.AsQueryable().Where(a => queryList.Contains(a.Id) && a.IsDeleted == false).ToList();
dto.BuisList = detailList.Select(p => {
TaskRouteChangeAdvisoryBusiShowDto detail = new TaskRouteChangeAdvisoryBusiShowDto {
PKId = p.PK_ID,
LstTransferUserDate = p.LST_TRANSFER_USER_DATE,
IsTransferUser = p.IS_TRANSFER_USER,
LstTransferNote = p.LST_TRANSFER_NOTES,
BookingId = p.BOOKING_ID.Value,
IsEnable = p.IS_ENABLE
};
var bookInfo = bookList.FirstOrDefault(x => x.Id == p.BOOKING_ID.Value);
if (bookInfo != null)
{
detail.CustomerName = bookInfo.CUSTOMERNAME;
detail.MBlNo = bookInfo.MBLNO;
}
else
{
//如果对应的订舱已被作废,只能标记不可发送
detail.IsEnable = false;
}
return detail;
}).ToList();
}
else
{
dto.BuisList = detailList.Select(p => {
TaskRouteChangeAdvisoryBusiShowDto detail = new TaskRouteChangeAdvisoryBusiShowDto
{
PKId = p.PK_ID,
LstTransferUserDate = p.LST_TRANSFER_USER_DATE,
IsTransferUser = p.IS_TRANSFER_USER,
LstTransferNote = p.LST_TRANSFER_NOTES,
BookingId = p.BOOKING_ID.Value,
IsEnable = false
};
return detail;
}).ToList();
}
}
return dto;
}
#endregion
#region 自动转发船舶相关截止时间的通知
/// <summary>
/// 自动转发船舶相关截止时间的通知
/// </summary>
/// <param name="taskPKId">船舶相关截止时间的通知任务主键</param>
/// <returns>返回回执</returns>
[HttpGet("/RouteChangeAdvisory/AutoTransferNotice")]
public async Task<TaskManageOrderResultDto> AutoTransferNotice(string taskPKId)
{
TaskManageOrderResultDto result = new TaskManageOrderResultDto();
try
{
var taskBase = _taskBaseRepository.AsQueryable().First(a => a.PK_ID == taskPKId);
if (taskBase == null)
throw Oops.Oh($"任务主键{taskPKId}无法获取业务信息");
var advisoryInfo = _taskRouteChangeAdvisoryInfoRepository.AsQueryable().First(a => a.TASK_ID == taskBase.PK_ID);
if (advisoryInfo == null)
throw Oops.Oh($"船舶相关截止时间的通知主键{taskPKId}无法获取业务信息");
var detailList = _taskRouteChangeAdvisoryDetailInfoRepository.AsQueryable()
.Where(a => a.P_ID == advisoryInfo.PK_ID).ToList();
//通过船名航次取是主单的订舱记录列表
var bookList = _bookingOrderRepository.AsQueryable().Where(a => a.VESSEL == advisoryInfo.VESSEL && (a.VOYNO == advisoryInfo.VOYNO || a.VOYNOINNER == advisoryInfo.VOYNO)
&& a.IsDeleted == false && (a.ParentId == null || a.ParentId == 0)).ToList();
//用查询到的订舱列表和明细记录标做匹配,如果没有需要新增记录表
var addList = bookList.GroupJoin(detailList, l => l.Id, r => r.BOOKING_ID.Value, (l, r) =>
{
var currList = r.ToList();
if (currList.Count == 0)
{
return new { IsAdd = true, book = l };
}
return new { IsAdd = false, book = l };
}).Where(t => t.IsAdd).Select(t => t.book).ToList();
DateTime nowDate = DateTime.Now;
if (addList.Count > 0)
{
addList.ForEach(t =>
{
TaskRouteChangeAdvisoryDetailInfo detail = new TaskRouteChangeAdvisoryDetailInfo
{
PK_ID = IDGen.NextID().ToString(),
BOOKING_ID = t.Id,
MBL_NO = t.MBLNO,
CreatedTime = nowDate,
UpdatedTime = nowDate,
CreatedUserId = UserManager.UserId,
CreatedUserName = UserManager.Name,
TenantId = UserManager.TENANT_ID
};
});
}
}
catch (Exception ex)
{
}
return result;
}
#endregion
#region 检索同一航次对应的订舱订单(并对应记录)
/// <summary>
/// 检索同一航次对应的订舱订单(并对应记录)
/// </summary>
/// <param name="taskPKId">船舶相关截止时间的通知任务主键</param>
/// <returns>返回回执</returns>
[HttpGet("/RouteChangeAdvisory/QueryVesselVoynoBookingOrder")]
public async Task<TaskManageOrderResultDto> QueryVesselVoynoBookingOrder(string taskPKId)
{
TaskManageOrderResultDto result = new TaskManageOrderResultDto();
try
{
var taskBase = _taskBaseRepository.AsQueryable().First(a => a.PK_ID == taskPKId);
if (taskBase == null)
throw Oops.Oh($"任务主键{taskPKId}无法获取业务信息");
var advisoryInfo = _taskRouteChangeAdvisoryInfoRepository.AsQueryable().First(a => a.TASK_ID == taskBase.PK_ID);
if (advisoryInfo == null)
throw Oops.Oh($"船舶相关截止时间的通知主键{taskPKId}无法获取业务信息");
var detailList = _taskRouteChangeAdvisoryDetailInfoRepository.AsQueryable()
.Where(a => a.P_ID == advisoryInfo.PK_ID).ToList();
//通过船名航次取是主单的订舱记录列表
var bookList = _bookingOrderRepository.AsQueryable().Where(a => a.VESSEL == advisoryInfo.VESSEL && (a.VOYNO == advisoryInfo.VOYNO || a.VOYNOINNER == advisoryInfo.VOYNO)
&& a.IsDeleted == false && (a.ParentId == null || a.ParentId == 0)).ToList();
//用查询到的订舱列表和明细记录标做匹配,如果没有需要新增记录表
var addList = bookList.GroupJoin(detailList, l => l.Id, r => r.BOOKING_ID.Value, (l, r) =>
{
var currList = r.ToList();
if (currList.Count == 0)
{
return new { IsAdd = true, book = l };
}
return new { IsAdd = false, book = l };
}).Where(t => t.IsAdd).Select(t => t.book).ToList();
DateTime nowDate = DateTime.Now;
if (addList.Count > 0)
{
addList.ForEach(t =>
{
TaskRouteChangeAdvisoryDetailInfo detail = new TaskRouteChangeAdvisoryDetailInfo
{
PK_ID = IDGen.NextID().ToString(),
P_ID = advisoryInfo.PK_ID,
IsDeleted = false,
BOOKING_ID = t.Id,
MBL_NO = t.MBLNO,
CreatedTime = nowDate,
UpdatedTime = nowDate,
CreatedUserId = UserManager.UserId,
CreatedUserName = UserManager.Name,
TenantId = UserManager.TENANT_ID
};
_taskRouteChangeAdvisoryDetailInfoRepository.Insert(detail);
});
}
}
catch (Exception ex)
{
result.succ = false;
result.msg = $"检索失败,原因:{ex.Message}";
_logger.LogInformation($"taskPKId={taskPKId} 检索同一航次对应的订舱订单(并对应记录) 处理异常,原因:{ex.Message}");
}
return result;
}
#endregion
#region 批量发送邮件通知给客户
/// <summary>
/// 批量发送邮件通知给客户
/// </summary>
/// <param name="detailPKIds">船舶相关截止时间的通知订舱明细记录主键组</param>
/// <returns>返回回执</returns>
public async Task<TaskManageOrderResultDto> BatchSendEmailToCustomer(string[] detailPKIds)
{
TaskManageOrderResultDto result = new TaskManageOrderResultDto();
try
{
if (detailPKIds == null || detailPKIds.Length == 0)
throw Oops.Oh($"未选择需要发送订单明细");
var detailList = _taskRouteChangeAdvisoryDetailInfoRepository.AsQueryable()
.Where(a => detailPKIds.Contains(a.PK_ID) && a.IsDeleted == false).ToList();
if (detailPKIds.Length != detailList.Count)
{
throw Oops.Oh($"未选择订单明细检索失败");
}
var bookIdList = detailList.Where(t => t.IS_ENABLE == true)
.Select(t => t.BOOKING_ID.Value).ToList();
if (bookIdList.Count == 0)
{
throw Oops.Oh($"相关订单没有课");
}
//需要根据订单的往来单位统一推送一封邮件,里面有提单号列表
var bookList = _bookingOrderRepository.AsQueryable().Where(a => bookIdList.Contains(a.Id)
&& a.IsDeleted == false && (a.ParentId == null || a.ParentId == 0)).ToList();
}
catch (Exception ex)
{
result.succ = false;
result.msg = $"批量发送失败,原因:{ex.Message}";
_logger.LogInformation($"detailPKIds={string.Join(",", detailPKIds)} 批量发送邮件通知给客户 处理异常,原因:{ex.Message}");
}
return result;
}
#endregion
//private void SendUser
private void GenerateSendEmail(TaskRouteChangeAdvisoryInfo model,long bookingId,string mblNo)
{
/*
//TO 邮件接收人
string toEmail = string.Empty;
//订舱OP的邮箱
string opEmail = string.Empty;
//读取订舱数据
var bookingOrderEntity = _bookingOrderRepository.AsQueryable().Filter(null, true)
.First(a => a.Id == bookingId);
var bookingContactList = _bookingOrderContactRepository.AsQueryable().Filter(null, true)
.Where(a => a.BookingId == bookingId).ToList();
if (bookingContactList == null || bookingContactList.Count == 0)
{
_logger.LogInformation($"当前订舱未指定的联系人toEmail={toEmail}");
new EmailNoticeHelper().SendEmailNotice($"MBLNO={mblNo} 转发【船舶相关截止时间的通知】通知邮件失败", $"MBLNO={mblNo} 转发【船舶相关截止时间的通知】通知邮件失败,原因:当前订舱未指定的联系人", App.Configuration["EmailNoticeDefaultUser"].GetUserEmailList());
throw Oops.Oh($"{mblNo} 当前订舱未指定的联系人,发送通知失败");
}
toEmail = string.Join(";", bookingContactList.Select(x => x.Email.Trim()).Distinct().ToArray());
//获取操作OP的邮箱
if (!string.IsNullOrWhiteSpace(bookingOrderEntity.OPID))
{
var opId = long.Parse(bookingOrderEntity.OPID);
var opUser = _sysUserRepository.AsQueryable().Filter(null, true).First(a => a.Id == opId);
if (opUser != null && !string.IsNullOrWhiteSpace(opUser.Email))
{
opEmail = opUser.Email.Trim();
_logger.LogInformation($"获取操作OP的邮箱opEmail={opEmail} id={opId} name={opUser.Name}");
}
}
//提取当前公共邮箱的配置
DjyUserMailAccount publicMailAccount = _djyUserMailAccount.AsQueryable().Filter(null, true).First(x => x.TenantId == UserManager.TENANT_ID && x.ShowName == "PublicSend"
&& x.SmtpPort > 0 && x.SmtpServer != null && x.SmtpServer != "");
if (publicMailAccount == null)
{
throw Oops.Oh($"提取公共邮箱配置失败请在用户邮箱账号管理增加配置显示名为PublicSend或者配置个人邮箱");
}
_logger.LogInformation($"提取当前公共邮箱的配置完成id={publicMailAccount.Id}");
string emailTitle = $"Advisory{model.EMAIL_SUBJECT} : {taskBCInfo.MBL_NO}";
string filePath = string.Empty;
SysUser opUserInfo = null;
if (!string.IsNullOrWhiteSpace(bookingOrderEntity.OPID) && Regex.IsMatch(bookingOrderEntity.OPID, "[0-9]+"))
opUserInfo = _sysUserRepository.AsQueryable().Filter(null, true).First(u => u.Id == long.Parse(bookingOrderEntity.OPID));
if (taskBCInfo.BUSI_TYPE == "BookingAmendment")
{
emailTitle = $"【变更】Booking Amendment : {taskBCInfo.MBL_NO}";
}
//读取邮件模板并填充数据
string emailHtml = string.Empty;
if (taskBCInfo.BUSI_TYPE == "BookingAmendment")
{
emailHtml = GenerateSendEmailHtmlAmendment(taskBCInfo, opUserInfo, UserManager.TENANT_NAME).GetAwaiter().GetResult();
}
else
{
emailHtml = GenerateSendEmailHtml(taskBCInfo, opUserInfo, UserManager.TENANT_NAME).GetAwaiter().GetResult();
}*/
}
}
}