using Microsoft.EntityFrameworkCore;
using Nancy.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RB_MES_API.Context;
using RB_MES_API.Controllers;
using RB_MES_API.Controllers.Cloud;
using RB_MES_API.Models;
using RB_MES_API.Models.Cloud;
using RB_MES_API.Models.Pangu;
using RB_MES_APICore.Models.Pangu;
using RB_MES_APICore.Models;
using System.Data;
using System.Net;
using System.Reflection;
using System.Text;
namespace RB_MES_API.HostService
{
///
/// 定时推送服务
///
public class PushMesInterface : IPushMesInterface,IDisposable
{
private List _timer = new List();
private readonly RBContext _context;
private readonly IConfiguration _config;
private readonly IShareController _shareController;
private readonly IKDCloudHttpClient _KdhttpClient;
private readonly IKDSqlHelper _kdsqlhelper;
///
///
///
/// 注入的数据库连接
/// 共享方法
/// 金蝶API
///
///
public PushMesInterface(RBContext context, IConfiguration configuration, IShareController shareController
, IKDCloudHttpClient httpClient, IKDSqlHelper kdsqlhelper)
{
_context = context;
_config = configuration;
_shareController = shareController;
_KdhttpClient = httpClient;
_kdsqlhelper = kdsqlhelper;
}
///
public void Dispose()
{
foreach (Timer timer in _timer)
{
timer?.Dispose();
}
}
private void DoWork(object state)
{
// 定时任务逻辑
try
{
List queryJsons = _shareController.GetAPIList().Result;
var clouds = queryJsons.Where(s => s.GetFormID.FDocType == state.ToString()).ToList();
if (clouds.Count > 0)
{
new TaskFactory().StartNew(async () =>
{
CloudBillQuery query = clouds.FirstOrDefault();
//启动新线程执行推送业务
Type type = this.GetType();
MethodInfo? methodInfo = type.GetMethod(query.GetFormID.FActionName);
if (methodInfo != null)
{
object[] para = new object[] { query.GetFormID.FID, query.GetFormID.functions.FUrl };
methodInfo.Invoke(this, para);
}
});
}
}
catch (Exception ex)
{
LogHelper.WriteLog(string.Format("TimedHostedService的BackgroundServiceWork发生错误:{0}", ex.Message));
}
}
public async void DoTimerWorkAsyn()
{
await Task.Run(() => LoadLocalStaticRequest());
try
{
string v = LocalStaticRequest.GetSystemProfile(1, "AutoPushTask");
int at = 0;
int.TryParse(v, out at);
if (at > 0)
{
//只要FTimer > 0的接口都有一个属于自己的定时器!
List systimeds = _shareController.GetAPIList().Result;
if (systimeds.Count == 0) { return; }
var sys = from a in systimeds
select new
{
worktime = a.FTimer,
name = a.FDocType
};
foreach (var item in sys)
{
_timer.Add(new Timer(DoWork, item.name, TimeSpan.Zero, TimeSpan.FromMinutes(item.worktime)));
}
}
}
catch (Exception ex)
{
LogHelper.WriteLog(string.Format("TimedHostedService的StartAsync发生错误:{0}", ex.Message));
}
return;
}
///
/// 优先加载系统必须的静态数据
///
private void LoadLocalStaticRequest()
{
try
{
//如果缓存中不存在,就从数据库里取出来再放进缓存
List sys = CacheHelper.GetCache>("sys");
if (sys == null)
{
//先初始化全局变量
sys = _context.r_SystemProfiles!.AsNoTracking().ToList();
if (sys.Any())
{
CacheHelper.Set_AbsluteExpire("sys", sys);
}
}
LocalStaticRequest.sysprofile = sys; //定时刷新
}
catch (Exception ex)
{
//如果金蝶Cloud登录失败,就会发生异常,可能导致程序崩溃...
string msg = ex.Message;
LogHelper.WriteLog(string.Format("TimedHostedService的LoadHostFunctionAsync发生错误:{0}", msg));
}
//将计量单位加入缓存
Thread uthread = new Thread(AddUnitCache);
uthread.Start();
//无论是否推送,静态全局设置应该首先加载
string orgid = LocalStaticRequest.GetSystemProfile(2, "DefaultORGID");
string orgno = LocalStaticRequest.GetSystemProfile(2, "DefaultORG");
LocalStaticRequest.DefaultOrgID = string.IsNullOrEmpty(orgid) ? 1 : int.Parse(orgid);
LocalStaticRequest.DefaultOrg = string.IsNullOrEmpty(orgno) ? "100" : orgno;
}
private void AddUnitCache()
{
try
{
List units = new List();
string messstr = string.Empty;
string fileds = "FUNITID,FNumber,FName,FIsBaseUnit,FPrecision,FDocumentStatus,FForbidStatus,FConvertDenominator,FConvertNumerator,FRoundType";
//从云星空中把所有计量单位获取过来
BillQuery queryJson = new BillQuery()
{
FieldKeys = fileds,
FormId = "BD_UNIT",
FilterString = "FDOCUMENTSTATUS='C' AND FFORBIDSTATUS='A'"
};
if (!LocalStaticRequest.Islogin)
{
if (!_KdhttpClient.LoginErp().Result)
{
return;
}
}
//从云星空查询
string jsonstr = JsonConvert.SerializeObject(queryJson);
List