diff --git a/src/WMS.Web.Domain/Services/InStockService.cs b/src/WMS.Web.Domain/Services/InStockService.cs index e80f8382..5197a88d 100644 --- a/src/WMS.Web.Domain/Services/InStockService.cs +++ b/src/WMS.Web.Domain/Services/InStockService.cs @@ -119,18 +119,39 @@ namespace WMS.Web.Domain.Services /// public async Task Receive(UpdateInStockTaskRequest dto, LoginInDto loginInfo) { - IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); - bool isRollback = false; - bool isTransaction = false; - var result = await this.Receive(dto, loginInfo.UserInfo.StaffId, isTransaction); - if (!result.IsSuccess) isRollback = true; + // 构建 Redis 锁的键名 + string lockKey = $"lock:taskidreceive{dto.Id}"; + // 构建 Redis 锁的值,用于标识锁的持有者 + string lockValue = Guid.NewGuid().ToString(); + // 获取 Redis 锁,设置超时时间为 10 秒 + if (await _redisDb.LockTakeAsync(lockKey, lockValue, TimeSpan.FromSeconds(10))) + { + try + { + IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); + bool isRollback = false; + bool isTransaction = false; + var result = await this.Receive(dto, loginInfo.UserInfo.StaffId, isTransaction); + if (!result.IsSuccess) isRollback = true; - //提交事务 - var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); - if (!isSuccess) - return result; + //提交事务 + var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); + if (!isSuccess) + return result; + + return Result.ReSuccess(); + } + finally + { + // 释放 Redis 锁 + await _redisDb.LockReleaseAsync(lockKey, lockValue); + } + } + else + { + return Result.ReFailure(ResultCodes.Concurrent_Instock); + } - return Result.ReSuccess(); } /// @@ -144,7 +165,7 @@ namespace WMS.Web.Domain.Services var taskId = instock.Details.Select(x => x.TaskId).FirstOrDefault(); // 构建 Redis 锁的键名 - string lockKey = $"lock:taskid{taskId}"; + string lockKey = $"lock:taskidshelf{taskId}"; // 构建 Redis 锁的值,用于标识锁的持有者 string lockValue = Guid.NewGuid().ToString(); // 获取 Redis 锁,设置超时时间为 10 秒 @@ -198,18 +219,38 @@ namespace WMS.Web.Domain.Services /// public async Task ShelfNoPurchase(NoPurchaseShelfRequest dto, LoginInDto loginInDto) { - _logger.LogInformation($"非采购入库:{JsonConvert.SerializeObject(dto)} 操作人:{loginInDto.UserInfo.StaffId + loginInDto.UserInfo.Nickname}"); - IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); - bool isRollback = false; - bool isTransaction = false; - //保存非采购上架的数据 - var shelfSave_result = await this.ShelfNoPurchaseSave(dto, loginInDto, isTransaction); - if (!shelfSave_result.IsSuccess) isRollback = true; - //提交事务 - var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); - if (!isSuccess) - return shelfSave_result; - return Result.ReSuccess(); + // 构建 Redis 锁的键名 + string lockKey = $"lock:taskidshelfnopurchase{dto.TaskId}"; + // 构建 Redis 锁的值,用于标识锁的持有者 + string lockValue = Guid.NewGuid().ToString(); + // 获取 Redis 锁,设置超时时间为 10 秒 + if (await _redisDb.LockTakeAsync(lockKey, lockValue, TimeSpan.FromSeconds(10))) + { + try + { + _logger.LogInformation($"非采购入库:{JsonConvert.SerializeObject(dto)} 操作人:{loginInDto.UserInfo.StaffId + loginInDto.UserInfo.Nickname}"); + IDbContextTransaction _transaction = _basicsRepositories.GetTransaction(); + bool isRollback = false; + bool isTransaction = false; + //保存非采购上架的数据 + var shelfSave_result = await this.ShelfNoPurchaseSave(dto, loginInDto, isTransaction); + if (!shelfSave_result.IsSuccess) isRollback = true; + //提交事务 + var isSuccess = _basicsRepositories.CommitTransaction(isRollback, _transaction); + if (!isSuccess) + return shelfSave_result; + return Result.ReSuccess(); + } + finally + { + // 释放 Redis 锁 + await _redisDb.LockReleaseAsync(lockKey, lockValue); + } + } + else + { + return Result.ReFailure(ResultCodes.Concurrent_Instock); + } } ///