From fc35150cfe2401b93fa9f4d536b5e151b904bdf7 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期三, 13 八月 2025 16:40:38 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseUserCollect.cs           |   54 +++++++++
 FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs  |   12 +-
 FlexJobApi.Core/Models/UserServer/UserResumes/Commands/CollectUserResumeCommand.cs |   26 ++++
 FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml      |    2 
 FlexJobApi.UserServer.Application/UserResumes/Commands/UserResumeCommandHandler.cs |   76 ++++++++++++
 FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs             |    5 
 FlexJobApi.Core/FlexJobApi.Core.xml                                                |   85 +++++++++++++
 FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml            |   18 ++
 FlexJobApi.Core/Models/UserServer/UserResumes/Commands/ContactUserResumeCommand.cs |   21 +++
 FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs         |    2 
 FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskUserCollect.cs                    |    2 
 11 files changed, 286 insertions(+), 17 deletions(-)

diff --git a/FlexJobApi.Core/Entities/FlexJobServer/Tasks/UserTaskCollect.cs b/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskUserCollect.cs
similarity index 93%
rename from FlexJobApi.Core/Entities/FlexJobServer/Tasks/UserTaskCollect.cs
rename to FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskUserCollect.cs
index f41cb8b..b036cea 100644
--- a/FlexJobApi.Core/Entities/FlexJobServer/Tasks/UserTaskCollect.cs
+++ b/FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskUserCollect.cs
@@ -9,7 +9,7 @@
     /// <summary>
     /// 鐢ㄦ埛浠诲姟鏀惰棌
     /// </summary>
