Files
RBMESAPICore/Controllers/Cloud/HostService/EnpowerTask.cs
yuyubohh e8494ba988 qqq
2025-09-09 22:41:29 +08:00

169 lines
6.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}