Files
Web_CRICS_Server_VS2010_Prod/RCUHost/TimingHelper/HostTimingControlHelper.cs
2025-12-11 09:17:16 +08:00

160 lines
7.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Domain;
using Dao;
using RCUHost;
using RCUHost.Protocols;
using Spring.Context;
using Spring.Context.Support;
using System.Threading.Tasks;
namespace RCUHost.TimingHelper
{
public sealed class HostTimingControlHelper
{
private static IHostRepository HostRepository { get; set; }
private static IHostTimingControlRepository HostTimingControlRepository { get; set; }
private static IRoomTypeSceneModalRepository RoomTypeSceneModalRepository { get; set; }
private static IRoomTypeSceneRepository RoomTypeSceneRepository { get; set; }
private static IDeviceControlReceiver _DeviceControlReceiver;
public static void HostTimingControl(IDeviceControlReceiver deviceControlReceiver)
{
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
_DeviceControlReceiver = deviceControlReceiver;
using (DataTable dt = HostTimingControlRepository.LoadHostTimingToExec())
{
foreach (DataRow row in dt.Rows)
{
DateTime now = DateTime.Now;
switch (Convert.ToInt16(row["TimingType"]))
{
case 0://每天定时发送场景
ExecHostTiming(row, now);
break;
case 1://每周
foreach (string week in row["TimingDay"].ToString().Split(','))
{
if (Convert.ToInt16(week) == Convert.ToInt16(now.DayOfWeek))
{
ExecHostTiming(row, now);
break;
}
}
break;
case 2://每月
foreach (string day in row["TimingDay"].ToString().Split(','))
{
if (Convert.ToInt16(day) == now.Day)
{
ExecHostTiming(row, now);
break;
}
}
break;
}
}
}
}, System.Threading.CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default);
}
/// <summary>
/// 处理定时任务
/// </summary>
/// <param name="row"></param>
/// <param name="now"></param>
private static void ExecHostTiming(DataRow row, DateTime now)
{
foreach (string timing in row["Timing"].ToString().Split(','))
{
DateTime dtTiming = Convert.ToDateTime(now.ToString("yyyy-MM-dd") + " " + timing);// row["Timing"].ToString());
double totalMinutes = (now - dtTiming).TotalMinutes;
if (totalMinutes >= 0 && totalMinutes < 6)//6分钟以内执行超过不执行
{
foreach (string hostID in row["HostIDs"].ToString().Split(','))
{
SendSceneToHost(Convert.ToInt32(hostID), Convert.ToInt32(row["RoomTypeSceneID"]), Convert.ToInt16(row["RoomStatusID"]), Convert.ToInt16(row["RoomCardTypeID"]));
}
HostTimingControl htc = HostTimingControlRepository.Get(Convert.ToInt32(row["ID"]));
htc.ExecStatus = true;
htc.ExecTime = now;
HostTimingControlRepository.Update(htc);
}
}
}
/// <summary>
/// 发送场景指令
/// </summary>
/// <param name="hostID"></param>
/// <param name="roomTypeSceneID">场景ID</param>
/// <param name="roomStatusID">房态ID</param>
/// <param name="roomCardTypeID">房卡类型ID</param>
private static void SendSceneToHost(Int32 hostID, Int32 roomTypeSceneID, int roomStatusID, int roomCardTypeID)
{
Host host = HostRepository.Get(hostID);
if (null == host)
{
return;
}
if (roomStatusID > 0 && host.RoomStatus == null)//房态空的情况
{
//return;
}
if (roomStatusID > 0 && host.RoomStatus != null && host.RoomStatus.ID != roomStatusID)
{
return;
}
//出租无人的情况下也要
if (roomCardTypeID > -1 && host.RoomCard == null)//房卡是空的情况
{
//所以下面的要注释掉
//return;
}
if (roomCardTypeID > -1 && host.RoomCard != null && host.RoomCard.RoomCardType.ID != roomCardTypeID)
{
return;
}
RoomTypeScene rts = RoomTypeSceneRepository.Get(roomTypeSceneID);
if (rts.Type == SceneType.Custom)
{
var sceneModals = RoomTypeSceneModalRepository.LoadAll(rts);
if (sceneModals.Count > 0)
{
var devices = new List<Device>();
foreach (var sceneModal in sceneModals)
{
Device device = new Device();
device.Address = sceneModal.Modal.ModalAddress;
device.AddressType = AddressType.DeviceAddress;
device.Type = sceneModal.Modal.Type;
device.Status = (byte)sceneModal.Status;
device.Brightness = (byte)sceneModal.Brightness;
device.Temperature = (byte)sceneModal.CurrentTemp;
device.FanSpeed = (byte)sceneModal.FanSpeed;
device.Mode = (byte)sceneModal.Mode;
device.Valve = (byte)sceneModal.Valve;
device.AirExecMode = (sceneModal.Status << 14) + (sceneModal.Mode << 12) + (sceneModal.FanSpeed << 10) + (sceneModal.Valve << 8) + sceneModal.CurrentTemp;//空调执行方式和内容
device.FloorHotExecMode = (sceneModal.Status << 12) + (sceneModal.Mode << 8) + (sceneModal.Valve << 6) + sceneModal.CurrentTemp;//地暖执行方式和内容
device.MusicExecMode = sceneModal.Status + (sceneModal.Brightness << 12) + (sceneModal.Mode << 8);//背景音乐执行方式和内容
devices.Add(device);
}
_DeviceControlReceiver.Send(host, devices);
}
}
else if (rts.Type == SceneType.Command)
{
Device device = new Device();
device.Address = rts.GroupAddress;
device.AddressType = AddressType.GroupAddress;
device.Status = 0x01;
_DeviceControlReceiver.Send(host, device);
}
}
}
}