-    public class UserTaskCollect : CommonEntity
+    public class TaskUserCollect : CommonEntity
     {
         /// <summary>
         /// 鐢ㄦ埛Id
diff --git a/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseUserCollect.cs b/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseUserCollect.cs
new file mode 100644
index 0000000..311a309
--- /dev/null
+++ b/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseUserCollect.cs
@@ -0,0 +1,54 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 浼佷笟鏀惰棌鐢ㄦ埛
+    /// </summary>
+    public class EnterpriseUserCollect : CommonEntity
+    {
+        /// <summary>
+        /// 浼佷笟Id
+        /// </summary>
+        public Guid EnterpriseId { get; set; }
+
+        /// <summary>
+        /// 浼佷笟
+        /// </summary>
+        public Enterprise Enterprise { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛淇℃伅Id
+        /// </summary>
+        public Guid UserId { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛淇℃伅
+        /// </summary>
+        public User User { get; set; }
+
+        /// <summary>
+        /// 鏄惁宸叉敹钘�
+        /// </summary>
+        public bool IsCollected { get; set; }
+
+        /// <summary>
+        /// 鏀惰棌鏃堕棿
+        /// </summary>
+        public DateTime? CollectedTime { get; set; }
+
+        /// <summary>
+        /// 鏄惁宸茶仈绯�
+        /// </summary>
+        public bool IsContacted { get; set; }
+
+        /// <summary>
+        /// 鑱旂郴鏃堕棿
+        /// </summary>
+        public DateTime? ContactedTime { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index 3bf7f1a..5568d03 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -1034,27 +1034,27 @@
             闄勪欢
             </summary>
         </member>
-        <member name="T:FlexJobApi.Core.UserTaskCollect">
+        <member name="T:FlexJobApi.Core.TaskUserCollect">
             <summary>
             鐢ㄦ埛浠诲姟鏀惰棌
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.UserTaskCollect.UserId">
+        <member name="P:FlexJobApi.Core.TaskUserCollect.UserId">
             <summary>
             鐢ㄦ埛Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.UserTaskCollect.User">
+        <member name="P:FlexJobApi.Core.TaskUserCollect.User">
             <summary>
             鐢ㄦ埛
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.UserTaskCollect.TaskInfoId">
+        <member name="P:FlexJobApi.Core.TaskUserCollect.TaskInfoId">
             <summary>
             浠诲姟Id
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.UserTaskCollect.TaskInfo">
+        <member name="P:FlexJobApi.Core.TaskUserCollect.TaskInfo">
             <summary>
             浠诲姟
             </summary>
@@ -1503,6 +1503,51 @@
         <member name="P:FlexJobApi.Core.EnterpriseEmployee.TaskInfoUsers">
             <summary>
             浠诲姟浜哄憳淇℃伅
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.EnterpriseUserCollect">
+            <summary>
+            浼佷笟鏀惰棌鐢ㄦ埛
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.EnterpriseUserCollect.EnterpriseId">
+            <summary>
+            浼佷笟Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.EnterpriseUserCollect.Enterprise">
+            <summary>
+            浼佷笟
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.EnterpriseUserCollect.UserId">
+            <summary>
+            鐢ㄦ埛淇℃伅Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.EnterpriseUserCollect.User">
+            <summary>
+            鐢ㄦ埛淇℃伅
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.EnterpriseUserCollect.IsCollected">
+            <summary>
+            鏄惁宸叉敹钘�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.EnterpriseUserCollect.CollectedTime">
+            <summary>
+            鏀惰棌鏃堕棿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.EnterpriseUserCollect.IsContacted">
+            <summary>
+            鏄惁宸茶仈绯�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.EnterpriseUserCollect.ContactedTime">
+            <summary>
+            鑱旂郴鏃堕棿
             </summary>
         </member>
         <member name="T:FlexJobApi.Core.Menu">
@@ -4666,6 +4711,11 @@
             浠诲姟鍚嶇О
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.Code">
+            <summary>
+            浠诲姟鍗曞彿
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.BillingMethod">
             <summary>
             缁撶畻鍛ㄦ湡
@@ -7154,6 +7204,31 @@
             鏄惁閫変腑
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.CollectUserResumeCommand">
+            <summary>
+            鏀惰棌鐏靛伐
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.CollectUserResumeCommand.Id">
+            <summary>
+            鐢ㄦ埛Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.CollectUserResumeCommand.IsCollected">
+            <summary>
+            鏄惁宸叉敹钘�
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.ContactUserResumeCommand">
+            <summary>
+            鑱旂郴鐏靛伐
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.ContactUserResumeCommand.Id">
+            <summary>
+            鐢ㄦ埛Id
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.DeleteUserResumeCredentialCommand">
             <summary>
             鍒犻櫎鐢ㄦ埛绠�鍘�-璧勬牸璇佷功
diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs
index b2e29cd..b87e2e4 100644
--- a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs
+++ b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs
@@ -71,6 +71,11 @@
         public string Name { get; set; }
 
         /// <summary>
+        /// 浠诲姟鍗曞彿
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
         /// 缁撶畻鍛ㄦ湡
         /// </summary>
         public EnumBillingMethod BillingMethod { get; set; }
diff --git a/FlexJobApi.Core/Models/UserServer/UserResumes/Commands/CollectUserResumeCommand.cs b/FlexJobApi.Core/Models/UserServer/UserResumes/Commands/CollectUserResumeCommand.cs
new file mode 100644
index 0000000..6454077
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/UserResumes/Commands/CollectUserResumeCommand.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.UserResume])]
+    public class CollectUserResumeCommand : IRequest<Guid>
+    {
+        /// <summary>
+        /// 鐢ㄦ埛Id
+        /// </summary>
+        public Guid Id { get; set; }
+
+        /// <summary>
+        /// 鏄惁宸叉敹钘�
+        /// </summary>
+        public bool IsCollected { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/UserServer/UserResumes/Commands/ContactUserResumeCommand.cs b/FlexJobApi.Core/Models/UserServer/UserResumes/Commands/ContactUserResumeCommand.cs
new file mode 100644
index 0000000..6fcf844
--- /dev/null
+++ b/FlexJobApi.Core/Models/UserServer/UserResumes/Commands/ContactUserResumeCommand.cs
@@ -0,0 +1,21 @@
+锘縰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.UserResume])]
+    public class ContactUserResumeCommand : IRequest<Guid>
+    {
+        /// <summary>
+        /// 鐢ㄦ埛Id
+        /// </summary>
+        public Guid Id { get; set; }
+    }
+}
diff --git a/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml b/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml
index 2873482..d7aa267 100644
--- a/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml
+++ b/FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml
@@ -196,7 +196,7 @@
             浠诲姟浜哄憳鍛戒护澶勭悊鍣�
             </summary>
         </member>
-        <member name="M:FlexJobApi.FlexJobServer.Application.TaskUserCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfoUser},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.TaskUserCollect})">
             <summary>
             浠诲姟浜哄憳鍛戒护澶勭悊鍣�
             </summary>
