using AutoMapper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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, 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(); public WebResponseContent AddReceiveOrderDetail(string serNum, string orderNo) { try { Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.QueryFirst(x => x.ReceiveOrderNo == orderNo); if (receiveOrder == null) { return WebResponseContent.Instance.Error($"未找到该收货单"); } if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.Completed.ObjToInt()) { return WebResponseContent.Instance.Error($"该单据已收货完成"); } MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis(AnalysisCodeEnum.MatSerNumAnalysis, serNum); Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterielCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到该物料的信息"); } Dt_PurchaseOrder purchaseOrder = _inboundRepository.PurchaseOrderRepository.QueryFirst(x => x.PurchaseOrderNo == model.PurchaseOrderNo); if (purchaseOrder == null) { return WebResponseContent.Instance.Error($"未找到该采购单"); } if (purchaseOrder.SupplierCode != receiveOrder.SuppliersId) { return WebResponseContent.Instance.Error($"供应商不一致,请新建收货单"); } if (purchaseOrder.PurchaseOrderStatus == PurchaseOrderStatusEnum.Received.ObjToInt()) { return WebResponseContent.Instance.Error($"该采购单收货已完成"); } List purchaseOrderDetails = _inboundRepository.PurchaseOrderDetailRepository.QueryData(x => x.PurchaseOrderId == purchaseOrder.Id); if (purchaseOrderDetails == null || purchaseOrderDetails.Count == 0) { return WebResponseContent.Instance.Error($"未找到该采购单明细数据"); } Dt_PurchaseOrderDetail? purchaseOrderDetail = purchaseOrderDetails.FirstOrDefault(x => x.PurchaseDetailQuantity == model.Quantity && x.MaterielCode == model.MaterielCode && x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt()); if (purchaseOrderDetail == null) { if (purchaseOrderDetails.Count > 0) { return WebResponseContent.Instance.Error($"该明细收货已完成"); } return WebResponseContent.Instance.Error($"未找到对应的采购单明细数据"); } Dt_ReceiveOrderDetail detail = BaseDal.QueryFirst(x => x.PurchaseOrderNo == model.PurchaseOrderNo && x.PurchaseOrderDetailRowNo == purchaseOrderDetail.RowNo); if (detail != null) { return WebResponseContent.Instance.Error($"该明细收货已完成"); } lock (_rowNoLocker) { int rowNo = 0; List receiveOrderDetails = BaseDal.QueryData(x => x.ReceiveOrderId == receiveOrder.ReceiveOrderId); if (receiveOrderDetails != null && receiveOrderDetails.Count > 0) { rowNo = receiveOrderDetails.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(); } purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt(); _unitOfWorkManage.BeginTran(); BaseDal.AddData(receiveOrderDetail); _inboundRepository.ReceiveOrderRepository.UpdateData(receiveOrder); _inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail); if (materielInfo.IsCheck == WIDESEA_Common.CommonEnum.WhetherEnum.True) { Dt_CheckOrder checkOrder = _mapper.Map(receiveOrderDetail); checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo; checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity; checkOrder.ScrappedQuantity = 0; checkOrder.ReturnQuantity = 0; checkOrder.DefectedQuantity = 0; _checkOrderRepository.AddData(checkOrder); } _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } } }