wangxinhui
昨天 57148c2264abe80bd3b472f2980104d90dad5c61
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReceiveOrderDetailService.cs
@@ -1,5 +1,6 @@

using AutoMapper;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -8,6 +9,7 @@
using System.Threading.Tasks;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
@@ -15,6 +17,9 @@
using WIDESEA_Core.Helper;
using WIDESEA_DTO;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.QMS;
using WIDESEA_External.Model;
using WIDESEA_External.QMSService;
using WIDESEA_IBasicRepository;
using WIDESEA_ICheckRepository;
using WIDESEA_IInboundRepository;
@@ -32,8 +37,10 @@
        private readonly IBasicRepository _basicRepository;
        private readonly ICheckOrderRepository _checkOrderRepository;
        private readonly IStockRepository _stockRepository;
        private readonly ISupplierInfoRepository _supplierInfoRepository;
        private readonly IInvokeQMSService _invokeQMSService;
        public ReceiveOrderDetailService(IReceiveOrderDetailRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, ICheckOrderRepository checkOrderRepository, IStockRepository stockRepository) : base(BaseDal)
        public ReceiveOrderDetailService(IReceiveOrderDetailRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, ICheckOrderRepository checkOrderRepository, IStockRepository stockRepository,ISupplierInfoRepository supplierInfoRepository,IInvokeQMSService invokeQMSService) : base(BaseDal)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
@@ -41,6 +48,8 @@
            _basicRepository = basicRepository;
            _checkOrderRepository = checkOrderRepository;
            _stockRepository = stockRepository;
            _supplierInfoRepository = supplierInfoRepository;
            _invokeQMSService = invokeQMSService;
        }
        private static object _rowNoLocker = new object();