diff --git a/FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs b/FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs
index ad9edce..76760be 100644
--- a/FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs
+++ b/FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs
@@ -16,14 +16,14 @@
     /// </summary>
     public class TaskUserCommandHandler(
             IRepository<TaskInfoUser> rep,
-            IRepository<UserTaskCollect> repUserTaskCollect
+            IRepository<TaskUserCollect> repTaskUserCollect
         ) :
         IRequestHandler<CollectTaskCommand, int>,
         IRequestHandler<SetTaskUserHireCommand, Guid>,
         IRequestHandler<SetTaskUserArrangeCommand, Guid>
     {
         private readonly IRepository<TaskInfoUser> rep = rep;
-        private readonly IRepository<UserTaskCollect> repUserTaskCollect = repUserTaskCollect;
+        private readonly IRepository<TaskUserCollect> repTaskUserCollect = repTaskUserCollect;
 
         /// <summary>
         /// 鏀惰棌浠诲姟
@@ -34,7 +34,7 @@
         public async Task<int> Handle(CollectTaskCommand request, CancellationToken cancellationToken)
         {
             var logier = JwtUtils.GetCurrentLogier();
-            var collects = await repUserTaskCollect.AsQueryable().AsNoTracking()
+            var collects = await repTaskUserCollect.AsQueryable().AsNoTracking()
                 .Where(it => request.Ids.Contains(it.TaskInfoId) && it.UserId == logier.Id)
                 .ToListAsync(cancellationToken);
             if (request.IsCollect)
@@ -42,18 +42,18 @@
                 var addIds = request.Ids.Where(it => !collects.Any(c => c.TaskInfoId == it)).ToList();
                 foreach (var addId in addIds)
                 {
-                    var entity = new UserTaskCollect
+                    var entity = new TaskUserCollect
                     {
                         TaskInfoId = addId,
                         UserId = logier.Id
                     };
-                    await repUserTaskCollect.InsertAsync(entity);
+                    await repTaskUserCollect.InsertAsync(entity);
                 }
                 return addIds.Count;
             }
             else
             {
-                await repUserTaskCollect.DeleteAsync(collects);
+                await repTaskUserCollect.DeleteAsync(collects);
                 return collects.Count;
             }
         }
diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
index 50ab0f0..9b55d17 100644
--- a/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
+++ b/FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs
@@ -81,7 +81,7 @@
                         }
                     }
                 }
-                model.IsCollected = await rep.Change<UserTaskCollect>().AsQueryable().AsNoTracking()
+                model.IsCollected = await rep.Change<TaskUserCollect>().AsQueryable().AsNoTracking()
                     .AnyAsync(it => it.TaskInfoId == request.Id && it.UserId == logier.Id);
             }
             return model;
diff --git a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
index 4bb4519..d2c16a1 100644
--- a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
+++ b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml
@@ -502,7 +502,7 @@
             鐢ㄦ埛绠�鍘嗗懡浠ゅ鐞嗗櫒
             </summary>
         </member>
-        <member name="M:FlexJobApi.UserServer.Application.UserResumeCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User})">
+        <member name="M:FlexJobApi.UserServer.Application.UserResumeCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User},Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.EnterpriseUserCollect})">
             <summary>
             鐢ㄦ埛绠�鍘嗗懡浠ゅ鐞嗗櫒
             </summary>
@@ -555,6 +555,22 @@
             <param name="cancellationToken"></param>
             <returns></returns>
         </member>
+        <member name="M:FlexJobApi.UserServer.Application.UserResumeCommandHandler.Handle(FlexJobApi.Core.CollectUserResumeCommand,System.Threading.CancellationToken)">
+            <summary>
+            鏀惰棌鐏靛伐
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.UserServer.Application.UserResumeCommandHandler.Handle(FlexJobApi.Core.ContactUserResumeCommand,System.Threading.CancellationToken)">
+            <summary>
+            鑱旂郴鐏靛伐
+            </summary>
+            <param name="request"></param>
+            <param name="cancellationToken"></param>
+            <returns></returns>
+        </member>
         <member name="T:FlexJobApi.UserServer.Application.UserResumeQueryHandler">
             <summary>
             鐢ㄦ埛绠�鍘嗘煡璇㈠鐞嗗櫒
