using AutoMapper; using HslCommunication.WebSocket; using Microsoft.AspNetCore.Mvc.RazorPages; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.CodeConfigEnum; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_Core.Utilities; using WIDESEA_DTO; using WIDESEA_DTO.Basic; using WIDESEA_DTO.ERP; using WIDESEA_DTO.Inbound; using WIDESEA_DTO.MES; using WIDESEA_External.ERPService; using WIDESEA_External.Model; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_IInboundRepository; using WIDESEA_IInboundService; using WIDESEA_IRecordService; using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_ITaskInfoRepository; using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; using WIDESEA_StockRepository; namespace WIDESEA_InboundService { public class InboundOrderService : ServiceBase, IInboundOrderService { private readonly IMapper _mapper; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IInboundRepository _inboundRepository; private readonly IBasicRepository _basicRepository; private readonly IStockRepository _stockRepository; private readonly IRecordService _recordService; private readonly IInvokeERPService _invokeERPService; private readonly IWarehouseService _warehouseService; private readonly IPalletTypeInfoRepository _palletTypeInfoRepository; public IInboundOrderRepository Repository => BaseDal; public InboundOrderService(IInboundOrderRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, IStockRepository stockRepository, IRecordService recordService, IInvokeERPService invokeERPService, IWarehouseService warehouseService, IPalletTypeInfoRepository palletTypeInfoRepository) : base(BaseDal) { _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _inboundRepository = inboundRepository; _basicRepository = basicRepository; _stockRepository = stockRepository; _recordService = recordService; _invokeERPService = invokeERPService; _warehouseService = warehouseService; _palletTypeInfoRepository = palletTypeInfoRepository; } /// /// 其他入库单创建 /// /// public WebResponseContent ReceiveWarehousingOrder(ErpInOrderDTO erpInOrder) { WebResponseContent content = new WebResponseContent(); try { //获取仓库信息 Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseCode == erpInOrder.WaId); if (warehouse == null) { return content.Error("未找到仓库信息"); } //获取是否存在订单 Dt_InboundOrder inboundOrder = BaseDal.QueryFirst(x => x.InboundOrderNo == erpInOrder.OrderNo); if (erpInOrder.Way == 1) { if (inboundOrder != null) { } } else if (erpInOrder.Way == 2) { } else { } return content.OK(); } catch (Exception ex) { content.Error(ex.Message); } return content; } public WebResponseContent GetInboundOrders(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { int pageNo = saveModel.MainData["pageNo"].ObjToInt(); string? orderNo = saveModel.MainData["orderNo"].ToString(); int warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); List dt_ReceiveOrders = new List(); if (string.IsNullOrEmpty(orderNo)) { dt_ReceiveOrders = Db.Queryable().Where(x => x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5); } else { dt_ReceiveOrders = Db.Queryable().Where(x => (x.InboundOrderNo.Contains(orderNo)) && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5); } content.OK(data: dt_ReceiveOrders); } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 单个物料码组盘 适用测试架 /// /// /// /// /// public WebResponseContent MaterielGroup(int inboundOrderId, string palletCode, string serNum) { try { Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable().Where(x => x.Id == inboundOrderId).Includes(x => x.Details).First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"未找到入库单信息"); } if (inboundOrder.OrderStatus >= InOrderStatusEnum.入库完成.ObjToInt()) { return WebResponseContent.Instance.Error($"入库单已结束"); } if (inboundOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到入库单明细信息"); } MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis(AnalysisCodeEnum.MatSerNumAnalysis, serNum); Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterielCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到该物料的信息"); } if (materielInfo.WarehouseId != inboundOrder.WarehouseId) { return WebResponseContent.Instance.Error($"该物料不属于本仓"); } Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First(); if (receiveOrder == null) { return WebResponseContent.Instance.Error($"未找到对应的收货单"); } if (receiveOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到对应的收货单明细"); } List purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList(); if (!purchaseOrderNos.Contains(model.PurchaseOrderNo)) { return WebResponseContent.Instance.Error($"未找到对应收货单明细中采购单"); } Dt_ReceiveOrderDetail? receiveOrderDetail = receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode); if (receiveOrderDetail == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息"); } Dt_InboundOrderDetail? inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode); if (inboundOrderDetail == null) { return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息"); } if (inboundOrderDetail.OrderDetailStatus > OrderDetailStatusEnum.GroupAndInbound.ObjToInt()) { return WebResponseContent.Instance.Error($"对应入库单明细已结束"); } float inboundDetailSum = inboundOrderDetail.OverInQuantity + inboundOrderDetail.ReceiptQuantity; if (inboundDetailSum == inboundOrderDetail.OrderQuantity) { return WebResponseContent.Instance.Error($"该物料入库单明细已全部组盘完成"); } if (model.Quantity > receiveOrderDetail.ReceivedQuantity || (inboundDetailSum + model.Quantity) > receiveOrderDetail.ReceivedQuantity) { return WebResponseContent.Instance.Error($"与该收货单明细收货数量不一致"); } Dt_StockInfo oldStockinfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode); if (oldStockinfo != null) { return WebResponseContent.Instance.Error($"托盘重复"); } Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { BatchNo = model.LotNo, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, OrderNo = inboundOrder.InboundOrderNo, SerialNumber = model.SerialNumber, StockQuantity = model.Quantity, OutboundQuantity = 0, Unit = materielInfo.MaterielUnit, Status = StockStatusEmun.组盘暂存.ObjToInt(), ProductionDate = model.ProductionDate, EffectiveDate = model.EffectiveDate, InboundOrderRowNo = inboundOrderDetail.RowNo, }; Dt_StockInfo stockInfo = new Dt_StockInfo() { PalletCode = palletCode, StockStatus = StockStatusEmun.组盘暂存.ObjToInt(), WarehouseId = inboundOrder.WarehouseId, Details = new List { stockInfoDetail } }; inboundOrderDetail.ReceiptQuantity += model.Quantity; _unitOfWorkManage.BeginTran(); if (inboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) { inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt(); } _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail); if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt()) { inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt(); BaseDal.UpdateData(inboundOrder); } _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// 入平库,直接添加库存 /// /// /// /// public WebResponseContent InPinKu(string inboundOrderId, int warehouseId, List serNums) { WebResponseContent content = new WebResponseContent(); try { Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId); if (warehouse == null) { return WebResponseContent.Instance.Error($"未找到该仓库信息"); } Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable().Where(x => x.InboundOrderNo == inboundOrderId && x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"未找到入库单信息"); } if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到入库单明细信息"); } //入库明细原完成数量 int oldCount = inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count; Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First(); if (receiveOrder == null) { return WebResponseContent.Instance.Error($"未找到对应的收货单"); } if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到对应的收货单明细"); } List purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList(); List models = CodeAnalysisHelper.CodeAnalysis(AnalysisCodeEnum.MatSerNumAnalysis, serNums); if (models.Select(x => x.MaterielCode).Distinct().Count() > 1) { return WebResponseContent.Instance.Error($"物料不可混放"); } string materielCode = models.FirstOrDefault()?.MaterielCode ?? ""; Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到该物料的信息"); } List inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode).ToList(); if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0) { return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息"); } foreach (var model in models) { if (!inboundOrderDetails.Any(x => x.BatchNo == model.LotNo)) return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料批次【{model.LotNo}】"); } if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息"); } float beforeQuantity = 0; Dt_StockInfo stockInfo = new Dt_StockInfo() { PalletCode = DateTime.Now.ToString("yyyyMMddHHmmss"), StockStatus = StockStatusEmun.入库完成.ObjToInt(), WarehouseId = inboundOrder.WarehouseId, PalletType = PalletTypeEnum.SmallPallet.ObjToInt(), LocationCode = "平库位", Details = new List() }; List stockInfoDetails = new List(); List detailKeys = new List(); foreach (var model in models) { if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单"); } Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() && x.OrderQuantity == model.Quantity && !detailKeys.Contains(x.Id) && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault(); if (notGroupDetail == null) { return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成"); } detailKeys.Add(notGroupDetail.Id); Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { BatchNo = model.LotNo, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, OrderNo = inboundOrder.InboundOrderNo, SerialNumber = model.SerialNumber, StockQuantity = model.Quantity, OutboundQuantity = 0, Unit = materielInfo.MaterielUnit, Status = StockStatusEmun.入库完成.ObjToInt(), ProductionDate = model.ProductionDate, EffectiveDate = model.EffectiveDate, InboundOrderRowNo = notGroupDetail.RowNo, }; if (stockInfo.Id > 0) { stockInfoDetail.StockId = stockInfo.Id; } stockInfo.Details.Add(stockInfoDetail); stockInfoDetails.Add(stockInfoDetail); notGroupDetail.ReceiptQuantity = model.Quantity; notGroupDetail.OverInQuantity = model.Quantity; notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); } //入库明细新增完成数量 int newCount = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count; if (inboundOrder.Details.Count == (newCount + oldCount)) { inboundOrder.OrderStatus = InOrderStatusEnum.入库完成.ObjToInt(); } else inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt(); float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity); _unitOfWorkManage.BeginTran(); if (stockInfo.Id == 0) { _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); } else { _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand(); } _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails); _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.Inbound); _unitOfWorkManage.CommitTran(); content.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } /// /// 组盘 /// /// /// public WebResponseContent MaterielGroup(SaveModel saveModel) { WebResponseContent content = new WebResponseContent(); try { var orderNo = saveModel.MainData["orderNo"].ToString(); var palletCode = saveModel.MainData["palletCode"].ToString(); var warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); var Initiallife = saveModel.MainData["initiallife"].ObjToInt(); var serNums = saveModel.DelKeys.Select(x => x.ToString()).ToList(); Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId); if (warehouse == null) { return WebResponseContent.Instance.Error($"未找到该仓库信息"); } Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable().Where(x => x.InboundOrderNo == orderNo && x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).First(); if (inboundOrder == null) { return WebResponseContent.Instance.Error($"未找到入库单信息"); } if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到入库单明细信息"); } Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First(); if (receiveOrder == null) { return WebResponseContent.Instance.Error($"未找到对应的收货单"); } if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0) { return WebResponseContent.Instance.Error($"未找到对应的收货单明细"); } List purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList(); List models = CodeAnalysisHelper.CodeAnalysis(AnalysisCodeEnum.MatSerNumAnalysis, serNums); if (models.Select(x => x.MaterielCode).Distinct().Count() > 1) { return WebResponseContent.Instance.Error($"物料不可混放"); } string materielCode = models.FirstOrDefault()?.MaterielCode ?? ""; Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到该物料的信息"); } List inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode).ToList(); if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0) { return WebResponseContent.Instance.Error($"未在入库单明细中找到该物料信息"); } if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该物料信息"); } float beforeQuantity = 0; Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First(); if (stockInfo == null) { stockInfo = new Dt_StockInfo() { PalletCode = palletCode, StockStatus = StockStatusEmun.组盘暂存.ObjToInt(), WarehouseId = inboundOrder.WarehouseId, PalletType = GetPalletType(warehouse, palletCode, materielInfo), Details = new List() }; } else { if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt()) { return WebResponseContent.Instance.Error($"托盘号重复"); } beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity); } if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString()) { stockInfo.Remark = Initiallife.ToString(); string batchNo = models.FirstOrDefault()?.LotNo ?? ""; Dt_StockInfoDetail existDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == batchNo); if (existDetail != null) { return WebResponseContent.Instance.Error($"{batchNo}测试架已存在"); } if (models.Count >= 2) { return WebResponseContent.Instance.Error($"组盘明细不唯一"); } if (palletCode.Substring(0, 1) == "6") { stockInfo.PalletType = PalletTypeEnum.MediumPallet.ObjToInt(); } else { stockInfo.PalletType = PalletTypeEnum.LargestPallet.ObjToInt(); } } List stockInfoDetails = new List(); List detailKeys = new List(); foreach (var model in models) { if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null) { return WebResponseContent.Instance.Error($"未在收货单明细中找到该采购单"); } Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() && x.OrderQuantity == model.Quantity && !detailKeys.Contains(x.Id) && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault(); if (notGroupDetail == null) { return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成"); } detailKeys.Add(notGroupDetail.Id); Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { BatchNo = model.LotNo, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, OrderNo = inboundOrder.InboundOrderNo, SerialNumber = model.SerialNumber, StockQuantity = model.Quantity, OutboundQuantity = 0, Unit = materielInfo.MaterielUnit, Status = StockStatusEmun.组盘暂存.ObjToInt(), ProductionDate = model.ProductionDate, EffectiveDate = model.EffectiveDate, InboundOrderRowNo = notGroupDetail.RowNo, }; if (stockInfo.Id > 0) { stockInfoDetail.StockId = stockInfo.Id; } stockInfo.Details.Add(stockInfoDetail); stockInfoDetails.Add(stockInfoDetail); notGroupDetail.ReceiptQuantity = model.Quantity; notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt(); } float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity); inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt(); _unitOfWorkManage.BeginTran(); if (stockInfo.Id == 0) { _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); } else { _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand(); } _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails); _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup); _unitOfWorkManage.CommitTran(); content.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } public WebResponseContent MaterielGroup(string palletCode, int Initiallife, int warehouseId, List serNums) { WebResponseContent content = new WebResponseContent(); try { Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId); if (warehouse == null) { return WebResponseContent.Instance.Error($"未找到该仓库信息"); } List models = CodeAnalysisHelper.CodeAnalysis(AnalysisCodeEnum.MatSerNumAnalysis, serNums); if (models.Select(x => x.MaterielCode).Distinct().Count() > 1) { return WebResponseContent.Instance.Error($"物料不可混放"); } string materielCode = models.FirstOrDefault()?.MaterielCode ?? ""; Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); if (materielInfo == null) { return WebResponseContent.Instance.Error($"未找到该物料的信息"); } float beforeQuantity = 0; Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First(); if (stockInfo == null) { stockInfo = new Dt_StockInfo() { PalletCode = palletCode, StockStatus = StockStatusEmun.手动组盘暂存.ObjToInt(), WarehouseId = warehouse.WarehouseId, PalletType = GetPalletType(warehouse, palletCode, materielInfo), Details = new List() }; } else { if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt()) { return WebResponseContent.Instance.Error($"托盘号重复"); } beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity); } if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString()) { string batchNo = models.FirstOrDefault()?.LotNo ?? ""; Dt_StockInfoDetail existDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == batchNo); if (existDetail != null) { return WebResponseContent.Instance.Error($"{batchNo}测试架已存在"); } if (models.Count >= 2) { return WebResponseContent.Instance.Error($"组盘明细不唯一"); } stockInfo.Remark = Initiallife.ToString(); if (palletCode.Substring(0, 1) == "6") { stockInfo.PalletType = PalletTypeEnum.MediumPallet.ObjToInt(); } else { stockInfo.PalletType = PalletTypeEnum.LargestPallet.ObjToInt(); } } List stockInfoDetails = new List(); List detailKeys = new List(); foreach (var model in models) { Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() { BatchNo = model.LotNo, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, OrderNo = "", SerialNumber = model.SerialNumber, StockQuantity = model.Quantity, OutboundQuantity = 0, Unit = materielInfo.MaterielUnit, Status = StockStatusEmun.组盘暂存.ObjToInt(), ProductionDate = model.ProductionDate, EffectiveDate = model.EffectiveDate, InboundOrderRowNo = 0, }; if (stockInfo.Id > 0) { stockInfoDetail.StockId = stockInfo.Id; } stockInfo.Details.Add(stockInfoDetail); stockInfoDetails.Add(stockInfoDetail); } float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity); _unitOfWorkManage.BeginTran(); if (stockInfo.Id == 0) { _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); } else { _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand(); } _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup); _unitOfWorkManage.CommitTran(); content.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } /// /// 入库完成上报ERP /// /// public WebResponseContent FeedbackInboundOrder(Dt_StockInfo stockInfo, Dt_InboundOrder inboundOrder, List detailModels) { WebResponseContent content = new WebResponseContent(); try { if (inboundOrder.Details.Count == 0) { return WebResponseContent.Instance.Error($"未找到入库单明细信息"); } if (inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt()) { return WebResponseContent.Instance.Error($"入库单据已完成"); } Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == stockInfo.WarehouseId); if (warehouse == null) { return WebResponseContent.Instance.Error($"未找到仓库信息"); } ERPInboundModel model = new ERPInboundModel() { Code = inboundOrder.InboundOrderNo, CreatorCode = inboundOrder.Creater,//测试 EntDate = inboundOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"), StockDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), SuppliersId = inboundOrder.SupplierId, Type = "S", UniqueTag = inboundOrder.Id.ToString(), WarehouseCode = warehouse.WarehouseCode, Way = 1, Details = detailModels }; //推送ERP 测试注释 _invokeERPService.InvokeInboundOrderApi(model); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } /// /// 入库完成回传到ERP /// /// /// //public WebResponseContent FeedbackInboundOrder(int id) //{ // try // { // Dt_InboundOrder inboundOrder = Db.Queryable().Where(x => x.Id == id).Includes(x => x.Details).First(); // if (inboundOrder == null) // { // return WebResponseContent.Instance.Error($"未找到入库单信息"); // } // if (inboundOrder.Details == null || inboundOrder.Details.Count == 0) // { // return WebResponseContent.Instance.Error($"未找到入库单明细信息"); // } // if (inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt()) // { // return WebResponseContent.Instance.Error($"入库单据已完成"); // } // List stockInfos = Db.Queryable().Where(x => x.Details.Any(v => v.OrderNo == inboundOrder.InboundOrderNo)).Includes(x => x.Details).ToList(); // List warehouses = Db.Queryable().ToList(); // List detailModels = new List(); // foreach (var item in inboundOrder.Details) // { // Dt_StockInfo? stockInfo = stockInfos.FirstOrDefault(x => x.Details.Any(v => v.InboundOrderRowNo == item.RowNo && v.MaterielCode == item.MaterielCode)); // if (stockInfo == null) // { // return WebResponseContent.Instance.Error($"未找到库存信息"); // } // Dt_Warehouse? warehouse = warehouses.FirstOrDefault(x => x.WarehouseId == stockInfo.WarehouseId); // if (warehouse == null) // { // return WebResponseContent.Instance.Error($"未找到仓库信息"); // } // ERPInboundDetailModel detailModel = new ERPInboundDetailModel() // { // ExpiryDate = stockInfo.Details.FirstOrDefault()?.EffectiveDate ?? "", // LocationCode = warehouse.WarehouseCode, // MaterialsCode = item.MaterielCode, // MfgDate = stockInfo.Details.FirstOrDefault()?.ProductionDate ?? "", // QtyCustoms = "0", // Quantity = stockInfo.Details.Sum(x => x.StockQuantity).ToString(), // Rack = stockInfo.LocationCode, // ReceiptCode = inboundOrder.UpperOrderNo, // ReceiptSerNo = item.RowNo.ToString() // }; // detailModels.Add(detailModel); // } // Dt_Warehouse? warehouse2 = warehouses.FirstOrDefault(x => x.WarehouseId == inboundOrder.WarehouseId); // if (warehouse2 == null) // { // return WebResponseContent.Instance.Error($"未找到仓库信息"); // } // ERPInboundModel model = new ERPInboundModel() // { // Code = inboundOrder.InboundOrderNo, // CreatorCode = inboundOrder.Creater,//测试 // EntDate = inboundOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"), // StockDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), // SuppliersId = inboundOrder.SupplierId, // Type = "S", // UniqueTag = inboundOrder.Id.ToString(), // WarehouseCode = warehouse2.WarehouseCode, // Way = 1, // Details = detailModels // }; // //测试注释 // _invokeERPService.InvokeInboundOrderApi(model); // return WebResponseContent.Instance.OK(); // } // catch (Exception ex) // { // return WebResponseContent.Instance.Error(ex.Message); // } //} public int GetPalletType(Dt_Warehouse warehouse, string palletCode, Dt_MaterielInfo materielInfo) { if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString()) { if (palletCode.Substring(0, 1) == "6") { return PalletTypeEnum.MediumPallet.ObjToInt(); } else { return PalletTypeEnum.LargestPallet.ObjToInt(); } } else if (warehouse.WarehouseCode == WarehouseEnum.HA152.ObjToString()) { Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 2)); if (palletTypeInfo == null) { throw new Exception($"托盘号错误"); } return palletTypeInfo.PalletType; } else if (warehouse.WarehouseCode == WarehouseEnum.HA57.ObjToString()) { Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 3)); if (palletTypeInfo == null) { throw new Exception($"托盘号错误"); } return palletTypeInfo.PalletType; } return -1; } } }