using WIDESEA_Common.StockEnum;
|
using WIDESEA_DTO.Stock;
|
using WIDESEA_IStockService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_StockService
|
{
|
/// <summary>
|
/// 库存服务
|
/// </summary>
|
public class StockSerivce : IStockService
|
{
|
public IStockInfoDetailService StockInfoDetailService { get; }
|
|
public IStockInfoService StockInfoService { get; }
|
public IStockInfoDetail_HtyService StockInfoDetail_HtyService { get; }
|
|
public IStockInfo_HtyService StockInfo_HtyService { get; }
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
/// <param name="stockInfoDetailService">库存明细服务</param>
|
/// <param name="stockInfoService">库存服务</param>
|
/// <param name="stockInfoDetail_HtyService">库存明细历史服务</param>
|
/// <param name="stockInfo_HtyService">库存历史服务</param>
|
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;
|
}
|
|
/// <summary>
|
/// 组盘
|
/// </summary>
|
/// <param name="stock">组盘数据</param>
|
/// <returns>是否成功</returns>
|
public async Task<bool> 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);
|
}
|
|
/// <summary>
|
/// 换盘
|
/// </summary>
|
/// <param name="stock">需要换盘的明细数据</param>
|
/// <returns>是否成功</returns>
|
public async Task<bool> 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<Dt_StockInfo> { 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);
|
}
|
|
/// <summary>
|
/// 拆盘
|
/// </summary>
|
/// <param name="stock">需要拆盘的明细数据</param>
|
/// <returns>是否成功</returns>
|
public async Task<bool> 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<Dt_StockInfo> { sourceStock }, "拆盘");
|
if (await StockInfo_HtyService.Repository.AddDataAsync(stockHistory) <= 0)
|
{
|
return false;
|
}
|
|
// 删除明细
|
return await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities);
|
}
|
|
private List<Dt_StockInfoDetail_Hty> CreateDetailHistory(IEnumerable<Dt_StockInfoDetail> 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<Dt_StockInfo_Hty> CreateStockHistory(IEnumerable<Dt_StockInfo> 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();
|
}
|
}
|
}
|