From 25cb7cd50d12f48e93d6cde47420ca3458e9c47a Mon Sep 17 00:00:00 2001 From: helongyang <647556386@qq.com> Date: 星期四, 12 六月 2025 21:39:43 +0800 Subject: [PATCH] 1 --- 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderService.cs | 1026 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,016 insertions(+), 10 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..c700679 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,30 @@ 锘縰sing AutoMapper; +using Castle.Core.Resource; using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading; 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_DTO.Outbound; +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,34 +35,42 @@ 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鎴愬搧鍑哄簱鍗� + /// 鎺ユ敹ERP鎴愬搧鍑哄簱鍗曚俊鎭�(璁㈠崟鍑哄簱/瀵勫敭鍑哄簱) /// </summary> /// <returns></returns> - public WebResponseContent ProductDeliveryOrder(ErpProOutOrderDTO outOrderDTO) + public async Task<WebResponseContent> ProductDeliveryOrder(ErpProOutOrderDTO outOrderDTO) { try { return outOrderDTO.Way switch { - 1 => AddDeliveryOrder(outOrderDTO), - 2 => UpdateDeliveryOrder(outOrderDTO), - 3 => DeleteDeliveryOrder(outOrderDTO), - _ => WebResponseContent.Instance.Error($"鎿嶄綔绫诲瀷涓嶅瓨鍦�,Way:{outOrderDTO.Way}"), + 1 => await Task.FromResult(AddDeliveryOrder(outOrderDTO)), + 2 => await Task.FromResult(UpdateDeliveryOrder(outOrderDTO)), + 3 => await Task.FromResult(DeleteDeliveryOrder(outOrderDTO)), + _ => await Task.FromResult(WebResponseContent.Instance.Error($"鎿嶄綔绫诲瀷涓嶅瓨鍦�,Way:{outOrderDTO.Way}")), }; } catch (Exception ex) { - return WebResponseContent.Instance.Error(ex.Message); + return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message)); } } /// <summary> @@ -70,6 +87,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()); @@ -79,9 +97,41 @@ warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString()); } List<Dt_ProOutOrderDetail> proOutOrderDetails = new List<Dt_ProOutOrderDetail>(); + Dictionary<string,string> keyValuePairs =new Dictionary<string, string>(); foreach (var item in outOrderDTO.OrderDetails) { - proOutOrderDetails.Add(_mapper.Map<Dt_ProOutOrderDetail>(item)); + //鍒ゆ柇瀹㈡埛鏄惁瀛樺湪 + Dt_CustomerInfo? customerInfo = customerInfos.Where(x=>x.Code== item.Customer).FirstOrDefault(); + if (customerInfo==null) + { + return content.Error($"瀹㈡埛{item.Customer}涓嶅瓨鍦�!"); + } + Dt_ProOutOrderDetail proOutOrderDetail = _mapper.Map<Dt_ProOutOrderDetail>(item); + if (!string.IsNullOrEmpty(item.SaleOrder)) + { + if (keyValuePairs!=null && keyValuePairs.ContainsKey(item.SaleOrder)) + { + proOutOrderDetail.EndCustomer = keyValuePairs[item.SaleOrder]; + } + else + { + string request = _invokeERPService.InvokeProSaleCustomer(item.SaleOrder); + ErpSaleCustomResponseContent responseContent=request.DeserializeObject<ErpSaleCustomResponseContent>(); + if (responseContent.Code!=200) + { + return content.Error($"璁㈠崟{item.SaleOrder}缁堢瀹㈡埛鑾峰彇澶辫触!"); + } + //鍒ゆ柇缁堢瀹㈡埛鏄惁瀛樺湪 + Dt_CustomerInfo? customerInfoEnd = customerInfos.Where(x => x.Code == responseContent.Data[0].Endcustomer).FirstOrDefault(); + if (customerInfoEnd == null) + { + return content.Error($"缁堢瀹㈡埛{responseContent.Data[0].Endcustomer}涓嶅瓨鍦�!"); + } + proOutOrderDetail.EndCustomer = responseContent.Data[0].Endcustomer; + keyValuePairs.Add(item.SaleOrder, responseContent.Data[0].Endcustomer); + } + } + proOutOrderDetails.Add(proOutOrderDetail); } Dt_ProOutOrder proOutOrder= new Dt_ProOutOrder() { @@ -111,7 +161,7 @@ WebResponseContent content = new WebResponseContent(); try { - + } catch (Exception ex) { @@ -128,6 +178,317 @@ WebResponseContent content = new WebResponseContent(); try { + Dt_ProOutOrder proOutOrder = _outboundRepository.ProOutOrderRepository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == outOrderDTO.OrderNo).Includes(x => x.Details).First(); + if (proOutOrder==null) + { + return content.Error($"鏈壘鍒板嚭搴撳崟{outOrderDTO.OrderNo}"); + } + if (proOutOrder.ProOrderStatus==OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt() || proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱涓�.ObjToInt()) + { + return content.Error("鍑哄簱鍗曟墽琛屼腑"); + } + _unitOfWorkManage.BeginTran(); + _outboundRepository.ProOutOrderRepository.DeleteData(proOutOrder); + _outboundRepository.ProOutOrderDetailRepository.DeleteData(proOutOrder.Details); + _unitOfWorkManage.CommitTran(); + content.OK("鎴愬姛"); + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + content.Error(ex.Message); + } + return content; + } + /// <summary> + /// 閿�鍞寚娲� + /// </summary> + /// <returns></returns> + public async Task<WebResponseContent> ProductSpecifyVer(ErpProductSpecifyVerDTO erpProductSpecifyVerDTO) + { + WebResponseContent content = new WebResponseContent(); + try + { + Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==erpProductSpecifyVerDTO.WaType); + if (warehouse == null) + return await Task.FromResult(content.Error($"鏈壘鍒皗erpProductSpecifyVerDTO.WaType}浠撳簱淇℃伅")); + //鏌ヨ鍙寚娲惧簱瀛� + List<Dt_ProStockInfo> proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => x.ProStockAttribute == ProStockAttributeEnum.鎴愬搧.ObjToInt()) + .Includes(x => x.proStockInfoDetails) + .Where(x => x.proStockInfoDetails + .Any(v => + v.SaleOrder == erpProductSpecifyVerDTO.OrderNo + && v.ProductCode == erpProductSpecifyVerDTO.PCode + && v.ProductVersion == erpProductSpecifyVerDTO.PVer + && v.LotNumber == erpProductSpecifyVerDTO.PLot + && v.DateCode == erpProductSpecifyVerDTO.DateCode + && (v.SpecifyVer==null||v.SpecifyVer=="") + )) + .ToList(); + List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>(); + List<Dt_ProStockInfoDetail> specifyVerDetails = new List<Dt_ProStockInfoDetail>(); + if (proStockInfos==null) + return await Task.FromResult(content.Error("鍙寚娲惧簱瀛樹笉瀛樺湪")); + proStockInfos = proStockInfos.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.DateCode).ThenBy(x => x.CreateDate).ThenBy(x => x.proStockInfoDetails.Sum(x => x.StockPcsQty)).ToList(); + foreach (var item in proStockInfos) + { + proStockInfoDetails.AddRange(item.proStockInfoDetails); + } + if (proStockInfoDetails.Sum(x=>x.StockPcsQty)< erpProductSpecifyVerDTO.QtyPcs) + return await Task.FromResult(content.Error($"鍙寚娲惧簱瀛樻暟閲忎笉瓒�,鍙敤:{proStockInfoDetails.Sum(x => x.StockPcsQty)}")); + float overQty = 0; + foreach (var item in proStockInfoDetails) + { + specifyVerDetails.Add(item); + overQty += item.StockPcsQty; + //宸叉弧瓒宠幏鍙栨暟閲忎笉鍐嶆洿鏀� + if (overQty>= erpProductSpecifyVerDTO.QtyPcs) + { + break; + } + } + specifyVerDetails.ForEach(x => + { + x.SpecifyVer = erpProductSpecifyVerDTO.Ver; + }); + _unitOfWorkManage.BeginTran(); + _stockRepository.ProStockInfoDetailRepository.UpdateData(specifyVerDetails); + _unitOfWorkManage.CommitTran(); + content.OK("鎸囨淳鎴愬姛"); + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + content.Error(ex.Message); + } + return await Task.FromResult(content); + } + /// <summary> + /// 鎴愬搧鍑哄緟鍙戣揣鍖�(骞冲簱)+鍚屾ERP鍑哄簱(缁戝畾浜嗗嚭搴撳崟搴撳瓨) + /// </summary> + /// <returns></returns> + public WebResponseContent OutProductPK(SaveModel saveModel, string ProOutNo) + { + WebResponseContent content = new WebResponseContent(); + try + { + List<string> OutPKCodes = saveModel.DelKeys.Select(x => x.ToString()).ToList(); + 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.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(); + List<Dt_ProOutOrderDetail> newProDetails=new List<Dt_ProOutOrderDetail>(); + foreach (var item in proStockInfoDetails) + { + //鑾峰彇瀵瑰簲鏄庣粏澶勭悊鍑哄簱鏁版嵁 + Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrderDetails.Where(x => x.Id==item.OutDetailId && x.PVer == item.ProductVersion && x.PCode == item.ProductCode).FirstOrDefault(); + if (proOutOrderDetail==null) + { + return content.Error("鏈壘鍒板搴斿嚭搴撹鍗曟槑缁�"); + } + proOutOrderDetail.OverQtyPcs += item.StockPcsQty; + item.OutboundQuantity = item.StockPcsQty; + item.OutSETQty = item.SETQty; + if (proOutOrderDetail.OverQtyPcs> proOutOrderDetail.QtyPcs) + { + return content.Error($"鍑哄簱璁㈠崟鏄庣粏琛寋proOutOrderDetail.RowId},婧㈠嚭{proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs}"); + } + if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); + newProDetails.Add(proOutOrderDetail); + } + + } + + int AddOverCount = newProDetails.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.OutDetailSaleNo, + BatchNumber = item.BagNo, + QtyPcs = item.OutboundQuantity, + QtySet = item.OutSETQty + }; + 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 = App.User.UserName, + AssignUserNo = App.User.UserName, + 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.鑷姩瀹屾垚); + //WebResponseContent contentSaveInfos = SaveOutProPKInfos(proStockInfos); + //if (!contentSaveInfos.Status) + //{ + // throw new Exception(contentSaveInfos.Message); + //}; + 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> + /// 鑾峰彇鍑哄簱鎵�鏈夌殑澶栧唴鍖呮槑缁� + /// </summary> + /// <param name="proStockInfos"></param> + /// <returns></returns> + public WebResponseContent SaveOutProPKInfos(List<Dt_ProStockInfo> proStockInfos) + { + WebResponseContent content = new WebResponseContent(); + try + { + List<Dt_OutProPKStockInfo> outProPKStockInfos = new List<Dt_OutProPKStockInfo>(); + foreach (var fromItem in proStockInfos) + { + foreach (var lordItem in fromItem.proStockInfoDetails) + { + Dt_OutProPKStockInfo outProPKStockInfo = new Dt_OutProPKStockInfo() + { + PCode = lordItem.ProductCode, + PVer=lordItem.ProductVersion, + PLot=lordItem.ProductVersion, + DateCode=lordItem.DateCode, + StockId=fromItem.Id, + OriginalQuantity=lordItem.StockPcsQty, + AssignQuantity=lordItem.StockPcsQty, + PalletCode=fromItem.PalletCode, + Unit="PCS" + }; + outProPKStockInfos.Add(outProPKStockInfo); + } + } + Db.InsertNav(outProPKStockInfos).Include(x=>x).ExecuteCommand(); + content.OK(); + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; + } + //鏍规嵁鍐呭寘鍑哄簱 + public WebResponseContent BagProductPK(SaveModel saveModel) + { + WebResponseContent content = new WebResponseContent(); + try + { + var outOrder = saveModel.MainData["proOutNo"].ToString(); + var outBags = saveModel.DelKeys.Select(x => x.ToString()).ToList(); + if (outBags.Count<=0) + { + return content.Error("鍐呭寘淇℃伅鑾峰彇澶辫触"); + } } catch (Exception ex) @@ -136,5 +497,650 @@ } 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; + // item.OutboundQuantity = item.StockPcsQty; + // item.OutSETQty = item.SETQty; + // 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.OutboundQuantity, + // QtySet = item.OutSETQty + // }; + // stockOutItems.Add(outItemsItem); + // } + // } + // Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault(); + // _unitOfWorkManage.BeginTran(); + // //澶勭悊搴撳瓨鏁版嵁鍜屼笂浼燛RP + // if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + // { + // //鎴愬搧搴撳瓨璁板綍鍙樺姩寰呭姞鍏� + // ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel() + // { + // Way = 1, + // StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)), + // ConfirmedUserNo = App.User.UserName, + // AssignUserNo = App.User.UserName, + // 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; + //} + /// <summary> + /// PDA鑾峰彇鍑哄簱鍗曟嵁 + /// </summary> + /// <param name="saveModel"></param> + /// <returns></returns> + public WebResponseContent GetProOutOrders(SaveModel saveModel) + { + WebResponseContent content = new WebResponseContent(); + try + { + int pageNo = saveModel.MainData["pageNo"].ObjToInt(); + int warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); + string orderNo = saveModel.MainData["orderNo"].ToString(); + List<Dt_ProOutOrder> proOutOrders = new List<Dt_ProOutOrder>(); + if (string.IsNullOrEmpty(orderNo)) + { + proOutOrders = Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOrderStatus <= OutOrderStatusEnum.鍑哄簱涓�.ObjToInt() && x.WarehouseId == warehouseId).Includes(x=>x.Details).OrderByDescending(x => x.Id).ToPageList(pageNo, 5); + } + else + { + proOutOrders = Db.Queryable<Dt_ProOutOrder>().Where(x => (x.ProOutOrderNo.Contains(orderNo) || x.ProOutOrderNo.Contains(orderNo)) && x.ProOrderStatus <= OutOrderStatusEnum.鍑哄簱涓�.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.Id).Includes(x => x.Details).ToPageList(pageNo, 5); + } + + content.OK(data: proOutOrders); + } + catch (Exception) + { + + throw; + } + return content; + } + /// <summary> + /// 鑾峰彇鎵爜鑾峰彇璁㈠崟鏄庣粏淇℃伅 + /// </summary> + public WebResponseContent GetOrderDetails(int keyId) + { + WebResponseContent content=new WebResponseContent(); + try + { + //鑾峰彇鍑哄簱鍗曞彿 + Dt_ProOutOrder proOutOrder = BaseDal.QueryFirst(x => x.Id == keyId); + if (proOutOrder == null) + { + return content.Error($"鏈壘鍒板嚭搴撳崟{proOutOrder.ProOutOrderNo}"); + } + //鑾峰彇鏄庣粏 + List<Dt_ProOutOrderDetail> proOutOrderDetails = _outboundRepository.ProOutOrderDetailRepository.QueryData(x => x.ProOrderId == keyId).OrderBy(x => x.ProOrderDetailStatus).ThenBy(x => x.Id).ToList(); + content.OK("鎴愬姛", new { proOutOrderDetails }); + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; + } + /// <summary> + /// 鏌ヨERP璁㈠崟鎵i櫎搴撳瓨鏁伴噺 + /// </summary> + public async Task<WebResponseContent> OutProErpSync(string outProOrderNo) + { + WebResponseContent content = new WebResponseContent(); + try + { + //鏍规嵁鍑哄簱鍗曞彿鑾峰彇璇ュ嚭搴撹鍗曠殑ERP鍑哄簱搴撳瓨淇℃伅 + Dt_ProOutOrder proOutOrder = BaseDal.Db.Queryable<Dt_ProOutOrder>().Where(x=>x.ProOutOrderNo== outProOrderNo).Includes(x => x.Details).First(); + if (proOutOrder==null) + { + return await Task.FromResult(content.Error($"鏈壘鍒版垚鍝佸嚭搴撹鍗晎outProOrderNo}")); + } + if (proOutOrder.ProOrderStatus>=OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + return await Task.FromResult(content.Error($"鍑哄簱璁㈠崟宸插畬鎴愭垨鍏抽棴")); + } + //璋冪敤erp鍑哄簱璁㈠崟搴撳瓨鏌ヨ鎺ュ彛 + string response = _invokeERPService.InvokeOutProErpSync(outProOrderNo); + ErpOutProSyncResponseContent erpOutProSyncResponse= response.DeserializeObject<ErpOutProSyncResponseContent>(); + if (erpOutProSyncResponse.Code!=200) + { + return await Task.FromResult(content.Error($"ERP鍑哄簱璁㈠崟鏌ヨ鎺ュ彛璋冪敤澶辫触,閿欒淇℃伅:{erpOutProSyncResponse.Msg}")); + } + List<OutProStock> outProStocks = erpOutProSyncResponse.Data; + if (outProStocks.Count<=0 || outProStocks==null) + { + return await Task.FromResult(content.Error($"鎴愬搧鍑哄簱璁㈠崟{outProOrderNo}ERP褰撳墠鏈湁鍑哄簱搴撳瓨淇℃伅")); + } + //鑾峰彇骞冲簱搴撳尯 + Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString()); + if (warehouse==null) + { + return await Task.FromResult(content.Error("鏈壘鍒板簱鍖轰俊鎭�")); + } + //鑾峰彇鎵�鏈夊钩搴撳簱瀛� + List<Dt_ProStockInfo> proStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.WarehouseId == warehouse.WarehouseId).Includes(x => x.proStockInfoDetails).ToList(); + List<Dt_ProStockInfoDetail> proStockInfoDetails= new List<Dt_ProStockInfoDetail>(); + foreach (var item in proStockInfos) + { + proStockInfoDetails.AddRange(item.proStockInfoDetails); + } + proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ToList() ; + List<Dt_ProStockInfo> delProStockInfos = new List<Dt_ProStockInfo>(); + List<Dt_ProStockInfoDetail> delStockInfoDetails = new List<Dt_ProStockInfoDetail>(); + foreach (var item in outProStocks) + { + //鏌ヨ搴撳瓨璁板綍 + if (item.ShippingNumber != outProOrderNo) + { + return await Task.FromResult(content.Error($"ERP杩斿洖浜嗗嚭搴撹鍗晎item.ShippingNumber}搴撳瓨淇℃伅")); + } + //鑾峰彇搴撳瓨 + List<Dt_ProStockInfoDetail> outStocks = proStockInfoDetails.Where(x=>x.ProductCode==item.Partnum).ToList(); + if (outStocks.Count==0 || outStocks==null) + { + return await Task.FromResult(content.Error($"{item.Partnum}浜у搧鍨嬪彿搴撳瓨涓嶅瓨鍦�")); + } + foreach (var itemOut in outStocks) + { + if (item.Quantity==0) + { + break; + } + if (item.Quantity >= itemOut.StockPcsQty) + { + Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.SaleOrder == item.SoNumber && x.PCode == item.Partnum); + if (proOutOrderDetail == null) + { + return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒伴攢鍞鍗晎item.SoNumber}鏄庣粏,璇锋鏌�")); + } + //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲� + proOutOrderDetail.OverQtyPcs += itemOut.StockPcsQty; + item.Quantity -= (int)itemOut.StockPcsQty; + delStockInfoDetails.Add(itemOut); + proStockInfoDetails.Remove(itemOut); + if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs) + { + return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}閿�鍞鍗晎item.SoNumber}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}")); + } + if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); + } + if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); + } + } + else if (item.Quantity < itemOut.StockPcsQty) + { + Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.SaleOrder == item.SoNumber && x.PCode == item.Partnum); + if (proOutOrderDetail == null) + { + return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒伴攢鍞鍗晎item.SoNumber}鏄庣粏,璇锋鏌�")); + } + //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲� + proOutOrderDetail.OverQtyPcs += item.Quantity; + item.Quantity -= item.Quantity; + float Range = itemOut.StockPcsQty / itemOut.SETQty; + itemOut.SETQty = item.Quantity / Range; + itemOut.StockPcsQty -= item.Quantity; + if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs) + { + return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}閿�鍞鍗晎item.SoNumber}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}")); + } + if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); + } + if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); + } + } + } + } + if (proOutOrder.Details.Count == proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count()) + { + proOutOrder.ProOrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt(); + } + else + { + Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.ProOrderDetailStatus <= OrderDetailStatusEnum.Over.ObjToInt()); + return await Task.FromResult(content.Error($"{proOutOrderDetail?.SaleOrder}閿�鍞鍗曟暟閲忛渶鍑簕proOutOrderDetail?.QtyPcs},鍙嚭{proOutOrderDetail?.OverQtyPcs}")); + } + //鏇存柊鏁版嵁 + _unitOfWorkManage.BeginTran(); + if (delStockInfoDetails.Count > 0) + { + _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.鑷姩鍒犻櫎); + } + await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(proStockInfoDetails); + await BaseDal.UpdateDataAsync(proOutOrder); + await _outboundRepository.ProOutOrderDetailRepository.UpdateDataAsync(proOutOrder.Details); + _unitOfWorkManage.CommitTran(); + return await Task.FromResult(content.OK()); + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + return await Task.FromResult(content.Error(ex.Message)); + } + } + /// <summary> + /// 鍑哄簱鍗曟壂鐮佸悓姝RP + /// </summary> + /// <returns></returns> + public async Task<WebResponseContent> OutProScanCodeSync(SaveModel saveModel) + { + WebResponseContent content = new WebResponseContent(); + try + { + string? ProOutNo = saveModel.MainData["outProOrderNo"].ToString(); + var Codes = saveModel.DelKeys.Select(x=>x.ToString().Trim()).ToList(); + if (Codes.Count<=0) + { + return await Task.FromResult(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 await Task.FromResult(content.Error($"鍑哄簱鍗晎ProOutNo}涓嶅瓨鍦�")); + } + if (proOutOrder.ProOrderStatus >= OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + return await Task.FromResult(content.Error($"鍑哄簱鍗晎ProOutNo}宸插畬鎴愭垨鍏抽棴")); + } + string? userName = App.User.UserName;//GSWMS + List<OutProInfoDTO> outProInfos= new List<OutProInfoDTO>(); + foreach (var item in Codes) + { + string[] proInfoInputs = item.Split(','); + if (proInfoInputs.Length!=5) + { + return await Task.FromResult(content.Error($"澶栧寘{item}鎵弿涓嶅叏")); + } + OutProInfoDTO outProInfo=new OutProInfoDTO() + { + ProductCode= proInfoInputs[1], + OutQtys = proInfoInputs[4].ObjToInt() + }; + outProInfos.Add(outProInfo); + } + //鑾峰彇骞冲簱搴撳尯 + Dt_Warehouse warehouse = await _basicRepository.WarehouseRepository.QueryFirstAsync(x => x.WarehouseCode == WarehouseEnum.HA101.ToString()); + if (warehouse == null) + { + return await Task.FromResult(content.Error("鏈壘鍒板簱鍖轰俊鎭�")); + } + //鑾峰彇鎵�鏈夊钩搴撶殑鏁版嵁 + List<Dt_ProStockInfo> AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>() + .Where(x => x.WarehouseId == warehouse.WarehouseId) + .Includes(x => x.proStockInfoDetails).ToList(); + List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>(); + List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>(); + foreach (var item in AllproStockInfos) + { + proStockInfoDetails.AddRange(item.proStockInfoDetails); + } + proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ThenBy(x=>x.StockPcsQty).ToList(); + List<Dt_Warehouse> warehouses = await _basicRepository.WarehouseRepository.QueryDataAsync(x => x.WarehouseType == WarehouseTypEnum.鎴愬搧.ToString()); + //灏嗗叾鍒嗙粍 + outProInfos = outProInfos.GroupBy(x => x.ProductCode).Select(x=>new OutProInfoDTO() + { + ProductCode=x.Key, + OutQtys=x.Sum(x=>x.OutQtys) + }).ToList(); + List<Dt_ProStockInfoDetail> UpStockInfoDetails = new List<Dt_ProStockInfoDetail>(); + foreach (var item in outProInfos) + { + //鑾峰彇搴撳瓨 + List<Dt_ProStockInfoDetail> outStocks = proStockInfoDetails.Where(x => x.ProductCode == item.ProductCode && x.OutProNo == null).ToList(); + if (outStocks.Count <= 0 || outProInfos==null) + { + return await Task.FromResult(content.Error($"鏈壘鍒颁骇鍝亄item.ProductCode}搴撳瓨")); + } + foreach (var outStock in outStocks) + { + //濡傛灉鎵e噺涓�0璺冲嚭閫昏緫 + if (item.OutQtys == 0) + { + break; + } + //鍒ゆ柇鍑哄簱鏁伴噺鏄惁澶т簬鎴栫瓑浜庡簱瀛樻暟閲� + if (item.OutQtys >= outStock.StockPcsQty) + { + Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt()); + //鍒ゆ柇鏄惁瀛樺湪鍚屼竴鍨嬪彿涓ゆ潯鏄庣粏 + if (proOutOrderDetail == null) + { + return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒颁骇鍝亄item.ProductCode}鏄庣粏,璇锋鏌�")); + } + List<Dt_ProOutOrderDetail>? outOrderDetails = proOutOrder.Details.Where(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt() && x.Id != proOutOrderDetail.Id).ToList(); + float BeyondQtys = proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs; + //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲� + proOutOrderDetail.OverQtyPcs += outStock.StockPcsQty; + + //鏄惁瓒呭嚭 + if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs) + { + if (outOrderDetails.Count>=1) + { + proOutOrderDetail.OverQtyPcs -= outStock.StockPcsQty; + proOutOrderDetail.OverQtyPcs += BeyondQtys; + outStock.OutboundQuantity = BeyondQtys; + outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder; + outStock.OutProNo = proOutOrder.ProOutOrderNo; + float Range = outStock.StockPcsQty / outStock.SETQty; + if (outStock.OutboundQuantity== outStock.StockPcsQty) + { + outStock.OutSETQty = outStock.SETQty; + outStock.AssignDel = 1; + } + else + { + outStock.OutSETQty = outStock.OutboundQuantity / Range; + } + item.OutQtys -= (int)BeyondQtys; + UpStockInfoDetails.Add(outStock); + proStockInfoDetails.Remove(outStock); + } + else + { + return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}琛屽彿{proOutOrderDetail.RowId}浜у搧鍨嬪彿{item.ProductCode}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}")); + } + } + else + { + outStock.OutboundQuantity = outStock.StockPcsQty; + outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder; + outStock.OutProNo = proOutOrder.ProOutOrderNo; + outStock.OutSETQty = outStock.SETQty; + outStock.AssignDel = 1; + item.OutQtys -= (int)outStock.StockPcsQty; + UpStockInfoDetails.Add(outStock); + proStockInfoDetails.Remove(outStock); + } + if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); + } + if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); + } + } + else if (item.OutQtys < outStock.StockPcsQty) //鍓╀綑鏁伴噺灏忎簬 + { + Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt()); + if (proOutOrderDetail == null) + { + return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}鏈壘鍒颁骇鍝亄item.ProductCode}鏄庣粏,璇锋鏌�")); + } + List<Dt_ProOutOrderDetail>? outOrderDetails = proOutOrder.Details.Where(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt() && x.Id != proOutOrderDetail.Id).ToList(); + //鏇存柊鍑哄簱鏄庣粏鍗曟暟閲� + float BeyondQtys = proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs; + proOutOrderDetail.OverQtyPcs += item.OutQtys; + + //鏄惁瓒呭嚭 + if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs) + { + if (outOrderDetails.Count >= 1) + { + proOutOrderDetail.OverQtyPcs -= outStock.StockPcsQty; + proOutOrderDetail.OverQtyPcs += BeyondQtys; + outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder; + outStock.OutProNo = proOutOrder.ProOutOrderNo; + outStock.OutboundQuantity = BeyondQtys; + float Range = outStock.StockPcsQty / outStock.SETQty; + outStock.OutSETQty = outStock.OutboundQuantity / Range; + item.OutQtys -= (int)BeyondQtys; + UpStockInfoDetails.Add(outStock); + proStockInfoDetails.Remove(outStock); + } + else + { + return await Task.FromResult(content.Error($"鍑哄簱鍗晎proOutOrder.ProOutOrderNo}琛屽彿{proOutOrderDetail.RowId}浜у搧鍨嬪彿{item.ProductCode}鏁伴噺婧㈠嚭{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}")); + } + } + else + { + outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder; + outStock.OutProNo = proOutOrder.ProOutOrderNo; + outStock.OutboundQuantity = item.OutQtys; + float Range = outStock.StockPcsQty / outStock.SETQty; + outStock.OutSETQty = outStock.OutboundQuantity / Range; + item.OutQtys -= item.OutQtys; + UpStockInfoDetails.Add(outStock); + proStockInfoDetails.Remove(outStock); + } + if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt(); + } + if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs) + { + proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); + } + } + } + } + if (proOutOrder.Details.Count == proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count()) + { + proOutOrder.ProOrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt(); + } + else + { + Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt()); + return await Task.FromResult(content.Error($"{proOutOrderDetail?.SaleOrder}閿�鍞鍗曟暟閲忛渶鍑簕proOutOrderDetail?.QtyPcs},鍙嚭{proOutOrderDetail?.OverQtyPcs}")); + } + List<StockOutItemsItem> stockOutItems = new List<StockOutItemsItem>(); + if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + //鑾峰彇鎵�鏈夊凡鎵爜寰呭彂璐х殑搴撳瓨 + List<Dt_ProStockInfoDetail> assOutStocks = _stockRepository.ProStockInfoDetailRepository.Db.Queryable<Dt_ProStockInfoDetail>() + .Where(x => x.OutProNo == ProOutNo).ToList(); + UpStockInfoDetails.AddRange(assOutStocks); + foreach (var item in UpStockInfoDetails) + { + StockOutItemsItem outItemsItem = new StockOutItemsItem() + { + PartNum = item.ProductCode, + Rev = item.ProductVersion, + SoNumber = item.OutDetailSaleNo, + BatchNumber = item.ProductCode, + QtyPcs = item.OutboundQuantity, + QtySet = item.OutSETQty + }; + stockOutItems.Add(outItemsItem); + } + } + Dt_Warehouse warehouseOut = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault(); + _unitOfWorkManage.BeginTran(); + //澶勭悊搴撳瓨鏁版嵁鍜屼笂浼燛RP + if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt()) + { + //鎴愬搧搴撳瓨璁板綍鍙樺姩寰呭姞鍏� + ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel() + { + Way = 1, + StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)), + ConfirmedUserNo = App.User.UserName, + AssignUserNo = App.User.UserName, + WarehouseCode = warehouseOut.WarehouseCode, + ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + DeliverplanCode = proOutOrder.ProOutOrderNo, + Remark = proOutOrder.Remark, + StockOutItems = stockOutItems + }; + //鑾峰彇鍒犻櫎搴撳瓨 + List<Dt_ProStockInfoDetail> delDetails = UpStockInfoDetails.Where(x=>x.AssignDel==1).ToList(); + List<Dt_ProStockInfoDetail> UpDetails = UpStockInfoDetails.Where(x => x.AssignDel != 1).ToList(); + //鏇存柊鏁版嵁 + UpDetails.ForEach(x => + { + x.StockPcsQty -= x.OutboundQuantity; + x.SETQty -= x.OutSETQty; + x.OutDetailId = 0; + x.OutDetailSaleNo = null; + x.OutProNo = null; + }); + _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delDetails, OperateTypeEnum.鑷姩瀹屾垚); + await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpDetails); + //鍚屾ERP + string response = _invokeERPService.InvokeProOutApi(proOutOrderModel); + ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>(); + if (erpRequestContent.res != 1) + { + throw new Exception("鍚屾ERP澶辫触,閿欒淇℃伅:" + erpRequestContent.Data); + } + } + else + { + await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpStockInfoDetails); + } + await _outboundRepository.ProOutOrderDetailRepository.UpdateDataAsync(proOutOrder.Details); + await BaseDal.UpdateDataAsync(proOutOrder); + _unitOfWorkManage.CommitTran(); + return await Task.FromResult(content.OK()); + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + return await Task.FromResult(content.Error(ex.Message)); + } + } } } -- Gitblit v1.9.3