hutongqing
2024-12-23 a7f9f1c44f6a1201061e12dbb4c5424f4b44737c
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/ReceiveOrderService.cs
@@ -1,4 +1,6 @@
using System;
using AutoMapper;
using MailKit.Search;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -6,8 +8,13 @@
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.Basic;
using WIDESEA_External.ERPService;
using WIDESEA_External.Model;
using WIDESEA_IBasicRepository;
using WIDESEA_ICheckRepository;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
@@ -17,13 +24,21 @@
{
    public class ReceiveOrderService : ServiceBase<Dt_ReceiveOrder, IReceiveOrderRepository>, IReceiveOrderService
    {
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IMapper _mapper;
        private readonly ICheckOrderRepository _checkOrderRepository;
        private readonly IInboundRepository _inboundRepository;
        private readonly IBasicRepository _basicRepository;
        private readonly IInvokeERPService _invokeERPService;
        public ReceiveOrderService(IReceiveOrderRepository BaseDal, ICheckOrderRepository checkOrderRepository, IInboundRepository inboundRepository) : base(BaseDal)
        public ReceiveOrderService(IReceiveOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper, ICheckOrderRepository checkOrderRepository, IInboundRepository inboundRepository, IBasicRepository basicRepository, IInvokeERPService invokeERPService) : base(BaseDal)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
            _checkOrderRepository = checkOrderRepository;
            _inboundRepository = inboundRepository;
            _basicRepository = basicRepository;
            _invokeERPService = invokeERPService;
        }
        public override WebResponseContent AddData(SaveModel saveModel)
@@ -63,6 +78,101 @@
            }
            return base.AddData(saveModel);
        }
        public WebResponseContent FeedbackReceiveOrder(int orderId)
        {
            try
            {
                Dt_ReceiveOrder receiveOrder = BaseDal.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderId == orderId).Includes(x => x.Details).First();
                if (receiveOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到收货单");
                }
                if (receiveOrder.Details == null || receiveOrder.Details.Count == 0)
                {
                    return WebResponseContent.Instance.Error($"未找到收货单明细");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == receiveOrder.WarehouseId);
                if (warehouse == null)
                {
                    return WebResponseContent.Instance.Error($"未找到仓库信息");
                }
                List<RecevieOrderDetailModel> recevieOrderDetails = new List<RecevieOrderDetailModel>();
                foreach (var item in receiveOrder.Details)
                {
                    RecevieOrderDetailModel recevieOrderDetail = new RecevieOrderDetailModel()
                    {
                        Currcode = "",
                        IfInspection = item.IfInspection,
                        Lotno = item.LotNo,
                        MaterialsId = item.MaterielCode,
                        PriceInTax = 0,
                        PurchaseOrderCode = item.PurchaseOrderNo,
                        PurchaseOrderSerno = item.PurchaseOrderDetailRowNo,
                        QtyReceived = item.ReceivedQuantity,
                        Serno = item.RowNo,
                        Supplotno = "",
                        Taxrate = ""
                    };
                    recevieOrderDetails.Add(recevieOrderDetail);
                }
                ERPReceiveModel receiveModel = new ERPReceiveModel()
                {
                    Code = receiveOrder.ReceiveOrderNo,
                    CompanyId = "",
                    DeliveryCode = receiveOrder.DeliveryCode,
                    CustomerId = receiveOrder.CustomerId,
                    CreatorId = receiveOrder.Creater,
                    EndDate = receiveOrder.CreateDate,
                    ReceiveDate = receiveOrder.CreateDate,
                    PlantsId = "",
                    SuppliersId = receiveOrder.SuppliersId,
                    Type = "PO",
                    UniqueTag = receiveOrder.ReceiveOrderId.ToString(),
                    WarehouseCode = warehouse.WarehouseCode,
                    Way = 1,
                    Details = recevieOrderDetails
                };
                string response = _invokeERPService.InvokeMatReceiveApi(receiveModel);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent GetReceiveOrders(SaveModel saveModel)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                int pageNo = saveModel.MainData["pageNo"].ObjToInt();
                string orderNo = saveModel.MainData["orderNo"].ToString();
                List<Dt_ReceiveOrder> dt_ReceiveOrders = new List<Dt_ReceiveOrder>();
                if (string.IsNullOrEmpty(orderNo))
                {
                    dt_ReceiveOrders = Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderStatus < ReceiveOrderStatusEnum.Completed.ObjToInt()).ToPageList(pageNo, 5);
                }
                else
                {
                    dt_ReceiveOrders = Db.Queryable<Dt_ReceiveOrder>().Where(x => (x.ReceiveOrderNo.Contains(orderNo) || x.SuppliersId.Contains(orderNo)) && x.ReceiveOrderStatus < ReceiveOrderStatusEnum.Completed.ObjToInt()).ToPageList(pageNo, 5);
                }
                content.OK(data: dt_ReceiveOrders);
            }
            catch (Exception)
            {
                throw;
            }
            return content;
        }
        public WebResponseContent CreateInboundOrder(int receiveOrderId)
