[緊急應變] 警戒值設定 表單前端介面及程序建置 | 後端程序建置 | obix config api 測試及介接
This commit is contained in:
parent
d08754f8f6
commit
d12dbc35b6
200
FrontendWebApi/ApiControllers/WarningValueController.cs
Normal file
200
FrontendWebApi/ApiControllers/WarningValueController.cs
Normal file
@ -0,0 +1,200 @@
|
||||
using FrontendWebApi.Models;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using NPOI.SS.UserModel;
|
||||
using NPOI.XSSF.UserModel;
|
||||
using Repository.BackendRepository.Implement;
|
||||
using Repository.FrontendRepository.Interface;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Security.Policy;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
using Ubiety.Dns.Core;
|
||||
|
||||
namespace FrontendWebApi.ApiControllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 告警紀錄
|
||||
/// </summary>
|
||||
public class WarningValueController : MyBaseApiController<WarningValueController>
|
||||
{
|
||||
private readonly IFrontendRepository frontendRepository;
|
||||
|
||||
public WarningValueController
|
||||
(
|
||||
IFrontendRepository frontendRepository
|
||||
)
|
||||
{
|
||||
this.frontendRepository = frontendRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取得警戒值
|
||||
/// </summary>
|
||||
/// <param name="post"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[Route("api/WarningValue/GetWarningValue")]
|
||||
public async Task<ActionResult<ApiResult<List<WarningValueOutput>>>> GetWarningValue()
|
||||
{
|
||||
ApiResult<List<WarningValueOutput>> apiResult = new ApiResult<List<WarningValueOutput>>(jwt_str);
|
||||
if (!jwtlife)
|
||||
{
|
||||
apiResult.Code = "5000";
|
||||
return BadRequest(apiResult);
|
||||
}
|
||||
try
|
||||
{
|
||||
List<string> typeNames = Enum.GetNames(typeof(WarningValueType)).ToList();
|
||||
apiResult.Data = new List<WarningValueOutput>();
|
||||
var sqlString = $@"SELECT system_value FROM variable WHERE system_type = 'obixConfig' AND system_key = 'ApiBase' AND deleted = 0";
|
||||
string baseApiUrl = await frontendRepository.GetOneAsync<string>(sqlString);
|
||||
|
||||
if (string.IsNullOrEmpty(baseApiUrl))
|
||||
{
|
||||
apiResult.Code = "9998";
|
||||
apiResult.Msg = "未找到 obixConfig baseAPI,請聯絡管理者。";
|
||||
return BadRequest(apiResult);
|
||||
}
|
||||
|
||||
foreach (var typeName in typeNames) {
|
||||
WarningValueOutput result = new WarningValueOutput();
|
||||
result.type = Enum.Parse<WarningValueType>(typeName);
|
||||
|
||||
sqlString = @$"SELECT system_value FROM variable WHERE system_type = 'warningValueApi' AND system_key = @type AND deleted = 0";
|
||||
string apiUrl = await frontendRepository.GetOneAsync<string>(sqlString, new { type = $"get{typeName}" });
|
||||
|
||||
if (string.IsNullOrEmpty(apiUrl))
|
||||
{
|
||||
apiResult.Code = "9998";
|
||||
apiResult.Msg = "未找到天氣警戒值 obix API,請聯絡管理者。";
|
||||
return BadRequest(apiResult);
|
||||
}
|
||||
|
||||
using (HttpClient client = new HttpClient())
|
||||
{
|
||||
apiUrl = Path.Combine(baseApiUrl, "obix/config/", apiUrl);
|
||||
string username = "stanGG";
|
||||
string password = "St12345678";
|
||||
string encoded = Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
|
||||
|
||||
client.DefaultRequestHeaders.Add("Authorization", "Basic " + encoded);
|
||||
|
||||
var response = await client.GetAsync(apiUrl);
|
||||
var resString = (await response.Content.ReadAsStringAsync()).ToString();
|
||||
|
||||
XDocument xmlDoc = XDocument.Parse(resString);
|
||||
|
||||
Logger.LogError("【" + controllerName + "/" + actionName + "】" + JsonConvert.SerializeXNode(xmlDoc));
|
||||
if (xmlDoc?.Root?.Name?.LocalName == "str")
|
||||
{
|
||||
result.targetValue = xmlDoc.Root.Attribute("val").Value;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
apiResult.Data.Add(result);
|
||||
}
|
||||
|
||||
apiResult.Msg = "讀取成功";
|
||||
apiResult.Code = "0000";
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
apiResult.Code = "9999";
|
||||
apiResult.Msg = "系統內部錯誤,請聯絡管理者。";
|
||||
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
|
||||
return Ok(apiResult);
|
||||
}
|
||||
return Ok(apiResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 取得警戒值
|
||||
/// </summary>
|
||||
/// <param name="post"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[Route("api/WarningValue/SetWarningValue")]
|
||||
public async Task<ActionResult<ApiResult<string>>> SetWarningValue(List<WarningValueInput> wvs)
|
||||
{
|
||||
ApiResult<string> apiResult = new ApiResult<string>(jwt_str);
|
||||
if (!jwtlife)
|
||||
{
|
||||
apiResult.Code = "5000";
|
||||
return BadRequest(apiResult);
|
||||
}
|
||||
try
|
||||
{
|
||||
var sqlString = $@"SELECT system_value FROM variable WHERE system_type = 'obixConfig' AND system_key = 'ApiBase' AND deleted = 0";
|
||||
string baseApiUrl = await frontendRepository.GetOneAsync<string>(sqlString);
|
||||
|
||||
if (string.IsNullOrEmpty(baseApiUrl))
|
||||
{
|
||||
apiResult.Code = "9998";
|
||||
apiResult.Msg = "未找到 obixConfig baseAPI,請聯絡管理者。";
|
||||
return BadRequest(apiResult);
|
||||
}
|
||||
|
||||
foreach (var wv in wvs) {
|
||||
string typeName = wv.type.ToString();
|
||||
sqlString = @$"SELECT system_value FROM variable WHERE system_type = 'warningValueApi' AND system_key = @type AND deleted = 0";
|
||||
string apiUrl = await frontendRepository.GetOneAsync<string>(sqlString, new { type = $"set{typeName}" });
|
||||
|
||||
if (string.IsNullOrEmpty(wv.targetValue)) {
|
||||
apiResult.Code = "9998";
|
||||
apiResult.Msg = "請輸入欲設定警戒值";
|
||||
return BadRequest(apiResult);
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(apiUrl))
|
||||
{
|
||||
apiResult.Code = "9998";
|
||||
apiResult.Msg = "未找到天氣警戒值 obix API,請聯絡管理者。";
|
||||
return BadRequest(apiResult);
|
||||
}
|
||||
|
||||
using (HttpClient client = new HttpClient())
|
||||
{
|
||||
apiUrl = Path.Combine(baseApiUrl, "obix/config/", apiUrl);
|
||||
string username = "stanGG";
|
||||
string password = "St12345678";
|
||||
string encoded = Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
|
||||
|
||||
client.DefaultRequestHeaders.Add("Authorization", "Basic " + encoded);
|
||||
// 建構 XML 數據
|
||||
string xmlData = @$"<real val='{wv.targetValue}' />";
|
||||
HttpContent content = new StringContent(xmlData, Encoding.UTF8, "application/xml");
|
||||
|
||||
var response = await client.PostAsync(apiUrl, content);
|
||||
var resString = (await response.Content.ReadAsStringAsync()).ToString();
|
||||
|
||||
|
||||
apiResult.Data = resString;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
apiResult.Msg = "設定成功";
|
||||
apiResult.Code = "0000";
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
apiResult.Code = "9999";
|
||||
apiResult.Msg = "系統內部錯誤,請聯絡管理者。";
|
||||
Logger.LogError("【" + controllerName + "/" + actionName + "】" + exception.Message);
|
||||
return Ok(apiResult);
|
||||
}
|
||||
return Ok(apiResult);
|
||||
}
|
||||
}
|
||||
}
|
27
FrontendWebApi/Models/WarningValue.cs
Normal file
27
FrontendWebApi/Models/WarningValue.cs
Normal file
@ -0,0 +1,27 @@
|
||||
using NPOI.Util;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace FrontendWebApi.Models
|
||||
{
|
||||
public enum WarningValueType {
|
||||
Rain, //降雨
|
||||
Earthquake //地震
|
||||
}
|
||||
|
||||
public class WarningValueInput {
|
||||
public WarningValueType type { get; set; }
|
||||
|
||||
public string targetValue { get; set; }
|
||||
}
|
||||
public class WarningValueOutput {
|
||||
public WarningValueType type { get; set; }
|
||||
|
||||
public string targetValue { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -170,11 +170,11 @@ namespace FrontendWebApi
|
||||
app.UseAuthentication();
|
||||
app.UseAuthorization();
|
||||
|
||||
app.Use(async (context, next) =>
|
||||
{
|
||||
context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
|
||||
await next();
|
||||
});
|
||||
//app.Use(async (context, next) =>
|
||||
//{
|
||||
// context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
|
||||
// await next();
|
||||
//});
|
||||
|
||||
//app.UseEndpoints(endpoints =>
|
||||
//{
|
||||
|
@ -17,7 +17,8 @@
|
||||
<!-- SweetAlert -->
|
||||
<link rel="stylesheet" media="screen, print" href="~/css/notifications/sweetalert2/sweetalert2.bundle.css">
|
||||
<link rel="stylesheet" media="screen, print" href="~/css/notifications/toastr/toastr.css">
|
||||
|
||||
<link href="~/js/font-awesome/fontawesome.min.css" rel="stylesheet" />
|
||||
<link href="~/js/font-awesome/solid.min.css" rel="stylesheet" />
|
||||
<!--Select2-->
|
||||
<link rel="stylesheet" media="screen, print" href="~/css/formplugins/select2/select2.bundle.css" />
|
||||
|
||||
@ -852,10 +853,79 @@
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<iframe id="warningValueIframe" src="@ViewBag.WarningValuePxPath" style="width:100%;height:100%;"></iframe>
|
||||
<table class="table warning-value-table">
|
||||
<tbody>
|
||||
<tr class="disaster-title-bar">
|
||||
<td rowspan="3" class="disaster-icon"><i class="fa-solid fa-cloud-showers-heavy"></i></td>
|
||||
<td class="disaster-title">降雨警戒設定值</td>
|
||||
<td class="disaster-value" id="rainCurName">大雨</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
<td colspan="2">
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="rainRadio" id="rain1" value="1">
|
||||
<label class="form-check-label" for="rain1">大雨</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="rainRadio" id="rain2" value="2">
|
||||
<label class="form-check-label" for="rain2">豪雨</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="rainRadio" id="rain3" value="3">
|
||||
<label class="form-check-label" for="rain3">大豪雨</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="rainRadio" id="rain4" value="4">
|
||||
<label class="form-check-label" for="rain4">超大豪雨</label>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
<td colspan="2">24小時累積雨量達80毫米以上,或時雨量達40毫米以上之降雨現象</td>
|
||||
</tr>
|
||||
<tr class="disaster-title-bar">
|
||||
<td rowspan="3" class="disaster-icon"><i class="fa-solid fa-house-chimney-crack"></i></td>
|
||||
<td class="disaster-title">地震警戒設定值</td>
|
||||
<td class="disaster-value" id="eqCurName">7級</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="eqRadio" id="eq1" value="3">
|
||||
<label class="form-check-label" for="inlineRadio1">3級</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="eqRadio" id="eq2" value="4">
|
||||
<label class="form-check-label" for="eq2">4級</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="eqRadio" id="eq3" value="5">
|
||||
<label class="form-check-label" for="eq3">5級</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="eqRadio" id="eq4" value="6">
|
||||
<label class="form-check-label" for="eq4">6級</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="radio" name="eqRadio" id="eq5" value="7">
|
||||
<label class="form-check-label" for="eq5">7級</label>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
<td colspan="2">24小時累積雨量達80毫米以上,或時雨量達40毫米以上之降雨現象</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
|
||||
<button type="button" class="btn btn-primary btn-save" onclick="setWarningValue()">儲存</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -874,6 +944,8 @@
|
||||
<script src="~/js/notifications/toastr/toastr.js"></script>
|
||||
<!--Toast-->
|
||||
<script src="~/js/toast.js"></script>
|
||||
<script src="~/js/font-awesome/fontawesome.min.js"></script>
|
||||
<script src="~/js/font-awesome/solid.min.js"></script>
|
||||
<!-- Select2 JS -->
|
||||
<script src="~/js/formplugins/select2/select2.bundle.js"></script>
|
||||
<!-- table2excel -->
|
||||
@ -907,6 +979,66 @@
|
||||
$("body").on("shown.bs.modal","#warning-value-modal",function() {
|
||||
$("#warningValueIframe").attr("src","@ViewBag.WarningValuePxPath");
|
||||
});
|
||||
|
||||
$("body").on("show.bs.modal","#warning-value-modal",getWarningValue);
|
||||
|
||||
function getWarningValue(){
|
||||
let url = "api/WarningValue/GetWarningValue";
|
||||
|
||||
$.post(url, {}, function (rel) {
|
||||
if (rel.code != "0000") {
|
||||
if (rel.code == "9999") {
|
||||
toast_error(rel.msg);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else {
|
||||
if(rel.data){
|
||||
let eqValue = rel.data.filter(d => d.type == 1).map(d => d.targetValue)[0];
|
||||
let rainValue = rel.data.filter(d => d.type == 0).map(d => d.targetValue)[0];
|
||||
|
||||
$(`input[name=rainRadio][value=${rainValue}]`).prop("checked",true);
|
||||
$(`input[name=eqRadio][value=${eqValue}]`).prop("checked",true);
|
||||
$("#rainCurName").text($(`input[name=rainRadio][value=${rainValue}]`).next("label").text());
|
||||
$("#eqCurName").text($(`input[name=eqRadio][value=${eqValue}]`).next("label").text());
|
||||
}
|
||||
|
||||
}
|
||||
}, 'json');
|
||||
}
|
||||
|
||||
function setWarningValue(){
|
||||
let eqValue = $("input[name=eqRadio]:checked").val();
|
||||
let rainValue = $("input[name=rainRadio]:checked").val();
|
||||
|
||||
if(!eqValue || !rainValue){
|
||||
toast_error("請輸入警戒值");
|
||||
return;
|
||||
}
|
||||
|
||||
let sendData = {wvs:
|
||||
[
|
||||
{type:0,targetValue:rainValue},
|
||||
{type:1,targetValue:eqValue}
|
||||
]
|
||||
};
|
||||
|
||||
let url = "api/WarningValue/SetWarningValue";
|
||||
|
||||
$.post(url, sendData, function (rel) {
|
||||
if (rel.code != "0000") {
|
||||
toast_error(rel.msg);
|
||||
return;
|
||||
}
|
||||
else {
|
||||
toast_ok(rel.msg);
|
||||
$("#warning-value-modal").modal("hide");
|
||||
}
|
||||
}, 'json');
|
||||
|
||||
|
||||
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
@ -38,3 +38,29 @@ label.error {
|
||||
.highcharts-credits {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.warning-value-table td {
|
||||
vertical-align:middle;
|
||||
}
|
||||
|
||||
td.disaster-icon svg {
|
||||
font-size:2rem;
|
||||
color:#8d567f;
|
||||
}
|
||||
td.disaster-icon {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
tr.disaster-title-bar {
|
||||
background: var(--theme-danger-50);
|
||||
}
|
||||
td.disaster-title {
|
||||
font-weight: 700;
|
||||
font-size: 1rem;
|
||||
}
|
||||
td.disaster-value {
|
||||
color: #e23a3a;
|
||||
font-weight: 700;
|
||||
font-size: 1rem;
|
||||
}
|
9
FrontendWebApi/wwwroot/js/font-awesome/fontawesome.min.css
vendored
Normal file
9
FrontendWebApi/wwwroot/js/font-awesome/fontawesome.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6
FrontendWebApi/wwwroot/js/font-awesome/fontawesome.min.js
vendored
Normal file
6
FrontendWebApi/wwwroot/js/font-awesome/fontawesome.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
FrontendWebApi/wwwroot/js/font-awesome/solid.min.css
vendored
Normal file
6
FrontendWebApi/wwwroot/js/font-awesome/solid.min.css
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}
|
6
FrontendWebApi/wwwroot/js/font-awesome/solid.min.js
vendored
Normal file
6
FrontendWebApi/wwwroot/js/font-awesome/solid.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user