| | |
| | | using Mapster; |
| | | using MapsterMapper; |
| | | using WIDESEA_Common.CommonEnum; |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Common.TaskEnum; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_Core.Utilities; |
| | | using WIDESEA_DTO.Basic; |
| | | using WIDESEA_DTO.Task; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_Model.Models; |
| | | using WIDESEA_Common.CommonEnum; |
| | | |
| | | namespace WIDESEA_BasicService |
| | | { |
| | |
| | | /// </summary> |
| | | public partial class LocationInfoService : ServiceBase<Dt_LocationInfo, IRepository<Dt_LocationInfo>>, ILocationInfoService |
| | | { |
| | | private readonly IMapper _mapper; |
| | | private readonly IRepository<Dt_Task> _taskRepository; |
| | | private readonly IRepository<Dt_StockInfo> _stockInfoRepository; |
| | | |
| | |
| | | public LocationInfoService( |
| | | IRepository<Dt_LocationInfo> baseDal, |
| | | IRepository<Dt_Task> taskRepository, |
| | | IRepository<Dt_StockInfo> stockInfoRepository) : base(baseDal) |
| | | IRepository<Dt_StockInfo> stockInfoRepository, |
| | | IMapper mapper) : base(baseDal) |
| | | { |
| | | _taskRepository = taskRepository; |
| | | _stockInfoRepository = stockInfoRepository; |
| | | _mapper = mapper; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | // 如果新的库位没有找到对应的任务 |
| | | if (internalTransferTask == null) |
| | | { |
| | | return content.OK("获取到移库任务", await HandleNoTaskAtLocation(outboundTask.SourceAddress, newLocationID, outboundTask)); |
| | | return content.OK("获取到移库任务", await HandleNoTaskAtLocation(newLocationID, outboundTask)); |
| | | } |
| | | |
| | | // 直接返回一深位出库任务 |
| | |
| | | int relativeLine = line % 2 == 1 ? line + 1 : line - 1; |
| | | |
| | | // 构建新的库位ID |
| | | string[] newLocationParts = new string[] { relativeLine.ToString().PadLeft(3, '0'), locationInfo.Column.ToString(), locationInfo.Layer.ToString() }; |
| | | string[] newLocationParts = new string[] { relativeLine.ToString().PadLeft(3, '0'), locationInfo.Column.ToString().PadLeft(3, '0'), locationInfo.Layer.ToString().PadLeft(3, '0') }; |
| | | return string.Join("-", newLocationParts); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 处理没有任务的库位情况 |
| | | /// </summary> |
| | | /// <param name="originalLocationID">原始库位ID</param> |
| | | /// <param name="newLocationID">新的库位ID</param> |
| | | /// <param name="outboundTask">出库任务</param> |
| | | /// <returns>生成的移库任务或原始出库任务</returns> |
| | | private async Task<Dt_Task> HandleNoTaskAtLocation(string originalLocationID, string newLocationID, Dt_Task outboundTask) |
| | | private async Task<Dt_Task> HandleNoTaskAtLocation(string newLocationID, Dt_Task outboundTask) |
| | | { |
| | | // 判断该位置是否有库存 |
| | | var stockInfo = await _stockInfoRepository.QueryFirstAsync(x => x.LocationCode == newLocationID); |
| | | if (stockInfo == null) |
| | | { |
| | | // 如果没有库存,直接返回当前出库任务 |
| | | return outboundTask; |
| | | } |
| | | |
| | | var stockInfo = await _stockInfoRepository.QueryDataNavFirstAsync(x => |
| | | x.LocationCode == newLocationID && |
| | | x.StockStatus == StockStatusEmun.入库完成.GetHashCode() && |
| | | x.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode()); |
| | | if (stockInfo == null) |
| | | { |
| | | // 如果没有库存,直接返回当前出库任务 |
| | |
| | | var newTransferTask = new Dt_Task |
| | | { |
| | | CreateDate = DateTime.Now, |
| | | Creater = App.User.UserName, |
| | | CurrentAddress = originalLocationID, |
| | | Creater = App.User.UserName ?? "system", |
| | | CurrentAddress = newLocationID, |
| | | Grade = 99, |
| | | NextAddress = emptyLocation.LocationCode, |
| | | PalletCode = stockInfo.PalletCode, |
| | | Remark = "移库", |
| | | Roadway = stockInfo.LocationDetails.RoadwayNo, |
| | | SourceAddress = originalLocationID, |
| | | SourceAddress = newLocationID, |
| | | TaskNum = taskNo, |
| | | TargetAddress = emptyLocation.LocationCode, |
| | | TaskType = TaskTypeEnum.Relocation.GetHashCode() |
| | | TaskType = TaskRelocationTypeEnum.Relocation.GetHashCode(), |
| | | TaskStatus = TaskRelocationStatusEnum.RelocationNew.GetHashCode(), |
| | | WarehouseId = stockInfo.WarehouseId |
| | | }; |
| | | |
| | | return await _taskRepository.Db.Insertable(newTransferTask).ExecuteReturnEntityAsync(); |
| | | var createdTask = await _taskRepository.Db.Insertable(newTransferTask).ExecuteReturnEntityAsync(); |
| | | |
| | | // 创建移库任务后,立即锁定库存和相关货位,避免并发重复分配 |
| | | stockInfo.StockStatus = StockStatusEmun.移库锁定.GetHashCode(); |
| | | var updateStockResult = await _stockInfoRepository.UpdateDataAsync(stockInfo); |
| | | |
| | | var locationsToUpdate = new List<Dt_LocationInfo>(); |
| | | if (stockInfo.LocationDetails != null) |
| | | { |
| | | stockInfo.LocationDetails.LocationStatus = LocationStatusEnum.InStockLock.GetHashCode(); |
| | | locationsToUpdate.Add(stockInfo.LocationDetails); |
| | | } |
| | | |
| | | emptyLocation.LocationStatus = LocationStatusEnum.FreeLock.GetHashCode(); |
| | | locationsToUpdate.Add(emptyLocation); |
| | | |
| | | var updateLocationResult = await BaseDal.UpdateDataAsync(locationsToUpdate); |
| | | if (!updateStockResult || !updateLocationResult) |
| | | { |
| | | throw new Exception("创建移库任务后更新库存状态或货位状态失败"); |
| | | } |
| | | |
| | | return createdTask; |
| | | } |
| | | |
| | | /// <summary> |