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.
223 lines
8.4 KiB
223 lines
8.4 KiB
using System;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Options;
|
|
using Volo.Abp.BackgroundWorkers;
|
|
using Volo.Abp.Threading;
|
|
using Volo.Abp.Uow;
|
|
using Win_in.Sfs.Basedata.Application.Contracts;
|
|
using Win_in.Sfs.Wms.DataExchange.Domain;
|
|
using Win_in.Sfs.Wms.DataExchange.Domain.Shared;
|
|
|
|
|
|
using Win_in.Sfs.Basedata.Application.Contracts;
|
|
using Win_in.Sfs.Shared.Domain;
|
|
using Win_in.Sfs.Wms.DataExchange.Application.Contracts;
|
|
using Win_in.Sfs.Wms.DataExchange.Domain.Shared;
|
|
using Win_in.Sfs.Wms.Store.Application.Contracts;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
|
|
namespace Win_in.Sfs.Wms.DataExchange.MesAgent
|
|
{
|
|
public class OutMesIncomingDataWorker : AsyncPeriodicBackgroundWorkerBase
|
|
{
|
|
private readonly IOptions<DataExchangeOptions> _options;
|
|
|
|
|
|
//private readonly IMesProductL7PartsNoteAppService _mesProductL7PartsNoteAppService;
|
|
//private readonly IProductL7PartsNoteAppService _productL7PartsNoteAppService;
|
|
//private readonly IItemBasicAppService _itemBasicAppService;
|
|
|
|
|
|
|
|
public OutMesIncomingDataWorker(
|
|
AbpAsyncTimer timer,
|
|
IOptions<DataExchangeOptions> options,
|
|
//IProductL7PartsNoteAppService productL7PartsNoteAppService,
|
|
//IMesProductL7PartsNoteAppService mesProductL7PartsNoteAppService,
|
|
//IItemBasicAppService itemBasicAppService,
|
|
|
|
IServiceScopeFactory serviceScopeFactory
|
|
) : base(timer, serviceScopeFactory)
|
|
{
|
|
_options = options;
|
|
//_itemBasicAppService = itemBasicAppService;
|
|
//_productL7PartsNoteAppService = productL7PartsNoteAppService;
|
|
//_mesProductL7PartsNoteAppService = mesProductL7PartsNoteAppService;
|
|
Timer.Period = options.Value.IncomingOptions.PeriodSeconds * 1000; //default 5 minutes
|
|
}
|
|
|
|
[UnitOfWork]
|
|
protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext)
|
|
{
|
|
Logger.LogInformation("Starting: Handling Incoming Exchange data...");
|
|
if (!_options.Value.IncomingOptions.Active)
|
|
{
|
|
Logger.LogInformation("Incoming Exchange is not active!");
|
|
return;
|
|
}
|
|
|
|
//Resolve dependencies
|
|
var mesProductL7PartsNoteAppService = workerContext
|
|
.ServiceProvider
|
|
.GetRequiredService<IMesProductL7PartsNoteAppService>();
|
|
|
|
//Resolve dependencies
|
|
var incomingDataManager = workerContext
|
|
.ServiceProvider
|
|
.GetRequiredService<OutMesData.Domain.IOutMesIncomingDataManager>();
|
|
|
|
int maxRowId = await mesProductL7PartsNoteAppService.GetMaxRowID();
|
|
//maxRowId = 0;
|
|
|
|
//Do the work
|
|
var incomingDataList = await incomingDataManager.GetReadyListAsync(maxRowId);
|
|
|
|
try
|
|
{
|
|
List<MesProductL7PartsNoteCreateInput> mesNotes = new List<MesProductL7PartsNoteCreateInput>();
|
|
|
|
|
|
foreach (var mesIncomData in incomingDataList)
|
|
{
|
|
MesProductL7PartsNoteCreateInput createInput = new MesProductL7PartsNoteCreateInput()
|
|
{
|
|
RowID = mesIncomData.Id,
|
|
State = mesIncomData.State,
|
|
ProductNo = mesIncomData.ProductNo,
|
|
Program = mesIncomData.Program,
|
|
Position = mesIncomData.Position,
|
|
FATA = mesIncomData.FATA,
|
|
Configuration = mesIncomData.Configuration,
|
|
L7Part = mesIncomData.L7Part,
|
|
Qty = mesIncomData.Qty,
|
|
CreateDate = mesIncomData.CreateDate,
|
|
Company = "Mes",
|
|
Number = "Mes",
|
|
|
|
};
|
|
|
|
mesNotes.Add(createInput);
|
|
}
|
|
|
|
|
|
//获取所有的L7零件信息,并获取零件是不是采购件、制造件
|
|
|
|
var L7PartCodes = mesNotes.Select(p => p.L7Part).Distinct().ToList();
|
|
|
|
await mesProductL7PartsNoteAppService.AddManyAsync(mesNotes);
|
|
|
|
|
|
|
|
string codesStr = System.Text.Json.JsonSerializer.Serialize(L7PartCodes);
|
|
|
|
|
|
ItemBasicRequestInput itemInput = new ItemBasicRequestInput();
|
|
itemInput.Condition.Filters.Add(new Sfs.Shared.Domain.Filter() { Action = EnumFilterAction.In.ToString(), Column = "Code", Logic = EnumFilterLogic.And.ToString(), Value = codesStr, });
|
|
itemInput.MaxResultCount = 999;
|
|
|
|
|
|
//Resolve dependencies
|
|
var itemBasicAppService = workerContext
|
|
.ServiceProvider
|
|
.GetRequiredService<IItemBasicAppService>();
|
|
|
|
//Do the work
|
|
|
|
var itemBaseList = await itemBasicAppService.GetListAsync(itemInput, false);
|
|
|
|
var sumEntityList = mesNotes.GroupBy(p => new { p.ProductNo, p.Program, p.FATA, p.Configuration, p.Position }).ToList();
|
|
|
|
|
|
List<ProductL7PartsNoteCreateInput> noteList = new List<ProductL7PartsNoteCreateInput>();
|
|
|
|
foreach (var sumEntity in sumEntityList)
|
|
{
|
|
ProductL7PartsNoteCreateInput note = new ProductL7PartsNoteCreateInput()
|
|
{
|
|
ProductNo = sumEntity.Key.ProductNo,
|
|
Program = sumEntity.Key.Program,
|
|
FATA = sumEntity.Key.FATA,
|
|
Configuration = sumEntity.Key.Configuration,
|
|
Position = sumEntity.Key.Position,
|
|
Company = "MES",
|
|
Details = new List<ProductL7PartsNoteDetailInput>(),
|
|
};
|
|
|
|
|
|
var detailList = mesNotes.Where(p => p.ProductNo == sumEntity.Key.ProductNo &&
|
|
p.Program == sumEntity.Key.Program &&
|
|
p.FATA == sumEntity.Key.FATA &&
|
|
p.Configuration == sumEntity.Key.Configuration &&
|
|
p.Position == sumEntity.Key.Position).ToList();
|
|
|
|
|
|
|
|
foreach (var detail in detailList)
|
|
{
|
|
|
|
ProductL7PartsNoteDetailInput noteDetail = new ProductL7PartsNoteDetailInput()
|
|
|
|
{
|
|
ProductNo = sumEntity.Key.ProductNo,
|
|
Program = sumEntity.Key.Program,
|
|
FATA = sumEntity.Key.FATA,
|
|
Configuration = sumEntity.Key.Configuration,
|
|
Position = sumEntity.Key.Position,
|
|
L7Part = detail.L7Part,
|
|
ItemCode = detail.L7Part,
|
|
State = detail.State,
|
|
CreateDate = detail.CreateDate,
|
|
Qty = detail.Qty,
|
|
RowID = detail.RowID,
|
|
|
|
|
|
};
|
|
|
|
var itemBase = itemBaseList.Items.FirstOrDefault(p => p.Code == detail.L7Part);
|
|
if (itemBase == null)
|
|
{
|
|
//throw new Exception($"未找到零件{detail.L7PartCode}的零件基础信息,请确认基础信息是否齐全!");
|
|
|
|
}
|
|
else
|
|
{
|
|
noteDetail.CanMake = itemBase.CanMake;
|
|
noteDetail.CanBuy = itemBase.CanBuy;
|
|
}
|
|
|
|
|
|
note.Details.AddIfNotContains(noteDetail);
|
|
}
|
|
|
|
noteList.Add(note);
|
|
}
|
|
|
|
|
|
//Resolve dependencies
|
|
var productL7PartsNoteAppService = workerContext
|
|
.ServiceProvider
|
|
.GetRequiredService<IProductL7PartsNoteAppService>();
|
|
|
|
//保存相关L7零件信息
|
|
await productL7PartsNoteAppService.CreateAsync(noteList);
|
|
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
e = e.GetBaseException();
|
|
//incomingData.SetError(EnumExchangeDataErrorCode.Exception, e.Message);
|
|
|
|
throw e;
|
|
}
|
|
|
|
|
|
Logger.LogInformation("Completed: Handling Incoming Exchange data...");
|
|
}
|
|
|
|
}
|
|
|
|
}
|