sunpengfei
2025-08-07 75463592b40199fbafb6930060ef679a05b5b714
feat:任务开发
9个文件已添加
11个文件已修改
1014 ■■■■■ 已修改文件
FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Application/FlexJobApi.Application.xml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Application/Tasks/Commands/TaskInfoCommandHandler.cs 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Application/Tasks/Queries/TaskInfoQueryHandler.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Entities/Tasks/TaskInfo.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Enums/Common/EnumResourceController.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Enums/Tasks/EnumTaskReleaseStatus.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Enums/Tasks/EnumTaskStatus.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.csproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.xml 346 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/Common/DictionaryDataQueryModel.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDataSelectQuery.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/Main/Tasks/Commands/SaveTaskInfoCommand.cs 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/Main/Tasks/Queries/GetTaskInfoQuery.cs 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/Main/Tasks/Queries/GetTaskInfosQuery.cs 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/Main/Tasks/Queryables/TaskInfoQueryable.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/JwtUtils/CurrentLogier.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/JwtUtils/JwtUtils.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.User.Application/Auths/Commands/PasswordLoginCommandHandler.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Application/Dictionaries/Commands/DictionaryDataCommandHandler.cs
@@ -83,6 +83,12 @@
            return request.SetIsDisabled<DictionaryData>(cancellationToken: cancellationToken);
        }
        /// <summary>
        /// 同步人力资源地区字典数据
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task<int> Handle(SyncHumanResourcesAreaDictionaryDataCommand request, CancellationToken cancellationToken)
        {
            var repHumanResourcesBaseArea = Db.GetRepository<BaseArea, HumanResourcesDbContextLocator>();
@@ -96,12 +102,19 @@
                CategoryId = categoryId
            });
            var parentAreas = areas.Where(it => it.ParentId == 0).ToList();
            LoopAdd(categoryId, entities, areas, parentAreas);
            LoopSyncHumanResourcesAreaDictionaryData(categoryId, entities, areas, parentAreas);
            await rep.Context.BulkInsertAsync(entities);
            return entities.Count;
        }
        public void LoopAdd(Guid categoryId, List<DictionaryData> entities, List<BaseArea> all, List<BaseArea> areas)
        /// <summary>
        /// 递归同步人力资源地区字典数据
        /// </summary>
        /// <param name="categoryId"></param>
        /// <param name="entities"></param>
        /// <param name="all"></param>
        /// <param name="areas"></param>
        private void LoopSyncHumanResourcesAreaDictionaryData(Guid categoryId, List<DictionaryData> entities, List<BaseArea> all, List<BaseArea> areas)
        {
            if (areas.IsNotNull())
            {
@@ -140,7 +153,7 @@
                    entities.Add(entity);
                    var children = all.Where(it => it.ParentId == area.AreaCode).ToList();
                    LoopAdd(categoryId, entities, all, children);
                    LoopSyncHumanResourcesAreaDictionaryData(categoryId, entities, all, children);
                }
            }
        }
