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 BatchInsertAsync(List 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; } /// /// 取每个目标箱码的最后一条拆箱记录 /// /// 目标箱码列表 /// public async Task> GetListByToPackingCode(List toPackingCodeList) { List ret = new List(); List 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; } /// /// 取每个源标箱码的“操作状态=其它”的拆箱记录 /// /// 源标箱码列表 /// public async Task> GetListByFromPackingCode(List fromPackingCodeList) { List ret = new List(); List 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; } /// /// 获取顶级条码 /// /// /// public async Task 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; } /// /// 获取顶级条码 /// /// /// public async Task GetSplitPackingCode(string packingCode) { SplitPackingRec item = await _repository.FirstOrDefaultAsync(itm => itm.ToPackingCode == packingCode && itm.OprType == OprTypeEnum.SplitBox).ConfigureAwait(false); return item; } /// /// 取顶级箱码 /// /// 箱码历史 /// 当前箱码 /// private static string GetTopPackingCode(IQueryable 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 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; //上架单 // } //} } }