wangxinhui
2024-12-28 39ee9078d88fd4787437360e7f69ed999aaf0b7b
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReceiveOrderDetailService.cs
@@ -49,7 +49,7 @@
        {
            try
            {
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.QueryFirst(x => x.ReceiveOrderNo == orderNo);
                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($"未找到该收货单");
@@ -67,92 +67,141 @@
                {
                    return WebResponseContent.Instance.Error($"未找到该物料的信息");
                }
                Dt_PurchaseOrder purchaseOrder = _inboundRepository.PurchaseOrderRepository.QueryFirst(x => x.PurchaseOrderNo == model.PurchaseOrderNo);
                //该收货单仓库是否有该物料
                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($"该采购单收货已完成");
                }
                List<Dt_PurchaseOrderDetail> 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());
                Dt_PurchaseOrderDetail? purchaseOrderDetail = purchaseOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode && (x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt() || x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.Receiving.ObjToInt()));
                if (purchaseOrderDetail == null)
                {
                    if (purchaseOrderDetails.Count > 0)
                    if (purchaseOrder.Details.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)
                //判断是否存在对应采购明细的收货明细
                Dt_ReceiveOrderDetail? detail = receiveOrder.Details.FirstOrDefault(x => x.PurchaseOrderNo == model.PurchaseOrderNo && x.PurchaseOrderDetailRowNo == purchaseOrderDetail.RowNo);
                if (detail != null && detail.ReceivedQuantity == purchaseOrderDetail.PurchaseDetailQuantity)
                {
                    return WebResponseContent.Instance.Error($"该明细收货已完成");
                    return WebResponseContent.Instance.Error($"该明细已收货");
                }
                lock (_rowNoLocker)
                {
                    int rowNo = 0;
                    List<Dt_ReceiveOrderDetail> receiveOrderDetails = BaseDal.QueryData(x => x.ReceiveOrderId == receiveOrder.ReceiveOrderId);
                    if (receiveOrderDetails != null && receiveOrderDetails.Count > 0)
                    if (detail!=null)
                    {
                        rowNo = receiveOrderDetails.Max(x => x.RowNo);
                        //原有收货明细增加收货数量
                        detail.ReceivedQuantity += model.Quantity;
                        purchaseOrderDetail.PurchaseDetailReceiveQty = detail.ReceivedQuantity;
                        if (purchaseOrderDetail.PurchaseDetailReceiveQty > purchaseOrderDetail.PurchaseDetailQuantity)
                        {
                            return WebResponseContent.Instance.Error($"采购单该物料数量和收货数量不一致");
                        }
                        if(purchaseOrderDetail.PurchaseDetailReceiveQty ==purchaseOrderDetail.PurchaseDetailQuantity)
                        {
                            purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt();
                        }
                        float sumQty = purchaseOrder.Details.Sum(x => x.PurchaseDetailReceiveQty) + model.Quantity;
                        _unitOfWorkManage.BeginTran();
                        if (purchaseOrder.OrderQuantity == sumQty)
                        {
                            purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt();
                            _inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder);
                        }
                        BaseDal.UpdateData(detail);
                        _inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail);
                        _unitOfWorkManage.CommitTran();
                    }
                    Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail()
                    else
                    {
                        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();
                        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();
                        }
                        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();
                    }
                    purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt();
                    _unitOfWorkManage.BeginTran();
                    BaseDal.AddData(receiveOrderDetail);
                    _inboundRepository.ReceiveOrderRepository.UpdateData(receiveOrder);
                    _inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail);
                    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);
                    }
                    _unitOfWorkManage.CommitTran();
                    return WebResponseContent.Instance.OK();
                }
            }