liulijun
2025-11-24 9086b238cd9fbb9fbeae7cab11d59576cd9d2853
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs
@@ -1,21 +1,27 @@
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;
@@ -31,13 +37,15 @@
        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) : base(BaseDal)
        public StockInfoService(IStockInfoRepository BaseDal, IMapper mapper, IBasicRepository basicRepository, IUnitOfWorkManage unitOfWorkManage,IInvokeERPService invokeERPService) : base(BaseDal)
        {
            _mapper = mapper;
            _basicRepository = basicRepository;
            _unitOfWorkManage = unitOfWorkManage;
            _invokeERPService = invokeERPService;
        }
@@ -123,6 +131,65 @@
            }
            return content;
        }
        /// <summary>
        /// æ›´æ–°è€åŽ‚ç«‹åº“æ®‹å·åº“å­˜
        /// </summary>
        /// <returns></returns>
        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)
        {
@@ -130,6 +197,9 @@
            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);
@@ -178,5 +248,34 @@
            }
            return outStocks;
        }
        /// <summary>
        /// åˆ†é…è€åŽ‚åº“å­˜
        /// </summary>
        /// <returns></returns>
        public List<Dt_StockInfo> GetOutOldStocks(List<Dt_StockInfo> stockInfos, decimal needQuantity)
        {
            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;
        }
    }
}