helongyang
13 小时以前 dc06f58d8ed537555fd529551180f43a0586ec3f
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReceiveOrderDetailService.cs
@@ -1,7 +1,9 @@

using AutoMapper;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -12,11 +14,16 @@
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.CodeConfigEnum;
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;
using WIDESEA_IInboundService;
using WIDESEA_IStockRepository;
using WIDESEA_Model.Models;
namespace WIDESEA_InboundService
@@ -28,14 +35,20 @@
        private readonly IInboundRepository _inboundRepository;
        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) : 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;
            _inboundRepository = inboundRepository;
            _basicRepository = basicRepository;
            _checkOrderRepository = checkOrderRepository;
            _stockRepository = stockRepository;
            _supplierInfoRepository = supplierInfoRepository;
            _invokeQMSService = invokeQMSService;
        }
        private static object _rowNoLocker = new object();
@@ -59,9 +72,56 @@
                {
                    return WebResponseContent.Instance.Error($"该单据已收货完成");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == receiveOrder.WarehouseId);
                MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNum);
                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)
                {
                    receiveOrderOld = _inboundRepository.ReceiveOrderRepository.QueryFirst(x => x.ReceiveOrderId == receiveOrderDetailOld.ReceiveOrderId);
                }
                if (receiveOrderDetailOld!=null && receiveOrderOld?.WarehouseId== receiveOrder.WarehouseId)
                {
                    return WebResponseContent.Instance.Error($"收货单号{receiveOrderOld.ReceiveOrderNo}中批次{model.LotNo}已存在");
                }
                //查询库存批次是否有存在同一个批次
                Dt_StockInfoDetail stockInfoDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == model.LotNo && x.MaterielCode == model.MaterielCode);
                Dt_StockInfo? stockInfo = null;
                if (stockInfoDetail!=null)
                {
                    stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.Id == stockInfoDetail.Id);
                }
                if (stockInfoDetail!=null && stockInfo?.WarehouseId==receiveOrder.WarehouseId)
                {
                    return WebResponseContent.Instance.Error($"库存{stockInfo.PalletCode}中批次{model.LotNo}已存在");
                }
                if (model!=null)
                {
                    string format = "yyyy-MM-dd"; // ç›®æ ‡æ ¼å¼
                    DateTime parsedDate;
                    // è§£æžéªŒè¯æ ¼å¼
                    bool isValidEffDate = DateTime.TryParseExact(
                        model.EffectiveDate,
                        format,
                        CultureInfo.InvariantCulture,
                        DateTimeStyles.None,
                        out parsedDate
                    );
                    bool isValidProDate = DateTime.TryParseExact(
                        model.ProductionDate,
                        format,
                        CultureInfo.InvariantCulture,
                        DateTimeStyles.None,
                        out parsedDate
                    );
                    if (!isValidEffDate || !isValidProDate)
                    {
                        return WebResponseContent.Instance.Error("格式无效或日期不合法");
                    }
                }
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterielCode);
                if (materielInfo == null)
                {
@@ -122,6 +182,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;
@@ -153,7 +214,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($"该采购单明细收货已完成");
@@ -175,7 +236,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)
                        {
@@ -243,7 +304,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)
                        {
@@ -261,21 +322,60 @@
                            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)
                        {
                            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);
                            }
                            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();
                    }