From 45da610e8aef1c56a7512c51f6a4b08b723deb02 Mon Sep 17 00:00:00 2001 From: feng <279202647@qq.com> Date: Fri, 30 Sep 2022 11:27:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E4=BB=BB=E5=8A=A1=E6=8E=A5?= =?UTF-8?q?=E5=8F=96=E9=A2=91=E7=B9=81=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.config/dotnet-tools.json | 12 +++ src/Coldairarrow.Api/Program.cs | 2 +- .../PublishProfiles/FolderProfile.pubxml | 8 +- .../HuiYan/pricetasklogBusiness.cs | 84 ++++++++++++------- src/Coldairarrow.Entity/DTO/TaskCountDto.cs | 23 +++++ .../01.Coldairarrow.Util.csproj | 4 +- 6 files changed, 99 insertions(+), 34 deletions(-) create mode 100644 src/Coldairarrow.Api/.config/dotnet-tools.json create mode 100644 src/Coldairarrow.Entity/DTO/TaskCountDto.cs diff --git a/src/Coldairarrow.Api/.config/dotnet-tools.json b/src/Coldairarrow.Api/.config/dotnet-tools.json new file mode 100644 index 0000000..b8c6c1f --- /dev/null +++ b/src/Coldairarrow.Api/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "6.0.9", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/src/Coldairarrow.Api/Program.cs b/src/Coldairarrow.Api/Program.cs index ac8c849..72ac4df 100644 --- a/src/Coldairarrow.Api/Program.cs +++ b/src/Coldairarrow.Api/Program.cs @@ -22,7 +22,7 @@ namespace Coldairarrow.Api services.AddAutoMapper(); services.AddEFCoreSharding(config => { - config.SetEntityAssemblies(GlobalAssemblies.AllAssemblies); + //config.SetEntityAssemblies(GlobalAssemblies.AllAssemblies); var dbOptions = hostContext.Configuration.GetSection("Database:BaseDb").Get(); var dbmdsOptions = hostContext.Configuration.GetSection("MsdDatabase:BaseDb").Get(); diff --git a/src/Coldairarrow.Api/Properties/PublishProfiles/FolderProfile.pubxml b/src/Coldairarrow.Api/Properties/PublishProfiles/FolderProfile.pubxml index 703a931..6074e6a 100644 --- a/src/Coldairarrow.Api/Properties/PublishProfiles/FolderProfile.pubxml +++ b/src/Coldairarrow.Api/Properties/PublishProfiles/FolderProfile.pubxml @@ -10,10 +10,12 @@ Release Any CPU - True - False + true + false bea1bf0d-b063-4931-89c7-22f92973143a bin\Release\netcoreapp3.1\publish\ - False + true + net5.0 + false \ No newline at end of file diff --git a/src/Coldairarrow.Business/HuiYan/pricetasklogBusiness.cs b/src/Coldairarrow.Business/HuiYan/pricetasklogBusiness.cs index 928c0bc..d28c1b0 100644 --- a/src/Coldairarrow.Business/HuiYan/pricetasklogBusiness.cs +++ b/src/Coldairarrow.Business/HuiYan/pricetasklogBusiness.cs @@ -8,6 +8,7 @@ using Coldairarrow.Util; using EFCore.Sharding; using LinqKit; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -24,14 +25,16 @@ namespace Coldairarrow.Business.HuiYan IteamitemsBusiness _iteamitemsBusiness; readonly IOperator _operator; readonly ILogger _logger; + readonly IDistributedCache _cache; public pricetasklogBusiness(IDbAccessor db, IuserBusiness iuserBusiness, IteamitemsBusiness iteamitemsBusiness, ILogger logger, - IOperator @operator) + IOperator @operator, IDistributedCache cache) : base(db) { _operator = @operator; _iuserBusiness = iuserBusiness; _iteamitemsBusiness = iteamitemsBusiness; _logger = logger; + _cache = cache; } #region 外部接口 @@ -275,41 +278,64 @@ namespace Coldairarrow.Business.HuiYan bool CheckIsMaxTaskCount() { - Expression> select = (a, b, c) => new TeamitemDto - { - GoodsId = b.GoodsId, - HasFilter = b.HasFilter, - Platform = b.Platform, - GoodsUrl = b.GoodsUrl, - PriceTaskId = c.Id, - PriceTaskState = (int)c.State, - Extensions = Newtonsoft.Json.JsonConvert.DeserializeObject>(a.ExtensionJson) - }; + + + var list = Db.GetListBySql(@"SELECT + CAST( `p`.`State` AS signed ) AS State, + COUNT(*) AS count +FROM + `teamitems` AS `t` + LEFT JOIN `items` AS `i` ON `t`.`ItemId` = `i`.`Id` + LEFT JOIN `pricetasklog` AS `p` ON `t`.`Id` = `p`.`TeamItemId` +WHERE + ( `t`.`PriceTaskUserId` = @uid ) + AND `p`.`State` IS NOT NULL +GROUP BY + State",("uid",_operator.UserId)); + + + int? hasTaskCount = list.Select(c => new { Id = c.State, Count = c.Count }).Where(c => c.Id == 0).FirstOrDefault()?.Count; + + - select = select.BuildExtendSelectExpre(); + return hasTaskCount > 10; + } - var q_titem = Db.GetIQueryable(); - var q = from a in q_titem.AsExpandable() - join b in Db.GetIQueryable() on a.ItemId equals b.Id into ab - from ba in ab.DefaultIfEmpty() - join c in Db.GetIQueryable() on a.Id equals c.TeamItemId into ac - from bb in ac.DefaultIfEmpty() - select @select.Invoke(a, ba, bb); + public AjaxResult AcceptTask(string teamItemId) + { - //查询对应状态 - var where = LinqHelper.True().And(c => c.PriceTaskUserId == _operator.UserId); + string cacheKey = $"acceptTask:{_operator.UserId}"; + string keyTime = _cache.GetString(cacheKey); - where = where.And(c => c.PriceTaskState != null); + AcceptTime lastAccept = null; - var list = q.Where(where).Select(c => c.PriceTaskState).ToList(); + //判断是否没有请求过 + if (!string.IsNullOrEmpty(keyTime)) + { + var time=Newtonsoft.Json.JsonConvert.DeserializeObject(keyTime); - int? hasTaskCount = list.GroupBy(c => c).Select(c => new { Id = c.Key, Count = c.Count() }).Where(c => c.Id == 0).FirstOrDefault()?.Count; + //如果是新一轮请求 + if (time.Date < DateTime.Now) + { + time.Date= DateTime.Now.AddMinutes(1); + time.Count = 1; + } - return hasTaskCount > 10; - } - public AjaxResult AcceptTask(string teamItemId) - { + if (time.Count >= 3) + { + return Error("请求过于频繁!"); + } + + time.Count = time.Count + 1; + lastAccept = time; + } + else { + lastAccept = new AcceptTime() { Date = DateTime.Now.AddMinutes(1), Count = 1 }; + } + + _cache.SetString(cacheKey, Newtonsoft.Json.JsonConvert.SerializeObject(lastAccept)); + var teamItem = Db.GetIQueryable().FirstOrDefault(c => c.Id == teamItemId); if (teamItem == null) @@ -317,11 +343,13 @@ namespace Coldairarrow.Business.HuiYan return Error("任务不存在!"); } + if (CheckIsMaxTaskCount()) { return Error("任务接取已达上限!"); } + var result = Db.RunTransaction(() => { string orderId = DateTime.Now.ToString("yyyyMMddHHmmssff"); diff --git a/src/Coldairarrow.Entity/DTO/TaskCountDto.cs b/src/Coldairarrow.Entity/DTO/TaskCountDto.cs new file mode 100644 index 0000000..d719f06 --- /dev/null +++ b/src/Coldairarrow.Entity/DTO/TaskCountDto.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Coldairarrow.Entity.DTO +{ + public class TaskCountDto + { + public int State { get; set; } + + public int Count { get; set; } + } + + + public class AcceptTime + { + public DateTime Date { get; set; } + + public int Count { get; set; } + } +} diff --git a/src/Coldairarrow.Util/01.Coldairarrow.Util.csproj b/src/Coldairarrow.Util/01.Coldairarrow.Util.csproj index d7523c8..d471cc4 100644 --- a/src/Coldairarrow.Util/01.Coldairarrow.Util.csproj +++ b/src/Coldairarrow.Util/01.Coldairarrow.Util.csproj @@ -13,8 +13,8 @@ - - + +