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
}
}