From c1f09f7d043477fc098920b115e752f60f51c82a Mon Sep 17 00:00:00 2001 From: jianghaiqing Date: Wed, 17 Jan 2024 17:10:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=88=B1=E4=BD=8D=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=99=84=E4=BB=B6=E6=9F=A5=E8=AF=A2=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9BC=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BookingOrder/IBookingOrderService.cs | 7 + .../Service/BookingSlot/BookingSlotService.cs | 27 +- .../BookingSlot/IBookingSlotService.cs | 10 +- .../TaskManagePlat/TaskManageBCService.cs | 312 +++++++++++++++++- 4 files changed, 347 insertions(+), 9 deletions(-) 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 b4488ea7..e5f8599f 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 @@ -625,5 +632,21 @@ namespace Myshipping.Application } } #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 } } diff --git a/Myshipping.Application/Service/BookingSlot/IBookingSlotService.cs b/Myshipping.Application/Service/BookingSlot/IBookingSlotService.cs index aabaa866..73d952a0 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,12 +9,19 @@ namespace Myshipping.Application { public interface IBookingSlotService { - Task ApiReceive(BookingSlotBaseApiDto dto); + Task ApiReceive(BookingSlotBaseApiDto dto); Task Detail(long id); Task> GetAvailableSlots(BookingSlotBaseDto slotInput = null, List slotIdListInput = null); Task> GetAvailableSlots(BookingSlotBaseDto input); Task PageStock(BookingSlotStockPageInput input); Task RefreshStock(BookingSlotStockUpdateModel input); Task Save(BookingSlotBaseSaveInput input); + + /// + /// 获取附件 + /// + /// 舱位主键 + /// 返回附件列表 + Task> GetFile(long id); } } \ No newline at end of file diff --git a/Myshipping.Application/Service/TaskManagePlat/TaskManageBCService.cs b/Myshipping.Application/Service/TaskManagePlat/TaskManageBCService.cs index 07bcd81f..2580989b 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,13 @@ 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; + public TaskManageBCService(SqlSugarRepository taskBCInfoRepository, SqlSugarRepository taskBaseRepository, @@ -49,7 +60,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 +73,11 @@ namespace Myshipping.Application _bookingCtnRepository = bookingCtnRepository; _sysUserRepository = sysUserRepository; _serviceWorkFlowBaseService = serviceWorkFlowBaseService; + _bookingOrderService = bookingOrderService; + _bookingSlotService = bookingSlotService; + _cache = cache; + _bookingValueAddedService = bookingValueAddedService; + _bookingFileRepository = bookingFileRepository; } #region 获取BC详情 @@ -598,12 +617,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,6 +653,8 @@ 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)) { @@ -630,6 +662,14 @@ namespace Myshipping.Application } + if (model.GenerateMethod == "GEN_BOOKING_SLOT") + { + //推送舱位 + GenerateBookingSlot(bcOrder, bcCtnList, fileList).GetAwaiter().GetResult(); + + //推送订舱 + var bookingOrderId = GenerateBookingOrder(bcOrder, bcCtnList, fileList, model).GetAwaiter().GetResult(); + } result.succ = true; result.msg = "成功"; @@ -644,6 +684,230 @@ 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(), + 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) + { + taskFileList.ForEach(async file => + { + //System.IO.FileStream file = new System.IO.FileStream(file, FileMode.Open, FileAccess.Read); + //附件暂存 + //var fileFullName = await FileAttachHelper.SaveFile(id, file, batchNo, "bc"); + + + }); + + } + } + 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; + + //附件暂存 + //var fileFullName = await FileAttachHelper.SaveFile(id, file, batchNo, CONST_DRAFT_FILE_CODE); + + //如果确认文件读取成功 + //var bookFilePath = await FileAttachHelper.MoveFile(bookingOrder.Id.ToString(), fileFullName, batchNo); + + //写入附件 + //await SaveEDIFile(id, bookFilePath, new System.IO.FileInfo(fileFullName).Name, entity.TenantId.Value, + // CONST_DRAFT_FILE_CODE, CONST_DRAFT_FILE_NAME); + + 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)}"); + } + + + _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 +970,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 } }