ABP VNext中使用事件总线

1.命名空间

Volo.Abp.EventBus.Local

2.构造函数中注入

 private readonly ILocalEventBus _localEventBus;
 public CraftStockService(ILocalEventBus localEventBus)
        {
            _localEventBus = localEventBus;
        }

3.申明实体

public class UpdateCraftInventoryEvent
    {
        /// <summary>
        /// 更新的物料列表
        /// </summary>
        public IList<UpdateCraft> UpdateCrafts { get; set; }

        public class UpdateCraft
        {
            /// <summary>
            /// 工装字典Id
            /// </summary>
            public string DicCode { get; set; }

            /// <summary>
            /// 工装类型ID
            /// </summary>
            public string DicTypeId { get; set; }

            /// <summary>
            /// 工装类型名称
            /// </summary>
            public string DicTypeName { get; set; }

            /// <summary>
            ///  数量
            /// </summary>
            public float Quantity { get; set; }
        }
    }

4.发布事件

        /// <summary>
        /// 入库审核
        /// </summary>
        /// <returns></returns>
        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);
            }
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值