You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

302 lines
12 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
12 months ago
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("操作类型不是拆箱或合箱状态,源箱码和目标箱码必须相同!");
}
}
#endregion
if (item.OprType == OprTypeEnum.SplitBox || item.OprType == OprTypeEnum.MergeBox)
{
//设置顶级箱码
11 months ago
item.FromTopPackingCode = CalcuTopPackingCode(query, item.FromPackingCode);
item.ToTopPackingCode = CalcuTopPackingCode(query, item.FromPackingCode); //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;
11 months ago
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
{
11 months ago
if (item.FromTopPackingCode.IsNullOrEmpty())
{
item.FromTopPackingCode = item.FromPackingCode;
}
if (item.ToTopPackingCode.IsNullOrEmpty())
{
item.ToTopPackingCode = item.FromPackingCode;// ToPackingCode;
}
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)
).ConfigureAwait(false); //&& itm.OprType == OprTypeEnum.SplitBox
//按to箱码分组,取最后一条记录
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;
}
12 months ago
/// <summary>
/// 获取所有最后一条操作想骂记录
/// </summary>
/// <param name="toPackingCodeList">目标箱码列表</param>
/// <returns></returns>
public async Task<List<SplitPackingRec>> GetFirstOrDefaultPackingCode(List<string> toPackingCodeList)
{
List<SplitPackingRec> ret = new List<SplitPackingRec>();
List<SplitPackingRec> lst = await _repository.GetListAsync(
itm => toPackingCodeList.Contains(itm.ToPackingCode)).ConfigureAwait(false);
12 months ago
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)
).ConfigureAwait(false); //&& itm.OprType == OprTypeEnum.SplitBox
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;
}
12 months ago
/// <summary>
/// 获取顶级条码
/// </summary>
/// <param name="packingCode"></param>
/// <returns></returns>
public async Task<SplitPackingRec> GetTopPackingCode(string packingCode)
{
SplitPackingRec entity = await _repository.FirstOrDefaultAsync(itm => itm.ToPackingCode == packingCode && itm.OprType == OprTypeEnum.SplitBox).ConfigureAwait(false);
if (entity == null)
12 months ago
{
entity = await _repository.FirstOrDefaultAsync(itm => itm.ToPackingCode == packingCode && itm.OprType == OprTypeEnum.Other).ConfigureAwait(false);
if (entity == null)
{
entity = new SplitPackingRec();
}
12 months ago
}
return entity;
}
/// <summary>
/// 获取顶级条码
/// </summary>
/// <param name="packingCode"></param>
/// <returns></returns>
public async Task<SplitPackingRec> GetSplitPackingCode(string packingCode)
{
12 months ago
SplitPackingRec item = await _repository.FirstOrDefaultAsync(itm => itm.ToPackingCode == packingCode && itm.OprType == OprTypeEnum.Other).ConfigureAwait(false);
12 months ago
return item;
}
/// <summary>
/// 取顶级箱码
/// </summary>
/// <param name="historyQuery">箱码历史</param>
11 months ago
/// <param name="packingCode">箱码,from to时都传入from</param>
/// <returns></returns>
11 months ago
private static string CalcuTopPackingCode(IQueryable<SplitPackingRec> historyQuery, string packingCode)
{
11 months ago
var qry = historyQuery.Where(itm => itm.OprType == OprTypeEnum.SplitBox || itm.OprType == OprTypeEnum.MergeBox);
string ret = null;
SplitPackingRec? firstObj = null;
string toCode = packingCode;
while (1 == 1)
{
11 months ago
firstObj = qry.FirstOrDefault(itm => itm.ToPackingCode == toCode);
if (firstObj == null)
{
11 months ago
ret = toCode;
break;
}
else
{
toCode = firstObj.FromPackingCode;
}
}
11 months ago
return ret;
//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; //上架单
// }
//}
}
/// <summary>
/// 根据from箱码取所有记录
/// </summary>
/// <param name="fromPackingCode"></param>
/// <returns></returns>
public async Task<List<SplitPackingRec>> GetAllByFromPackingCode(string fromPackingCode)
{
List<SplitPackingRec> lst = await _repository.GetListAsync(
itm => itm.FromPackingCode ==fromPackingCode)
.ConfigureAwait(false);
return lst;
}
}