@@ -54,6 +63,7 @@
        {
            try
            {
                //获取收货单
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == orderNo).Includes(x => x.Details).First();
                if (receiveOrder == null)
                {
@@ -64,11 +74,11 @@
                {
                    return WebResponseContent.Instance.Error($"该单据已收货完成");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == receiveOrder.WarehouseId);
                MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNum);
                //收货增加批次卡控
                //查询收货明细是否有存在同一个批次
                Dt_ReceiveOrderDetail receiveOrderDetailOld = _inboundRepository.ReceiveOrderDetailRepository.QueryFirst(x => x.LotNo == model.LotNo);
                Dt_SupplierInfo supplierInfo = _supplierInfoRepository.QueryFirst(x => x.SupplierCode == receiveOrder.SuppliersId);
                //收货增加批次卡控,查询收货明细是否有存在同一个批次
                Dt_ReceiveOrderDetail receiveOrderDetailOld = _inboundRepository.ReceiveOrderDetailRepository.QueryFirst(x => x.LotNo == model.LotNo && x.MaterielCode == model.MaterielCode);
                Dt_ReceiveOrder? receiveOrderOld = null;
                if (receiveOrderDetailOld!=null)
                {
@@ -79,7 +89,7 @@
                    return WebResponseContent.Instance.Error($"收货单号{receiveOrderOld.ReceiveOrderNo}中批次{model.LotNo}已存在");
                }
                //查询库存批次是否有存在同一个批次
                Dt_StockInfoDetail stockInfoDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == model.LotNo);
                Dt_StockInfoDetail stockInfoDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == model.LotNo && x.MaterielCode == model.MaterielCode);
                Dt_StockInfo? stockInfo = null;
                if (stockInfoDetail!=null)
                {
@@ -89,6 +99,7 @@
                {
                    return WebResponseContent.Instance.Error($"库存{stockInfo.PalletCode}中批次{model.LotNo}已存在");
                }
                //日期格式验证
                if (model!=null)
                {
                    string format = "yyyy-MM-dd"; // ç›®æ ‡æ ¼å¼
@@ -174,6 +185,7 @@
                            if (materielInfo.IsCheck == WhetherEnum.True)
                            {
                                Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
                                checkOrder.OrderType = CheckTypeEnum.ReceiveCheck.ObjToInt();
                                checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo;
                                checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
                                checkOrder.ReceiveDetailRowNo = receiveOrderDetail.RowNo;
@@ -205,7 +217,7 @@
                {
                    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();
                Dt_PurchaseOrderDetail? purchaseOrderDetail = purchaseOrder.Details.Where(x => x.MaterielCode == model.MaterielCode && (x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt() || x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.Receiving.ObjToInt())).OrderBy(x=>x.Id).FirstOrDefault();
                if (purchaseOrderDetail == null)
                {
                    return WebResponseContent.Instance.Error($"该采购单明细收货已完成");
@@ -227,7 +239,7 @@
                        purchaseOrderDetail.PurchaseDetailReceiveQty += model.Quantity;
                        if (purchaseOrderDetail.PurchaseDetailReceiveQty > purchaseOrderDetail.PurchaseDetailQuantity)
                        {
                            return WebResponseContent.Instance.Error($"采购单该物料数量和收货数量不一致");
                            return WebResponseContent.Instance.Error($"采购单行号{purchaseOrderDetail.RowNo}物料{purchaseOrderDetail.MaterielCode}数量溢出:{purchaseOrderDetail.PurchaseDetailReceiveQty - purchaseOrderDetail.PurchaseDetailQuantity}");
                        }
                        if (purchaseOrderDetail.PurchaseDetailReceiveQty == purchaseOrderDetail.PurchaseDetailQuantity)
                        {
@@ -265,8 +277,8 @@
                            ReceivedQuantity = model.Quantity,
                            MaterielCode = model.MaterielCode,
                            LotNo = model.LotNo,
                            MaterielName=materielInfo.MaterielName,
                            MaterielSpec=materielInfo.MaterielSpec,
                            MaterielName = materielInfo.MaterielName,
                            MaterielSpec = materielInfo.MaterielSpec,
                            ReceiveOrderId = receiveOrder.ReceiveOrderId,
                            PurchaseOrderDetailRowNo = purchaseOrderDetail.RowNo,
                            IfInspection = materielInfo.IsCheck.ObjToInt(),
@@ -274,7 +286,8 @@
                            PriceInTax = 0,
                            TaxRate = "",
                            RowNo = rowNo + 1,
                            Unit = purchaseOrderDetail.Unit
                            Unit = purchaseOrderDetail.Unit,
                            IsCheckOk = WhetherEnum.False.ObjToInt()
                        };
                        if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.NotStarted.ObjToInt())
                        {
@@ -295,7 +308,7 @@
                        }
                        if (purchaseOrderDetail.PurchaseDetailReceiveQty > purchaseOrderDetail.PurchaseDetailQuantity)
                        {
                            return WebResponseContent.Instance.Error($"采购单该物料数量和收货数量不一致");
                            return WebResponseContent.Instance.Error($"采购单行号{purchaseOrderDetail.RowNo}物料{purchaseOrderDetail.MaterielCode}数量溢出:{purchaseOrderDetail.PurchaseDetailReceiveQty - purchaseOrderDetail.PurchaseDetailQuantity}");
                        }
                        if (purchaseOrderDetail.PurchaseDetailQuantity == purchaseOrderDetail.PurchaseDetailReceiveQty)
                        {
@@ -313,21 +326,64 @@
                            purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt();
                            _inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder);
                        }
                        if(purchaseOrder.PurchaseOrderStatus== PurchaseOrderStatusEnum.NotReceived.ObjToInt())
                        {
                            purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Receiving.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.ReceiveDetailRowNo = receiveOrderDetail.RowNo;
                        ////    checkOrder.ScrappedQuantity = 0;
                        ////    checkOrder.ReturnQuantity = 0;
                        ////    checkOrder.DefectedQuantity = 0;
                        ////    _checkOrderRepository.AddData(checkOrder);
                        ////}
                        #endregion
                        //物料检验上传
                        if (materielInfo.IsCheck == WhetherEnum.True && (warehouse.WarehouseCode != WarehouseEnum.HA152.ToString() && warehouse.WarehouseCode != WarehouseEnum.HA58.ToString()))
                        {
                            //收货结果上报
                            Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
                            checkOrder.OrderType = CheckTypeEnum.ReceiveCheck.ObjToInt();
                            checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo;
                            checkOrder.Result = CheckAcceptEnum.NotCheckAccept.ToString();
                            checkOrder.QualifiedQuantity = 0;
                            checkOrder.ReceiveDetailRowNo = receiveOrderDetail.RowNo;
                            checkOrder.WarehouseId = receiveOrder.WarehouseId;
                            checkOrder.ScrappedQuantity = 0;
                            checkOrder.MaterielSpec = materielInfo.MaterielSpec;
                            checkOrder.ReturnQuantity = 0;
                            checkOrder.DefectedQuantity = 0;
                            int id = _checkOrderRepository.AddData(checkOrder);
                            QMSReceiveCheckModel qMSReceiveCheck = new QMSReceiveCheckModel()
                            {
                                UniqueTag = id.ToString(),
                                EntryNumber = receiveOrder.ReceiveOrderNo,
                                MaterialCode = receiveOrderDetail.MaterielCode,
                                MaterialName = receiveOrderDetail.MaterielName,
                                Quantity = (decimal)receiveOrderDetail.ReceivedQuantity,
                                SupplierCode = receiveOrder.SuppliersId,
                                SupplierName = supplierInfo.SupplierName,
                                BatchNumber = receiveOrderDetail.LotNo,
                                DeliveryNumber = receiveOrder.DeliveryCode,
                                PurchaseNumber = receiveOrderDetail.PurchaseOrderNo,
                                RowNumber = receiveOrderDetail.RowNo,
                                WarehouseCode = warehouse.WarehouseCode,
                                ReceiptDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                                Remark = " "
                            };
                            //调用QMS来料检验接口
                            string response = _invokeQMSService.InvokeReceiveCheckApi(qMSReceiveCheck);
                            MesResponseContent mesResponseContent = response.DeserializeObject<MesResponseContent>();
                            if (!mesResponseContent.BSucc)
                            {
                                throw new Exception(mesResponseContent.StrMsg);
                            }
                            //QMS回传结果
                            ReceiveResultDTO? receiveResult = JsonConvert.DeserializeObject<ReceiveResultDTO>(mesResponseContent.Content.ToString());
                            if (receiveResult == null)
                            {
                                throw new Exception("接收QMS结果失败");
                            }
                            //更新检验单号
                            Dt_CheckOrder _CheckOrder = _checkOrderRepository.QueryFirst(x => x.CheckOrderId == id);
                            _CheckOrder.CheckOrderNo = receiveResult.InspectionNumber;
                            _checkOrderRepository.UpdateData(_CheckOrder);
                        }
                        _unitOfWorkManage.CommitTran();
                    }