@@ -140,5 +250,163 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent ReceiveAllOrder(int purchaseOrderId, string lotNo)
        {
            try
            {
                Dt_PurchaseOrder purchaseOrder = Db.Queryable<Dt_PurchaseOrder>().Where(x => x.Id == purchaseOrderId).Includes(x => x.Details).First();
                if (purchaseOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该采购单");
                }
                if (purchaseOrder.Details == null || purchaseOrder.Details.Count == 0)
                {
                    return WebResponseContent.Instance.Error($"未找到采购单明细信息");
                }
                if (purchaseOrder.PurchaseOrderStatus == PurchaseOrderStatusEnum.Received.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"已收货完成");
                }
                if (purchaseOrder.Details.FirstOrDefault(x => x.PurchaseDetailStatus == PurchaseOrderStatusEnum.NotReceived.ObjToInt()) == null)
                {
                    return WebResponseContent.Instance.Error($"已收货完成");
                }
                List<Dt_CheckOrder> checkOrders = new List<Dt_CheckOrder>();
                List<Dt_MaterielInfo> materielInfos = new List<Dt_MaterielInfo>();
                List<Dt_ReceiveOrderDetail> receiveOrderDetails = new List<Dt_ReceiveOrderDetail>();
                Dt_ReceiveOrder receiveOrder = BaseDal.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.SuppliersId == purchaseOrder.SupplierCode && x.ReceiveOrderStatus != ReceiveOrderStatusEnum.Completed.ObjToInt()).Includes(x => x.Details).First();
                if (receiveOrder == null)
                {
                    int rowNo = 0;
                    foreach (var item in purchaseOrder.Details)
                    {
                        Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode);
                        if (materielInfo == null)
                        {
                            materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == item.MaterielCode);
                            if (materielInfo == null)
                            {
                                return WebResponseContent.Instance.Error($"未找到该物料的信息");
                            }
                            materielInfos.Add(materielInfo);
                        }
                        Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail()
                        {
                            PurchaseOrderNo = purchaseOrder.PurchaseOrderNo,
                            ReceivedQuantity = item.PurchaseDetailQuantity,
                            MaterielCode = item.MaterielCode,
                            LotNo = lotNo,
                            PurchaseOrderDetailRowNo = item.RowNo,
                            IfInspection = materielInfo.IsCheck.ObjToInt(),
                            CurrCode = "",
                            PriceInTax = 0,
                            TaxRate = "",
                            RowNo = rowNo + 1,
                            Unit = item.Unit
                        };
                        rowNo += 1;
                        receiveOrderDetails.Add(receiveOrderDetail);
                        if (materielInfo.IsCheck == WhetherEnum.True)
                        {
                            Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
                            checkOrder.ReceiveOrderNo = "";
                            checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
                            checkOrder.ScrappedQuantity = 0;
                            checkOrder.ReturnQuantity = 0;
                            checkOrder.DefectedQuantity = 0;
                            checkOrder.ReceiveDetailRowNo = rowNo;
                            checkOrders.Add(checkOrder);
                        }
                    }
                    receiveOrder = new Dt_ReceiveOrder()
                    {
                        ReceiveOrderStatus = ReceiveOrderStatusEnum.Receiving.ObjToInt(),
                        CustomerId = "",
                        DeliveryCode = "",
                        ReceiveDate = DateTime.Now,
                        ReceiveOrderType = ReceiveOrderTypeEnum.PO.ObjToInt(),
                        SuppliersId = purchaseOrder.SupplierCode,
                        WarehouseId = purchaseOrder.Details.FirstOrDefault()?.WarehouseId ?? 0,
                        UploadStatus = WhetherEnum.False.ObjToInt(),
                        Details = receiveOrderDetails
                    };
                }
                else
                {
                    int rowNo = receiveOrder.Details.Count > 0 ? receiveOrder.Details.Max(x => x.RowNo) : 0;
                    foreach (var item in purchaseOrder.Details)
                    {
                        Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode);
                        if (materielInfo == null)
                        {
                            materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == item.MaterielCode);
                            if (materielInfo == null)
                            {
                                return WebResponseContent.Instance.Error($"未找到该物料的信息");
                            }
                            materielInfos.Add(materielInfo);
                        }
                        Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail()
                        {
                            PurchaseOrderNo = purchaseOrder.PurchaseOrderNo,
                            ReceivedQuantity = item.PurchaseDetailQuantity,
                            MaterielCode = item.MaterielCode,
                            LotNo = lotNo,
                            ReceiveOrderId = receiveOrder.ReceiveOrderId,
                            PurchaseOrderDetailRowNo = item.RowNo,
                            IfInspection = materielInfo.IsCheck.ObjToInt(),
                            CurrCode = "",
                            PriceInTax = 0,
                            TaxRate = "",
                            RowNo = rowNo + 1,
                            Unit = item.Unit,
                        };
                        rowNo += 1;
                        receiveOrderDetails.Add(receiveOrderDetail);
                        if (materielInfo.IsCheck == WhetherEnum.True)
                        {
                            Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
                            checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
                            checkOrder.ScrappedQuantity = 0;
                            checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo;
                            checkOrder.ReturnQuantity = 0;
                            checkOrder.DefectedQuantity = 0;
                            checkOrder.ReceiveDetailRowNo = rowNo;
                            checkOrders.Add(checkOrder);
                        }
                    }
                }
                purchaseOrder.Details.ForEach(x => x.PurchaseDetailStatus = PurchaseOrderStatusEnum.Received.ObjToInt());
                purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt();
                _unitOfWorkManage.BeginTran();
                if (receiveOrder.ReceiveOrderId > 0)
                {
                    Db.Insertable(receiveOrderDetails).ExecuteCommand();
                }
                else
                {
                    Db.InsertNav(receiveOrder).Include(x => x.Details).ExecuteCommand();
                    checkOrders.ForEach(x => x.ReceiveOrderNo = receiveOrder.ReceiveOrderNo);
                }
                _checkOrderRepository.AddData(checkOrders);
                _inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder);
                _inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrder.Details);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
    }
}