using Microsoft.AspNetCore.Builder;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WIDESEA_Common;
using WIDESEA_Common.CutomerModel;
using WIDESEA_Core.EFDbContext;
using WIDESEA_Core.Utilities;
using WIDESEA_Entity.DomainModels;
using WIDESEA_Services.IRepositories;
using WIDESEA_Services.IServices;
using WIDESEA_Services.Repositories;
using WIDESEA_Services.Services;
using WIDESEA_WCS.WCSClient;
namespace WIDESEA_WCS
{
///
/// Quartz 启动服务
///
public static class QuartzJobMiddleWare
{
///
/// 使用Quartz(任务调度库)Job(工作)模式
///
///
///
public static void UseQuartzJobMildd(this IApplicationBuilder app)
{
if (app == null) throw new ArgumentNullException(nameof(app));
try
{
//WIDESEA.Helper.GetToken();
using (VOLContext context = new VOLContext())
{
IDt_DispatchManagementRepository dispatchManagementRepository = new Dt_DispatchManagementRepository(context);
List dispatchManagementList = dispatchManagementRepository.Find(r => r.dm_state == "Enable");
if (null == dispatchManagementList)
{
Console.Out.WriteLine("WCS系统未配置或未启用任务计划,请检查。");
return;
}
WCSService.jobs = FindJobOptions(dispatchManagementList);
WCSService.Clients = new List();
StdSchedulerFactory factory = new StdSchedulerFactory();
ISchedulerCenterServer schedulerCenter = new SchedulerCenterServer(factory);
IDt_PLCinfoHeadRepository pLcinfoHeadRepository = new Dt_PLCinfoHeadRepository(context);
IDt_PLCinfoDetailRepository plcinfoDetailRepository = new Dt_PLCinfoDetailRepository(context);
List pLcinfoHeadsList = pLcinfoHeadRepository.Find(x => true);
foreach (Dt_PLCinfoHead item in pLcinfoHeadsList)
{
PLCClient client = new PLCClient
{
PLCIPAddress = item.plcinfo_ip,
PLCName = item.plcinfo_name,
PLCDescription = item.plcinfo_state,
PLCDBItems = plcinfoDetailRepository.Find(x => x.plcdetail_headid == item.plcinfo_id
&& !string.IsNullOrEmpty(x.plcdetail_name)).Select(x => new DBItemGroup
{
ItemAddress = x.plcdetail_db.Trim() + "." + x.plcdetail_value.Trim(),
ItemDataType = x.plcdetail_valtype.Trim(),
ItemName = x.plcdetail_name.Trim(),
ItemOperatorType = x.plcdetail_opratortype?.Trim(),
EquipNum = x.plcdetail_number.Trim(),
Remark = x.plcdetail_remark.Trim()
}).ToList(),
plcinfo_equiptype = item.plcinfo_equiptype
};
string msg = client.Connect();
client.Start(() => { });
WCSService.Clients.Add(client);
}
WCSService.jobs.ForEach(x => { x.JobParams = WCSService.Clients.Where(y => y.plcinfo_equiptype == x.JobGroup).ToList(); });
if (!WCSService.jobs.Any())
return;
for (int i = 0; i < WCSService.jobs.Count; i++)
{
WebResponseContent content = schedulerCenter.AddScheduleJobAsync(WCSService.jobs[i]).Result;
if (!content.Status)
{
factory = null;
schedulerCenter = null;
return;
}
}
schedulerCenter.StartScheduleAsync();
}
}
catch (Exception ex)
{
Console.Out.WriteLine("启动WCS服务失败." + ex.Message);
}
}
///
/// 查找任务计划
///
///
///
public static List FindJobOptions(List dispatches)
{
List jobOptions = new List();
foreach (var item in dispatches)
{
JobOptions options = new JobOptions()
{
AssemblyName = item.dm_assembly,
BeginTime = item.dm_begintime,
ClassName = item.dm_class,
Cron = item.dm_cron,
CycleRunTimes = item.dm_cycleruntimes ?? 0,
EndTime = item.dm_endtime,
IntervalSecond = item.dm_intervalsecond,
IsStart = false,
JobGroup = item.dm_group,
JobName = item.dm_group,
JobParams = null,
Remark = item.dm_remark,
TriggerType = item.dm_triggertype,
PLCConnectState = "未连接PLC"
};
jobOptions.Add(options);
}
return jobOptions;
}
}
}