FlexJobApi.Application/Dictionaries/Queries/DictionaryDatasQueryHandler.cs
@@ -80,9 +80,22 @@
                {
                    q = q
                        .OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime)
                        .Where(it =>
                            it.ParentId == request.ParentId
                            && !it.IsDisabled);
                        .Where(it => !it.IsDisabled);
                    if (!request.All)
                    {
                        q = q.Where(it => it.ParentId == request.ParentId);
                    }
                    if (request.Keywords.IsNotNull())
                    {
                        q = q.Where(it =>
                            it.Code.Contains(request.Keywords)
                            || it.Content.Contains(request.Keywords)
                            || it.Field1.Contains(request.Keywords)
                            || it.Field2.Contains(request.Keywords)
                            || it.Field3.Contains(request.Keywords)
                            || it.Field4.Contains(request.Keywords)
                            || it.Field5.Contains(request.Keywords));
                    }
                    if (request.CategoryId.HasValue)
                    {
                        q = q.Where(it => it.CategoryId == request.CategoryId);
FlexJobApi.Application/FlexJobApi.Application.xml
@@ -56,6 +56,23 @@
            <param name="cancellationToken"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Application.DictionaryDataCommandHandler.Handle(FlexJobApi.Core.SyncHumanResourcesAreaDictionaryDataCommand,System.Threading.CancellationToken)">
            <summary>
            同步人力资源地区字典数据
            </summary>
            <param name="request"></param>
            <param name="cancellationToken"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Application.DictionaryDataCommandHandler.LoopSyncHumanResourcesAreaDictionaryData(System.Guid,System.Collections.Generic.List{FlexJobApi.Core.DictionaryData},System.Collections.Generic.List{FlexJobApi.Core.BaseArea},System.Collections.Generic.List{FlexJobApi.Core.BaseArea})">
            <summary>
            递归同步人力资源地区字典数据
            </summary>
            <param name="categoryId"></param>
            <param name="entities"></param>
            <param name="all"></param>
            <param name="areas"></param>
        </member>
        <member name="T:FlexJobApi.Application.DictionaryCategoriesQueryHandler">
            <summary>
            数据字典类别查询处理器
@@ -108,5 +125,42 @@
            <param name="cancellationToken"></param>
            <returns></returns>
        </member>
        <member name="T:FlexJobApi.Application.TaskInfoCommandHandler">
            <summary>
            任务命令处理器
            </summary>
        </member>
        <member name="M:FlexJobApi.Application.TaskInfoCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfo})">
            <summary>
            任务命令处理器
            </summary>
        </member>
        <member name="M:FlexJobApi.Application.TaskInfoCommandHandler.Handle(FlexJobApi.Core.SaveTaskInfoCommand,System.Threading.CancellationToken)">
            <summary>
            保存任务
            </summary>
            <param name="request"></param>
            <param name="cancellationToken"></param>
            <returns></returns>
            <exception cref="T:System.NotImplementedException"></exception>
        </member>
        <member name="T:FlexJobApi.Application.TaskInfoQueryHandler">
            <summary>
            任务查询处理器
            </summary>
        </member>
        <member name="M:FlexJobApi.Application.TaskInfoQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfo})">
            <summary>
            任务查询处理器
            </summary>
        </member>
        <member name="M:FlexJobApi.Application.TaskInfoQueryHandler.Handle(FlexJobApi.Core.GetTaskInfoQuery,System.Threading.CancellationToken)">
            <summary>
            查询任务详情
            </summary>
            <param name="request"></param>
            <param name="cancellationToken"></param>
            <returns></returns>
        </member>
    </members>
</doc>
FlexJobApi.Application/Tasks/Commands/TaskInfoCommandHandler.cs
New file
@@ -0,0 +1,76 @@
using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using Furion.DistributedIDGenerator;
using Mapster;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Application
{
    /// <summary>
    /// 任务命令处理器
    /// </summary>
    public class TaskInfoCommandHandler(
            IRepository<TaskInfo> rep
        )
        : IRequestHandler<SaveTaskInfoCommand, Guid>
    {
        private readonly IRepository<TaskInfo> rep = rep;
        /// <summary>
        /// 保存任务
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        [UnitOfWork]
        public async Task<Guid> Handle(SaveTaskInfoCommand request, CancellationToken cancellationToken)
        {
            var logier = JwtUtils.GetCurrentLogier();
            return await request.SaveData<TaskInfo, SaveTaskInfoCommand>(
                 q => TaskInfoQueryable.GetQueryable(
                    rep,
                    q => q
                         .Include(it => it.Benefits)
                         .Include(it => it.CredentialLimits),
                    logier),
                 null,
                 (entity) =>
                 {
                     if (request.Id == null)
                     {
                         entity.EnterpriseId = logier.EnterpriseId.Value;
                         BuildCode(entity).Wait();
                     }
                     entity.Benefits = request.Benefits
                         .Select(it => new TaskInfoBenefit
                         {
                             BenefitCode = it
                         })
                         .ToList();
                     entity.CredentialLimits = request.CredentialLimits
                         .Select(it => new TaskInfoCredentialLimit
                         {
                             TypeCode = it
                         })
                         .ToList();
                     request.Adapt(entity);
                 },
                 cancellationToken);
        }
        private async Task BuildCode(TaskInfo entity)
        {
            entity.Code = $"{DateTime.Now:yyyyMMddHHmm}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}";
            var exist = await rep.AsQueryable().AsNoTracking()
               .AnyAsync(it => it.EnterpriseId == entity.EnterpriseId && it.Code == entity.Code);
            if (exist) await BuildCode(entity);
        }
    }
}
FlexJobApi.Application/Tasks/Queries/TaskInfoQueryHandler.cs
New file
@@ -0,0 +1,37 @@
using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using Mapster;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Application
{
    /// <summary>
    /// 任务查询处理器
    /// </summary>
    public class TaskInfoQueryHandler(
            IRepository<TaskInfo> rep
        )
        : IRequestHandler<GetTaskInfoQuery, GetTaskInfoQueryResult>
    {
        private readonly IRepository<TaskInfo> rep = rep;
        /// <summary>
        /// 查询任务详情
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task<GetTaskInfoQueryResult> Handle(GetTaskInfoQuery request, CancellationToken cancellationToken)
        {
            return TaskInfoQueryable.GetQueryable(rep, q => q.Where(it => it.Id == request.Id))
                .ProjectToType<GetTaskInfoQueryResult>()
                .FirstOrDefaultAsync(cancellationToken);
        }
    }
}
FlexJobApi.Core/Entities/Tasks/TaskInfo.cs
@@ -32,13 +32,18 @@
        public Enterprise Enterprise { get; set; }
        /// <summary>
        /// 任务单号
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 任务名称
        /// </summary>
        [Required]
        public string Name { get; set; }
        /// <summary>
        /// 计费方式
        /// 结算周期
        /// </summary>
        public EnumBillingMethod BillingMethod { get; set; }
@@ -112,6 +117,16 @@
        /// </summary>
        public DateTime EndTime { get; set; }
        /// <summary>
        /// 任务状态
        /// </summary>
        public EnumTaskStatus Status { get; set; }
        /// <summary>
        /// 发布状态
        /// </summary>
        public EnumTaskReleaseStatus ReleaseStatus { get; set; }
        public void Configure(EntityTypeBuilder<TaskInfo> entityBuilder, DbContext dbContext, Type dbContextLocator)
        {
            entityBuilder
FlexJobApi.Core/Enums/Common/EnumResourceController.cs
@@ -17,6 +17,12 @@
        [ResourceController(Service = EnumResourceService.Main)]
        Dictionary,
        /// <summary>
        /// 任务
        /// </summary>
        [ResourceController(Service = EnumResourceService.Main)]
        Task,
        /// <summary>
        /// 用户认证
        /// </summary>
        [ResourceController(Service = EnumResourceService.User)]
FlexJobApi.Core/Enums/Tasks/EnumTaskReleaseStatus.cs
New file
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 任务发布状态
    /// </summary>
    public enum EnumTaskReleaseStatus
    {
        /// <summary>
        /// 发布中
        /// </summary>
        InProcess = 20,
        /// <summary>
        /// 已停止
        /// </summary>
        Stopped = 100
    }
}
FlexJobApi.Core/Enums/Tasks/EnumTaskStatus.cs
New file
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 任务安排状态
    /// </summary>
    public enum EnumTaskStatus
    {
        /// <summary>
        /// 待安排
        /// </summary>
        Wait = 10,
        /// <summary>
        /// 已安排
        /// </summary>
        Complete = 20
    }
}
FlexJobApi.Core/FlexJobApi.Core.csproj
@@ -34,8 +34,4 @@
      </None>
    </ItemGroup>
    <ItemGroup>
      <Folder Include="Models\Main\TaskInfos\" />
    </ItemGroup>
