using AutoMapper; using MailKit.Search; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using OfficeOpenXml.FormulaParsing.Excel.Operators; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.MaterielEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.Basic; using WIDESEA_DTO.ERP; using WIDESEA_DTO.Stock; using WIDESEA_External.ERPService; using WIDESEA_External.Model; using WIDESEA_IBasicRepository; using WIDESEA_IRecordRepository; using WIDESEA_IRecordService; using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_Model.Models; using WIDESEA_StockRepository; namespace WIDESEA_StockService { public partial class StockInfoService : ServiceBase, IStockInfoService { private readonly IMapper _mapper; private readonly IBasicRepository _basicRepository; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IInvokeERPService _invokeERPService; public IStockInfoRepository Repository => BaseDal; public StockInfoService(IStockInfoRepository BaseDal, IMapper mapper, IBasicRepository basicRepository, IUnitOfWorkManage unitOfWorkManage,IInvokeERPService invokeERPService) : base(BaseDal) { _mapper = mapper; _basicRepository = basicRepository; _unitOfWorkManage = unitOfWorkManage; _invokeERPService = invokeERPService; } public WebResponseContent StockQueryData(SaveModel saveModel) { try { var barcode = saveModel.MainData["barcode"].ToString(); var warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); Dt_StockInfo stockInfo = BaseDal.Db.Queryable().Where(x => x.PalletCode == barcode && x.WarehouseId == warehouseId).First(); if (stockInfo == null) throw new Exception("未找到托盘信息"); return WebResponseContent.Instance.OK(data: stockInfo); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } public WebResponseContent ManualMaterielGroup(SaveModel saveModel) { WebResponseContent content=new WebResponseContent(); try { var barcode = saveModel.MainData["palletCode"].ToString(); var fridcode = saveModel.MainData["fridCode"].ToString(); var warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); var materSn = saveModel.MainData["materSn"]; //直径 var thickness = saveModel.MainData["thickness"].ObjToInt(); var weight = saveModel.MainData["weight"].ObjToInt(); //幅宽 var wide = saveModel.MainData["wide"].ObjToInt(); var lengthStock = saveModel.MainData["lengthStock"].ObjToInt(); Dt_MaterielInfo? materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materSn); if (materielInfo==null) { return content.Error("未找到物料信息"); } if (materielInfo.MaterielInvOrgId==MaterielInvOrgEnum.新厂.ObjToInt() && wide<700) { return content.Error("物料幅宽限制为700-2700mm"); } Dt_StockInfo stockInfoOld = BaseDal.QueryFirst(x=>x.PalletCode== barcode || x.RfidCode== fridcode); if (stockInfoOld != null) { return content.Error("条码信息或RFID信息已存在"); } //生成库存组盘信息 Dt_StockInfo stockInfo = new Dt_StockInfo() { MaterielInvOrgId=materielInfo.MaterielInvOrgId, PalletCode= barcode, RfidCode= fridcode, LocationCode ="", PalletType = 1, WarehouseId=warehouseId, StockAttribute= materielInfo.MaterielSourceType, StockStatus= StockStatusEmun.手动组盘暂存.ObjToInt(), MaterielSpec=materielInfo.MaterielSpec, Unit=materielInfo.MaterielUnit, MaterielThickness=thickness, MaterielWide=wide, StockLength=lengthStock, MaterielWeight=weight, MaterielCode = materielInfo.MaterielCode, MaterielName=materielInfo.MaterielName, }; if (wide>1200) { stockInfo.PalletType = 2; } BaseDal.AddData(stockInfo); content.OK("组盘成功"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } /// /// 更新老厂立库残卷库存 /// /// public WebResponseContent UpBSTStock(int operate) { WebResponseContent content=new WebResponseContent(); try { DateTime dateTime = Convert.ToDateTime("2025-11-01 00:00:00"); //获取所有的残卷立库库存 List stockInfos = BaseDal.QueryData(x => x.IsFull == WhetherEnum.True.ObjToInt() && x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.ModifyDate> dateTime); if (operate>0) { //获取所有的老厂缓存区库存 stockInfos = BaseDal.QueryData(x => x.MaterielInvOrgId == MaterielInvOrgEnum.老厂.ObjToInt() && x.WarehouseId==WarehouseEnum.LLDOldCache.ObjToInt()); } List stockInfosUp = new List(); List stockInfosDel = new List(); foreach (var item in stockInfos) { BSTResponse bSTResponse = _invokeERPService.BSTStockAsync(item.PalletCode).DeserializeObject>(); if (bSTResponse.Code == 500) { throw new Exception($"未找到条码{item.PalletCode}一期ERP库存不存在"); } BSTStockInfoDTO bSTStockInfoDTO = bSTResponse.Data ?? throw new Exception($"一期ERP未返回{item.PalletCode}的库存信息"); if (item.StockLength != bSTStockInfoDTO.StockMeter && bSTStockInfoDTO.StockMeter>0) { item.MaterielThickness = bSTStockInfoDTO.Thick; item.MaterielWeight = bSTStockInfoDTO.Qty; item.MaterielWide = bSTStockInfoDTO.W; item.Remark = $"{item.StockLength}-{bSTStockInfoDTO.StockMeter}"; item.StockLength = bSTStockInfoDTO.StockMeter; stockInfosUp.Add(item); } else if(item.StockLength != bSTStockInfoDTO.StockMeter && bSTStockInfoDTO.StockMeter == 0) { stockInfosDel.Add(item); } } //数据库操作 _unitOfWorkManage.BeginTran(); BaseDal.UpdateData(stockInfosUp); if (stockInfosDel.Count>0) { BaseDal.DeleteAndMoveIntoHty(stockInfosDel, App.User.UserId > 0 ? OperateTypeEnum.人工完成 : OperateTypeEnum.自动完成); } _unitOfWorkManage.CommitTran(); content.OK("更新成功"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } public List GetUseableStocks(int materielId,decimal width, int warehoseId) { List locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); return BaseDal.GetStockInfos(materielId,width, locationCodes); } /// /// 获取生管可使用库存 /// public List GetUseableStocks(string materielCode, decimal width, int warehoseId) { List locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); return BaseDal.GetStockInfos(materielCode, width, locationCodes); } public List GetUseableStocks(string materielCode, int warehoseId) { List locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); return BaseDal.GetStockInfos(materielCode, locationCodes); } /// /// 分配实际库存 /// /// public List GetOutboundStocks(List stockInfos, decimal needQuantity) { List outStocks = new List(); //获取库存可用数量 decimal stockTotalQuantity = stockInfos.Sum(x => x.StockLength-x.StockOutLength); if (stockTotalQuantity >= needQuantity)//库存够 { int index = 0; while (needQuantity > 0) { Dt_StockInfo stockInfo = stockInfos[index]; decimal useableStockQuantity = stockInfo.StockLength-stockInfo.StockOutLength; if (useableStockQuantity < needQuantity && useableStockQuantity > 0) { stockInfo.StockOutLength=stockInfo.StockLength; needQuantity -= useableStockQuantity; } else { stockInfo.StockOutLength += needQuantity; needQuantity = 0; } outStocks.Add(stockInfo); index++; } } else { throw new Exception("库存不足"); } return outStocks; } /// /// 分配老厂库存 /// /// public List GetOutOldStocks(List stockInfos, decimal needQuantity) { List outStocks = new List(); //获取库存可用数量 decimal stockTotalQuantity = stockInfos.Sum(x => x.StockLength - x.StockOutLength); int index = 0; while (needQuantity > 0 && (index + 1 <= stockInfos.Count)) { Dt_StockInfo stockInfo = stockInfos[index]; decimal useableStockQuantity = stockInfo.StockLength - stockInfo.StockOutLength; if (useableStockQuantity < needQuantity && useableStockQuantity > 0) { stockInfo.StockOutLength = stockInfo.StockLength; needQuantity -= useableStockQuantity; } else { stockInfo.StockOutLength += needQuantity; needQuantity = 0; } outStocks.Add(stockInfo); index++; } return outStocks; } } }