|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
using Volo.Abp;
|
|
|
|
using Volo.Abp.Domain.Repositories;
|
|
|
|
using Volo.Abp.Domain.Services;
|
|
|
|
using Volo.Abp.ObjectMapping;
|
|
|
|
using Win_in.Sfs.Basedata.Domain.Shared;
|
|
|
|
|
|
|
|
namespace Win_in.Sfs.Basedata.Domain;
|
|
|
|
public class SplitPackingRecManager : DomainService, ISplitPackingRecManager
|
|
|
|
{
|
|
|
|
private readonly ISplitPackingRecRepository _repository;
|
|
|
|
private readonly IObjectMapper _autoMapper;
|
|
|
|
//private readonly ILabelDefinitionManager _labelDefinitionManager;
|
|
|
|
|
|
|
|
public SplitPackingRecManager(ISplitPackingRecRepository repository, IObjectMapper autoMapper) //, ILabelDefinitionManager labelDefinitionManager
|
|
|
|
{
|
|
|
|
_repository = repository;
|
|
|
|
_autoMapper = autoMapper;
|
|
|
|
//_labelDefinitionManager = labelDefinitionManager;
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task<bool> BatchInsertAsync(List<SplitPackingRec> input)
|
|
|
|
{
|
|
|
|
var query = await _repository.GetQueryableAsync().ConfigureAwait(false);
|
|
|
|
foreach (SplitPackingRec item in input)
|
|
|
|
{
|
|
|
|
#region 校验
|
|
|
|
if (item.OprType == OprTypeEnum.SplitBox || item.OprType == OprTypeEnum.MergeBox) //拆箱或合箱
|
|
|
|
{
|
|
|
|
if (item.FromPackingCode == item.ToPackingCode)
|
|
|
|
{
|
|
|
|
throw new UserFriendlyException("操作类型是拆箱或合箱状态,源箱码和目标箱码不能相同!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else //入库
|
|
|
|
{
|
|
|
|
if (item.FromPackingCode != item.ToPackingCode)
|
|
|
|
{
|
|
|
|
throw new UserFriendlyException("操作类型不是拆箱或合箱状态,源箱码和目标箱码必须相同!");
|
|
|
|
}
|
|
|
|
if (item.FromTopPackingCode.IsNullOrEmpty())
|
|
|
|
{
|
|
|
|
item.FromTopPackingCode = item.FromPackingCode;
|
|
|
|
}
|
|
|
|
if (item.ToTopPackingCode.IsNullOrEmpty())
|
|
|
|
{
|
|
|
|
item.ToTopPackingCode = item.ToPackingCode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
if (item.OprType == OprTypeEnum.SplitBox || item.OprType == OprTypeEnum.MergeBox)
|
|
|
|
{
|
|
|
|
//设置顶级箱码
|
|
|
|
item.FromTopPackingCode = GetTopPackingCode(query, item.FromPackingCode);
|
|
|
|
item.ToTopPackingCode = GetTopPackingCode(query, item.ToPackingCode);
|
|
|
|
if (item.FromTopPackingCode.IsNullOrEmpty())
|
|
|
|
{
|
|
|
|
item.FromTopPackingCode = item.FromPackingCode;
|
|
|
|
}
|
|
|
|
if (item.ToTopPackingCode.IsNullOrEmpty())
|
|
|
|
{
|
|
|
|
item.ToTopPackingCode = item.FromTopPackingCode;
|
|
|
|
}
|
|
|
|
//设置六个单据号
|
|
|
|
SetBillNumber(query, item);
|
|
|
|
//拆箱时,如果目标箱不存在,插入目标箱(两个箱码相同)
|
|
|
|
string toPackCode = item.ToPackingCode;
|
|
|
|
var toHis = await query.Where(itm => itm.FromPackingCode == toPackCode && itm.ToPackingCode == toPackCode).OrderBy(itm => itm.CreationTime).FirstOrDefaultAsync().ConfigureAwait(false);
|
|
|
|
if (toHis == null)
|
|
|
|
{
|
|
|
|
|
|
|
|
SplitPackingRec newObj = CommonHelper.CloneObj(item);
|
|
|
|
newObj.SetId(GuidGenerator.Create());
|
|
|
|
newObj.OprType = OprTypeEnum.Other;
|
|
|
|
newObj.FromPackingCode = newObj.ToPackingCode;
|
|
|
|
newObj.FromTopPackingCode = newObj.ToTopPackingCode;
|
|
|
|
newObj.FromStdPackQty = newObj.ToStdPackQty;
|
|
|
|
newObj.FromUom = newObj.ToUom;
|
|
|
|
newObj.FromQty = newObj.ToQty;
|
|
|
|
newObj.FromLot = newObj.ToLot;
|
|
|
|
var res = await _repository.InsertAsync(newObj, true).ConfigureAwait(false);
|
|
|
|
}
|
|
|
|
SplitPackingRec newEntity = CommonHelper.CloneObj(item);
|
|
|
|
newEntity.SetId(GuidGenerator.Create());
|
|
|
|
var ret = await _repository.InsertAsync(newEntity, true).ConfigureAwait(false);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SplitPackingRec newEntity = CommonHelper.CloneObj(item);
|
|
|
|
newEntity.SetId(GuidGenerator.Create());
|
|
|
|
var ret = await _repository.InsertAsync(newEntity, true).ConfigureAwait(false);
|
|
|
|
}
|
|
|
|
} //foreach
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 取每个目标箱码的最后一条拆箱记录
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="toPackingCodeList">目标箱码列表</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public async Task<List<SplitPackingRec>> GetListByToPackingCode(List<string> toPackingCodeList)
|
|
|
|
{
|
|
|
|
List<SplitPackingRec> ret = new List<SplitPackingRec>();
|
|
|
|
List<SplitPackingRec> lst = await _repository.GetListAsync(
|
|
|
|
itm => toPackingCodeList.Contains(itm.ToPackingCode)
|
|
|
|
&& itm.OprType == OprTypeEnum.SplitBox).ConfigureAwait(false);
|
|
|
|
|
|
|
|
foreach (string toCode in toPackingCodeList)
|
|
|
|
{
|
|
|
|
var obj = lst.Where(itm => itm.ToPackingCode == toCode)
|
|
|
|
.OrderByDescending(itm => itm.CreationTime).FirstOrDefault();
|
|
|
|
if (obj != null)
|
|
|
|
{
|
|
|
|
ret.Add(obj);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 取每个源标箱码的“操作状态=其它”的拆箱记录
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="fromPackingCodeList">源标箱码列表</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public async Task<List<SplitPackingRec>> GetListByFromPackingCode(List<string> fromPackingCodeList)
|
|
|
|
{
|
|
|
|
List<SplitPackingRec> ret = new List<SplitPackingRec>();
|
|
|
|
List<SplitPackingRec> lst = await _repository.GetListAsync(
|
|
|
|
itm => fromPackingCodeList.Contains(itm.FromPackingCode)
|
|
|
|
&& itm.OprType == OprTypeEnum.SplitBox).ConfigureAwait(false);
|
|
|
|
|
|
|
|
foreach (string fromCode in fromPackingCodeList)
|
|
|
|
{
|
|
|
|
var obj = lst.Where(itm => itm.FromPackingCode == fromCode && itm.OprType == OprTypeEnum.Other)
|
|
|
|
.OrderByDescending(itm => itm.CreationTime).FirstOrDefault();
|
|
|
|
if (obj != null)
|
|
|
|
{
|
|
|
|
ret.Add(obj);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
|
|
/// 获取顶级条码
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="packingCode"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public async Task<SplitPackingRec> GetTopPackingCode(string packingCode)
|
|
|
|
{
|
|
|
|
SplitPackingRec entity = new SplitPackingRec();
|
|
|
|
SplitPackingRec item = await _repository.FirstOrDefaultAsync(itm => itm.ToPackingCode == packingCode && itm.OprType == OprTypeEnum.SplitBox).ConfigureAwait(false);
|
|
|
|
if (item != null)
|
|
|
|
{
|
|
|
|
entity = await _repository.FirstOrDefaultAsync(itm => itm.ToPackingCode == packingCode && itm.OprType == OprTypeEnum.Other).ConfigureAwait(false);
|
|
|
|
}
|
|
|
|
return entity;
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
|
|
/// 获取顶级条码
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="packingCode"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public async Task<SplitPackingRec> GetSplitPackingCode(string packingCode)
|
|
|
|
{
|
|
|
|
SplitPackingRec item = await _repository.FirstOrDefaultAsync(itm => itm.ToPackingCode == packingCode && itm.OprType == OprTypeEnum.SplitBox).ConfigureAwait(false);
|
|
|
|
return item;
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 取顶级箱码
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="historyQuery">箱码历史</param>
|
|
|
|
/// <param name="item">当前箱码</param>
|
|
|
|
/// <returns></returns>
|
|
|
|
private static string GetTopPackingCode(IQueryable<SplitPackingRec> historyQuery, string packingCode)
|
|
|
|
{
|
|
|
|
var historyRec = historyQuery.Where(itm => itm.FromPackingCode == packingCode).OrderBy(itm => itm.CreationTime).FirstOrDefault();
|
|
|
|
if (historyRec != null)
|
|
|
|
{
|
|
|
|
return historyRec.FromTopPackingCode;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
historyRec = historyQuery.Where(itm => itm.ToPackingCode == packingCode).OrderBy(itm => itm.CreationTime).FirstOrDefault();
|
|
|
|
if (historyRec != null)
|
|
|
|
{
|
|
|
|
return historyRec.ToTopPackingCode;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void SetBillNumber(IQueryable<SplitPackingRec> historyQuery, SplitPackingRec obj)
|
|
|
|
{
|
|
|
|
var historyRec = historyQuery.Where(itm => itm.FromPackingCode == obj.FromPackingCode).OrderBy(itm => itm.CreationTime).FirstOrDefault();
|
|
|
|
if (historyRec != null)
|
|
|
|
{
|
|
|
|
if (historyRec.PurchaseInfo_PoNumber.HasValue())
|
|
|
|
{
|
|
|
|
obj.PurchaseInfo_PoNumber = historyRec.PurchaseInfo_PoNumber; //采购订单
|
|
|
|
}
|
|
|
|
if (historyRec.PurchaseInfo_AsnNumber.HasValue())
|
|
|
|
{
|
|
|
|
obj.PurchaseInfo_AsnNumber = historyRec.PurchaseInfo_AsnNumber; //供应商发货单
|
|
|
|
}
|
|
|
|
if (historyRec.ArrivalNoticNumber.HasValue())
|
|
|
|
{
|
|
|
|
obj.ArrivalNoticNumber = historyRec.ArrivalNoticNumber; //到货通知
|
|
|
|
}
|
|
|
|
if (historyRec.TaskOrderNumber.HasValue())
|
|
|
|
{
|
|
|
|
obj.TaskOrderNumber = historyRec.TaskOrderNumber; //任务单
|
|
|
|
}
|
|
|
|
if (historyRec.ReceiptRecNumber.HasValue())
|
|
|
|
{
|
|
|
|
obj.ReceiptRecNumber = historyRec.ReceiptRecNumber; //收货记录单
|
|
|
|
}
|
|
|
|
if (historyRec.PutOnShelfNumber.HasValue())
|
|
|
|
{
|
|
|
|
obj.PutOnShelfNumber = historyRec.PutOnShelfNumber; //上架单
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//else
|
|
|
|
//{
|
|
|
|
// historyRec = historyQuery.Where(itm => itm.ToPackingCode == obj.ToPackingCode).OrderBy(itm => itm.CreationTime).FirstOrDefault();
|
|
|
|
// if (historyRec != null)
|
|
|
|
// {
|
|
|
|
// obj.PurchaseInfo_PoNumber = historyRec.PurchaseInfo_PoNumber; //采购订单
|
|
|
|
// obj.PurchaseInfo_AsnNumber = historyRec.PurchaseInfo_AsnNumber; //供应商发货单
|
|
|
|
// obj.ArrivalNoticNumber = historyRec.ArrivalNoticNumber; //到货通知
|
|
|
|
// obj.TaskOrderNumber = historyRec.TaskOrderNumber; //任务单
|
|
|
|
// obj.ReceiptRecNumber = historyRec.ReceiptRecNumber; //收货记录单
|
|
|
|
// obj.PutOnShelfNumber = historyRec.PutOnShelfNumber; //上架单
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|