From 5573750ed0d2302df49dd07901fadf3c8ef44d39 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期一, 11 八月 2025 15:58:24 +0800
Subject: [PATCH] feat:报名

---
 FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs |   63 +++++++++++++++++----
 FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml     |   10 +++
 FlexJobApi.Core/FlexJobApi.Core.xml                                               |   22 +++++++
 FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs           |   11 +++
 FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs        |   12 +++
 FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Commands/CollectTaskCommand.cs     |   16 ++++-
 FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Commands/ApplyTaskCommand.cs       |   26 ++++++++
 FlexJobApi.Core/FlexJobApi.Core.csproj                                            |    1 
 8 files changed, 142 insertions(+), 19 deletions(-)

diff --git a/FlexJobApi.Core/FlexJobApi.Core.csproj b/FlexJobApi.Core/FlexJobApi.Core.csproj
index e622fd7..7b5646b 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.csproj
+++ b/FlexJobApi.Core/FlexJobApi.Core.csproj
@@ -37,6 +37,7 @@
 
 	<ItemGroup>
 	  <Folder Include="Models\CommonServer\Schedules\Queries\" />
+	  <Folder Include="Models\FlexJobServer\TaskUsers\Queries\" />
 	</ItemGroup>
 
 </Project>
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index 02334e7..fbce0ba 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -3777,6 +3777,11 @@
             楠屾敹鐘舵��
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.HireStatus">
+            <summary>
+            褰曠敤鐘舵��
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.GetTaskInfosQueryResult.ObjectData">
             <summary>
             缁熻
@@ -3937,6 +3942,11 @@
             鍒涘缓鏃堕棿
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultItem.HireStatus">
+            <summary>
+            褰曠敤鐘舵��
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.TaskInfoRepository">
             <summary>
             浠诲姟浠撳簱
@@ -3951,12 +3961,22 @@
             <param name="logier"></param>
             <returns></returns>
         </member>
+        <member name="T:FlexJobApi.Core.ApplyTaskCommand">
+            <summary>
+            鎶ュ悕浠诲姟
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ApplyTaskCommand.Ids">
+            <summary>
+            浠诲姟Id
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.CollectTaskCommand">
             <summary>
             鏀惰棌浠诲姟
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.CollectTaskCommand.Id">
+        <member name="P:FlexJobApi.Core.CollectTaskCommand.Ids">
             <summary>
             浠诲姟Id
             </summary>
diff --git a/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Commands/ApplyTaskCommand.cs b/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Commands/ApplyTaskCommand.cs
new file mode 100644
index 0000000..b334f8c
--- /dev/null
+++ b/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Commands/ApplyTaskCommand.cs
@@ -0,0 +1,26 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鎶ュ悕浠诲姟
+    /// </summary>
+    [Resource([EnumResourceController.TaskUser])]
+    public class ApplyTaskCommand : IRequest<int>
+    {
+        public ApplyTaskCommand()
+        {
+            Ids = [];
+        }
+
+        /// <summary>
+        /// 浠诲姟Id
+        /// </summary>
+        public List<Guid> Ids { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Commands/CollectTaskCommand.cs b/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Commands/CollectTaskCommand.cs
index 6188d71..0d8e881 100644
--- a/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Commands/CollectTaskCommand.cs
+++ b/FlexJobApi.Core/Models/FlexJobServer/TaskUsers/Commands/CollectTaskCommand.cs
@@ -10,12 +10,22 @@
     /// <summary>
     /// 鏀惰棌浠诲姟
     /// </summary>
-    [Resource([EnumResourceController.Task])]
-    public class CollectTaskCommand : IRequest<bool>
+    [Resource([EnumResourceController.TaskUser])]
+    public class CollectTaskCommand : IRequest<int>
     {
+        public CollectTaskCommand()
+        {
+            Ids = [];
+        }
+
         /// <summary>
         /// 浠诲姟Id
         /// </summary>
-        public Guid Id { get; set; }
+        public List<Guid> Ids { get; set; }
+
+        /// <summary>
+        /// 鏄惁鏀惰棌
+        /// </summary>
+        public bool IsCollect { get; set; }
     }
 }
diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
index d64ade0..80a6fef 100644
--- a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
+++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfosQuery.cs
@@ -16,6 +16,7 @@
         public GetTaskInfosQuery()
         {
             BenefitCodes = [];
+            HireStatus = [];
         }
 
         /// <summary>
@@ -77,6 +78,11 @@
         /// 楠屾敹鐘舵��
         /// </summary>
         public EnumTaskCheckReceiveStatus? CheckReceiveStatus { get; set; }
+
+        /// <summary>
+        /// 褰曠敤鐘舵��
+        /// </summary>
+        public List<EnumTaskUserHireStatus> HireStatus { get; set; }
     }
 
     public class GetTaskInfosQueryResult : PagedListQueryResult<GetTaskInfosQueryResultItem>
@@ -245,5 +251,10 @@
         /// 鍒涘缓鏃堕棿
         /// </summary>
         public DateTimeOffset CreatedTime { get; set; }
+
+        /// <summary>
+        /// 褰曠敤鐘舵��
+        /// </summary>
+        public EnumTaskUserHireStatus? HireStatus { get; set; }
     }
 }
diff --git a/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml b/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml
index d92683a..b295f1a 100644
--- a/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml
+++ b/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml
@@ -78,7 +78,7 @@
             浠诲姟闆囦剑鍛戒护澶勭悊鍣�
             </summary>
         </member>
