diff --git a/Myshipping.Application/Helper/FileAttachHelper.cs b/Myshipping.Application/Helper/FileAttachHelper.cs index 7a3a2a5f..d37f1a68 100644 --- a/Myshipping.Application/Helper/FileAttachHelper.cs +++ b/Myshipping.Application/Helper/FileAttachHelper.cs @@ -31,9 +31,10 @@ namespace Myshipping.Application /// 批次号 /// 是否生成本地文件 /// 附件类型 bcfiles-BC文件 + /// 是否保留原文件 /// 返回新的文件路径 public static async Task MoveFile(string fileDictKey,string sourceFilePath,string batchNo, - bool isLocalTempFile = false,string attachFileType = "bcfiles") + bool isLocalTempFile = false,string attachFileType = "bcfiles",bool isKeepSource = false) { var logger = Log.CreateLogger(nameof(FileAttachHelper)); @@ -115,10 +116,14 @@ namespace Myshipping.Application file.Close(); + try { - //删除原文件 - System.IO.File.Delete(sourceFilePath); + if (!isKeepSource) + { + //删除原文件 + System.IO.File.Delete(sourceFilePath); + } } catch(Exception delEx) { diff --git a/Myshipping.Application/Service/BookingOrder/IBookingOrderService.cs b/Myshipping.Application/Service/BookingOrder/IBookingOrderService.cs index 9b2efb80..c23bd4f3 100644 --- a/Myshipping.Application/Service/BookingOrder/IBookingOrderService.cs +++ b/Myshipping.Application/Service/BookingOrder/IBookingOrderService.cs @@ -137,5 +137,12 @@ namespace Myshipping.Application /// 是否直接发送VOLTA申报截单 /// 返回回执 Task InnerVOLTAEDI(VOLTAEDIBaseModel model, bool isSend = false); + + /// + /// 订舱保存 + /// + /// 订舱请求详情 + /// 返回回执 + Task Save(SaveBookingOrderInput input); } } \ No newline at end of file diff --git a/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs b/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs index a03adadc..52621e27 100644 --- a/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs +++ b/Myshipping.Application/Service/BookingSlot/BookingSlotService.cs @@ -36,6 +36,7 @@ namespace Myshipping.Application private readonly SqlSugarRepository _repBookingLog; private readonly SqlSugarRepository _repBookingLogDetail; + private readonly SqlSugarRepository _bookingfile; private readonly ILogger _logger; private readonly ISysCacheService _cache; @@ -47,7 +48,8 @@ namespace Myshipping.Application SqlSugarRepository repStock, SqlSugarRepository repBookingLog, SqlSugarRepository repBookingLogDetail, - ILogger logger, + SqlSugarRepository bookingfile, + ILogger logger, ISysCacheService cache, IEventPublisher publisher, SqlSugarRepository repAllocation) @@ -64,6 +66,7 @@ namespace Myshipping.Application _cache = cache; _publisher = publisher; + _bookingfile = bookingfile; } #region 舱位 @@ -174,8 +177,9 @@ namespace Myshipping.Application /// /// [HttpPost("/BookingSlot/ApiReceive"), AllowAnonymous, ApiUser] - public async Task ApiReceive(BookingSlotBaseApiDto dto) + public async Task ApiReceive(BookingSlotBaseApiDto dto) { + long id = 0; //接口方法直接调用save、delete等方法会报错,可能因为非token授权登录导致,故重写一遍保存、删除代码 if (dto.OpType == "add" || dto.OpType == "update" || dto.OpType == "del") { @@ -191,6 +195,8 @@ namespace Myshipping.Application model = dto.DataObj.Adapt(); await _repBase.InsertAsync(model); + id = model.Id; + foreach (var ctn in dto.DataObj.CtnList) { var newCtn = ctn.Adapt(); @@ -258,6 +264,7 @@ namespace Myshipping.Application throw Oops.Bah("操作类型参数有误"); } + return id; } #endregion @@ -635,5 +642,55 @@ namespace Myshipping.Application return (true, "引入成功"); } #endregion + + #region 获取附件 + /// + /// 获取附件 + /// + /// 舱位主键 + /// 返回附件列表 + [HttpGet("/BookingSlot/GetFile")] + public async Task> GetFile(long id) + { + var list = await _bookingfile.AsQueryable().Filter(null, true) + .Where(u => u.BookingId == id && u.Moudle == "BookingSlot").ToListAsync(); + + return list; + } + #endregion + + #region 舱位 + /// + /// 分页查询订舱舱位 + /// + /// + /// + [HttpPost("/BookingSlot/page")] + public async Task Page(BookingSlotBasePageInput input) + { + var entities = await _repBase.AsQueryable() + .WhereIF(!string.IsNullOrEmpty(input.SLOT_BOOKING_NO), u => u.SLOT_BOOKING_NO.Contains(input.SLOT_BOOKING_NO)) + .WhereIF(!string.IsNullOrEmpty(input.VESSEL), u => u.VESSEL.Contains(input.VESSEL)) + .WhereIF(!string.IsNullOrEmpty(input.VOYNO), u => u.VOYNO.Contains(input.VOYNO)) + .WhereIF(!string.IsNullOrEmpty(input.PORTLOAD), u => u.PORTLOAD.Contains(input.PORTLOAD)) + .WhereIF(!string.IsNullOrEmpty(input.PORTDISCHARGE), u => u.PORTLOAD.Contains(input.PORTLOAD)) + .WhereIF(!string.IsNullOrEmpty(input.CARRIER), u => u.CARRIER.Contains(input.CARRIER)) + .WhereIF(!string.IsNullOrEmpty(input.LANENAME), u => u.LANENAME.Contains(input.LANENAME)) + .WhereIF(!string.IsNullOrEmpty(input.CARRIAGE_TYPE), u => u.CARRIAGE_TYPE == input.CARRIAGE_TYPE) + .WhereIF(!string.IsNullOrEmpty(input.BOOKING_SLOT_TYPE), u => u.BOOKING_SLOT_TYPE == input.BOOKING_SLOT_TYPE) + .WhereIF(!string.IsNullOrEmpty(input.CTN_STAT), u => u.CTN_STAT.Contains(input.CTN_STAT)) + .WhereIF(!string.IsNullOrEmpty(input.VGM_RLT_STAT), u => u.VGM_RLT_STAT == input.VGM_RLT_STAT) + .WhereIF(!string.IsNullOrEmpty(input.SI_RLT_STAT), u => u.SI_RLT_STAT == input.SI_RLT_STAT) + .WhereIF(input.ETD_START.HasValue, u => u.ETD >= input.ETD_START.Value) + .WhereIF(input.ETD_END.HasValue, u => u.ETD < input.ETD_END.Value.AddDays(1)) + .WhereIF(input.ETA_START.HasValue, u => u.ETA >= input.ETA_START.Value) + .WhereIF(input.ETA_END.HasValue, u => u.ETA < input.ETA_END.Value.AddDays(1)) + .ToPagedListAsync(input.PageNo, input.PageSize); + + var result = entities.Adapt>(); + + return result.XnPagedResult(); + } + #endregion } } diff --git a/Myshipping.Application/Service/BookingSlot/IBookingSlotService.cs b/Myshipping.Application/Service/BookingSlot/IBookingSlotService.cs index 3bef84db..02447b42 100644 --- a/Myshipping.Application/Service/BookingSlot/IBookingSlotService.cs +++ b/Myshipping.Application/Service/BookingSlot/IBookingSlotService.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using Myshipping.Application.Entity; using Myshipping.Application.Event; using Myshipping.Application.Service.BookingSlot.Dto; using System.Collections.Generic; @@ -8,7 +9,7 @@ namespace Myshipping.Application { public interface IBookingSlotService { - Task ApiReceive(BookingSlotBaseApiDto dto); + Task ApiReceive(BookingSlotBaseApiDto dto); Task Detail(long id); Task> GetAvailableSlots(BookingSlotBaseDto input); @@ -40,5 +41,19 @@ namespace Myshipping.Application Task PageStock(BookingSlotStockPageInput input); Task RefreshStock(BookingSlotStockUpdateModel input); Task Save(BookingSlotBaseSaveInput input); + + /// + /// 获取附件 + /// + /// 舱位主键 + /// 返回附件列表 + Task> GetFile(long id); + + /// + /// 分页查询订舱舱位 + /// + /// + /// + Task Page(BookingSlotBasePageInput input); } } \ No newline at end of file diff --git a/Myshipping.Application/Service/TaskManagePlat/TaskDraftCompareService.cs b/Myshipping.Application/Service/TaskManagePlat/TaskDraftCompareService.cs index 5bb02dfb..e0e6b051 100644 --- a/Myshipping.Application/Service/TaskManagePlat/TaskDraftCompareService.cs +++ b/Myshipping.Application/Service/TaskManagePlat/TaskDraftCompareService.cs @@ -249,7 +249,7 @@ namespace Myshipping.Application } //如果确认文件读取成功 - var bookFilePath = await FileAttachHelper.MoveFile(bookingOrder.Id.ToString(), fileFullName, batchNo); + var bookFilePath = await FileAttachHelper.MoveFile(bookingOrder.Id.ToString(), fileFullName, batchNo, false, "draftfiles"); //将格式单附件写入订舱的附件 await SaveEDIFile(bookingOrder.Id, bookFilePath, new System.IO.FileInfo(fileFullName).Name, entity.TenantId.Value, diff --git a/Myshipping.Application/Service/TaskManagePlat/TaskManageBCService.cs b/Myshipping.Application/Service/TaskManagePlat/TaskManageBCService.cs index 07bcd81f..1a7cd46c 100644 --- a/Myshipping.Application/Service/TaskManagePlat/TaskManageBCService.cs +++ b/Myshipping.Application/Service/TaskManagePlat/TaskManageBCService.cs @@ -1,16 +1,21 @@ using Furion; +using Furion.DistributedIDGenerator; using Furion.DynamicApiController; using Furion.FriendlyException; +using Furion.JsonSerialization; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Myshipping.Application.ConfigOption; using Myshipping.Application.Entity; using Myshipping.Application.Enum; +using Myshipping.Application.Service.BookingSlot.Dto; using Myshipping.Core; using Myshipping.Core.Entity; using Myshipping.Core.Service; +using Npoi.Mapper; using NPOI.SS.Formula.Functions; +using RabbitMQ.Client; using SqlSugar; using StackExchange.Profiling.Internal; using System; @@ -20,6 +25,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; +using Yitter.IdGenerator; namespace Myshipping.Application { @@ -39,8 +45,18 @@ namespace Myshipping.Application private readonly SqlSugarRepository _bookingOrderRepository; private readonly SqlSugarRepository _bookingCtnRepository; private readonly SqlSugarRepository _sysUserRepository; + private readonly SqlSugarRepository _bookingFileRepository; private readonly IServiceWorkFlowBaseService _serviceWorkFlowBaseService; + private readonly IBookingOrderService _bookingOrderService; + private readonly IBookingSlotService _bookingSlotService; + private readonly IBookingValueAddedService _bookingValueAddedService; + + const string CONST_BC_FILE_CODE = "bc"; + const string CONST_BC_FILE_NAME = "Booking Confirmation"; + + const string CONST_BC_NOTICE_FILE_CODE = "bc_notice"; + const string CONST_BC_NOTICE_FILE_NAME = "Booking Confirmation Notice"; public TaskManageBCService(SqlSugarRepository taskBCInfoRepository, SqlSugarRepository taskBaseRepository, @@ -49,7 +65,10 @@ namespace Myshipping.Application SqlSugarRepository bookingOrderRepository, SqlSugarRepository bookingCtnRepository, SqlSugarRepository sysUserRepository, - IServiceWorkFlowBaseService serviceWorkFlowBaseService) + SqlSugarRepository bookingFileRepository, + IServiceWorkFlowBaseService serviceWorkFlowBaseService, + IBookingOrderService bookingOrderService, + IBookingSlotService bookingSlotService, ISysCacheService cache, IBookingValueAddedService bookingValueAddedService) { _taskBaseRepository = taskBaseRepository; _taskBCInfoRepository = taskBCInfoRepository; @@ -59,6 +78,11 @@ namespace Myshipping.Application _bookingCtnRepository = bookingCtnRepository; _sysUserRepository = sysUserRepository; _serviceWorkFlowBaseService = serviceWorkFlowBaseService; + _bookingOrderService = bookingOrderService; + _bookingSlotService = bookingSlotService; + _cache = cache; + _bookingValueAddedService = bookingValueAddedService; + _bookingFileRepository = bookingFileRepository; } #region 获取BC详情 @@ -598,12 +622,23 @@ namespace Myshipping.Application try { /* - 1、推送舱位生成方法。 - 2、推送舱位暂存方法。 - 3、推送舱位分配方法。 - 4、更新任务状态位完成。 + 1、GEN_BOOKING_SLOT-生成舱位和订舱 + (1)生成舱位 + (2)生成海运订舱 + (3)更新舱位库存 + (4)更新BC任务 + 2、GEN_BOOKING-只生成订舱 + (1)生成海运订舱 + (4)更新BC任务 + 3、GEN_SLOT-只生成舱位 + (1)生成舱位 + (4)更新BC任务 + 3、GEN_SLOT-只生成舱位 + (1)查找订舱记录 + (3)更新舱位库存 + (4)更新BC任务 */ - if(string.IsNullOrWhiteSpace(model.BCTaskId)) + if (string.IsNullOrWhiteSpace(model.BCTaskId)) throw Oops.Oh($"BC任务主键不能为空"); //生成方式(GEN_BOOKING_SLOT-生成舱位和订舱;GEN_BOOKING-只生成订舱;GEN_SLOT-只生成舱位;GEN_EXIST_BOOKING-匹配指定的订舱) @@ -623,13 +658,188 @@ namespace Myshipping.Application var bcCtnList = _taskBCCTNInfoRepository.AsQueryable().Where(a => a.P_ID == bcOrder.PK_ID).ToList(); + var fileList = _taskFileRepository.AsQueryable().Where(a => a.TASK_PKID == bcTaskInfo.PK_ID).ToList(); + if ((bcOrder.BOOKING_ORDER_ID.HasValue && bcOrder.BOOKING_ORDER_ID.Value>0) || (bcOrder.BOOKING_SLOT_ID.HasValue && bcOrder.BOOKING_SLOT_ID.Value > 0)) { throw Oops.Oh($"当前BC任务已生成订舱或舱位,不能重复生成"); } + if (model.GenerateMethod == "GEN_BOOKING_SLOT") + { + #region 推送舱位、推送订舱 + //推送舱位 + var bookingSlotId = GenerateBookingSlot(bcOrder, bcCtnList, fileList).GetAwaiter().GetResult(); + + //推送订舱 + var bookingOrderId = GenerateBookingOrder(bcOrder, bcCtnList, fileList, model).GetAwaiter().GetResult(); + + if (bookingSlotId > 0 || bookingOrderId > 0) + { + var bcEntity = _taskBCInfoRepository.AsQueryable().First(a => a.PK_ID == bcTaskInfo.PK_ID); + + if (bcEntity != null) + { + if (bookingOrderId > 0) + bcEntity.BOOKING_ORDER_ID = bookingOrderId; + + if (bookingSlotId > 0) + bcEntity.BOOKING_SLOT_ID = bookingSlotId; + + bcEntity.UpdatedTime = DateTime.Now; + bcEntity.UpdatedUserId = UserManager.UserId; + bcEntity.UpdatedUserName = UserManager.Name; + + _taskBCInfoRepository.AsUpdateable(bcEntity).UpdateColumns(it => new + { + it.BOOKING_ORDER_ID, + it.BOOKING_SLOT_ID, + it.UpdatedTime, + it.UpdatedUserId, + it.UpdatedUserName + + }).ExecuteCommand(); + + + var taskEntity = _taskBaseRepository.AsQueryable().First(u => u.PK_ID == bcEntity.TASK_ID); + + if(taskEntity != null && taskEntity.IS_PUBLIC == 1) + { + taskEntity.IS_PUBLIC = 0; + taskEntity.CreatedUserId = UserManager.UserId; + taskEntity.CreatedUserName = UserManager.Name; + taskEntity.UpdatedTime = DateTime.Now; + taskEntity.UpdatedUserId = UserManager.UserId; + taskEntity.UpdatedUserName = UserManager.Name; + + _taskBaseRepository.AsUpdateable(taskEntity).UpdateColumns(it => new + { + it.IS_PUBLIC, + it.UpdatedTime, + it.UpdatedUserId, + it.UpdatedUserName, + it.CreatedUserId, + it.CreatedUserName + + }).ExecuteCommand(); + } + } + } + #endregion + } + else if (model.GenerateMethod == "GEN_BOOKING") + { + #region 推送订舱 + //推送订舱 + var bookingOrderId = GenerateBookingOrder(bcOrder, bcCtnList, fileList, model).GetAwaiter().GetResult(); + + if (bookingOrderId > 0) + { + var bcEntity = _taskBCInfoRepository.AsQueryable().First(a => a.PK_ID == bcTaskInfo.PK_ID); + + if (bcEntity != null) + { + if (bookingOrderId > 0) + bcEntity.BOOKING_ORDER_ID = bookingOrderId; + + bcEntity.UpdatedTime = DateTime.Now; + bcEntity.UpdatedUserId = UserManager.UserId; + bcEntity.UpdatedUserName = UserManager.Name; + + _taskBCInfoRepository.AsUpdateable(bcEntity).UpdateColumns(it => new + { + it.BOOKING_ORDER_ID, + it.BOOKING_SLOT_ID, + it.UpdatedTime, + it.UpdatedUserId, + it.UpdatedUserName + + }).ExecuteCommand(); + + + var taskEntity = _taskBaseRepository.AsQueryable().First(u => u.PK_ID == bcEntity.TASK_ID); + + if (taskEntity != null && taskEntity.IS_PUBLIC == 1) + { + taskEntity.IS_PUBLIC = 0; + taskEntity.CreatedUserId = UserManager.UserId; + taskEntity.CreatedUserName = UserManager.Name; + taskEntity.UpdatedTime = DateTime.Now; + taskEntity.UpdatedUserId = UserManager.UserId; + taskEntity.UpdatedUserName = UserManager.Name; + + _taskBaseRepository.AsUpdateable(taskEntity).UpdateColumns(it => new + { + it.IS_PUBLIC, + it.UpdatedTime, + it.UpdatedUserId, + it.UpdatedUserName, + it.CreatedUserId, + it.CreatedUserName + + }).ExecuteCommand(); + } + } + } + #endregion + } + else if (model.GenerateMethod == "GEN_BOOKING_SLOT") + { + #region 推送舱位 + //推送舱位 + var bookingSlotId = GenerateBookingSlot(bcOrder, bcCtnList, fileList).GetAwaiter().GetResult(); + + if (bookingSlotId > 0) + { + var bcEntity = _taskBCInfoRepository.AsQueryable().First(a => a.PK_ID == bcTaskInfo.PK_ID); + + if (bcEntity != null) + { + if (bookingSlotId > 0) + bcEntity.BOOKING_SLOT_ID = bookingSlotId; + + bcEntity.UpdatedTime = DateTime.Now; + bcEntity.UpdatedUserId = UserManager.UserId; + bcEntity.UpdatedUserName = UserManager.Name; + + _taskBCInfoRepository.AsUpdateable(bcEntity).UpdateColumns(it => new + { + it.BOOKING_ORDER_ID, + it.BOOKING_SLOT_ID, + it.UpdatedTime, + it.UpdatedUserId, + it.UpdatedUserName + }).ExecuteCommand(); + + + var taskEntity = _taskBaseRepository.AsQueryable().First(u => u.PK_ID == bcEntity.TASK_ID); + + if (taskEntity != null && taskEntity.IS_PUBLIC == 1) + { + taskEntity.IS_PUBLIC = 0; + taskEntity.CreatedUserId = UserManager.UserId; + taskEntity.CreatedUserName = UserManager.Name; + taskEntity.UpdatedTime = DateTime.Now; + taskEntity.UpdatedUserId = UserManager.UserId; + taskEntity.UpdatedUserName = UserManager.Name; + + _taskBaseRepository.AsUpdateable(taskEntity).UpdateColumns(it => new + { + it.IS_PUBLIC, + it.UpdatedTime, + it.UpdatedUserId, + it.UpdatedUserName, + it.CreatedUserId, + it.CreatedUserName + + }).ExecuteCommand(); + } + } + } + #endregion + } result.succ = true; result.msg = "成功"; @@ -644,6 +854,293 @@ namespace Myshipping.Application } #endregion + #region 生成舱位 + /// + /// 生成舱位 + /// + /// BC任务详情 + /// BC任务集装箱列表 + /// BC任务附件列表 + /// 返回舱位ID + private async Task GenerateBookingSlot(TaskBCInfo taskBCInfo, List taskBCCtnList, List taskFileList) + { + long id = 0; + + try + { + var carrierInfo = _cache.GetAllCodeCarrier().GetAwaiter().GetResult() + .Where(t => t.Code.Equals(taskBCInfo.CARRIERID, StringComparison.OrdinalIgnoreCase) + || t.EnName.Equals(taskBCInfo.CARRIERID, StringComparison.OrdinalIgnoreCase) + || t.CnName.Equals(taskBCInfo.CARRIERID, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + + + BookingSlotBaseApiDto slotModel = new BookingSlotBaseApiDto + { + DataObj = new BookingSlotBaseApiSaveDto + { + CARRIERID = taskBCInfo.CARRIERID, + CARRIER = carrierInfo.CnName?.Trim(), + SLOT_BOOKING_NO = taskBCInfo.MBL_NO, + BOOKING_PARTY = taskBCInfo.BOOKING_PARTY, + BOOKING_SLOT_TYPE = taskBCInfo.BOOKING_SLOT_TYPE, + BOOKING_SLOT_TYPE_NAME = taskBCInfo.BOOKING_SLOT_TYPE_NAME, + VESSEL = taskBCInfo.VESSEL, + VOYNO = taskBCInfo.VOYNO, + VGM_SUBMISSION_CUT_DATE = taskBCInfo.VGM_CUTOFF_TIME, + WEEK_AT = taskBCInfo.WEEK_AT, + CARRIAGE_TYPE = taskBCInfo.CARRIAGE_TYPE, + CARRIAGE_TYPE_NAME = taskBCInfo.CARRIAGE_TYPE_NAME, + CONTRACT_NO = taskBCInfo.CONTRACTNO, + CTN_STAT = taskBCInfo.CTN_STAT, + CY_CUT_DATE = taskBCInfo.CY_CUTOFF_TIME, + DETENSION_FREE_DAYS = taskBCInfo.DETENSION_FREE_DAYS, + ETD = taskBCInfo.ETD, + ETA = taskBCInfo.ETA, + LANECODE = taskBCInfo.LANECODE, + LANENAME = taskBCInfo.LANENAME, + MANIFEST_CUT_DATE = taskBCInfo.MANIFEST_CUT_DATE, + MDGF_CUT_DATE = taskBCInfo.MDGF_CUT_DATE, + PLACEDELIVERY = taskBCInfo.PLACEDELIVERY, + PLACERECEIPT = taskBCInfo.PLACERECEIPT, + PORTDISCHARGE = taskBCInfo.PORTDISCHARGE, + PORTLOAD = taskBCInfo.PORTLOAD, + SI_CUT_DATE = taskBCInfo.SI_CUT_DATE, + TRANSFER_PORT_1 = taskBCInfo.TRANSFER_PORT_1, + TRANSFER_PORT_2 = taskBCInfo.TRANSFER_PORT_2, + CtnList = new List() + }, + OpType = "add" + }; + + var ctnCodeList = _cache.GetAllCodeCtn().GetAwaiter().GetResult().ToList(); + + if (taskBCCtnList.Count > 0) + { + taskBCCtnList.ForEach(t => + { + var ctnCode = ctnCodeList.FirstOrDefault(a => !string.IsNullOrWhiteSpace(a.Name) && + a.Name.Equals(t.CTNALL, StringComparison.OrdinalIgnoreCase)); + + BookingSlotCtnSaveInput ctn = new BookingSlotCtnSaveInput + { + CTNCODE = ctnCode?.Code, + CTNALL = t.CTNALL, + CTNNUM = t.CTNNUM.HasValue ? t.CTNNUM.Value : 1 + }; + + slotModel.DataObj.CtnList.Add(ctn); + }); + } + + id = await _bookingSlotService.ApiReceive(slotModel); + + string batchNo = IDGen.NextID().ToString(); + + //成功后写入附件 + if (id > 0) + { + var opt = App.GetOptions(); + var dirAbs = opt.basePath; + if (string.IsNullOrEmpty(dirAbs)) + { + dirAbs = App.WebHostEnvironment.WebRootPath; + } + + taskFileList.ForEach(file => + { + if (file.FILE_CATEGORY == TaskFileCategoryEnum.BC.ToString()) + { + var fileFullPath = Path.Combine(dirAbs, file.FILE_PATH); + + if (File.Exists(fileFullPath)) + { + //如果确认文件读取成功 + var bookFilePath = FileAttachHelper.MoveFile(id.ToString(), fileFullPath, batchNo, false, "bcfiles", true).GetAwaiter().GetResult(); + + //将格式单附件写入订舱的附件 + SaveEDIFile(id, bookFilePath, new System.IO.FileInfo(bookFilePath).Name, taskBCInfo.TenantId.Value, + CONST_BC_FILE_CODE, CONST_BC_FILE_NAME).GetAwaiter(); + } + } + else if (file.FILE_CATEGORY == TaskFileCategoryEnum.BC_NOTICE.ToString()) + { + var fileFullPath = Path.Combine(dirAbs, file.FILE_PATH); + + if (File.Exists(fileFullPath)) + { + //如果确认文件读取成功 + var bookFilePath = FileAttachHelper.MoveFile(id.ToString(), fileFullPath, batchNo,false,"bcnoticefile",true).GetAwaiter().GetResult(); + + //将格式单附件写入订舱的附件 + SaveEDIFile(id, bookFilePath, new System.IO.FileInfo(bookFilePath).Name, taskBCInfo.TenantId.Value, + CONST_BC_NOTICE_FILE_CODE, CONST_BC_NOTICE_FILE_NAME).GetAwaiter(); + } + } + }); + } + } + catch (Exception ex) + { + _logger.LogError($"任务BC MBLNO:{taskBCInfo.MBL_NO} 生成舱位异常,原因:{ex.Message}"); + } + + return id; + } + #endregion + + + #region 生成订舱 + /// + /// 生成订舱 + /// + /// BC任务详情 + /// BC任务集装箱列表 + /// BC任务附件列表 + /// 订舱请求详情 + /// 返回订舱ID + private async Task GenerateBookingOrder(TaskBCInfo taskBCInfo, List taskBCCtnList, List taskFileList, + BookingOrSlotGenerateDto generateModel) + { + long id = 0; + + try + { + /* + 1、新增订舱 + 2、推送服务项目 + 3、推送附件 + */ + + var carrierInfo = _cache.GetAllCodeCarrier().GetAwaiter().GetResult() + .Where(t => t.Code.Equals(taskBCInfo.CARRIERID, StringComparison.OrdinalIgnoreCase) + || t.EnName.Equals(taskBCInfo.CARRIERID, StringComparison.OrdinalIgnoreCase) + || t.CnName.Equals(taskBCInfo.CARRIERID, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + + SaveBookingOrderInput bkModel = new SaveBookingOrderInput + { + CUSTOMERID = generateModel.CustomerId, + CUSTOMERNAME = generateModel.CustomerName, + CARRIERID = carrierInfo.Code?.Trim(), + CARRIER = carrierInfo.CnName?.Trim(), + MBLNO = taskBCInfo.MBL_NO.ToUpper().Trim(), + CONTRACTNO = !string.IsNullOrWhiteSpace(taskBCInfo.CONTRACTNO) ? taskBCInfo.CONTRACTNO : "", + VESSEL = taskBCInfo.VESSEL.ToUpper().Trim(), + VOYNO = taskBCInfo.VOYNO.ToUpper().Trim(), + VOYNOINNER = taskBCInfo.VOYNO.ToUpper().Trim(), + ETD = taskBCInfo.ETD, + ETA = taskBCInfo.ETA, + SALEID = generateModel.SaleId.ToString(), + SALE = generateModel.SaleName, + OPID = generateModel.OpId.ToString(), + OP = generateModel.OpName, + DOCID = generateModel.DocId.ToString(), + DOC = generateModel.DocName, + ROUTEID = generateModel.RouteID.ToString(), + ROUTE = generateModel.Route, + CZRemark = generateModel.CZRemark, + ShenQingXiangShi = generateModel.ShenQingXiangShi, + LineManageID = generateModel.LineManageID.ToString(), + LineName = generateModel.LineManage, + CLOSEVGMDATE = taskBCInfo.VGM_CUTOFF_TIME, + CLOSINGDATE = taskBCInfo.CY_CUTOFF_TIME, + CLOSEDOCDATE = taskBCInfo.CUT_SINGLE_TIME, + ctnInputs = new List() + }; + + var ctnCodeList = _cache.GetAllCodeCtn().GetAwaiter().GetResult().ToList(); + + if (taskBCCtnList.Count > 0) + { + taskBCCtnList.ForEach(t => + { + var ctnCode = ctnCodeList.FirstOrDefault(a => !string.IsNullOrWhiteSpace(a.Name) && + a.Name.Equals(t.CTNALL, StringComparison.OrdinalIgnoreCase)); + + BookingCtnDto ctn = new BookingCtnDto + { + CTNCODE = ctnCode?.Code, + CTNALL = t.CTNALL, + CTNNUM = t.CTNNUM.HasValue ? t.CTNNUM.Value : 1 + }; + + bkModel.ctnInputs.Add(ctn); + }); + } + + var bkRlt = await _bookingOrderService.Save(bkModel); + + id = bkRlt.Id; + + string batchNo = IDGen.NextID().ToString(); + + if (id > 0) + { + if (generateModel.ProjectList != null && generateModel.ProjectList.Count > 0) + { + ModifyServiceProjectDto projectDto = new ModifyServiceProjectDto + { + BookingId = id, + ProjectCodes = generateModel.ProjectList.Distinct().ToArray(), + }; + //写入服务项目 + var prjRlt = await _bookingValueAddedService.SaveServiceProject(projectDto); + + _logger.LogInformation($"推送订舱的服务项目完成 id={id} rlt={JSON.Serialize(prjRlt)}"); + } + + var opt = App.GetOptions(); + var dirAbs = opt.basePath; + if (string.IsNullOrEmpty(dirAbs)) + { + dirAbs = App.WebHostEnvironment.WebRootPath; + } + + taskFileList.ForEach(file => + { + if (file.FILE_CATEGORY == TaskFileCategoryEnum.BC.ToString()) + { + var fileFullPath = Path.Combine(dirAbs, file.FILE_PATH); + + if (File.Exists(fileFullPath)) + { + //如果确认文件读取成功 + var bookFilePath = FileAttachHelper.MoveFile(id.ToString(), fileFullPath, batchNo).GetAwaiter().GetResult(); + + //将格式单附件写入订舱的附件 + SaveEDIFile(id, bookFilePath, new System.IO.FileInfo(bookFilePath).Name, taskBCInfo.TenantId.Value, + CONST_BC_FILE_CODE, CONST_BC_FILE_NAME).GetAwaiter(); + } + } + else if (file.FILE_CATEGORY == TaskFileCategoryEnum.BC_NOTICE.ToString()) + { + var fileFullPath = Path.Combine(dirAbs, file.FILE_PATH); + + if (File.Exists(fileFullPath)) + { + //如果确认文件读取成功 + var bookFilePath = FileAttachHelper.MoveFile(id.ToString(), fileFullPath, batchNo, false, "bcnoticefile").GetAwaiter().GetResult(); + + //将格式单附件写入订舱的附件 + SaveEDIFile(id, bookFilePath, new System.IO.FileInfo(bookFilePath).Name, taskBCInfo.TenantId.Value, + CONST_BC_NOTICE_FILE_CODE, CONST_BC_NOTICE_FILE_NAME).GetAwaiter(); + } + } + }); + } + + _logger.LogInformation($"任务BC MBLNO:{taskBCInfo.MBL_NO} 生成订舱成功 id={id}"); + + } + catch(Exception ex) + { + _logger.LogError($"任务BC MBLNO:{taskBCInfo.MBL_NO} 生成订舱异常,原因:{ex.Message}"); + } + + + return id; + } + #endregion + #region 取消任务 /// /// 取消任务 @@ -706,5 +1203,41 @@ namespace Myshipping.Application return await _serviceWorkFlowBaseService.GetEnableProjectList(UserManager.TENANT_ID.ToString()); } #endregion + + #region 异步写入附件表 + /// + /// 异步写入附件表 + /// + /// 订舱ID + /// 文件路径 + /// 文件名 + /// 租户ID + /// 附件类型代码 + /// 附件类型名称 + /// 附件模块代码 + /// + [NonAction] + private async Task SaveEDIFile(long boookId, string FilePath, string fileName, long tenantId, + string fileTypeCode = "bc", string fileTypeName = "Booking Confirmation",string moudle = "BookingSlot") + { + /* + 直接将附件信息写入附件表 + */ + //EDI文件 + var bookFile = new BookingFile + { + Id = YitIdHelper.NextId(), + FileName = fileName, + FilePath = FilePath, + TypeCode = fileTypeCode, + TypeName = fileTypeName, + BookingId = boookId, + TenantId = tenantId, + Moudle = moudle + }; + + await _bookingFileRepository.InsertAsync(bookFile); + } + #endregion } }