From f225a90acdf4887eeb0f433ad8f9f30b8495c694 Mon Sep 17 00:00:00 2001
From: feng <279202647@qq.com>
Date: Mon, 6 Dec 2021 17:58:39 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E4=BB=BB=E5=8A=A1=E6=B1=A0?=
 =?UTF-8?q?=E9=9A=94=E5=A4=A9=E5=88=86=E9=85=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../05.Coldairarrow.Api.csproj                |   1 +
 .../HuiYan/pricetasklogController.cs          |  12 +-
 src/Coldairarrow.Api/Startup.cs               |   9 +-
 .../HuiYan/pricetasklogBusiness.cs            | 121 ++++++++++++++++--
 src/Coldairarrow.Entity/DTO/PriceUserCount.cs |  25 ++++
 .../HuiYan/IpricetasklogBusiness.cs           |   2 +
 6 files changed, 152 insertions(+), 18 deletions(-)
 create mode 100644 src/Coldairarrow.Entity/DTO/PriceUserCount.cs

diff --git a/src/Coldairarrow.Api/05.Coldairarrow.Api.csproj b/src/Coldairarrow.Api/05.Coldairarrow.Api.csproj
index ec2bb6f..2681e9e 100644
--- a/src/Coldairarrow.Api/05.Coldairarrow.Api.csproj
+++ b/src/Coldairarrow.Api/05.Coldairarrow.Api.csproj
@@ -26,6 +26,7 @@
   </Target>
 
   <ItemGroup>
+    <PackageReference Include="AttributeQuartz.Net" Version="1.0.0" />
     <PackageReference Include="Colder.Logging.Serilog" Version="1.2.17" />
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.5" />
     <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.5" />
diff --git a/src/Coldairarrow.Api/Controllers/HuiYan/pricetasklogController.cs b/src/Coldairarrow.Api/Controllers/HuiYan/pricetasklogController.cs
index 0fd67df..04aba99 100644
--- a/src/Coldairarrow.Api/Controllers/HuiYan/pricetasklogController.cs
+++ b/src/Coldairarrow.Api/Controllers/HuiYan/pricetasklogController.cs
@@ -1,4 +1,5 @@
-using Coldairarrow.Business.HuiYan;
+using AttributeQuartz;
+using Coldairarrow.Business.HuiYan;
 using Coldairarrow.Business.MDS;
 using Coldairarrow.Entity.DTO;
 using Coldairarrow.Entity.HuiYan;
@@ -124,5 +125,14 @@ namespace Coldairarrow.Api.Controllers.HuiYan
         {
             return _pricetasklogBus.SetState(id, state);
         }
+
+        [HttpGet("/task/dayrun")]
+        [AllowAnonymous]
+        [QuartzTask(CronExpression = "0 0 7 * * ?", Router ="/task/dayrun")]
+        public AjaxResult DayTaskSet()
+        {
+            _pricetasklogBus.DayTaskSet();
+            return Success();
+        }
     }
 }
\ No newline at end of file
diff --git a/src/Coldairarrow.Api/Startup.cs b/src/Coldairarrow.Api/Startup.cs
index 69d583d..bb99667 100644
--- a/src/Coldairarrow.Api/Startup.cs
+++ b/src/Coldairarrow.Api/Startup.cs
@@ -1,4 +1,5 @@
-using Coldairarrow.Util;
+using AttributeQuartz;
+using Coldairarrow.Util;
 using Coldairarrow.Util.DataAccess;
 using EFCore.Sharding;
 using Microsoft.AspNetCore.Builder;
@@ -58,7 +59,8 @@ namespace Coldairarrow.Api
             });
 
             //jwt
-            services.AddJwt(_configuration);
+            services.AddJwt(_configuration); 
+            services.AddAttributeQuartz();
         }
 
         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
@@ -92,7 +94,8 @@ namespace Coldairarrow.Api
                 })
                 .UseOpenApi()//添加swagger生成api文档(默认路由文档 /swagger/v1/swagger.json)
                 .UseSwaggerUi3()//添加Swagger UI到请求管道中(默认路由: /swagger).
-                ;
+                ; 
+            app.StartAttributeQuartz(_configuration["WebRootUrl"]);
         }
     }
 }
diff --git a/src/Coldairarrow.Business/HuiYan/pricetasklogBusiness.cs b/src/Coldairarrow.Business/HuiYan/pricetasklogBusiness.cs
index 7a67759..f0d465d 100644
--- a/src/Coldairarrow.Business/HuiYan/pricetasklogBusiness.cs
+++ b/src/Coldairarrow.Business/HuiYan/pricetasklogBusiness.cs
@@ -120,6 +120,89 @@ namespace Coldairarrow.Business.HuiYan
             return Success(new { MaxCount = user.MaxPriceTaskCount, Count = user.MaxPriceTaskCount - nowCount });
         }
 
