sunpengfei
2025-08-13 fc35150cfe2401b93fa9f4d536b5e151b904bdf7
feat:开发
3个文件已添加
1 文件已重命名
7个文件已修改
303 ■■■■■ 已修改文件
FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskUserCollect.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseUserCollect.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.xml 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/FlexJobServer/Tasks/Queries/GetTaskInfoQuery.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/UserResumes/Commands/CollectUserResumeCommand.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/UserResumes/Commands/ContactUserResumeCommand.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.FlexJobServer.Application/FlexJobApi.FlexJobServer.Application.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.FlexJobServer.Application/TaskUsers/Commands/TaskUserCommandHandler.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.FlexJobServer.Application/Tasks/Queries/TaskInfoQueryHandler.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/UserResumes/Commands/UserResumeCommandHandler.cs 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Entities/FlexJobServer/Tasks/TaskUserCollect.cs
File was renamed from FlexJobApi.Core/Entities/FlexJobServer/Tasks/UserTaskCollect.cs
@@ -9,7 +9,7 @@
    /// <summary>
    /// 用户任务收藏
    /// </summary>
    public class UserTaskCollect : CommonEntity
    public class TaskUserCollect : CommonEntity
    {
        /// <summary>
        /// 用户Id
FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseUserCollect.cs
New file
@@ -0,0 +1,54 @@
using 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; }
    }
}
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>
            删除用户简历-资格证书
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; }
FlexJobApi.Core/Models/UserServer/UserResumes/Commands/CollectUserResumeCommand.cs
New file
@@ -0,0 +1,26 @@
using 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; }
    }
}
FlexJobApi.Core/Models/UserServer/UserResumes/Commands/ContactUserResumeCommand.cs
New file
@@ -0,0 +1,21 @@
using 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; }
    }
}
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>
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;
            }
        }
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;
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>
            用户简历查询处理器
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;
        }
    }
}