using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MailKit.Search; using WIDESEA_Common; using WIDESEA_Common.OrderEnum; using WIDESEA_Core; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_Model.Models; namespace WIDESEA_TaskInfoService { public partial class TaskService { /// /// 成品出库 /// /// /// public WebResponseContent WMSGenerateNewOutboundTask(int[] keys) { try { List tasks = new List(); List locationInfos = new List(); List outStockLockInfos = new List(); List outboundOrderDetails = _outboundService.NewOutboundOrderDetailService.Repository.QueryData(x => keys.Contains(x.Id)); if (outboundOrderDetails == null || outboundOrderDetails.Count == 0) { throw new Exception("未找到出库单明细信息"); } if (outboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null) { throw new Exception("所选出库单明细存在出库中或已完成"); } var lpngroup = outboundOrderDetails.GroupBy(x => x.LPNNo); List newOutboundOrderDetails = new List(); List stockInfos = new List(); foreach (var lpngroups in lpngroup) { string lpn = lpngroups.Key; List detailsForThisLPN = _outboundService.NewOutboundOrderDetailService.Repository.QueryData(x => x.LPNNo == lpn && x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()); if (detailsForThisLPN.Count == 0) continue; newOutboundOrderDetails.AddRange(detailsForThisLPN); Dt_StockInfo? stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == lpn && x.LocationCode != null); if (stockInfo == null) { throw new Exception($"未找到库存信息,托盘号{lpn}"); } stockInfos.Add(stockInfo); } if (stockInfos == null || stockInfos.Count == 0) { throw new Exception("未找到库存信息"); } List orderId = newOutboundOrderDetails.Select(x => x.OrderId).Distinct().ToList(); List outboundOrders = _outboundService.NewOutboundOrderService.Repository.QueryData(x => orderId.Contains(x.Id)); _unitOfWorkManage.BeginTran(); var Newtasks = GetTasks(stockInfos, TaskTypeEnum.OutProduct); List stockInfoDetails = _stockService.StockInfoDetailService.Repository.QueryData(x => stockInfos.Select(x => x.Id).Contains(x.StockId)); List palletcodelpn = new List(); foreach (var item in newOutboundOrderDetails) { Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.PalletCode == item.LPNNo); if (stockInfo == null) continue; Dt_StockInfoDetail? stockInfoDetail = stockInfoDetails.FirstOrDefault(x => x.StockId == stockInfo.Id && x.BatchNo == item.BatchNo); if (stockInfoDetail == null) continue; stockInfoDetail.OutboundQuantity += item.OrderQuantity; item.LockQuantity += item.OrderQuantity; item.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); var outboundOrder = outboundOrders.FirstOrDefault(x => x.Id == item.OrderId); Dt_OutStockLockInfo outStockLockInfo = _outboundService.OutboundStockLockInfoService.GetOutStockLockInfo(outboundOrder, item, stockInfo, stockInfoDetail, item.OrderQuantity); outStockLockInfo.Status = OutStockStatus.出库中.ObjToInt(); item.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); outboundOrder.OrderStatus = OutboundStatusEnum.出库中.ObjToInt(); stockInfo.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); var task = Newtasks.FirstOrDefault(x => x.PalletCode == item.LPNNo); if (task != null && !palletcodelpn.Contains(item.LPNNo)) { if (outboundOrder.OrderType == 1) { task.TaskType = TaskTypeEnum.OutProduct.ObjToInt(); } else if (outboundOrder.OrderType == 2) { task.TaskType = TaskTypeEnum.OutAllocate.ObjToInt(); } task.OrderNo = outboundOrder.OrderNo; tasks.Add(task); palletcodelpn.Add(task.PalletCode); } outStockLockInfo.TaskNum = task.TaskNum; outStockLockInfos.Add(outStockLockInfo); } locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(stockInfos.Select(x => x.LocationCode).ToList())); BaseDal.AddData(tasks); _stockService.StockInfoService.Repository.UpdateData(stockInfos); _stockService.StockInfoDetailService.Repository.UpdateData(stockInfoDetails); _outboundService.NewOutboundOrderDetailService.Repository.UpdateData(newOutboundOrderDetails); _outboundService.NewOutboundOrderService.Repository.UpdateData(outboundOrders); _outboundService.OutboundStockLockInfoService.Repository.AddData(outStockLockInfos); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock.ObjToInt(), StockChangeType.Outbound.ObjToInt(), "", tasks?.Select(x => x.TaskNum).ToList()); _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock); _unitOfWorkManage.CommitTran(); //将任务推送到WCS return PushTasksWCS(tasks); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// 合托出库 /// /// /// public WebResponseContent WMSGenerateSTOutboundTask(int[] keys) { try { List tasks = new List(); List locationInfos = new List(); List outStockLockInfos = new List(); List stockInfos = _stockService.StockInfoService.Repository.QueryData(x => keys.Contains(x.Id) && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()); if (stockInfos == null || stockInfos.Count == 0) { throw new Exception("未找到库存信息,或库存状态不为入库完成"); } _unitOfWorkManage.BeginTran(); var Newtasks = GetTasks(stockInfos, TaskTypeEnum.OutSyncretism); List stockInfoDetails = _stockService.StockInfoDetailService.Repository.QueryData(x => stockInfos.Select(x => x.Id).Contains(x.StockId)); foreach (var item in stockInfos) { Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.PalletCode == item.PalletCode); if (stockInfo == null) continue; stockInfo.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); var task = Newtasks.FirstOrDefault(x => x.PalletCode == item.PalletCode); tasks.Add(task); } locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(stockInfos.Select(x => x.LocationCode).ToList())); BaseDal.AddData(tasks); _stockService.StockInfoService.Repository.UpdateData(stockInfos); _stockService.StockInfoDetailService.Repository.UpdateData(stockInfoDetails); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock.ObjToInt(), StockChangeType.Outbound.ObjToInt(), "", tasks?.Select(x => x.TaskNum).ToList()); _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock); _unitOfWorkManage.CommitTran(); //将任务推送到WCS return PushTasksWCS(tasks); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// SMOM盘点出库 /// /// /// public WebResponseContent SMOMGenerateSTOutboundTask(int[] keys) { try { List tasks = new List(); List locationInfos = new List(); List outStockLockInfos = new List(); List takeStockOrderCPs = _takeStockOrderCPRepository.QueryData(x => keys.Contains(x.Id)); if (takeStockOrderCPs == null || takeStockOrderCPs.Count == 0) { throw new Exception("未找到库存信息,或库存状态不为入库完成"); } if (takeStockOrderCPs.FirstOrDefault(x => x.TakeStockStatus > TakeStockDetailStatusEnum.未盘点.ObjToInt()) != null) { throw new Exception("所选出库单明细存在出库中或已完成"); } List stockInfos = new List(); _unitOfWorkManage.BeginTran(); foreach (var takeStock in takeStockOrderCPs) { takeStock.TakeStockStatus = TakeStockStatusEnum.盘点中.ObjToInt(); List takeStockOrderDetailCPs = _takeStockOrderDetailCPRepository.QueryData(x => x.TakeStockId == takeStock.Id); foreach (var item in takeStockOrderDetailCPs) { item.TakeDetalStatus = TakeStockDetailStatusEnum.盘点出库中.ObjToInt(); _takeStockOrderDetailCPRepository.UpdateData(item); } var lpngroup = takeStockOrderDetailCPs.GroupBy(x => x.TakePalletCode); foreach (var lpngroups in lpngroup) { string lpn = lpngroups.Key; Dt_StockInfo? stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == lpn); if (stockInfo == null) { throw new Exception($"未找到库存信息,托盘号{lpn}"); } stockInfos.Add(stockInfo); } if (stockInfos == null || stockInfos.Count == 0) { throw new Exception("未找到库存信息"); } } string orderNo = takeStockOrderCPs.FirstOrDefault().OrderNo; var Newtasks = GetTask(stockInfos, TaskTypeEnum.OutInventory, orderNo); List stockInfoDetails = _stockService.StockInfoDetailService.Repository.QueryData(x => stockInfos.Select(x => x.Id).Contains(x.StockId)); foreach (var item in stockInfos) { Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.PalletCode == item.PalletCode); if (stockInfo == null) continue; stockInfo.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); var task = Newtasks.FirstOrDefault(x => x.PalletCode == item.PalletCode); tasks.Add(task); } locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(stockInfos.Select(x => x.LocationCode).ToList())); BaseDal.AddData(tasks); _stockService.StockInfoService.Repository.UpdateData(stockInfos); _stockService.StockInfoDetailService.Repository.UpdateData(stockInfoDetails); _takeStockOrderCPRepository.UpdateData(takeStockOrderCPs); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock.ObjToInt(), StockChangeType.Outbound.ObjToInt(), "", tasks?.Select(x => x.TaskNum).ToList()); _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock); _unitOfWorkManage.CommitTran(); //将任务推送到WCS return PushTasksWCS(tasks); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// SMOM盘点后库存调整 /// /// /// public WebResponseContent SMOMAdjustment(HouseAdjustment houseAdjustment) { WebResponseContent responseContent = new WebResponseContent(); try { if (houseAdjustment.DetailList.Count == 0) { return WebResponseContent.Instance.Error("无明细信息"); } List stockdetail = new List(); foreach (var item in houseAdjustment.DetailList) { Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == item.LPNNo); if (stockInfo == null) { return WebResponseContent.Instance.Error("未找到此托盘库存"); } var dt_StockInfo = BaseDal.Db.Queryable().LeftJoin((stockdetail, stock) => stockdetail.StockId == stock.Id) .Where((stockdetail, stock) => stockdetail.MaterielCode == item.MaterielCode && stockdetail.BatchNo == item.BatchNo && stock.PalletCode == item.LPNNo).Select((stockdetail, stock) => stockdetail).First(); if (dt_StockInfo != null) { dt_StockInfo.StockQuantity = item.OrderQuantity; stockdetail.Add(dt_StockInfo); } else { Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { StockId = stockInfo.Id, MaterielCode = item.MaterielCode, MaterielName = item.MaterielName, OrderNo = dt_StockInfo.OrderNo, BatchNo = item.BatchNo, SupplierBatch = dt_StockInfo.SupplierBatch, LinId = item.LinId, StockQuantity = item.OrderQuantity, Status = (int)StockStatusEmun.组盘暂存, Creater = "WMS", CreateDate = DateTime.Now, Id = item.LinId.ObjToInt(), MaterieSpec = dt_StockInfo.MaterieSpec, OrinalLocation = dt_StockInfo.OrinalLocation }; stockdetail.Add(stockInfoDetail); } } _unitOfWorkManage.BeginTran(); _stockInfoDetailRepository.UpdateData(stockdetail); _unitOfWorkManage.CommitTran(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error($"Error: {ex.Message}"); } return WebResponseContent.Instance.OK(); } /// /// SMOM发货后成品箱库存调整 /// /// /// public WebResponseContent SMOMStock(HouseStockDetail houseStockDetail) { WebResponseContent responseContent = new WebResponseContent(); try { if (houseStockDetail.DetailList.Count == 0) { return WebResponseContent.Instance.Error("无明细信息"); } List stockdetail = new List(); var allBoxCodes = new List(); _unitOfWorkManage.BeginTran(); foreach (var item in houseStockDetail.DetailList) { // 检查明细列表是否存在且有效 if (item.LabelList == null || item.LabelList.Count == 0) { return WebResponseContent.Instance.Error($"托盘{item.LPNNo}无箱码明细信息"); } allBoxCodes.AddRange(item.LabelList); Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == item.LPNNo); if (stockInfo == null) { return WebResponseContent.Instance.Error("未找到此托盘库存"); } var stockdetailbox = BaseDal.Db.Queryable().LeftJoin((s, d) => s.Id == d.StockId).LeftJoin((s, d, cp) => d.Id == cp.StockDetailId).Where((s, d, cp) => allBoxCodes.Contains(cp.BoxCode)).Select((s, d, cp) => cp.BoxCode) .Distinct() .ToList(); var stockInfoDetailCPList = _stockInfoDetailCPRepository.QueryData(x => stockdetailbox.Contains(x.BoxCode)).ToList(); if (stockInfoDetailCPList != null) { _stockInfoDetailCPRepository.DeleteAndMoveIntoHty(stockInfoDetailCPList, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); } } _unitOfWorkManage.CommitTran(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error($"Error: {ex.Message}"); } return WebResponseContent.Instance.OK(); } public List GetTask(List stockInfos, TaskTypeEnum taskType, string orderNo) { List tasks = new List(); for (int i = 0; i < stockInfos.Count; i++) { Dt_StockInfo stockInfo = stockInfos[i]; if (stockInfo != null) { Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode); if (locationInfo == null) { throw new Exception("未找到出库库位"); } Dt_Task dt_Task = BaseDal.QueryFirst(x => x.SourceAddress == locationInfo.LocationCode || x.TargetAddress == locationInfo.LocationCode); if (dt_Task != null) { throw new Exception("该货位已存在起点任务或终点任务"); } Dt_Task dt_Task1 = BaseDal.QueryFirst(x => x.PalletCode == stockInfo.PalletCode); if (dt_Task1 != null) { throw new Exception("该托盘已存在任务"); } Dt_RoadwayInfo roadwayInfo = _basicService.RoadwayInfoService.Repository.QueryFirst(x => x.RoadwayNo == locationInfo.RoadwayNo); Dt_StockInfoDetail stockInfoDetail = _stockService.StockInfoDetailService.Repository.QueryFirst(x => x.StockId == stockInfo.Id); if (roadwayInfo != null) { if (roadwayInfo.RoadwayNo.Contains("CP")) { Dt_Task task = new() { PalletType = stockInfo.PalletType, OrderNo = orderNo, CurrentAddress = locationInfo.LocationCode, Grade = 0, Creater = "WMS", PalletCode = stockInfo.PalletCode, NextAddress = roadwayInfo.OutSCStationCode, Roadway = locationInfo.RoadwayNo, SourceAddress = locationInfo.LocationCode, TargetAddress = "", TaskStatus = OutTaskStatusEnum.OutNew.ObjToInt(), TaskType = taskType.ObjToInt(), Depth = locationInfo.Depth, WarehouseId = stockInfo.WarehouseId, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), MaterielCode = stockInfoDetail.MaterielCode, Quantity = (float)stockInfoDetail.StockQuantity }; tasks.Add(task); } else { Dt_Task task = new() { PalletType = stockInfo.PalletType, OrderNo = stockInfoDetail.OrderNo, CurrentAddress = locationInfo.LocationCode, Grade = 0, Creater = "WMS", PalletCode = stockInfo.PalletCode, NextAddress = roadwayInfo.OutSCStationCode, Roadway = locationInfo.RoadwayNo, SourceAddress = locationInfo.LocationCode, TargetAddress = "", TaskStatus = OutTaskStatusEnum.OutNew.ObjToInt(), TaskType = taskType.ObjToInt(), Depth = locationInfo.Depth, WarehouseId = stockInfo.WarehouseId, TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)) }; if (taskType != TaskTypeEnum.OutEmpty) { task.MaterielCode = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode; task.Quantity = (float)stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity); } tasks.Add(task); } } } } return tasks; } } }