using APT.BaseData.Domain.Entities.FM; using APT.Infrastructure.Core; using Microsoft.AspNetCore.Mvc; using APT.Infrastructure.Api; using System.Collections.Generic; using System.Linq.Expressions; using System; using System.Linq; using APT.BaseData.Domain.ApiModel; using Ubiety.Dns.Core; using System.Security.AccessControl; using APT.MS.Domain.Entities.FO; using APT.BaseData.Domain.Entities; using APT.MS.Domain.Enums; using APT.MS.Domain.Entities.BI; using static APT.MS.Domain.Enums.BI.BIEnums; using NPOI.SS.Formula.Functions; using APT.PP.WebApi.Controllers.Api.PP; using APT.Utility; using Google.Protobuf.WellKnownTypes; using APT.WebApi.Models; namespace APT.SC.WebApi.Controllers.Api.BI { /// /// 年度监测汇总 /// [Route("api/PP/BIController")] [TypeFilter(typeof(CustomActionFilterAttribute))] public class BIController : AuthorizeApiController { /// /// 提取安全任务完成分析数据 /// /// 更新超时时间 /// [HttpPost, Route("updateSafeTaskData")] public JsonActionResult updateSafeTaskData([FromBody] KeywordFilter filter) { return SafeExecute(() => { var param = GetEntity(t => t.CODE == "BI001"); param.SYNC_PARAM = DateTime.Now.AddMonths(-3).ToShortDateString(); UpdateEntity(param); BaseFilter basefilter1 = new BaseFilter(filter.GetOrgId()); basefilter1.SelectField = new string[] { "ID" }; BaseFilter basefilter2 = new BaseFilter(filter.GetOrgId()); basefilter2.SelectField = new string[] { "SOURCE_DATA_ID" }; var allnoticeTask = GetEntities(t => t.NOTICE_STATUS == 2 && t.CREATE_TIME > DateTime.Parse(param.SYNC_PARAM), basefilter2); List fo01s = new List(); List fo02s = new List(); List fo03s = new List(); List fo04s = new List(); var fo01 = GetEntities(t => t.PRE_MEETING_STATUS == FOPreMeetingStatusEnum.归档 && t.OVERTIME == FOISOVERTIME.未统计, basefilter1); foreach (var item in fo01) { var isOver = allnoticeTask.Where(t => t.SOURCE_DATA_ID == item.ID); if (isOver.Any()) { item.OVERTIME = FOISOVERTIME.超时; } else { item.OVERTIME = FOISOVERTIME.未超时; } fo01s.Add(item); } BantchUpdateEntity(fo01s, "OVERTIME"); var fo02 = GetEntities(t => t.SHIFT_STATUS == (int)FOShiftStatusEnum.归档 && t.OVERTIME == FOISOVERTIME.未统计, basefilter1); foreach (var item in fo02) { var isOver = allnoticeTask.Where(t => t.SOURCE_DATA_ID == item.ID); if (isOver.Any()) { item.OVERTIME = FOISOVERTIME.超时; } else { item.OVERTIME = FOISOVERTIME.未超时; } fo02s.Add(item); } BantchUpdateEntity(fo02s, "OVERTIME"); var fo03 = GetEntities(t => t.SHIFT_STATUS == (int)FOChangeShiftStatusEnum.归档 && t.OVERTIME == FOISOVERTIME.未统计, basefilter1); foreach (var item in fo03) { var isOver = allnoticeTask.Where(t => t.SOURCE_DATA_ID == item.ID); if (isOver.Any()) { item.OVERTIME = FOISOVERTIME.超时; } else { item.OVERTIME = FOISOVERTIME.未超时; } fo03s.Add(item); } BantchUpdateEntity(fo03s, "OVERTIME"); var fo04 = GetEntities(t => t.TA_STATUS == (int)FOTeamActivityState.已归档 && t.OVERTIME == FOISOVERTIME.未统计, basefilter1); foreach (var item in fo04) { var isOver = allnoticeTask.Where(t => t.SOURCE_DATA_ID == item.ID); if (isOver.Any()) { item.OVERTIME = FOISOVERTIME.超时; } else { item.OVERTIME = FOISOVERTIME.未超时; } fo04s.Add(item); } BantchUpdateEntity(fo04s, "OVERTIME"); DeleteEntity(t => true); BaseFilter baseFilter = new BaseFilter(filter.GetOrgId()); baseFilter.Include = new string[] { "Nav_Department.Nav_Parent.Nav_Parent", "Nav_ChargePerson" }; var allTeams = GetEntities(t => t.IS_DELETED == false && t.ENABLE_STATUS == 0 && t.CHARGE_PERSON_ID != null, baseFilter); List biSafeFinishs = new List(); var selectFilter = new BaseFilter(filter.GetOrgId()); foreach (var team in allTeams) { var filterTime = new DateTime[] { DateTime.Now.AddDays(-7), DateTime.Now.AddMonths(-1), DateTime.Now.AddMonths(-3), DateTime.Now.AddMonths(-6), DateTime.Now.AddMonths(-12), DateTime.Now.AddYears(-10) }; for (int i = 0; i < filterTime.Length; i++) { var biSafeFinish = new T_BI_SAFETASK_FINISH(); biSafeFinish.ORG_ID = filter.GetOrgId(); biSafeFinish.TEAM_ID = team.ID; biSafeFinish.TEAM_NAME = team.NAME; biSafeFinish.TEAM_CHARGE_USER = team.Nav_ChargePerson.NAME; biSafeFinish.DEPARTMENT_NAME = team.Nav_Department.Nav_Parent.Nav_Parent.NAME; selectFilter.SelectField = new string[] { "ID", "PRE_MEETING_STATUS", "OVERTIME" }; var fo01a = GetEntities(t => t.TEAM_ID == team.ID && t.MEETING_TIME > filterTime[i], selectFilter); biSafeFinish.FO01_TOTAL = fo01a.Count(); biSafeFinish.FO01_FINISH = fo01a.Count(t => t.PRE_MEETING_STATUS == FOPreMeetingStatusEnum.归档 && t.OVERTIME != FOISOVERTIME.超时); biSafeFinish.FO01_UNFINISH = fo01a.Count(t => t.PRE_MEETING_STATUS < FOPreMeetingStatusEnum.归档); biSafeFinish.FO01_OVERTIME = fo01a.Count(t => t.OVERTIME == FOISOVERTIME.超时); selectFilter.SelectField = new string[] { "ID", "SHIFT_STATUS", "OVERTIME" }; var fo02a = GetEntities(t => t.CLASS_TEAM_ID == team.ID && t.RECORD_DATE > filterTime[i], selectFilter); biSafeFinish.FO02_TOTAL = fo02a.Count(); biSafeFinish.FO02_FINISH = fo02a.Count(t => t.SHIFT_STATUS == (int)FOShiftStatusEnum.归档 && t.OVERTIME != FOISOVERTIME.超时); biSafeFinish.FO02_UNFINISH = fo02a.Count(t => t.SHIFT_STATUS < (int)FOShiftStatusEnum.归档); biSafeFinish.FO02_OVERTIME = fo02a.Count(t => t.OVERTIME == FOISOVERTIME.超时); selectFilter.SelectField = new string[] { "ID", "SHIFT_STATUS", "OVERTIME" }; var fo03a = GetEntities(t => t.TEAM_ID == team.ID && t.CHANGE_SHIFT_TIME > filterTime[i], selectFilter); biSafeFinish.FO03_TOTAL = fo03a.Count(); biSafeFinish.FO03_FINISH = fo03a.Count(t => t.SHIFT_STATUS == (int)FOChangeShiftStatusEnum.归档 && t.OVERTIME != FOISOVERTIME.超时); biSafeFinish.FO03_UNFINISH = fo03a.Count(t => t.SHIFT_STATUS < (int)FOChangeShiftStatusEnum.归档); biSafeFinish.FO03_OVERTIME = fo03a.Count(t => t.OVERTIME == FOISOVERTIME.超时); selectFilter.SelectField = new string[] { "ID", "TA_STATUS", "OVERTIME" }; var fo04a = GetEntities(t => t.TEAM_ID == team.ID && t.ACTIVITY_TIME > filterTime[i], selectFilter); biSafeFinish.FO04_TOTAL = fo04a.Count(); biSafeFinish.FO04_FINISH = fo04a.Count(t => t.TA_STATUS == (int)FOTeamActivityState.已归档 && t.OVERTIME != FOISOVERTIME.超时); biSafeFinish.FO04_UNFINISH = fo04a.Count(t => t.TA_STATUS < (int)FOTeamActivityState.已归档); biSafeFinish.FO04_OVERTIME = fo04a.Count(t => t.OVERTIME == FOISOVERTIME.超时); biSafeFinish.ENDTIME = DateTime.Now; biSafeFinish.STARTTIME = filterTime[i]; if (i == 0) { biSafeFinish.FILTER_TIME = FilterTimeType.LastWeek; } else if (i == 1) { biSafeFinish.FILTER_TIME = FilterTimeType.LastMonth; } else if (i == 2) { biSafeFinish.FILTER_TIME = FilterTimeType.LastThreeMonth; } else if (i == 3) { biSafeFinish.FILTER_TIME = FilterTimeType.LastHalfYear; } else if (i == 4) { biSafeFinish.FILTER_TIME = FilterTimeType.LastYear; } else if (i == 5) { biSafeFinish.FILTER_TIME = 0; } biSafeFinishs.Add(biSafeFinish); } } UnifiedCommit(() => { if (biSafeFinishs.Any()) BantchAddEntityNoCommit(biSafeFinishs); }); return true; }); } /// /// 用户登录统计分析 /// /// 用户登录统计分析 /// [HttpPost, Route("updateUserLogin")] public JsonActionResult updateUserLogin([FromBody] KeywordFilter filter) { return SafeExecute(() => { var dtnow = DateTime.Now; if (filter.Parameter1 != null) { dtnow = DateTime.Parse(filter.Parameter1); } //dtnow = dtnow.AddDays(-10); //for (int i = 0; i < 11; i++) //{ //var dtnow1 = dtnow.AddDays(i); DateTime maxDate = dtnow.Date; DateTime minDate = dtnow.AddDays(-3).Date; var allLoginRecord = GetEntities(t => t.CREATE_TIME > minDate && t.CREATE_TIME < maxDate, new BaseFilter(filter.GetOrgId())).Select(t => new { t.USER_ID, ((DateTime)t.CREATE_TIME).Date }); var alldistinctUser = allLoginRecord.Select(t => t.USER_ID).Distinct(); int count = 0; foreach (var user in alldistinctUser) { var d1 = allLoginRecord.Where(t => t.USER_ID == user && t.Date == maxDate.Date.AddDays(-1)); var d2 = allLoginRecord.Where(t => t.USER_ID == user && t.Date == maxDate.Date.AddDays(-2)); var d3 = allLoginRecord.Where(t => t.USER_ID == user && t.Date == maxDate.Date.AddDays(-3)); if (d1.Any() && d2.Any() && d3.Any()) { count++; } } T_BI_ACTIVE_USER_RECORD activeUserCount = new T_BI_ACTIVE_USER_RECORD { COUNT = count, DATE = maxDate.AddDays(-1), ORG_ID = filter.GetOrgId(), type = 0 }; T_BI_ACTIVE_USER_RECORD LoginUserCount = new T_BI_ACTIVE_USER_RECORD { COUNT = allLoginRecord.Where(t => t.Date == maxDate.AddDays(-1)).Distinct(t => t.USER_ID).Count(), DATE = maxDate.AddDays(-1), ORG_ID = filter.GetOrgId(), type = 1 }; UnifiedCommit(() => { DeleteEntityNoCommit(t => t.DATE == maxDate.AddDays(-1)); AddEntityNoCommit(activeUserCount); AddEntityNoCommit(LoginUserCount); }); //} return true; }); } /// /// 定期短信发送 /// /// 定期短信发送 /// [HttpPost, Route("regularSendSMS")] public JsonActionResult regularSendSMS([FromBody] KeywordFilter filter) { return SafeExecute(() => { TencentSendSMS tencentSendSMS = new TencentSendSMS(); string PhoneText = string.Empty; DateTime now = DateTime.Now; if (!string.IsNullOrEmpty(filter.Parameter1)) { PhoneText = filter.Parameter1; } if (PhoneText != string.Empty && PhoneText.Length == 11) { var result2 = tencentSendSMS.sendSMS("2428711", new string[] { PhoneText }, null); var result3 = tencentSendSMS.sendSMS("2428708", new string[] { PhoneText }, null); if (result2.SendStatusSet[0].Code.Equals("Ok")) { var task = GetEntity(filter.Keyword); task.CURR_TASK_START_TIME = now;//上次同步结束时间 task.UPDATE_SUCCES_TIME = now;//上次同步结束时间 task.SYNC_PARAM = "";//清空参数 if (task != null) { UpdateEntityNoCommit(task); } return true; } else { return false; } } else { var allUsers = GetEntities(t => t.ENABLE_STATUS == 0, new BaseFilter(filter.GetOrgId())); var approveUsers = GetEntities(t => t.Nav_Department.DEPARTMENT_TYPE != 2 && t.ENABLE_STATUS == 0, new BaseFilter(filter.GetOrgId())); var userIds = approveUsers.Select(t => t.ID); List sendSMSs = null; if (now.Hour >= 7 && now.Hour < 20) { sendSMSs = GetEntities(t => t.NOTICE_STATUS == 0 && t.TASK_ENDDT >= now && t.CREATE_TIME > now.AddDays(-10) && !t.SOURCE_FORMCODE.Contains("FO005") && t.SENDTIME == DateTime.MinValue, new BaseFilter(filter.GetOrgId())).ToList();//未超期的进行提醒 var sendSMSs2 = sendSMSs.Where(t => t.TASK_ENDDT < now.AddHours(1) && t.TASK_ENDDT > t.TASK_STARTDT); //var listSendID = sendSMSs2.Select(e => e.ID); List listSendID = new List(); List listSend = new List(); foreach (var send in sendSMSs2)//1个小时以内 临超时提醒 { List phoneNumbers = new List(); //List templates = new List(); var user = allUsers.FirstOrDefault(t => t.ID == send.USER_ID); if (user != null && user.PHONE != null) { send.SENDTIME = DateTime.Now; phoneNumbers.Add(user.PHONE); //templates.Add(send.NOTICE_TITLE); //templates.Add(send.TASK_ENDDT.ToString()); var result = tencentSendSMS.sendSMS("2428711", phoneNumbers.ToArray(), null); if (result.SendStatusSet[0].Code.Equals("Ok")) { listSend.Add(send); listSendID.Add(send.ID); //UnifiedCommit(() => //{ // UpdateEntityNoCommit(send); //}); } } } Func exp = t => userIds.Contains(t.USER_ID) && t.CREATE_TIME > now.AddHours(-8); if (listSendID.Count > 0) { exp = t => userIds.Contains(t.USER_ID) && t.CREATE_TIME > now.AddHours(-8) && !listSendID.Contains(t.ID); } var sendSMSs1 = sendSMSs.Where(exp); foreach (var send in sendSMSs1) { List phoneNumbers = new List(); //List templates = new List(); var user = approveUsers.FirstOrDefault(t => t.ID == send.USER_ID); if (user != null && user.PHONE != null) { send.SENDTIME = DateTime.Now; phoneNumbers.Add(user.PHONE); //templates.Add(send.NOTICE_TITLE); //templates.Add(send.TASK_ENDDT.ToString()); //TencentSendSMS tencentSendSMS = new TencentSendSMS(); var result = tencentSendSMS.sendSMS("2428708", phoneNumbers.ToArray(), null); if (result.SendStatusSet[0].Code.Equals("Ok")) { listSend.Add(send); //UnifiedCommit(() => //{ // UpdateEntityNoCommit(send); //}); } } } if (listSend.Count > 0) { UnifiedCommit(() => { BantchUpdateEntityNoCommit(listSend); }); } } } return true; }); } } }