using AutoMapper; using MailKit.Search; using System; using System.Collections.Generic; 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; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Helper; using WIDESEA_DTO; using WIDESEA_DTO.Basic; using WIDESEA_DTO.ERP; using WIDESEA_External.ERPService; using WIDESEA_External.Model; using WIDESEA_IBasicRepository; using WIDESEA_ICheckRepository; using WIDESEA_IInboundRepository; using WIDESEA_IInboundService; using WIDESEA_Model.Models; namespace WIDESEA_InboundService { public class ReceiveOrderService : ServiceBase, 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, 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) { if (saveModel.MainData.ContainsKey(nameof(Dt_ReceiveOrder.ReceiveOrderStatus).FirstLetterToLower())) { saveModel.MainData[nameof(Dt_ReceiveOrder.ReceiveOrderStatus).FirstLetterToLower()] = ReceiveOrderStatusEnum.NotStarted.ObjToInt(); } else { saveModel.MainData.Add(nameof(Dt_ReceiveOrder.ReceiveOrderStatus).FirstLetterToLower(), ReceiveOrderStatusEnum.NotStarted.ObjToInt()); } if (saveModel.MainData.ContainsKey(nameof(Dt_ReceiveOrder.UploadStatus).FirstLetterToLower())) { saveModel.MainData[nameof(Dt_ReceiveOrder.UploadStatus).FirstLetterToLower()] = WhetherEnum.False.ObjToInt(); } else { saveModel.MainData.Add(nameof(Dt_ReceiveOrder.UploadStatus).FirstLetterToLower(), WhetherEnum.False.ObjToInt()); } if (saveModel.MainData.ContainsKey(nameof(Dt_ReceiveOrder.ReceiveDate).FirstLetterToLower())) { saveModel.MainData[nameof(Dt_ReceiveOrder.ReceiveDate).FirstLetterToLower()] = DateTime.Now; } else { saveModel.MainData.Add(nameof(Dt_ReceiveOrder.ReceiveDate).FirstLetterToLower(), DateTime.Now); } if (saveModel.MainData.TryGetValue(nameof(Dt_ReceiveOrder.SuppliersId).FirstLetterToLower(), out object? suppliersId) && suppliersId != null && !string.IsNullOrEmpty(suppliersId.ToString())) { Dt_ReceiveOrder receiveOrder = BaseDal.QueryFirst(x => x.SuppliersId == suppliersId.ToString() && x.WarehouseId == Convert.ToInt32(saveModel.MainData[nameof(Dt_ReceiveOrder.WarehouseId).FirstLetterToLower()])); if (receiveOrder != null && receiveOrder.ReceiveOrderStatus != ReceiveOrderStatusEnum.Completed.ObjToInt()) { return WebResponseContent.Instance.Error("该供应商有未完成的收货单"); } } return base.AddData(saveModel); } /// /// 收货完成并回传ERP /// /// /// public WebResponseContent FeedbackReceiveOrder(int orderId) { try { Dt_ReceiveOrder receiveOrder = BaseDal.Db.Queryable().Where(x => x.ReceiveOrderId == orderId).Includes(x => x.Details).First(); if (receiveOrder == null) { return WebResponseContent.Instance.Error($"未找到收货单"); } if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.Completed.ObjToInt()) { 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 recevieOrderDetails = new List(); 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, QtyRecieved = item.ReceivedQuantity.ObjToInt(), Serno = item.RowNo, Supplotno = "", Taxrate = "", }; recevieOrderDetails.Add(recevieOrderDetail); } ERPReceiveModel receiveModel = new ERPReceiveModel() { Code = receiveOrder.ReceiveOrderNo, DeliveryCode = receiveOrder.DeliveryCode, CustomerId = receiveOrder.CustomerId, CreatorId = receiveOrder.Creater, EntDate = receiveOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"), ReceiveDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), SuppliersId = receiveOrder.SuppliersId, Type = Enum.GetName(typeof(ReceiveOrderTypeEnum), receiveOrder.ReceiveOrderType) ?? throw new Exception($"采购单类型错误"), UniqueTag = receiveOrder.ReceiveOrderId.ToString(), WarehouseCode = warehouse.WarehouseCode, Way = 1, Details = recevieOrderDetails }; //更新收货单信息 receiveOrder.ReceiveOrderStatus = ReceiveOrderStatusEnum.Completed.ObjToInt(); receiveOrder.UploadStatus = WhetherEnum.True.ObjToInt(); BaseDal.UpdateData(receiveOrder); //创建入库单 CreateInboundOrder(orderId); //收货推送至ERP 测试注释 _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(); int warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); string orderNo = saveModel.MainData["orderNo"].ToString(); List dt_ReceiveOrders = new List(); if (string.IsNullOrEmpty(orderNo)) { dt_ReceiveOrders = Db.Queryable().Where(x => x.ReceiveOrderStatus < ReceiveOrderStatusEnum.Completed.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5); } else { dt_ReceiveOrders = Db.Queryable().Where(x => (x.ReceiveOrderNo.Contains(orderNo) || x.SuppliersId.Contains(orderNo)) && x.ReceiveOrderStatus < ReceiveOrderStatusEnum.Completed.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5); } content.OK(data: dt_ReceiveOrders); } catch (Exception) { throw; } return content; } /// /// 创建入库单 /// /// 收货单编号 /// public WebResponseContent CreateInboundOrder(int receiveOrderId) { try { Dt_ReceiveOrder receiveOrder = Db.Queryable().Where(x => x.ReceiveOrderId == receiveOrderId).Includes(x => x.Details).First(); if (receiveOrder == null) { return WebResponseContent.Instance.Error($"未找到该收货单信息"); } if (receiveOrder.Details == null || receiveOrder.Details.Count() <= 0) { return WebResponseContent.Instance.Error($"未找到该收货单明细信息"); } if (receiveOrder.ReceiveOrderStatus != ReceiveOrderStatusEnum.Completed.ObjToInt()) { return WebResponseContent.Instance.Error($"该收货单未完成"); } #region 注释 //List checkOrders = _checkOrderRepository.QueryData(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo); //if (checkOrders.FirstOrDefault(x => x.CheckOrderStatus == CheckOrderStatusEnum.NotCheck.ObjToInt()) != null) //{ // return WebResponseContent.Instance.Error($"该收货单未质检完成"); //} //if (checkOrders.FirstOrDefault(x => x.AuditStatus != AuditStatusEnum.Agree.ObjToInt()) != null) //{ // return WebResponseContent.Instance.Error($"该收货单质检结果审批未完成"); //} #endregion Dt_InboundOrder inboundOrder = new Dt_InboundOrder() { UpperOrderNo = receiveOrder.ReceiveOrderNo, CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(), OrderStatus = InOrderStatusEnum.未开始.ObjToInt(), OrderType = InOrderTypeEnum.Purchase.ObjToInt(), WarehouseId = receiveOrder.WarehouseId, SupplierId = receiveOrder.SuppliersId, Details = new List() }; foreach (var item in receiveOrder.Details) { float quantity = item.ReceivedQuantity; #region 注释 //if (item.IfInspection == WhetherEnum.True.ObjToInt()) //{ // Dt_CheckOrder? checkOrder = checkOrders.FirstOrDefault(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo && x.ReceiveDetailRowNo == item.RowNo); // if (checkOrder == null) // { // return WebResponseContent.Instance.Error($"质检单数据错误"); // } // quantity = checkOrder.QualifiedQuantity.GetValueOrDefault() + checkOrder.DefectedQuantity.GetValueOrDefault(); //} #endregion Dt_InboundOrderDetail detail = new Dt_InboundOrderDetail() { MaterielCode = item.MaterielCode, OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(), OrderQuantity = quantity, OverInQuantity = 0, ReceiptQuantity = 0, RowNo = item.RowNo, Unit = item.Unit, BatchNo = item.LotNo }; inboundOrder.Details.Add(detail); } _inboundRepository.InboundOrderRepository.Db.InsertNav(inboundOrder).Include(x => x.Details).ExecuteCommand(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent ReceiveAllOrder(int purchaseOrderId, string lotNo) { try { Dt_PurchaseOrder purchaseOrder = Db.Queryable().Where(x => x.Id == purchaseOrderId).Includes(x => x.Details).First(); if (purchaseOrder == null) { return WebResponseContent.Instance.Error($"未找到该采购单"); } if (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 checkOrders = new List(); List materielInfos = new List(); List receiveOrderDetails = new List(); Dt_ReceiveOrder receiveOrder = BaseDal.Db.Queryable().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); #region 注释 //if (materielInfo.IsCheck == WhetherEnum.True) //{ // Dt_CheckOrder checkOrder = _mapper.Map(receiveOrderDetail); // checkOrder.CheckOrderNo = "TestCheckNo21";//测试 // checkOrder.ReceiveOrderNo = ""; // checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity; // checkOrder.ScrappedQuantity = 0; // checkOrder.ReturnQuantity = 0; // checkOrder.DefectedQuantity = 0; // checkOrder.ReceiveDetailRowNo = rowNo; // checkOrder.UploadStatus = CheckUploadEnum.UploadNo.ObjToInt(); // checkOrders.Add(checkOrder); //} #endregion } 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(receiveOrderDetail); // checkOrder.CheckOrderNo = "Test-CheckNo1";//测试 // checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity; // checkOrder.ScrappedQuantity = 0; // checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo; // checkOrder.ReturnQuantity = 0; // checkOrder.DefectedQuantity = 0; // checkOrder.ReceiveDetailRowNo = rowNo; // checkOrder.UploadStatus = CheckUploadEnum.UploadNo.ObjToInt(); // 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); } //if (checkOrders.Count > 0) //{ // _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); } } } }