</Project>
FlexJobApi.Core/FlexJobApi.Core.xml
@@ -544,6 +544,11 @@
            企业
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.TaskInfo.Code">
            <summary>
            任务单号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.TaskInfo.Name">
            <summary>
            任务名称
@@ -551,7 +556,7 @@
        </member>
        <member name="P:FlexJobApi.Core.TaskInfo.BillingMethod">
            <summary>
            计费方式
            结算周期
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.TaskInfo.ServiceFee">
@@ -622,6 +627,16 @@
        <member name="P:FlexJobApi.Core.TaskInfo.EndTime">
            <summary>
            任务结束时间
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.TaskInfo.Status">
            <summary>
            任务状态
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.TaskInfo.ReleaseStatus">
            <summary>
            发布状态
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.TaskInfoBenefit">
@@ -1784,6 +1799,11 @@
            数据字典
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumResourceController.Task">
            <summary>
            任务
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumResourceController.Auth">
            <summary>
            用户认证
@@ -1922,6 +1942,36 @@
        <member name="F:FlexJobApi.Core.EnumSettlementCycle.Day">
            <summary>
            日结
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.EnumTaskReleaseStatus">
            <summary>
            任务发布状态
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumTaskReleaseStatus.InProcess">
            <summary>
            发布中
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumTaskReleaseStatus.Stopped">
            <summary>
            已停止
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.EnumTaskStatus">
            <summary>
            任务安排状态
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumTaskStatus.Wait">
            <summary>
            待安排
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumTaskStatus.Complete">
            <summary>
            已安排
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.EnumTaskUserHireStatus">
@@ -2245,6 +2295,21 @@
            编号
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.Models.Common.DictionaryDataQueryModel">
            <summary>
            数据字典查询模型
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.Common.DictionaryDataQueryModel.Code">
            <summary>
            编号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.Common.DictionaryDataQueryModel.Name">
            <summary>
            名称
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.DeleteDictionaryCategoryCommand">
            <summary>
            删除数据字典类别
@@ -2445,6 +2510,16 @@
            上级Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetDictionaryDataSelectQuery.Keywords">
            <summary>
            关键字
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetDictionaryDataSelectQuery.All">
            <summary>
            查询所有
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetDictionaryDataSelectQueryResultOption.Id">
            <summary>
            Id
@@ -2503,6 +2578,11 @@
        <member name="P:FlexJobApi.Core.GetDictionaryDatasQuery.CategoryCode">
            <summary>
            类别编号(Id/编号二选一)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetDictionaryDatasQuery.ParentId">
            <summary>
            上级Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetDictionaryDatasQuery.Keywords">
@@ -2599,6 +2679,265 @@
            <summary>
            名称
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.SaveTaskInfoCommand">
            <summary>
            保存任务
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.Name">
            <summary>
            任务名称
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.BillingMethod">
            <summary>
            结算周期
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.ServiceFee">
            <summary>
            服务费
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.SettlementCycle">
            <summary>
            结算方式
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.Benefits">
            <summary>
            福利编号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.AgeMinLimit">
            <summary>
            年龄范围最小
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.AgeMaxLimit">
            <summary>
            年龄范围大
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.GenderLimit">
            <summary>
            性别要求
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.CredentialLimits">
            <summary>
            资格证书类型编号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.ProvinceCode">
            <summary>
            任务地点所属省份编号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.CityCode">
            <summary>
            任务地点所属城市编号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.Address">
            <summary>
            任务地点详细地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.BeginTime">
            <summary>
            任务开始时间
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SaveTaskInfoCommand.EndTime">
            <summary>
            任务结束时间
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetTaskInfoQuery">
            <summary>
            查询任务详情
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQuery.Id">
            <summary>
            Id
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetTaskInfoQueryResult">
            <summary>
            查询任务详情-结果
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.Id">
            <summary>
            Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.Name">
            <summary>
            任务名称
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.BillingMethod">
            <summary>
            结算周期
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.ServiceFee">
            <summary>
            服务费
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.SettlementCycle">
            <summary>
            结算方式
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.Benefits">
            <summary>
            福利
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.AgeMinLimit">
            <summary>
            年龄范围最小
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.AgeMaxLimit">
            <summary>
            年龄范围大
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.GenderLimit">
            <summary>
            性别要求
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.CredentialLimits">
            <summary>
            资格证书类型
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.ProvinceCode">
            <summary>
            任务地点所属省份编号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.ProvinceName">
            <summary>
            任务地点所属省份
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.CityCode">
            <summary>
            任务地点所属城市编号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.CityName">
            <summary>
            任务地点所属城市
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.Address">
            <summary>
            任务地点详细地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.BeginTime">
            <summary>
            任务开始时间
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.EndTime">
            <summary>
            任务结束时间
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfoQueryResult.CreatedTime">
            <summary>
            创建时间
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetTaskInfosQuery">
            <summary>
            查询任务分页列表
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.Keywords">
            <summary>
            关键字(任务名称)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.Time">
            <summary>
            发布时间
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.Status">
            <summary>
            任务状态
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQuery.ReleaseStatus">
            <summary>
            发布状态
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetTaskInfosQueryResultItem">
            <summary>
            查询任务分页列表-结果-项
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultItem.Name">
            <summary>
            任务名称
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultItem.Code">
            <summary>
            任务单号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultItem.BillingMethod">
            <summary>
            结算周期
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultItem.ServiceFee">
            <summary>
            服务费
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultItem.SettlementCycle">
            <summary>
            结算方式
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultItem.GenderLimit">
            <summary>
            性别要求
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetTaskInfosQueryResultItem.UserCount">
            <summary>
            报名人数
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.TaskInfoQueryable">
            <summary>
            任务查询
            </summary>
        </member>
        <member name="M:FlexJobApi.Core.TaskInfoQueryable.GetQueryable(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfo},System.Func{System.Linq.IQueryable{FlexJobApi.Core.TaskInfo},System.Linq.IQueryable{FlexJobApi.Core.TaskInfo}},FlexJobApi.Core.CurrentLogier)">
            <summary>
            获取任务查询
            </summary>
            <param name="rep"></param>
            <param name="query"></param>
            <param name="logier"></param>
            <returns></returns>
        </member>
        <member name="T:FlexJobApi.Core.PasswordLoginCommand">
            <summary>
