From 452132d37fd32cc7f39ed5f70328cd3de1fd4732 Mon Sep 17 00:00:00 2001 From: dengjunjie <dengjunjie@hnkhzn.com> Date: 星期四, 16 一月 2025 10:30:11 +0800 Subject: [PATCH] 优化入库完成上报ERP --- 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs | 236 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 221 insertions(+), 15 deletions(-) diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs" index a6dd362..6ec106d 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs" @@ -13,18 +13,74 @@ using WIDESEA_Common.TaskEnum; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.StockEnum; +using WIDESEA_Common.CommonEnum; +using WIDESEA_Common.LocationEnum; +using MailKit.Search; +using WIDESEA_External.Model; +using WIDESEA_Core.CodeConfigEnum; namespace WIDESEA_TaskInfoService { public partial class TaskService { - + /// <summary> + /// 閫夋嫨搴撳瓨鐢熸垚鍑哄簱浠诲姟 + /// </summary> + /// <param name="id"></param> + /// <returns></returns> + public WebResponseContent Outbound(int id) + { + WebResponseContent content = new WebResponseContent(); + try + { + Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.Id == id).Includes(x => x.Details).First(); + if (stockInfo == null) + { + return content.Error($"鏈壘鍒板簱瀛�"); + } + Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode); + if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && stockInfo.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt()) + { + List<Dt_Task> tasks = GetTasks(new List<Dt_StockInfo>() { stockInfo }, TaskTypeEnum.Outbound); + if (tasks == null || tasks.Count <= 0) + { + return content.Error($"鐢熸垚浠诲姟澶辫触"); + } + //澶勭悊搴撳瓨鏁版嵁 + stockInfo.StockStatus = (int)StockStatusEmun.鍑哄簱閿佸畾; + LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus; + locationInfo.LocationStatus = (int)LocationStatusEnum.Lock; + //鍒ゆ柇鏄惁鏈夊嚭搴撳崟淇℃伅 + _unitOfWorkManage.BeginTran(); + //鏇存柊搴撳瓨鐘舵�� + _stockRepository.StockInfoRepository.UpdateData(stockInfo); + //鏇存柊璐т綅鐘舵�� + _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId); + //鏂板缓浠诲姟 + BaseDal.AddData(tasks); + //鍔犲叆璐т綅鍙樺姩璁板綍 + _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", tasks[0].TaskNum); + _unitOfWorkManage.CommitTran(); + PushTasksToWCS(tasks); + content.OK(); + } + else + { + content.Error($"璐т綅鍑哄簱鏉′欢涓嶆弧瓒�"); + } + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; + } /// <summary> /// 搴撳瓨鏁版嵁杞嚭搴撲换鍔� /// </summary> /// <param name="stockInfos"></param> /// <returns></returns> - public List<Dt_Task> GetTasks(List<Dt_StockInfo> stockInfos) + public List<Dt_Task> GetTasks(List<Dt_StockInfo> stockInfos, TaskTypeEnum taskType) { List<Dt_Task> tasks = new List<Dt_Task>(); for (int i = 0; i < stockInfos.Count; i++) @@ -46,7 +102,7 @@ SourceAddress = stockInfo.LocationCode, TargetAddress = "", TaskStatus = TaskStatusEnum.New.ObjToInt(), - TaskType = TaskTypeEnum.Outbound.ObjToInt(), + TaskType = taskType.ObjToInt(), TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), PalletType = stockInfo.PalletType, WarehouseId = stockInfo.WarehouseId, @@ -88,7 +144,7 @@ (List<Dt_StockInfo>, Dt_OutboundOrderDetail, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutboundOrderDetailService.AssignStockOutbound(outboundOrderDetail, stockSelectViews); if (result.Item1 != null && result.Item1.Count > 0) { - tasks = GetTasks(result.Item1); + tasks = GetTasks(result.Item1, TaskTypeEnum.Outbound); result.Item2.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); result.Item3.ForEach(x => { @@ -111,7 +167,7 @@ if (stockLockInfos != null && stockLockInfos.Count > 0) { List<Dt_StockInfo> stocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockLockInfos.Select(x => x.PalletCode).Distinct().ToList()); - tasks = GetTasks(stocks); + tasks = GetTasks(stocks, TaskTypeEnum.Outbound); } } @@ -134,7 +190,10 @@ { throw new Exception("鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅"); } - + if (outboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus > OrderDetailStatusEnum.New.ObjToInt() && x.OrderDetailStatus != OrderDetailStatusEnum.AssignOverPartial.ObjToInt()) != null) + { + throw new Exception("鎵�閫夊嚭搴撳崟鏄庣粏瀛樺湪鍑哄簱涓垨宸插畬鎴�"); + } List<Dt_StockInfo>? stockInfos = null; List<Dt_OutboundOrderDetail>? orderDetails = null; List<Dt_OutStockLockInfo>? outStockLockInfos = null; @@ -144,7 +203,7 @@ (List<Dt_StockInfo>, List<Dt_OutboundOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutboundOrderDetailService.AssignStockOutbound(outboundOrderDetails); if (result.Item1 != null && result.Item1.Count > 0) { - tasks = GetTasks(result.Item1); + tasks = GetTasks(result.Item1, TaskTypeEnum.Outbound); result.Item2.ForEach(x => { x.OrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); @@ -200,6 +259,157 @@ } /// <summary> + /// 骞冲簱鐩存帴鍑哄簱 + /// </summary> + /// <param name="orderDetailId"></param> + /// <param name="stockSelectViews"></param> + /// <returns></returns> + public WebResponseContent GeneratePKOutboundTask(int orderDetailId, List<StockSelectViewDTO> stockSelectViews) + { + try + { + #region MyRegion + Dt_OutboundOrderDetail OrderDetail = _outboundService.OutboundOrderDetailService.Repository.QueryFirst(x => x.Id == orderDetailId); + + if (OrderDetail == null) + { + throw new Exception("鏈壘鍒板嚭搴撳崟鏄庣粏淇℃伅"); + } + if (OrderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) + throw new Exception("鍑哄簱鍗曞凡瀹屾垚"); + Dt_OutboundOrder outboundOrder = BaseDal.Db.Queryable<Dt_OutboundOrder>().Where(x => x.Id == OrderDetail.OrderId).Includes(x => x.Details).First(); + if (outboundOrder == null) + { + return WebResponseContent.Instance.Error($"鏈壘鍒板嚭搴撳崟淇℃伅"); + } + Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseId == outboundOrder.WarehouseId); + List<Dt_StockInfo> outStocks = _stockService.StockInfoService.Repository.GetStockInfosByPalletCodes(stockSelectViews.Select(x => x.PalletCode).ToList()); + if (outStocks.Count < 1) return WebResponseContent.Instance.Error($"搴撳瓨涓嶈冻"); + List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>(); + List<Dt_StockInfo> upStocks = new List<Dt_StockInfo>(); + List<Dt_StockInfo> deStocks = new List<Dt_StockInfo>(); + List<Dt_StockInfoDetail> upstockDetails = new List<Dt_StockInfoDetail>(); + List<Dt_StockInfoDetail> destockDetails = new List<Dt_StockInfoDetail>(); + outStocks.ForEach(x => + { + x.Details.Where(x => x.MaterielCode == OrderDetail.MaterielCode).ToList().ForEach(v => + { + float OriginalQuantity = v.StockQuantity; + float assignQuantity = 0;//鍒嗛厤鏁伴噺 + float assignAmount = OrderDetail.OrderQuantity - OrderDetail.OverOutQuantity;//寰呭嚭鏁伴噺 + if (assignAmount > 0) + { + if (v.StockQuantity >= assignAmount) + { + assignQuantity = assignAmount; + v.StockQuantity -= assignAmount; + OrderDetail.OverOutQuantity += assignAmount; + OrderDetail.LockQuantity += assignAmount; + upstockDetails.Add(v); + } + else + { + assignQuantity = v.StockQuantity; + OrderDetail.OverOutQuantity += v.StockQuantity; + OrderDetail.LockQuantity += v.StockQuantity; + v.StockQuantity = 0; + destockDetails.Add(v); + } + Dt_OutStockLockInfo outStockLockInfo = new Dt_OutStockLockInfo() + { + PalletCode = x.PalletCode, + AssignQuantity = assignQuantity, + MaterielCode = OrderDetail.MaterielCode, + BatchNo = v.BatchNo, + LocationCode = x.LocationCode, + MaterielName = v.MaterielName, + OrderDetailId = OrderDetail.Id, + OrderNo = outboundOrder.OrderNo, + OrderType = outboundOrder.OrderType, + OriginalQuantity = OriginalQuantity, + Status = OutLockStockStatusEnum.鍑哄簱瀹屾垚.ObjToInt(), + StockId = x.Id, + TaskNum = 0, + OrderQuantity = OrderDetail.OrderQuantity, + Unit = OrderDetail.Unit + }; + outStockLockInfos.Add(outStockLockInfo); + } + }); + int overCount = x.Details.Where(x => x.StockQuantity == 0).Count(); + if (overCount == x.Details.Count) deStocks.Add(x); + else upStocks.Add(x); + }); + outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱涓�.ObjToInt(); + OrderDetail.OrderDetailStatus = OrderDetail.OrderQuantity > OrderDetail.OverOutQuantity ? OrderDetailStatusEnum.AssignOverPartial.ObjToInt() : OrderDetailStatusEnum.Over.ObjToInt(); + if (OrderDetail.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) + { + int overCount = outboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); + if (outboundOrder.Details.Count - 1 == overCount) + outboundOrder.OrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt(); + } + _unitOfWorkManage.BeginTran(); + _outboundService.OutboundStockLockInfoService.AddData(outStockLockInfos); + _outboundService.OutboundOrderService.UpdateData(outboundOrder); + _outboundService.OutboundOrderDetailService.UpdateData(OrderDetail); + _stockRepository.StockInfoRepository.UpdateData(upStocks); + _stockRepository.StockInfoRepository.DeleteData(deStocks); + _stockRepository.StockInfoDetailRepository.UpdateData(upstockDetails); + _stockRepository.StockInfoDetailRepository.DeleteData(destockDetails); + _unitOfWorkManage.CommitTran(); + #endregion + + #region 涓婃姤ERP + if (outboundOrder.OrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + //List<ERPPickModel> eRPPickModels = new List<ERPPickModel>(); + //outStockLockInfos.ForEach(x => + //{ + // ERPPickItemModel pickItemModel = new ERPPickItemModel() + // { + // Lotno = x.BatchNo, + // Qty = x.AssignQuantity.ToString(), + // Location = warehouse.WarehouseCode + // }; + // ERPPickModel pickModel = new ERPPickModel() + // { + // Rowindex = OrderDetail.RowNo, + // Material = OrderDetail.MaterielCode, + // Qty = pickItemModel.Qty, + // Dataitem = new List<ERPPickItemModel> { pickItemModel } + // }; + // eRPPickModels.Add(pickModel); + //}); + //ERPIssueItemModel issueItemModel = new ERPIssueItemModel() + //{ + // Pickcode = outboundOrder.UpperOrderNo, + // PickList = eRPPickModels + //}; + //ERPIssueModel issueModel = new ERPIssueModel() + //{ + // UniqueTag = outboundOrder.Id.ToString(), + // Code = _outboundService.OutboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.FLCodeRule)), + // WarehouseCode = warehouse.WarehouseCode, + // Docremark = "", + // Deptno = outboundOrder.DepartmentCode, + // Deptname = outboundOrder.DepartmentName, + // Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + // Createuser = App.User.UserName, + // Issitem = new List<ERPIssueItemModel>() { issueItemModel } + //}; + _invokeERPService.InvokeOutStandardsApi(_outboundService.OutboundOrderService.GetERPIssueModel(outboundOrder, warehouse.WarehouseCode)); + } + #endregion + + return WebResponseContent.Instance.OK(); + } + catch (Exception ex) + { + return WebResponseContent.Instance.Error(ex.Message); + } + } + + /// <summary> /// 鐢熸垚鍑哄簱浠诲姟鍚庢暟鎹洿鏂板埌鏁版嵁搴� /// </summary> /// <param name="tasks"></param> @@ -219,15 +429,11 @@ { WebResponseContent content = _outboundService.OutboundOrderDetailService.LockOutboundStockDataUpdate(stockInfos, outboundOrderDetails, outStockLockInfos, locationInfos, tasks: tasks); - if (content.Status) - { - _unitOfWorkManage.CommitTran(); - } - else + if (!content.Status) { _unitOfWorkManage.RollbackTran(); + return content; } - return content; } else if (outboundOrderDetails != null && outboundOrderDetails.Count > 0) { @@ -255,7 +461,7 @@ /// </summary> /// <param name="keys">鍑哄簱鍗曟槑缁嗕富閿�</param> /// <returns></returns> - public WebResponseContent GenerateOutboundTask(int[] keys) + public WebResponseContent GenerateOutboundTasks(int[] keys) { try { @@ -309,7 +515,7 @@ { List<int> keys = _outboundService.OutboundOrderDetailService.Repository.QueryData(x => x.Id, x => x.OrderId == outboundId); - return GenerateOutboundTask(keys.ToArray()); + return GenerateOutboundTasks(keys.ToArray()); } catch (Exception ex) { -- Gitblit v1.9.3