WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.strings.v9.binBinary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.995.13737/CodeChunks.dbBinary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/CopilotIndices/17.14.995.13737/SemanticSymbols.dbBinary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/345cfd9a-4138-4c4a-a9af-c8d22877aeae.vsidxBinary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/5c4a7e69-693f-412b-ad07-d063fc4e9d3b.vsidxBinary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/a7cf8380-9089-4dcc-924e-fb96f612f4aa.vsidxBinary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/aef23139-5f2b-4e2b-b8b1-07914de64bf1.vsidxBinary files differ
WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/FileContentIndex/cf340d1a-bab8-4f69-a5cd-bf2c9bf7d805.vsidxBinary files differ
WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/NewOutboundOrderDetailService.cs
@@ -30,7 +30,7 @@ /// <summary> /// 低温、药水库存分配 /// 成品分配 /// </summary> /// <param name="outboundOrderDetails"></param> /// <returns></returns> @@ -114,12 +114,9 @@ } List<Dt_StockInfo> autoAssignStocks = new List<Dt_StockInfo>(); List<IStockInfoService.residueQuantity> newResidueQuantitys = new List<IStockInfoService.residueQuantity>(); if (warehouse.Any(x => x.WarehouseCode.Contains("DW")) || warehouse.Any(x => x.WarehouseCode.Contains("YS"))) { autoAssignStocks = _stockService.StockInfoService.CPGetOutboundStocks(stockInfos, dt_OutboundOrderDetails, out List<IStockInfoService.residueQuantity> residueQuantitys); newResidueQuantitys.AddRange(residueQuantitys); outStocks.AddRange(autoAssignStocks); } foreach (var residueQuantity in newResidueQuantitys) { foreach (var item in dt_OutboundOrderDetails) @@ -149,11 +146,9 @@ palletAssignQuantity = outStockLockInfos.Where(x => x.MaterielCode == item.MaterielCode && x.PalletCode == autoAssignStocks[j].PalletCode).Sum(x => x.AssignQuantity);//出库详情已分配数量 } decimal palletOutboundQuantity = 0; if (warehouse.Any(x => x.WarehouseCode.Contains("DW")) || warehouse.Any(x => x.WarehouseCode.Contains("YS"))) { palletOutboundQuantity = autoAssignStocks[j].Details.Where(x => x.MaterielCode == item.MaterielCode).Sum(x => x.OutboundQuantity); } if (palletAssignQuantity < palletOutboundQuantity)//如果出库详情已分配数量小于托盘已分配数量,则可以继续添加该托盘出库信息 { decimal orderDetailNeedQuantity = details[i].OrderQuantity - detailAssignQuantity; WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/Service/OutboundOrderDetailService.cs
@@ -671,6 +671,8 @@ return WebResponseContent.Instance.Error("该出库单据非ERP推送,无法取消"); } string ids =""; try { foreach (var item in outboundOrderDetails) { ids = item.LinId; @@ -678,8 +680,6 @@ postContent.Add(new StringContent(ids), "ids"); string result = string.Empty; HttpClient client = null; try { using (client = new HttpClient()) { // 2. 发送请求 @@ -706,8 +706,9 @@ _outboundRepository.OutboundOrderRepository.DeleteAndMoveIntoHty(outboundOrder, OperateType.人工取消); } _unitOfWorkManage.CommitTran(); } // 假设ERP返回成功时返回成功响应 return WebResponseContent.Instance.OK(result); return WebResponseContent.Instance.OK(); } catch (HttpRequestException ex) @@ -723,9 +724,6 @@ // 处理其他异常 return WebResponseContent.Instance.Error($"处理失败: {ex.Message}"); } } return WebResponseContent.Instance.OK(); } } WMS/WIDESEA_WMSServer/WIDESEA_StockService/Service/StockInfoService.cs
@@ -345,10 +345,10 @@ List<Dt_StockInfo> notStocks = new List<Dt_StockInfo>(); ; foreach (var dt_OutboundOrderDetail in dt_OutboundOrderDetails) { notStocks = stockInfos.Where(x => x.Details.Any(x => x.BatchNo == dt_OutboundOrderDetail.BatchNo && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode)).OrderBy(x => x.Id).ToList(); notStocks = stockInfos.Where(x => x.Details.Any(x =>x.MaterielCode == dt_OutboundOrderDetail.MaterielCode)).OrderBy(x => x.Id).ToList(); if (notStocks.Count > 0) { decimal stockTotalQuantity = stockInfos.SelectMany(x => x.Details).Where(d => d.BatchNo == dt_OutboundOrderDetail.BatchNo).Sum(v => v.StockQuantity - v.OutboundQuantity); decimal stockTotalQuantity = stockInfos.SelectMany(x => x.Details).Where(d => d.MaterielCode == dt_OutboundOrderDetail.MaterielCode).Sum(v => v.StockQuantity - v.OutboundQuantity); decimal needQuantity = dt_OutboundOrderDetail.OrderQuantity - dt_OutboundOrderDetail.LockQuantity; if (stockTotalQuantity >= needQuantity)//库存够 { @@ -360,7 +360,7 @@ Dt_StockInfoDetail dt_StockInfoDetail = new Dt_StockInfoDetail(); foreach (var detail in stockInfo.Details) { if (detail.BatchNo == dt_OutboundOrderDetail.BatchNo && detail.MaterielCode == dt_OutboundOrderDetail.MaterielCode) if (detail.MaterielCode == dt_OutboundOrderDetail.MaterielCode) { dt_StockInfoDetail = detail; } @@ -370,7 +370,7 @@ { stockInfo.Details.ForEach(x => { if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo) if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode) { x.OutboundQuantity = x.StockQuantity; } @@ -382,7 +382,7 @@ stockInfo.Details.ForEach(x => { if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo) if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode) { if (x.StockQuantity - x.OutboundQuantity >= needQuantity) { @@ -409,7 +409,7 @@ decimal useableStockQuantity = 0; foreach (var detail in stockInfo.Details) { if (detail.MaterielCode == dt_OutboundOrderDetail.MaterielCode && detail.BatchNo == dt_OutboundOrderDetail.BatchNo) if (detail.MaterielCode == dt_OutboundOrderDetail.MaterielCode) { useableStockQuantity = detail.StockQuantity - detail.OutboundQuantity; } @@ -418,7 +418,7 @@ if (useableStockQuantity < needQuantity) { stockInfo.Details.ForEach(x => { if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo) if (x.MaterielCode == dt_OutboundOrderDetail.MaterielCode) { x.OutboundQuantity = x.StockQuantity; } @@ -429,7 +429,7 @@ { stockInfo.Details.ForEach(x => { if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode && x.BatchNo == dt_OutboundOrderDetail.BatchNo) if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == dt_OutboundOrderDetail.MaterielCode) { if (x.StockQuantity - x.OutboundQuantity >= needQuantity) { WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/NewPartialTaskService_Outbound.cs
@@ -41,6 +41,7 @@ } if (outboundOrderDetails.FirstOrDefault()?.LPNNo == null) { outboundOrderDetails.Clear(); try { List<StockSelectViewDTO> stockSelectViews = new List<StockSelectViewDTO>(); @@ -63,17 +64,13 @@ } if (result.Item5 != null && result.Item5.Count > 0) { locationInfos.AddRange(result.Item5); locationInfos.AddRange(result.Item5.DistinctBy(x => x.LocationCode)); } if (result.Item1 != null && result.Item1.Count > 0) { tasks.AddRange(result.Item1); } if (locationInfos.First().RoadwayNo.Contains("DW") || locationInfos.First().RoadwayNo.Contains("YS")) { break; } } WebResponseContent content = NEWGenerateOutboundTaskDataUpdate(tasks, stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos); @@ -447,14 +444,14 @@ List<Dt_LocationInfo>? locationInfos = null; //if (outboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) { Dt_OutboundOrder dt_OutboundOrder = _outboundService.OutboundOrderService.Repository.QueryData(x => x.Id == outboundOrderDetails.First().OrderId).First(); Dt_NewOutboundOrder dt_OutboundOrder = _outboundService.NewOutboundOrderService.Repository.QueryData(x => x.Id == outboundOrderDetails.First().OrderId).First(); (List<Dt_StockInfo>, List<Dt_NewOutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = new(); result = _outboundService.NewOutboundOrderDetailService.CPAssignStockOutbound(outboundOrderDetails); if (result.Item1 != null && result.Item1.Count > 0) { Dt_OutboundOrder outboundOrder = _outboundService.OutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId); Dt_NewOutboundOrder outboundOrder = _outboundService.NewOutboundOrderService.Repository.QueryFirst(x => x.Id == outboundOrderDetails.FirstOrDefault().OrderId); TaskTypeEnum typeEnum = outboundOrder.OrderType switch { (int)OrderTypeEnum.生产出库单 => TaskTypeEnum.Outbound, @@ -467,24 +464,10 @@ { x.OrderNo = outboundOrder.OrderNo; }); if (dt_OutboundOrder.OutWareHouse.Contains("DW") || dt_OutboundOrder.OutWareHouse.Contains("YS")) { result.Item2.ForEach(x => { if (x.LockQuantity == x.OrderQuantity) { x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); } }); } else { result.Item2.ForEach(x => { x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); }); } result.Item3.ForEach(x => { WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -1688,16 +1688,250 @@ x.LPNNo == stockInfo.PalletCode) .ToList(); if (outboundOrderDetails == null || outboundOrderDetails.Count == 0) List<Dt_NewOutboundOrderDetail> outboundOrderDetails1 = _outboundService.NewOutboundOrderDetailService.Db.Queryable<Dt_NewOutboundOrderDetail>() .Where(x => x.OrderId == outboundOrder.Id) .ToList(); if ((outboundOrderDetails == null && outboundOrderDetails1 == null) || (outboundOrderDetails.Count == 0 && outboundOrderDetails1.Count == 0)) { throw new Exception($"未找到托盘 {stockInfo.PalletCode} 在货位 {stockInfo.LocationCode} 上的出库单明细"); } // 获取库存明细 var stockInfoDetails = stockInfo.Details.ToList(); int overCount = outboundOrder.Details.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()); if (outboundOrderDetails == null || outboundOrderDetails.Count == 0) { foreach (var stockDetail in stockInfoDetails) { var matchingOrderDetails = outboundOrderDetails1 .Where(x => x.MaterielCode == stockDetail.MaterielCode) .ToList(); if (matchingOrderDetails.Count == 0) { continue; } // 计算需要分配的数量 decimal remainingStock = stockDetail.OutboundQuantity; foreach (var orderDetail in matchingOrderDetails) { if (remainingStock <= 0) break; if (orderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) continue; // 计算本次可以分配的数量 decimal availableOrderQty = orderDetail.OrderQuantity - orderDetail.OverOutQuantity; decimal allocateQty = Math.Min(remainingStock, availableOrderQty); if (allocateQty > 0) { orderDetail.OverOutQuantity += allocateQty; remainingStock -= allocateQty; // 检查是否完成 if (Math.Abs(orderDetail.OverOutQuantity - orderDetail.OrderQuantity) < 0.001m) { orderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); overCount++; } } } } // 更新订单状态 if (outboundOrder.Details.Count == overCount) { outboundOrder.OrderStatus = OutboundStatusEnum.出库完成.ObjToInt(); } _unitOfWorkManage.BeginTran(); try { // 更新出库单 _outboundService.NewOutboundOrderService.Repository.UpdateData(outboundOrder); _outboundService.NewOutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails1); AddCPRetrueOrder(stockInfo, outboundOrder, outboundOrderDetails1); // 区分单据数据来源更新货位状态 if (outboundOrder.System == null) { return WebResponseContent.Instance.Error("出库单数据源为空"); } if (!outboundOrder.System.Equals("SMOM")) { UpdateLocationStatus(locationInfo); } // 处理任务完成 CompleteTask(task); // 添加状态变更记录 AddStatusChangeRecord(task, stockInfo, locationInfo); string path = "http://fr.mankun.com:8080/webroot/decision/view/report?viewlet=fr-report\\SMOM/Product/Produce/OutBoundDetileReport.cpt&op=write&format=pdf"; string fullPath = AppDomain.CurrentDomain.BaseDirectory; var url = Path.Combine(fullPath, "wwwroot", "Reports"); string savePath = Path.Combine(url, "本次出库.pdf"); // ERP系统反馈 if (outboundOrder.System.Equals("ERP")) { // 为每个完成的明细反馈ERP foreach (var orderDetail in outboundOrderDetails1.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())) { FeedBackOutERP(outboundOrder.OrderNo, orderDetail.LinId); } // 如果有完成的明细,下载报表 if (outboundOrderDetails1.Any(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt())) { DownloadReport(path, savePath, outboundOrderDetails1.First().Id); } } //单据完成推送SMOM系统 if (outboundOrder.OrderStatus == OutboundStatusEnum.出库完成.ObjToInt() && outboundOrder.System.Equals("SMOM")) { var outStockLockInfoList = _outboundService.OutboundStockLockInfoService.Repository .QueryData(x => x.OrderNo == outboundOrder.OrderNo); if (outStockLockInfoList.Count == 0) throw new Exception($"订单 {outboundOrder.OrderNo} 托盘 {stockInfo.PalletCode} 未找到库存锁定信息"); // 采购出库 if (outboundOrder.OrderType == 1) { var passBack = new HouseoutboundPassBack { ApiType = "ShippingOrderController", Method = "AsrsOutboundSO", Parameters = new List<HouseoutboundPassBack.datas> { new HouseoutboundPassBack.datas { Value = new List<HouseoutboundPassBack.datas.data1> { new HouseoutboundPassBack.datas.data1 { No = outboundOrder.OrderNo, OutWareHouse = task.Roadway, TransactionCode = outboundOrder.TransactionCode, InoutType = outboundOrder.OrderType, OrderType = outboundOrder.InoutType, DetailList = outStockLockInfoList.Select(d => new HouseoutboundPassBack.datas.data1.Inbound { LinId = d.LinId?? "", LPN_No = d.PalletCode, MaterielCode = d.MaterielCode?? "", OrderQuantity = d.OrderQuantity, BatchNo = d.BatchNo, FinishQty = d.OrderQuantity, LocationName = d.LocationCode }) .ToList() } } } } }; //调用SMOM接口... var authResult = AuthenticateWithWMS(); if (authResult.IsSuccess) { passBack.Context = new Dictionary<string, string> { { "Ticket", authResult.Ticket }, { "InvOrgId", authResult.InvOrgId } }; var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskout, passBack, "立库出库数量回传WMS"); if (!response.Success) { throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}"); } } } // 调拨出库 if (outboundOrder.OrderType == 2) { var allocate = new InventoryAllocate { ApiType = "InventoryAllocateController", Method = "AsrsFinishedStockCount", Parameters = new List<Allocate> { new Allocate { Value = new List<Allocate.data1> { new Allocate.data1 { No = outboundOrder.OrderNo, InWarehouse = task.Roadway, TransactionCode = outboundOrder.TransactionCode, InoutType = outboundOrder.OrderType, OrderType = outboundOrder.InoutType, ActiveType = 2, DetailList = outStockLockInfoList.Select(item => { return new Allocate.data1.Inventory { LinId = item.LinId, LPNNo = item.PalletCode, MaterielCode = item.MaterielCode, OrderQuantity = item.OrderQuantity, BatchNo = item.BatchNo, FinishQty = item.OrderQuantity, LocationName = task.SourceAddress }; }).ToList() } } } } }; // 调用SMOM接口... var authResult = AuthenticateWithWMS(); if (authResult.IsSuccess) { allocate.Context = new Dictionary<string, string> { { "Ticket", authResult.Ticket }, { "InvOrgId", authResult.InvOrgId } }; var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, allocate, "立库入库数量回传WMS"); if (!response.Success) { throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}"); } } } } if (outboundOrder.OrderType == 240) // 盘点出库 { // 盘点出库特殊处理逻辑 } _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch { _unitOfWorkManage.RollbackTran(); throw; } } else { foreach (var stockDetail in stockInfoDetails) { var matchingOrderDetails = outboundOrderDetails @@ -1928,6 +2162,7 @@ throw; } } } catch (Exception ex) { return WebResponseContent.Instance.Error($"处理失败: {ex.Message}");