diff --git a/BackendWorkerService/Quartz/Jobs/WeatherAPIJob.cs b/BackendWorkerService/Quartz/Jobs/WeatherAPIJob.cs index 4de16f2..d49c272 100644 --- a/BackendWorkerService/Quartz/Jobs/WeatherAPIJob.cs +++ b/BackendWorkerService/Quartz/Jobs/WeatherAPIJob.cs @@ -19,6 +19,7 @@ using NCrontab; using BackendWorkerService.Services.Implement; using RainApi; using System.Globalization; +using System.Text.RegularExpressions; namespace BackendWorkerService.Quartz.Jobs { @@ -103,7 +104,7 @@ namespace BackendWorkerService.Quartz.Jobs try { await task_Detail.InsertWorkTime("WeatherAPI", "ClearWeatherData", null, new DateTime(DateTime.Now.AddDays(1).Year, DateTime.Now.AddDays(1).Month, DateTime.Now.AddDays(1).Day, 0, 0, 0)); - await ClearWeatherDataBef30(); + await ClearData("api_weateher", 1); await task_Detail.InsertWorkTime_End("WeatherAPI", "ClearWeatherData"); } catch (Exception ex) @@ -212,80 +213,140 @@ namespace BackendWorkerService.Quartz.Jobs { //await task_Detail.InsertWorkTime("WeatherAPI", "api_rain", null, new DateTime(DateTime.Now.AddDays(1).Year, DateTime.Now.AddDays(1).Month, DateTime.Now.AddDays(1).Day, 0, 25, 0)); await task_Detail.InsertWorkTime("WeatherAPI", "api_rain"); + await ClearData("api_rain", 3); WebClient mywebClient = new WebClient(); mywebClient.DownloadFile("https://opendata.cwa.gov.tw/fileapi/v1/opendataapi/W-C0033-003?Authorization=CWB-EA24220B-DDCC-4188-84E5-AD37A0E03F80&downloadType=WEB&format=CAP", @"root/PowerfulRain.xml"); XmlDocument doc = new XmlDocument(); doc.Load("root/PowerfulRain.xml"); var json = JsonConvert.SerializeXmlNode(doc); - var haveinfo = json.Split("info"); - if (haveinfo.Length > 2) - { - var observation = JsonConvert.DeserializeObject(json); - var area = observation.Alert.Info.Area.Where(a => a.Geocode.Value == "63").Select(a => a.AreaDesc).FirstOrDefault(); - var sql = $"select id from api_rain where msgType = '{observation.Alert.MsgType}' and onset = '{observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; - var NeedCallApi = await backendRepository.GetOneAsync(sql); - Dictionary RainAPIdb = new Dictionary() + var observation = JsonConvert.DeserializeObject(json); + var taipeiInfo = observation.Alert.Info + .Where(info => info.Area + .Any(area => area.AreaDesc == "臺北市" || area.AreaDesc == "臺北市信義區")) + //.Any(area => area.Geocode.Value == "63" || area.Geocode.Value == "6300200")) + .FirstOrDefault(); + var result = ""; + + if (taipeiInfo != null) + { + var sql = $"select id from api_rain where msgType = '{observation.Alert.MsgType}' and onset = '{taipeiInfo.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{taipeiInfo.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; + var NeedCallApi = await backendRepository.GetOneAsync(sql); + if (NeedCallApi == 0) + { + var area = taipeiInfo.Area.Where(a => a.AreaDesc == "臺北市" || a.AreaDesc == "臺北市信義區").Select(x => x.AreaDesc).FirstOrDefault(); + var severity_level = taipeiInfo.Parameter + .Where(x => x.ValueName == "severity_level") + .Select(x => x.Value) + .FirstOrDefault(); + + Dictionary RainAPIdb = new Dictionary() { { "@msgType", observation.Alert.MsgType}, - { "@headline", observation.Alert.Info.Headline}, + { "@headline", taipeiInfo.Headline}, + { "@severity_level", severity_level }, { "@areaDesc", area}, - { "@onset", observation.Alert.Info.Onset}, - { "@expires", observation.Alert.Info.Expires}, + { "@onset", taipeiInfo.Onset.ToString("yyyy-MM-dd HH:mm:ss")}, + { "@expires", taipeiInfo.Expires.ToString("yyyy-MM-dd HH:mm:ss")}, { "@created_by", "system"}, { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, }; - var id = await backendRepository.AddOneByCustomTableReturnId(RainAPIdb, "api_rain"); - if (NeedCallApi != 0) - { - var val = RainValue(observation.Alert.MsgType, observation.Alert.Info.Headline); + var id = await backendRepository.AddOneByCustomTableReturnId(RainAPIdb, "api_rain"); + + var val = RainValue(severity_level, taipeiInfo.Headline); if (val < 5) { - var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET1/SeverityLEVL_RAIN/set", val.ToString()); + var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET1/ALMLEVL_RAIN/set", val.ToString()); UpdatedNiagara("api_rain", ReStr, id); - logger.LogInformation($"set niagara rain value success"); + result = ReStr.Contains("err") ? "fail" : "success"; + logger.LogInformation($"set niagara rain value {result}"); } } - - FolderFunction folderFunction = new FolderFunction(); - folderFunction.DeleteFile("root/PowerfulRain.xml"); - await task_Detail.InsertWorkTime_End("WeatherAPI", "api_rain"); } else { - var observation = JsonConvert.DeserializeObject(json); - var area = observation.Alert.Info.Area.Where(a => a.Geocode.Value == "63").Select(a => a.AreaDesc).FirstOrDefault(); - var sql = $"select id from api_rain where msgType = '{observation.Alert.MsgType}' and onset = '{observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; - var NeedCallApi = await backendRepository.GetOneAsync(sql); - - Dictionary RainAPIdb = new Dictionary() - { - { "@msgType", observation.Alert.MsgType}, - { "@headline", observation.Alert.Info.Headline}, - { "@areaDesc", area}, - { "@onset", observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}, - { "@expires", observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}, - { "@created_by", "system"}, - { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, - }; - var id = await backendRepository.AddOneByCustomTableReturnId(RainAPIdb, "api_rain"); - if (NeedCallApi != 0) - { - var val = RainValue(observation.Alert.MsgType, observation.Alert.Info.Headline); - if (val < 5) - { - var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET1/SeverityLEVL_RAIN/set", val.ToString()); - UpdatedNiagara("api_rain", ReStr, id); - logger.LogInformation($"set niagara rain value success"); - } - } - - FolderFunction folderFunction = new FolderFunction(); - folderFunction.DeleteFile("root/PowerfulRain.xml"); - await task_Detail.InsertWorkTime_End("WeatherAPI", "api_rain"); - + // 目前看起來只有全縣市都無警報才會有解除警報的資訊,故若警報中途更新後沒臺北了則應視為解除,table裡的紀錄只留發生跟解除的紀錄 + var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET1/ALMLEVL_RAIN/set", "0"); + result = ReStr.Contains("err") ? "fail" : "success"; + logger.LogInformation($"set niagara rain value {result}"); } + + FolderFunction folderFunction = new FolderFunction(); + folderFunction.DeleteFile(@"root/PowerfulRain.xml"); + await task_Detail.InsertWorkTime_End("WeatherAPI", "api_rain"); + + + //var haveinfo = json.Split("info"); + //var sql = $"select id from api_rain where msgType = '{observation.Alert.MsgType}' and onset = '{observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; + + //if (haveinfo.Length > 2) + //{ + // var observation = JsonConvert.DeserializeObject(json); + // var area = observation.Alert.Info.Area.Where(a => a.Geocode.Value == "63").Select(a => a.AreaDesc).FirstOrDefault(); + // var sql = $"select id from api_rain where msgType = '{observation.Alert.MsgType}' and onset = '{observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; + // var NeedCallApi = await backendRepository.GetOneAsync(sql); + + // Dictionary RainAPIdb = new Dictionary() + // { + // { "@msgType", observation.Alert.MsgType}, + // { "@headline", observation.Alert.Info.Headline}, + // { "@areaDesc", area}, + // { "@onset", observation.Alert.Info.Onset}, + // { "@expires", observation.Alert.Info.Expires}, + // { "@created_by", "system"}, + // { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, + // }; + // var id = await backendRepository.AddOneByCustomTableReturnId(RainAPIdb, "api_rain"); + // if (NeedCallApi != 0) + // { + // var val = RainValue(observation.Alert.MsgType, observation.Alert.Info.Headline); + // if (val < 5) + // { + // var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET1/SeverityLEVL_RAIN/set", val.ToString()); + // UpdatedNiagara("api_rain", ReStr, id); + // logger.LogInformation($"set niagara rain value success"); + // } + // } + + // FolderFunction folderFunction = new FolderFunction(); + // folderFunction.DeleteFile("root/PowerfulRain.xml"); + // await task_Detail.InsertWorkTime_End("WeatherAPI", "api_rain"); + //} + //else + //{ + // var observation = JsonConvert.DeserializeObject(json); + // var area = observation.Alert.Info.Area.Where(a => a.Geocode.Value == "63").Select(a => a.AreaDesc).FirstOrDefault(); + // var sql = $"select id from api_rain where msgType = '{observation.Alert.MsgType}' and onset = '{observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; + // var NeedCallApi = await backendRepository.GetOneAsync(sql); + + // Dictionary RainAPIdb = new Dictionary() + // { + // { "@msgType", observation.Alert.MsgType}, + // { "@headline", observation.Alert.Info.Headline}, + // { "@areaDesc", area}, + // { "@onset", observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}, + // { "@expires", observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}, + // { "@created_by", "system"}, + // { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, + // }; + // var id = await backendRepository.AddOneByCustomTableReturnId(RainAPIdb, "api_rain"); + // if (NeedCallApi != 0) + // { + // var val = RainValue(observation.Alert.MsgType, observation.Alert.Info.Headline); + // if (val < 5) + // { + // var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET1/SeverityLEVL_RAIN/set", val.ToString()); + // UpdatedNiagara("api_rain", ReStr, id); + // logger.LogInformation($"set niagara rain value success"); + // } + // } + + // FolderFunction folderFunction = new FolderFunction(); + // folderFunction.DeleteFile("root/PowerfulRain.xml"); + // await task_Detail.InsertWorkTime_End("WeatherAPI", "api_rain"); + + //} } catch (Exception ex) { @@ -300,83 +361,133 @@ namespace BackendWorkerService.Quartz.Jobs { //await task_Detail.InsertWorkTime("WeatherAPI", "api_typhoon", null, new DateTime(DateTime.Now.AddDays(1).Year, DateTime.Now.AddDays(1).Month, DateTime.Now.AddDays(1).Day, 0, 25, 0)); await task_Detail.InsertWorkTime("WeatherAPI", "api_typhoon"); + await ClearData("api_typhoon", 3); WebClient mywebClient = new WebClient(); mywebClient.DownloadFile("https://opendata.cwa.gov.tw/fileapi/v1/opendataapi/W-C0034-001?Authorization=CWB-EA24220B-DDCC-4188-84E5-AD37A0E03F80&downloadType=WEB&format=CAP", @"root/Typhoon.xml"); XmlDocument doc = new XmlDocument(); - doc.Load("root/Typhoon.xml"); + doc.Load(@"root/Typhoon.xml"); var json = JsonConvert.SerializeXmlNode(doc); - - var haveinfo = json.Split("info"); + var observation = JsonConvert.DeserializeObject(json); + var taipeiInfo = observation.Alert.Info + .Where(info => info.Area + .Any(area => area.AreaDesc == "臺北市")) + .FirstOrDefault(); + var result = ""; - if (haveinfo.Length > 2) + if (taipeiInfo != null) { - var observation = JsonConvert.DeserializeObject(json); - var area = observation.Alert.Info.Area.Where(a => a.Geocode.Value == "63").Select(a => a.AreaDesc).FirstOrDefault(); - var sql = $"select id from api_typhoon where msgType = '{observation.Alert.MsgType}' and onset = '{observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; + var sql = $"select id from api_typhoon where msgType = '{observation.Alert.MsgType}' and onset = '{taipeiInfo.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{taipeiInfo.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; var NeedCallApi = await backendRepository.GetOneAsync(sql); - Dictionary EarthquakeAPIdb = new Dictionary() + if (NeedCallApi == 0) + { + var area = taipeiInfo.Area.Where(a => a.AreaDesc == "臺北市").Select(x => x.AreaDesc).FirstOrDefault(); + + Dictionary EarthquakeAPIdb = new Dictionary() { { "@msgType", observation.Alert.MsgType}, - { "@headline", observation.Alert.Info.Headline}, + { "@headline", taipeiInfo.Headline}, { "@areaDesc", area}, - { "@urgency",observation.Alert.Info.Urgency}, - { "@severity",observation.Alert.Info.Severity}, - { "@onset", observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}, - { "@expires", observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}, + { "@urgency",taipeiInfo.Urgency}, + { "@severity",taipeiInfo.Severity}, + { "@onset", taipeiInfo.Onset.ToString("yyyy-MM-dd HH:mm:ss")}, + { "@expires", taipeiInfo.Expires.ToString("yyyy-MM-dd HH:mm:ss")}, { "@created_by", "system"}, { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, }; - var id = await backendRepository.AddOneByCustomTableReturnId(EarthquakeAPIdb, "api_typhoon"); - if (NeedCallApi != 0) - { - if (observation.Alert.Info.Urgency != null && observation.Alert.Info.Urgency != "Expected") + var id = await backendRepository.AddOneByCustomTableReturnId(EarthquakeAPIdb, "api_typhoon"); + if (taipeiInfo.Urgency != null && taipeiInfo.Urgency != "Expected") { - - var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET2/SeverityLEVL_Typhoon/set", observation.Alert.Info.Urgency); + var val = taipeiInfo.Urgency; + var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET2/ALMLEVL_Typhoon/set", val); UpdatedNiagara("api_typhoon", ReStr, id); - logger.LogInformation($"set niagara typhoon value success"); + result = ReStr.Contains("err") ? "fail" : "success"; + logger.LogInformation($"set niagara typhoon value {result}"); } } - FolderFunction folderFunction = new FolderFunction(); - folderFunction.DeleteFile("root/Typhoon.xml"); - await task_Detail.InsertWorkTime_End("WeatherAPI", "api_typhoon"); } else { - var observation = JsonConvert.DeserializeObject(json); - var area = observation.Alert.Info.Area.Where(a => a.Geocode.Value == "63").Select(a => a.AreaDesc).FirstOrDefault(); - var sql = $"select id from api_typhoon where msgType = '{observation.Alert.MsgType}' and onset = '{observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; - var NeedCallApi = await backendRepository.GetOneAsync(sql); - Dictionary EarthquakeAPIdb = new Dictionary() - { - { "@msgType", observation.Alert.MsgType}, - { "@headline", observation.Alert.Info.Headline}, - { "@areaDesc", area}, - { "@urgency",observation.Alert.Info.Urgency}, - { "@severity",observation.Alert.Info.Severity}, - { "@onset", observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}, - { "@expires", observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}, - { "@created_by", "system"}, - { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, - }; - var id = await backendRepository.AddOneByCustomTableReturnId(EarthquakeAPIdb, "api_typhoon"); - if (NeedCallApi != 0) - { - if (observation.Alert.Info.Urgency != null && observation.Alert.Info.Urgency != "Expected") - { - - var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET2/SeverityLEVL_Typhoon/set", observation.Alert.Info.Urgency); - UpdatedNiagara("api_typhoon", ReStr, id); - logger.LogInformation($"set niagara typhoon value success"); - } - } - FolderFunction folderFunction = new FolderFunction(); - folderFunction.DeleteFile("root/Typhoon.xml"); - await task_Detail.InsertWorkTime_End("WeatherAPI", "api_typhoon"); - + // 目前看起來只有全縣市都無警報才會有解除警報的資訊,故若警報中途更新後沒臺北了則應視為解除,table裡的紀錄只留發生跟解除的紀錄 + var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET2/ALMLEVL_Typhoon/set", "Past"); + result = ReStr.Contains("err") ? "fail" : "success"; + logger.LogInformation($"set niagara typhoon value {result}"); } + FolderFunction folderFunction = new FolderFunction(); + folderFunction.DeleteFile(@"root/Typhoon.xml"); + await task_Detail.InsertWorkTime_End("WeatherAPI", "api_typhoon"); + + //var haveinfo = json.Split("info"); + + //if (haveinfo.Length > 2) + //{ + // var observation = JsonConvert.DeserializeObject(json); + // var area = observation.Alert.Info.Area.Where(a => a.Geocode.Value == "63").Select(a => a.AreaDesc).FirstOrDefault(); + // var sql = $"select id from api_typhoon where msgType = '{observation.Alert.MsgType}' and onset = '{observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; + // var NeedCallApi = await backendRepository.GetOneAsync(sql); + // Dictionary EarthquakeAPIdb = new Dictionary() + // { + // { "@msgType", observation.Alert.MsgType}, + // { "@headline", observation.Alert.Info.Headline}, + // { "@areaDesc", area}, + // { "@urgency",observation.Alert.Info.Urgency}, + // { "@severity",observation.Alert.Info.Severity}, + // { "@onset", observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}, + // { "@expires", observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}, + // { "@created_by", "system"}, + // { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, + // }; + // var id = await backendRepository.AddOneByCustomTableReturnId(EarthquakeAPIdb, "api_typhoon"); + // if (NeedCallApi != 0) + // { + // if (observation.Alert.Info.Urgency != null && observation.Alert.Info.Urgency != "Expected") + // { + + // var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET2/ALMLEVL_Typhoon/set", observation.Alert.Info.Urgency); + // UpdatedNiagara("api_typhoon", ReStr, id); + // logger.LogInformation($"set niagara typhoon value success"); + // } + // } + // FolderFunction folderFunction = new FolderFunction(); + // folderFunction.DeleteFile("root/Typhoon.xml"); + // await task_Detail.InsertWorkTime_End("WeatherAPI", "api_typhoon"); + //} + //else + //{ + // var observation = JsonConvert.DeserializeObject(json); + // var area = observation.Alert.Info.Area.Where(a => a.Geocode.Value == "63").Select(a => a.AreaDesc).FirstOrDefault(); + // var sql = $"select id from api_typhoon where msgType = '{observation.Alert.MsgType}' and onset = '{observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}' and expires = '{observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}'"; + // var NeedCallApi = await backendRepository.GetOneAsync(sql); + // Dictionary EarthquakeAPIdb = new Dictionary() + // { + // { "@msgType", observation.Alert.MsgType}, + // { "@headline", observation.Alert.Info.Headline}, + // { "@areaDesc", area}, + // { "@urgency",observation.Alert.Info.Urgency}, + // { "@severity",observation.Alert.Info.Severity}, + // { "@onset", observation.Alert.Info.Onset.ToString("yyyy-MM-dd HH:mm:ss")}, + // { "@expires", observation.Alert.Info.Expires.ToString("yyyy-MM-dd HH:mm:ss")}, + // { "@created_by", "system"}, + // { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, + // }; + // var id = await backendRepository.AddOneByCustomTableReturnId(EarthquakeAPIdb, "api_typhoon"); + // if (NeedCallApi != 0) + // { + // if (observation.Alert.Info.Urgency != null && observation.Alert.Info.Urgency != "Expected") + // { + + // var ReStr = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_MET2/ALMLEVL_Typhoon/set", observation.Alert.Info.Urgency); + // UpdatedNiagara("api_typhoon", ReStr, id); + // logger.LogInformation($"set niagara typhoon value success"); + // } + // } + // FolderFunction folderFunction = new FolderFunction(); + // folderFunction.DeleteFile("root/Typhoon.xml"); + // await task_Detail.InsertWorkTime_End("WeatherAPI", "api_typhoon"); + + //} + } catch (Exception ex) { @@ -389,11 +500,14 @@ namespace BackendWorkerService.Quartz.Jobs try { await task_Detail.InsertWorkTime("WeatherAPI", "api_earthquake"); + await ClearData("api_earthquake", 3); + var client = new HttpClient(); var UVUri = "https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0015-001?Authorization=CWB-EA24220B-DDCC-4188-84E5-AD37A0E03F80&format=JSON&areaName=%E8%87%BA%E5%8C%97%E5%B8%82"; HttpResponseMessage response = client.GetAsync(UVUri).Result; String jsonUVs = response.Content.ReadAsStringAsync().Result.ToString(); var j = JsonConvert.DeserializeObject(jsonUVs); + var result = ""; var observation = JsonConvert.DeserializeObject(jsonUVs); if (!observation.Success) { @@ -403,89 +517,138 @@ namespace BackendWorkerService.Quartz.Jobs { logger.LogInformation("【WeatherAPIJob】【開始存入地震觀測到資料庫】"); List> EarthquakeAPIdbS = new List>(); - var nowNo = await backendRepository.GetOneAsync("select if( Max(earthquakeNo) is null ,0,Max(earthquakeNo)) earthquakeNo from api_earthquake where newEarthquake = 1"); - foreach (var a in observation.Records.Earthquake) + + var maxEarthquakeNo = observation.Records.Earthquake.Max(eq => eq.EarthquakeNo); + var eq = observation.Records.Earthquake.Where(eq => eq.EarthquakeNo == maxEarthquakeNo).FirstOrDefault(); + var exist = eq.Intensity.ShakingArea.Where(area => area.CountyName == "臺北市").FirstOrDefault(); + if (exist != null) { - if (a.EarthquakeNo <= nowNo) + var sql = $"select id from api_earthquake where earthquakeNo = {eq.EarthquakeNo}"; + var NeedCallApi = await backendRepository.GetOneAsync(sql); + if (NeedCallApi == 0) { Dictionary EarthquakeAPIdb = new Dictionary() - { - { "@earthquakeNo", a.EarthquakeNo}, - { "@newEarthquake", 0}, - { "@originTime", DateTime.Parse(a.EarthquakeInfo.OriginTime.ToString(), System.Globalization.CultureInfo.CurrentCulture)}, - { "@magnitudeValue", a.EarthquakeInfo.EarthquakeMagnitude.MagnitudeValue}, - { "@areaName", null}, - { "@areaIntensity", null}, - { "@created_by", "system"}, - { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, - }; - EarthquakeAPIdbS.Add(EarthquakeAPIdb); - break; - } - else - { - if (a.Intensity.ShakingArea.Count > 0) - { - Dictionary EarthquakeAPIdb = new Dictionary() { - { "@earthquakeNo", a.EarthquakeNo}, + { "@earthquakeNo", eq.EarthquakeNo}, { "@newEarthquake", 1}, - { "@originTime", DateTime.Parse(a.EarthquakeInfo.OriginTime.ToString(), System.Globalization.CultureInfo.CurrentCulture)}, - { "@magnitudeValue", a.EarthquakeInfo.EarthquakeMagnitude.MagnitudeValue}, - { "@areaName", a.Intensity.ShakingArea[0].CountyName}, - { "@areaIntensity", a.Intensity.ShakingArea[0].AreaIntensity}, + { "@originTime", DateTime.Parse(eq.EarthquakeInfo.OriginTime.ToString(), System.Globalization.CultureInfo.CurrentCulture)}, + { "@magnitudeValue", eq.EarthquakeInfo.EarthquakeMagnitude.MagnitudeValue}, + { "@areaName", exist.CountyName}, + { "@areaIntensity", exist.AreaIntensity}, { "@created_by", "system"}, { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, }; - var Nag = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_GEO/SeverityLEVL_LMI/set", a.Intensity.ShakingArea[0].AreaIntensity.ToString()); + var Nag = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_GEO/ALMLEVL_LMI/set", Regex.Match(exist.AreaIntensity, @"\d+").ToString()); - if (Nag.Contains("err")) - { - EarthquakeAPIdb.Add("@niagara", Nag); - logger.LogInformation($"set niagara earthquake value fail: {Nag}"); - } - else - { - EarthquakeAPIdb.Add("@niagara", "success"); - logger.LogInformation($"set niagara earthquake value success"); - } - - - EarthquakeAPIdbS.Add(EarthquakeAPIdb); + if (Nag.Contains("err")) + { + EarthquakeAPIdb.Add("@niagara", Nag); + logger.LogInformation($"set niagara earthquake value fail: {Nag}"); } else { - Dictionary EarthquakeAPIdb = new Dictionary() - { - { "@earthquakeNo", a.EarthquakeNo}, - { "@newEarthquake", 1}, - { "@originTime", DateTime.Parse(a.EarthquakeInfo.OriginTime.ToString(), System.Globalization.CultureInfo.CurrentCulture)}, - { "@magnitudeValue", a.EarthquakeInfo.EarthquakeMagnitude.MagnitudeValue}, - { "@areaName", null}, - { "@areaIntensity", null}, - { "@created_by", "system"}, - { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, - }; - - var Nag = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_GEO/SeverityLEVL_LMI/set", "NULL"); - if (Nag.Contains("err")) - { - EarthquakeAPIdb.Add("@niagara", Nag); - logger.LogInformation($"set niagara earthquake value fail: {Nag}"); - } - else - { - EarthquakeAPIdb.Add("@niagara", "success"); - logger.LogInformation($"set niagara earthquake value success"); - } - EarthquakeAPIdbS.Add(EarthquakeAPIdb); + EarthquakeAPIdb.Add("@niagara", "success"); + logger.LogInformation($"set niagara earthquake value success"); } + + EarthquakeAPIdbS.Add(EarthquakeAPIdb); } } + else + { + var Nag = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_GEO/ALMLEVL_LMI/set", "0"); + result = Nag.Contains("err") ? "fail" : "success"; + logger.LogInformation($"set niagara earthquake value {result}"); + } + + //var nowNo = await backendRepository.GetOneAsync("select if( Max(earthquakeNo) is null ,0,Max(earthquakeNo)) earthquakeNo from api_earthquake where newEarthquake = 1"); + //foreach (var a in observation.Records.Earthquake) + //{ + // if (a.EarthquakeNo <= nowNo) + // { + // Dictionary EarthquakeAPIdb = new Dictionary() + // { + // { "@earthquakeNo", a.EarthquakeNo}, + // { "@newEarthquake", 0}, + // { "@originTime", DateTime.Parse(a.EarthquakeInfo.OriginTime.ToString(), System.Globalization.CultureInfo.CurrentCulture)}, + // { "@magnitudeValue", a.EarthquakeInfo.EarthquakeMagnitude.MagnitudeValue}, + // { "@areaName", null}, + // { "@areaIntensity", null}, + // { "@created_by", "system"}, + // { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, + // }; + // EarthquakeAPIdbS.Add(EarthquakeAPIdb); + // break; + // } + // else + // { + // if (a.Intensity.ShakingArea.Count > 0) + // { + // Dictionary EarthquakeAPIdb = new Dictionary() + // { + // { "@earthquakeNo", a.EarthquakeNo}, + // { "@newEarthquake", 1}, + // { "@originTime", DateTime.Parse(a.EarthquakeInfo.OriginTime.ToString(), System.Globalization.CultureInfo.CurrentCulture)}, + // { "@magnitudeValue", a.EarthquakeInfo.EarthquakeMagnitude.MagnitudeValue}, + // { "@areaName", a.Intensity.ShakingArea[0].CountyName}, + // { "@areaIntensity", a.Intensity.ShakingArea[0].AreaIntensity}, + // { "@created_by", "system"}, + // { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, + // }; + + + // var Nag = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_GEO/ALMLEVL_LMI/set", a.Intensity.ShakingArea[0].AreaIntensity.ToString()); + + // if (Nag.Contains("err")) + // { + // EarthquakeAPIdb.Add("@niagara", Nag); + // logger.LogInformation($"set niagara earthquake value fail: {Nag}"); + // } + // else + // { + // EarthquakeAPIdb.Add("@niagara", "success"); + // logger.LogInformation($"set niagara earthquake value success"); + // } + + + // EarthquakeAPIdbS.Add(EarthquakeAPIdb); + // } + // else + // { + // Dictionary EarthquakeAPIdb = new Dictionary() + // { + // { "@earthquakeNo", a.EarthquakeNo}, + // { "@newEarthquake", 1}, + // { "@originTime", DateTime.Parse(a.EarthquakeInfo.OriginTime.ToString(), System.Globalization.CultureInfo.CurrentCulture)}, + // { "@magnitudeValue", a.EarthquakeInfo.EarthquakeMagnitude.MagnitudeValue}, + // { "@areaName", null}, + // { "@areaIntensity", null}, + // { "@created_by", "system"}, + // { "@created_at", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}, + // }; + + // var Nag = Fetch_PostWithJSONFormat($@"{obixApiConfig.ApiBase}obix/config/Arena/D2/CWB/L110/CAP/D2_CWB_L110_CAP_GEO/ALMLEVL_LMI/set", "NULL"); + // if (Nag.Contains("err")) + // { + // EarthquakeAPIdb.Add("@niagara", Nag); + // logger.LogInformation($"set niagara earthquake value fail: {Nag}"); + // } + // else + // { + // EarthquakeAPIdb.Add("@niagara", "success"); + // logger.LogInformation($"set niagara earthquake value success"); + // } + // EarthquakeAPIdbS.Add(EarthquakeAPIdb); + // } + // } + //} EarthquakeAPIdbS.Reverse(); - await backendRepository.AddMutiByCustomTable(EarthquakeAPIdbS, "api_earthquake"); + if (EarthquakeAPIdbS.Count != 0) + { + await backendRepository.AddMutiByCustomTable(EarthquakeAPIdbS, "api_earthquake"); + } } await task_Detail.InsertWorkTime_End("WeatherAPI", "api_earthquake"); } @@ -540,31 +703,30 @@ namespace BackendWorkerService.Quartz.Jobs } } - public int RainValue(string Ty, string Headline) + public int RainValue(string severity_level, string Headline) { var rint = 5; - if (Ty == "") + if (severity_level == null) { return 0; - } else { if (Headline.Contains("解除")) rint = 0; - else if (Headline.Contains("大雨")) + else if (severity_level.Contains("大雨")) { rint = 1; } - else if (Headline.Contains("豪雨")) + else if (severity_level.Contains("豪雨")) { rint = 2; } - else if (Headline.Contains("大豪雨")) + else if (severity_level.Contains("大豪雨")) { rint = 3; } - else if (Headline.Contains("超大豪雨")) + else if (severity_level.Contains("超大豪雨")) { rint = 4; } @@ -595,16 +757,16 @@ namespace BackendWorkerService.Quartz.Jobs } } - public async Task ClearWeatherDataBef30() + public async Task ClearData(string tableName, int monthNumber) { try { - string sql = $"delete from api_weateher WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 MONTH)"; + string sql = $@"delete from {tableName} WHERE created_at < DATE_SUB(NOW(), INTERVAL {monthNumber} MONTH)"; await backgroundServiceRepository.ExecuteSql(sql); } catch (Exception e) { - logger.LogError("[ClearWether] clear wether data error"); + logger.LogError($"[ClearData] clear {tableName} data error"); throw e; } } diff --git a/BackendWorkerService/Services/Implement/RainApi.cs b/BackendWorkerService/Services/Implement/RainApi.cs index a161026..4c4bb29 100644 --- a/BackendWorkerService/Services/Implement/RainApi.cs +++ b/BackendWorkerService/Services/Implement/RainApi.cs @@ -18,6 +18,7 @@ namespace RainApi using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; + using Newtonsoft.Json.Linq; public partial class Welcome { @@ -35,7 +36,10 @@ namespace RainApi public string MsgType { get; set; } public string Scope { get; set; } public string References { get; set; } - public Info Info { get; set; } + + //此標籤為將資料統一轉成陣列,因氣象局資料會根據狀況傳回單個物件或陣列,會導致解析失敗 + [JsonConverter(typeof(SingleOrArrayConverter))] + public List Info { get; set; } } public partial class Info @@ -55,7 +59,10 @@ namespace RainApi public string Description { get; set; } public string Instruction { get; set; } public Uri Web { get; set; } - public EventCode Parameter { get; set; } + + //此標籤為將資料統一轉成陣列,因氣象局資料會根據狀況傳回單個物件或陣列,會導致解析失敗 + [JsonConverter(typeof(SingleOrArrayConverter))] + public List Parameter { get; set; } public List Area { get; set; } } @@ -78,4 +85,44 @@ namespace RainApi } public enum ValueName { AlertTitle, ProfileCapTwpEvent10, TaiwanGeocode103 }; + + //此標籤為將資料統一轉成陣列,因氣象局資料會根據狀況傳回單個物件或陣列,會導致解析失敗 + public class SingleOrArrayConverter : JsonConverter + { + // 判斷是否可以轉換該類型,這裡只處理 List 類型 + public override bool CanConvert(Type objectType) + { + return (objectType == typeof(List)); + } + + // 讀取 JSON 並轉換成對應的物件 + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + var token = JToken.Load(reader); // 讀取 JSON 標記 + if (token.Type == JTokenType.Array) // 如果是陣列 + { + return token.ToObject>(); // 轉換成 List + } + else // 如果不是陣列 + { + return new List { token.ToObject() }; // 包裝成單一物件的 List + } + } + + // 將物件寫入 JSON + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + var list = value as List; // 將值轉換成 List + if (list.Count == 1) // 如果列表中只有一個元素 + { + serializer.Serialize(writer, list[0]); // 直接序列化該元素 + } + else // 如果列表中有多個元素 + { + serializer.Serialize(writer, list); // 序列化整個列表 + } + } + } + + } diff --git a/BackendWorkerService/Services/Implement/TyphoonApi.cs b/BackendWorkerService/Services/Implement/TyphoonApi.cs index 4ff2f3a..d3644b8 100644 --- a/BackendWorkerService/Services/Implement/TyphoonApi.cs +++ b/BackendWorkerService/Services/Implement/TyphoonApi.cs @@ -18,6 +18,7 @@ namespace TyphoonApi using System.Globalization; using Newtonsoft.Json; using Newtonsoft.Json.Converters; + using RainApi; public partial class Welcome { @@ -35,7 +36,10 @@ namespace TyphoonApi public string MsgType { get; set; } public string Scope { get; set; } public string References { get; set; } - public Info Info { get; set; } + + //此標籤為將資料統一轉成陣列,因氣象局資料會根據狀況傳回單個物件或陣列,會導致解析失敗 + [JsonConverter(typeof(SingleOrArrayConverter))] + public List Info { get; set; } } public partial class Info @@ -55,7 +59,10 @@ namespace TyphoonApi public Description Description { get; set; } public object Instruction { get; set; } public Uri Web { get; set; } - public EventCode Parameter { get; set; } + + //此標籤為將資料統一轉成陣列,因氣象局資料會根據狀況傳回單個物件或陣列,會導致解析失敗 + [JsonConverter(typeof(SingleOrArrayConverter))] + public List Parameter { get; set; } public List Area { get; set; } } diff --git a/FrontendWebApi/Views/Shared/_Layout.cshtml b/FrontendWebApi/Views/Shared/_Layout.cshtml index 1ea443c..2cd4865 100644 --- a/FrontendWebApi/Views/Shared/_Layout.cshtml +++ b/FrontendWebApi/Views/Shared/_Layout.cshtml @@ -923,24 +923,32 @@
- - + +
- - + +
- - + +
- - + +
- - + + +
+
+ + +
+
+ +
@@ -1041,6 +1049,8 @@ function onEqRadioChange(e) { let eqDecDict = { + 1: "微震。", + 2: "電燈等懸掛物有小搖晃。", 3: "房屋震動,碗盤門窗發出聲音,懸掛物搖擺。", 4: "房屋搖動甚烈,少數未固定物品可能傾倒掉落,少數傢俱移動,可能有輕微災害。", 5: "部分未固定物品傾倒掉落,少數傢俱可能移動或翻倒,少數門窗可能變形,部分牆壁產生裂痕。", @@ -1083,6 +1093,8 @@ $("#rainDesc").text(rainDecDict[rainValue] || ""); let eqDecDict = { + 1: "微震。", + 2: "電燈等懸掛物有小搖晃。", 3: "房屋震動,碗盤門窗發出聲音,懸掛物搖擺。", 4: "房屋搖動甚烈,少數未固定物品可能傾倒掉落,少數傢俱移動,可能有輕微災害。", 5: "部分未固定物品傾倒掉落,少數傢俱可能移動或翻倒,少數門窗可能變形,部分牆壁產生裂痕。",