using AutoMapper; using HslCommunication.WebSocket; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.StockEnum; 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_Core.Utilities; using WIDESEA_DTO; using WIDESEA_DTO.Basic; using WIDESEA_DTO.Inbound; using WIDESEA_External.ERPService; using WIDESEA_External.Model; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_IInboundRepository; using WIDESEA_IInboundService; using WIDESEA_IRecordService; using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_ITaskInfoRepository; using WIDESEA_Model.Models; using WIDESEA_StockRepository; namespace WIDESEA_InboundService { public class InboundOrderService : ServiceBase, IInboundOrderService { private readonly IMapper _mapper; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IInboundRepository _inboundRepository; private readonly IBasicRepository _basicRepository; private readonly IStockRepository _stockRepository; private readonly IRecordService _recordService; private readonly IInvokeERPService _invokeERPService; public IInboundOrderRepository Repository => BaseDal; public InboundOrderService(IInboundOrderRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, IStockRepository stockRepository, IRecordService recordService, IInvokeERPService invokeERPService) : base(BaseDal) { _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _inboundRepository = inboundRepository; _basicRepository = basicRepository; _stockRepository = stockRepository; _recordService = recordService; _invokeERPService = invokeERPService; } public WebResponseContent GetInboundOrders(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { int pageNo = saveModel.MainData["pageNo"].ObjToInt(); string? orderNo = saveModel.MainData["orderNo"].ToString(); int warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); List dt_ReceiveOrders = new List(); if (string.IsNullOrEmpty(orderNo)) { dt_ReceiveOrders = Db.Queryable().Where(x => x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5); } else { dt_ReceiveOrders = Db.Queryable().Where(x => (x.InboundOrderNo.Contains(orderNo)) && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5); } content.OK(data: dt_ReceiveOrders); } catch (Exception ex) { content.Error(ex.Message); } return content; } public WebResponseContent MaterielGroup(int inboundOrderId, string palletCode, string serNum) { try { Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable().Where(x => x.Id == inboundOrderId).Includes(x => x.Details).First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"未找到入库单信息"); } if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到入库单明细信息"); } Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First(); if (receiveOrder == null) { return WebResponseContent.Instance.Error($"未找到对应的收货单"); } if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到对应的收货单明细"); } List purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList(); MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis(AnalysisCodeEnum.MatSerNumAnalysis, serNum); List inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == model.MaterielCode).ToList(); if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0) { return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息"); } if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息"); } if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单"); } Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() && x.OrderQuantity == model.Quantity).FirstOrDefault(); if (notGroupDetail == null) { return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成"); } Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterielCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到该物料的信息"); } Dt_StockInfo stockInfo = new Dt_StockInfo() { PalletCode = palletCode, StockStatus = StockStatusEmun.组盘暂存.ObjToInt(), WarehouseId = inboundOrder.WarehouseId }; Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { BatchNo = model.LotNo, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, OrderNo = inboundOrder.InboundOrderNo, SerialNumber = model.SerialNumber, StockQuantity = model.Quantity, OutboundQuantity = 0, Status = StockStatusEmun.组盘暂存.ObjToInt(), ProductionDate = model.ProductionDate, EffectiveDate = model.EffectiveDate, InboundOrderRowNo = notGroupDetail.RowNo, }; _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 组盘 /// /// /// public WebResponseContent MaterielGroup(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { var orderNo = saveModel.MainData["orderNo"].ToString(); var palletCode = saveModel.MainData["palletCode"].ToString(); var warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); var serNums = saveModel.DelKeys.Select(x => x.ToString()).ToList(); Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable().Where(x => x.InboundOrderNo == orderNo && x.WarehouseId == warehouseId).Includes(x => x.Details).First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"未找到入库单信息"); } if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到入库单明细信息"); } Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First(); if (receiveOrder == null) { return WebResponseContent.Instance.Error($"未找到对应的收货单"); } if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到对应的收货单明细"); } List purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList(); List models = CodeAnalysisHelper.CodeAnalysis(AnalysisCodeEnum.MatSerNumAnalysis, serNums); if (models.Select(x => x.MaterielCode).Distinct().Count() > 1) { return WebResponseContent.Instance.Error($"物料不可混放"); } string materielCode = models.FirstOrDefault()?.MaterielCode ?? ""; Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到该物料的信息"); } List inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode).ToList(); if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0) { return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息"); } if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息"); } float beforeQuantity = 0; Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First(); if (stockInfo == null) { stockInfo = new Dt_StockInfo() { PalletCode = palletCode, StockStatus = StockStatusEmun.组盘暂存.ObjToInt(), WarehouseId = inboundOrder.WarehouseId, PalletType = PalletTypeEnum.SmallPallet.ObjToInt(), Details = new List() }; } else { if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt()) { return WebResponseContent.Instance.Error($"托盘号重复"); } beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity); } List stockInfoDetails = new List(); List detailKeys = new List(); foreach (var model in models) { if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单"); } Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() && x.OrderQuantity == model.Quantity && !detailKeys.Contains(x.Id) && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault(); if (notGroupDetail == null) { return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成"); } detailKeys.Add(notGroupDetail.Id); Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { BatchNo = model.LotNo, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, OrderNo = inboundOrder.InboundOrderNo, SerialNumber = model.SerialNumber, StockQuantity = model.Quantity, OutboundQuantity = 0, Status = StockStatusEmun.组盘暂存.ObjToInt(), ProductionDate = model.ProductionDate, EffectiveDate = model.EffectiveDate, InboundOrderRowNo = notGroupDetail.RowNo, }; if (stockInfo.Id > 0) { stockInfoDetail.StockId = stockInfo.Id; } stockInfo.Details.Add(stockInfoDetail); stockInfoDetails.Add(stockInfoDetail); notGroupDetail.ReceiptQuantity = model.Quantity; notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt(); } float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity); inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt(); _unitOfWorkManage.BeginTran(); if (stockInfo.Id == 0) { _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); } else { _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand(); } _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails); _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup); _unitOfWorkManage.CommitTran(); content.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } public WebResponseContent MaterielGroup(int inboundOrderId, string palletCode, List serNums) { try { Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable().Where(x => x.Id == inboundOrderId).Includes(x => x.Details).First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"未找到入库单信息"); } if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到入库单明细信息"); } Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First(); if (receiveOrder == null) { return WebResponseContent.Instance.Error($"未找到对应的收货单"); } if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到对应的收货单明细"); } List purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList(); List models = CodeAnalysisHelper.CodeAnalysis(AnalysisCodeEnum.MatSerNumAnalysis, serNums); if (models.Select(x => x.MaterielCode).Distinct().Count() > 1) { return WebResponseContent.Instance.Error($"物料不可混放"); } string materielCode = models.FirstOrDefault()?.MaterielCode ?? ""; Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到该物料的信息"); } List inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode).ToList(); if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0) { return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息"); } if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息"); } float beforeQuantity = 0; Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First(); if (stockInfo == null) { stockInfo = new Dt_StockInfo() { PalletCode = palletCode, StockStatus = StockStatusEmun.组盘暂存.ObjToInt(), WarehouseId = inboundOrder.WarehouseId, PalletType = PalletTypeEnum.SmallPallet.ObjToInt(), Details = new List() }; } else { if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt()) { return WebResponseContent.Instance.Error($"托盘号重复"); } beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity); } List stockInfoDetails = new List(); List detailKeys = new List(); foreach (var model in models) { if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单"); } Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() && x.OrderQuantity == model.Quantity && !detailKeys.Contains(x.Id) && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault(); if (notGroupDetail == null) { return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成"); } detailKeys.Add(notGroupDetail.Id); Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { BatchNo = model.LotNo, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, OrderNo = inboundOrder.InboundOrderNo, SerialNumber = model.SerialNumber, StockQuantity = model.Quantity, OutboundQuantity = 0, Status = StockStatusEmun.组盘暂存.ObjToInt(), ProductionDate = model.ProductionDate, EffectiveDate = model.EffectiveDate, InboundOrderRowNo = notGroupDetail.RowNo, }; if (stockInfo.Id > 0) { stockInfoDetail.StockId = stockInfo.Id; } stockInfo.Details.Add(stockInfoDetail); stockInfoDetails.Add(stockInfoDetail); notGroupDetail.ReceiptQuantity = model.Quantity; notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt(); } float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity); inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt(); _unitOfWorkManage.BeginTran(); if (stockInfo.Id == 0) { _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); } else { _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand(); } _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails); _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent FeedbackInboundOrder(int id) { try { Dt_InboundOrder inboundOrder = Db.Queryable().Where(x => x.Id == id).Includes(x => x.Details).First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"未找到入库单信息"); } if (inboundOrder.Details == null || inboundOrder.Details.Count == 0) { return WebResponseContent.Instance.Error($"未找到入库单明细信息"); } if (inboundOrder.OrderStatus != InOrderStatusEnum.入库完成.ObjToInt()) { return WebResponseContent.Instance.Error($"入库单据未完成"); } if (inboundOrder.Details.FirstOrDefault(x => x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) != null) { return WebResponseContent.Instance.Error($"入库明细未完成"); } List stockInfos = Db.Queryable().Where(x => x.Details.Any(v => v.OrderNo == inboundOrder.InboundOrderNo)).Includes(x => x.Details).ToList(); List warehouses = Db.Queryable().ToList(); List detailModels = new List(); foreach (var item in inboundOrder.Details) { Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(v => v.InboundOrderRowNo == item.RowNo && v.MaterielCode == item.MaterielCode)); if (stockInfo == null) { return WebResponseContent.Instance.Error($"未找到库存信息"); } Dt_Warehouse? warehouse = warehouses.FirstOrDefault(x => x.WarehouseId == stockInfo.WarehouseId); if (warehouse == null) { return WebResponseContent.Instance.Error($"未找到仓库信息"); } ERPInboundDetailModel detailModel = new ERPInboundDetailModel() { ExpiryDate = stockInfo.Details.FirstOrDefault()?.EffectiveDate ?? "", LocationCode = warehouse.WarehouseCode, MaterialsCode = item.MaterielCode, MfgDate = stockInfo.Details.FirstOrDefault()?.ProductionDate ?? "", QtyCustoms = "0", Quantity = stockInfo.Details.Sum(x => x.StockQuantity).ToString(), Rack = stockInfo.LocationCode, ReceiptCode = inboundOrder.UpperOrderNo, ReceiptSerNo = item.RowNo.ToString() }; detailModels.Add(detailModel); } Dt_Warehouse? warehouse2 = warehouses.FirstOrDefault(x => x.WarehouseId == inboundOrder.WarehouseId); if (warehouse2 == null) { return WebResponseContent.Instance.Error($"未找到仓库信息"); } ERPInboundModel model = new ERPInboundModel() { Code = inboundOrder.InboundOrderNo, CreatorCode = inboundOrder.Creater, EndDate = inboundOrder.CreateDate.ToString(), StockDate = inboundOrder.CreateDate.ToString(), SuppliersId = inboundOrder.SupplierId, Type = "S", UniqueTag = inboundOrder.Id.ToString(), WarehouseCode = warehouse2.WarehouseCode, Way = 1, Details = detailModels }; string response = _invokeERPService.InvokeInboundOrderApi(model); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } } }