using 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; namespace WIDESEA_OutboundService { public partial class ProOutOrderService : ServiceBase, IProOutOrderService { 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, IStockRepository stockRepository, IOutboundRepository outboundRepository, IOutboundOrderService outboundOrderService,IInvokeERPService invokeERPService) : base(BaseDal) { _unitOfWorkManage = unitOfWorkManage; _basicRepository = basicRepository; _mapper = mapper; _stockRepository = stockRepository; _outboundRepository = outboundRepository; _outboundOrderService = outboundOrderService; _invokeERPService = invokeERPService; } /// /// 接收ERP成品出库单 /// /// public WebResponseContent ProductDeliveryOrder(ErpProOutOrderDTO outOrderDTO) { try { return outOrderDTO.Way switch { 1 => AddDeliveryOrder(outOrderDTO), 2 => UpdateDeliveryOrder(outOrderDTO), 3 => DeleteDeliveryOrder(outOrderDTO), _ => WebResponseContent.Instance.Error($"操作类型不存在,Way:{outOrderDTO.Way}"), }; } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 新增成品出库单 /// /// public WebResponseContent AddDeliveryOrder(ErpProOutOrderDTO outOrderDTO) { WebResponseContent content=new WebResponseContent(); try { if (BaseDal.QueryFirst(x => x.ProOutOrderNo == outOrderDTO.OrderNo) != null) { return content.Error($"出库单号{outOrderDTO.OrderNo}已存在!"); } Dt_Warehouse warehouse=null; List customerInfos = _basicRepository.CustomerInfoRepository.QueryData(); if (outOrderDTO.OType==1 && string.IsNullOrEmpty(outOrderDTO.WaType)) { warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==WarehouseEnum.HA71.ToString()); } else if (outOrderDTO.OType==2) { warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString()); } List proOutOrderDetails = new List(); 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(item)); } Dt_ProOutOrder proOutOrder= new Dt_ProOutOrder() { ProOutOrderNo= outOrderDTO.OrderNo, WarehouseId= warehouse.WarehouseId, ProOrderType= outOrderDTO.OType, ProOrderStatus=OutOrderStatusEnum.未开始.ObjToInt(), PlantShipDate= outOrderDTO.PlantShipDate.ObjToDate(), Remark= outOrderDTO.Note, Details= proOutOrderDetails }; Db.InsertNav(proOutOrder).Include(x => x.Details).ExecuteCommand(); content.OK("成功"); } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 更新成品出库单 /// /// public WebResponseContent UpdateDeliveryOrder(ErpProOutOrderDTO outOrderDTO) { WebResponseContent content = new WebResponseContent(); try { } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 删除成品出库单 /// /// public WebResponseContent DeleteDeliveryOrder(ErpProOutOrderDTO outOrderDTO) { WebResponseContent content = new WebResponseContent(); try { } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 成品出待发货区(平库)+同步ERP出库 /// /// 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().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 AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable() .Where(x => OutPKCodes.Contains(x.PalletCode) && x.StockStatus == StockStatusEmun.平库入库完成.ObjToInt()) .Includes(x => x.proStockInfoDetails).ToList(); List proStockInfos = new List(); List proStockInfoDetails=new List(); List 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 stockOutItems = new List(); List 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("对应出库订单明细为空"); } 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(); } 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); } int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); int AddOverCount = proOutOrderDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); if (proOutOrder.Details.Count== (OldOverCount + AddOverCount)) { proOutOrder.ProOrderStatus = OutOrderStatusEnum.出库完成.ObjToInt(); } Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault(); //处理库存数据和上传ERP _unitOfWorkManage.BeginTran(); _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.自动完成); _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.自动完成); _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrderDetails); BaseDal.UpdateData(proOutOrder); //成品库存记录变动待加入 ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel() { Way = 1, StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)), ConfirmedUserNo=userName, AssignUserNo=userName, WarehouseCode=warehouse.WarehouseCode, ShipDate=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), DeliverplanCode=proOutOrder.ProOutOrderNo, Remark=proOutOrder.Remark, StockOutItems= stockOutItems }; string response = _invokeERPService.InvokeProOutApi(proOutOrderModel); ErpRequestContent erpRequestContent= response.DeserializeObject(); if (erpRequestContent.res==1) { _unitOfWorkManage.CommitTran(); content.OK(); } else { throw new Exception(erpRequestContent.Data); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } } }