From 173a8e6a757e8c7c324d5d00cd1ec90d0f13d281 Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期四, 14 八月 2025 18:55:48 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.Web.Entry/Startup.cs | 4 FlexJobApi.Core/Jobs/CalcUserAgeByIdCardJob.cs | 34 ++++++ FlexJobApi.Core/Utils/ScheduleUtils/DbJobPersistence.cs | 16 -- FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserInfoRolesQuery.cs | 5 + FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.csproj | 1 FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs | 2 /dev/null | 45 --------- FlexJobApi.UserServer.Application/Users/Commands/UserInfoCommandHandler.cs | 29 +++++ FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml | 18 --- FlexJobApi.Core/FlexJobApi.Core.xml | 45 ++++----- FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml | 8 + FlexJobApi.Core/Jobs/CalcTaskSatusByDateJob.cs | 38 +++++++ FlexJobApi.Core/FlexJobApi.Core.csproj | 1 13 files changed, 140 insertions(+), 106 deletions(-) diff --git a/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.csproj b/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.csproj index 75e6e25..2f9d7bb 100644 --- a/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.csproj +++ b/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.csproj @@ -16,6 +16,7 @@ </ItemGroup> <ItemGroup> + <Folder Include="Schedules\Commands\" /> <Folder Include="Schedules\Queries\" /> </ItemGroup> diff --git a/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml b/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml index b0f27ae..f4cc7bc 100644 --- a/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml +++ b/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml @@ -141,24 +141,6 @@ <param name="models"></param> <param name="all"></param> </member> - <member name="T:FlexJobApi.CommonServer.Application.ScheduleJobDetailCommandHandler"> - <summary> - 浠诲姟璋冨害-浣滀笟 - </summary> - </member> - <member name="M:FlexJobApi.CommonServer.Application.ScheduleJobDetailCommandHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Resource},FlexJobApi.Core.ResourceHttpUtils,Furion.Schedule.ISchedulerFactory)"> - <summary> - 浠诲姟璋冨害-浣滀笟 - </summary> - </member> - <member name="M:FlexJobApi.CommonServer.Application.ScheduleJobDetailCommandHandler.Handle(FlexJobApi.Core.SaveScheduleJobDetailCommand,System.Threading.CancellationToken)"> - <summary> - 淇濆瓨浠诲姟璋冨害-浣滀笟 - </summary> - <param name="request"></param> - <param name="cancellationToken"></param> - <returns></returns> - </member> <member name="T:FlexJobApi.UserServer.Application.GetResourceFieldsQueryHandler"> <summary> 鑾峰彇璧勬簮瀛楁 diff --git a/FlexJobApi.CommonServer.Application/Schedules/Commands/ScheduleJobDetailCommandHandler.cs b/FlexJobApi.CommonServer.Application/Schedules/Commands/ScheduleJobDetailCommandHandler.cs deleted file mode 100644 index e258937..0000000 --- a/FlexJobApi.CommonServer.Application/Schedules/Commands/ScheduleJobDetailCommandHandler.cs +++ /dev/null @@ -1,48 +0,0 @@ -锘縰sing FlexJobApi.Core; -using Furion.DatabaseAccessor; -using Furion.FriendlyException; -using Furion.Schedule; -using MediatR; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Microsoft.Extensions.Options; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FlexJobApi.CommonServer.Application -{ - /// <summary> - /// 浠诲姟璋冨害-浣滀笟 - /// </summary> - public class ScheduleJobDetailCommandHandler( - IRepository<Resource> repResource, - ResourceHttpUtils resourceHttpUtils, - ISchedulerFactory schedulerFactory - ) : - IRequestHandler<SaveScheduleJobDetailCommand, bool> - { - private readonly IRepository<Resource> repResource = repResource; - private readonly ResourceHttpUtils resourceHttpUtils = resourceHttpUtils; - private readonly ISchedulerFactory schedulerFactory = schedulerFactory; - - /// <summary> - /// 淇濆瓨浠诲姟璋冨害-浣滀笟 - /// </summary> - /// <param name="request"></param> - /// <param name="cancellationToken"></param> - /// <returns></returns> - public Task<bool> Handle(SaveScheduleJobDetailCommand request, CancellationToken cancellationToken) - { - // 鍒涘缓 HTTP 浣滀笟娑堟伅 - var jobBuilder = JobBuilder - .Create<ResourceHttpJob>() - .AddProperty(nameof(ResourceHttpJob), Schedular.Serialize(request)); - // 娣诲姞浣滀笟 - schedulerFactory.AddJob(jobBuilder, Triggers.Cron(request.Cron, Furion.TimeCrontab.CronStringFormat.WithSeconds)); - return Task.FromResult(true); - } - } -} diff --git a/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs b/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs index 9fb8daf..5eba1fe 100644 --- a/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs +++ b/FlexJobApi.Core/Enums/Common/EnumErrorCodeType.cs @@ -28,7 +28,7 @@ /// <summary> /// 璇0}宸插瓨鍦紝璇风‘璁ゅ悗鍐嶈瘯 /// </summary> - [ErrorCodeItemMetadata("{0}涓嶅瓨鍦�")] + [ErrorCodeItemMetadata("璇0}宸插瓨鍦紝璇风‘璁ゅ悗鍐嶈瘯")] s405 = 405, /// <summary> /// 瀛樺湪閲嶅鏁版嵁锛歿0}锛岃纭鍚庡啀璇� diff --git a/FlexJobApi.Core/FlexJobApi.Core.csproj b/FlexJobApi.Core/FlexJobApi.Core.csproj index 7b5fbc5..a55ea21 100644 --- a/FlexJobApi.Core/FlexJobApi.Core.csproj +++ b/FlexJobApi.Core/FlexJobApi.Core.csproj @@ -38,6 +38,7 @@ </ItemGroup> <ItemGroup> + <Folder Include="Models\CommonServer\Schedules\Commands\" /> <Folder Include="Models\CommonServer\Schedules\Queries\" /> <Folder Include="Models\FlexJobServer\TaskUsers\Repositories\" /> </ItemGroup> diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml index 43f703d..ba8b6c1 100644 --- a/FlexJobApi.Core/FlexJobApi.Core.xml +++ b/FlexJobApi.Core/FlexJobApi.Core.xml @@ -3203,6 +3203,26 @@ 缂栧彿 </summary> </member> + <member name="T:FlexJobApi.Core.CalcTaskSatusByDateJob"> + <summary> + 瀹氭椂鎸夋棩鏈熻绠椾换鍔″彂甯冪姸鎬� + </summary> + </member> + <member name="M:FlexJobApi.Core.CalcTaskSatusByDateJob.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.TaskInfo})"> + <summary> + 瀹氭椂鎸夋棩鏈熻绠椾换鍔″彂甯冪姸鎬� + </summary> + </member> + <member name="T:FlexJobApi.Core.CalcUserAgeByIdCardJob"> + <summary> + 瀹氭椂鏍规嵁韬唤璇佽绠楃敤鎴峰勾榫� + </summary> + </member> + <member name="M:FlexJobApi.Core.CalcUserAgeByIdCardJob.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.User})"> + <summary> + 瀹氭椂鏍规嵁韬唤璇佽绠楃敤鎴峰勾榫� + </summary> + </member> <member name="T:FlexJobApi.Core.DeleteDictionaryCategoryCommand"> <summary> 鍒犻櫎鏁版嵁瀛楀吀绫诲埆 @@ -3803,26 +3823,6 @@ 鍝嶅簲绫诲瀷鍏ㄥ悕 </summary> </member> - <member name="T:FlexJobApi.Core.SaveScheduleJobDetailCommand"> - <summary> - 淇濆瓨浠诲姟璋冨害-浣滀笟 - </summary> - </member> - <member name="P:FlexJobApi.Core.SaveScheduleJobDetailCommand.ResourceId"> - <summary> - 璧勬簮Id - </summary> - </member> - <member name="P:FlexJobApi.Core.SaveScheduleJobDetailCommand.Body"> - <summary> - 璇锋眰鏁版嵁 - </summary> - </member> - <member name="P:FlexJobApi.Core.SaveScheduleJobDetailCommand.Cron"> - <summary> - Cron琛ㄨ揪寮� - </summary> - </member> <member name="T:FlexJobApi.Core.CheckReceiveTaskCommand"> <summary> 浠诲姟楠屾敹 @@ -4354,11 +4354,6 @@ <member name="P:FlexJobApi.Core.GetCheckReceiveTaskUserSubmitsQueryResultItem.CheckReceiveTime"> <summary> 楠屾敹鏃堕棿 - </summary> - </member> - <member name="T:FlexJobApi.Core.AutoTaskStatusByDateCommand"> - <summary> - 鎸夋棩鏈熶慨璁换鍔$姸鎬� </summary> </member> <member name="T:FlexJobApi.Core.DeleteTaskInfoCommand"> diff --git a/FlexJobApi.Core/Jobs/CalcTaskSatusByDateJob.cs b/FlexJobApi.Core/Jobs/CalcTaskSatusByDateJob.cs new file mode 100644 index 0000000..3341804 --- /dev/null +++ b/FlexJobApi.Core/Jobs/CalcTaskSatusByDateJob.cs @@ -0,0 +1,38 @@ +锘縰sing Furion.DatabaseAccessor; +using Furion.Schedule; +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 class CalcTaskSatusByDateJob( + IRepository<TaskInfo> rep + ) : IJob + { + private readonly IRepository<TaskInfo> rep = rep; + + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + var now = DateTime.Now; + var entities = await rep.AsQueryable() + .Where(it => it.EndTime < now && it.ReleaseStatus != EnumTaskReleaseStatus.Stopped) + .ToListAsync(); + if (entities.IsNotNull()) + { + foreach (var entity in entities) + { + entity.ReleaseStatus = EnumTaskReleaseStatus.Stopped; + } + await rep.UpdateAsync(entities); + } + } + } +} diff --git a/FlexJobApi.Core/Jobs/CalcUserAgeByIdCardJob.cs b/FlexJobApi.Core/Jobs/CalcUserAgeByIdCardJob.cs new file mode 100644 index 0000000..0f05eae --- /dev/null +++ b/FlexJobApi.Core/Jobs/CalcUserAgeByIdCardJob.cs @@ -0,0 +1,34 @@ +锘縰sing Furion.DatabaseAccessor; +using Furion.Schedule; +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 class CalcUserAgeByIdCardJob( + IRepository<User> rep + ) : IJob + { + private readonly IRepository<User> rep = rep; + + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + var enities = await rep.AsQueryable() + .Where(it => it.Type == EnumUserType.Personal && it.Identity != null && it.Identity != "") + .ToListAsync(stoppingToken); + foreach (var entity in enities) + { + var age = entity.Identity.GetAge(); + entity.Age = age; + } + } + } +} diff --git a/FlexJobApi.Core/Models/CommonServer/Schedules/Commands/SaveScheduleJobDetailCommand.cs b/FlexJobApi.Core/Models/CommonServer/Schedules/Commands/SaveScheduleJobDetailCommand.cs deleted file mode 100644 index c03d847..0000000 --- a/FlexJobApi.Core/Models/CommonServer/Schedules/Commands/SaveScheduleJobDetailCommand.cs +++ /dev/null @@ -1,31 +0,0 @@ -锘縰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.Resource])] - public class SaveScheduleJobDetailCommand : IRequest<bool> - { - /// <summary> - /// 璧勬簮Id - /// </summary> - public Guid ResourceId { get; set; } - - /// <summary> - /// 璇锋眰鏁版嵁 - /// </summary> - public string Body { get; set; } - - /// <summary> - /// Cron琛ㄨ揪寮� - /// </summary> - public string Cron { get; set; } - } -} diff --git a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/AutoTaskStatusByDateCommand.cs b/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/AutoTaskStatusByDateCommand.cs deleted file mode 100644 index 0eedf07..0000000 --- a/FlexJobApi.Core/Models/FlexJobServer/Tasks/Commands/AutoTaskStatusByDateCommand.cs +++ /dev/null @@ -1,18 +0,0 @@ -锘縰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.Task])] - public class AutoTaskStatusByDateCommand : IRequest<int> - { - - } -} diff --git a/FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserInfoRolesQuery.cs b/FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserInfoRolesQuery.cs index 1bc1751..b1b350e 100644 --- a/FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserInfoRolesQuery.cs +++ b/FlexJobApi.Core/Models/UserServer/Users/Queries/GetUserInfoRolesQuery.cs @@ -13,6 +13,11 @@ [Resource([EnumResourceController.User])] public class GetUserInfoRolesQuery : IRequest<List<GetUserInfoRolesQueryResultItem>> { + public GetUserInfoRolesQuery() + { + ClientType = EnumClientType.PcWeb; + } + /// <summary> /// 鐢ㄦ埛Id /// </summary> diff --git a/FlexJobApi.Core/Utils/ScheduleUtils/DbJobPersistence.cs b/FlexJobApi.Core/Utils/ScheduleUtils/DbJobPersistence.cs index c13c0ea..592a3dd 100644 --- a/FlexJobApi.Core/Utils/ScheduleUtils/DbJobPersistence.cs +++ b/FlexJobApi.Core/Utils/ScheduleUtils/DbJobPersistence.cs @@ -37,21 +37,9 @@ /// 浣滀笟璋冨害鏈嶅姟鍚姩鏃� /// </summary> /// <returns></returns> - public async Task<IEnumerable<SchedulerBuilder>> PreloadAsync(CancellationToken stoppingToken) // Furion 4.9.1.59 涔嬪墠涓� public IEnumerable<SchedulerBuilder> Preload() + public Task<IEnumerable<SchedulerBuilder>> PreloadAsync(CancellationToken stoppingToken) { - var schedulers = new List<SchedulerBuilder>(); - var jobDetails = await repScheduleJobDetail.AsQueryable().AsNoTracking().ToListAsync(); - var jobTriggers = await repScheduleJobTrigger.AsQueryable().AsNoTracking().ToListAsync(); - foreach (var jobDetail in jobDetails) - { - var triggers = jobTriggers.Where(it => it.JobId == jobDetail.JobId) - .Select(it => TriggerBuilder.From(it.ToJson())) - .ToArray(); - var jobBuilder = JobBuilder.From(jobDetail.ToJson()); - var scheduler = SchedulerBuilder.Create(jobBuilder, triggers); - schedulers.Add(scheduler); - } - return schedulers; + return Task.FromResult(App.EffectiveTypes.ScanToBuilders().AsEnumerable()); } public Task<SchedulerBuilder> OnLoadingAsync(SchedulerBuilder builder, CancellationToken stoppingToken) diff --git a/FlexJobApi.Core/Utils/ScheduleUtils/ResourceHttpJob.cs b/FlexJobApi.Core/Utils/ScheduleUtils/ResourceHttpJob.cs deleted file mode 100644 index 898f525..0000000 --- a/FlexJobApi.Core/Utils/ScheduleUtils/ResourceHttpJob.cs +++ /dev/null @@ -1,45 +0,0 @@ -锘縰sing Azure.Core; -using Furion.DatabaseAccessor; -using Furion.FriendlyException; -using Furion.Schedule; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace FlexJobApi.Core -{ - public class ResourceHttpJob( - IRepository<Resource> rep, - ResourceHttpUtils resourceHttpUtils - ) : IJob - { - private readonly IRepository<Resource> rep = rep; - private readonly ResourceHttpUtils resourceHttpUtils = resourceHttpUtils; - - public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) - { - var jobDetail = context.JobDetail; - - // 瑙f瀽 HTTP 璇锋眰鍙傛暟锛岄敭鍚嶇О涓虹被鍚� - var command = Schedular.Deserialize<SaveScheduleJobDetailCommand>(jobDetail.GetProperty<string>(nameof(ResourceHttpJob))); - - var resource = await rep - .Where(it => it.Id == command.ResourceId) - .Select(it => new Resource - { - ServiceName = it.ServiceName, - Route = it.Route, - Method = it.Method - }) - .FirstOrDefaultAsync(); - if (resource == null) throw Oops.Oh(EnumErrorCodeType.s404, "璇ヨ祫婧�"); - - context.Result = await resourceHttpUtils.SendHttpAsync(resource, command.Body, new SystemUserResourceHttpProvider()); - } - } -} diff --git a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml index b573c71..28d44df 100644 --- a/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml +++ b/FlexJobApi.UserServer.Application/FlexJobApi.UserServer.Application.xml @@ -705,6 +705,14 @@ <param name="cancellationToken"></param> <returns></returns> </member> + <member name="M:FlexJobApi.UserServer.Application.UserInfos.Commands.UserInfoCommandHandler.Handle(FlexJobApi.Core.SetUserInfoRolesCommand,System.Threading.CancellationToken)"> + <summary> + 璁剧疆鐢ㄦ埛淇℃伅瑙掕壊 + </summary> + <param name="request"></param> + <param name="cancellationToken"></param> + <returns></returns> + </member> <member name="T:FlexJobApi.UserServer.Application.GetOperationUserInfosQueryHandler"> <summary> 鑾峰彇杩愯惀绔敤鎴峰垎椤靛垪琛� diff --git a/FlexJobApi.UserServer.Application/Users/Commands/UserInfoCommandHandler.cs b/FlexJobApi.UserServer.Application/Users/Commands/UserInfoCommandHandler.cs index b91f501..e489ec1 100644 --- a/FlexJobApi.UserServer.Application/Users/Commands/UserInfoCommandHandler.cs +++ b/FlexJobApi.UserServer.Application/Users/Commands/UserInfoCommandHandler.cs @@ -1,5 +1,6 @@ 锘縰sing FlexJobApi.Core; using Furion.DatabaseAccessor; +using Furion.FriendlyException; using MediatR; using Microsoft.EntityFrameworkCore; using System; @@ -15,8 +16,9 @@ /// </summary> public class UserInfoCommandHandler( IRepository<User> rep - ) : - IRequestHandler<SetUserInfoStatusCommand, int> + ) : + IRequestHandler<SetUserInfoStatusCommand, int>, + IRequestHandler<SetUserInfoRolesCommand, int> { private readonly IRepository<User> rep = rep; @@ -37,5 +39,28 @@ } return entities.Count; } + + /// <summary> + /// 璁剧疆鐢ㄦ埛淇℃伅瑙掕壊 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<int> Handle(SetUserInfoRolesCommand request, CancellationToken cancellationToken) + { + var entity = await rep.AsQueryable() + .Include(it => it.UserRoles) + .Where(it => it.Id == request.UserInfoId) + .FirstOrDefaultAsync(cancellationToken); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "璇ョ敤鎴�"); + entity.UserRoles = request.RoleIds + .Select(it => new UserRole + { + RoleId = it + }) + .ToList(); + await rep.UpdateAsync(entity); + return entity.UserRoles.Count; + } } } diff --git a/FlexJobApi.Web.Entry/Startup.cs b/FlexJobApi.Web.Entry/Startup.cs index 67d050e..e392f7a 100644 --- a/FlexJobApi.Web.Entry/Startup.cs +++ b/FlexJobApi.Web.Entry/Startup.cs @@ -55,7 +55,9 @@ { options.BuildSqlType = SqlTypes.SqlServer; options.JobDetail.LogEnabled = true; - options.AddPersistence<DbJobPersistence>(); + //options.AddPersistence<DbJobPersistence>(); + options.AddJob<CalcTaskSatusByDateJob>(Triggers.Hourly()); + options.AddJob<CalcUserAgeByIdCardJob>(Triggers.Daily()); }); services.AddSpecificationDocuments(options => -- Gitblit v1.9.1