1
wangxinhui
2025-01-18 a7ceaaa38a4394b82501ca60230e97d25a6871e3
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReceiveOrderDetailService.cs
@@ -5,6 +5,7 @@
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;
@@ -38,11 +39,17 @@
        }
        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.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($"未找到该收货单");
@@ -60,92 +67,151 @@
                {
                    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.Where(x => x.MaterielCode == model.MaterielCode && (x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt() || x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.Receiving.ObjToInt())).FirstOrDefault();
                if (purchaseOrderDetail == null)
                {
                    if (purchaseOrderDetails.Count > 0)
                    {
                        return WebResponseContent.Instance.Error($"该明细收货已完成");
                    }
                    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)
                //判断该采购单明细是否已存在明细
                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($"该明细收货已完成");
                    return WebResponseContent.Instance.Error($"该收货单明细已收货");
                }
                //获取具体批次
                Dt_ReceiveOrderDetail? detail = details.FirstOrDefault(x => x.LotNo == model.LotNo);
                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 += 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();
                    }
                    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<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();
                }
            }
@@ -155,5 +221,61 @@
                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;
        }
    }
}