MdpDbSyncScheduleBinder.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System.Text.Json;
  2. using Admin.NET.Plugin.AiDOP.Entity.DataPlatform;
  3. using Admin.NET.Plugin.AiDOP.Job;
  4. using Furion.Schedule;
  5. namespace Admin.NET.Plugin.AiDOP.DataPlatform;
  6. public sealed class MdpDbSyncScheduleBinder : ITransient
  7. {
  8. private readonly ISqlSugarClient _db;
  9. private readonly ISchedulerFactory _scheduler;
  10. public MdpDbSyncScheduleBinder(ISqlSugarClient db, ISchedulerFactory scheduler)
  11. {
  12. _db = db;
  13. _scheduler = scheduler;
  14. }
  15. public async Task<string?> BindAsync(MdpSyncTask task, MdpSyncTaskSchedule schedule, long actingTenantId)
  16. {
  17. if (!string.Equals(task.TaskType, "DB_SYNC", StringComparison.OrdinalIgnoreCase))
  18. return schedule.ScheduleJobId;
  19. var tenantId = task.TenantId == 0 ? actingTenantId : task.TenantId;
  20. var jobId = MdpDbSyncRules.BuildJobId(tenantId, task.TaskCode)
  21. ?? throw Oops.Oh("任务编码过长,无法生成调度作业编号");
  22. var triggerId = MdpDbSyncRules.BuildTriggerId(tenantId, task.TaskCode)
  23. ?? throw Oops.Oh("任务编码过长,无法生成触发器编号");
  24. if (schedule.AutoEnabled == 1 && string.IsNullOrWhiteSpace(schedule.CronExpr))
  25. throw Oops.Oh("启用自动调度时必须填写 Cron");
  26. var jobType = typeof(MdpConfiguredDbSyncJob);
  27. var detail = await _db.Queryable<SysJobDetail>().Where(x => x.JobId == jobId).FirstAsync()
  28. ?? new SysJobDetail { JobId = jobId };
  29. detail.GroupName = "aidop-dbsync";
  30. detail.JobType = jobType.FullName;
  31. detail.AssemblyName = jobType.Assembly.GetName().Name;
  32. detail.Description = "方式甲数据库同步";
  33. detail.Concurrent = false;
  34. detail.IncludeAnnotation = false;
  35. detail.Properties = JsonSerializer.Serialize(new { tenantId, taskCode = task.TaskCode });
  36. detail.CreateType = JobCreateTypeEnum.Typed;
  37. detail.UpdatedTime = DateTime.Now;
  38. if (detail.Id <= 0)
  39. await _db.Insertable(detail).ExecuteCommandAsync();
  40. else
  41. await _db.Updateable(detail).ExecuteCommandAsync();
  42. var trigger = await _db.Queryable<SysJobTrigger>().Where(x => x.TriggerId == triggerId).FirstAsync()
  43. ?? new SysJobTrigger { TriggerId = triggerId };
  44. trigger.JobId = jobId;
  45. trigger.TriggerType = "Furion.Schedule.CronTrigger";
  46. trigger.AssemblyName = "Furion.Pure";
  47. trigger.Args = JsonSerializer.Serialize(new[] { string.IsNullOrWhiteSpace(schedule.CronExpr) ? "0 0 0 1 1 ?" : schedule.CronExpr.Trim() });
  48. trigger.Description = schedule.CronDesc;
  49. trigger.Status = schedule.AutoEnabled == 1 && task.Status == 1 ? TriggerStatus.Ready : TriggerStatus.Pause;
  50. if (trigger.Id <= 0)
  51. await _db.Insertable(trigger).ExecuteCommandAsync();
  52. else
  53. await _db.Updateable(trigger).ExecuteCommandAsync();
  54. Attach(detail, trigger, jobType);
  55. return jobId;
  56. }
  57. private void Attach(SysJobDetail detail, SysJobTrigger trigger, Type jobType)
  58. {
  59. var jobBuilder = JobBuilder.Create(jobType).LoadFrom(detail).SetJobType(jobType).SetIncludeAnnotations(false);
  60. var scheduler = _scheduler.GetJob(detail.JobId);
  61. if (scheduler == null)
  62. _scheduler.AddJob(jobBuilder);
  63. else
  64. scheduler.UpdateDetail(jobBuilder);
  65. var runtime = _scheduler.GetJob(detail.JobId);
  66. var triggerBuilder = TriggerBuilder.Create(trigger.TriggerId).LoadFrom(trigger);
  67. if (runtime?.GetTriggerBuilder(trigger.TriggerId) == null)
  68. runtime?.AddTrigger(triggerBuilder);
  69. else
  70. runtime.UpdateTrigger(triggerBuilder);
  71. }
  72. }