using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Win_in.Sfs.Wms.DataExchange.Domain.Fawtyg.Frozen; using Win_in.Sfs.Wms.DataExchange.Domain.Shared; using Win_in.Sfs.Wms.DataExchange.Domain; using System.Text.Json; using Win_in.Sfs.Wms.DataExchange.WMS.MesNote; using Win_in.Sfs.Basedata.Application.Contracts; using Win_in.Sfs.Shared.Domain.Shared; namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.MesAgent.Incoming; public class FrozenReader : IReader { private readonly IFrozenManager _FrozenManager; private readonly IIncomingFromExternalManager _incomingFromExternalManager; private readonly ILogger _logger; private readonly ILocationAppService _locationAppService; public FrozenReader( IFrozenManager pillTaskManager , IIncomingFromExternalManager incomingFromExternalManager , ILogger logger , ILocationAppService locationAppService ) { _FrozenManager = pillTaskManager; _incomingFromExternalManager = incomingFromExternalManager; _logger = logger; _locationAppService = locationAppService; } public virtual async Task> ReadAsync() { //从MES读取待处理Frozen var toBeProcessedPillTasks = await _FrozenManager.GetToBeProcessedListAsync().ConfigureAwait(false); if (!toBeProcessedPillTasks.Any()) { _logger.LogInformation("no Frozens"); return new List(); } //Frozen逐一转换为MaterialRequest var holdLocation = await _locationAppService.GetFirstByTypeAsync(EnumLocationType.HOLD).ConfigureAwait(false); var incomingDataList = BuildIncomingFromExternalFromPillTaskAsync(toBeProcessedPillTasks, holdLocation==null?"": holdLocation.Code); await _incomingFromExternalManager.CreateManyAsync(incomingDataList).ConfigureAwait(false); //更新MES数据状态 await _FrozenManager.UpdateProcessedListAsync(toBeProcessedPillTasks).ConfigureAwait(false); return incomingDataList; } private static List BuildIncomingFromExternalFromPillTaskAsync(List toBeProcessedFrozens,string holdLocationCode) { var incomingDataList = new List(); foreach (var Frozen in toBeProcessedFrozens) { var incomingData = BuildIncomingFromExternal(Frozen); incomingData.SetEffectiveDate(DateTime.Now); incomingData.SetSuccess(); try { var MaterialRequest = BuildMesNoteCreateInput(Frozen, holdLocationCode); incomingData.DestinationDataContent = JsonSerializer.Serialize(MaterialRequest); } catch (Exception ex) { incomingData.SetError(EnumExchangeDataErrorCode.Exception, ex.Message, ex.ToString()); } incomingDataList.Add(incomingData); } return incomingDataList; } private static IncomingFromExternal BuildIncomingFromExternal(Frozen Frozen) { var incomingData = new IncomingFromExternal() { DataType = EnumIncomingDataType.MesNote.ToString(), DataAction = EnumExchangeDataAction.Add, SourceSystem = EnumSystemType.MES.ToString(), SourceDataId = Frozen.mesout_frozen_id.ToString(), SourceDataGroupCode = Frozen.mesout_frozen_id.ToString(), SourceDataDetailCode = Frozen.mesout_frozen_part, SourceDataContent = JsonSerializer.Serialize(Frozen), WriteTime = DateTime.Now, Writer = nameof(MesIncomingBackgroundWorker), DestinationSystem = EnumSystemType.WMS.ToString(), }; return incomingData; } private static MesNoteExchangeDto BuildMesNoteCreateInput(Frozen Frozen, string holdLocationCode) { var mesNote = new MesNoteExchangeDto() { MesRequestNumber=Frozen.mesout_frozen_id.ToString(), Worker = Frozen.mesout_frozen_user, Remark = Frozen.mesout_frozen_reason, Type = Frozen.mesout_frozen_type == "0" ? EnumTransType.MesFreezed.ToString() : EnumTransType.MesUnFreezed.ToString(), ActiveDate = DateTime.TryParse(Frozen.mesout_frozen_date, out DateTime dateTime) ? dateTime : DateTime.Now }; var mesNoteDetail = new MesNoteDetailExchangeDto() { ItemCode = Frozen.mesout_frozen_part, Qty = Frozen.mesout_frozen_num, ToLocationErpCode = Frozen.mesout_frozen_type == "0"? holdLocationCode : Frozen.mesout_frozen_loc, FromLocationErpCode = Frozen.mesout_frozen_type != "0"? holdLocationCode:Frozen.mesout_frozen_loc, ToStatus= Frozen.mesout_frozen_type == "0"? EnumInventoryStatus.HOLD: EnumInventoryStatus.OK, FromStatus = Frozen.mesout_frozen_type != "0" ? EnumInventoryStatus.HOLD : EnumInventoryStatus.OK, }; mesNote.Detail = mesNoteDetail; return mesNote; } }