wangxinhui
2025-10-26 733c975cd8647f6d006736f1863bad731e32e6fb
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_StockService/StockInfoService.cs
@@ -7,6 +7,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.MaterielEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
@@ -64,6 +65,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,22 +73,29 @@
                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,
@@ -95,6 +104,7 @@
                    Unit=materielInfo.MaterielUnit,
                    MaterielThickness=thickness,
                    MaterielWide=wide,
                    StockLength=lengthStock,
                    MaterielWeight=weight,
                    MaterielCode = materielInfo.MaterielCode,
                    MaterielName=materielInfo.MaterielName,
@@ -114,21 +124,59 @@
            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)
        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;
        }
    }
}