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<Dt_StockInfo, IStockInfoRepository>, 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<Dt_StockInfo>().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;
|
}
|
/// <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)
|
{
|
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<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>();
|
//获取库存可用数量
|
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;
|
}
|
}
|
}
|