liulijun
2025-11-24 9086b238cd9fbb9fbeae7cab11d59576cd9d2853
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs
@@ -1,20 +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;
@@ -30,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;
        }
@@ -64,6 +73,7 @@
            try
            {
                var barcode = saveModel.MainData["palletCode"].ToString();
                var fridcode = saveModel.MainData["fridCode"].ToString();
                var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
                var materSn = saveModel.MainData["materSn"];
                //直径
@@ -71,30 +81,38 @@
                var weight = saveModel.MainData["weight"].ObjToInt();
                //幅宽
                var wide = saveModel.MainData["wide"].ObjToInt();
                Dt_MaterielInfo? materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x=>x.MaterielCode== materSn);
                var lengthStock = saveModel.MainData["lengthStock"].ObjToInt();
                Dt_MaterielInfo? materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materSn);
                if (materielInfo==null)
                {
                    return content.Error("未找到物料信息");
                }
                Dt_StockInfo stockInfoOld = BaseDal.QueryFirst(x=>x.PalletCode== barcode);
                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("托盘信息已存在");
                    return content.Error("条码信息或RFID信息已存在");
                }
                //生成库存组盘信息
                Dt_StockInfo stockInfo = new Dt_StockInfo()
                {
                    MaterielInvOrgId=materielInfo.MaterielInvOrgId,
                    PalletCode= barcode,
                    LocationCode="",
                    RfidCode= fridcode,
                    LocationCode ="",
                    PalletType = 1,
                    WarehouseId=warehouseId,
                    StockAttribute= materielInfo.MaterielSourceType,
                    StockStatus=StockStatusEmun.手动组盘暂存.ObjToInt(),
                    StockStatus= StockStatusEmun.手动组盘暂存.ObjToInt(),
                    MaterielSpec=materielInfo.MaterielSpec,
                    Unit=materielInfo.MaterielUnit,
                    MaterielThickness=thickness,
                    MaterielWide=wide,
                    StockLength=lengthStock,
                    MaterielWeight=weight,
                    MaterielCode = materielInfo.MaterielCode,
                    MaterielName=materielInfo.MaterielName,
@@ -113,22 +131,151 @@
            }
            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(string materielCode, string batchNo, int warehoseId)
        public List<Dt_StockInfo> GetUseableStocks(int materielId,decimal width, int warehoseId)
        {
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
            return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
            return BaseDal.GetStockInfos(materielId,width, locationCodes);
        }
        public List<Dt_StockInfo> GetUseableStocks(string materielCode, string batchNo, string palletcode, int warehoseId)
        /// <summary>
        /// èŽ·å–ç”Ÿç®¡å¯ä½¿ç”¨åº“å­˜
        /// </summary>
        public List<Dt_StockInfo> GetUseableStocks(string materielCode, decimal width, int warehoseId)
        {
            Dt_StockInfo stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletcode && x.WarehouseId == warehoseId).First();
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(warehoseId);
            List<string> locationCodes = _basicRepository.LocationInfoRepository.GetCanOutLocationCodes(stockInfo.LocationCode);
            return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
            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>();
            //获取库存可用数量
            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;
        }
        /// <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;
        }
    }
}