-        <member name="M:FlexJobApi.FlexJobServer.Application.TaskUserCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserTaskCollect})">
+        <member name="M:FlexJobApi.FlexJobServer.Application.TaskUserCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfoUser},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.UserTaskCollect})">
             <summary>
             浠诲姟闆囦剑鍛戒护澶勭悊鍣�
             </summary>
@@ -91,5 +91,13 @@
             <param name="cancellationToken"></param>
             <returns></returns>
         </member>
+        <member name="M:FlexJobApi.FlexJobServer.Application.TaskUserCommandHandler.Handle(FlexJobApi.Core.ApplyTaskCommand,System.Threading.CancellationToken)">
+            <summary>
+            鎶ュ悕浠诲姟
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
     </members>
 </doc>
diff --git a/FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs b/FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs
index 6b6b6f3..0f9abe1 100644
--- a/FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs
+++ b/FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs
@@ -14,10 +14,13 @@
     /// 浠诲姟闆囦剑鍛戒护澶勭悊鍣�
     /// </summary>
     public class TaskUserCommandHandler(
+            IRepository<TaskInfoUser> rep,
             IRepository<UserTaskCollect> repUserTaskCollect
         ) :
-        IRequestHandler<CollectTaskCommand, bool>
+        IRequestHandler<CollectTaskCommand, int>,
+        IRequestHandler<ApplyTaskCommand, int>
     {
+        private readonly IRepository<TaskInfoUser> rep = rep;
         private readonly IRepository<UserTaskCollect> repUserTaskCollect = repUserTaskCollect;
 
         /// <summary>
@@ -26,22 +29,58 @@
         /// <param name="request"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task<bool> Handle(CollectTaskCommand request, CancellationToken cancellationToken)
+        public async Task<int> Handle(CollectTaskCommand request, CancellationToken cancellationToken)
         {
             var logier = JwtUtils.GetCurrentLogier();
-            var entity = await repUserTaskCollect.AsQueryable().AsNoTracking()
-                .Where(it => it.TaskInfoId == request.Id && it.UserId == logier.Id)
-                .FirstOrDefaultAsync(cancellationToken);
-            if (entity == null)
+            var collects = await repUserTaskCollect.AsQueryable().AsNoTracking()
+                .Where(it => request.Ids.Contains(it.TaskInfoId) && it.UserId == logier.Id)
+                .ToListAsync(cancellationToken);
+            if (request.IsCollect)
             {
-                entity = new UserTaskCollect
+                var addIds = request.Ids.Where(it => !collects.Any(c => c.TaskInfoId == it)).ToList();
+                foreach (var addId in addIds)
                 {
-                    TaskInfoId = request.Id,
-                    UserId = logier.Id
-                };
-                await repUserTaskCollect.InsertAsync(entity);
+                    var entity = new UserTaskCollect
+                    {
+                        TaskInfoId = addId,
+                        UserId = logier.Id
+                    };
+                    await repUserTaskCollect.InsertAsync(entity);
+                }
+                return addIds.Count;
             }
-            return true;
+            else
+            {
+                await repUserTaskCollect.DeleteAsync(collects);
+                return collects.Count;
+            }
+        }
+
+        /// <summary>
+        /// 鎶ュ悕浠诲姟
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<int> Handle(ApplyTaskCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            var applyIds = await rep.AsQueryable().AsNoTracking()
+                .Where(it => request.Ids.Contains(it.TaskInfoId) && it.UserId == logier.Id)
+                .Select(it => it.TaskInfoId)
+                .ToListAsync(cancellationToken);
+            var addIds = request.Ids.Where(it => !applyIds.Contains(it)).ToList();
+            foreach (var addId in addIds)
+            {
+                var entity = new TaskInfoUser
+                {
+                    TaskInfoId = addId,
+                    UserId = logier.Id,
+                    HireStatus = EnumTaskUserHireStatus.Wait
+                };
+                await rep.InsertAsync(entity);
+            }
+            return addIds.Count;
         }
     }
 }
diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
index 40d49f9..e3468a9 100644
--- a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
+++ b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
@@ -52,7 +52,8 @@
         /// <returns></returns>
         public async Task<GetTaskInfosQueryResult> Handle(GetTaskInfosQuery request, CancellationToken cancellationToken)
         {
-            var q = TaskInfoRepository.GetQueryable(rep);
+            var logier = JwtUtils.GetCurrentLogier();
+            var q = TaskInfoRepository.GetQueryable(rep, true, logier);
             if (request.Keywords.IsNotNull())
             {
                 q = q.Where(it => it.Name.Contains(request.Keywords));
@@ -80,6 +81,10 @@
             if (request.GenderLimit.HasValue)
             {
                 q = q.Where(it => it.GenderLimit == request.GenderLimit);
+            }
+            if (request.HireStatus.IsNotNull() && logier.Type == EnumUserType.Personal)
+            {
+                q = q.Where(it => it.Users.Any(u => u.UserId == logier.Id && request.HireStatus.Contains(u.HireStatus)));
             }
 
             var count = new GetTaskInfosQueryResultObjectData
@@ -142,7 +147,10 @@
                         CheckReceiveStatus = t.CheckReceiveStatus,
                         CreatedTime = t.CreatedTime,
                         RecommendStatus = t.RecommendStatus,
-                        SettlementStatus = t.SettlementStatus
+                        SettlementStatus = t.SettlementStatus,
+                        HireStatus = logier != null
+                            ? t.Users.Where(it => it.UserId == logier.Id).Select(u => u.HireStatus).FirstOrDefault()
+                            : null
                     };
             var result = await request.PageModel.GetPagedListAsync<GetTaskInfosQueryResult, GetTaskInfosQueryResultItem>(s, cancellationToken);
             result.ObjectData = count;

--
Gitblit v1.9.1