1.命名空间
Volo.Abp.EventBus.Local
2.构造函数中注入
private readonly ILocalEventBus _localEventBus;
public CraftStockService(ILocalEventBus localEventBus)
{
_localEventBus = localEventBus;
}
3.申明实体
public class UpdateCraftInventoryEvent
{
public IList<UpdateCraft> UpdateCrafts { get; set; }
public class UpdateCraft
{
public string DicCode { get; set; }
public string DicTypeId { get; set; }
public string DicTypeName { get; set; }
public float Quantity { get; set; }
}
}
4.发布事件
public async Task<IMomRes> AuditInStock(AuditCraftInStockReq input)
{
Check.NotNull(input, nameof(AuditCraftInStockReq));
var cus = await _craftInStockRepository.FindAsync(a => a.Id == input.Id);
if (cus is null)
{
throw new UserFriendlyException("入库信息不存在!");
}
if (cus.AuditStatus == 1)
{
throw new UserFriendlyException("已审核无法审核!");
}
cus.AuditorId = CurrentUser.Id;
cus.AuditorName = CurrentUser.Name;
cus.AuditStatus = 1;
cus.AuditResult = input.AuditResult;
cus.AuditTime = DateTime.Now;
cus.AuditComment = input.AuditComment;
await _craftInStockRepository.UpdateAsync(cus);
var list = await _craftInStockListRepository.GetListAsync(s=>s.InStockId==cus.Id);
var inventoryEvent = new LocalEventBus.UpdateCraftInventoryEvent
{
UpdateCrafts = list.Select(p => new LocalEventBus.UpdateCraftInventoryEvent.UpdateCraft { DicCode=p.DicCode,DicTypeId=p.DicTypeId,DicTypeName=p.DicTypeName, Quantity = p.Quantity}).ToList()
};
await _localEventBus.PublishAsync(inventoryEvent);
return MomRes.Ok();
}
5.订阅事件
public class UpdateCraftInventoryHandler : ILocalEventHandler<UpdateCraftInventoryEvent>, ITransientDependency
{
private readonly IRepository<CraftRealStock, Guid> _craftRealStockRepository;
private readonly IRepository<CraftEquipDic, Guid> _craftEquipDicRepository;
public UpdateCraftInventoryHandler(IRepository<CraftRealStock, Guid> craftRealStockRepository, IRepository<CraftEquipDic, Guid> craftEquipDicRepository)
{
_craftRealStockRepository = craftRealStockRepository;
_craftEquipDicRepository = craftEquipDicRepository;
}
public async Task HandleEventAsync(UpdateCraftInventoryEvent eventData)
{
foreach (var craft in eventData.UpdateCrafts)
{
var craftEquipDic = await _craftEquipDicRepository.FindAsync(s => s.DicCode == craft.DicCode);
if (craftEquipDic is null)
{
throw new UserFriendlyException("工装字典不存在!");
}
var item = new CraftRealStock()
{
DicId = craftEquipDic.Id,
DicCode = craftEquipDic.DicCode,
DicName = craftEquipDic.DicName,
DicTypeId = craft.DicTypeId,
DicTypeName = craft.DicTypeName,
Spec = craftEquipDic.Spec,
Brand = craftEquipDic.Brand,
Unit = craftEquipDic.Unit,
Quantity = craft.Quantity,
};
var realStock = await _craftRealStockRepository.FirstOrDefaultAsync(a => a.DicId == craftEquipDic.Id );
if (realStock is null)
{
await _craftRealStockRepository.InsertAsync(item);
continue;
}
realStock.Quantity += item.Quantity;
await _craftRealStockRepository.UpdateAsync(realStock);
}
}
}