| | |
| | | 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; |
| | |
| | | { |
| | | 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) : base(BaseDal) |
| | | public StockInfoService(IStockInfoRepository BaseDal, IMapper mapper, IBasicRepository basicRepository, IUnitOfWorkManage unitOfWorkManage,IInvokeERPService invokeERPService) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _basicRepository = basicRepository; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _invokeERPService = invokeERPService; |
| | | } |
| | | |
| | | |
| | |
| | | { |
| | | var barcode = saveModel.MainData["barcode"].ToString(); |
| | | var warehouseId = saveModel.MainData["warehouseId"].ObjToInt(); |
| | | Dt_StockInfo stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == barcode && x.WarehouseId == warehouseId).Includes(x => x.Details).First(); |
| | | Dt_StockInfo stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == barcode && x.WarehouseId == warehouseId).First(); |
| | | if (stockInfo == null) throw new Exception("æªæ¾å°æçä¿¡æ¯"); |
| | | return WebResponseContent.Instance.OK(data: stockInfo); |
| | | } |
| | |
| | | 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; |
| | | } |
| | | /// <summary> |
| | | /// |
| | | /// æ´æ°èåç«åºæ®å·åºå |
| | | /// </summary> |
| | | /// <param name="stockInfos"></param> |
| | | /// <param name="materielCode"></param> |
| | | /// <param name="needQuantity"></param> |
| | | /// <param name="residueQuantity"></param> |
| | | /// <returns></returns> |
| | | public List<Dt_StockInfo> GetOutboundStocks(List<Dt_StockInfo> stockInfos, string materielCode, float needQuantity, out float residueQuantity) |
| | | public WebResponseContent UpBSTStock(int operate) |
| | | { |
| | | WebResponseContent content=new WebResponseContent(); |
| | | try |
| | | { |
| | | DateTime dateTime = Convert.ToDateTime("2025-11-01 00:00:00"); |
| | | //è·åææçæ®å·ç«åºåºå |
| | | List<Dt_StockInfo> 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<Dt_StockInfo> stockInfosUp = new List<Dt_StockInfo>(); |
| | | List<Dt_StockInfo> stockInfosDel = new List<Dt_StockInfo>(); |
| | | foreach (var item in stockInfos) |
| | | { |
| | | BSTResponse<BSTStockInfoDTO> bSTResponse = _invokeERPService.BSTStockAsync(item.PalletCode).DeserializeObject<BSTResponse<BSTStockInfoDTO>>(); |
| | | if (bSTResponse.Code == 500) |
| | | { |
| | | content.Message += $"æ¡ç {item.PalletCode}䏿ERPåºåä¸åå¨,"; |
| | | continue; |
| | | } |
| | | 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<Dt_StockInfo> GetUseableStocks(int materielId,decimal width, int warehoseId) |
| | | { |
| | | List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); |
| | | |
| | | return BaseDal.GetStockInfos(materielId,width, locationCodes); |
| | | } |
| | | /// <summary> |
| | | /// è·åç管å¯ä½¿ç¨åºå |
| | | /// </summary> |
| | | public List<Dt_StockInfo> GetUseableStocks(string materielCode, decimal width, int warehoseId) |
| | | { |
| | | List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); |
| | | |
| | | return BaseDal.GetStockInfos(materielCode, width, locationCodes); |
| | | } |
| | | public List<Dt_StockInfo> GetUseableStocks(string materielCode, int warehoseId) |
| | | { |
| | | List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); |
| | | |
| | | return BaseDal.GetStockInfos(materielCode, locationCodes); |
| | | } |
| | | /// <summary> |
| | | /// åé
å®é
åºå |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public List<Dt_StockInfo> GetOutboundStocks(List<Dt_StockInfo> stockInfos, decimal needQuantity) |
| | | { |
| | | List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>(); |
| | | float stockTotalQuantity = stockInfos.Select(x => x.Details.Sum(v => v.StockQuantity - v.OutboundQuantity)).Sum(x => x); |
| | | //stockInfos = stockInfos.OrderBy(x => x.Id).ToList(); |
| | | //è·ååºåå¯ç¨æ°é |
| | | decimal stockTotalQuantity = stockInfos.Sum(x => x.StockLength-x.StockOutLength); |
| | | if (stockTotalQuantity >= needQuantity)//åºåå¤ |
| | | { |
| | | int index = 0; |
| | | while (needQuantity > 0) |
| | | { |
| | | Dt_StockInfo stockInfo = stockInfos[index]; |
| | | float useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); |
| | | if (useableStockQuantity < needQuantity && useableStockQuantity>0) |
| | | decimal useableStockQuantity = stockInfo.StockLength-stockInfo.StockOutLength; |
| | | if (useableStockQuantity < needQuantity && useableStockQuantity > 0) |
| | | { |
| | | stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); |
| | | stockInfo.StockOutLength=stockInfo.StockLength; |
| | | needQuantity -= useableStockQuantity; |
| | | } |
| | | else |
| | | { |
| | | stockInfo.Details.ForEach(x => |
| | | { |
| | | if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) |
| | | { |
| | | if (x.StockQuantity - x.OutboundQuantity >= needQuantity) |
| | | { |
| | | x.OutboundQuantity += needQuantity; |
| | | needQuantity = 0; |
| | | } |
| | | else |
| | | { |
| | | needQuantity -= (x.StockQuantity - x.OutboundQuantity); |
| | | x.OutboundQuantity = x.StockQuantity; |
| | | } |
| | | } |
| | | }); |
| | | stockInfo.StockOutLength += needQuantity; |
| | | needQuantity = 0; |
| | | } |
| | | outStocks.Add(stockInfo); |
| | | index++; |
| | |
| | | } |
| | | else |
| | | { |
| | | for (int i = 0; i < stockInfos.Count; i++) |
| | | { |
| | | Dt_StockInfo stockInfo = stockInfos[i]; |
| | | float useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity); |
| | | if (useableStockQuantity < needQuantity) |
| | | { |
| | | stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity); |
| | | needQuantity -= useableStockQuantity; |
| | | } |
| | | else |
| | | { |
| | | stockInfo.Details.ForEach(x => |
| | | { |
| | | if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode) |
| | | { |
| | | if (x.StockQuantity - x.OutboundQuantity >= needQuantity) |
| | | { |
| | | x.OutboundQuantity += needQuantity; |
| | | needQuantity = 0; |
| | | } |
| | | else |
| | | { |
| | | needQuantity -= (x.StockQuantity - x.OutboundQuantity); |
| | | x.OutboundQuantity = x.StockQuantity; |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | outStocks.Add(stockInfo); |
| | | } |
| | | throw new Exception("åºåä¸è¶³"); |
| | | } |
| | | residueQuantity = needQuantity; |
| | | return outStocks; |
| | | } |
| | | |
| | | public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, int warehoseId) |
| | | /// <summary> |
| | | /// åé
èååºå |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public List<Dt_StockInfo> GetOutOldStocks(List<Dt_StockInfo> stockInfos, decimal needQuantity) |
| | | { |
| | | List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId); |
| | | |
| | | return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes); |
| | | List<Dt_StockInfo> outStocks = new List<Dt_StockInfo>(); |
| | | //è·ååºåå¯ç¨æ°é |
| | | 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; |
| | | } |
| | | |
| | | public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, string palletcode, int warehoseId) |
| | | { |
| | | Dt_StockInfo stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletcode && x.WarehouseId == warehoseId).Includes(x => x.Details).First(); |
| | | |
| | | List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(stockInfo.LocationCode); |
| | | |
| | | return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes); |
| | | } |
| | | |
| | | } |
| | | } |