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_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_IApprovalRepository; using WIDESEA_ICheckRepository; using WIDESEA_ICheckService; using WIDESEA_IInboundRepository; using WIDESEA_IOutboundRepository; using WIDESEA_IStockRepository; using WIDESEA_Model.Models; namespace WIDESEA_CheckService { public class CheckOrderResultService : ServiceBase, ICheckOrderResultService { private readonly ICheckOrderRepository _checkOrderRepository; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IReceiveOrderRepository _receiveOrderRepository; private readonly ICheckOrderService _checkOrderService; private readonly IPurchaseOrderRepository _purchaseOrderRepository; private readonly IPurchaseOrderDetailRepository _purchaseOrderDetailRepository; private readonly IOutboundRepository _outboundRepository; private readonly IStockRepository _stockRepository; public CheckOrderResultService(ICheckOrderResultRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, ICheckOrderRepository checkOrderRepository, IReceiveOrderRepository receiveOrderRepository, ICheckOrderService checkOrderService, IPurchaseOrderRepository purchaseOrderRepository, IPurchaseOrderDetailRepository purchaseOrderDetailRepository, IOutboundRepository outboundRepository, IStockRepository stockRepository) : base(BaseDal) { _checkOrderRepository = checkOrderRepository; _unitOfWorkManage = unitOfWorkManage; _receiveOrderRepository = receiveOrderRepository; _checkOrderService = checkOrderService; _purchaseOrderRepository = purchaseOrderRepository; _purchaseOrderDetailRepository = purchaseOrderDetailRepository; _outboundRepository = outboundRepository; _stockRepository = stockRepository; } /// /// 提交质检结果 /// /// 质检单主键 /// 质检结果对象 /// 是否接受 /// public WebResponseContent CommitCheckResult(int checkOrderId,Dt_CheckOrderResult checkResult,int IsAccept=0) { WebResponseContent content = new WebResponseContent(); try { Dt_CheckOrder checkOrder = _checkOrderRepository.QueryFirst(x => x.CheckOrderId == checkOrderId); //获取质检单对应的收货单 if (checkOrder == null) { return content.Error($"未找到该质检单"); } Dt_ReceiveOrder receiveOrder = _receiveOrderRepository.Db.Queryable().Where(x => x.ReceiveOrderNo == checkOrder.ReceiveOrderNo).Includes(x => x.Details).First(); if (receiveOrder.ReceiveOrderStatus!=ReceiveOrderStatusEnum.Completed.ObjToInt()) { return content.Error($"{receiveOrder.ReceiveOrderNo}收货单未完成无法质检"); } if (checkOrder.CheckOrderStatus == CheckOrderStatusEnum.Checked.ObjToInt()) { return content.Error($"该单据已经检验完成"); } Dt_CheckOrderResult? checkOrderResult = null; Dt_PurchaseOrder? purchaseOrder = null; Dt_PurchaseOrderDetail? purchaseOrderDetail= null; if (checkResult.CheckOrderId!=0) { if (checkResult.Quantity < 0 || checkResult.Quantity > checkOrder.ReceivedQuantity || checkOrder.ReceivedQuantity - checkOrder.ReturnQuantity < checkResult.Quantity) { return content.Error($"数量超出"); } if (checkResult.Result == CheckResultEnum.Return.ToString())//退货 { checkOrder.DefectedNote = checkResult.Note; checkOrder.ReturnQuantity += checkResult.Quantity; } else { return content.Error($"未找到缺陷类型"); } checkOrderResult = new Dt_CheckOrderResult() { Quantity = checkResult.Quantity, CheckOrderId = checkOrderId, DefectCode = checkResult.DefectCode, Result = checkResult.Result, Note = checkResult.Note, SampleCount=checkResult.SampleCount, }; //获取对应采购单 Dt_ReceiveOrderDetail receiveOrderDetail = receiveOrder.Details.First(x => x.RowNo == checkOrder.ReceiveDetailRowNo); purchaseOrder = _purchaseOrderRepository.Db.Queryable().Where(x => x.PurchaseOrderNo == receiveOrderDetail.PurchaseOrderNo).Includes(x => x.Details).Where(x => x.Details.Any(v => v.RowNo == receiveOrderDetail.PurchaseOrderDetailRowNo)).First(); if (purchaseOrder == null) { return content.Error("未找到对应收货采购单"); } purchaseOrderDetail = purchaseOrder.Details.FirstOrDefault(); if (purchaseOrderDetail==null) { return content.Error("未找到退货对应的采购单明细"); } purchaseOrderDetail.PurchaseDetailReceiveQty -= checkResult.Quantity; } if (IsAccept==CheckAcceptEnum.Accept.ObjToInt()) { checkOrder.Result = CheckAcceptEnum.Accept.ToString(); } else if (IsAccept == CheckAcceptEnum.UnAccept.ObjToInt()) { checkOrder.Result = CheckAcceptEnum.UnAccept.ToString(); } else { return content.Error("未找到检验类型"); } checkOrder.CheckOrderStatus = CheckOrderStatusEnum.Checked.ObjToInt(); if (checkOrderResult!=null) { checkOrder.QualifiedQuantity = checkOrder.ReceivedQuantity - checkOrderResult.Quantity; } else { checkOrder.QualifiedQuantity = checkOrder.ReceivedQuantity; } checkOrder.CheckUserName = App.User.UserName; _unitOfWorkManage.BeginTran(); if (checkOrderResult!=null && purchaseOrder!=null && purchaseOrderDetail!=null) { BaseDal.AddData(checkOrderResult); if (purchaseOrder.PurchaseOrderStatus>=PurchaseOrderStatusEnum.Received.ObjToInt()) { purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Receiving.ObjToInt(); _purchaseOrderRepository.UpdateData(purchaseOrder); } if (purchaseOrderDetail.PurchaseDetailStatus== PurchaseOrderDetailStatusEnum.Received.ObjToInt()) { purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Receiving.ObjToInt(); } _purchaseOrderDetailRepository.UpdateData(purchaseOrderDetail); } //ERP上报 WebResponseContent responseContent= _checkOrderService.FeedbackCheckResult(checkOrder, checkOrderResult!=null? new List { checkOrderResult }:new List()); if (!responseContent.Status) { throw new Exception(responseContent.Message); } checkOrder.UploadStatus = CheckUploadEnum.UploadOk.ObjToInt(); _checkOrderRepository.UpdateData(checkOrder); _unitOfWorkManage.CommitTran(); content.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content.Error($"{ex.Message}"); } return content; } /// /// 提交送检确认结果 /// /// /// /// /// public WebResponseContent CommitInspectResult(int checkOrderId, Dt_CheckOrderResult checkResult, int IsAccept = 0) { WebResponseContent content = new WebResponseContent(); try { Dt_CheckOrder checkOrder = _checkOrderRepository.QueryFirst(x => x.CheckOrderId == checkOrderId); //获取质检单对应的收货单 if (checkOrder == null) { return content.Error($"未找到该质检单"); } Dt_OutboundOrder outboundOrder = _outboundRepository.OutboundOrderRepository.Db.Queryable().Where(x => x.OrderNo == checkOrder.ReceiveOrderNo).Includes(x => x.Details).First(); if (outboundOrder.OrderStatus != OutOrderStatusEnum.出库完成.ObjToInt()) { return content.Error($"{outboundOrder.OrderNo}送检单出库未完成无法质检"); } if (checkOrder.CheckOrderStatus == CheckOrderStatusEnum.Checked.ObjToInt()) { return content.Error($"该单据已经检验完成"); } Dt_CheckOrderResult? checkOrderResult = null; //获取库存 Dt_OutStockLockInfo outStockLockInfo = _outboundRepository.OutboundStockLockInfoRepository.QueryFirst(x => x.Id == checkOrder.ReceiveDetailRowNo) ?? throw new Exception("未找到送检单详情"); Dt_StockInfo? stockInfo = _stockRepository.StockInfoRepository.Db.Queryable() .Where(x => x.PalletCode == outStockLockInfo.PalletCode && x.StockStatus == StockStatusEmun.送检完成.ObjToInt()).Includes(x => x.Details).First() ?? throw new Exception("未找到送检单对应库存数据"); List stockInfoDetails = new List(); List DelStockDetails =new List(); if (checkResult.CheckOrderId != 0) { if (checkResult.Quantity < 0 || checkResult.Quantity > checkOrder.ReceivedQuantity) { return content.Error($"数量超出"); } //判断检验结果 if (checkResult.Result == InspectResultEnum.Return.ToString()) { checkOrder.DefectedNote = checkResult.Note; checkOrder.ReturnQuantity += checkResult.Quantity; } else if(checkResult.Result == InspectResultEnum.Defect.ToString()) { checkOrder.DefectedNote = checkResult.Note; checkOrder.DefectedQuantity += checkResult.Quantity; } else if (checkResult.Result == InspectResultEnum.Scrapped.ToString()) { checkOrder.DefectedNote = checkResult.Note; checkOrder.ScrappedQuantity += checkResult.Quantity; } else { return content.Error($"未找到缺陷类型"); } checkOrderResult = new Dt_CheckOrderResult() { Quantity = checkResult.Quantity, CheckOrderId = checkOrderId, DefectCode = checkResult.DefectCode, Result = checkResult.Result, Note = checkResult.Note, SampleCount = checkResult.SampleCount, }; if (Math.Round(checkResult.Quantity,2) == Math.Round(stockInfoDetails.Sum(x=>x.StockQuantity),2)) { DelStockDetails = stockInfo.Details; } else { foreach (var item in stockInfo.Details) { if (checkResult.Quantity == 0) { break; } else if(checkResult.Quantity< item.StockQuantity) { item.StockQuantity -= checkResult.Quantity; item.OutboundQuantity = 0; checkResult.Quantity = 0; stockInfoDetails.Add(item); } else if (checkResult.Quantity >= item.StockQuantity) { checkResult.Quantity = (float)Math.Round((checkResult.Quantity-item.StockQuantity), 2); DelStockDetails.Add(item); } } } } if (IsAccept == InspectAcceptEnum.Accept.ObjToInt()) { checkOrder.Result = InspectAcceptEnum.Accept.ToString(); } else if (IsAccept == InspectAcceptEnum.UnAccept.ObjToInt()) { checkOrder.Result = InspectAcceptEnum.UnAccept.ToString(); } else if (IsAccept == InspectAcceptEnum.DefectAccept.ObjToInt()) { checkOrder.Result = InspectAcceptEnum.DefectAccept.ToString(); } else { return content.Error("未找到检验类型"); } checkOrder.CheckOrderStatus = CheckOrderStatusEnum.Checked.ObjToInt(); if (checkOrderResult != null) { checkOrder.QualifiedQuantity = checkOrder.ReceivedQuantity - checkOrderResult.Quantity; } else { checkOrder.QualifiedQuantity = checkOrder.ReceivedQuantity; } checkOrder.CheckUserName = App.User.UserName; List initialStockDetails = stockInfo.Details.Where(x=> !(stockInfoDetails.Select(v=>v.Id).ToList()).Contains(x.Id)).ToList(); _unitOfWorkManage.BeginTran(); if (checkOrderResult != null) { BaseDal.AddData(checkOrderResult); } //清除库存数量 if (stockInfoDetails.Count>0) { _stockRepository.StockInfoDetailRepository.UpdateData(stockInfoDetails); } if (initialStockDetails.Count>0) { initialStockDetails.ForEach(x => { x.OutboundQuantity = 0; }); _stockRepository.StockInfoDetailRepository.UpdateData(initialStockDetails); } if (DelStockDetails.Count>0) { _stockRepository.StockInfoDetailRepository.DeleteAndMoveIntoHty(DelStockDetails, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); } if (DelStockDetails.Count==stockInfo.Details.Count) { _stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); } //ERP上报 WebResponseContent responseContent = _checkOrderService.FeedbackInspectResult(checkOrder, checkOrderResult != null ? new List { checkOrderResult } : new List()); if (!responseContent.Status) { throw new Exception(responseContent.Message); } checkOrder.UploadStatus = CheckUploadEnum.UploadOk.ObjToInt(); _checkOrderRepository.UpdateData(checkOrder); _unitOfWorkManage.CommitTran(); content.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return content.Error($"{ex.Message}"); } return content; } /// /// 获取检验信息 /// public WebResponseContent GetCheckResultInfo(int checkId) { WebResponseContent content = new WebResponseContent(); try { Dt_CheckOrderResult checkOrderResult = BaseDal.QueryFirst(x => x.CheckOrderId == checkId); content.OK("成功", checkOrderResult); } catch (Exception ex) { content.Error(ex.Message); } return content; } } }