巨石化纤
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

342 lines
10 KiB

using Nancy.Hosting.Self;
using Newtonsoft.Json.Linq;
using SSWMS.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Threading;
namespace SSWMS.Server
{
public class Service
{
public delegate void LogEventHandler(string sFunctionName, string sLog);
public static event LogEventHandler Log;
public static int Start()
{
try
{
lWCFService = new List<WCFService>()
{
new WCFService(S_BaseService._S_BaseService),
new WCFService(S_BaseService._S_CellService),
new WCFService(S_BaseService._S_ControlService),
new WCFService(S_BaseService._S_DeviceService),
new WCFService(S_BaseService._S_ERPService),
new WCFService(S_BaseService._S_ManageService),
new WCFService(S_BaseService._S_PlanService),
new WCFService(S_BaseService._S_StorageService),
new WCFService(S_BaseService._S_SystemService)
};
StartService();
StartWeb();
bwTask = new BackgroundWorker
{
WorkerSupportsCancellation = true
};
bwTask.DoWork += TaskDoWork;
bwTask.RunWorkerAsync();
bwTaskApply = new BackgroundWorker
{
WorkerSupportsCancellation = true
};
bwTaskApply.DoWork += TaskApplyDoWork;
bwTaskApply.RunWorkerAsync();
bwTaskLED = new BackgroundWorker
{
WorkerSupportsCancellation = true
};
bwTaskLED.DoWork += TaskLEDDoWork;
bwTaskLED.RunWorkerAsync();
bwTaskInterface = new BackgroundWorker
{
WorkerSupportsCancellation = true
};
bwTaskInterface.DoWork += TaskInterfaceDoWork;
bwTaskInterface.RunWorkerAsync();
//bwTaskPlc = new BackgroundWorker
//{
// WorkerSupportsCancellation = true
//};
//bwTaskPlc.DoWork += TaskPlcDoWork;
//bwTaskPlc.RunWorkerAsync();
}
catch (Exception ex)
{
Log("Start Server", ex.Message);
return SystemCode.ConstCode.ServerStart;
}
return SystemCode.ConstCode.Success;
}
public static void Stop()
{
try
{
bRunningThread = false;
bIOControl = false;
bIOControlApply = false;
bManage = false;
bPlan = false;
bLED = false;
Thread.Sleep(1000);
if (bwTask != null)
{
bwTask.CancelAsync();
}
if (bwTaskApply != null)
{
bwTaskApply.CancelAsync();
}
if (bwTaskLED != null)
{
bwTaskLED.CancelAsync();
}
if (bwTaskInterface != null)
{
bwTaskInterface.CancelAsync();
}
if (bwTaskPlc != null)
{
bwTaskPlc.CancelAsync();
}
StopService();
StopWeb();
Thread.Sleep(2000);
}
catch (Exception ex)
{
Log("Stop Server", ex.Message);
}
}
#region Web
private static NancyHost host = null;
public static void StartWeb()
{
try
{
StopWeb();
host = new NancyHost(new WebNancyBootstrapper(), new Uri(AppSettings.WebAPIUrl), new Uri(AppSettings.WebAPIUrl_Android));
host.Start();
}
catch
{
}
}
public static void StopWeb()
{
try
{
if (host != null)
{
host.Dispose();
}
}
catch
{
}
}
#endregion
#region Service
public static List<WCFService> lWCFService;
public static void StartService()
{
foreach (WCFService service in lWCFService)
{
try
{
service.StartService();
}
catch (Exception ex)
{
Log("Start Service", ex.Message);
}
}
}
public static void StopService()
{
foreach (WCFService service in lWCFService)
{
try
{
service.StopService();
}
catch (Exception ex)
{
Log("Stop Service", ex.Message);
}
}
}
#endregion
#region Task
public static bool bRunningThread = true;
public static bool bIOControl = false;
public static bool bIOControlApply = false;
public static bool bManage = false;
public static bool bPlan = false;
public static bool bInterface = false;
public static bool bLED = false;
public static bool bPlc = false;
public static BackgroundWorker bwTask = null;
public static BackgroundWorker bwTaskApply = null;
public static BackgroundWorker bwTaskLED = null;
public static BackgroundWorker bwTaskInterface = null;
public static BackgroundWorker bwTaskPlc = null;
private static void TaskDoWork(object sender, DoWorkEventArgs e)
{
string sResult = string.Empty;
while (bRunningThread)
{
if (bIOControl)
{
try
{
if (!S_BaseService._S_ControlService.IOControlTask(out sResult))
{
Log("Task IO_CONTROL", sResult);
}
}
catch (Exception ex)
{
Log("Task IO_CONTROL Exception", ex.ToString());
}
}
if (bManage)
{
try
{
if (!S_BaseService._S_ManageService.ManageTask(out sResult))
{
Log("Task MANAGE", sResult);
}
}
catch (Exception ex)
{
Log("Task MANAGE Exception", ex.ToString());
}
}
if (bPlan)
{
try
{
if (!S_BaseService._S_PlanService.PlanTask(out sResult))
{
Log("Task PLAN", sResult);
}
}
catch (Exception ex)
{
Log("Task PLAN Exception", ex.ToString());
}
}
Thread.Sleep(2000);
}
}
private static void TaskLEDDoWork(object sender, DoWorkEventArgs e)
{
string sResult = string.Empty;
while (bRunningThread)
{
if (bLED)
{
try
{
if (!LED.LEDTask(out sResult))
{
Log("Task LED", sResult);
}
}
catch (Exception ex)
{
Log("Task LED Exception", ex.ToString());
}
Thread.Sleep(500);
}
}
}
private static void TaskApplyDoWork(object sender, DoWorkEventArgs e)
{
string sResult = string.Empty;
while (bRunningThread)
{
if (bIOControlApply)
{
try
{
if (!S_BaseService._S_ControlService.IOControlApplyTask(out sResult))
{
Log("Task IO_CONTROL_APPLY", sResult);
}
}
catch (Exception ex)
{
Log("Task IO_CONTROL_APPLY Exception", ex.ToString());
}
}
Thread.Sleep(500);
}
}
private static void TaskInterfaceDoWork(object sender, DoWorkEventArgs e)
{
string sResult = string.Empty;
while (bRunningThread)
{
if (bInterface)
{
try
{
foreach (RECORD_MAIN rm in S_BaseService._P_RECORD_MAIN.GetListByStatus(SystemCode.MANAGE_STATUS.Interface))
{
if (!S_BaseService._S_ERPService.ERPInterface(rm, out sResult))
{
Log("Task Interface", sResult);
}
}
}
catch (Exception ex)
{
Log("Task Interface Exception", ex.ToString());
}
}
Thread.Sleep(5000);
}
}
private static void TaskPlcDoWork(object sender, DoWorkEventArgs e)
{
string sResult = string.Empty;
while (bRunningThread)
{
try
{
if (bPlc)
{
S7Net.Read();
}
else
{
S7Net.Close();
}
}
catch (Exception ex)
{
Log("Task PLC Exception", ex.ToString());
}
Thread.Sleep(2000);
}
}
#endregion
}
}