using WIDESEA_Common.StockEnum; using WIDESEA_DTO.Stock; using WIDESEA_IStockService; using WIDESEA_Model.Models; namespace WIDESEA_StockService { /// /// 库存服务 /// public class StockSerivce : IStockService { public IStockInfoDetailService StockInfoDetailService { get; } public IStockInfoService StockInfoService { get; } public IStockInfoDetail_HtyService StockInfoDetail_HtyService { get; } public IStockInfo_HtyService StockInfo_HtyService { get; } /// /// 构造函数 /// /// 库存明细服务 /// 库存服务 /// 库存明细历史服务 /// 库存历史服务 public StockSerivce(IStockInfoDetailService stockInfoDetailService, IStockInfoService stockInfoService, IStockInfoDetail_HtyService stockInfoDetail_HtyService, IStockInfo_HtyService stockInfo_HtyService) { StockInfoDetailService = stockInfoDetailService; StockInfoService = stockInfoService; StockInfoDetail_HtyService = stockInfoDetail_HtyService; StockInfo_HtyService = stockInfo_HtyService; } /// /// 组盘 /// /// 组盘数据 /// 是否成功 public async Task GroupPallet(StockDTO stock) { // 组装明细数据 var now = DateTime.Now; var details = stock.Details.Select(item => new Dt_StockInfoDetail() { MaterielCode = "电芯", StockQuantity = item.Quantity, Unit = "PCS", Creater = "system", OrderNo = "111", ProductionDate = now.ToString(), EffectiveDate = now.AddYears(1).ToString(), SerialNumber = item.CellBarcode, InboundOrderRowNo = item.Channel, MaterielName = "电芯", Status = StockStatusEmun.组盘暂存.GetHashCode(), }).ToList(); // 如果托盘已存在,直接新增明细 var existingStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo); if (existingStock != null) { details.ForEach(detail => detail.StockId = existingStock.Id); return await StockInfoDetailService.Repository.AddDataAsync(details) > 0; } // 托盘不存在则创建并写入明细 var entity = new Dt_StockInfo() { PalletCode = stock.TargetPalletNo, WarehouseId = 1, StockStatus = 1, Creater = "system", Details = details }; //Dt_Task dt_Task = new Dt_Task() //{ // TaskNum = 0, // PalletCode = stock.PalletNo, // PalletType = 1, // Roadway = "1", // TaskType = TaskTypeEnum.Inbound.GetHashCode(), // TaskStatus = TaskStatusEnum.New.GetHashCode(), // SourceAddress = stock.LineNo, // TargetAddress = "组盘区", // CurrentAddress = stock.LineNo, // NextAddress = "组盘区", // WarehouseId = 1, // Grade = 1, // Creater = "system", //}; return StockInfoService.Repository.AddData(entity, x => x.Details); } /// /// 换盘 /// /// 需要换盘的明细数据 /// 是否成功 public async Task ChangePallet(StockDTO stock) { // 参数校验 if (stock == null || string.IsNullOrWhiteSpace(stock.TargetPalletNo) || string.IsNullOrWhiteSpace(stock.SourcePalletNo)) { return false; } // 新旧托盘一致不处理 if (string.Equals(stock.SourcePalletNo, stock.TargetPalletNo, StringComparison.OrdinalIgnoreCase)) { return false; } // 查询源托盘 var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo); if (sourceStock == null) { return false; } // 查询或创建目标托盘 var targetStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo); if (targetStock == null) { var newStock = new Dt_StockInfo() { PalletCode = stock.TargetPalletNo, WarehouseId = sourceStock.WarehouseId, StockStatus = sourceStock.StockStatus, Creater = "system" }; var newId = StockInfoService.Repository.AddData(newStock); if (newId <= 0) { return false; } targetStock = newStock; targetStock.Id = newId; } // 获取需要转移的条码 var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList(); if (!serialNumbers.Any()) { return false; } // 查询源托盘对应的明细 var detailEntities = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber)); if (!detailEntities.Any()) { return false; } // 写入历史记录 var detailHistory = CreateDetailHistory(detailEntities, "换盘"); if (await StockInfoDetail_HtyService.Repository.AddDataAsync(detailHistory) <= 0) { return false; } var stockHistory = CreateStockHistory(new List { sourceStock, targetStock }, "换盘"); if (await StockInfo_HtyService.Repository.AddDataAsync(stockHistory) <= 0) { return false; } // 更新明细的托盘主键 detailEntities.ForEach(detail => detail.StockId = targetStock.Id); return await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities); } /// /// 拆盘 /// /// 需要拆盘的明细数据 /// 是否成功 public async Task SplitPallet(StockDTO stock) { // 参数校验 if (stock == null || string.IsNullOrWhiteSpace(stock.SourcePalletNo)) { return false; } // 查询源托盘 var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo); if (sourceStock == null) { return false; } // 获取需要拆除的条码 var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList(); if (!serialNumbers.Any()) { return false; } // 查询源托盘对应的明细 var detailEntities = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber)); if (!detailEntities.Any()) { return false; } // 写入历史记录 var detailHistory = CreateDetailHistory(detailEntities, "拆盘"); if (await StockInfoDetail_HtyService.Repository.AddDataAsync(detailHistory) <= 0) { return false; } var stockHistory = CreateStockHistory(new List { sourceStock }, "拆盘"); if (await StockInfo_HtyService.Repository.AddDataAsync(stockHistory) <= 0) { return false; } // 删除明细 return await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities); } private List CreateDetailHistory(IEnumerable details, string operateType) { var now = DateTime.Now; return details.Select(detail => new Dt_StockInfoDetail_Hty { SourceId = detail.Id, OperateType = operateType, InsertTime = now, StockId = detail.StockId, MaterielCode = detail.MaterielCode, MaterielName = detail.MaterielName, OrderNo = detail.OrderNo, BatchNo = detail.BatchNo, ProductionDate = detail.ProductionDate, EffectiveDate = detail.EffectiveDate, SerialNumber = detail.SerialNumber, StockQuantity = detail.StockQuantity, OutboundQuantity = detail.OutboundQuantity, Status = detail.Status, Unit = detail.Unit, InboundOrderRowNo = detail.InboundOrderRowNo, Remark = detail.Remark, Creater = detail.Creater, CreateDate = detail.CreateDate, Modifier = detail.Modifier, ModifyDate = detail.ModifyDate }).ToList(); } private List CreateStockHistory(IEnumerable stocks, string operateType) { var now = DateTime.Now; return stocks.Select(stock => new Dt_StockInfo_Hty { SourceId = stock.Id, OperateType = operateType, InsertTime = now, PalletCode = stock.PalletCode, PalletType = stock.PalletType, LocationCode = stock.LocationCode, WarehouseId = stock.WarehouseId, StockStatus = stock.StockStatus, Remark = stock.Remark, Creater = stock.Creater, CreateDate = stock.CreateDate, Modifier = stock.Modifier, ModifyDate = stock.ModifyDate }).ToList(); } } }