169 lines
6.6 KiB
C#
169 lines
6.6 KiB
C#
using Microsoft.Data.SqlClient;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using Microsoft.Extensions.Caching.Distributed;
|
||
using RB_MES_API.Context;
|
||
using RB_MES_API.HostService;
|
||
using RB_MES_API.Models;
|
||
using System.Data;
|
||
|
||
namespace RB_MES_API.Controllers
|
||
{
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
public class EnpowerTask : IHostedService, IDisposable
|
||
{
|
||
private readonly RBContext _context;
|
||
private readonly IServiceScopeFactory _serviceScopeFactory; //创建一个完全独立的新作用域,以调用本地轮询服务
|
||
private readonly ILogger _logger;
|
||
private readonly IDistributedCache _distributedCache;
|
||
private readonly IKDSqlHelper _sqlHelper;
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <param name="serviceScopeFactory"></param>
|
||
/// <param name="logger"></param>
|
||
public EnpowerTask(IServiceScopeFactory serviceScopeFactory,ILogger<EnpowerTask> logger
|
||
, RBContext context, IDistributedCache distributed,IKDSqlHelper sqlHelper )//静态方法
|
||
{
|
||
_serviceScopeFactory = serviceScopeFactory;
|
||
_logger = logger;
|
||
_context = context;
|
||
_distributedCache = distributed;
|
||
_sqlHelper = sqlHelper;
|
||
}
|
||
|
||
/// <inheritdoc/>
|
||
|
||
public void Dispose()
|
||
{
|
||
this.Dispose();
|
||
}
|
||
/// <summary>
|
||
///
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
async Task<bool> GetAutoService()
|
||
{
|
||
bool autoService = false;
|
||
await Task.Run(() => {
|
||
if (LocalStaticRequest.AutoPushTask)
|
||
{
|
||
autoService = true;
|
||
Thread thread =new Thread (waitstarservice);
|
||
thread.IsBackground = true;
|
||
thread.Start ();
|
||
}
|
||
return Task.CompletedTask;
|
||
});
|
||
|
||
return autoService;
|
||
}
|
||
async Task IHostedService.StartAsync(CancellationToken cancellationToken)
|
||
{
|
||
if (!cancellationToken.IsCancellationRequested)
|
||
{
|
||
try
|
||
{
|
||
//如果缓存中不存在,就从数据库里取出来再放进缓存
|
||
List<SystemProfile> sys = CacheHelper.GetCache<List<SystemProfile>>("LocalStaticRequest");
|
||
if (sys == null)
|
||
{
|
||
//先初始化全局变量
|
||
sys = await _context.r_SystemProfiles!.AsNoTracking().ToListAsync();
|
||
}
|
||
CacheHelper.Set_AbsluteExpire("LocalStaticRequest", sys);
|
||
|
||
var pushservice = sys.Find(s => s.FCategoryID == 1 && s.FKey == "AutoPushTask");
|
||
var sendinterval = sys.Find(s => s.FCategoryID == 1 && s.FKey == "SendInterval");
|
||
var tokenurl= sys.Find(s => s.FCategoryID == 4 && s.FKey == "TokenUrl");
|
||
bool isauto = pushservice != null ? pushservice.FValue == "1" ? true : false : false;
|
||
int sendTime = sendinterval == null ? 0 : 60 * 1000 * int.Parse(sendinterval.FValue);//以分钟作为单位...
|
||
var apigroupid = sys.Find(s => s.FCategoryID == 1 && s.FKey == "APIGrouID");
|
||
string url = tokenurl.FValue;
|
||
//如果最后一个字符不是"/"就添加上去
|
||
url += url.Substring(url.Length - 1, 1) == "/" ? "" : "/";
|
||
LocalStaticRequest.APIGrouID = apigroupid == null ? 0 : apigroupid.FID;
|
||
LocalStaticRequest.SendTime = sendTime;
|
||
LocalStaticRequest.LocasServerStatus = false;
|
||
LocalStaticRequest.AutoPushTask = isauto;
|
||
LocalStaticRequest.tokenurl = url;
|
||
|
||
//将计量单位加入缓存
|
||
Thread uthread = new Thread(AddUnitCache);
|
||
uthread.IsBackground = true;
|
||
uthread.Start();
|
||
//建议测试阶段手工启动,生产环境下还是自动启动
|
||
bool B = await GetAutoService();
|
||
if (!B)
|
||
{
|
||
Thread thread = new Thread(waitstarserviceAuto);
|
||
thread.IsBackground = true;
|
||
thread.Start();
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
//如果金蝶Cloud登录失败,就会发生异常,可能导致程序崩溃...
|
||
throw;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
private void AddUnitCache()
|
||
{
|
||
DataTable table = CacheHelper.GetCache<DataTable>("BD_UNIT");
|
||
if(table == null)
|
||
{
|
||
string sql = "SELECT * FROM kdCloud_BD_UNIT WHERE FDocumentStatus=@C AND FForbidStatus=@A";
|
||
SqlParameter[] sqlParameters = new SqlParameter[]
|
||
{
|
||
new SqlParameter("@C","C"),
|
||
new SqlParameter("@A","A")
|
||
};
|
||
string reason = string.Empty;
|
||
DataSet dataSet = _sqlHelper.GetDataSet(CommandType.Text, sql, sqlParameters, ref reason);
|
||
if (dataSet != null)
|
||
{
|
||
if(dataSet.Tables.Count > 0)
|
||
{
|
||
table = dataSet.Tables[0];
|
||
if(table.Rows.Count > 0) { CacheHelper.Set_AbsluteExpire("BD_UNIT", table); }
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
private void waitstarservice()
|
||
{
|
||
using var scope = _serviceScopeFactory.CreateScope();
|
||
IPushMesInterface myScopedService = scope.ServiceProvider.GetRequiredService<IPushMesInterface>();
|
||
myScopedService.DoAutoWork();
|
||
}
|
||
/// <summary>
|
||
/// 一直等着,直到出现启动服务的变量
|
||
/// </summary>
|
||
private void waitstarserviceAuto()
|
||
{
|
||
while (true)
|
||
{
|
||
if (LocalStaticRequest.AutoPushTask)
|
||
{
|
||
Thread thread = new Thread(waitstarservice);
|
||
thread.IsBackground = true;
|
||
thread.Start();
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
Task IHostedService.StopAsync(CancellationToken cancellationToken)
|
||
{
|
||
Dispose();
|
||
_logger.LogInformation(DateTime.Now.ToLongTimeString(), "推送服务停止...");
|
||
return Task.CompletedTask;
|
||
}
|
||
}
|
||
}
|