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_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; public IInboundOrderRepository Repository => BaseDal; public InboundOrderService(IInboundOrderRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, IStockRepository stockRepository, IRecordService recordService) : base(BaseDal) { _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _inboundRepository = inboundRepository; _basicRepository = basicRepository; _stockRepository = stockRepository; _recordService = recordService; } 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() }; _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(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() }; 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); } } } }