Merge branch 'htq20251215' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu into htq20251215
| | |
| | | New = 100, |
| | | |
| | | /// <summary> |
| | | /// å·²åé |
| | | /// </summary> |
| | | [Description("å·²åé")] |
| | | HasSent = 105, |
| | | |
| | | /// <summary> |
| | | /// å åæºå¾
æ§è¡ |
| | | /// </summary> |
| | | [Description("å åæºå¾
æ§è¡")] |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace WIDESEA.QuartzJob |
| | | { |
| | | public interface ISchedulerCenter |
| | | { |
| | | /// <summary> |
| | | /// å¼å¯ä»»å¡è°åº¦ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | Task<ResponseContent> StartScheduleAsync(); |
| | | /// <summary> |
| | | /// 忢任å¡è°åº¦ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | Task<ResponseContent> StopScheduleAsync(); |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="sysSchedule"></param> |
| | | /// <returns></returns> |
| | | Task<ResponseContent> AddScheduleJobAsync(TasksQz sysSchedule); |
| | | /// <summary> |
| | | /// 忢ä¸ä¸ªä»»å¡ |
| | | /// </summary> |
| | | /// <param name="sysSchedule"></param> |
| | | /// <returns></returns> |
| | | Task<ResponseContent> StopScheduleJobAsync(TasksQz sysSchedule); |
| | | /// <summary> |
| | | /// æ£æµä»»å¡æ¯å¦åå¨ |
| | | /// </summary> |
| | | /// <param name="sysSchedule"></param> |
| | | /// <returns></returns> |
| | | Task<bool> IsExistScheduleJobAsync(TasksQz sysSchedule); |
| | | /// <summary> |
| | | /// æåæå®ç计åä»»å¡ |
| | | /// </summary> |
| | | /// <param name="sysSchedule"></param> |
| | | /// <returns></returns> |
| | | Task<ResponseContent> PauseJob(TasksQz sysSchedule); |
| | | /// <summary> |
| | | /// æ¢å¤ä¸ä¸ªä»»å¡ |
| | | /// </summary> |
| | | /// <param name="sysSchedule"></param> |
| | | /// <returns></returns> |
| | | Task<ResponseContent> ResumeJob(TasksQz sysSchedule); |
| | | |
| | | /// <summary> |
| | | /// è·åä»»å¡è§¦åå¨ç¶æ |
| | | /// </summary> |
| | | /// <param name="sysSchedule"></param> |
| | | /// <returns></returns> |
| | | Task<List<TaskInfoDto>> GetTaskStaus(TasksQz sysSchedule); |
| | | /// <summary> |
| | | /// è·å触å卿 è¯ |
| | | /// </summary> |
| | | /// <param name="key"></param> |
| | | /// <returns></returns> |
| | | string GetTriggerState(string key); |
| | | |
| | | /// <summary> |
| | | /// ç«å³æ§è¡ ä¸ä¸ªä»»å¡ |
| | | /// </summary> |
| | | /// <param name="tasksQz"></param> |
| | | /// <returns></returns> |
| | | Task<ResponseContent> ExecuteJobAsync(TasksQz tasksQz); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Quartz; |
| | | using Microsoft.Extensions.DependencyInjection; |
| | | using Quartz.Spi; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | |
| | | namespace WIDESEA.QuartzJob |
| | | { |
| | | public class JobFactory : IJobFactory |
| | | { |
| | | /// <summary> |
| | | /// 注å
¥åå°è·åä¾èµå¯¹è±¡ |
| | | /// </summary> |
| | | private readonly IServiceProvider _serviceProvider; |
| | | public JobFactory(IServiceProvider serviceProvider) |
| | | { |
| | | _serviceProvider = serviceProvider; |
| | | } |
| | | /// <summary> |
| | | /// å®ç°æ¥å£Job |
| | | /// </summary> |
| | | /// <param name="bundle"></param> |
| | | /// <param name="scheduler"></param> |
| | | /// <returns></returns> |
| | | public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) |
| | | { |
| | | try |
| | | { |
| | | var serviceScope = _serviceProvider.CreateScope(); |
| | | var job = serviceScope.ServiceProvider.GetService(bundle.JobDetail.JobType) as IJob; |
| | | return job; |
| | | |
| | | } |
| | | catch (Exception) |
| | | { |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | public void ReturnJob(IJob job) |
| | | { |
| | | var disposable = job as IDisposable; |
| | | if (disposable != null) |
| | | { |
| | | disposable.Dispose(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Microsoft.Extensions.DependencyInjection; |
| | | using Quartz; |
| | | using Quartz.Spi; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Reflection; |
| | | using System.Text; |
| | | |
| | | namespace WIDESEA.QuartzJob |
| | | { |
| | | /// <summary> |
| | | /// ä»»å¡è°åº¦ å¯å¨æå¡ |
| | | /// </summary> |
| | | public static class JobSetup |
| | | { |
| | | public static void AddJobSetup(this IServiceCollection services) |
| | | { |
| | | if (services == null) throw new ArgumentNullException(nameof(services)); |
| | | |
| | | //services.AddSingleton<IJobFactory, JobFactory>(); |
| | | //services.AddTransient<AgvTaskJob>();//Job使ç¨ç¬æ¶ä¾èµæ³¨å
¥ |
| | | //services.AddSingleton<ISchedulerCenter, SchedulerCenterServer>(); |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | |
| | | namespace WIDESEA.QuartzJob |
| | | { |
| | | public class ResponseContent |
| | | { |
| | | public ResponseContent() |
| | | { |
| | | } |
| | | public ResponseContent(bool status) |
| | | { |
| | | Status = status; |
| | | } |
| | | public bool Status { get; set; } |
| | | public string Code { get; set; } |
| | | public string Message { get; set; } |
| | | public object Data { get; set; } |
| | | |
| | | public ResponseContent OK() |
| | | { |
| | | Status = true; |
| | | return this; |
| | | } |
| | | |
| | | public static ResponseContent Instance |
| | | { |
| | | get { return new ResponseContent(); } |
| | | } |
| | | public ResponseContent OK(string message = null, object data = null) |
| | | { |
| | | Status = true; |
| | | Message = message; |
| | | Data = data; |
| | | return this; |
| | | } |
| | | public ResponseContent Error(string message = null) |
| | | { |
| | | Status = false; |
| | | Message = message; |
| | | return this; |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Quartz; |
| | | using Quartz.Impl; |
| | | using Quartz.Impl.Triggers; |
| | | using Quartz.Spi; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Collections.Specialized; |
| | | using System.Reflection; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using WIDESEA_Core.Helper; |
| | | |
| | | namespace WIDESEA.QuartzJob |
| | | { |
| | | public class SchedulerCenterServer : ISchedulerCenter |
| | | { |
| | | private Task<IScheduler> _scheduler; |
| | | private readonly IJobFactory _iocjobFactory; |
| | | public SchedulerCenterServer(IJobFactory jobFactory) |
| | | { |
| | | _iocjobFactory = jobFactory; |
| | | _scheduler = GetSchedulerAsync(); |
| | | } |
| | | private Task<IScheduler> GetSchedulerAsync() |
| | | { |
| | | if (_scheduler != null) |
| | | return _scheduler; |
| | | else |
| | | { |
| | | // ä»Factoryä¸è·åSchedulerå®ä¾ |
| | | NameValueCollection collection = new NameValueCollection |
| | | { |
| | | { "quartz.serializer.type", "binary" }, |
| | | }; |
| | | StdSchedulerFactory factory = new StdSchedulerFactory(collection); |
| | | return _scheduler = factory.GetScheduler(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¼å¯ä»»å¡è°åº¦ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public async Task<ResponseContent> StartScheduleAsync() |
| | | { |
| | | var result = new ResponseContent(); |
| | | try |
| | | { |
| | | _scheduler.Result.JobFactory = _iocjobFactory; |
| | | if (!_scheduler.Result.IsStarted) |
| | | { |
| | | //çå¾
ä»»å¡è¿è¡å®æ |
| | | await _scheduler.Result.Start(); |
| | | |
| | | ConsoleHelper.WriteSuccessLine("ä»»å¡è°åº¦å¼å¯ï¼"); |
| | | result = ResponseContent.Instance.OK($"ä»»å¡è°åº¦å¼å¯æå"); |
| | | return result; |
| | | } |
| | | else |
| | | { |
| | | result = ResponseContent.Instance.OK($"ä»»å¡è°åº¦å·²ç»å¼å¯"); |
| | | return result; |
| | | } |
| | | } |
| | | catch (Exception) |
| | | { |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 忢任å¡è°åº¦ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public async Task<ResponseContent> StopScheduleAsync() |
| | | { |
| | | var result = new ResponseContent(); |
| | | try |
| | | { |
| | | if (!_scheduler.Result.IsShutdown) |
| | | { |
| | | //çå¾
ä»»å¡è¿è¡å®æ |
| | | await _scheduler.Result.Shutdown(); |
| | | //await Console.Out.WriteLineAsync("ä»»å¡è°åº¦åæ¢ï¼"); |
| | | result = ResponseContent.Instance.OK($"ä»»å¡è°åº¦åæ¢æå"); |
| | | return result; |
| | | } |
| | | else |
| | | { |
| | | result = ResponseContent.Instance.OK($"ä»»å¡è°åº¦å·²ç»åæ¢"); |
| | | return result; |
| | | } |
| | | } |
| | | catch (Exception) |
| | | { |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ·»å ä¸ä¸ªè®¡åä»»å¡ï¼æ å°ç¨åºéæå®IJobå®ç°ç±»ï¼ |
| | | /// </summary> |
| | | /// <typeparam name="T"></typeparam> |
| | | /// <param name="tasksQz"></param> |
| | | /// <returns></returns> |
| | | public async Task<ResponseContent> AddScheduleJobAsync(TasksQz tasksQz) |
| | | { |
| | | var result = new ResponseContent(); |
| | | |
| | | if (tasksQz != null) |
| | | { |
| | | try |
| | | { |
| | | JobKey jobKey = new JobKey(tasksQz.Id.ToString(), tasksQz.JobGroup); |
| | | if (await _scheduler.Result.CheckExists(jobKey)) |
| | | { |
| | | result = ResponseContent.Instance.OK($"该任å¡è®¡åå·²ç»å¨æ§è¡:ã{tasksQz.Name}ã,请å¿éå¤å¯å¨ï¼"); |
| | | return result; |
| | | } |
| | | #region 设置å¼å§æ¶é´åç»ææ¶é´ |
| | | |
| | | if (tasksQz.BeginTime == null) |
| | | { |
| | | tasksQz.BeginTime = DateTime.Now; |
| | | } |
| | | DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(tasksQz.BeginTime, 1);//设置å¼å§æ¶é´ |
| | | if (tasksQz.EndTime == null) |
| | | { |
| | | tasksQz.EndTime = DateTime.MaxValue.AddDays(-1); |
| | | } |
| | | DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(tasksQz.EndTime, 1);//设置æåæ¶é´ |
| | | |
| | | #endregion |
| | | |
| | | #region éè¿åå°è·åç¨åºéç±»ååç±» |
| | | |
| | | Assembly assembly = Assembly.Load(new AssemblyName(tasksQz.AssemblyName)); |
| | | Type jobType = assembly.GetType(tasksQz.AssemblyName + "." + tasksQz.ClassName); |
| | | |
| | | #endregion |
| | | //夿任å¡è°åº¦æ¯å¦å¼å¯ |
| | | //if (!_scheduler.Result.IsStarted) |
| | | //{ |
| | | // await StartScheduleAsync(); |
| | | //} |
| | | |
| | | //ä¼ å
¥åå°åºæ¥çæ§è¡ç¨åºé |
| | | IJobDetail job = new JobDetailImpl(tasksQz.Id.ToString(), tasksQz.JobGroup, jobType); |
| | | job.JobDataMap.Add("JobParam", tasksQz.JobParams); |
| | | ITrigger trigger; |
| | | |
| | | #region æ³åä¼ é |
| | | //IJobDetail job = JobBuilder.Create<T>() |
| | | // .WithIdentity(sysSchedule.Name, sysSchedule.JobGroup) |
| | | // .Build(); |
| | | #endregion |
| | | |
| | | if (tasksQz.Cron != null && CronExpression.IsValidExpression(tasksQz.Cron) && tasksQz.TriggerType > 0) |
| | | { |
| | | trigger = CreateCronTrigger(tasksQz); |
| | | |
| | | ((CronTriggerImpl)trigger).MisfireInstruction = MisfireInstruction.CronTrigger.DoNothing; |
| | | } |
| | | else |
| | | { |
| | | trigger = CreateSimpleTrigger(tasksQz); |
| | | } |
| | | |
| | | // åè¯Quartzä½¿ç¨æä»¬ç触å卿¥å®æä½ä¸ |
| | | await _scheduler.Result.ScheduleJob(job, trigger); |
| | | //await Task.Delay(TimeSpan.FromSeconds(120)); |
| | | //await Console.Out.WriteLineAsync("å
³éäºè°åº¦å¨ï¼"); |
| | | //await _scheduler.Result.Shutdown(); |
| | | result = ResponseContent.Instance.OK($"ã{tasksQz.Name}ãæå"); |
| | | return result; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | result = ResponseContent.Instance.Error($"ä»»å¡è®¡åå¼å¸¸:ã{ex.Message}ã"); |
| | | return result; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | result = ResponseContent.Instance.Error($"ä»»å¡è®¡åä¸åå¨:ã{tasksQz?.Name}ã"); |
| | | return result; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 任塿¯å¦åå¨? |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public async Task<bool> IsExistScheduleJobAsync(TasksQz sysSchedule) |
| | | { |
| | | JobKey jobKey = new JobKey(sysSchedule.Id.ToString(), sysSchedule.JobGroup); |
| | | if (await _scheduler.Result.CheckExists(jobKey)) |
| | | { |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | return false; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æåä¸ä¸ªæå®ç计åä»»å¡ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public async Task<ResponseContent> StopScheduleJobAsync(TasksQz sysSchedule) |
| | | { |
| | | var result = new ResponseContent(); |
| | | try |
| | | { |
| | | JobKey jobKey = new JobKey(sysSchedule.Id.ToString(), sysSchedule.JobGroup); |
| | | if (!await _scheduler.Result.CheckExists(jobKey)) |
| | | { |
| | | result = ResponseContent.Instance.Error($"æªæ¾å°è¦æåçä»»å¡:ã{sysSchedule.Name}ã"); |
| | | return result; |
| | | } |
| | | else |
| | | { |
| | | await _scheduler.Result.DeleteJob(jobKey); |
| | | result = ResponseContent.Instance.OK($"ã{sysSchedule.Name}ãæå"); |
| | | return result; |
| | | } |
| | | } |
| | | catch (Exception) |
| | | { |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¢å¤æå®ç计åä»»å¡ |
| | | /// </summary> |
| | | /// <param name="sysSchedule"></param> |
| | | /// <returns></returns> |
| | | public async Task<ResponseContent> ResumeJob(TasksQz sysSchedule) |
| | | { |
| | | var result = new ResponseContent(); |
| | | try |
| | | { |
| | | JobKey jobKey = new JobKey(sysSchedule.Id.ToString(), sysSchedule.JobGroup); |
| | | if (!await _scheduler.Result.CheckExists(jobKey)) |
| | | { |
| | | result = ResponseContent.Instance.Error($"æªæ¾å°è¦æ¢å¤çä»»å¡:ã{sysSchedule.Name}ã"); |
| | | return result; |
| | | } |
| | | await _scheduler.Result.ResumeJob(jobKey); |
| | | result = ResponseContent.Instance.OK($"ã{sysSchedule.Name}ãæå"); |
| | | return result; |
| | | } |
| | | catch (Exception) |
| | | { |
| | | throw; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æåæå®ç计åä»»å¡ |
| | | /// </summary> |
| | | /// <param name="sysSchedule"></param> |
| | | /// <returns></returns> |
| | | public async Task<ResponseContent> PauseJob(TasksQz sysSchedule) |
| | | { |
| | | var result = new ResponseContent(); |
| | | try |
| | | { |
| | | JobKey jobKey = new JobKey(sysSchedule.Id.ToString(), sysSchedule.JobGroup); |
| | | if (!await _scheduler.Result.CheckExists(jobKey)) |
| | | { |
| | | result = ResponseContent.Instance.Error($"æªæ¾å°è¦æåçä»»å¡:ã{sysSchedule.Name}ã"); |
| | | return result; |
| | | } |
| | | await _scheduler.Result.PauseJob(jobKey); |
| | | result = ResponseContent.Instance.Error($"ã{sysSchedule.Name}ãæå"); |
| | | return result; |
| | | } |
| | | catch (Exception) |
| | | { |
| | | throw; |
| | | } |
| | | } |
| | | #region ç¶æç¶æå¸®å©æ¹æ³ |
| | | public async Task<List<TaskInfoDto>> GetTaskStaus(TasksQz sysSchedule) |
| | | { |
| | | |
| | | var ls = new List<TaskInfoDto>(); |
| | | var noTask = new List<TaskInfoDto>{ new TaskInfoDto { |
| | | jobId = sysSchedule.Id.ToString(), |
| | | jobGroup = sysSchedule.JobGroup, |
| | | triggerId = "", |
| | | triggerGroup = "", |
| | | triggerStatus = "ä¸åå¨" |
| | | } }; |
| | | JobKey jobKey = new JobKey(sysSchedule.Id.ToString(), sysSchedule.JobGroup); |
| | | IJobDetail job = await _scheduler.Result.GetJobDetail(jobKey); |
| | | if (job == null) |
| | | { |
| | | return noTask; |
| | | } |
| | | //info.Append(string.Format("ä»»å¡ID:{0}\r\nä»»å¡åç§°:{1}\r\n", job.Key.Name, job.Description)); |
| | | var triggers = await _scheduler.Result.GetTriggersOfJob(jobKey); |
| | | if (triggers == null || triggers.Count == 0) |
| | | { |
| | | return noTask; |
| | | } |
| | | foreach (var trigger in triggers) |
| | | { |
| | | var triggerStaus = await _scheduler.Result.GetTriggerState(trigger.Key); |
| | | string state = GetTriggerState(triggerStaus.ToString()); |
| | | ls.Add(new TaskInfoDto |
| | | { |
| | | jobId = job.Key.Name, |
| | | jobGroup = job.Key.Group, |
| | | triggerId = trigger.Key.Name, |
| | | triggerGroup = trigger.Key.Group, |
| | | triggerStatus = state |
| | | }); |
| | | //info.Append(string.Format("触åå¨ID:{0}\r\n触åå¨åç§°:{1}\r\nç¶æ:{2}\r\n", item.Key.Name, item.Description, state)); |
| | | |
| | | } |
| | | return ls; |
| | | } |
| | | public string GetTriggerState(string key) |
| | | { |
| | | string state = null; |
| | | if (key != null) |
| | | key = key.ToUpper(); |
| | | switch (key) |
| | | { |
| | | case "1": |
| | | state = "æå"; |
| | | break; |
| | | case "2": |
| | | state = "宿"; |
| | | break; |
| | | case "3": |
| | | state = "åºé"; |
| | | break; |
| | | case "4": |
| | | state = "é»å¡"; |
| | | break; |
| | | case "0": |
| | | state = "æ£å¸¸"; |
| | | break; |
| | | case "-1": |
| | | state = "ä¸åå¨"; |
| | | break; |
| | | case "BLOCKED": |
| | | state = "é»å¡"; |
| | | break; |
| | | case "COMPLETE": |
| | | state = "宿"; |
| | | break; |
| | | case "ERROR": |
| | | state = "åºé"; |
| | | break; |
| | | case "NONE": |
| | | state = "ä¸åå¨"; |
| | | break; |
| | | case "NORMAL": |
| | | state = "æ£å¸¸"; |
| | | break; |
| | | case "PAUSED": |
| | | state = "æå"; |
| | | break; |
| | | } |
| | | return state; |
| | | } |
| | | #endregion |
| | | #region å建触åå¨å¸®å©æ¹æ³ |
| | | |
| | | /// <summary> |
| | | /// å建SimpleTrigger触åå¨ï¼ç®å触åå¨ï¼ |
| | | /// </summary> |
| | | /// <param name="sysSchedule"></param> |
| | | /// <param name="starRunTime"></param> |
| | | /// <param name="endRunTime"></param> |
| | | /// <returns></returns> |
| | | private ITrigger CreateSimpleTrigger(TasksQz sysSchedule) |
| | | { |
| | | if (sysSchedule.CycleRunTimes > 0) |
| | | { |
| | | ITrigger trigger = TriggerBuilder.Create() |
| | | .WithIdentity(sysSchedule.Id.ToString(), sysSchedule.JobGroup) |
| | | .StartAt(sysSchedule.BeginTime.Value) |
| | | .WithSimpleSchedule(x => x |
| | | .WithIntervalInSeconds(sysSchedule.IntervalSecond) |
| | | .WithRepeatCount(sysSchedule.CycleRunTimes - 1)) |
| | | .EndAt(sysSchedule.EndTime.Value) |
| | | .Build(); |
| | | return trigger; |
| | | } |
| | | else |
| | | { |
| | | ITrigger trigger = TriggerBuilder.Create() |
| | | .WithIdentity(sysSchedule.Id.ToString(), sysSchedule.JobGroup) |
| | | .StartAt(sysSchedule.BeginTime.Value) |
| | | .WithSimpleSchedule(x => x |
| | | .WithIntervalInSeconds(sysSchedule.IntervalSecond) |
| | | .RepeatForever() |
| | | ) |
| | | .EndAt(sysSchedule.EndTime.Value) |
| | | .Build(); |
| | | return trigger; |
| | | } |
| | | // 触åä½ä¸ç«å³è¿è¡ï¼ç¶åæ¯10ç§éå¤ä¸æ¬¡ï¼æ éå¾ªç¯ |
| | | |
| | | } |
| | | /// <summary> |
| | | /// å建类åCronç触åå¨ |
| | | /// </summary> |
| | | /// <param name="m"></param> |
| | | /// <returns></returns> |
| | | private ITrigger CreateCronTrigger(TasksQz sysSchedule) |
| | | { |
| | | // ä½ä¸è§¦åå¨ |
| | | return TriggerBuilder.Create() |
| | | .WithIdentity(sysSchedule.Id.ToString(), sysSchedule.JobGroup) |
| | | .StartAt(sysSchedule.BeginTime.Value)//å¼å§æ¶é´ |
| | | .EndAt(sysSchedule.EndTime.Value)//ç»ææ°æ® |
| | | .WithCronSchedule(sysSchedule.Cron)//æå®cronè¡¨è¾¾å¼ |
| | | .ForJob(sysSchedule.Id.ToString(), sysSchedule.JobGroup)//ä½ä¸åç§° |
| | | .Build(); |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | /// <summary> |
| | | /// ç«å³æ§è¡ ä¸ä¸ªä»»å¡ |
| | | /// </summary> |
| | | /// <param name="tasksQz"></param> |
| | | /// <returns></returns> |
| | | public async Task<ResponseContent> ExecuteJobAsync(TasksQz tasksQz) |
| | | { |
| | | var result = new ResponseContent(); |
| | | try |
| | | { |
| | | JobKey jobKey = new JobKey(tasksQz.Id.ToString(), tasksQz.JobGroup); |
| | | |
| | | //夿任塿¯å¦åå¨ï¼åå¨å 触å䏿¬¡ï¼ä¸åå¨åå
æ·»å ä¸ä¸ªä»»å¡ï¼è§¦å以åå åæ¢ä»»å¡ |
| | | if (!await _scheduler.Result.CheckExists(jobKey)) |
| | | { |
| | | //ä¸åå¨ å æ·»å ä¸ä¸ªè®¡åä»»å¡ |
| | | await AddScheduleJobAsync(tasksQz); |
| | | |
| | | //è§¦åæ§è¡ä¸æ¬¡ |
| | | await _scheduler.Result.TriggerJob(jobKey); |
| | | |
| | | //åæ¢ä»»å¡ |
| | | await StopScheduleJobAsync(tasksQz); |
| | | |
| | | result = ResponseContent.Instance.OK($"ç«å³æ§è¡è®¡åä»»å¡:ã{tasksQz.Name}ãæå"); |
| | | } |
| | | else |
| | | { |
| | | await _scheduler.Result.TriggerJob(jobKey); |
| | | result = ResponseContent.Instance.OK($"ç«å³æ§è¡è®¡åä»»å¡:ã{tasksQz.Name}ãæå"); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | result = ResponseContent.Instance.Error($"ç«å³æ§è¡è®¡åä»»å¡å¤±è´¥:ã{ex.Message}ã"); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | |
| | | namespace WIDESEA.QuartzJob |
| | | { |
| | | public class TaskInfoDto |
| | | { |
| | | /// <summary> |
| | | /// ä»»å¡ID |
| | | /// </summary> |
| | | public string jobId { get; set; } |
| | | /// <summary> |
| | | /// ä»»å¡åç§° |
| | | /// </summary> |
| | | public string jobName { get; set; } |
| | | /// <summary> |
| | | /// ä»»å¡åç» |
| | | /// </summary> |
| | | public string jobGroup { get; set; } |
| | | /// <summary> |
| | | /// 触åå¨ID |
| | | /// </summary> |
| | | public string triggerId { get; set; } |
| | | /// <summary> |
| | | /// 触åå¨åç§° |
| | | /// </summary> |
| | | public string triggerName { get; set; } |
| | | /// <summary> |
| | | /// 触åå¨åç» |
| | | /// </summary> |
| | | public string triggerGroup { get; set; } |
| | | /// <summary> |
| | | /// 触åå¨ç¶æ |
| | | /// </summary> |
| | | public string triggerStatus { get; set; } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | |
| | | namespace WIDESEA.QuartzJob |
| | | { |
| | | /// <summary> |
| | | /// ä»»å¡è®¡å表 |
| | | /// </summary> |
| | | public class TasksQz |
| | | { |
| | | /// <summary> |
| | | /// ä»»å¡åç§° |
| | | /// </summary> |
| | | public string Name { get; set; } |
| | | /// <summary> |
| | | /// ä»»å¡åç» |
| | | /// </summary> |
| | | public string JobGroup { get; set; } |
| | | /// <summary> |
| | | /// ä»»å¡è¿è¡æ¶é´è¡¨è¾¾å¼ |
| | | /// </summary> |
| | | public string Cron { get; set; } |
| | | /// <summary> |
| | | /// 任塿å¨DLL对åºçç¨åºéåç§° |
| | | /// </summary> |
| | | public string AssemblyName { get; set; } |
| | | /// <summary> |
| | | /// 任塿å¨ç±» |
| | | /// </summary> |
| | | public string ClassName { get; set; } |
| | | /// <summary> |
| | | /// ä»»å¡æè¿° |
| | | /// </summary> |
| | | public string Remark { get; set; } |
| | | /// <summary> |
| | | /// æ§è¡æ¬¡æ° |
| | | /// </summary> |
| | | public int RunTimes { get; set; } |
| | | /// <summary> |
| | | /// å¼å§æ¶é´ |
| | | /// </summary> |
| | | public DateTime? BeginTime { get; set; } |
| | | /// <summary> |
| | | /// ç»ææ¶é´ |
| | | /// </summary> |
| | | public DateTime? EndTime { get; set; } |
| | | /// <summary> |
| | | /// 触åå¨ç±»åï¼0ãsimple 1ãcronï¼ |
| | | /// </summary> |
| | | public int TriggerType { get; set; } |
| | | /// <summary> |
| | | /// æ§è¡é´éæ¶é´, ç§ä¸ºåä½ |
| | | /// </summary> |
| | | public int IntervalSecond { get; set; } |
| | | /// <summary> |
| | | /// å¾ªç¯æ§è¡æ¬¡æ° |
| | | /// </summary> |
| | | public int CycleRunTimes { get; set; } |
| | | /// <summary> |
| | | /// æ¯å¦å¯å¨ |
| | | /// </summary> |
| | | public bool IsStart { get; set; } = true; |
| | | /// <summary> |
| | | /// æ§è¡ä¼ å |
| | | /// </summary> |
| | | public string JobParams { get; set; } |
| | | |
| | | public bool? IsDeleted { get; set; } |
| | | /// <summary> |
| | | /// å建æ¶é´ |
| | | /// </summary> |
| | | public DateTime CreateTime { get; set; } = DateTime.Now; |
| | | /// <summary> |
| | | /// ä»»å¡å
åä¸çç¶æ |
| | | /// </summary> |
| | | public List<TaskInfoDto> Triggers { get; set; } |
| | | public int Id { get; set; } |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | |
| | | namespace WIDESEA_DTO.Quartz |
| | | { |
| | | public class JobConfig |
| | | { |
| | | public Type JobType { get; set; } |
| | | public string Identity { get; set; } |
| | | public string Group { get; set; } |
| | | public int IntervalInSeconds { get; set; } |
| | | } |
| | | } |
| | |
| | | }); |
| | | |
| | | |
| | | var essTask = new TaskModel() |
| | | { |
| | | taskType = "putaway", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType>{ new() { |
| | | taskCode = returnTask.TaskNum.ToString(), |
| | | taskPriority = 0, |
| | | taskDescribe = new TaskDescribeType |
| | | { |
| | | containerCode = palletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "", |
| | | toStationCode = "", |
| | | toLocationCode = returnTask.TargetAddress, |
| | | deadline = 0, |
| | | storageTag = "" |
| | | } |
| | | } } |
| | | }; |
| | | //var essTask = new TaskModel() |
| | | //{ |
| | | // taskType = "putaway", |
| | | // taskGroupCode = "", |
| | | // groupPriority = 0, |
| | | // tasks = new List<TasksType>{ new() { |
| | | // taskCode = returnTask.TaskNum.ToString(), |
| | | // taskPriority = 0, |
| | | // taskDescribe = new TaskDescribeType |
| | | // { |
| | | // containerCode = palletCode, |
| | | // containerType = "CT_KUBOT_STANDARD", |
| | | // fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "", |
| | | // toStationCode = "", |
| | | // toLocationCode = returnTask.TargetAddress, |
| | | // deadline = 0, |
| | | // storageTag = "" |
| | | // } |
| | | // } } |
| | | //}; |
| | | |
| | | var resultTask = await _eSSApiService.CreateTaskAsync(essTask); |
| | | _logger.LogInformation($"ReturnRemaining åå»ºä»»å¡æå: {resultTask}"); |
| | | //var resultTask = await _eSSApiService.CreateTaskAsync(essTask); |
| | | //_logger.LogInformation($"ReturnRemaining åå»ºä»»å¡æå: {resultTask}"); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | |
| | | //if (moveResult) |
| | | //{ |
| | | // å建ååºä»»å¡ |
| | | var essTask = new TaskModel() |
| | | { |
| | | taskType = "putaway", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType>{ new() { |
| | | taskCode = returnTask.TaskNum.ToString(), |
| | | taskPriority = 0, |
| | | taskDescribe = new TaskDescribeType |
| | | { |
| | | containerCode = palletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "", |
| | | toStationCode = "", |
| | | toLocationCode = returnTask.TargetAddress, |
| | | deadline = 0, |
| | | storageTag = "" |
| | | } |
| | | } } |
| | | }; |
| | | //var essTask = new TaskModel() |
| | | //{ |
| | | // taskType = "putaway", |
| | | // taskGroupCode = "", |
| | | // groupPriority = 0, |
| | | // tasks = new List<TasksType>{ new() { |
| | | // taskCode = returnTask.TaskNum.ToString(), |
| | | // taskPriority = 0, |
| | | // taskDescribe = new TaskDescribeType |
| | | // { |
| | | // containerCode = palletCode, |
| | | // containerType = "CT_KUBOT_STANDARD", |
| | | // fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "", |
| | | // toStationCode = "", |
| | | // toLocationCode = returnTask.TargetAddress, |
| | | // deadline = 0, |
| | | // storageTag = "" |
| | | // } |
| | | // } } |
| | | //}; |
| | | |
| | | var resultTask = await _eSSApiService.CreateTaskAsync(essTask); |
| | | _logger.LogInformation($"ReturnRemaining åå»ºä»»å¡æå: {resultTask}"); |
| | | //var resultTask = await _eSSApiService.CreateTaskAsync(essTask); |
| | | //_logger.LogInformation($"ReturnRemaining åå»ºä»»å¡æå: {resultTask}"); |
| | | //} |
| | | } |
| | | catch (Exception ex) |
| | |
| | | task.TaskStatus = TaskStatusEnum.Finish.ObjToInt(); |
| | | |
| | | // BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); |
| | | var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.人工å é¤); |
| | | var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.èªå¨å®æ); |
| | | if (!result) |
| | | { |
| | | await Db.Deleteable(task).ExecuteCommandAsync(); |
| | |
| | | locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); |
| | | _locationInfoService.Repository.UpdateData(locationInfo); |
| | | |
| | | var outloks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>().Where(x => x.TaskNum == task.TaskNum).ToListAsync(); |
| | | |
| | | var stockids = outloks.Select(x => x.StockId).ToList(); |
| | | |
| | | _stockService.StockInfoService.Db.Updateable<Dt_StockInfo>() |
| | | .SetColumns(it => new Dt_StockInfo |
| | | { |
| | | StockStatus = StockStatusEmun.åºåºéå®.ObjToInt() |
| | | }) |
| | | .Where(it => stockids.Contains(it.Id)) |
| | | .ExecuteCommand(); |
| | | |
| | | _stockService.StockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>() |
| | | .SetColumns(it => new Dt_StockInfoDetail |
| | | { |
| | | Status = StockStatusEmun.åºåºéå®.ObjToInt() |
| | | }) |
| | | .Where(it => stockids.Contains(it.StockId)) |
| | | .ExecuteCommand(); |
| | | var stock = _stockService.StockInfoService.Db.Queryable<Dt_StockInfo>() |
| | | .Includes(x => x.Details) |
| | | .Where(x => x.PalletCode == task.PalletCode) |
| | | .First(); |
| | | |
| | | |
| | | stock.StockStatus = StockStatusEmun.åºåºå®æ.ObjToInt(); |
| | | stock.LocationCode = ""; |
| | | |
| | | stock.Details.ForEach(x => |
| | | { |
| | | x.Status = StockStatusEmun.åºåºå®æ.ObjToInt(); |
| | | }); |
| | | |
| | | _stockService.StockInfoService.Db.UpdateNav(stock).IncludesAllFirstLayer().ExecuteCommand(); |
| | | |
| | | var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.èªå¨å®æ); |
| | | if (!result) |
| | | { |
| | | await Db.Deleteable(task).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | |
| | |
| | | stockInfo.StockStatus = StockStatusEmun.å
¥åºå®æ.ObjToInt(); |
| | | _stockRepository.UpdateData(stockInfo); |
| | | |
| | | var outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().First(x => x.OrderNo == task.OrderNo); |
| | | //var outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().First(x => x.OrderNo == task.OrderNo); |
| | | |
| | | task.TaskStatus = TaskStatusEnum.Finish.ObjToInt(); |
| | | // BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? WIDESEA_Core.Enums.OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); |
| | | var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.人工å é¤); |
| | | if (!result) |
| | | { |
| | |
| | | _logger.LogInformation($"InEmptyTaskCompleted AddLocationStatusChangeRecord : {ex.Message} "); |
| | | } |
| | | |
| | | if (outboundOrder != null) |
| | | { |
| | | await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo); |
| | | } |
| | | else |
| | | { |
| | | _logger.LogInformation($"TaskService InEmptyTaskCompleted: {task.TaskNum} ,æªæ¾å°åºåºåã "); |
| | | } |
| | | //if (outboundOrder != null) |
| | | //{ |
| | | // await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo); |
| | | //} |
| | | //else |
| | | //{ |
| | | // _logger.LogInformation($"TaskService InEmptyTaskCompleted: {task.TaskNum} ,æªæ¾å°åºåºåã "); |
| | | //} |
| | | |
| | | return content; |
| | | } |
| | |
| | | var beforelocationStatus = locationInfo.LocationStatus; |
| | | |
| | | // è·åææååºä¸çåºåºéå®è®°å½ |
| | | var returnLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(it => it.OrderNo == task.OrderNo && |
| | | it.PalletCode == task.PalletCode && |
| | | it.Status == (int)OutLockStockStatusEnum.ååºä¸) |
| | | .ToListAsync(); |
| | | //var returnLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | // .Where(it => it.OrderNo == task.OrderNo && |
| | | // it.PalletCode == task.PalletCode && |
| | | // it.Status == (int)OutLockStockStatusEnum.ååºä¸) |
| | | // .ToListAsync(); |
| | | |
| | | // æ´æ°åºåºéå®è®°å½ç¶æä¸ºååºå®æ |
| | | foreach (var lockInfo in returnLocks) |
| | | { |
| | | lockInfo.Status = (int)OutLockStockStatusEnum.å·²ååº; |
| | | } |
| | | //foreach (var lockInfo in returnLocks) |
| | | //{ |
| | | // lockInfo.Status = (int)OutLockStockStatusEnum.å·²ååº; |
| | | //} |
| | | |
| | | if (returnLocks.Any()) |
| | | { |
| | | await _outStockLockInfoService.Db.Updateable(returnLocks).ExecuteCommandAsync(); |
| | | _logger.LogInformation($"æ´æ°{returnLocks.Count}æ¡éå®è®°å½ä¸ºå·²ååºç¶æ"); |
| | | } |
| | | //if (returnLocks.Any()) |
| | | //{ |
| | | // await _outStockLockInfoService.Db.Updateable(returnLocks).ExecuteCommandAsync(); |
| | | // _logger.LogInformation($"æ´æ°{returnLocks.Count}æ¡éå®è®°å½ä¸ºå·²ååºç¶æ"); |
| | | //} |
| | | |
| | | // æ´æ°åºåä¿¡æ¯ |
| | | stockInfo.LocationCode = task.TargetAddress; |
| | |
| | | foreach (var detail in stockInfo.Details) |
| | | { |
| | | detail.Status = StockStatusEmun.å
¥åºå®æ.ObjToInt(); |
| | | detail.OutboundQuantity = 0; // å
¥åºå®ææ¶åºåºæ°éæ¸
é¶ |
| | | detail.OutboundQuantity = 0; |
| | | } |
| | | _stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details); |
| | | } |
| | |
| | | // å é¤é¶åºåæ°æ® |
| | | await DeleteZeroQuantityStockDetails(stockInfo.Id); |
| | | |
| | | await UpdateAffectedOrderDetails(task.OrderNo, returnLocks); |
| | | //await UpdateAffectedOrderDetails(task.OrderNo, returnLocks); |
| | | // æ´æ°è´§ä½ç¶æ |
| | | if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt()) |
| | | { |
| | |
| | | await Db.Deleteable(task).ExecuteCommandAsync(); |
| | | } |
| | | |
| | | await RecalculateOrderStatus(task.OrderNo); |
| | | //await RecalculateOrderStatus(task.OrderNo); |
| | | try |
| | | { |
| | | // è®°å½è´§ä½ç¶æåæ´ |
| | |
| | | _logger.LogInformation($"InPickTaskCompleted AddLocationStatusChangeRecord : {ex.Message} "); |
| | | } |
| | | |
| | | _logger.LogInformation($"æçååºå®æå¤çæå - ä»»å¡å·: {task.TaskNum}, æç: {task.PalletCode}, 订å: {task.OrderNo} è´§ä½ç¶æï¼{locationInfo.LocationStatus}"); |
| | | _ = Task.Run(async () => |
| | | { |
| | | try |
| | | { |
| | | var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>() |
| | | .FirstAsync(x => x.OrderNo == task.OrderNo); |
| | | //_logger.LogInformation($"æçååºå®æå¤çæå - ä»»å¡å·: {task.TaskNum}, æç: {task.PalletCode}, 订å: {task.OrderNo} è´§ä½ç¶æï¼{locationInfo.LocationStatus}"); |
| | | //_ = Task.Run(async () => |
| | | //{ |
| | | // try |
| | | // { |
| | | // var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>() |
| | | // .FirstAsync(x => x.OrderNo == task.OrderNo); |
| | | |
| | | if (outboundOrder != null) |
| | | { |
| | | // æ£æ¥è®¢åæ¯å¦å·²å®æï¼åªæå®ææ¶æåMESåé¦ |
| | | if (outboundOrder.OrderStatus == (int)OutOrderStatusEnum.åºåºå®æ) |
| | | { |
| | | await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo); |
| | | } |
| | | else |
| | | { |
| | | _logger.LogInformation($"订å{task.OrderNo}ç¶æä¸º{outboundOrder.OrderStatus}ï¼æä¸åMESåé¦"); |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError($"弿¥MESåé¦å¤ç失败 - OrderNo: {task.OrderNo}, Error: {ex.Message}"); |
| | | } |
| | | }); |
| | | // if (outboundOrder != null) |
| | | // { |
| | | // // æ£æ¥è®¢åæ¯å¦å·²å®æï¼åªæå®ææ¶æåMESåé¦ |
| | | // if (outboundOrder.OrderStatus == (int)OutOrderStatusEnum.åºåºå®æ) |
| | | // { |
| | | // await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo); |
| | | // } |
| | | // else |
| | | // { |
| | | // _logger.LogInformation($"订å{task.OrderNo}ç¶æä¸º{outboundOrder.OrderStatus}ï¼æä¸åMESåé¦"); |
| | | // } |
| | | // } |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // _logger.LogError($"弿¥MESåé¦å¤ç失败 - OrderNo: {task.OrderNo}, Error: {ex.Message}"); |
| | | // } |
| | | //}); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | _stockRepository.UpdateData(stockInfo); |
| | | _unitOfWorkManage.CommitTran(); |
| | | } |
| | | TaskModel esstask = new TaskModel() |
| | | { |
| | | taskType = "putaway", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType> |
| | | { |
| | | new() |
| | | { |
| | | taskCode=newTask.TaskNum.ToString(), |
| | | taskPriority=0, |
| | | taskDescribe=new TaskDescribeType{ |
| | | containerCode=palletCode, |
| | | containerType= "CT_KUBOT_STANDARD", |
| | | fromLocationCode=stations.GetValueOrDefault(stationCode)??"", |
| | | toStationCode="", |
| | | toLocationCode=locationInfo.LocationCode, |
| | | deadline=0,storageTag="" |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | //TaskModel esstask = new TaskModel() |
| | | //{ |
| | | // taskType = "putaway", |
| | | // taskGroupCode = "", |
| | | // groupPriority = 0, |
| | | // tasks = new List<TasksType> |
| | | // { |
| | | // new() |
| | | // { |
| | | // taskCode=newTask.TaskNum.ToString(), |
| | | // taskPriority=0, |
| | | // taskDescribe=new TaskDescribeType{ |
| | | // containerCode=palletCode, |
| | | // containerType= "CT_KUBOT_STANDARD", |
| | | // fromLocationCode=stations.GetValueOrDefault(stationCode)??"", |
| | | // toStationCode="", |
| | | // toLocationCode=locationInfo.LocationCode, |
| | | // deadline=0,storageTag="" |
| | | // } |
| | | // } |
| | | // } |
| | | //}; |
| | | |
| | | var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | //var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | |
| | | _logger.LogInformation("å建任å¡è¿å: " + result); |
| | | if (result) |
| | | //_logger.LogInformation("å建任å¡è¿å: " + result); |
| | | //if (result) |
| | | { |
| | | try |
| | | { |
| | |
| | | } |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | else |
| | | { |
| | | return WebResponseContent.Instance.Error("ä¸åæºå¨äººä»»å¡å¤±è´¥ï¼"); |
| | | } |
| | | //else |
| | | //{ |
| | | // return WebResponseContent.Instance.Error("ä¸åæºå¨äººä»»å¡å¤±è´¥ï¼"); |
| | | //} |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | TaskModel esstask = new TaskModel() |
| | | { |
| | | taskType = "carry", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType> |
| | | { |
| | | new() |
| | | { |
| | | taskCode=task.TaskNum.ToString(), |
| | | taskPriority=0, |
| | | taskDescribe=new TaskDescribeType{ |
| | | containerCode=stockInfo.PalletCode, |
| | | containerType= "CT_KUBOT_STANDARD", |
| | | fromLocationCode=stockInfo.LocationCode??"", |
| | | toStationCode="", |
| | | toLocationCode="1-2", |
| | | deadline=0,storageTag="" |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | //TaskModel esstask = new TaskModel() |
| | | //{ |
| | | // taskType = "carry", |
| | | // taskGroupCode = "", |
| | | // groupPriority = 0, |
| | | // tasks = new List<TasksType> |
| | | // { |
| | | // new() |
| | | // { |
| | | // taskCode=task.TaskNum.ToString(), |
| | | // taskPriority=0, |
| | | // taskDescribe=new TaskDescribeType |
| | | // { |
| | | // containerCode=stockInfo.PalletCode, |
| | | // containerType= "CT_KUBOT_STANDARD", |
| | | // fromLocationCode=stockInfo.LocationCode??"", |
| | | // toStationCode="", |
| | | // toLocationCode="1-2", |
| | | // deadline=0, |
| | | // storageTag="" |
| | | // } |
| | | // } |
| | | // } |
| | | //}; |
| | | //var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | |
| | | _logger.LogInformation("å建任å¡PalletOutboundTask è¿å: " + result); |
| | | //_logger.LogInformation("å建任å¡PalletOutboundTask è¿å: " + result); |
| | | } |
| | | return content.OK("空æåºåºæå!"); |
| | | } |
| | |
| | | _outboundOrderDetailService.Repository.UpdateData(outboundOrderDetails); |
| | | } |
| | | _unitOfWorkManage.CommitTran(); |
| | | TaskModel esstask = new TaskModel() |
| | | { |
| | | taskType = "carry", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType>() |
| | | }; |
| | | return WebResponseContent.Instance.OK(); |
| | | //TaskModel esstask = new TaskModel() |
| | | //{ |
| | | // taskType = "carry", |
| | | // taskGroupCode = "", |
| | | // groupPriority = 0, |
| | | // tasks = new List<TasksType>() |
| | | //}; |
| | | |
| | | foreach (var task in tasks) |
| | | { |
| | | esstask. |
| | | tasks.Add(new TasksType |
| | | { |
| | | taskCode = task.TaskNum.ToString(), |
| | | taskPriority = 0, |
| | | taskDescribe = new TaskDescribeType |
| | | { |
| | | containerCode = task.PalletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = task.SourceAddress ?? "", |
| | | toStationCode = "", |
| | | toLocationCode = task.TargetAddress, |
| | | deadline = 0, |
| | | storageTag = "" |
| | | } |
| | | } |
| | | ); |
| | | } |
| | | var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | //foreach (var task in tasks) |
| | | //{ |
| | | // esstask. |
| | | // tasks.Add(new TasksType |
| | | // { |
| | | // taskCode = task.TaskNum.ToString(), |
| | | // taskPriority = 0, |
| | | // taskDescribe = new TaskDescribeType |
| | | // { |
| | | // containerCode = task.PalletCode, |
| | | // containerType = "CT_KUBOT_STANDARD", |
| | | // fromLocationCode = task.SourceAddress ?? "", |
| | | // toStationCode = "", |
| | | // toLocationCode = task.TargetAddress, |
| | | // deadline = 0, |
| | | // storageTag = "" |
| | | // } |
| | | // } |
| | | // ); |
| | | //} |
| | | //var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | |
| | | _logger.LogInformation("å建任å¡PalletOutboundTask è¿å: " + result); |
| | | if (result) |
| | | { |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | else |
| | | { |
| | | return WebResponseContent.Instance.Error("ä¸åæºå¨äººä»»å¡å¤±è´¥ï¼"); |
| | | } |
| | | //_logger.LogInformation("å建任å¡PalletOutboundTask è¿å: " + result); |
| | | //if (result) |
| | | //{ |
| | | // return WebResponseContent.Instance.OK(); |
| | | //} |
| | | //else |
| | | //{ |
| | | // return WebResponseContent.Instance.Error("ä¸åæºå¨äººä»»å¡å¤±è´¥ï¼"); |
| | | //} |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | _outboundOrderDetailService.Repository.UpdateData(outboundOrderDetails); |
| | | } |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK(); |
| | | //PushTasksToWCS(tasks); |
| | | TaskModel esstask = new TaskModel() |
| | | { |
| | | taskType = "carry", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType>() |
| | | }; |
| | | //TaskModel esstask = new TaskModel() |
| | | //{ |
| | | // taskType = "carry", |
| | | // taskGroupCode = "", |
| | | // groupPriority = 0, |
| | | // tasks = new List<TasksType>() |
| | | //}; |
| | | |
| | | foreach (var task in tasks) |
| | | { |
| | | esstask. |
| | | tasks.Add(new TasksType |
| | | { |
| | | taskCode = task.TaskNum.ToString(), |
| | | taskPriority = 0, |
| | | taskDescribe = new TaskDescribeType |
| | | { |
| | | containerCode = task.PalletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = task.SourceAddress ?? "", |
| | | toStationCode = "", |
| | | toLocationCode = task.TargetAddress, |
| | | deadline = 0, |
| | | storageTag = "" |
| | | } |
| | | } |
| | | ); |
| | | } |
| | | var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | //foreach (var task in tasks) |
| | | //{ |
| | | // esstask. |
| | | // tasks.Add(new TasksType |
| | | // { |
| | | // taskCode = task.TaskNum.ToString(), |
| | | // taskPriority = 0, |
| | | // taskDescribe = new TaskDescribeType |
| | | // { |
| | | // containerCode = task.PalletCode, |
| | | // containerType = "CT_KUBOT_STANDARD", |
| | | // fromLocationCode = task.SourceAddress ?? "", |
| | | // toStationCode = "", |
| | | // toLocationCode = task.TargetAddress, |
| | | // deadline = 0, |
| | | // storageTag = "" |
| | | // } |
| | | // } |
| | | // ); |
| | | //} |
| | | //var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | |
| | | _logger.LogInformation("å建任å¡PalletOutboundTask è¿å: " + result); |
| | | if (result) |
| | | { |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | else |
| | | { |
| | | return WebResponseContent.Instance.Error("ä¸åæºå¨äººä»»å¡å¤±è´¥ï¼"); |
| | | } |
| | | //_logger.LogInformation("å建任å¡PalletOutboundTask è¿å: " + result); |
| | | //if (result) |
| | | //{ |
| | | // return WebResponseContent.Instance.OK(); |
| | | //} |
| | | //else |
| | | //{ |
| | | // return WebResponseContent.Instance.Error("ä¸åæºå¨äººä»»å¡å¤±è´¥ï¼"); |
| | | //} |
| | | |
| | | } |
| | | catch (Exception ex) |
| | |
| | | BaseDal.AddData(tasks); |
| | | _locationInfoService.UpdateData(locationInfos); |
| | | _unitOfWorkManage.CommitTran(); |
| | | TaskModel esstask = new TaskModel() |
| | | { |
| | | taskType = "carry", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType>() |
| | | }; |
| | | |
| | | foreach (var task in tasks) |
| | | { |
| | | esstask. |
| | | tasks.Add(new TasksType |
| | | { |
| | | taskCode = task.TaskNum.ToString(), |
| | | taskPriority = 0, |
| | | taskDescribe = new TaskDescribeType |
| | | { |
| | | containerCode = task.PalletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = task.SourceAddress ?? "", |
| | | toStationCode = "", |
| | | toLocationCode = task.TargetAddress, |
| | | deadline = 0, |
| | | storageTag = "" |
| | | } |
| | | } |
| | | ); |
| | | } |
| | | var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | |
| | | _logger.LogInformation("å建任å¡PalletOutboundTask è¿å: " + result); |
| | | if (result) |
| | | { |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | else |
| | | { |
| | | return WebResponseContent.Instance.Error("ä¸åæºå¨äººä»»å¡å¤±è´¥ï¼"); |
| | | } |
| | | content.OK(); |
| | | //TaskModel esstask = new TaskModel() |
| | | //{ |
| | | // taskType = "carry", |
| | | // taskGroupCode = "", |
| | | // groupPriority = 0, |
| | | // tasks = new List<TasksType>() |
| | | //}; |
| | | |
| | | //foreach (var task in tasks) |
| | | //{ |
| | | // esstask. |
| | | // tasks.Add(new TasksType |
| | | // { |
| | | // taskCode = task.TaskNum.ToString(), |
| | | // taskPriority = 0, |
| | | // taskDescribe = new TaskDescribeType |
| | | // { |
| | | // containerCode = task.PalletCode, |
| | | // containerType = "CT_KUBOT_STANDARD", |
| | | // fromLocationCode = task.SourceAddress ?? "", |
| | | // toStationCode = "", |
| | | // toLocationCode = task.TargetAddress, |
| | | // deadline = 0, |
| | | // storageTag = "" |
| | | // } |
| | | // } |
| | | // ); |
| | | //} |
| | | //var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | |
| | | //_logger.LogInformation("å建任å¡PalletOutboundTask è¿å: " + result); |
| | | //if (result) |
| | | //{ |
| | | // return WebResponseContent.Instance.OK(); |
| | | //} |
| | | //else |
| | | //{ |
| | | // return WebResponseContent.Instance.Error("ä¸åæºå¨äººä»»å¡å¤±è´¥ï¼"); |
| | | //} |
| | | //content.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using Quartz; |
| | | using SqlSugar; |
| | | using WIDESEA_Common.TaskEnum; |
| | | using WIDESEA_DTO.Basic; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_Model.Models; |
| | | |
| | | namespace WIDESEA_WMSServer |
| | | { |
| | | [DisallowConcurrentExecution] |
| | | public class AgvTaskJob : IJob |
| | | { |
| | | private readonly ILogger<AgvTaskJob> _logger; |
| | | private readonly ISqlSugarClient _db; |
| | | private readonly IESSApiService _eSSApiService; |
| | | // éè¿æé 彿°ç´æ¥æ³¨å
¥ä¾èµ |
| | | public AgvTaskJob(ILogger<AgvTaskJob> logger, ISqlSugarClient db, IESSApiService eSSApiService) |
| | | { |
| | | _logger = logger; |
| | | _db = db; |
| | | _eSSApiService = eSSApiService; |
| | | } |
| | | |
| | | public async Task Execute(IJobExecutionContext context) |
| | | { |
| | | try |
| | | { |
| | | var tasks = await _db.Queryable<Dt_Task>() |
| | | .Where(x => x.TaskStatus == (int)TaskStatusEnum.New) |
| | | .ToListAsync(); |
| | | foreach (var item in tasks) |
| | | { |
| | | TaskModel esstask = new TaskModel() |
| | | { |
| | | taskType = item.TaskType.GetTaskTypeGroup()==TaskTypeGroup.InboundGroup? "putaway": "carry", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType> |
| | | { |
| | | new() |
| | | { |
| | | taskCode=item.TaskNum.ToString(), |
| | | taskPriority=0, |
| | | taskDescribe = new TaskDescribeType |
| | | { |
| | | containerCode = item.PalletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = item.SourceAddress, |
| | | toStationCode = "", |
| | | toLocationCode = item.TargetAddress, |
| | | deadline = 0, |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | |
| | | var result = await _eSSApiService.CreateTaskAsync(esstask); |
| | | if (result) |
| | | { |
| | | item.TaskStatus = (int)TaskStatusEnum.HasSent; |
| | | await _db.Updateable(item).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError(ex, "宿¶ä»»å¡æ§è¡å¤±è´¥"); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | |  |
| | | using Microsoft.AspNetCore.Builder; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | using WIDESEA.QuartzJob; |
| | | using WIDESEA_Core.Helper; |
| | | |
| | | namespace WIDESEA_WMSServer |
| | | { |
| | | /// <summary> |
| | | /// Quartz å¯å¨æå¡ |
| | | /// </summary> |
| | | public static class QuartzJobMiddleWare |
| | | { |
| | | public static void UseQuartzJobMildd(this IApplicationBuilder app) |
| | | { |
| | | if (app == null) throw new ArgumentNullException(nameof(app)); |
| | | var schedulerCenter = app.ApplicationServices.GetService(typeof(ISchedulerCenter)) as ISchedulerCenter; |
| | | try |
| | | { |
| | | var allQzServices = new List<TasksQz>() |
| | | { |
| | | new TasksQz() |
| | | { |
| | | Id = 1, |
| | | AssemblyName = "WIDESEA_WMSServer", |
| | | ClassName = "AgvTaskJob", |
| | | CreateTime = DateTime.Now, |
| | | IntervalSecond = 3, |
| | | IsDeleted = false, |
| | | IsStart = false, |
| | | JobGroup = "WIDESEA_WMSServer", |
| | | Name = "AgvTaskJob", |
| | | TriggerType = 0 |
| | | }, |
| | | |
| | | }; |
| | | foreach (var item in allQzServices) |
| | | { |
| | | var ResuleModel = schedulerCenter.AddScheduleJobAsync(item).Result; |
| | | if (ResuleModel.Status) |
| | | { |
| | | ConsoleHelper.WriteSuccessLine($"{item.ClassName}å¯å¨æå"); |
| | | } |
| | | else |
| | | { |
| | | Console.Out.WriteLine($"QuartzNetJob{item.Name}å¯å¨å¤±è´¥ï¼é误信æ¯ï¼{ResuleModel.Message}"); |
| | | } |
| | | } |
| | | schedulerCenter.StartScheduleAsync(); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | throw; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | using Newtonsoft.Json.Converters; |
| | | using Newtonsoft.Json.Serialization; |
| | | using Quartz; |
| | | using Quartz.Impl; |
| | | using Quartz.Spi; |
| | | using Serilog; |
| | | using System.Net.Security; |
| | | using System.Reflection; |
| | | using System.Runtime.ConstrainedExecution; |
| | | using System.Text; |
| | | using WIDESEA.QuartzJob; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.Authorization; |
| | | using WIDESEA_Core.BaseServices; |
| | |
| | | using WIDESEA_Core.Helper; |
| | | //using WIDESEA_Core.HostedService; |
| | | using WIDESEA_Core.Middlewares; |
| | | using WIDESEA_DTO.Quartz; |
| | | using WIDESEA_WMSServer; |
| | | using WIDESEA_WMSServer.Filter; |
| | | using WIDESEA_WMSServer.Jobs; |
| | | using static Quartz.Logging.OperationName; |
| | | |
| | | var builder = WebApplication.CreateBuilder(args); |
| | | |
| | |
| | | client.BaseAddress = new Uri(erpurl!); |
| | | client.Timeout = TimeSpan.FromSeconds(30); |
| | | |
| | | }) ; |
| | | |
| | | }); |
| | | builder.Services.AddSingleton<IJobFactory, JobFactory>(); |
| | | builder.Services.AddTransient<AgvTaskJob>();//Job使ç¨ç¬æ¶ä¾èµæ³¨å
¥ |
| | | builder.Services.AddSingleton<ISchedulerCenter, SchedulerCenterServer>(); |
| | | |
| | | builder.Services.AddQuartz(q => |
| | | { |
| | | |
| | | var jobKey = new JobKey("ErpJob"); |
| | | q.AddJob<ErpJob>(opts => opts.WithIdentity(jobKey)); |
| | | |
| | | |
| | | // æ·»å 触åå¨ - æ¯å¤©10:00, 14:00, 20:00æ§è¡ |
| | | q.AddTrigger(opts => opts |
| | |
| | | .ForJob(inventoryLockJobKey) |
| | | .WithIdentity("InventoryLockJob-trigger") |
| | | .WithCronSchedule("0 0/10 * * * ?")); // æ¯10åéæ§è¡ä¸æ¬¡ |
| | | |
| | | }); |
| | | |
| | | |
| | | builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true); |
| | | var app = builder.Build(); |
| | | |
| | | |
| | | app.UseQuartzJobMildd(); |
| | | |
| | | app.UseMiniProfiler();//æ§è½åæå¨ |
| | | app.ConfigureApplication();//é
ç½®æä»¶ |
| | | app.UseApplicationSetup();//å¯å¨é
ç½® |