2022-10-14 16:08:54 +08:00
using FrontendWebApi.Models ;
using Microsoft.AspNetCore.Http ;
using Microsoft.AspNetCore.Mvc ;
2022-11-17 18:25:40 +08:00
using Microsoft.CodeAnalysis.CSharp ;
2022-10-14 16:08:54 +08:00
using Microsoft.Extensions.Logging ;
using Newtonsoft.Json ;
using Newtonsoft.Json.Linq ;
using Repository.BackendRepository.Interface ;
using Repository.FrontendRepository.Interface ;
using System ;
using System.Collections.Generic ;
using System.Collections.Specialized ;
2023-03-13 15:26:34 +08:00
using System.Data.SqlTypes ;
2022-10-14 16:08:54 +08:00
using System.Diagnostics ;
using System.IO ;
using System.Linq ;
using System.Net ;
using System.Text ;
using System.Threading.Tasks ;
namespace FrontendWebApi.ApiControllers
{
public class DeviceManageController : MyBaseApiController < DeviceManageController >
{
private readonly IBackendRepository backendRepository ;
private readonly IFrontendRepository frontendRepository ;
2022-11-17 18:25:40 +08:00
private string deviceKindFilePath = "upload/device_icon/" ;
2022-10-14 16:08:54 +08:00
public DeviceManageController
(
IBackendRepository backendRepository ,
IFrontendRepository frontendRepository
)
{
this . backendRepository = backendRepository ;
this . frontendRepository = frontendRepository ;
}
2022-11-15 17:36:23 +08:00
/// <summary>
/// 系統監控列表
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
2022-10-14 16:08:54 +08:00
[HttpPost]
2022-11-15 17:36:23 +08:00
[Route("api/Device/GetMainSub")]
2022-11-18 17:40:43 +08:00
public async Task < ActionResult < ApiResult < History_MainSubBuildFloor > > > GetMainSub ( [ FromBody ] FindDevice fd )
2022-10-14 16:08:54 +08:00
{
2022-11-15 17:36:23 +08:00
ApiResult < History_MainSubBuildFloor > apiResult = new ApiResult < History_MainSubBuildFloor > ( jwt_str ) ;
2022-10-14 16:08:54 +08:00
if ( ! jwtlife )
{
apiResult . Code = "5000" ;
return BadRequest ( apiResult ) ;
}
2022-11-18 17:40:43 +08:00
else if ( string . IsNullOrEmpty ( fd . building_tag ) )
{
apiResult . Code = "0002" ;
apiResult . Msg = "必須選擇東別" ;
return apiResult ;
}
2022-10-14 16:08:54 +08:00
try
{
2022-11-15 17:36:23 +08:00
var dbsub = await frontendRepository . GetAllAsync < HistoryDBMainSub > (
2022-11-18 17:40:43 +08:00
@ $ "select distinct v1.system_key main_name, v1.system_value main_system_tag, v2.system_key sub_name, v2.system_value sub_system_tag, v1.system_priority, v2.system_priority,
2023-01-05 18:37:12 +08:00
dk . device_normal_color , dk . device_close_color , dk . device_error_color , dk . device_normal_flashing , dk . device_close_flashing , dk . device_error_flashing ,
dk . device_normal_text , dk . device_close_text , dk . device_error_text , dk . device_normal_point_name , dk . device_close_point_name , dk . device_error_point_name ,
dk . device_normal_point_value , dk . device_close_point_value , dk . device_error_point_value
2022-11-22 11:02:51 +08:00
- - di . full_name as device_item_name , di . points as device_item_points , di . unit as device_item_unit , di . is_show_riserDiagram as device_item_is_show_riserDiagram ,
- - di . is_controll as device_item_is_controll , di . is_bool as device_item_is_bool , di . is_link as device_item_is_link
2022-11-15 17:36:23 +08:00
from role_auth a
join auth_page b on a . AuthCode = b . AuthCode
join userinfo c on c . role_guid = a . role_guid
join variable v2 on b . ShowView = v2 . id and v2 . system_type = @sub_system_type
join variable v1 on v1 . id = v2 . system_parent_id and v1 . system_type = @main_system_type
2022-12-22 17:18:29 +08:00
join device d on v1 . system_value = d . device_system_tag and v2 . system_value = d . device_name_tag and d . deleted = 0
2022-11-18 17:40:43 +08:00
left join device_kind dk on v1 . system_value = dk . device_system_tag and v2 . system_value = dk . device_name_tag and dk . device_building_tag = @building_tag
2022-11-22 11:02:51 +08:00
- - left join device_item di on v2 . system_value = di . device_name_tag and v1 . system_value = di . device_system_tag and di . deleted = 0
2022-12-22 17:18:29 +08:00
join (
2023-03-02 11:36:47 +08:00
select distinct main_system_tag , sub_system_tag from building_menu where building_tag = @building_tag and is_link = 1
2022-12-22 17:18:29 +08:00
) as bm on v2 . system_value = bm . sub_system_tag and v1 . system_value = bm . main_system_tag
2022-11-15 17:36:23 +08:00
where c . account = @account
2023-01-31 15:45:38 +08:00
order by v2 . system_priority ", new { @account = myUser.account, @sub_system_type = sub_system_type, @main_system_type = main_system_type, @building_tag = fd.building_tag });
2022-11-15 17:36:23 +08:00
var mains = dbsub . GroupBy ( a = > a . main_system_tag ) . ToList ( ) ;
apiResult . Data = new History_MainSubBuildFloor ( ) ;
apiResult . Data . history_Main_Systems = new List < History_Main_system > ( ) ;
2022-11-17 15:57:47 +08:00
2022-11-15 17:36:23 +08:00
foreach ( var main in mains )
2022-10-14 16:08:54 +08:00
{
2022-11-15 17:36:23 +08:00
History_Main_system history_Main_System = new History_Main_system ( ) ;
history_Main_System . main_system_tag = main . Select ( a = > a . main_system_tag ) . FirstOrDefault ( ) ;
history_Main_System . full_name = main . Select ( a = > a . main_name ) . FirstOrDefault ( ) ;
2022-11-17 15:57:47 +08:00
history_Main_System . History_Sub_systems = new List < History_Sub_system > ( ) ;
var subs = dbsub . Where ( x = > x . main_system_tag = = main . Select ( m = > m . main_system_tag ) . FirstOrDefault ( ) ) . ToList ( ) ;
2023-01-05 18:37:12 +08:00
foreach ( var sub in subs )
2022-11-17 15:57:47 +08:00
{
History_Sub_system history_Sub_System = new History_Sub_system ( ) ;
history_Sub_System . sub_system_tag = sub . sub_system_tag ;
history_Sub_System . full_name = sub . sub_name ;
2022-11-18 17:40:43 +08:00
history_Sub_System . device_normal_color = sub . device_normal_color ;
history_Sub_System . device_close_color = sub . device_close_color ;
history_Sub_System . device_error_color = sub . device_error_color ;
2022-11-23 15:36:59 +08:00
history_Sub_System . device_normal_flashing = sub . device_normal_flashing ;
history_Sub_System . device_close_flashing = sub . device_close_flashing ;
history_Sub_System . device_error_flashing = sub . device_error_flashing ;
2023-01-05 18:37:12 +08:00
history_Sub_System . device_normal_text = sub . device_normal_text ;
history_Sub_System . device_close_text = sub . device_close_text ;
history_Sub_System . device_error_text = sub . device_error_text ;
history_Sub_System . device_normal_point_name = sub . device_normal_point_name ;
history_Sub_System . device_close_point_name = sub . device_close_point_name ;
history_Sub_System . device_error_point_name = sub . device_error_point_name ;
history_Sub_System . device_normal_point_value = sub . device_normal_point_value ;
history_Sub_System . device_close_point_value = sub . device_close_point_value ;
history_Sub_System . device_error_point_value = sub . device_error_point_value ;
2022-11-17 15:57:47 +08:00
history_Main_System . History_Sub_systems . Add ( history_Sub_System ) ;
}
2022-11-15 17:36:23 +08:00
apiResult . Data . history_Main_Systems . Add ( history_Main_System ) ;
}
apiResult . Code = "0000" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2022-12-23 16:17:22 +08:00
/// <summary>
/// 系統監控電錶左右區塊呈現
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetBuildMenu")]
public async Task < ActionResult < ApiResult < BuildBuildingMenu > > > GetBuildMenu ( [ FromBody ] FindDevice fd )
{
ApiResult < BuildBuildingMenu > apiResult = new ApiResult < BuildBuildingMenu > ( jwt_str ) ;
if ( ! jwtlife )
{
apiResult . Code = "5000" ;
return BadRequest ( apiResult ) ;
}
else if ( string . IsNullOrEmpty ( fd . building_tag ) | | string . IsNullOrEmpty ( fd . main_system_tag ) | | string . IsNullOrEmpty ( fd . sub_system_tag ) )
{
apiResult . Code = "0002" ;
apiResult . Msg = "傳入參數不完整" ;
return apiResult ;
}
try
{
var buiMenu = await frontendRepository . GetOneAsync < BuildBuildingMenu > (
@ $ "SELECT b.urn_3D,bm.* FROM building_menu bm
JOIN building b on b . building_tag = bm . building_tag
WHERE bm . building_tag = @building_tag AND bm . main_system_tag = @main_system_tag AND bm . sub_system_tag = @sub_system_tag ",
new { @sub_system_tag = fd . sub_system_tag , @main_system_tag = fd . main_system_tag , @building_tag = fd . building_tag } ) ;
apiResult . Data = buiMenu ;
apiResult . Code = "0000" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2022-11-15 17:36:23 +08:00
/// <summary>
2023-02-02 12:08:46 +08:00
/// 棟別列表
2022-11-15 17:36:23 +08:00
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetBuild")]
public async Task < ActionResult < ApiResult < List < BuildList > > > > GetBuild ( )
{
ApiResult < List < BuildList > > apiResult = new ApiResult < List < BuildList > > ( ) ;
2023-01-05 18:37:12 +08:00
2022-11-15 17:36:23 +08:00
try
{
2023-02-02 12:08:46 +08:00
var sqlString = $@"select building_tag, full_name, urn_3D, forge_light_group from building where deleted = 0 order by priority" ;
2022-11-15 17:36:23 +08:00
var bl = await backendRepository . GetAllAsync < BuildList > ( sqlString ) ;
apiResult . Code = "0000" ;
apiResult . Data = bl ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
/// <summary>
/// 樓層列表
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetFloor")]
public async Task < ActionResult < ApiResult < List < FloorList > > > > GetFloor ( [ FromBody ] FindDevice fd )
{
ApiResult < List < FloorList > > apiResult = new ApiResult < List < FloorList > > ( ) ;
if ( string . IsNullOrEmpty ( fd . building_tag ) )
{
apiResult . Code = "0002" ;
apiResult . Msg = "必須選擇東別" ;
return apiResult ;
}
2022-11-18 16:08:48 +08:00
else if ( string . IsNullOrEmpty ( fd . sub_system_tag ) )
{
apiResult . Code = "0002" ;
apiResult . Msg = "必須選擇小類系統" ;
return apiResult ;
}
2022-11-15 17:36:23 +08:00
try
{
2022-12-31 11:13:35 +08:00
var sqlString = $ @ "select f.full_name as floor_tag, f.floor_guid
2022-11-18 16:08:48 +08:00
from sub_system_floor ssf
2022-11-18 17:18:04 +08:00
join floor f on ssf . floor_tag = f . full_name and ssf . building_tag = f . building_tag and f . deleted = 0
2022-11-18 16:08:48 +08:00
where ssf . deleted = 0 and f . building_tag = @building_tag and sub_system_tag = @sub_system_tag order by f . priority ";
var param = new { @building_tag = fd . building_tag , @sub_system_tag = fd . sub_system_tag } ;
2022-11-15 17:36:23 +08:00
var fl = await backendRepository . GetAllAsync < FloorList > ( sqlString , param ) ;
apiResult . Code = "0000" ;
apiResult . Data = fl ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
/// <summary>
2023-01-31 13:54:00 +08:00
/// 系統監控內頁 - 設備列表
2022-11-15 17:36:23 +08:00
/// </summary>
/// <param name="fd">floor_tag: null->總覽</param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetDeviceList")]
public async Task < ActionResult < ApiResult < List < FloorList > > > > GetDeviceList ( [ FromBody ] FindDevice fd )
{
ApiResult < L ist < FloorList > > apiResult = new ApiResult < List < FloorList > > ( ) ;
2023-03-13 15:26:34 +08:00
//是否顯示DeviceNode
2023-03-28 13:48:30 +08:00
string sqlStringqueryModuleLightNodeDisplay = $"SELECT system_value FROM variable WHERE system_type = 'module_light_switch' AND system_key = 'displaynode'" ;
2023-03-13 15:26:34 +08:00
string displayNode = await backendRepository . GetOneAsync < string > ( sqlStringqueryModuleLightNodeDisplay ) ;
2022-11-17 16:04:40 +08:00
if ( string . IsNullOrEmpty ( fd . sub_system_tag ) )
2022-11-15 17:36:23 +08:00
{
apiResult . Code = "0001" ;
apiResult . Msg = "必須系統類別" ;
return BadRequest ( apiResult ) ;
}
else if ( string . IsNullOrEmpty ( fd . building_tag ) )
{
apiResult . Code = "0002" ;
2023-01-31 13:54:00 +08:00
apiResult . Msg = "必須選擇棟別" ;
2022-11-15 17:36:23 +08:00
return BadRequest ( apiResult ) ;
}
try
{
2022-12-30 19:03:31 +08:00
var sqlString = $ @ "select f.full_name, f.InitMapName as map_name, concat(f.floor_map_name,'.svg') as floor_map_name, f.urn_3D
2022-11-18 17:18:04 +08:00
from sub_system_floor ssf
join floor f on ssf . floor_tag = f . full_name and ssf . building_tag = f . building_tag and f . deleted = 0
2023-01-18 13:33:06 +08:00
where ssf . deleted = 0 and ssf . building_tag = @building_tag and ssf . sub_system_tag = @sub_system_tag and ssf . floor_tag = ifnull ( @floor_tag , ssf . floor_tag ) ; ";
2022-11-18 17:18:04 +08:00
var param = new { @building_tag = fd . building_tag , @floor_tag = fd . floor_tag , @sub_system_tag = fd . sub_system_tag } ;
2022-11-15 17:36:23 +08:00
var fl = await backendRepository . GetAllAsync < FloorList > ( sqlString , param ) ;
foreach ( var f in fl )
{
List < DeviceLists > dl = new List < DeviceLists > ( ) ;
2022-12-01 19:32:32 +08:00
sqlString = $ @ "select d.device_guid, d.full_name, d.device_coordinate, d.priority, dk.device_image, d.device_number, CONCAT('{baseURL}', '{deviceKindFilePath}', dk.device_image) AS device_image_url,d.status,
2023-04-25 22:22:20 +08:00
dk . device_normal_point_id , dk . device_normal_point_guid , dk . device_normal_point_col , dk . device_normal_point_value , dk . device_normal_flashing , dk . device_normal_point_name , dk . device_normal_color ,
dk . device_close_point_id , dk . device_close_point_guid , dk . device_close_point_col , dk . device_close_point_value , dk . device_close_flashing , dk . device_close_point_name , dk . device_close_color ,
dk . device_error_point_id , dk . device_error_point_guid , dk . device_error_point_col , dk . device_error_point_value , dk . device_error_flashing , dk . device_error_point_name , dk . device_error_color ,
2023-01-03 10:53:51 +08:00
d . room_dbid , d . device_coordinate_3d , d . forge_dbid
2022-11-16 10:55:35 +08:00
from device d
2022-11-17 14:52:07 +08:00
left join device_kind dk on d . device_building_tag = dk . device_building_tag and d . device_system_tag = dk . device_system_tag
2022-11-17 15:14:59 +08:00
and d . device_name_tag = dk . device_name_tag
2023-01-31 13:54:00 +08:00
where d . deleted = 0 and d . device_name_tag = @sub_system_tag and d . device_building_tag = @building_tag and d . device_floor_tag = @floor_tag
order by d . device_number ";
2022-11-17 16:04:40 +08:00
var dlParam = new { @sub_system_tag = fd . sub_system_tag , @building_tag = fd . building_tag , @floor_tag = f . full_name } ;
2022-11-15 17:36:23 +08:00
dl = await backendRepository . GetAllAsync < DeviceLists > ( sqlString , dlParam ) ;
2022-11-17 18:25:40 +08:00
2023-01-05 18:37:12 +08:00
foreach ( var d in dl )
2022-11-17 18:25:40 +08:00
{
var sql_node = $ @ "SELECT
dn . device_node_guid ,
dn . device_guid ,
dn . full_name AS Device_node_full_name ,
dn . device_node_coordinate ,
2023-03-28 13:48:30 +08:00
dn . device_node_coordinate_3d ,
dn . device_number ,
2023-02-05 01:10:00 +08:00
dn . priority ,
dn . forge_dbid
2022-11-17 18:25:40 +08:00
FROM device_node dn
WHERE dn . deleted = 0 AND dn . device_guid = @device_guid
ORDER BY dn . priority ASC ";
2023-01-05 18:37:12 +08:00
2022-11-17 18:25:40 +08:00
d . Device_nodes = await backendRepository . GetAllAsync < DeviceNode > ( sql_node , new { device_guid = d . device_guid } ) ;
}
2022-11-15 17:36:23 +08:00
f . device_list = dl ;
2022-10-14 16:08:54 +08:00
}
2022-11-17 18:25:40 +08:00
2023-03-13 15:26:34 +08:00
apiResult . Module = displayNode ;
2022-11-15 17:36:23 +08:00
apiResult . Data = fl ;
2022-10-14 16:08:54 +08:00
apiResult . Code = "0000" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2023-01-18 11:12:08 +08:00
/// <summary>
/// 獲取全部設備資料
/// </summary>
/// <param name="fd"></param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetAllDevice")]
public async Task < ActionResult < ApiResult < List < DeviceBaseList > > > > GetAllDevice ( )
{
ApiResult < List < DeviceBaseList > > apiResult = new ApiResult < List < DeviceBaseList > > ( ) ;
try
{
string sql = $@"select device_guid,device_number, full_name, device_coordinate,device_coordinate_3d,forge_dbid,priority from device where deleted = 0" ;
var device = await backendRepository . GetAllAsync < DeviceBaseList > ( sql ) ;
if ( device = = null )
{
apiResult . Msg = "查無次設備" ;
apiResult . Code = "0001" ;
return apiResult ;
}
apiResult . Data = device ;
apiResult . Code = "0000" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2022-11-15 19:00:36 +08:00
/// <summary>
/// 獲取設備資料
/// </summary>
/// <param name="fd"></param>
/// <returns></returns>
2022-10-14 16:08:54 +08:00
[HttpPost]
2022-11-15 19:00:36 +08:00
[Route("api/Device/GetBaseDevice")]
public async Task < ActionResult < ApiResult < DeviceBaseInfo > > > GetBaseDevice ( [ FromBody ] FindDevice fd )
2022-10-14 16:08:54 +08:00
{
2022-11-15 19:00:36 +08:00
ApiResult < DeviceBaseInfo > apiResult = new ApiResult < DeviceBaseInfo > ( ) ;
try
2022-10-14 16:08:54 +08:00
{
2023-01-18 10:20:29 +08:00
if ( fd . device_guid = = null & & fd . device_number = = null ) {
apiResult . Code = "0002" ;
apiResult . Msg = "必需輸入設備資訊" ;
return Ok ( apiResult ) ;
}
string sql = $ @ "select device_number, full_name, device_coordinate,device_coordinate_3d from device where deleted = 0 and
(
( @device_guid is not null and device_guid = @device_guid )
OR ( @device_guid is null and device_number = @device_number )
)
";
object param = new { @device_guid = fd . device_guid , @device_number = fd . device_number } ;
2022-11-15 19:00:36 +08:00
var device = await backendRepository . GetOneAsync < DeviceBaseInfo > ( sql , param ) ;
2023-01-05 18:37:12 +08:00
if ( device = = null )
2022-11-15 19:00:36 +08:00
{
apiResult . Msg = "查無次設備" ;
apiResult . Code = "0001" ;
return apiResult ;
}
apiResult . Data = device ;
apiResult . Code = "0000" ;
2022-10-14 16:08:54 +08:00
}
2022-11-15 19:00:36 +08:00
catch ( Exception exception )
2022-10-14 16:08:54 +08:00
{
2023-01-18 10:20:29 +08:00
2022-11-15 19:00:36 +08:00
apiResult . Code = "9999" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2022-10-14 16:08:54 +08:00
2022-11-15 19:00:36 +08:00
/// <summary>
/// 獲取設備運維資料
/// </summary>
/// <param name="fd"></param>
/// <returns></returns>
2022-11-17 17:56:21 +08:00
[HttpGet]
2022-11-15 19:00:36 +08:00
[Route("api/Device/GetOpeDevice")]
2022-11-17 17:56:21 +08:00
public async Task < ActionResult < ApiResult < List < DeviceOpeRecord > > > > GetOpeDevice ( [ FromQuery ] string device_guid )
2022-11-15 19:00:36 +08:00
{
ApiResult < List < DeviceOpeRecord > > apiResult = new ApiResult < List < DeviceOpeRecord > > ( ) ;
try
{
2022-11-17 17:56:21 +08:00
string sql = $ @ "select orr.work_type, orr.fix_do, ui.full_name as work_person_name, orr.finish_time, orr.created_at, dn.device_node_guid, dn.full_name as device_node_name
2022-11-15 19:00:36 +08:00
from device d
join operation_record orr on d . device_number = orr . fix_do_code and orr . deleted = 0
left join userinfo ui on orr . work_person_id = ui . userinfo_guid
2022-11-17 17:56:21 +08:00
left join device_node dn on d . device_guid = dn . device_guid
2022-11-15 19:00:36 +08:00
where d . deleted = 0 and d . device_guid = @device_guid ";
2022-11-17 17:56:21 +08:00
object param = new { @device_guid = device_guid } ;
2022-11-15 19:00:36 +08:00
var device = await backendRepository . GetAllAsync < DeviceOpeRecord > ( sql , param ) ;
2022-10-14 16:08:54 +08:00
2022-11-15 19:00:36 +08:00
if ( device . Count = = 0 )
{
apiResult . Msg = "查無次設備" ;
apiResult . Code = "0001" ;
return apiResult ;
}
2022-10-14 16:08:54 +08:00
apiResult . Data = device ;
apiResult . Code = "0000" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
/// <summary>
/// 取得L型選單的alarm的報警設備
/// 由原本的obix打API方式改為此action
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("api/Device/MenuAlarm")]
public async Task < ActionResult < ApiResult < List < OntimeAlarmRawData > > > > MenuAlarm ( string account )
{
ApiResult < List < OntimeAlarmRawData > > apiResult = new ApiResult < List < OntimeAlarmRawData > > ( jwt_str ) ;
if ( ! jwtlife )
{
apiResult . Code = "5000" ;
return BadRequest ( apiResult ) ;
}
try
{
//取得發生異常的設備
string sql = $ @ "
SELECT
unicode_decode ( value ) device_point
FROM alarmorion_orionalarmrecord a
JOIN alarmorion_orionalarmfacetvalue b on a . id = b . alarm
WHERE a . sourceState = 1 and b . facetName = 9 ";
var alarmDevicePoints = await frontendRepository . GetAllAsync < string > ( sql ) ;
List < string > alarmDevices = new List < string > ( ) ;
foreach ( var alarmDevicePoint in alarmDevicePoints )
{
var alarmDevicePointSplit = alarmDevicePoint . Split ( "_" ) ;
var alarmDevice = string . Join ( "_" , alarmDevicePointSplit . SkipLast ( 1 ) ) ;
if ( ! alarmDevices . Contains ( alarmDevice ) )
{
alarmDevices . Add ( alarmDevice ) ;
}
}
var sqlDevice = $ @ "
SELECT
d . building_guid ,
d . main_system_guid ,
d . sub_system_guid ,
d . floor_guid ,
d . device_number
FROM Device d
INNER JOIN (
SELECT
ap . building_guid ,
ap . ShowView AS sub_system_guid
FROM
(
SELECT *
FROM role_auth ra
WHERE ra . role_guid = ( SELECT ui . role_guid FROM userinfo ui WHERE account = @Account )
) ra
LEFT JOIN auth_page ap ON ra . AuthCode = ap . AuthCode
WHERE ap . AuthType = 1
) shower ON d . building_guid = shower . building_guid AND d . sub_system_guid = shower . sub_system_guid
WHERE d . deleted = 0 AND d . device_number IN @DeviceNumbers
";
var menuAlarmDevices = await frontendRepository . GetAllAsync < OntimeAlarmRawData > ( sqlDevice , new { Account = account , DeviceNumbers = alarmDevices } ) ;
apiResult . Data = menuAlarmDevices ;
apiResult . Code = "0000" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
/// <summary>
/// 取得報警設備
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("api/Device/Getalarm")]
public async Task < ActionResult < ApiResult < AlarmObj > > > Alarm ( )
{
ApiResult < AlarmObj > apiResult = new ApiResult < AlarmObj > ( jwt_str ) ;
if ( ! jwtlife )
{
apiResult . Code = "5000" ;
return BadRequest ( apiResult ) ;
}
try
{
AlarmObj alarmObj = new AlarmObj ( )
{
alarmorion = new List < AlarmorionString > ( ) ,
buildingAlarmDeviceAmount = new List < BuildingAlarmDeviceAmount > ( )
} ;
// old寫法
//string sql = $@"SELECT sl.source device_number,from_unixtime(amc.timestamp/1000,'%Y-%m-%d %H:%i:%s') alarm_timestamp FROM alarmorion_orionalarmrecord amc
// JOIN (
// SELECT MAX(amc.alarm) ad,m.source FROM alarmorion_orionalarmsourceorder amc
// JOIN (SELECT * FROM alarmorion_orionalarmsource a WHERE substring(a.source,23,5) ='Arena') m ON amc.alarmSource = m.id
// GROUP BY m.source
// ) sl ON amc.id = sl.ad
// WHERE amc.sourceState = 1
// ";
string sql = $ @ "
select * from
(
SELECT a . * , from_unixtime ( a . timestamp / 1000 , ' % Y - % m - % d % H : % i : % s ' ) alarm_timestamp , errmsg device_point ,
substring ( errmsg , 1 ,
LENGTH ( errmsg ) -
LENGTH ( SUBSTRING_INDEX ( errmsg , '_' , - 1 ) - 1 ) - - 最 後 一 段 的 長 度
- 1 - - 減 掉 最 後 的 _ ex : D3_B_B1F_CO_
) device_tag
2023-05-22 10:09:01 +08:00
FROM alarmOrion_OrionAlarmRecord a
JOIN alarmOrion_OrionAlarmFacetValue b on a . id = b . alarm
2022-10-14 16:08:54 +08:00
WHERE a . sourceState = 1 and b . facetName = 9
) a
left join device b on a . device_tag = b . device_number AND b . deleted = 0
left join device_disaster c on b . device_guid = c . device_guid
WHERE c . device_system_value IS NOT NULL ";
var alarms = await frontendRepository . GetAllAsync < AlarmorionString > ( sql ) ;
// old寫法
//List<AlarmorionString> Alarmorions = new List<AlarmorionString>();
//foreach (var alarm in alarms)
//{
// var source = alarm.device_number.Split('/');
// //if(source[2] != "H")
// //{
// // continue;
// //}
// alarm.device_number = source[6];
// Alarmorions.Add(alarm);
//}
//alarmObj.alarmorion = Alarmorions.GroupBy(a => new { a.device_number, a.alarm_timestamp }).Select(a => a.First()).ToList();
2023-01-05 18:37:12 +08:00
foreach ( var alarm in alarms )
2022-10-14 16:08:54 +08:00
{
var temp_alarm = alarmObj . alarmorion . Find ( x = > x . device_number = = alarm . device_number ) ;
if ( temp_alarm = = null )
{
alarmObj . alarmorion . Add ( alarm ) ;
}
}
var device_amount_sql = $ @ "SELECT
2023-05-22 15:37:36 +08:00
d . device_building_tag ,
2022-10-14 16:08:54 +08:00
COUNT ( * ) AS device_amount
FROM device d
WHERE d . deleted = 0
AND d . device_number IN @devices
2023-05-22 15:37:36 +08:00
GROUP BY d . device_building_tag ";
2022-10-14 16:08:54 +08:00
alarmObj . buildingAlarmDeviceAmount = await frontendRepository . GetAllAsync < BuildingAlarmDeviceAmount > ( device_amount_sql , new { devices = alarmObj . alarmorion . Select ( x = > x . device_number ) . ToList ( ) } ) ;
apiResult . Data = alarmObj ;
apiResult . Code = "0000" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
/// <summary>
/// 修改設備名稱(打後台API)
/// </summary>
/// <param name="change"></param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/SaveChangeName")]
public async Task < ActionResult < ApiResult < string > > > SaveChangeName ( ChangeName change )
{
ApiResult < string > apiResult = new ApiResult < string > ( jwt_str ) ;
if ( ! jwtlife )
{
apiResult . Code = "5000" ;
return BadRequest ( apiResult ) ;
}
try
{
string authHeader = HttpContext . Request . Headers [ "Authorization" ] ;
var websiteurl = await frontendRepository . GetOneAsync < string > ( "select system_value from variable where system_type = 'website_config' and system_key = 'website_url' " ) ;
//傳送到後台API
HttpWebRequest request = ( HttpWebRequest ) WebRequest . Create ( $"{websiteurl}api/Device/SaveChangeName" ) ;
request . Method = "POST" ;
request . Headers . Add ( "Authorization" , authHeader ) ;
request . ContentType = "application/x-www-form-urlencoded" ;
request . PreAuthenticate = true ;
NameValueCollection postParams = System . Web . HttpUtility . ParseQueryString ( string . Empty ) ;
postParams . Add ( "TagName" , change . TagName ) ;
postParams . Add ( "ChangeN" , change . ChangeN ) ;
postParams . Add ( "ChooseTable" , change . ChooseTable . ToString ( ) ) ;
byte [ ] postData = Encoding . UTF8 . GetBytes ( postParams . ToString ( ) ) ;
using ( Stream st = request . GetRequestStream ( ) )
{
st . Write ( postData , 0 , postData . Length ) ;
}
HttpWebResponse response = ( HttpWebResponse ) request . GetResponse ( ) ;
var responseString = new StreamReader ( response . GetResponseStream ( ) ) . ReadToEnd ( ) ;
var statusNumber = ( int ) response . StatusCode ;
if ( statusNumber ! = 200 )
{
throw new NotImplementedException ( responseString ) ;
}
else
{
//解析回傳內容
var final = JObject . Parse ( responseString ) ;
apiResult . Code = final [ "code" ] . ToString ( ) ;
apiResult . Data = final [ "data" ] . ToString ( ) ;
}
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
[HttpPost]
[Route("api/Device/GetHaveChangeNameRole")]
public async Task < ActionResult < ApiResult < bool > > > GetHaveChangeNameRole ( ChangeNameRole role )
{
ApiResult < bool > apiResult = new ApiResult < bool > ( jwt_str ) ;
if ( ! jwtlife )
{
apiResult . Code = "5000" ;
return BadRequest ( apiResult ) ;
}
try
{
var sql = $ @ "
select * from userinfo u
join role_auth a on a . role_guid = u . role_guid
join auth_page p on p . AuthCode = a . AuthCode
where u . account = N ' { role . Account } '
and p . SubName = N ' 編 輯 設 備 名 稱 '
2023-05-24 17:31:02 +08:00
and p . building_tag = N ' { role . Building_tag } ' ";
2022-10-14 16:08:54 +08:00
var have = await backendRepository . GetOneAsync < string > ( sql ) ;
if ( have = = null )
{
apiResult . Data = false ;
}
else
{
apiResult . Data = true ;
}
apiResult . Code = "0000" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2022-12-23 14:11:54 +08:00
[HttpPost]
[Route("api/GetDevForCor")]
2022-12-27 18:44:22 +08:00
public async Task < ActionResult < List < DevForCor > > > GetDevForCor ( [ FromBody ] Device p )
2022-12-23 14:11:54 +08:00
{
ApiResult < List < DevForCor > > apiResult = new ApiResult < List < DevForCor > > ( ) ;
List < DevForCor > device = new List < DevForCor > ( ) ;
try
{
2022-12-27 18:44:22 +08:00
if ( p ! = null )
2022-12-23 14:11:54 +08:00
{
2022-12-27 18:44:22 +08:00
var param = new
2022-12-23 14:11:54 +08:00
{
2022-12-27 18:44:22 +08:00
@device_area_tag = p . device_area_tag ,
@device_building_tag = p . device_building_tag ,
@device_system_tag = p . device_system_tag ,
@device_name_tag = p . device_name_tag ,
@device_floor_tag = p . device_floor_tag
} ;
2023-03-13 15:26:34 +08:00
var dl = await backendRepository . GetAllAsync < DevForCor > ( $ @ "select device_guid,device_number,device_floor_tag,device_coordinate_3d,forge_dbid, full_name
2022-12-27 18:44:22 +08:00
from device where deleted = 0 and device_area_tag = @device_area_tag and device_building_tag = @device_building_tag
and device_system_tag = @device_system_tag and device_name_tag = @device_name_tag
and device_floor_tag = ifnull ( @device_floor_tag , device_floor_tag ) ", param);
2023-01-05 18:37:12 +08:00
2023-03-13 15:26:34 +08:00
foreach ( var d in dl )
{
var sql_node = $ @ "SELECT
dn . device_node_guid ,
dn . device_guid ,
dn . full_name AS Device_node_full_name ,
dn . device_node_coordinate ,
2023-03-14 13:37:48 +08:00
dn . device_node_coordinate_3d ,
2023-03-28 13:48:30 +08:00
dn . device_number ,
2023-03-13 15:26:34 +08:00
dn . priority ,
dn . forge_dbid
FROM device_node dn
WHERE dn . deleted = 0 AND dn . device_guid = @device_guid
ORDER BY dn . priority ASC ";
d . Device_nodes = await backendRepository . GetAllAsync < DeviceNode > ( sql_node , new { device_guid = d . device_guid } ) ;
2023-03-14 13:37:48 +08:00
}
2023-03-13 15:26:34 +08:00
apiResult . Data = dl ;
2022-12-23 14:11:54 +08:00
apiResult . Code = "0000" ;
}
else
{
apiResult . Msg = "無資料數入" ;
apiResult . Code = "0001" ;
}
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
2023-01-04 15:12:20 +08:00
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
[HttpPost]
[Route("api/GetDevNodeForCor")]
public async Task < ActionResult < List < DevNodeForCor > > > GetDevNodeForCor ( [ FromBody ] Device p )
{
ApiResult < List < DevNodeForCor > > apiResult = new ApiResult < List < DevNodeForCor > > ( ) ;
List < DevNodeForCor > device = new List < DevNodeForCor > ( ) ;
try
{
apiResult . Code = "0001" ;
2023-01-05 18:37:12 +08:00
if ( p ! = null )
2023-01-04 15:12:20 +08:00
{
if ( p . device_system_tag = = "LT" & & p . device_name_tag = = "L1" )
{
var d = await backendRepository . GetAllAsync < DevNodeForCor > ( $@"select device_guid,priority,device_node_coordinate_3d,forge_dbid from device_node where deleted = 0" ) ;
apiResult . Data = d ;
apiResult . Code = "0000" ;
}
}
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
2022-12-23 14:11:54 +08:00
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2022-12-27 18:44:22 +08:00
/// <summary>
/// 燈控排程列表
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetLigSchList")]
public async Task < ActionResult < ApiResult < BuildBuildingMenu > > > GetLigSchList ( [ FromBody ] FindDevice fd )
{
ApiResult < BuildBuildingMenu > apiResult = new ApiResult < BuildBuildingMenu > ( jwt_str ) ;
if ( ! jwtlife )
{
apiResult . Code = "5000" ;
return BadRequest ( apiResult ) ;
}
else if ( string . IsNullOrEmpty ( fd . device_guid ) )
{
apiResult . Code = "0002" ;
apiResult . Msg = "傳入參數不完整" ;
return apiResult ;
}
try
{
var buiMenu = await frontendRepository . GetOneAsync < BuildBuildingMenu > (
@ $ "SELECT b.urn_3D,bm.* FROM building_menu bm
JOIN building b on b . building_tag = bm . building_tag
WHERE bm . building_tag = @building_tag AND bm . main_system_tag = @main_system_tag AND bm . sub_system_tag = @sub_system_tag ",
new { @sub_system_tag = fd . sub_system_tag , @main_system_tag = fd . main_system_tag , @building_tag = fd . building_tag } ) ;
apiResult . Data = buiMenu ;
apiResult . Code = "0000" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2022-12-30 19:03:31 +08:00
/// <summary>
/// 取得 forge 模型 node 名稱,透過 node key
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpPost]
2023-01-05 18:37:12 +08:00
[Route("api/Device/GetForgeNodeIdFromVar")]
public async Task < ActionResult < List < Variable > > > GetForgeNodeIdFromVar ( [ FromBody ] string forgeNodeKey )
2022-12-30 19:03:31 +08:00
{
ApiResult < List < Variable > > apiResult = new ApiResult < List < Variable > > ( ) ;
List < Variable > variable = new List < Variable > ( ) ;
try
{
var param = new
{
@system_type = forge_node_name_system_type ,
@system_key = forgeNodeKey
} ;
var v = await backendRepository . GetAllAsync < Variable > ( $@"SELECT id,system_value FROM variable WHERE system_type = @system_type and system_key = ifnull(@system_key,system_key)"
, param ) ;
apiResult . Data = v ;
apiResult . Code = "0000" ;
2023-01-05 18:37:12 +08:00
2022-12-30 19:03:31 +08:00
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2022-12-31 11:13:35 +08:00
/// <summary>
2023-03-28 15:07:18 +08:00
/// input user 所選樓層,回傳樓上那層,如果是頂樓 則回自己
2022-12-31 11:13:35 +08:00
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetNextFloor")]
public async Task < ActionResult < ApiResult < Floor > > > GetNextFloor ( [ FromBody ] Floor f )
{
ApiResult < Floor > apiResult = new ApiResult < Floor > ( ) ;
if ( string . IsNullOrEmpty ( f . floor_guid ) )
{
apiResult . Code = "0002" ;
apiResult . Msg = "需傳入樓層guid" ;
return apiResult ;
}
2023-01-05 18:37:12 +08:00
2022-12-31 11:13:35 +08:00
try
{
2023-03-28 13:48:30 +08:00
//var sqlString = $@" SELECT * FROM floor WHERE
// priority = (SELECT MIN(priority) FROM floor WHERE priority > (SELECT priority FROM floor WHERE floor_guid = @floor_guid)
// AND building_tag = (SELECT building_tag FROM floor WHERE floor_guid = @floor_guid))
// AND building_tag = (SELECT building_tag FROM floor WHERE floor_guid = @floor_guid)";
2023-03-28 15:07:18 +08:00
//找出同一棟 User 所選的上一樓(要拿掉天花板),如已經是頂樓則回傳自己
var sqlString = $ @ "select * from
(
SELECT * FROM floor - - 下 一 樓
where building_tag = @building_tag and priority > (
select priority from floor
where building_tag = @building_tag and floor_guid = @floor_guid
)
order by priority limit 1
) a
union
select * from
(
SELECT * FROM floor - - 如 果 是 頂 樓 則 回 傳 自 己
where building_tag = @building_tag and priority > = (
select priority from floor
where building_tag = @building_tag and floor_guid = @floor_guid
)
order by priority limit 1
) b
order by priority desc limit 1 ";
var param = new { @building_tag = f . building_tag , @floor_guid = f . floor_guid } ;
2022-12-31 11:13:35 +08:00
var fr = await backendRepository . GetOneAsync < Floor > ( sqlString , param ) ;
apiResult . Code = "0000" ;
apiResult . Data = fr ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2023-01-06 18:39:55 +08:00
/// <summary>
/// 取得 Device Item 系統小類下的點位資訊
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetDeviceItem")]
public async Task < ActionResult < ApiResult < List < DeviceItemViewModel > > > > GetDeviceItem ( [ FromBody ] FindDeviceItem fdi )
{
ApiResult < List < DeviceItemViewModel > > apiResult = new ApiResult < List < DeviceItemViewModel > > ( ) ;
if ( string . IsNullOrEmpty ( fdi . main_system_tag ) | | string . IsNullOrEmpty ( fdi . sub_system_tag ) )
{
apiResult . Code = "0002" ;
apiResult . Msg = "需傳入大小類tag" ;
return apiResult ;
}
try
{
var sqlString = $ @ " SELECT * FROM device_item
WHERE deleted = '0' AND device_system_tag = @main_system_tag AND device_name_tag = @sub_system_tag AND points = IFNULL ( @points , points ) ";
var param = new { @main_system_tag = fdi . main_system_tag , @sub_system_tag = fdi . sub_system_tag , @points = fdi . points } ;
var fr = await backendRepository . GetAllAsync < DeviceItemViewModel > ( sqlString , param ) ;
2023-01-13 16:06:47 +08:00
apiResult . Code = "0000" ;
apiResult . Data = fr ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
/// <summary>
/// 取得 Forge 3D 模型不可見的類型
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("api/Device/GetForgeInvType")]
public async Task < ActionResult < ApiResult < List < DeviceItemViewModel > > > > GetForgeInvType ( [ FromBody ] string search_tag )
{
ApiResult < List < ForgeInvisible > > apiResult = new ApiResult < List < ForgeInvisible > > ( ) ;
try
{
var sqlString = $ @ "SELECT
v1 . system_key AS ' invisible_type ' ,
v1 . system_value AS ' invisible_value ' ,
v2 . system_value AS ' sub_system_tag '
FROM variable v1
LEFT JOIN variable v2 ON v2 . id = v1 . system_parent_id AND v2 . deleted = '0'
WHERE
v1 . deleted = '0'
AND v1 . system_type = ' forge_3d_invisible_type '
AND (
( @isDef = true AND v1 . system_key = ' default_value ' )
OR ( @isDef = false AND v2 . system_value = @sub_system_tag )
OR ( @isDef = false AND @sub_system_tag IS NULL AND v1 . system_key = ' default_value ' )
OR ( @isDef = false AND @sub_system_tag IS NULL AND v2 . system_value = v2 . system_value )
) ";
var param = new { sub_system_tag = search_tag = = "forge_default" ? null : search_tag , isDef = search_tag = = "forge_default" } ;
var fr = await backendRepository . GetAllAsync < ForgeInvisible > ( sqlString , param ) ;
2023-01-06 18:39:55 +08:00
apiResult . Code = "0000" ;
apiResult . Data = fr ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
return Ok ( apiResult ) ;
}
return Ok ( apiResult ) ;
}
2022-10-14 16:08:54 +08:00
}
2022-12-23 14:11:54 +08:00
}