2022-10-14 16:08:54 +08:00
using FrontendWebApi.Models ;
using Microsoft.AspNetCore.Mvc ;
using Microsoft.Extensions.Logging ;
2023-05-30 14:36:50 +08:00
using Newtonsoft.Json ;
2022-10-14 16:08:54 +08:00
using Repository.BackendRepository.Interface ;
using Repository.FrontendRepository.Interface ;
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Linq ;
2023-05-29 18:47:35 +08:00
using System.Linq.Expressions ;
2022-10-14 16:08:54 +08:00
using System.Net ;
using System.Net.Http ;
2023-05-29 18:47:35 +08:00
using System.Reflection ;
using System.Runtime.Serialization.Formatters.Binary ;
2022-10-14 16:08:54 +08:00
using System.Text ;
using System.Threading.Tasks ;
namespace FrontendWebApi.ApiControllers
{
public class LightScheduleController : MyBaseApiController < LightScheduleController >
{
private readonly IBackendRepository backendRepository ;
private readonly IFrontendRepository frontendRepository ;
public LightScheduleController
(
IBackendRepository backendRepository ,
IFrontendRepository frontendRepository
)
{
this . backendRepository = backendRepository ;
this . frontendRepository = frontendRepository ;
}
[HttpPost]
[Route("api/LightSchedule/GetLightDevice")]
public async Task < ActionResult < ApiResult < List < lightDevice > > > > GetLightDevice ( GetDevicePost post )
{
List < lightDevice > lightDevices = new List < lightDevice > ( ) ;
ApiResult < List < lightDevice > > apiResult = new ApiResult < List < lightDevice > > ( ) ;
try
{
2023-05-29 18:47:35 +08:00
var floor_tag = await backendRepository . GetOneAsync < string > ( $ @ "
select full_name from floor where floor_guid = @floor_guid and deleted = 0
",new { floor_guid = post.floor_guid});
2022-10-14 16:08:54 +08:00
lightDevices = await backendRepository . GetAllAsync < lightDevice > ( $ @ "
2023-05-29 18:47:35 +08:00
select * from device where device_building_tag = ' { post . building_tag } ' and device_name_tag = ' { post . sub_system_tag } ' and device_floor_tag = ' { floor_tag } ' and deleted = 0 and status = 0 order by priority
2022-10-14 16:08:54 +08:00
");
if ( ! String . IsNullOrEmpty ( post . schedule_guid ) )
{
var devicechecklist = await backendRepository . GetAllAsync < string > ( @ $ "
select sd . device_guid from schedule_device sd where light_schedule_guid = ' { post . schedule_guid } '
");
foreach ( var a in lightDevices )
{
if ( devicechecklist . Contains ( a . device_guid ) )
{
a . check = 1 ;
}
else
{
a . check = 0 ;
}
}
}
apiResult . Code = "0000" ;
apiResult . Data = lightDevices ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
}
return Ok ( apiResult ) ;
}
[HttpPost]
[Route("api/LightSchedule/SaveSchedule")]
public async Task < ActionResult < ApiResult < string > > > SaveSchedule ( SaveSchedule saveSchedule )
{
ApiResult < string > apiResult = new ApiResult < string > ( ) ;
try
{
2023-05-30 14:36:50 +08:00
// Operation_log 輸入參數
OperationInput opeInput = new OperationInput ( ) { operation_type = 2 } ;
// 取得對應樓層資料
var targetFloor = await backendRepository . GetOneAsync < Floor > ( $ @ "
select * from floor where floor_guid = @floor_guid ",
new { floor_guid = saveSchedule . floor_guid } ) ;
// 取得對應燈控排程主表資料
var targetScheduleLight = await backendRepository . GetOneAsync < SaveSchedule > ( $ @ "
select * from light_schedule where light_schedule_guid = @light_schedule_guid ",
new { light_schedule_guid = saveSchedule . light_schedule_guid } ) ;
// 取得對應燈控排程設備資料
var targetScheduleDevice = await backendRepository . GetAllAsync < string > ( $ @ "
select device_guid from schedule_device where light_schedule_guid = @light_schedule_guid ",
new { light_schedule_guid = saveSchedule . light_schedule_guid } ) ;
opeInput . building_tag = targetFloor . building_tag ;
opeInput . floor_tag = targetFloor . full_name ;
if ( String . IsNullOrEmpty ( saveSchedule . light_schedule_guid ) )
2022-10-14 16:08:54 +08:00
{
2023-05-30 14:36:50 +08:00
opeInput . action_name = "新增" ;
2022-10-14 16:08:54 +08:00
Dictionary < string , object > Schedule = new Dictionary < string , object > ( ) ;
var newguid = Guid . NewGuid ( ) ;
Schedule = new Dictionary < string , object > ( )
{
{ "@light_schedule_guid" , newguid } ,
{ "@status" , saveSchedule . status } ,
{ "@full_name" , saveSchedule . full_name } ,
{ "@week" , saveSchedule . week } ,
{ "@cycle" , saveSchedule . cycle } ,
{ "@floor_guid" , saveSchedule . floor_guid } ,
{ "@start_time" , saveSchedule . start_time } ,
{ "@end_time" , saveSchedule . end_time } ,
{ "@created_by" , myUser . userinfo_guid }
} ;
2023-05-30 14:36:50 +08:00
2022-10-14 16:08:54 +08:00
await backendRepository . AddOneByCustomTable ( Schedule , "light_schedule" ) ;
List < Dictionary < string , object > > ScheduleDevices = new List < Dictionary < string , object > > ( ) ;
foreach ( var a in saveSchedule . devicelist )
{
Dictionary < string , object > ScheduleDevice = new Dictionary < string , object > ( ) ;
ScheduleDevice = new Dictionary < string , object > ( )
{
{ "@light_schedule_guid" , newguid } ,
{ "@device_guid" , a }
} ;
ScheduleDevices . Add ( ScheduleDevice ) ;
}
2023-05-30 14:36:50 +08:00
opeInput . parameter = JsonConvert . SerializeObject ( saveSchedule ) ;
2022-10-14 16:08:54 +08:00
await backendRepository . AddMutiByCustomTable ( ScheduleDevices , "schedule_device" ) ;
2023-05-30 14:36:50 +08:00
await InsertOperation ( opeInput ) ;
2022-10-14 16:08:54 +08:00
}
else
{
2023-05-30 14:36:50 +08:00
opeInput . action_name = "修改" ;
2022-10-14 16:08:54 +08:00
Dictionary < string , object > Schedule = new Dictionary < string , object > ( ) ;
Schedule = new Dictionary < string , object > ( )
{
{ "@status" , saveSchedule . status } ,
{ "@full_name" , saveSchedule . full_name } ,
{ "@week" , saveSchedule . week } ,
{ "@cycle" , saveSchedule . cycle } ,
{ "@floor_guid" , saveSchedule . floor_guid } ,
{ "@start_time" , saveSchedule . start_time } ,
{ "@end_time" , saveSchedule . end_time } ,
{ "@updated_by" , myUser . userinfo_guid } ,
{ "@updated_at" , DateTime . Now . ToString ( "yyyy-MM-dd HH:mm:ss" ) }
} ;
2023-05-29 18:47:35 +08:00
// 比較欄位
List < string > compareTargetProps = new List < string > ( ) { "full_name" , "week" , "cycle" , "floor_guid" , "start_time" , "end_time" } ;
List < string > compareTargetValues = new List < string > ( ) ;
2023-05-30 14:36:50 +08:00
2023-05-29 18:47:35 +08:00
Type modelType = saveSchedule . GetType ( ) ;
// 根據每個欄位比較
foreach ( var prop in compareTargetProps ) {
PropertyInfo propertyInfo = modelType . GetProperty ( prop ) ;
if ( propertyInfo = = null ) continue ;
// 比較 saveSchedule 與 targetSchedule
var value = propertyInfo . GetValue ( saveSchedule , null ) ? . ToString ( ) ;
var newValue = propertyInfo . GetValue ( targetScheduleLight , null ) ? . ToString ( ) ;
// 只要不對就是排程變更
if ( value ! = newValue ) {
saveSchedule . changeNames . Add ( "排程變更" ) ;
break ;
}
}
// 判斷是否為狀態變更
if ( targetScheduleLight . status ! = saveSchedule . status ) {
saveSchedule . changeNames . Add ( "狀態變更" ) ;
}
2023-05-30 14:36:50 +08:00
2023-05-29 18:47:35 +08:00
// 兩邊設備 guid 排序後比較
saveSchedule . devicelist . Sort ( ) ;
targetScheduleDevice . Sort ( ) ;
if ( saveSchedule . devicelist ! = targetScheduleDevice ) {
saveSchedule . changeNames . Add ( "設備變更" ) ;
}
2022-10-14 16:08:54 +08:00
await backendRepository . UpdateOneByCustomTable ( Schedule , "light_schedule" , $" light_schedule_guid = '{saveSchedule.light_schedule_guid}'" ) ;
await backendRepository . PurgeOneByGuidWithCustomDBNameAndTable ( "schedule_device" , $" light_schedule_guid = '{saveSchedule.light_schedule_guid}'" ) ;
List < Dictionary < string , object > > ScheduleDevices = new List < Dictionary < string , object > > ( ) ;
foreach ( var a in saveSchedule . devicelist )
{
Dictionary < string , object > ScheduleDevice = new Dictionary < string , object > ( ) ;
ScheduleDevice = new Dictionary < string , object > ( )
{
{ "@light_schedule_guid" , saveSchedule . light_schedule_guid } ,
{ "@device_guid" , a }
} ;
ScheduleDevices . Add ( ScheduleDevice ) ;
}
await backendRepository . AddMutiByCustomTable ( ScheduleDevices , "schedule_device" ) ;
2023-05-29 18:47:35 +08:00
2023-05-30 14:36:50 +08:00
opeInput . parameter = JsonConvert . SerializeObject ( saveSchedule ) ;
2023-05-29 18:47:35 +08:00
// 若有變更才寫入 operation_log
if ( saveSchedule . changeNames . Count > 0 ) {
2023-05-30 14:36:50 +08:00
await InsertOperation ( opeInput ) ;
2023-05-29 18:47:35 +08:00
}
2022-10-14 16:08:54 +08:00
}
apiResult . Code = "0000" ;
apiResult . Data = "成功" ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
}
return Ok ( apiResult ) ;
}
[HttpPost]
[Route("api/LightSchedule/ScheduleTable")]
public async Task < ActionResult < ApiResult < List < ScheduleTable > > > > GetLightDevice ( listfloors post )
{
List < ScheduleTable > ScheduleTable = new List < ScheduleTable > ( ) ;
ApiResult < List < ScheduleTable > > apiResult = new ApiResult < List < ScheduleTable > > ( ) ;
try
{
ScheduleTable = await backendRepository . GetAllAsync < ScheduleTable > ( $ @ "
select ls . * , sd . devicecount from light_schedule ls
left join ( select sd . light_schedule_guid , COUNT ( * ) devicecount from schedule_device sd group by sd . light_schedule_guid ) sd on sd . light_schedule_guid = ls . light_schedule_guid
where ls . floor_guid in @floors and ls . deleted = 0
",new { floors = post.Floors});
apiResult . Code = "0000" ;
apiResult . Data = ScheduleTable ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
}
return Ok ( apiResult ) ;
}
[HttpPost]
[Route("api/LightSchedule/GetOneschedule")]
public async Task < ActionResult < ApiResult < Schedule > > > GetOneschedule ( string schedule_guid )
{
ApiResult < Schedule > apiResult = new ApiResult < Schedule > ( ) ;
try
{
var OneScheduleTable = await backendRepository . GetOneAsync < Schedule > ( $ @ "
select * from light_schedule where light_schedule_guid = ' { schedule_guid } '
");
apiResult . Code = "0000" ;
apiResult . Data = OneScheduleTable ;
}
catch ( Exception exception )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + exception . Message ) ;
}
return Ok ( apiResult ) ;
}
[HttpPost]
[Route("api/LightSchedule/DeleteSchedule")]
public async Task < ActionResult < ApiResult < string > > > DeleteSchedule ( string schedule_guid )
{
ApiResult < string > apiResult = new ApiResult < string > ( ) ;
try
{
await backendRepository . DeleteOne ( schedule_guid , "light_schedule" , "light_schedule_guid" ) ;
apiResult . Code = "0000" ;
}
catch ( Exception ex )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + ex . Message ) ;
}
return apiResult ;
}
[HttpPost]
[Route("api/LightSchedule/SendAPI")]
public async Task < ActionResult < ApiResult < string > > > SendAPI ( string guid )
{
ApiResult < string > apiResult = new ApiResult < string > ( ) ;
try
{
var TimeNow = DateTime . Now . ToString ( "dddd HH:mm" ) ;
var oneSchedule = await backendRepository . GetOneAsync < Schedule > ( "light_schedule" , $" light_schedule_guid = '{guid}'" ) ;
var weeklistN = oneSchedule . week . Split ( ',' ) ;
List < string > weeklist = new List < string > ( ) ;
foreach ( var weekN in weeklistN )
{
var week = weekN switch
{
"0" = > "星期日" ,
"1" = > "星期一" ,
"2" = > "星期二" ,
"3" = > "星期三" ,
"4" = > "星期四" ,
"5" = > "星期五" ,
"6" = > "星期六" ,
_ = > ""
} ;
weeklist . Add ( week ) ;
}
var Time = TimeNow . Split ( " " ) ;
string check = "<real val='false' />" ;
if ( DateTime . Parse ( Time [ 1 ] ) > DateTime . Parse ( oneSchedule . start_time ) & & DateTime . Parse ( Time [ 1 ] ) < = DateTime . Parse ( oneSchedule . end_time ) & & weeklist . Contains ( Time [ 0 ] ) )
{
check = "<real val='true' />" ;
}
else
{
check = "<real val='false' />" ;
}
var deviceNumList = await backendRepository . GetAllAsync < string > ( @ $ "select d.device_number from schedule_device sd left join device d on sd.device_guid = d.device_guid
where light_schedule_guid = ' { guid } ' ");
foreach ( var deviceNum in deviceNumList )
{
var d = deviceNum . Split ( "_" ) ;
var html = "http://greencloud.fic.com.tw:8080/obix/config/Arena/" + $"{d[0]}/{d[1]}/{d[2]}/{d[3]}/{deviceNum}/SSC/set" ;
string authInfo = "AR_Light" + ":" + "Light12345" ;
authInfo = Convert . ToBase64String ( Encoding . Default . GetBytes ( authInfo ) ) ;
HttpWebRequest request = ( HttpWebRequest ) WebRequest . Create ( html ) ;
request . Method = "POST" ;
request . Accept = "application/json; charset=utf-8" ;
request . Headers [ "Authorization" ] = "Basic " + authInfo ;
byte [ ] byteArray = Encoding . UTF8 . GetBytes ( check ) ;
using ( Stream reqStream = request . GetRequestStream ( ) )
{
reqStream . Write ( byteArray , 0 , byteArray . Length ) ;
}
var response = ( HttpWebResponse ) request . GetResponse ( ) ;
string strResponse = "" ;
using ( var sr = new StreamReader ( response . GetResponseStream ( ) ) )
{
strResponse = sr . ReadToEnd ( ) ;
}
}
apiResult . Code = "0000" ;
}
catch ( Exception ex )
{
apiResult . Code = "9999" ;
apiResult . Msg = "系統內部錯誤,請聯絡管理者。" ;
Logger . LogError ( "【" + controllerName + "/" + actionName + "】" + ex . Message ) ;
}
return Ok ( apiResult ) ;
}
2023-05-30 14:36:50 +08:00
public async Task < bool > InsertOperation ( OperationInput input )
{
try
{
//記錄使用者操作紀錄
Dictionary < string , object > userOperatorLog = new Dictionary < string , object > ( )
{
{ "@user_guid" , myUser . userinfo_guid } ,
{ "@operation_type" , input . operation_type } , //1: 名稱修改
{ "@building_tag" , input . building_tag } ,
{ "@main_system_tag" , input . main_system_tag } ,
{ "@sub_system_tag" , input . sub_system_tag } ,
{ "@floor_tag" , input . floor_tag } ,
{ "@device_guid" , input . device_guid } ,
{ "@action_name" , input . action_name } ,
{ "@parameter" , JsonConvert . SerializeObject ( input . parameter ) } ,
} ;
await backendRepository . AddOneByCustomTable ( userOperatorLog , "operation_log" ) ;
return true ;
}
catch ( Exception ex )
{
return false ;
}
}
2022-10-14 16:08:54 +08:00
}
}