|
|
|
@ -1588,43 +1588,22 @@ namespace Myshipping.Application
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 【引入舱位】:如果存在舱位引入数据,则判断引入的舱位及箱子目前是否仍然可用
|
|
|
|
|
// 【引入舱位】:判断订舱是否引入过舱位数据,以及余量是否充足
|
|
|
|
|
if (input.Slots?.Any() == true)
|
|
|
|
|
{
|
|
|
|
|
// 当前操作如果为订舱台账的“修改”操作,判断是否该票订舱是否引入过舱位,如果引入过,则后续不再执行舱位引入的逻辑
|
|
|
|
|
if (input.Id != 0 && await _repSlotAllocation.IsExistsAsync(a => a.BOOKING_ID == input.Id))
|
|
|
|
|
var checkResult = await bookingSlotService.CheckImportSlots(input.Slots, input.Id);
|
|
|
|
|
|
|
|
|
|
// 如果该票订舱引入过舱位,则清空后续input.Slots,不再执行舱位引入的逻辑
|
|
|
|
|
if (checkResult.isExists)
|
|
|
|
|
{
|
|
|
|
|
input.Slots.Clear();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var slotIdList = input.Slots.Select(s => s.Id).ToList();
|
|
|
|
|
|
|
|
|
|
var latestSlotList = await bookingSlotService.GetAvailableSlots(null, slotIdList);
|
|
|
|
|
|
|
|
|
|
foreach (var inSlotItem in input.Slots)
|
|
|
|
|
{
|
|
|
|
|
var latestSlot = latestSlotList.FirstOrDefault(b => b.Id == inSlotItem.Id);
|
|
|
|
|
if (latestSlot == null)
|
|
|
|
|
{
|
|
|
|
|
throw Oops.Bah($"订舱编号为{inSlotItem.SLOT_BOOKING_NO}的舱位已被占用或取消,请重新引入");
|
|
|
|
|
}
|
|
|
|
|
if (inSlotItem.CtnList?.Any() == false)
|
|
|
|
|
{
|
|
|
|
|
throw Oops.Bah($"每个舱位至少选择一个箱子,订舱编号:{inSlotItem.SLOT_BOOKING_NO}");
|
|
|
|
|
}
|
|
|
|
|
foreach (var inCtnItem in inSlotItem.CtnList)
|
|
|
|
|
{
|
|
|
|
|
var latestCtn = latestSlot.CtnList.FirstOrDefault(c => c.CTNCODE == inCtnItem.CTNCODE);
|
|
|
|
|
if (latestCtn == null)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception($"订舱编号为{latestSlot.SLOT_BOOKING_NO}的舱位中,箱型为{inCtnItem.CTNALL}的箱子已被占用或取消,请重新引入");
|
|
|
|
|
}
|
|
|
|
|
if (latestCtn.CTNNUM < inCtnItem.CTNNUM)
|
|
|
|
|
// 如果该票订舱没有引入过舱位,判断余量是否充足
|
|
|
|
|
if (!checkResult.isEnough)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception($"订舱编号为{latestSlot.SLOT_BOOKING_NO}的舱位中,箱型为{inCtnItem.CTNALL}的箱子当前剩余{latestCtn.CTNNUM}个,少于所需的{inCtnItem.CTNNUM}个,请重新引入");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
throw Oops.Bah(checkResult.message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1982,50 +1961,7 @@ namespace Myshipping.Application
|
|
|
|
|
// 【引入舱位】:保存引用信息
|
|
|
|
|
if (input.Slots?.Any() == true)
|
|
|
|
|
{
|
|
|
|
|
var slotIdList = input.Slots.Select(s => s.Id).ToList();
|
|
|
|
|
List<BookingSlotBase> latestSlotList = await _repSlotBase.AsQueryable().Where(b => slotIdList.Contains(b.Id)).ToListAsync();
|
|
|
|
|
foreach (var inSlotItem in input.Slots)
|
|
|
|
|
{
|
|
|
|
|
var latestSlot = latestSlotList.First(b => b.Id == inSlotItem.Id);
|
|
|
|
|
|
|
|
|
|
var config = new TypeAdapterConfig();
|
|
|
|
|
config.ForType<BookingSlotBase, BookingSlotAllocation>()
|
|
|
|
|
.Ignore(dest => dest.CreatedTime)
|
|
|
|
|
.Ignore(dest => dest.UpdatedTime)
|
|
|
|
|
.Ignore(dest => dest.CreatedUserId)
|
|
|
|
|
.Ignore(dest => dest.UpdatedUserId)
|
|
|
|
|
.Ignore(dest => dest.CreatedUserName)
|
|
|
|
|
.Ignore(dest => dest.UpdatedUserName)
|
|
|
|
|
.Ignore(dest => dest.TenantId)
|
|
|
|
|
.Ignore(dest => dest.TenantName);
|
|
|
|
|
|
|
|
|
|
var newSlotAllocation = latestSlot.Adapt<BookingSlotAllocation>(config);
|
|
|
|
|
newSlotAllocation.Id = 0;
|
|
|
|
|
newSlotAllocation.BOOKING_SLOT_ID = latestSlot.Id;
|
|
|
|
|
newSlotAllocation.BOOKING_ID = entity.Id;
|
|
|
|
|
newSlotAllocation.ALLO_BILL_NO = latestSlot.SLOT_BOOKING_NO;
|
|
|
|
|
newSlotAllocation.FINAL_BILL_NO = latestSlot.SLOT_BOOKING_NO;
|
|
|
|
|
await _repSlotAllocation.InsertAsync(newSlotAllocation);
|
|
|
|
|
|
|
|
|
|
var insertCtnList = inSlotItem.CtnList.Select(c => new BookingSlotAllocationCtn()
|
|
|
|
|
{
|
|
|
|
|
SLOT_ALLOC_ID = newSlotAllocation.Id,
|
|
|
|
|
CTNCODE = c.CTNCODE,
|
|
|
|
|
CTNALL = c.CTNALL,
|
|
|
|
|
CTNNUM = c.CTNNUM
|
|
|
|
|
});
|
|
|
|
|
await _repSlotAllocationCtn.InsertAsync(insertCtnList);
|
|
|
|
|
|
|
|
|
|
// 更新库存
|
|
|
|
|
await _publisher.PublishAsync(new ChannelEventSource("BookingSlotStock:Update", new Event.BookingSlotStockUpdateModel
|
|
|
|
|
{
|
|
|
|
|
BOOKING_SLOT_TYPE = latestSlot.BOOKING_SLOT_TYPE,
|
|
|
|
|
CARRIERID = latestSlot.CARRIERID,
|
|
|
|
|
CONTRACT_NO = latestSlot.CONTRACT_NO,
|
|
|
|
|
VESSEL = latestSlot.VESSEL,
|
|
|
|
|
VOYNO = latestSlot.VOYNO
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
await bookingSlotService.ImportSlots(input.Slots, entity.Id, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var Id = entity.Id;
|
|
|
|
|