| | |
| | | using AutoMapper; |
| | | using Castle.Core.Resource; |
| | | using Org.BouncyCastle.Asn1.Cmp; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | |
| | | .Select((master, detail) => detail) |
| | | .ToList(); |
| | | proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ToList(); |
| | | |
| | | List<int> stockIds = proStockInfoDetails.Select(x => x.ProStockId).Distinct().ToList(); |
| | | //è·åææå¹³åºä¸»è¡¨ |
| | | List<Dt_ProStockInfo> proStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => stockIds.Contains(x.Id)).Includes(x => x.proStockInfoDetails).ToList(); |
| | | List<Dt_ProStockInfo> delProStockInfos = new List<Dt_ProStockInfo>(); |
| | | List<Dt_ProStockInfoDetail> delStockInfoDetails = new List<Dt_ProStockInfoDetail>(); |
| | | foreach (var item in outProStocks) |
| | | { |
| | | |
| | | //è·ååºå |
| | | List<Dt_ProStockInfoDetail> outStocks = proStockInfoDetails.Where(x=>x.ProductCode==item.Partnum).ToList(); |
| | | if (outStocks.Count==0 || outStocks==null) |
| | | { |
| | | return content.Error($"{item.Partnum}产ååå·åºåä¸åå¨"); |
| | | } |
| | | foreach (var itemOut in outStocks) |
| | | foreach (var itemOut in proStockInfoDetails.Where(x => x.ProductCode == item.Partnum).ToList()) |
| | | { |
| | | if (item.Quantity==0) |
| | | { |
| | |
| | | |
| | | //æ´æ°åºåºæç»åæ°é |
| | | proOutOrderDetail.OverQtyPcs += item.Quantity; |
| | | item.Quantity -= item.Quantity; |
| | | float Range = itemOut.StockPcsQty / itemOut.SETQty; |
| | | itemOut.SETQty = item.Quantity / Range; |
| | | int Range = (int)itemOut.StockPcsQty / (int)itemOut.SETQty; |
| | | if (Range == 0) |
| | | { |
| | | return content.Error($"{itemOut.BagNo}åå
æ°é转æ¢å¤±è´¥,è¯·æ£æ¥,Range:{Range}"); |
| | | } |
| | | int outSet =item.Quantity / Range; |
| | | if (outSet == 0) |
| | | { |
| | | return content.Error($"{itemOut.BagNo}åå
æ°é转æ¢å¤±è´¥,è¯·æ£æ¥,outSet:{outSet}"); |
| | | } |
| | | itemOut.SETQty -= outSet; |
| | | |
| | | itemOut.StockPcsQty -= item.Quantity; |
| | | item.Quantity = 0; |
| | | if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs) |
| | | { |
| | | return content.Error($"åºåºå{proOutOrder.ProOutOrderNo}éå®è®¢å{item.SoNumber}æ°é溢åº{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"); |
| | |
| | | } |
| | | } |
| | | } |
| | | if (item.Quantity>0) |
| | | { |
| | | return content.Error($"æªæ¾å°{item.SoNumber}坿£ååºå"); |
| | | } |
| | | } |
| | | if (proOutOrder.Details.Count == proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count()) |
| | | { |
| | |
| | | Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.ProOrderDetailStatus <= OrderDetailStatusEnum.Over.ObjToInt()); |
| | | return content.Error($"{proOutOrderDetail?.SaleOrder}éå®è®¢åæ°ééåº{proOutOrderDetail?.QtyPcs},å¯åº{proOutOrderDetail?.OverQtyPcs}"); |
| | | } |
| | | //è·åå é¤çåºå主表 |
| | | List<int> delStockIds = delStockInfoDetails.Select(x => x.ProStockId).Distinct().ToList(); |
| | | List<int> delStockDetailIds = delStockInfoDetails.Select(x => x.Id).ToList(); |
| | | foreach (var item in delStockIds) |
| | | { |
| | | Dt_ProStockInfo proStockInfo = proStockInfos.FirstOrDefault(x => x.Id == item); |
| | | Dt_ProStockInfoDetail? proStockInfoDetail = proStockInfo.proStockInfoDetails.FirstOrDefault(x => !delStockDetailIds.Contains(x.Id)); |
| | | if (proStockInfoDetail == null) |
| | | { |
| | | delProStockInfos.Add(proStockInfo); |
| | | } |
| | | } |
| | | //æ´æ°æ°æ® |
| | | _unitOfWorkManage.BeginTran(); |
| | | if (delStockInfoDetails.Count > 0) |
| | | { |
| | | _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.èªå¨å é¤); |
| | | } |
| | | _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.èªå¨å é¤); |
| | | _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(delProStockInfos, OperateTypeEnum.èªå¨å®æ); |
| | | _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails); |
| | | BaseDal.UpdateData(proOutOrder); |
| | | _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrder.Details); |
| | |
| | | { |
| | | 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); |
| | | } |
| | | |
| | | //è·åææå¹³åºåºå |
| | | List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId) |
| | | .Where((master, detail) => master.WarehouseId == warehouse.WarehouseId && outProInfos.Select(x=>x.ProductCode).Contains(detail.ProductCode)) |
| | | .Select((master, detail) => detail) |
| | | .ToList(); |
| | | List<int> stockIds = proStockInfoDetails.Select(x => x.ProStockId).Distinct().ToList(); |
| | | //è·åææå¹³åºä¸»è¡¨ |
| | | List<Dt_ProStockInfo> proStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => stockIds.Contains(x.Id)).Includes(x=>x.proStockInfoDetails).ToList(); |
| | | 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() |
| | |
| | | OutQtys=x.Sum(x=>x.OutQtys) |
| | | }).ToList(); |
| | | List<Dt_ProStockInfoDetail> UpStockInfoDetails = new List<Dt_ProStockInfoDetail>(); |
| | | List<Dt_ProStockInfo> DelStocks = new List<Dt_ProStockInfo>(); |
| | | foreach (var item in outProInfos) |
| | | { |
| | | //è·ååºå |
| | |
| | | if (outStocks.Count <= 0 || outProInfos==null) |
| | | { |
| | | return await Task.FromResult(content.Error($"æªæ¾å°äº§å{item.ProductCode}åºå")); |
| | | } |
| | | if (outStocks.Sum(x=>x.StockPcsQty)< item.OutQtys) |
| | | { |
| | | return await Task.FromResult(content.Error($"å¯ç¨å¹³åºæ°é{outStocks.Sum(x => x.StockPcsQty)}䏿»¡è¶³åºåºæ°é{item.OutQtys}")); |
| | | } |
| | | foreach (var outStock in outStocks) |
| | | { |
| | |
| | | else |
| | | { |
| | | outStock.OutSETQty = outStock.OutboundQuantity / Range; |
| | | } |
| | | if (outStock.OutSETQty==0) |
| | | { |
| | | return await Task.FromResult(content.Error($"{outStock.BagNo}åå
æ°é转æ¢å¤±è´¥,è¯·æ£æ¥")); |
| | | } |
| | | item.OutQtys -= (int)BeyondQtys; |
| | | UpStockInfoDetails.Add(outStock); |
| | |
| | | outStock.OutboundQuantity = BeyondQtys; |
| | | float Range = outStock.StockPcsQty / outStock.SETQty; |
| | | outStock.OutSETQty = outStock.OutboundQuantity / Range; |
| | | item.OutQtys -= (int)BeyondQtys; |
| | | if (outStock.OutSETQty == 0) |
| | | { |
| | | return await Task.FromResult(content.Error($"{outStock.BagNo}åå
æ°é转æ¢å¤±è´¥,è¯·æ£æ¥")); |
| | | } |
| | | item.OutQtys = 0; |
| | | UpStockInfoDetails.Add(outStock); |
| | | proStockInfoDetails.Remove(outStock); |
| | | } |
| | |
| | | outStock.OutboundQuantity = item.OutQtys; |
| | | float Range = outStock.StockPcsQty / outStock.SETQty; |
| | | outStock.OutSETQty = outStock.OutboundQuantity / Range; |
| | | item.OutQtys -= item.OutQtys; |
| | | if (outStock.OutSETQty == 0) |
| | | { |
| | | return await Task.FromResult(content.Error($"{outStock.BagNo}åå
æ°é转æ¢å¤±è´¥,è¯·æ£æ¥")); |
| | | } |
| | | item.OutQtys = 0; |
| | | UpStockInfoDetails.Add(outStock); |
| | | proStockInfoDetails.Remove(outStock); |
| | | } |
| | |
| | | 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) |
| | | { |
| | | //è·åææå·²æ«ç å¾
åè´§çåºå |
| | | 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() |
| | | { |
| | | 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); |
| | | } |
| | | 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(); |
| | | //å¤çåºåæ°æ®åä¸ä¼ ERP |
| | | if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.åºåºå®æ.ObjToInt()) |
| | | //è·åå é¤åºå |
| | | List<Dt_ProStockInfoDetail> delDetails = UpStockInfoDetails.Where(x => x.AssignDel == 1).ToList(); |
| | | List<Dt_ProStockInfoDetail> UpDetails = UpStockInfoDetails.Where(x => x.AssignDel != 1).ToList(); |
| | | //è·åå é¤çåºå主表 |
| | | List<int> delStockIds = delDetails.Select(x => x.ProStockId).Distinct().ToList(); |
| | | List<int> delStockDetailIds = delDetails.Select(x => x.Id).ToList(); |
| | | foreach (var item in delStockIds) |
| | | { |
| | | //æååºåè®°å½åå¨å¾
å å
¥ |
| | | ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel() |
| | | Dt_ProStockInfo proStockInfo = proStockInfos.FirstOrDefault(x=>x.Id==item); |
| | | Dt_ProStockInfoDetail? proStockInfoDetail= proStockInfo.proStockInfoDetails.FirstOrDefault(x=> !delStockDetailIds.Contains(x.Id)); |
| | | if (proStockInfoDetail==null) |
| | | { |
| | | 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); |
| | | DelStocks.Add(proStockInfo); |
| | | } |
| | | } |
| | | else |
| | | _unitOfWorkManage.BeginTran(); |
| | | //å¤çåºåæ°æ®åä¸ä¼ ERP |
| | | //æååºåè®°å½åå¨å¾
å å
¥ |
| | | ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel() |
| | | { |
| | | await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpStockInfoDetails); |
| | | 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 |
| | | }; |
| | | //æ´æ°æ°æ® |
| | | 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.èªå¨å®æ); |
| | | _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(DelStocks, 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); |
| | | } |
| | | await _outboundRepository.ProOutOrderDetailRepository.UpdateDataAsync(proOutOrder.Details); |
| | | await BaseDal.UpdateDataAsync(proOutOrder); |