This commit is contained in:
tongfei
2024-04-19 17:29:49 +08:00
parent 96e5beb7c9
commit 356253d154

View File

@@ -4,10 +4,12 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using WMS.Web.Core.Dto; using WMS.Web.Core.Dto;
using WMS.Web.Core.Dto.ChangeBoxRecord; using WMS.Web.Core.Dto.ChangeBoxRecord;
@@ -49,6 +51,8 @@ namespace WMS.Web.Domain.Services
private readonly IBoxInventoryRepositories _boxInventoryRepositories; private readonly IBoxInventoryRepositories _boxInventoryRepositories;
private readonly ILogger<InStockService> _logger; private readonly ILogger<InStockService> _logger;
private readonly IServiceScopeFactory _serviceScopeFactory; private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly ConcurrentDictionary<int, SemaphoreSlim> _locks = new ConcurrentDictionary<int, SemaphoreSlim>();
public InStockService(IMapper mapper, ISerialNumbersRepositories serialNumbersRepositories, IErpService erpService, IBoxInventoryService boxInventoryService, ISerialNumberService serialNumberService, ILoginService loginService, IBoxRepositories boxRepositories, public InStockService(IMapper mapper, ISerialNumbersRepositories serialNumbersRepositories, IErpService erpService, IBoxInventoryService boxInventoryService, ISerialNumberService serialNumberService, ILoginService loginService, IBoxRepositories boxRepositories,
IBasicsRepositories basicsRepositories, IErpBasicDataExtendService erpBasicDataExtendService, IChangeMoveBoxService changeMoveBoxService, IInStockTaskBoxRepositories inStockTaskBoxRepositories, IBasicsRepositories basicsRepositories, IErpBasicDataExtendService erpBasicDataExtendService, IChangeMoveBoxService changeMoveBoxService, IInStockTaskBoxRepositories inStockTaskBoxRepositories,
IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories, IBoxInventoryRepositories boxInventoryRepositories, ILogger<InStockService> logger, IServiceScopeFactory serviceScopeFactory) IInStockRepositories inStockRepositories, IInStockTaskRepositories inStockTaskRepositories, IBoxInventoryRepositories boxInventoryRepositories, ILogger<InStockService> logger, IServiceScopeFactory serviceScopeFactory)
@@ -128,6 +132,12 @@ namespace WMS.Web.Domain.Services
/// <param name="loginInfo"></param> /// <param name="loginInfo"></param>
/// <returns></returns> /// <returns></returns>
public async Task<Result> Shelf(PurchaseShelfRequest instock, LoginInDto loginInfo) public async Task<Result> Shelf(PurchaseShelfRequest instock, LoginInDto loginInfo)
{
var taskId= instock.Details.Select(x => x.TaskId).FirstOrDefault();
var taskLock = _locks.GetOrAdd(taskId, _ => new SemaphoreSlim(1, 1));
await taskLock.WaitAsync();
try
{ {
IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); IDbContextTransaction _transaction = _basicsRepositories.GetTransaction();
bool isRollback = false; bool isRollback = false;
@@ -153,6 +163,13 @@ namespace WMS.Web.Domain.Services
} }
return Result.ReSuccess(); return Result.ReSuccess();
} }
finally
{
taskLock.Release();
}
}
/// <summary> /// <summary>
/// 非采购单上架 /// 非采购单上架
@@ -585,7 +602,7 @@ namespace WMS.Web.Domain.Services
return Result<InStockTask>.ReFailure(ResultCodes.InStockTaskBoxIsHaveData); return Result<InStockTask>.ReFailure(ResultCodes.InStockTaskBoxIsHaveData);
//序列号 //序列号
var serialNumbs= await _serialNumbersRepositories.GetEntityListByBoxIds(dto_boxIds); var serialNumbs = await _serialNumbersRepositories.GetEntityListByBoxIds(dto_boxIds);
//3.组装绑定关系表,要添加的集合 //3.组装绑定关系表,要添加的集合
var boxEntitys = await _boxRepositories.GetEntityList(dto_boxIds); var boxEntitys = await _boxRepositories.GetEntityList(dto_boxIds);
@@ -596,13 +613,13 @@ namespace WMS.Web.Domain.Services
taskBox.TaskId = entity.Id; taskBox.TaskId = entity.Id;
taskBox.Receiver(staffId); taskBox.Receiver(staffId);
var currentBox_serialNumbs= serialNumbs.Where(s => s.BoxId == taskBox.BoxId).ToList(); var currentBox_serialNumbs = serialNumbs.Where(s => s.BoxId == taskBox.BoxId).ToList();
var current_dto_box_dets = boxEntitys.Where(x => x.Id == item.BoxId).SelectMany(x => x.Details).ToList(); var current_dto_box_dets = boxEntitys.Where(x => x.Id == item.BoxId).SelectMany(x => x.Details).ToList();
taskBox.Details = _mapper.Map<List<InStockTaskBoxDetails>>(current_dto_box_dets); taskBox.Details = _mapper.Map<List<InStockTaskBoxDetails>>(current_dto_box_dets);
taskBox.Details.ForEach(x => taskBox.Details.ForEach(x =>
{ {
x.ErpDetailId = item.ErpDetailId; x.ErpDetailId = item.ErpDetailId;
x.SerialNumbers= currentBox_serialNumbs.Where(s => s.MaterialNumber == x.MaterialNumber).Select(s => s.SerialNumber).ToList(); x.SerialNumbers = currentBox_serialNumbs.Where(s => s.MaterialNumber == x.MaterialNumber).Select(s => s.SerialNumber).ToList();
}); });
taskBoxAdd.Add(taskBox); taskBoxAdd.Add(taskBox);
} }