From 638a684258fb4bc6adf76a1964bdf0d7f99e404f Mon Sep 17 00:00:00 2001 From: wangxinhui <wangxinhui@hnkhzn.com> Date: 星期一, 31 三月 2025 02:18:54 +0800 Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn --- 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs | 348 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 347 insertions(+), 1 deletions(-) diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs" index d0811af..9954061 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs" @@ -1,21 +1,28 @@ 锘縰sing AutoMapper; +using Castle.Core.Resource; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.OrderEnum; +using WIDESEA_Common.StockEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; +using WIDESEA_Core.CodeConfigEnum; +using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.ERP; +using WIDESEA_External.ERPService; +using WIDESEA_External.Model; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_IOutboundRepository; using WIDESEA_IOutboundService; using WIDESEA_IRecordService; +using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_Model.Models; @@ -26,14 +33,22 @@ private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IBasicRepository _basicRepository; private readonly IMapper _mapper; + private readonly IStockRepository _stockRepository; + private readonly IOutboundRepository _outboundRepository; + private readonly IOutboundOrderService _outboundOrderService; + private readonly IInvokeERPService _invokeERPService; public IProOutOrderRepository Repository => BaseDal; - public ProOutOrderService(IProOutOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IBasicRepository basicRepository, IMapper mapper) : base(BaseDal) + public ProOutOrderService(IProOutOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IBasicRepository basicRepository, IMapper mapper, IStockRepository stockRepository, IOutboundRepository outboundRepository, IOutboundOrderService outboundOrderService,IInvokeERPService invokeERPService) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _basicRepository = basicRepository; _mapper = mapper; + _stockRepository = stockRepository; + _outboundRepository = outboundRepository; + _outboundOrderService = outboundOrderService; + _invokeERPService = invokeERPService; } /// <summary> /// 鎺ユ敹ERP鎴愬搧鍑哄簱鍗� @@ -70,6 +85,7 @@ return content.Error($"鍑哄簱鍗曞彿{outOrderDTO.OrderNo}宸插瓨鍦�!"); } Dt_Warehouse warehouse=null; + List<Dt_CustomerInfo> customerInfos = _basicRepository.CustomerInfoRepository.QueryData(); if (outOrderDTO.OType==1 && string.IsNullOrEmpty(outOrderDTO.WaType)) { warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==WarehouseEnum.HA71.ToString()); @@ -81,6 +97,12 @@ List<Dt_ProOutOrderDetail> proOutOrderDetails = new List<Dt_ProOutOrderDetail>(); foreach (var item in outOrderDTO.OrderDetails) { + //鍒ゆ柇瀹㈡埛鏄惁瀛樺湪 + Dt_CustomerInfo? customerInfo = customerInfos.Where(x=>x.Code== item.Customer).FirstOrDefault(); + if (customerInfo==null) + { + return content.Error($"瀹㈡埛{item.Customer}涓嶅瓨鍦�!"); + } proOutOrderDetails.Add(_mapper.Map<Dt_ProOutOrderDetail>(item)); } Dt_ProOutOrder proOutOrder= new Dt_ProOutOrder() @@ -136,5 +158,329 @@ } return content; } + /// <summary> + /// 鎴愬搧鍑哄緟鍙戣揣鍖�(骞冲簱)+鍚屾ERP鍑哄簱(缁戝畾浜嗗嚭搴撳崟搴撳瓨) + /// </summary> + /// <returns></returns> + public WebResponseContent OutProductPK(string[] OutPKCodes,string ProOutNo) + { + WebResponseContent content = new WebResponseContent(); + try + { + if (OutPKCodes.IsNullOrEmpty()) + { + return content.Error("涓嶈兘涓虹┖"); + } + Dt_ProOutOrder proOutOrder = _outboundRepository.ProOutOrderRepository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == ProOutNo).Includes(x => x.Details).First(); + if (proOutOrder == null) + { + return content.Error($"鍑哄簱鍗晎ProOutNo}涓嶅瓨鍦�"); + } + if (proOutOrder.ProOrderStatus==OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + return content.Error($"鍑哄簱鍗晎ProOutNo}宸插畬鎴�"); + } + string? userName = App.User.UserName;//GSWMS + //鑾峰彇鎵�鏈夊绠辩殑鏁版嵁 + List<Dt_ProStockInfo> AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>() + .Where(x => OutPKCodes.Contains(x.PalletCode) && x.ShipmentOrder == proOutOrder.ProOutOrderNo && x.StockStatus == StockStatusEmun.骞冲簱鍏ュ簱瀹屾垚.ObjToInt()) + .Includes(x => x.proStockInfoDetails).ToList(); + if (AllproStockInfos.Count<=0) + { + return content.Error($"鍑哄簱鍗晎ProOutNo}宸叉棤缁戝畾搴撳瓨"); + } + List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>(); + List<Dt_ProStockInfoDetail> proStockInfoDetails=new List<Dt_ProStockInfoDetail>(); + List<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData(x => x.WarehouseType == WarehouseTypEnum.鎴愬搧.ToString()); + foreach (var item in OutPKCodes) + { + //鑾峰彇搴撳瓨 + Dt_ProStockInfo? proStockInfo = AllproStockInfos.Where(x => x.PalletCode == item).FirstOrDefault(); + if (proStockInfo == null) + { + return content.Error($"鏈壘鍒皗item}搴撳瓨"); + } + Dt_Warehouse? dt_Warehouse = warehouses.Where(x=>x.WarehouseId== proStockInfo.WarehouseId).FirstOrDefault(); + if (dt_Warehouse==null) + { + return content.Error($"澶栫鍙穥item},涓嶅睘浜庢垚鍝佷粨"); + } + if (proStockInfo.ShipmentOrder!= proOutOrder.ProOutOrderNo) + { + return content.Error($"澶栫鍙穥item},涓嶅睘浜庡嚭搴撹鍗晎proOutOrder.ProOutOrderNo}"); + } + proStockInfos.Add(proStockInfo); + proStockInfoDetails.AddRange(proStockInfo.proStockInfoDetails); + } + + if (proOutOrder.Details.Sum(x=>x.LockQtyPcs-x.OverQtyPcs)< proStockInfoDetails.Sum(x=>x.StockPcsQty)) + { + return content.Error($"鍑哄簱鏁伴噺{proStockInfoDetails.Sum(x => x.StockPcsQty)}>鎵�鍓╄鍗曟暟閲弡proOutOrder.Details.Sum(x => x.LockQtyPcs - x.OverQtyPcs)}"); + } + List<StockOutItemsItem> stockOutItems = new List<StockOutItemsItem>(); + List<Dt_ProOutOrderDetail> proOutOrderDetails = proOutOrder.Details.Where(x=> proStockInfoDetails.Select(x=>x.SaleOrder).Contains(x.SaleOrder) && proStockInfoDetails.Select(x=>x.ProductCode).Contains(x.PCode) && proStockInfoDetails.Select(x => x.ProductVersion).Contains(x.PVer)).ToList(); + if (proOutOrderDetails==null || proOutOrderDetails.Count<=0) + { + return content.Error("瀵瑰簲鍑哄簱璁㈠崟鏄庣粏涓虹┖"); + } + int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); + foreach (var item in proStockInfoDetails) + { + //鑾峰彇瀵瑰簲鏄庣粏澶勭悊鍑哄簱鏁版嵁 + Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrderDetails.Where(x => x.SaleOrder == item.SaleOrder && x.PVer == item.ProductVersion && x.PCode == item.ProductCode).FirstOrDefault(); + if (proOutOrderDetail==null) + { + return content.Error("鏈壘鍒板搴斿嚭搴撹鍗曟槑缁�"); + } + proOutOrderDetail.OverQtyPcs += item.StockPcsQty; + if (proOutOrderDetail.OverQtyPcs> proOutOrderDetail.QtyPcs) + { + return content.Error($"鍑哄簱璁㈠崟鏄庣粏琛寋proOutOrderDetail.RowId},婧㈠嚭{proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs}"); + } + if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); + } + + } + + int AddOverCount = proOutOrderDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); + if (proOutOrder.Details.Count == (AddOverCount + OldOverCount)) + { + proOutOrder.ProOrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt(); + //鑾峰彇鎵�鏈夊凡鎵爜寰呭彂璐х殑搴撳瓨 + List<Dt_ProStockInfo> AllOutStocks = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>() + .Where(x => x.ShipmentOrder== ProOutNo && x.StockStatus == StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt()) + .Includes(x => x.proStockInfoDetails).ToList(); + AllOutStocks.ForEach(x => + { + proStockInfoDetails.AddRange(x.proStockInfoDetails); + }); + proStockInfos.AddRange(AllOutStocks); + foreach (var item in proStockInfoDetails) + { + StockOutItemsItem outItemsItem = new StockOutItemsItem() + { + PartNum = item.ProductCode, + Rev = item.ProductVersion, + SoNumber = item.SaleOrder, + BatchNumber = item.BagNo, + QtyPcs = item.StockPcsQty, + QtySet = item.SETQty + }; + stockOutItems.Add(outItemsItem); + } + } + _unitOfWorkManage.BeginTran(); + Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault(); + //澶勭悊搴撳瓨鏁版嵁鍜屼笂浼燛RP + if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + //鎴愬搧搴撳瓨璁板綍鍙樺姩寰呭姞鍏� + ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel() + { + Way = 1, + StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)), + ConfirmedUserNo = "admin", + AssignUserNo = "admin", + WarehouseCode = warehouse.WarehouseCode, + ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + DeliverplanCode = proOutOrder.ProOutOrderNo, + Remark = proOutOrder.Remark, + StockOutItems = stockOutItems + }; + _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.鑷姩瀹屾垚); + _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.鑷姩瀹屾垚); + string response = _invokeERPService.InvokeProOutApi(proOutOrderModel); + ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>(); + if (erpRequestContent.res != 1) + { + throw new Exception("鍚屾ERP澶辫触,閿欒淇℃伅:" + erpRequestContent.Data); + } + } + else + { + proStockInfos.ForEach(x => + { + x.StockStatus = StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt(); + }); + proStockInfoDetails.ForEach(x => + { + x.ProOutDetailStatus = StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt(); + }); + _stockRepository.ProStockInfoRepository.UpdateData(proStockInfos); + _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails); + } + _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrderDetails); + BaseDal.UpdateData(proOutOrder); + _unitOfWorkManage.CommitTran(); + content.OK(); + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + content.Error(ex.Message); + } + return content; + } + /// <summary> + /// 鎴愬搧鍑哄緟鍙戣揣鍖�(骞冲簱)+鍚屾ERP鍑哄簱(鏈粦瀹氬嚭搴撳崟搴撳瓨) + /// </summary> + /// <returns></returns> + public WebResponseContent OutProductNoPK(string[] OutPKCodes, string ProOutNo) + { + WebResponseContent content = new WebResponseContent(); + try + { + if (OutPKCodes.IsNullOrEmpty()) + { + return content.Error("涓嶈兘涓虹┖"); + } + Dt_ProOutOrder proOutOrder = _outboundRepository.ProOutOrderRepository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == ProOutNo).Includes(x => x.Details).First(); + if (proOutOrder == null) + { + return content.Error($"鍑哄簱鍗晎ProOutNo}涓嶅瓨鍦�"); + } + if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + return content.Error($"鍑哄簱鍗晎ProOutNo}宸插畬鎴�"); + } + string? userName = App.User.UserName;//GSWMS + //鑾峰彇鎵�鏈夊绠辩殑鏁版嵁 + List<Dt_ProStockInfo> AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>() + .Where(x => OutPKCodes.Contains(x.PalletCode) && x.StockStatus == StockStatusEmun.骞冲簱鍏ュ簱瀹屾垚.ObjToInt()) + .Includes(x => x.proStockInfoDetails).ToList(); + List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>(); + List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>(); + List<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData(x => x.WarehouseType == WarehouseTypEnum.鎴愬搧.ToString()); + foreach (var item in OutPKCodes) + { + //鑾峰彇搴撳瓨 + Dt_ProStockInfo? proStockInfo = AllproStockInfos.Where(x => x.PalletCode == item).FirstOrDefault(); + if (proStockInfo == null) + { + return content.Error($"鏈壘鍒皗item}搴撳瓨"); + } + if (proStockInfo.ShipmentOrder!=null) + { + return content.Error($"澶栫鍙穥item}涓哄嚭搴撳崟{proStockInfo.ShipmentOrder}鎸囧畾搴撳瓨!"); + } + Dt_Warehouse? dt_Warehouse = warehouses.Where(x => x.WarehouseId == proStockInfo.WarehouseId).FirstOrDefault(); + if (dt_Warehouse == null) + { + return content.Error($"澶栫鍙穥item},涓嶅睘浜庢垚鍝佷粨"); + } + proStockInfos.Add(proStockInfo); + proStockInfoDetails.AddRange(proStockInfo.proStockInfoDetails); + } + + if (proOutOrder.Details.Sum(x => x.QtyPcs - x.OverQtyPcs) < proStockInfoDetails.Sum(x => x.StockPcsQty)) + { + return content.Error($"鍑哄簱鏁伴噺{proStockInfoDetails.Sum(x => x.StockPcsQty)}>鎵�鍓╄鍗曟暟閲弡proOutOrder.Details.Sum(x => x.QtyPcs - x.OverQtyPcs)}"); + } + List<StockOutItemsItem> stockOutItems = new List<StockOutItemsItem>(); + List<Dt_ProOutOrderDetail> proOutOrderDetails = proOutOrder.Details.Where(x => proStockInfoDetails.Select(x => x.SaleOrder).Contains(x.SaleOrder) && proStockInfoDetails.Select(x => x.ProductCode).Contains(x.PCode) && proStockInfoDetails.Select(x => x.ProductVersion).Contains(x.PVer)).ToList(); + if (proOutOrderDetails == null || proOutOrderDetails.Count <= 0) + { + return content.Error("瀵瑰簲鍑哄簱璁㈠崟鏄庣粏涓虹┖"); + } + int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); + foreach (var item in proStockInfoDetails) + { + //鑾峰彇瀵瑰簲鏄庣粏澶勭悊鍑哄簱鏁版嵁 + Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrderDetails.Where(x => x.SaleOrder == item.SaleOrder && x.PVer == item.ProductVersion && x.PCode == item.ProductCode).FirstOrDefault(); + if (proOutOrderDetail == null) + { + return content.Error("鏈壘鍒板搴斿嚭搴撹鍗曟槑缁�"); + } + proOutOrderDetail.OverQtyPcs += item.StockPcsQty; + if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs) + { + return content.Error($"鍑哄簱璁㈠崟鏄庣粏琛寋proOutOrderDetail.RowId},婧㈠嚭{proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs}"); + } + if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); + } + + } + proStockInfos.ForEach(x => + { + x.StockStatus = StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt(); + }); + proStockInfoDetails.ForEach(x => + { + x.ProOutDetailStatus = StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt(); + }); + int AddOverCount = proOutOrderDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); + if (proOutOrder.Details.Count == (AddOverCount + OldOverCount)) + { + proOutOrder.ProOrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt(); + //鑾峰彇鎵�鏈夊凡鎵爜寰呭彂璐х殑搴撳瓨 + List<Dt_ProStockInfo> AllOutStocks = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>() + .Where(x => x.ShipmentOrder == ProOutNo && x.StockStatus == StockStatusEmun.骞冲簱寰呭彂璐�.ObjToInt()) + .Includes(x => x.proStockInfoDetails).ToList(); + AllOutStocks.ForEach(x => + { + proStockInfoDetails.AddRange(x.proStockInfoDetails); + }); + proStockInfos.AddRange(AllOutStocks); + foreach (var item in proStockInfoDetails) + { + StockOutItemsItem outItemsItem = new StockOutItemsItem() + { + PartNum = item.ProductCode, + Rev = item.ProductVersion, + SoNumber = item.SaleOrder, + BatchNumber = item.BagNo, + QtyPcs = item.StockPcsQty, + QtySet = item.SETQty + }; + stockOutItems.Add(outItemsItem); + } + } + _unitOfWorkManage.BeginTran(); + Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault(); + //澶勭悊搴撳瓨鏁版嵁鍜屼笂浼燛RP + if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + //鎴愬搧搴撳瓨璁板綍鍙樺姩寰呭姞鍏� + ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel() + { + Way = 1, + StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)), + ConfirmedUserNo = "admin", + AssignUserNo = "admin", + WarehouseCode = warehouse.WarehouseCode, + ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + DeliverplanCode = proOutOrder.ProOutOrderNo, + Remark = proOutOrder.Remark, + StockOutItems = stockOutItems + }; + _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.鑷姩瀹屾垚); + _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.鑷姩瀹屾垚); + string response = _invokeERPService.InvokeProOutApi(proOutOrderModel); + ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>(); + if (erpRequestContent.res != 1) + { + throw new Exception("鍚屾ERP澶辫触,閿欒淇℃伅:" + erpRequestContent.Data); + } + } + else + { + _stockRepository.ProStockInfoRepository.UpdateData(proStockInfos); + _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails); + } + _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrderDetails); + BaseDal.UpdateData(proOutOrder); + _unitOfWorkManage.CommitTran(); + content.OK(); + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; + } } } -- Gitblit v1.9.3