From 02d45bb6a7cc35e2c0391633027e4aa5dcbc2c58 Mon Sep 17 00:00:00 2001 From: chenchun Date: Thu, 14 Nov 2024 18:56:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E4=B8=8B=E6=9E=B6=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jobs/AutoPassInGoodsJob.cs | 32 ++++++++++ .../DigitalCollectiblesSettingProvider.cs | 5 +- .../Managers/MarketManager.cs | 63 ++++++++++++++----- 3 files changed, 85 insertions(+), 15 deletions(-) create mode 100644 Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/AutoPassInGoodsJob.cs diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/AutoPassInGoodsJob.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/AutoPassInGoodsJob.cs new file mode 100644 index 00000000..dd5ff925 --- /dev/null +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/AutoPassInGoodsJob.cs @@ -0,0 +1,32 @@ +using Microsoft.Extensions.Logging; +using Quartz; +using Volo.Abp.BackgroundWorkers.Quartz; +using Yi.Framework.DigitalCollectibles.Domain.Managers; + +namespace Yi.Framework.DigitalCollectibles.Application.Jobs; +/// +/// 自动下架商品 +/// +public class AutoPassInGoodsJob: QuartzBackgroundWorkerBase +{ + private readonly MarketManager _marketManager; + private readonly ILogger _logger; + public AutoPassInGoodsJob(MarketManager marketManager, ILogger logger) + { + _marketManager = marketManager; + _logger = logger; + JobDetail = JobBuilder.Create().WithIdentity(nameof(AutoPassInGoodsJob)) + .Build(); + + //每小时,第10分钟执行一次 + Trigger = TriggerBuilder.Create().WithIdentity(nameof(AutoPassInGoodsJob)) + .WithCronSchedule("0 10 * * * ?") + .Build(); + } + + + public override async Task Execute(IJobExecutionContext context) + { + await _marketManager.AutoPassInGoodsAsync(); + } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Settings/DigitalCollectiblesSettingProvider.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Settings/DigitalCollectiblesSettingProvider.cs index 3b5f831a..37050705 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Settings/DigitalCollectiblesSettingProvider.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Settings/DigitalCollectiblesSettingProvider.cs @@ -28,7 +28,10 @@ namespace Yi.Abp.Domain.Shared.Settings new SettingDefinition("MarketTaxRate", "0.02"), //矿池刷新内容 - new SettingDefinition("PoolData", "60,26,10,3,1") + new SettingDefinition("PoolData", "60,26,10,3,1"), + + //自动下架多久天前的商品 + new SettingDefinition("AutoPassInGoodsDay","3") ); } } diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/MarketManager.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/MarketManager.cs index 940ac7d8..131861de 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/MarketManager.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/MarketManager.cs @@ -19,9 +19,11 @@ public class MarketManager : DomainService private readonly ISqlSugarRepository _marketGoodsRepository; private readonly ILocalEventBus _localEventBus; - public readonly ISettingProvider _settingProvider; + private readonly ISettingProvider _settingProvider; + public MarketManager(ISqlSugarRepository collectiblesUserStoreRepository, - ISqlSugarRepository marketGoodsRepository, ILocalEventBus localEventBus, ISettingProvider settingProvider) + ISqlSugarRepository marketGoodsRepository, ILocalEventBus localEventBus, + ISettingProvider settingProvider) { _collectiblesUserStoreRepository = collectiblesUserStoreRepository; _marketGoodsRepository = marketGoodsRepository; @@ -29,6 +31,35 @@ public class MarketManager : DomainService _settingProvider = settingProvider; } + + /// + /// 商品自动流拍,自动下架 + /// + public async Task AutoPassInGoodsAsync() + { + var autoPassInGoodsDay = (await _settingProvider.GetOrNullAsync("AutoPassInGoodsDay")).To(); + //下架3天前的商品 + var endTine = DateTime.Now.AddDays(-autoPassInGoodsDay); + //获取所有需要下架商品 + var marketGoods = await _marketGoodsRepository._DbQueryable.Where(x => x.CreationTime >= endTine).ToListAsync(); + + //单独处理每一个下架的商品 + foreach (var goods in marketGoods) + { + //用户库存 + var userStore = await _collectiblesUserStoreRepository._DbQueryable + .Where(x => x.CollectiblesId == goods.CollectiblesId) + .Where(x => x.IsAtMarketing == true).FirstAsync(); + if (userStore is not null) + { + userStore.IsAtMarketing = false; + await _collectiblesUserStoreRepository.UpdateAsync(userStore); + //删除商品 + await _marketGoodsRepository.DeleteByIdAsync(goods.Id); + } + } + } + /// /// 上架货物 /// @@ -39,13 +70,13 @@ public class MarketManager : DomainService /// public async Task ShelvedGoodsAsync(Guid userId, Guid collectiblesId, int number, decimal money) { - if (number<=0) + if (number <= 0) { throw new UserFriendlyException("上架藏品数量需大于0"); } - + var collectiblesList = await _collectiblesUserStoreRepository._DbQueryable - .Where(x=>x.UserId==userId) + .Where(x => x.UserId == userId) .Where(x => x.IsAtMarketing == false) .Where(x => x.CollectiblesId == collectiblesId).ToListAsync(); if (collectiblesList.Count < number) @@ -80,10 +111,11 @@ public class MarketManager : DomainService /// public async Task PurchaseGoodsAsync(Guid userId, Guid marketGoodsId, int number) { - if (number<=0) + if (number <= 0) { throw new UserFriendlyException("交易藏品数量需大于0"); } + //1-市场扣减或者关闭该商品 //2-出售者新增钱,购买者扣钱 //3-出售者删除对应库存,购买者新增对应库存 @@ -103,17 +135,19 @@ public class MarketManager : DomainService { throw new UserFriendlyException($"交易失败,当前交易市场库存不足"); } - + //2-出售者新增钱,购买者扣钱 //发布一个其他领域的事件-购买者扣钱 - await _localEventBus.PublishAsync(new MoneyChangeEventArgs() { UserId = userId, Number = -(number*marketGoods.UnitPrice) },false); + await _localEventBus.PublishAsync( + new MoneyChangeEventArgs() { UserId = userId, Number = -(number * marketGoods.UnitPrice) }, false); //发布一个其他领域的事件-出售者加钱,同时扣税 var marketTaxRate = decimal.Parse(await _settingProvider.GetOrNullAsync("MarketTaxRate")); //价格*扣减税 - var realTotalPrice = (number*marketGoods.UnitPrice) * (1 - marketTaxRate); + var realTotalPrice = (number * marketGoods.UnitPrice) * (1 - marketTaxRate); //出售者实际加钱 - await _localEventBus.PublishAsync(new MoneyChangeEventArgs() { UserId = marketGoods.SellUserId, Number = realTotalPrice },false); - + await _localEventBus.PublishAsync( + new MoneyChangeEventArgs() { UserId = marketGoods.SellUserId, Number = realTotalPrice }, false); + //3-出售者删除对应库存,购买者新增对应库存(只需更改用户者即可) var collectiblesList = await _collectiblesUserStoreRepository._DbQueryable.Where(x => x.IsAtMarketing == true) .Where(x => x.UserId == marketGoods.SellUserId) @@ -129,8 +163,9 @@ public class MarketManager : DomainService { userStore.PurchaseMarket(userId); } + await _collectiblesUserStoreRepository.UpdateRangeAsync(updateStore); - + //发布一个成功交易事件 await _localEventBus.PublishAsync(new SuccessMarketEto { @@ -139,7 +174,7 @@ public class MarketManager : DomainService CollectiblesId = marketGoods.CollectiblesId, SellNumber = marketGoods.SellNumber, UnitPrice = marketGoods.UnitPrice, - RealTotalPrice =realTotalPrice - },false); + RealTotalPrice = realTotalPrice + }, false); } } \ No newline at end of file