using WIDESEA_Common.StockEnum;
using WIDESEA_DTO.Stock;
using WIDESEA_IStockService;
using WIDESEA_Model.Models;
namespace WIDESEA_StockService
{
///
/// 库存服务
///
public class StockSerivce : IStockService
{
public IStockInfoDetailService StockInfoDetailService { get; }
public IStockInfoService StockInfoService { get; }
public IStockInfoDetail_HtyService StockInfoDetail_HtyService { get; }
public IStockInfo_HtyService StockInfo_HtyService { get; }
///
/// 构造函数
///
/// 库存明细服务
/// 库存服务
/// 库存明细历史服务
/// 库存历史服务
public StockSerivce(IStockInfoDetailService stockInfoDetailService, IStockInfoService stockInfoService, IStockInfoDetail_HtyService stockInfoDetail_HtyService, IStockInfo_HtyService stockInfo_HtyService)
{
StockInfoDetailService = stockInfoDetailService;
StockInfoService = stockInfoService;
StockInfoDetail_HtyService = stockInfoDetail_HtyService;
StockInfo_HtyService = stockInfo_HtyService;
}
///
/// 组盘
///
/// 组盘数据
/// 是否成功
public async Task GroupPallet(StockDTO stock)
{
// 组装明细数据
var now = DateTime.Now;
var details = stock.Details.Select(item => new Dt_StockInfoDetail()
{
MaterielCode = "电芯",
StockQuantity = item.Quantity,
Unit = "PCS",
Creater = "system",
OrderNo = "111",
ProductionDate = now.ToString(),
EffectiveDate = now.AddYears(1).ToString(),
SerialNumber = item.CellBarcode,
InboundOrderRowNo = item.Channel,
MaterielName = "电芯",
Status = StockStatusEmun.组盘暂存.GetHashCode(),
}).ToList();
// 如果托盘已存在,直接新增明细
var existingStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
if (existingStock != null)
{
details.ForEach(detail => detail.StockId = existingStock.Id);
return await StockInfoDetailService.Repository.AddDataAsync(details) > 0;
}
// 托盘不存在则创建并写入明细
var entity = new Dt_StockInfo()
{
PalletCode = stock.TargetPalletNo,
WarehouseId = 1,
StockStatus = 1,
Creater = "system",
Details = details
};
//Dt_Task dt_Task = new Dt_Task()
//{
// TaskNum = 0,
// PalletCode = stock.PalletNo,
// PalletType = 1,
// Roadway = "1",
// TaskType = TaskTypeEnum.Inbound.GetHashCode(),
// TaskStatus = TaskStatusEnum.New.GetHashCode(),
// SourceAddress = stock.LineNo,
// TargetAddress = "组盘区",
// CurrentAddress = stock.LineNo,
// NextAddress = "组盘区",
// WarehouseId = 1,
// Grade = 1,
// Creater = "system",
//};
return StockInfoService.Repository.AddData(entity, x => x.Details);
}
///
/// 换盘
///
/// 需要换盘的明细数据
/// 是否成功
public async Task ChangePallet(StockDTO stock)
{
// 参数校验
if (stock == null || string.IsNullOrWhiteSpace(stock.TargetPalletNo) || string.IsNullOrWhiteSpace(stock.SourcePalletNo))
{
return false;
}
// 新旧托盘一致不处理
if (string.Equals(stock.SourcePalletNo, stock.TargetPalletNo, StringComparison.OrdinalIgnoreCase))
{
return false;
}
// 查询源托盘
var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
if (sourceStock == null)
{
return false;
}
// 查询或创建目标托盘
var targetStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
if (targetStock == null)
{
var newStock = new Dt_StockInfo()
{
PalletCode = stock.TargetPalletNo,
WarehouseId = sourceStock.WarehouseId,
StockStatus = sourceStock.StockStatus,
Creater = "system"
};
var newId = StockInfoService.Repository.AddData(newStock);
if (newId <= 0)
{
return false;
}
targetStock = newStock;
targetStock.Id = newId;
}
// 获取需要转移的条码
var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList();
if (!serialNumbers.Any())
{
return false;
}
// 查询源托盘对应的明细
var detailEntities = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
if (!detailEntities.Any())
{
return false;
}
// 写入历史记录
var detailHistory = CreateDetailHistory(detailEntities, "换盘");
if (await StockInfoDetail_HtyService.Repository.AddDataAsync(detailHistory) <= 0)
{
return false;
}
var stockHistory = CreateStockHistory(new List { sourceStock, targetStock }, "换盘");
if (await StockInfo_HtyService.Repository.AddDataAsync(stockHistory) <= 0)
{
return false;
}
// 更新明细的托盘主键
detailEntities.ForEach(detail => detail.StockId = targetStock.Id);
return await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities);
}
///
/// 拆盘
///
/// 需要拆盘的明细数据
/// 是否成功
public async Task SplitPallet(StockDTO stock)
{
// 参数校验
if (stock == null || string.IsNullOrWhiteSpace(stock.SourcePalletNo))
{
return false;
}
// 查询源托盘
var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
if (sourceStock == null)
{
return false;
}
// 获取需要拆除的条码
var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList();
if (!serialNumbers.Any())
{
return false;
}
// 查询源托盘对应的明细
var detailEntities = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
if (!detailEntities.Any())
{
return false;
}
// 写入历史记录
var detailHistory = CreateDetailHistory(detailEntities, "拆盘");
if (await StockInfoDetail_HtyService.Repository.AddDataAsync(detailHistory) <= 0)
{
return false;
}
var stockHistory = CreateStockHistory(new List { sourceStock }, "拆盘");
if (await StockInfo_HtyService.Repository.AddDataAsync(stockHistory) <= 0)
{
return false;
}
// 删除明细
return await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities);
}
private List CreateDetailHistory(IEnumerable details, string operateType)
{
var now = DateTime.Now;
return details.Select(detail => new Dt_StockInfoDetail_Hty
{
SourceId = detail.Id,
OperateType = operateType,
InsertTime = now,
StockId = detail.StockId,
MaterielCode = detail.MaterielCode,
MaterielName = detail.MaterielName,
OrderNo = detail.OrderNo,
BatchNo = detail.BatchNo,
ProductionDate = detail.ProductionDate,
EffectiveDate = detail.EffectiveDate,
SerialNumber = detail.SerialNumber,
StockQuantity = detail.StockQuantity,
OutboundQuantity = detail.OutboundQuantity,
Status = detail.Status,
Unit = detail.Unit,
InboundOrderRowNo = detail.InboundOrderRowNo,
Remark = detail.Remark,
Creater = detail.Creater,
CreateDate = detail.CreateDate,
Modifier = detail.Modifier,
ModifyDate = detail.ModifyDate
}).ToList();
}
private List CreateStockHistory(IEnumerable stocks, string operateType)
{
var now = DateTime.Now;
return stocks.Select(stock => new Dt_StockInfo_Hty
{
SourceId = stock.Id,
OperateType = operateType,
InsertTime = now,
PalletCode = stock.PalletCode,
PalletType = stock.PalletType,
LocationCode = stock.LocationCode,
WarehouseId = stock.WarehouseId,
StockStatus = stock.StockStatus,
Remark = stock.Remark,
Creater = stock.Creater,
CreateDate = stock.CreateDate,
Modifier = stock.Modifier,
ModifyDate = stock.ModifyDate
}).ToList();
}
}
}