diff --git a/FlexJobApi.UserServer.Application/UserResumes/Commands/UserResumeCommandHandler.cs b/FlexJobApi.UserServer.Application/UserResumes/Commands/UserResumeCommandHandler.cs
index 4f681cd..128fbbe 100644
--- a/FlexJobApi.UserServer.Application/UserResumes/Commands/UserResumeCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/UserResumes/Commands/UserResumeCommandHandler.cs
@@ -16,16 +16,20 @@
     /// 鐢ㄦ埛绠�鍘嗗懡浠ゅ鐞嗗櫒
     /// </summary>
     public class UserResumeCommandHandler(
-            IRepository<User> rep
+            IRepository<User> rep,
+            IRepository<EnterpriseUserCollect> repEnterpriseUserCollect
         ) :
         IRequestHandler<SaveUserResumePersonalCommand, Guid>,
         IRequestHandler<SaveUserResumeJobSeekingCommand, Guid>,
         IRequestHandler<SaveUserResumeCredentialCommand, Guid>,
         IRequestHandler<DeleteUserResumeCredentialCommand, int>,
         IRequestHandler<SaveUserResumeWorkExperienceCommand, Guid>,
-        IRequestHandler<SaveUserResumeDetailCommand, Guid>
+        IRequestHandler<SaveUserResumeDetailCommand, Guid>,
+        IRequestHandler<CollectUserResumeCommand, Guid>,
+        IRequestHandler<ContactUserResumeCommand, Guid>
     {
         private readonly IRepository<User> rep = rep;
+        private readonly IRepository<EnterpriseUserCollect> repEnterpriseUserCollect = repEnterpriseUserCollect;
 
         /// <summary>
         /// 淇濆瓨鐢ㄦ埛绠�鍘�-涓汉淇℃伅
@@ -114,5 +118,73 @@
                 .Include(it => it.Photos)
                 .UpdateData(request, cancellationToken: cancellationToken);
         }
+
+        /// <summary>
+        /// 鏀惰棌鐏靛伐
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<Guid> Handle(CollectUserResumeCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            if (logier.Type != EnumUserType.Enterprise) throw Oops.Oh(EnumErrorCodeType.s400, "闇�浼佷笟鐢ㄦ埛鏂瑰彲鑱旂郴");
+            var entity = await repEnterpriseUserCollect.AsQueryable()
+                .FirstOrDefaultAsync(it => it.EnterpriseId == logier.EnterpriseId && it.UserId == request.Id);
+            if (entity == null)
+            {
+                entity = new EnterpriseUserCollect
+                {
+                    EnterpriseId = logier.EnterpriseId!.Value,
+                    UserId = request.Id,
+                    IsCollected = true,
+                    CollectedTime = request.IsCollected
+                        ? DateTime.Now
+                        : null
+                };
+                await repEnterpriseUserCollect.InsertAsync(entity);
+            }
+            else if (entity.IsCollected != request.IsCollected)
+            {
+                entity.IsCollected = request.IsCollected;
+                entity.CollectedTime = request.IsCollected
+                        ? DateTime.Now
+                        : null;
+                await repEnterpriseUserCollect.UpdateAsync(entity);
+            }
+            return entity.Id;
+        }
+
+        /// <summary>
+        /// 鑱旂郴鐏靛伐
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<Guid> Handle(ContactUserResumeCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            if (logier.Type != EnumUserType.Enterprise) throw Oops.Oh(EnumErrorCodeType.s400, "闇�浼佷笟鐢ㄦ埛鏂瑰彲鑱旂郴");
+            var entity = await repEnterpriseUserCollect.AsQueryable()
+                .FirstOrDefaultAsync(it => it.EnterpriseId == logier.EnterpriseId && it.UserId == request.Id);
+            if (entity == null)
+            {
+                entity = new EnterpriseUserCollect
+                {
+                    EnterpriseId = logier.EnterpriseId!.Value,
+                    UserId = request.Id,
+                    IsContacted = true,
+                    ContactedTime = DateTime.Now
+                };
+                await repEnterpriseUserCollect.InsertAsync(entity);
+            }
+            else if (entity.IsContacted == false)
+            {
+                entity.IsContacted = true;
+                entity.ContactedTime = DateTime.Now;
+                await repEnterpriseUserCollect.UpdateAsync(entity);
+            }
+            return entity.Id;
+        }
     }
 }

--
Gitblit v1.9.1