+        public AjaxResult DayTaskSet()
+        {
+            var users = _iuserBusiness.GetPriceTaskUserList().ToList();
+
+            Expression<Func<user, pricetasklog, PricetaskUser>> select = (a, b) => new PricetaskUser()
+            {
+                UserName = a.UserName,
+                MaxTaskCount = a.MaxPriceTaskCount,
+                Uid = a.Id
+            };
+
+            select = select.BuildExtendSelectExpre();
+
+            var q_User = Db.GetIQueryable<pricetasklog>().Where(c => c.CreateTime.Date == DateTime.Now.Date || c.CreateTime == DateTime.MinValue);
+
+            var q = from a in users
+                    join b in q_User on a.Id equals b.UserId into ab
+                    from b in ab.DefaultIfEmpty()
+                    select @select.Invoke(a, b);
+
+
+            var userList = q.GroupBy(c => c.Uid).Where(c => c.Count() < c.FirstOrDefault()?.MaxTaskCount).Select(c => new PriceUserCount(c.Key, c.Count(), c.Max(c => c.MaxTaskCount) ?? 30)).ToList();
+
+
+            var teamItemList = Db.GetIQueryable<teamitems>().Where(c => c.State == (int)TeamItemState.已发布比价 && string.IsNullOrEmpty(c.PriceTaskUserId)).ToList();
+
+
+
+            var result = Db.RunTransaction(() =>
+            {
+
+                List<pricetasklog> pricetasklogs = new List<pricetasklog>();
+
+                teamItemList.ForEach(teamItem =>
+                {
+
+                    var user = userList.Where(c => c.Count < c.MaxCount).OrderBy(c => c.Count).FirstOrDefault();
+
+                    if (user == null)
+                    {
+                        return;
+                    }
+
+                    teamItem.PriceTaskUserId = user.UserId;
+
+                    user.Count += 1;
+
+
+                    pricetasklogs.Add(new pricetasklog()
+                    {
+                        CreateTime = DateTime.Now,
+                        Id = IdHelper.GetId(),
+                        CreatorId = _operator.UserId,
+                        Deleted = false,
+                        ItemId = teamItem.ItemId,
+                        UserId = user.UserId,
+                        State = PriceTaskState.待比价,
+                        TeamItemId = teamItem.Id
+                    });
+
+                });
+
+                int row = Db.Insert(pricetasklogs);
+                if (row <= 0)
+                {
+                    throw new Exception("执行定时任务分配错误!");
+                }
+                row = Db.Update(teamItemList, new List<string>() { "PriceTaskUserId" });
+                if (row <= 0)
+                {
+                    throw new Exception("执行定时任务分配更新任务信息错误!");
+                }
+            });
+
+
+            if (!result.Success)
+            {
+                DingHelper.DingApiHelper.Main.SendNotify("齐越慧眼比价系统任务分配异常!");
+            }
+
+            return Success("任务分配成功!");
+        }
+
         public AjaxResult CanelTask(string teamItemId)
         {
             var teamItem = Db.GetIQueryable<teamitems>().FirstOrDefault(c => c.Id == teamItemId && c.UserId == _operator.UserId);
@@ -199,7 +282,7 @@ namespace Coldairarrow.Business.HuiYan
                 DingHelper.DingApiHelper.Main.SendNotify("齐越慧眼比价系统任务量已达上限!");
 
                 //钉钉推送
-                return Error("当前任务量已超过任务池可用任务量!");
+              //  return Error("当前任务量已超过任务池可用任务量!");
             }
 
 
@@ -207,27 +290,37 @@ namespace Coldairarrow.Business.HuiYan
             {
                 int row = Db.Update<teamitems>(c => c.Id == teamItem.Id, (item) =>
                 {
-                    item.PriceTaskUserId = user.Id;
+                    if (user != null)
+                    {
+                        item.PriceTaskUserId = user.Id;
+                    }
+                    else {
+                        item.PriceTaskUserId = null;
+                    }
+
                     item.State = (int)TeamItemState.已发布比价;
                 });
 
                 if (row <= 0)
                     throw new Exception("系统繁忙!");
 
-                row = Db.Insert(new pricetasklog()
+                if (user != null)
                 {
-                    CreateTime = DateTime.Now,
-                    Id = IdHelper.GetId(),
-                    CreatorId = _operator.UserId,
-                    Deleted = false,
-                    ItemId = teamItem.ItemId,
-                    UserId = user.Id,
-                    State = PriceTaskState.待比价,
-                    TeamItemId = teamItem.Id
-                });
+                    row = Db.Insert(new pricetasklog()
+                    {
+                        CreateTime = DateTime.Now,
+                        Id = IdHelper.GetId(),
+                        CreatorId = _operator.UserId,
+                        Deleted = false,
+                        ItemId = teamItem.ItemId,
+                        UserId = user.Id,
+                        State = PriceTaskState.待比价,
+                        TeamItemId = teamItem.Id
+                    });
 
-                if (row <= 0)
-                    throw new Exception("系统任务繁忙!");
+                    if (row <= 0)
+                        throw new Exception("系统任务繁忙!");
+                }
 
             });
 
diff --git a/src/Coldairarrow.Entity/DTO/PriceUserCount.cs b/src/Coldairarrow.Entity/DTO/PriceUserCount.cs
new file mode 100644
index 0000000..2bb68e3
--- /dev/null
+++ b/src/Coldairarrow.Entity/DTO/PriceUserCount.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Coldairarrow.Entity.DTO
+{
+    public class PriceUserCount
+    {
+
+        public int Count { get; set; }
+
+        public string UserId { get; set; }
+
+        public int MaxCount { get; set; }
+
+        public PriceUserCount(string id,int count,int maxCount)
+        {
+            MaxCount = maxCount;
+            Count = count;
+            UserId = id;
+        }
+    }
+}
diff --git a/src/Coldairarrow.IBusiness/HuiYan/IpricetasklogBusiness.cs b/src/Coldairarrow.IBusiness/HuiYan/IpricetasklogBusiness.cs
index c728861..8df3499 100644
--- a/src/Coldairarrow.IBusiness/HuiYan/IpricetasklogBusiness.cs
+++ b/src/Coldairarrow.IBusiness/HuiYan/IpricetasklogBusiness.cs
@@ -21,5 +21,7 @@ namespace Coldairarrow.Business.HuiYan
         AjaxResult CanelTask(string teamItemId);
         AjaxResult SetState(string id, int state);
         AjaxResult GetMyCount();
+
+        AjaxResult DayTaskSet();
     }
 }
\ No newline at end of file