|   | 
| using AutoMapper; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using WIDESEA_Common.CommonEnum; | 
| using WIDESEA_Common.OrderEnum; | 
| using WIDESEA_Core; | 
| using WIDESEA_Core.BaseRepository; | 
| using WIDESEA_Core.BaseServices; | 
| using WIDESEA_Core.CodeConfigEnum; | 
| using WIDESEA_Core.Helper; | 
| using WIDESEA_DTO.Basic; | 
| using WIDESEA_IBasicRepository; | 
| using WIDESEA_ICheckRepository; | 
| using WIDESEA_IInboundRepository; | 
| using WIDESEA_IInboundService; | 
| using WIDESEA_Model.Models; | 
|   | 
| namespace WIDESEA_InboundService | 
| { | 
|     public class ReceiveOrderDetailService : ServiceBase<Dt_ReceiveOrderDetail, IReceiveOrderDetailRepository>, IReceiveOrderDetailService | 
|     { | 
|         private readonly IMapper _mapper; | 
|         private readonly IUnitOfWorkManage _unitOfWorkManage; | 
|         private readonly IInboundRepository _inboundRepository; | 
|         private readonly IBasicRepository _basicRepository; | 
|         private readonly ICheckOrderRepository _checkOrderRepository; | 
|   | 
|         public ReceiveOrderDetailService(IReceiveOrderDetailRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, ICheckOrderRepository checkOrderRepository) : base(BaseDal) | 
|         { | 
|             _mapper = mapper; | 
|             _unitOfWorkManage = unitOfWorkManage; | 
|             _inboundRepository = inboundRepository; | 
|             _basicRepository = basicRepository; | 
|             _checkOrderRepository = checkOrderRepository; | 
|         } | 
|   | 
|         private static object _rowNoLocker = new object(); | 
|         /// <summary> | 
|         /// 扫码添加收货单明细(单个) | 
|         /// </summary> | 
|         /// <param name="serNum">物料码</param> | 
|         /// <param name="orderNo">收货单号</param> | 
|         /// <returns></returns> | 
|         public WebResponseContent AddReceiveOrderDetail(string serNum, string orderNo) | 
|         { | 
|             try | 
|             { | 
|                 Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == orderNo).Includes(x => x.Details).First(); | 
|                 if (receiveOrder == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该收货单"); | 
|                 } | 
|   | 
|                 if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.Completed.ObjToInt()) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"该单据已收货完成"); | 
|                 } | 
|   | 
|                 MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNum); | 
|   | 
|                 Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterielCode); | 
|                 if (materielInfo == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该物料的信息"); | 
|                 } | 
|                 //该收货单仓库是否有该物料 | 
|                 if (materielInfo.WarehouseId != receiveOrder.WarehouseId) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"该物料不属于该仓库"); | 
|                 } | 
|                 Dt_PurchaseOrder purchaseOrder = _inboundRepository.PurchaseOrderRepository.Db.Queryable<Dt_PurchaseOrder>().Where(x => x.PurchaseOrderNo == model.PurchaseOrderNo).Includes(x => x.Details).First(); | 
|                 if (purchaseOrder == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该采购单"); | 
|                 } | 
|                 if (purchaseOrder.Details.Count == 0) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"未找到该采购单明细数据"); | 
|                 } | 
|                 if (purchaseOrder.SupplierCode != receiveOrder.SuppliersId) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"供应商不一致,请新建收货单"); | 
|                 } | 
|                 if (purchaseOrder.PurchaseOrderStatus == PurchaseOrderStatusEnum.Received.ObjToInt()) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"该采购单收货已完成"); | 
|                 } | 
|                 Dt_PurchaseOrderDetail? purchaseOrderDetail = purchaseOrder.Details.Where(x => x.MaterielCode == model.MaterielCode && (x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt() || x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.Receiving.ObjToInt())).FirstOrDefault(); | 
|                 if (purchaseOrderDetail == null) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"该采购单明细收货已完成"); | 
|                 } | 
|                 //判断该采购单明细是否已存在明细 | 
|                 List<Dt_ReceiveOrderDetail> details = receiveOrder.Details.Where(x => x.PurchaseOrderNo == model.PurchaseOrderNo && x.PurchaseOrderDetailRowNo == purchaseOrderDetail.RowNo && x.MaterielCode == model.MaterielCode).ToList(); | 
|                 if (details.Count >0 && details.Sum(x=>x.ReceivedQuantity) == purchaseOrderDetail.PurchaseDetailQuantity) | 
|                 { | 
|                     return WebResponseContent.Instance.Error($"该收货单明细已收货"); | 
|                 } | 
|                 //获取具体批次 | 
|                 Dt_ReceiveOrderDetail? detail = details.FirstOrDefault(x => x.LotNo == model.LotNo); | 
|                 lock (_rowNoLocker) | 
|                 { | 
|                     if (detail != null) | 
|                     { | 
|                         //原有收货明细增加收货数量 | 
|                         detail.ReceivedQuantity += model.Quantity; | 
|                         purchaseOrderDetail.PurchaseDetailReceiveQty += model.Quantity; | 
|                         if (purchaseOrderDetail.PurchaseDetailReceiveQty > purchaseOrderDetail.PurchaseDetailQuantity) | 
|                         { | 
|                             return WebResponseContent.Instance.Error($"采购单该物料数量和收货数量不一致"); | 
|                         } | 
|                         if (purchaseOrderDetail.PurchaseDetailReceiveQty == purchaseOrderDetail.PurchaseDetailQuantity) | 
|                         { | 
|                             purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt(); | 
|                         } | 
|                         else | 
|                         { | 
|                             purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Receiving.ObjToInt(); | 
|                         } | 
|                         float sumQty = purchaseOrder.Details.Sum(x => x.PurchaseDetailReceiveQty); | 
|                         if (purchaseOrder.OrderQuantity == sumQty) | 
|                         { | 
|                             purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt(); | 
|                         } | 
|                         else | 
|                         { | 
|                             purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Receiving.ObjToInt(); | 
|                         } | 
|                         _unitOfWorkManage.BeginTran(); | 
|                         _inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder); | 
|                         BaseDal.UpdateData(detail); | 
|                         _inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail); | 
|                         _unitOfWorkManage.CommitTran(); | 
|                     } | 
|                     else | 
|                     { | 
|                         int rowNo = 0; | 
|                         if (receiveOrder.Details.Count > 0) | 
|                         { | 
|                             rowNo = receiveOrder.Details.Max(x => x.RowNo); | 
|                         } | 
|                         Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail() | 
|                         { | 
|                             PurchaseOrderNo = model.PurchaseOrderNo, | 
|                             ReceivedQuantity = model.Quantity, | 
|                             MaterielCode = model.MaterielCode, | 
|                             LotNo = model.LotNo, | 
|                             ReceiveOrderId = receiveOrder.ReceiveOrderId, | 
|                             PurchaseOrderDetailRowNo = purchaseOrderDetail.RowNo, | 
|                             IfInspection = materielInfo.IsCheck.ObjToInt(), | 
|                             CurrCode = "", | 
|                             PriceInTax = 0, | 
|                             TaxRate = "", | 
|                             RowNo = rowNo + 1, | 
|                             Unit = purchaseOrderDetail.Unit | 
|                         }; | 
|                         if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.NotStarted.ObjToInt()) | 
|                         { | 
|                             receiveOrder.ReceiveOrderStatus = ReceiveOrderStatusEnum.Receiving.ObjToInt(); | 
|                         } | 
|                         //判断采购明细数量 | 
|                         if (purchaseOrderDetail.PurchaseDetailQuantity < model.Quantity) | 
|                         { | 
|                             return WebResponseContent.Instance.Error($"请核对采购单该物料数量"); | 
|                         } | 
|                         if (purchaseOrderDetail.PurchaseDetailReceiveQty > 0) | 
|                         { | 
|                             purchaseOrderDetail.PurchaseDetailReceiveQty += model.Quantity; | 
|                         } | 
|                         else | 
|                         { | 
|                             purchaseOrderDetail.PurchaseDetailReceiveQty = model.Quantity; | 
|                         } | 
|                         if (purchaseOrderDetail.PurchaseDetailReceiveQty > purchaseOrderDetail.PurchaseDetailQuantity) | 
|                         { | 
|                             return WebResponseContent.Instance.Error($"采购单该物料数量和收货数量不一致"); | 
|                         } | 
|                         if (purchaseOrderDetail.PurchaseDetailQuantity == purchaseOrderDetail.PurchaseDetailReceiveQty) | 
|                         { | 
|                             purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt(); | 
|                         } | 
|                         else | 
|                         { | 
|                             purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Receiving.ObjToInt(); | 
|                         } | 
|                         float sumQty = purchaseOrder.Details.Sum(x => x.PurchaseDetailReceiveQty); //+ model.Quantity | 
|                         _unitOfWorkManage.BeginTran(); | 
|                         BaseDal.AddData(receiveOrderDetail); | 
|                         if (purchaseOrder.OrderQuantity == sumQty) | 
|                         { | 
|                             purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt(); | 
|                             _inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder); | 
|                         } | 
|                         _inboundRepository.ReceiveOrderRepository.UpdateData(receiveOrder); | 
|                         _inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail); | 
|                         #region 注释 | 
|                         //if (materielInfo.IsCheck == WhetherEnum.True) | 
|                         //{ | 
|                         //    Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail); | 
|                         //    checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo; | 
|                         //    checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity; | 
|                         //    checkOrder.ScrappedQuantity = 0; | 
|                         //    checkOrder.ReturnQuantity = 0; | 
|                         //    checkOrder.DefectedQuantity = 0; | 
|                         //    _checkOrderRepository.AddData(checkOrder); | 
|                         //} | 
|                         #endregion | 
|                         _unitOfWorkManage.CommitTran(); | 
|                     } | 
|   | 
|                     return WebResponseContent.Instance.OK(); | 
|                 } | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 _unitOfWorkManage.RollbackTran(); | 
|                 return WebResponseContent.Instance.Error(ex.Message); | 
|             } | 
|         } | 
|         public WebResponseContent ScaninnerCode(string innerCode) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 var innerCodes = innerCode.Split(','); | 
|                 var matCode = innerCodes.FirstOrDefault(x => x.Contains("M:"));//.Replace("M:", ""); | 
|                 if (matCode == null) throw new Exception("未获取到物料码"); | 
|                 var batchNo = innerCodes.FirstOrDefault(x => x.Contains("BS:"));//.Replace("BS:", "") | 
|                 if (batchNo == null) throw new Exception("未获取到批次号"); | 
|                 var purchaseOrderNo = innerCodes.FirstOrDefault(x => x.Contains("PO:"));//.Replace("PO:", "") | 
|                 if (purchaseOrderNo == null) throw new Exception("未获取到采购单号"); | 
|                 var qty = innerCodes.FirstOrDefault(x => x.Contains("Q:")); | 
|                 if (qty == null) throw new Exception("未获取到数量"); | 
|                 InnerCodeDTO innerCodeDTO = new InnerCodeDTO() | 
|                 { | 
|                     matCode = matCode.Replace("M:", ""), | 
|                     batchNo = batchNo.Replace("BS:", ""), | 
|                     purchaseOrderNo = purchaseOrderNo.Replace("PO:", ""), | 
|                     qty = Convert.ToInt32(qty.Replace("Q:", "")) | 
|                 }; | 
|                 content.OK("扫描成功", data: innerCodeDTO); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 content.Error(ex.Message); | 
|             } | 
|             return content; | 
|         } | 
|         public WebResponseContent GetReceiveOrderInfos(SaveModel saveModel) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 string searchValue = saveModel.MainData["searchValue"].ToString(); | 
|                 string orderNo = saveModel.MainData["orderNo"].ToString(); | 
|                 Dt_ReceiveOrder receiveOrder = Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == orderNo).First(); | 
|                 if (receiveOrder == null) throw new Exception($"未找到单据编号【{orderNo}】信息"); | 
|                 List<Dt_ReceiveOrderDetail> receiveOrderDetails = new List<Dt_ReceiveOrderDetail>(); | 
|                 if (string.IsNullOrEmpty(searchValue)) | 
|                 { | 
|                     receiveOrderDetails = Db.Queryable<Dt_ReceiveOrderDetail>().Where(x => x.ReceiveOrderId == receiveOrder.ReceiveOrderId).ToList(); | 
|                 } | 
|                 else | 
|                 { | 
|                     receiveOrderDetails = Db.Queryable<Dt_ReceiveOrderDetail>().Where(x => x.ReceiveOrderId == receiveOrder.ReceiveOrderId && x.MaterielCode == searchValue).ToList(); | 
|                 } | 
|   | 
|                 content.OK(data: receiveOrderDetails); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 content.Error(ex.Message); | 
|             } | 
|             return content; | 
|         } | 
|     } | 
| } |