@@ -4966,6 +5305,11 @@
            客户端类型
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.CurrentLogier.EnterpriseId">
            <summary>
            企业Id
            </summary>
        </member>
        <member name="M:FlexJobApi.Core.JwtHandler.PipelineAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext,Microsoft.AspNetCore.Http.DefaultHttpContext)">
            <summary>
            验证管道,也就是验证核心代码
FlexJobApi.Core/Models/Common/DictionaryDataQueryModel.cs
New file
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core.Models.Common
{
    /// <summary>
    /// 数据字典查询模型
    /// </summary>
    public class DictionaryDataQueryModel
    {
        /// <summary>
        /// 编号
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
    }
}
FlexJobApi.Core/Models/Main/Dictionaries/Queries/GetDictionaryDataSelectQuery.cs
@@ -27,6 +27,16 @@
        /// 上级Id
        /// </summary>
        public Guid? ParentId { get; set; }
        /// <summary>
        /// 关键字
        /// </summary>
        public string Keywords { get; set; }
        /// <summary>
        /// 查询所有
        /// </summary>
        public bool All { get; set; }
    }
    public class GetDictionaryDataSelectQueryResultOption
FlexJobApi.Core/Models/Main/Tasks/Commands/SaveTaskInfoCommand.cs
New file
@@ -0,0 +1,107 @@
using Mapster;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 保存任务
    /// </summary>
    [Resource([EnumResourceController.Task])]
    public class SaveTaskInfoCommand : SaveDataCommand
    {
        public SaveTaskInfoCommand()
        {
            Benefits = [];
            CredentialLimits = [];
        }
        /// <summary>
        /// 任务名称
        /// </summary>
        [Required]
        public string Name { get; set; }
        /// <summary>
        /// 结算周期
        /// </summary>
        [Required]
        public EnumBillingMethod BillingMethod { get; set; }
        /// <summary>
        /// 服务费
        /// </summary>
        [Required]
        public decimal ServiceFee { get; set; }
        /// <summary>
        /// 结算方式
        /// </summary>
        [Required]
        public EnumSettlementCycle SettlementCycle { get; set; }
        /// <summary>
        /// 福利编号
        /// </summary>
        [AdaptIgnore]
        public List<string> Benefits { get; set; }
        /// <summary>
        /// 年龄范围最小
        /// </summary>
        [Required]
        public int AgeMinLimit { get; set; }
        /// <summary>
        /// 年龄范围大
        /// </summary>
        [Required]
        public int AgeMaxLimit { get; set; }
        /// <summary>
        /// 性别要求
        /// </summary>
        [Required]
        public EnumUserGender GenderLimit { get; set; }
        /// <summary>
        /// 资格证书类型编号
        /// </summary>
        [AdaptIgnore]
        public List<string> CredentialLimits { get; set; }
        /// <summary>
        /// 任务地点所属省份编号
        /// </summary>
        [Required]
        public string ProvinceCode { get; set; }
        /// <summary>
        /// 任务地点所属城市编号
        /// </summary>
        [Required]
        public string CityCode { get; set; }
        /// <summary>
        /// 任务地点详细地址
        /// </summary>
        [Required]
        public string Address { get; set; }
        /// <summary>
        /// 任务开始时间
        /// </summary>
        [Required]
        public DateTime BeginTime { get; set; }
        /// <summary>
        /// 任务结束时间
        /// </summary>
        [Required]
        public DateTime EndTime { get; set; }
    }
}
FlexJobApi.Core/Models/Main/Tasks/Queries/GetTaskInfoQuery.cs
New file
@@ -0,0 +1,126 @@
using FlexJobApi.Core.Models.Common;
using Mapster;
using MediatR;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 查询任务详情
    /// </summary>
    [Resource([EnumResourceController.Task])]
    public class GetTaskInfoQuery : IRequest<GetTaskInfoQueryResult>
    {
        /// <summary>
        /// Id
        /// </summary>
        public Guid Id { get; set; }
    }
    /// <summary>
    /// 查询任务详情-结果
    /// </summary>
    public class GetTaskInfoQueryResult
    {
        public GetTaskInfoQueryResult()
        {
            Benefits = [];
            CredentialLimits = [];
        }
        /// <summary>
        /// Id
        /// </summary>
        public Guid Id { get; set; }
        /// <summary>
        /// 任务名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 结算周期
        /// </summary>
        public EnumBillingMethod BillingMethod { get; set; }
        /// <summary>
        /// 服务费
        /// </summary>
        public decimal ServiceFee { get; set; }
        /// <summary>
        /// 结算方式
        /// </summary>
        public EnumSettlementCycle SettlementCycle { get; set; }
        /// <summary>
        /// 福利
        /// </summary>
        public List<DictionaryDataQueryModel> Benefits { get; set; }
        /// <summary>
        /// 年龄范围最小
        /// </summary>
        public int AgeMinLimit { get; set; }
        /// <summary>
        /// 年龄范围大
        /// </summary>
        public int AgeMaxLimit { get; set; }
        /// <summary>
        /// 性别要求
        /// </summary>
        public EnumUserGender GenderLimit { get; set; }
        /// <summary>
        /// 资格证书类型
        /// </summary>
        public List<DictionaryDataQueryModel> CredentialLimits { get; set; }
        /// <summary>
        /// 任务地点所属省份编号
        /// </summary>
        public string ProvinceCode { get; set; }
        /// <summary>
        /// 任务地点所属省份
        /// </summary>
        public string ProvinceName { get; set; }
        /// <summary>
        /// 任务地点所属城市编号
        /// </summary>
        public string CityCode { get; set; }
        /// <summary>
        /// 任务地点所属城市
        /// </summary>
        public string CityName { get; set; }
        /// <summary>
        /// 任务地点详细地址
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 任务开始时间
        /// </summary>
        public DateTime BeginTime { get; set; }
        /// <summary>
        /// 任务结束时间
        /// </summary>
        public DateTime EndTime { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTimeOffset CreatedTime { get; set; }
    }
}
FlexJobApi.Core/Models/Main/Tasks/Queries/GetTaskInfosQuery.cs
New file
@@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 查询任务分页列表
    /// </summary>
    [Resource([EnumResourceController.Task])]
    public class GetTaskInfosQuery : PagedListQuery<PagedListQueryResult<GetTaskInfosQueryResultItem>, GetTaskInfosQueryResultItem>
    {
        /// <summary>
        /// 关键字(任务名称)
        /// </summary>
        public string Keywords { get; set; }
        /// <summary>
        /// 发布时间
        /// </summary>
        public DateTime? Time { get; set; }
        /// <summary>
        /// 任务状态
        /// </summary>
        public EnumTaskStatus? Status { get; set; }
        /// <summary>
        /// 发布状态
        /// </summary>
        public EnumTaskReleaseStatus? ReleaseStatus { get; set; }
    }
    /// <summary>
    /// 查询任务分页列表-结果-项
    /// </summary>
    public class GetTaskInfosQueryResultItem
    {
        /// <summary>
        /// 任务名称
        /// </summary>
        [Required]
        public string Name { get; set; }
        /// <summary>
        /// 任务单号
        /// </summary>
        public string Code { get; set; }
        /// <summary>
        /// 结算周期
        /// </summary>
        public EnumBillingMethod BillingMethod { get; set; }
        /// <summary>
        /// 服务费
        /// </summary>
        public decimal ServiceFee { get; set; }
        /// <summary>
        /// 结算方式
        /// </summary>
        public EnumSettlementCycle SettlementCycle { get; set; }
        /// <summary>
        /// 性别要求
        /// </summary>
        public EnumUserGender GenderLimit { get; set; }
        /// <summary>
        /// 报名人数
        /// </summary>
        public int UserCount { get; set; }
    }
}
FlexJobApi.Core/Models/Main/Tasks/Queryables/TaskInfoQueryable.cs
New file
@@ -0,0 +1,34 @@
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 任务查询
    /// </summary>
    public static class TaskInfoQueryable
    {
        /// <summary>
        /// 获取任务查询
        /// </summary>
        /// <param name="rep"></param>
        /// <param name="query"></param>
        /// <param name="logier"></param>
        /// <returns></returns>
        public static IQueryable<TaskInfo> GetQueryable(this IRepository<TaskInfo> rep, Func<IQueryable<TaskInfo>, IQueryable<TaskInfo>> query, CurrentLogier logier = null)
        {
            logier = logier ?? JwtUtils.GetCurrentLogier();
            IQueryable<TaskInfo> q = rep.AsQueryable().AsNoTracking()
                .OrderBy(it => it.BeginTime);
            if (query != null) q = query(q);
            return q
                .Where(it => it.EnterpriseId == logier.EnterpriseId);
        }
    }
}
FlexJobApi.Core/Utils/JwtUtils/CurrentLogier.cs
@@ -57,5 +57,10 @@
        /// 客户端类型
        /// </summary>
        public EnumClientType ClientType { get; set; }
        /// <summary>
        /// 企业Id
        /// </summary>
        public Guid? EnterpriseId { get; set; }
    }
}
FlexJobApi.Core/Utils/JwtUtils/JwtUtils.cs
@@ -37,6 +37,7 @@
                { "Level",logier.Level },
                { "Type",logier.Type },
                { "ClientType",logier.ClientType },
                { "EnterpriseId",logier.EnterpriseId },
            });
            // 获取刷新 token
            logier.RefreshToken = JWTEncryption.GenerateRefreshToken(logier.AccessToken, 60 * 24);
@@ -64,6 +65,7 @@
                logier.PhoneNumber = App.User.FindFirstValue("PhoneNumber");
                logier.Type = App.User.FindFirstValue("Type").ToEnum<EnumUserType>("请填写用户类型").Value;
                logier.ClientType = App.User.FindFirstValue("ClientType").ToEnum<EnumClientType>("请填写客户端类型").Value;
                logier.EnterpriseId = App.User.FindFirstValue("EnterpriseId").ToGuid();
                return logier;
            }
            return null;
FlexJobApi.User.Application/Auths/Commands/PasswordLoginCommandHandler.cs
@@ -35,6 +35,7 @@
                    it.Id,
                    it.Avatar,
                    it.Level,
                    it.EnterpriseId,
                    it.UserAuth.Name,
                    it.UserAuth.UserName,
                    it.UserAuth.PhoneNumber,
@@ -54,7 +55,8 @@
                PhoneNumber = userInfo.PhoneNumber,
                Level = userInfo.Level,
                Type = request.Type,
                ClientType = request.ClientType
                ClientType = request.ClientType,
                EnterpriseId = userInfo.EnterpriseId,
            };
            JwtUtils.GenerateToken(logier);