using Ewide.Core; using Ewide.Nbzs.Entity; using Ewide.Nbzs.Entity.Extends; using Furion; using Furion.DataEncryption; using Furion.JsonSerialization; using Furion.TaskScheduler; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Ewide.Nbzs.BackWorkerService { public class Worker : BackgroundService { private readonly ILogger _logger; readonly SqlSugarProvider db_Product_Conn; readonly SqlSugarProvider db_Zlb_Conn; //private readonly IDistributedCache _cache; private readonly ICache _cache; //, IDistributedCache cache public Worker(ILogger logger) { _logger = logger; db_Product_Conn = DbManage.GetConnection("Product_Conn"); db_Zlb_Conn = DbManage.GetConnection("Zlb_Conn"); //_cache = cache; _cache = new RedisCache(Microsoft.Extensions.Options.Options.Create(new CacheOptions { CacheType = CacheType.RedisCache, RedisConnectionString = App.GetConfig("RedisConfig") })); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { ExecPushProcess(); _logger.LogInformation("已完成一次任务,Finish a Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(1 * 60 * 1000, stoppingToken); } } /// /// 执行推送任务 /// private void ExecPushProcess() { //取出推送任务表数据 var listPush = db_Product_Conn.Queryable().Where(p => p.IsDeleted == 0).ToList(); listPush.ForEach(p => { if (p.IsAutoDo == 1) { //_logger.LogInformation("自动创建任务:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); ////自动推 //#region 自动 //SpareTime.Do(() => //{ // if (p.IsError == 1) // { // _logger.LogInformation("自动任务停止:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); // return null; // } // else // return SpareTime.GetCronNextOccurrence(p.AutoDoTime); //}, (time, count) => { Push(p, count); } //); //#endregion if (p.IsError == 1) { //_logger.LogInformation("自动任务停止:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } else { Push(p); } } else if (p.IsAutoDo == 0 && p.IsProcessed == 0) { //_logger.LogInformation("手动创建任务:" + DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss")); //手动 //SpareTime.DoOnce(1, (timer, count) => { Push(p); }); Push(p); } }); } private void Push2(PushZlb pushZlb) { _logger.LogWarning("测试Push2"); } private List Push(PushZlb pushZlbObj) { //测试读取接口中缓存 _logger.LogInformation("进入Push方法():Id:{Id} ,项目ID:{PrjId} at: {time}", pushZlbObj.ID, pushZlbObj.PrjId, DateTimeOffset.Now); List list_result = new(); try { var projectId = Guid.Parse(pushZlbObj.PrjId); var project = db_Product_Conn.Queryable().Where(p => p.ID == projectId).First(); if (project != null) { #region 政策 _cache.Set($"CacheData-PoliciesRegulations", db_Zlb_Conn.Queryable().ToList()); var listPoliciesRegulations = db_Product_Conn.Queryable().ToList(); //_cache.SetString($"CacheData-PoliciesRegulations", JSON.Serialize(listPoliciesRegulations), new DistributedCacheEntryOptions //{ // SlidingExpiration = TimeSpan.FromMinutes(60) //}); //删政策 var delete_result = db_Zlb_Conn.Deleteable().ExecuteCommandHasChange(); list_result.Add(new PushResult { Action = "Delete", TableName = "PoliciesRegulations", IsSuccess = delete_result }); var insert_result = db_Zlb_Conn.Insertable(listPoliciesRegulations).ExecuteCommand(); list_result.Add(new PushResult { Action = "Insert", TableName = "PoliciesRegulations", IsSuccess = insert_result > 0 }); _cache.Set($"CacheData-PoliciesRegulations", db_Zlb_Conn.Queryable().ToList()); #endregion #region 非住宅协议 _cache.Set($"CacheData-ResidentialAgreement", GetBcxyData()); //if (delete_result) //{ //加密敏感字段 var listNonResidentialAgreement = db_Product_Conn.Queryable().Where(p => p.ProjectID == projectId).ToList(); listNonResidentialAgreement.ForEach(p => { p.ExpropriatedCardNo = MD5Encryption.Encrypt(p.ExpropriatedCardNo); p.ExpropriatedPhone = MD5Encryption.Encrypt(p.ExpropriatedPhone); }); //_cache.SetString($"CacheData-NonResidentialAgreement-{projectId}", JSON.Serialize(listNonResidentialAgreement), new DistributedCacheEntryOptions //{ // SlidingExpiration = TimeSpan.FromMinutes(60) //}); //删除非住宅协议 delete_result = db_Zlb_Conn.Deleteable().Where(p => p.ProjectID == projectId).ExecuteCommandHasChange(); list_result.Add(new PushResult { Action = "Delete", TableName = "NonResidentialAgreement", IsSuccess = delete_result }); insert_result = db_Zlb_Conn.Insertable(listNonResidentialAgreement).ExecuteCommand(); list_result.Add(new PushResult { Action = "Insert", TableName = "NonResidentialAgreement", IsSuccess = insert_result > 0 }); #endregion #region 住宅协议 //加密敏感字段 var listResidentialAgreement = db_Product_Conn.Queryable().Where(p => p.ProjectID == projectId).ToList(); listResidentialAgreement.ForEach(p => { p.ExpropriatedCardNo = MD5Encryption.Encrypt(p.ExpropriatedCardNo); p.ExpropriatedPhone = MD5Encryption.Encrypt(p.ExpropriatedPhone); }); //_cache.SetString($"CacheData-ResidentialAgreement-{projectId}", JSON.Serialize(listResidentialAgreement), new DistributedCacheEntryOptions //{ // SlidingExpiration = TimeSpan.FromMinutes(60) //}); //删除住宅协议 delete_result = db_Zlb_Conn.Deleteable().Where(p => p.ProjectID == projectId).ExecuteCommandHasChange(); list_result.Add(new PushResult { Action = "Delete", TableName = "ResidentialAgreement", IsSuccess = delete_result }); insert_result = db_Zlb_Conn.Insertable(listResidentialAgreement).ExecuteCommand(); list_result.Add(new PushResult { Action = "Insert", TableName = "ResidentialAgreement", IsSuccess = insert_result > 0 }); _cache.Set($"CacheData-ResidentialAgreement", GetBcxyData()); #endregion #region 非住宅评估 _cache.Set($"CacheData-InvestigateTable_Assessment", GetFHPGData()); var listNonInvestigateTable_Assessment = db_Product_Conn.Queryable().Where(p => p.ProjectId == projectId).ToList(); //_cache.SetString($"CacheData-NonInvestigateTable_Assessment-{projectId}", JSON.Serialize(listNonInvestigateTable_Assessment), new DistributedCacheEntryOptions //{ // SlidingExpiration = TimeSpan.FromMinutes(60) //}); //删除非住宅评估 delete_result = db_Zlb_Conn.Deleteable().Where(p => p.ProjectId == projectId).ExecuteCommandHasChange(); list_result.Add(new PushResult { Action = "Delete", TableName = "NonInvestigateTable_Assessment", IsSuccess = delete_result }); insert_result = db_Zlb_Conn.Insertable(listNonInvestigateTable_Assessment).ExecuteCommand(); list_result.Add(new PushResult { Action = "Insert", TableName = "NonInvestigateTable_Assessment", IsSuccess = insert_result > 0 }); #endregion #region 住宅评估 var listInvestigateTable_Assessment = db_Product_Conn.Queryable().Where(p => p.ProjectId == projectId).ToList(); //_cache.SetString($"CacheData-InvestigateTable_Assessment-{projectId}", JSON.Serialize(listInvestigateTable_Assessment), new DistributedCacheEntryOptions //{ // SlidingExpiration = TimeSpan.FromMinutes(60) //}); //删除住宅评估 delete_result = db_Zlb_Conn.Deleteable().Where(p => p.ProjectId == projectId).ExecuteCommandHasChange(); list_result.Add(new PushResult { Action = "Delete", TableName = "InvestigateTable_Assessment", IsSuccess = delete_result }); insert_result = db_Zlb_Conn.Insertable(listInvestigateTable_Assessment).ExecuteCommand(); list_result.Add(new PushResult { Action = "Insert", TableName = "InvestigateTable_Assessment", IsSuccess = insert_result > 0 }); _cache.Set($"CacheData-InvestigateTable_Assessment", GetFHPGData()); #endregion #region 非住宅调查表 _cache.Set($"CacheData-NonResidentialInvestigateTable", db_Zlb_Conn.Queryable().Select(p => new { dcbId = p.ID, PrjId = p.ProjectId, ExpropriatedCardNo = p.PropertyRightPrsonCardNo }).ToList()); //删除非住宅调查表 delete_result = db_Zlb_Conn.Deleteable().Where(p => p.ProjectId == projectId).ExecuteCommandHasChange(); list_result.Add(new PushResult { Action = "Delete", TableName = "NonResidentialInvestigateTable", IsSuccess = delete_result }); //加密敏感字段 var listNonInvestigateTable = db_Product_Conn.Queryable().Where(p => p.ProjectId == projectId).ToList(); listNonInvestigateTable.ForEach(p => { p.PropertyRightPrsonCardNo = MD5Encryption.Encrypt(p.PropertyRightPrsonCardNo); p.TheLegalRepresentativePhone = MD5Encryption.Encrypt(p.TheLegalRepresentativePhone); }); //_cache.SetString($"CacheData-NonResidentialInvestigateTable-{projectId}", JSON.Serialize(listNonInvestigateTable), new DistributedCacheEntryOptions //{ // SlidingExpiration = TimeSpan.FromMinutes(60) //}); insert_result = db_Zlb_Conn.Insertable(listNonInvestigateTable).ExecuteCommand(); list_result.Add(new PushResult { Action = "Insert", TableName = "NonResidentialInvestigateTable", IsSuccess = insert_result > 0 }); _cache.Set($"CacheData-NonResidentialInvestigateTable", db_Zlb_Conn.Queryable().Select(p => new { dcbId = p.ID, PrjId = p.ProjectId, ExpropriatedCardNo = p.PropertyRightPrsonCardNo }).ToList()); #endregion #region 住宅调查表 _cache.Set($"CacheData-InvestigateTable", db_Zlb_Conn.Queryable().Select(p => new { dcbId = p.ID, PrjId = p.ProjectId, p.ExpropriatedCardNo }).ToList()); //删除住宅调查表 delete_result = db_Zlb_Conn.Deleteable().Where(p => p.ProjectId == projectId).ExecuteCommandHasChange(); list_result.Add(new PushResult { Action = "Delete", TableName = "InvestigateTable", IsSuccess = delete_result }); //加密敏感字段 var listInvestigateTable = db_Product_Conn.Queryable().Where(p => p.ProjectId == projectId).ToList(); listInvestigateTable.ForEach(p => { p.ExpropriatedCardNo = MD5Encryption.Encrypt(p.ExpropriatedCardNo); p.ExpropriatedPhone = MD5Encryption.Encrypt(p.ExpropriatedPhone); }); //_cache.SetString($"CacheData-InvestigateTable-{projectId}", JSON.Serialize(listInvestigateTable), new DistributedCacheEntryOptions //{ // SlidingExpiration = TimeSpan.FromMinutes(60) //}); insert_result = db_Zlb_Conn.Insertable(listInvestigateTable).ExecuteCommand(); list_result.Add(new PushResult { Action = "Insert", TableName = "InvestigateTable", IsSuccess = insert_result > 0 }); _cache.Set($"CacheData-InvestigateTable", db_Zlb_Conn.Queryable().Select(p => new { dcbId = p.ID, PrjId = p.ProjectId, p.ExpropriatedCardNo }).ToList()); #endregion #region 项目 _cache.Set($"CacheData-Projects", GetProjectData()); var listProjects = db_Product_Conn.Queryable().Where(p => p.ID == projectId).ToList(); //_cache.SetString($"CacheData-Projects-{projectId}", JSON.Serialize(listProjects), new DistributedCacheEntryOptions //{ // SlidingExpiration = TimeSpan.FromMinutes(60) //}); //删项目 delete_result = db_Zlb_Conn.Deleteable().Where(p => p.ID == projectId).ExecuteCommandHasChange(); list_result.Add(new PushResult { Action = "Delete", TableName = "Projects", IsSuccess = delete_result }); insert_result = db_Zlb_Conn.Insertable(listProjects).ExecuteCommand(); list_result.Add(new PushResult { Action = "Insert", TableName = "Projects", IsSuccess = insert_result > 0 }); _cache.Set($"CacheData-Projects", GetProjectData()); #endregion #region ProjectsStep _cache.Set($"CacheData-ProjectsStep", db_Zlb_Conn.Queryable().ToList()); var listProjectsStep = db_Product_Conn.Queryable().Where(p => p.ProjectID == projectId).ToList(); //_cache.SetString($"CacheData-ProjectsStep-{projectId}", JSON.Serialize(listProjectsStep), new DistributedCacheEntryOptions //{ // SlidingExpiration = TimeSpan.FromMinutes(60) //}); //ProjectsStep delete_result = db_Zlb_Conn.Deleteable().Where(p => p.ProjectID == projectId).ExecuteCommandHasChange(); list_result.Add(new PushResult { Action = "Delete", TableName = "ProjectsStep", IsSuccess = delete_result }); insert_result = db_Zlb_Conn.Insertable(listProjectsStep).ExecuteCommand(); list_result.Add(new PushResult { Action = "Insert", TableName = "ProjectsStep", IsSuccess = insert_result > 0 }); _cache.Set($"CacheData-ProjectsStep", db_Zlb_Conn.Queryable().ToList()); #endregion } StringBuilder push_error_reason = new(); //if (list_result.Any(r => !r.IsSuccess)) //{ // list_result.ForEach(r => // { // push_error_reason.AppendFormat("{0} 表:[{1}] 结果:[{2}] [{3}]", r.Action, r.TableName, r.IsSuccess, r.FailReason); // }); // pushZlbObj.IsProcessed = 1; // pushZlbObj.LastProcessTime = DateTime.Now; // pushZlbObj.ProcessCount = pushZlbObj.ProcessCount + 1; // pushZlbObj.IsError = 1; // pushZlbObj.ErrorReason = push_error_reason.ToString(); // db_Product_Conn.Updateable(pushZlbObj).UpdateColumns(u => new { u.IsProcessed, u.LastProcessTime, u.ProcessCount, u.IsError, u.ErrorReason }).ExecuteCommand(); //} //else //{ pushZlbObj.IsProcessed = 1; pushZlbObj.LastProcessTime = DateTime.Now; if (pushZlbObj.ProcessCount == null) pushZlbObj.ProcessCount = 0; pushZlbObj.ProcessCount++; pushZlbObj.IsError = 0; pushZlbObj.ErrorReason = push_error_reason.ToString(); db_Product_Conn.Updateable(pushZlbObj).UpdateColumns(u => new { u.IsProcessed, u.LastProcessTime, u.ProcessCount, u.IsError, u.ErrorReason }).WhereColumns(u => new { u.ID }).ExecuteCommand(); //} } catch (Exception ex) { _logger.LogError(ex.Message + ex.StackTrace); } _logger.LogInformation("离开Push方法():Id:{Id} ,项目ID:{PrjId} at: {time}", pushZlbObj.ID, pushZlbObj.PrjId, DateTimeOffset.Now); return list_result; } private List GetProjectData() { return db_Zlb_Conn.Ado.SqlQuery("select status,a.ID Prjid,a.area,a.AreaID,a.HouseAcquisitionDepartment as zsbm,a.CollectDecisionNo1 as year,(isnull(a.CollectDecisionNoHeadName,'')+'['+cast(a.CollectDecisionNo1 as varchar)+']'+ isnull(cast(a.CollectDecisionNo2 as varchar),'')+'号') zsjdh,dbo.get_current_state(a.ID) CurrentState,NAME,CreateRecordTime from Projects a "); } private List GetFHPGData() { return db_Zlb_Conn.Ado.SqlQuery("select d.id,e.ProjectId as PrjId ,d.AssessmentNo,e.HouseAddress,d.countValue,e.id dcbId,d.CreateTime,d.CreateUserName,1 type from InvestigateTable_Assessment d inner join InvestigateTable e on d.InvestigateTableId=e.ID where d.IsPublic=1 union all select d.id,e.ProjectId as PrjId ,AssessmentNo, e.HouseAddress, d.countValue,e.id dcbId,d.CreateTime,d.CreateUserName,2 type from NonInvestigateTable_Assessment d inner join NonResidentialInvestigateTable e on d.NonInvestigateTableID = e.ID where d.IsPublic=1 ;"); } private List GetBcxyData() { return db_Zlb_Conn.Ado.SqlQuery("select d.id,isnull(d.CollectDecisionNoHeadName,'')+isnull(d.No1,'')+'-'+isnull(d.No2,'')+(case when (d.No3 is null or d.No3 = '') then '' else ('-'+d.No3) end ) XyNo,d.SwitchProductionWay,e.HouseAddress,d.SummationShouldCompensateMoney,e.ProjectId as PrjId,e.id dcbId,d.SignTime,1 type from ResidentialAgreement d inner join InvestigateTable e on d.InvestigateTableId=e.ID where d.IsInRecords = 1 union all select d.id,isnull(d.CollectDecisionNoHeadName, '') + isnull(d.No2, '') + '-' + isnull(d.No3, '') XyNo , d.SwitchProductionWay, e.HouseAddress, d.SummationShouldCompensateMoney, e.ProjectId as PrjId,e.id dcbId,d.SignTime,2 type from NonResidentialAgreement d inner join NonResidentialInvestigateTable e on d.NonInvestigateTableID = e.ID where d.IsInRecords = 1 ; "); } } public class PushResult { public string Action { get; set; } public bool IsSuccess { get; set; } public string TableName { get; set; } public string FailReason { get; set; } } }