diff --git a/guidescreen/GuideScreen/.vs/GuideScreen/FileContentIndex/1f66bc8b-036d-484e-9aa1-3edd160df3e6.vsidx b/guidescreen/GuideScreen/.vs/GuideScreen/FileContentIndex/1f66bc8b-036d-484e-9aa1-3edd160df3e6.vsidx deleted file mode 100644 index e3a2a9c..0000000 Binary files a/guidescreen/GuideScreen/.vs/GuideScreen/FileContentIndex/1f66bc8b-036d-484e-9aa1-3edd160df3e6.vsidx and /dev/null differ diff --git a/guidescreen/GuideScreen/.vs/GuideScreen/FileContentIndex/2ca51020-6d30-467e-9dc0-5e48816dcc37.vsidx b/guidescreen/GuideScreen/.vs/GuideScreen/FileContentIndex/2ca51020-6d30-467e-9dc0-5e48816dcc37.vsidx new file mode 100644 index 0000000..a1849bf Binary files /dev/null and b/guidescreen/GuideScreen/.vs/GuideScreen/FileContentIndex/2ca51020-6d30-467e-9dc0-5e48816dcc37.vsidx differ diff --git a/guidescreen/GuideScreen/.vs/GuideScreen/v17/.suo b/guidescreen/GuideScreen/.vs/GuideScreen/v17/.suo index 0324eea..630e88f 100644 Binary files a/guidescreen/GuideScreen/.vs/GuideScreen/v17/.suo and b/guidescreen/GuideScreen/.vs/GuideScreen/v17/.suo differ diff --git a/guidescreen/GuideScreen/GuideScreen.Common/GuideScreen.Common.csproj b/guidescreen/GuideScreen/GuideScreen.Common/GuideScreen.Common.csproj index 23cf04d..090b61e 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/GuideScreen.Common.csproj +++ b/guidescreen/GuideScreen/GuideScreen.Common/GuideScreen.Common.csproj @@ -106,9 +106,13 @@ + + + + @@ -124,6 +128,8 @@ + + diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/GSDBContext.cs b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/GSDBContext.cs index 3b97214..f150cbe 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/GSDBContext.cs +++ b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/GSDBContext.cs @@ -21,7 +21,7 @@ namespace GuideScreen.Common.Repositories /// /// 数据库上下文 /// - public class GSDBContext : DbContext + internal class GSDBContext : DbContext { //用System.Data.SQLite::SQLiteConnection创建DbConnection进行构造初始化 public GSDBContext(DbConnection dbConnection, bool contextOwnsConnection = true) @@ -47,13 +47,16 @@ namespace GuideScreen.Common.Repositories var sqliteConnectionInitializer = new MySqliteCreateDatabaseIfNotExists(modelBuilder); Database.SetInitializer(sqliteConnectionInitializer); } - public DbSet MenuEntities { get; set; } + public DbSet MenuEntities { get; set; } public DbSet SystemConfigEntities { get; set; } + public DbSet PassengerFlowStatisticsEntites { get; set; } + public DbSet PassengerFlowStatisticsDayEntites { get; set; } + } - public class MySqliteCreateDatabaseIfNotExists : SqliteCreateDatabaseIfNotExists + internal class MySqliteCreateDatabaseIfNotExists : SqliteCreateDatabaseIfNotExists { public MySqliteCreateDatabaseIfNotExists(DbModelBuilder modelBuilder) : base(modelBuilder) { diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/MenuEntity.cs b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/MenuEntity.cs index 2f666f9..33f056c 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/MenuEntity.cs +++ b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/MenuEntity.cs @@ -13,50 +13,58 @@ namespace GuideScreen.Common.Repositories.Entities /// 菜单 实体 /// [Table("menus")] - public class MenuEntity + internal class MenuEntity { /// /// 主键ID /// [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] + [Column("id")] public int ID { get; set; } /// /// 父节点ID /// [Required] + [Column("parentID")] public int ParentID { get; set; } /// /// 名称 /// [Index(IsUnique = true)] + [Column("name")] public string Name { get; set; } /// /// 图标编号 /// + [Column("symbol")] public int Symbol { get; set; } /// /// 窗体实例化地址 /// + [Column("windowUri")] public string WindowUri { get; set; } /// /// 页面编号 /// + [Column("pageIndex")] public int PageIndex { get; set; } /// /// 是否启用 /// + [Column("enabled")] public bool Enabled { get; set; } /// /// 是否需要管理员权限 /// + [Column("isAdmin")] public bool IsAdmin { get; set; } } } diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/PassengerFlowStatisticsDayEntity.cs b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/PassengerFlowStatisticsDayEntity.cs new file mode 100644 index 0000000..8ada4fa --- /dev/null +++ b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/PassengerFlowStatisticsDayEntity.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GuideScreen.Common.Repositories.Entities +{ + /// + /// 客流统计 实体 + /// + [Table("passengerFlowStatisticsDay")] + internal class PassengerFlowStatisticsDayEntity + { + /// + /// 主键 ID + /// + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [Column("id")] + public int ID { get; set; } + + /// + /// 进入人数 + /// + [Column("enterNum")] + public int EnterNum { get; set; } + + /// + /// 离开人数 + /// + [Column("leaveNum")] + public int LeaveNum { get; set; } + + /// + /// 设备IP + /// + [Column("deviceIP")] + public string DeviceIP { get; set; } + + /// + /// 创建时间 + /// + [Column("day")] + public string Day { get; set; } + + /// + /// 创建时间 + /// + [Column("createDateTime")] + public DateTime CreateDateTime { get; set; } + } +} diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/PassengerFlowStatisticsEntity.cs b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/PassengerFlowStatisticsEntity.cs new file mode 100644 index 0000000..fe66af2 --- /dev/null +++ b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/PassengerFlowStatisticsEntity.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GuideScreen.Common.Repositories.Entities +{ + /// + /// 客流统计 实体 + /// + [Table("passengerFlowStatistics")] + internal class PassengerFlowStatisticsEntity + { + /// + /// 主键 ID + /// + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [Column("id")] + public int ID { get; set; } + + /// + /// 进入人数 + /// + [Column("enterNum")] + public int EnterNum { get; set; } + + /// + /// 离开人数 + /// + [Column("leaveNum")] + public int LeaveNum { get; set; } + + /// + /// 开始时间 + /// + [Column("startTime")] + public DateTime StartTime { get; set; } + + /// + /// 结束时间 + /// + [Column("endTime")] + public DateTime EndTime { get; set; } + + /// + /// 设备IP + /// + [Column("deviceIP")] + public string DeviceIP { get; set; } + + /// + /// 创建时间 + /// + [Column("createDateTime")] + public DateTime CreateDateTime { get; set; } + } +} diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/SystemConfigEntity.cs b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/SystemConfigEntity.cs index 187db91..5e329e8 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/SystemConfigEntity.cs +++ b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Entities/SystemConfigEntity.cs @@ -12,41 +12,47 @@ namespace GuideScreen.Common.Repositories.Entities /// 系统参数 /// [Table("systemConfig")] - public class SystemConfigEntity + internal class SystemConfigEntity { /// /// 主键ID /// [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [Column("id")] public int ID { get; set; } /// /// 参数名称 /// [Required] + [Column("configName")] public string ConfigName { get; set; } /// /// 参数键值 /// [Index(IsUnique = true)] + [Column("configKey")] public string ConfigKey { get; set; } /// /// 参数值 /// [Required] + [Column("configValue")] public string ConfigValue { get; set; } /// /// 描述 /// + [Column("remarks")] public string Remarks { get; set; } /// /// 是否启用 /// + [Column("enabled")] public bool Enabled { get; set; } } } diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/IPassengerFlowStatisticsRepository.cs b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/IPassengerFlowStatisticsRepository.cs new file mode 100644 index 0000000..32a5906 --- /dev/null +++ b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/IPassengerFlowStatisticsRepository.cs @@ -0,0 +1,17 @@ +using GuideScreen.Common.Common; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GuideScreen.Common.Repositories +{ + /// + /// 客流统计 数据层 接口 + /// + public interface IPassengerFlowStatisticsRepository : IDependency + { + + } +} diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/ISystemRepository.cs b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/ISystemRepository.cs index 2aeca8d..088b96e 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/ISystemRepository.cs +++ b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/ISystemRepository.cs @@ -13,7 +13,7 @@ namespace GuideScreen.Common.Repositories /// /// 系统相关 数据层 接口 /// - public interface ISystemRepository: IDependency + internal interface ISystemRepository: IDependency { /// /// 获取系统菜单 diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Impl/PassengerFlowStatisticsRepository.cs b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Impl/PassengerFlowStatisticsRepository.cs new file mode 100644 index 0000000..a7460a4 --- /dev/null +++ b/guidescreen/GuideScreen/GuideScreen.Common/Repositories/Impl/PassengerFlowStatisticsRepository.cs @@ -0,0 +1,143 @@ +using GuideScreen.Common.Common; +using GuideScreen.Common.Repositories.Entities; +using GuideScreen.Common.Services.Models; +using Masuit.Tools; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GuideScreen.Common.Repositories.Impl +{ + /// + /// 客流统计 数据层 实现 + /// + internal class PassengerFlowStatisticsRepository : IPassengerFlowStatisticsRepository + { + /// + /// 添加客流信息 + /// + /// + public void AddPassengerFlowStatistics(PassengerFlowStatisticsEntity entity) + { + var dateStr = entity.EndTime.ToString("yyyy-MM-dd"); + using (var context = GSDBContext.GetDbContext()) + { + var dayEntity = context.PassengerFlowStatisticsDayEntites.Where(f => f.Day == dateStr).FirstOrDefault(); + entity.CreateDateTime = DateTime.Now; + if (dayEntity == null) + { + dayEntity = new PassengerFlowStatisticsDayEntity(); + dayEntity.Day = dateStr; + dayEntity.EnterNum = entity.EnterNum; + dayEntity.LeaveNum = entity.LeaveNum; + dayEntity.DeviceIP = entity.DeviceIP; + dayEntity.CreateDateTime = entity.CreateDateTime; + context.PassengerFlowStatisticsDayEntites.Add(dayEntity); + } + else + { + dayEntity.EnterNum += entity.EnterNum; + dayEntity.LeaveNum += entity.LeaveNum; + } + context.PassengerFlowStatisticsEntites.Add(entity); + context.SaveChanges(); + } + } + + /// + /// 获取当天客流量统计 + /// + /// + /// + public PassengerFlowStatisticsModel GetPassengerFlowStatisticsDayTotal(DateTime date) + { + var dateStr = date.ToString("yyyy-MM-dd"); + PassengerFlowStatisticsModel model = new PassengerFlowStatisticsModel(); + using (var context = GSDBContext.GetDbContext()) + { + var entity = context.PassengerFlowStatisticsDayEntites.Where(f => f.Day == dateStr).FirstOrDefault(); + if (entity != null) + { + model = ModelTools.PubClone.Trans(entity); + } + return model; + } + } + + /// + /// 获取周客流量统计 + /// + /// + /// + public List GetPassengerFlowStatisticsWeekTotal(DateTime date) + { + var endDay = DateTime.Parse(date.ToString("yyyy-MM-dd")).AddDays(1).AddSeconds(-1); + var begDay = DateTime.MinValue; + int week = (int)date.DayOfWeek; + if (week == 0) + { + begDay = endDay.AddDays(-6); + } + else + { + begDay = endDay.AddDays(-(week - 1)); + } + + begDay = DateTime.Parse(endDay.ToString("yyyy-MM-dd")); + var weekTotal = new List(); + using (var context = GSDBContext.GetDbContext()) + { + var values = context.PassengerFlowStatisticsDayEntites.Where(f => f.CreateDateTime >= begDay && f.CreateDateTime <= endDay).OrderBy(f => f.CreateDateTime).Select(f => new + { + f.EnterNum, + f.LeaveNum, + f.CreateDateTime, + }).ToArray(); + weekTotal = values.Select(f => new PassengerFlowStatisticsTotalModel + { + EnterNum = f.EnterNum, + LeaveNum = f.LeaveNum, + XTypeName = ConvertDayOfWeek(f.CreateDateTime.DayOfWeek) + } + ).ToList(); + + return weekTotal; + } + } + + private string ConvertDayOfWeek(DayOfWeek dayOfWeek) + { + var value = string.Empty; + switch (dayOfWeek) + { + case DayOfWeek.Sunday: + value = "星期天"; + break; + case DayOfWeek.Monday: + value = "星期一"; + break; + case DayOfWeek.Tuesday: + value = "星期二"; + break; + case DayOfWeek.Wednesday: + value = "星期三"; + break; + case DayOfWeek.Thursday: + value = "星期四"; + break; + case DayOfWeek.Friday: + value = "星期五"; + break; + case DayOfWeek.Saturday: + value = "星期六"; + break; + default: + break; + } + + return value; + } + } +} diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Services/IPLCCommunicationService.cs b/guidescreen/GuideScreen/GuideScreen.Common/Services/IPLCCommunicationService.cs index 806acc7..339807b 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/Services/IPLCCommunicationService.cs +++ b/guidescreen/GuideScreen/GuideScreen.Common/Services/IPLCCommunicationService.cs @@ -16,115 +16,227 @@ namespace GuideScreen.Common.Services /// public interface IPLCCommunicationService : IDependency { - event EventHandler ErrorMessage; + #region 同步 + /// + /// 连接PLC(长连接) + /// + /// + /// + PLCResult Connection(string address, int port = 0); + + + /// + /// 关闭连接PLC(长连接) + /// + PLCResult ColseConnection(); + + /// + /// 读取指定地址的bool值 + /// + /// + /// + PLCResult ReadBool(string address); + + /// + /// 读取指定地址的byte值 + /// + /// + /// + PLCResult ReadByte(string address); + + /// + /// 读取指定地址的Int16值 + /// + /// + /// + PLCResult ReadInt16(string address); + + /// + /// 读取指定地址的Int32值 + /// + /// + /// + PLCResult ReadInt32(string address); + + /// + /// 读取指定地址的long值 + /// + /// + /// + PLCResult ReadLong(string address); + + /// + /// 读取指定地址的Float值 + /// + /// + PLCResult ReadFloat(string address); + + /// + /// 读取指定地址的double值 + /// + /// + PLCResult ReadDouble(string address); + + /// + /// 写入bool值 + /// + /// 写入地址 + /// + PLCResult Write(string address, bool value); + + /// + /// 写入byte值 + /// + /// 写入地址 + /// + PLCResult Write(string address, byte value); + + /// + /// 写入Int16值 + /// + /// 写入地址 + /// + PLCResult Write(string address, Int16 value); - event EventHandler InfoMessage; + /// + /// 写入Int32值 + /// + /// 写入地址 + /// + PLCResult Write(string address, Int32 value); + + /// + /// 写入float值 + /// + /// 写入地址 + /// + PLCResult Write(string address, float value); + + /// + /// 写入double值 + /// + /// 写入地址 + /// + PLCResult Write(string address, double value); + + /// + /// 写入long值 + /// + /// 写入地址 + /// + PLCResult Write(string address, long value); + + #endregion + + #region 异步 /// /// 连接PLC(长连接) /// /// /// - void Connection(string address, int port = 0); + Task ConnectionAsync(string address, int port = 0); /// /// 关闭连接PLC(长连接) /// - void ColseConnection(); + Task ColseConnectionAsyn(); /// /// 读取指定地址的bool值 /// /// /// - bool ReadBool(string address); + Task> ReadBoolAsync(string address); /// /// 读取指定地址的byte值 /// /// /// - byte ReadByte(string address); + Task> ReadByteAsync(string address); /// /// 读取指定地址的Int16值 /// /// /// - int ReadInt16(string address); + Task> ReadInt16Async(string address); /// /// 读取指定地址的Int32值 /// /// /// - int ReadInt32(string address); + Task> ReadInt32Async(string address); /// /// 读取指定地址的long值 /// /// /// - long ReadLong(string address); + Task> ReadLongAsync(string address); /// /// 读取指定地址的Float值 /// /// - float ReadFloat(string address); + Task> ReadFloatAsync(string address); /// /// 读取指定地址的double值 /// /// - double ReadDouble(string address); + Task> ReadDoubleAsync(string address); /// /// 写入bool值 /// /// 写入地址 /// - void Write(string address, bool value); + Task WriteAsync(string address, bool value); /// /// 写入byte值 /// /// 写入地址 /// - void Write(string address, byte value); + Task WriteAsync(string address, byte value); /// /// 写入Int16值 /// /// 写入地址 /// - void Write(string address, Int16 value); + Task WriteAsync(string address, Int16 value); /// /// 写入Int32值 /// /// 写入地址 /// - void Write(string address, Int32 value); + Task WriteAsync(string address, Int32 value); /// /// 写入float值 /// /// 写入地址 /// - void Write(string address, float value); + Task WriteAsync(string address, float value); /// /// 写入double值 /// /// 写入地址 /// - void Write(string address, double value); + Task WriteAsync(string address, double value); /// /// 写入long值 /// /// 写入地址 /// - void Write(string address, long value); + Task WriteAsync(string address, long value); + + #endregion } } diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Services/IPassengerFlowStatisticsService.cs b/guidescreen/GuideScreen/GuideScreen.Common/Services/IPassengerFlowStatisticsService.cs index 298df2e..8a3491d 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/Services/IPassengerFlowStatisticsService.cs +++ b/guidescreen/GuideScreen/GuideScreen.Common/Services/IPassengerFlowStatisticsService.cs @@ -1,9 +1,14 @@ using GuideScreen.Common.Common; +using GuideScreen.Common.Services.Models; +using GuideScreen.SDK.Monitoring; using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; +using static GuideScreen.SDK.Monitoring.CHCNetSDK; namespace GuideScreen.Common.Services { @@ -12,6 +17,56 @@ namespace GuideScreen.Common.Services /// public interface IPassengerFlowStatisticsService : IDependency { + event EventHandler ActionEvent; + event EventHandler ExceptionEvent; + + + /// + /// 视频设备SDK初始化 + /// + /// + bool Init(); + + /// + /// 释放SDK资源 + /// + void CleaUp(); + + /// + /// 登录视频设备 + /// + /// Ip地址 + /// 端口 + /// 用户名 + /// 密码 + void Login(string ipAddress, int port, string userName, string password); + + /// + /// 登出 + /// + void Logout(); + + /// + /// 部防 + /// + /// + void OpenAlarm(); + + /// + /// 撤防 + /// + void CloseAlarm(); + + /// + /// 启用监听 + /// + /// + void StartListen(string listenIpAddress, int port); + + /// + /// 关闭监听 + /// + void CloseListen(string ListenIpAddress); } } diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PLCCommunicationService.cs b/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PLCCommunicationService.cs index 302120a..12113bb 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PLCCommunicationService.cs +++ b/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PLCCommunicationService.cs @@ -26,10 +26,6 @@ namespace GuideScreen.Common.Services.Impl { private SiemensS7Net siemensS7Net = null; - public event EventHandler ErrorMessage = null; - - public event EventHandler InfoMessage = null; - public PLCCommunicationService() { siemensS7Net = new SiemensS7Net(SiemensPLCS.S200Smart); @@ -42,22 +38,26 @@ namespace GuideScreen.Common.Services.Impl /// /// /// - public void Connection(string address, int port = 0) + public PLCResult Connection(string address, int port = 0) { siemensS7Net.IpAddress = address; if (port > 0) { siemensS7Net.Port = port; } - siemensS7Net.ConnectServer(); + var operateResult = siemensS7Net.ConnectServer(); + var result = ConvertResult(operateResult); + return result; } /// /// 关闭连接PLC(长连接) /// - public void ColseConnection() + public PLCResult ColseConnection() { - siemensS7Net.ConnectClose(); + var operateResult = siemensS7Net.ConnectClose(); + var result = ConvertResult(operateResult); + return result; } /// @@ -65,11 +65,11 @@ namespace GuideScreen.Common.Services.Impl /// /// /// - public bool ReadBool(string address) + public PLCResult ReadBool(string address) { - var result = siemensS7Net.ReadBool(address); - VerifyResult(result, address); - return result.Content; + var operateResult = siemensS7Net.ReadBool(address); + var result = ConvertResult(operateResult); + return result; } /// @@ -77,11 +77,11 @@ namespace GuideScreen.Common.Services.Impl /// /// /// - public byte ReadByte(string address) + public PLCResult ReadByte(string address) { - var result = siemensS7Net.ReadByte(address); - VerifyResult(result, address); - return result.Content; + var operateResult = siemensS7Net.ReadByte(address); + var result = ConvertResult(operateResult); + return result; } /// @@ -89,11 +89,11 @@ namespace GuideScreen.Common.Services.Impl /// /// /// - public int ReadInt16(string address) + public PLCResult ReadInt16(string address) { - var result = siemensS7Net.ReadInt16(address); - VerifyResult(result, address); - return result.Content; + var operateResult = siemensS7Net.ReadInt16(address); + var result = ConvertResult(operateResult); + return result; } /// @@ -101,11 +101,11 @@ namespace GuideScreen.Common.Services.Impl /// /// /// - public int ReadInt32(string address) + public PLCResult ReadInt32(string address) { - var result = siemensS7Net.ReadInt32(address); - VerifyResult(result, address); - return result.Content; + var operateResult = siemensS7Net.ReadInt32(address); + var result = ConvertResult(operateResult); + return result; } /// @@ -113,33 +113,33 @@ namespace GuideScreen.Common.Services.Impl /// /// /// - public long ReadLong(string address) + public PLCResult ReadLong(string address) { - var result = siemensS7Net.ReadInt64(address); - VerifyResult(result, address); - return result.Content; + var operateResult = siemensS7Net.ReadInt64(address); + var result = ConvertResult(operateResult); + return result; } /// /// 读取指定地址的Float值 /// /// - public float ReadFloat(string address) + public PLCResult ReadFloat(string address) { - var result = siemensS7Net.ReadFloat(address); - VerifyResult(result, address); - return result.Content; + var operateResult = siemensS7Net.ReadFloat(address); + var result = ConvertResult(operateResult); + return result; } /// /// 读取指定地址的double值 /// /// - public double ReadDouble(string address) + public PLCResult ReadDouble(string address) { - var result = siemensS7Net.ReadDouble(address); - VerifyResult(result, address); - return result.Content; + var operateResult = siemensS7Net.ReadDouble(address); + var result = ConvertResult(operateResult); + return result; } /// @@ -147,10 +147,11 @@ namespace GuideScreen.Common.Services.Impl /// /// 写入地址 /// - public void Write(string address, bool value) + public PLCResult Write(string address, bool value) { - var result = siemensS7Net.Write(address, value); - VerifyResult(result, address, value); + var operateResult = siemensS7Net.Write(address, value); + var result = ConvertResult(operateResult); + return result; } /// @@ -158,10 +159,12 @@ namespace GuideScreen.Common.Services.Impl /// /// 写入地址 /// - public void Write(string address, byte value) + public PLCResult Write(string address, byte value) { - var result = siemensS7Net.Write(address, value); - VerifyResult(result, address, value); + var operateResult = siemensS7Net.Write(address, value); + var result = ConvertResult(operateResult); + return result; + } /// @@ -169,10 +172,11 @@ namespace GuideScreen.Common.Services.Impl /// /// 写入地址 /// - public void Write(string address, Int16 value) + public PLCResult Write(string address, Int16 value) { - var result = siemensS7Net.Write(address, value); - VerifyResult(result, address, value); + var operateResult = siemensS7Net.Write(address, value); + var result = ConvertResult(operateResult); + return result; } /// @@ -180,10 +184,11 @@ namespace GuideScreen.Common.Services.Impl /// /// 写入地址 /// - public void Write(string address, Int32 value) + public PLCResult Write(string address, Int32 value) { - var result = siemensS7Net.Write(address, value); - VerifyResult(result, address, value); + var operateResult = siemensS7Net.Write(address, value); + var result = ConvertResult(operateResult); + return result; } /// @@ -191,10 +196,11 @@ namespace GuideScreen.Common.Services.Impl /// /// 写入地址 /// - public void Write(string address, float value) + public PLCResult Write(string address, float value) { - var result = siemensS7Net.Write(address, value); - VerifyResult(result, address, value); + var operateResult = siemensS7Net.Write(address, value); + var result = ConvertResult(operateResult); + return result; } /// @@ -202,10 +208,11 @@ namespace GuideScreen.Common.Services.Impl /// /// 写入地址 /// - public void Write(string address, double value) + public PLCResult Write(string address, double value) { - var result = siemensS7Net.Write(address, value); - VerifyResult(result, address, value); + var operateResult = siemensS7Net.Write(address, value); + var result = ConvertResult(operateResult); + return result; } /// @@ -213,10 +220,11 @@ namespace GuideScreen.Common.Services.Impl /// /// 写入地址 /// - public void Write(string address, long value) + public PLCResult Write(string address, long value) { - var result = siemensS7Net.Write(address, value); - VerifyResult(result, address, value); + var operateResult = siemensS7Net.Write(address, value); + var result = ConvertResult(operateResult); + return result; } #endregion @@ -257,7 +265,6 @@ namespace GuideScreen.Common.Services.Impl public async Task> ReadBoolAsync(string address) { var operateResult = await siemensS7Net.ReadBoolAsync(address); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -270,7 +277,6 @@ namespace GuideScreen.Common.Services.Impl public async Task> ReadByteAsync(string address) { var operateResult = await siemensS7Net.ReadByteAsync(address); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -283,7 +289,6 @@ namespace GuideScreen.Common.Services.Impl public async Task> ReadInt16Async(string address) { var operateResult = await siemensS7Net.ReadInt16Async(address); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -296,7 +301,6 @@ namespace GuideScreen.Common.Services.Impl public async Task> ReadInt32Async(string address) { var operateResult = await siemensS7Net.ReadInt32Async(address); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -309,7 +313,6 @@ namespace GuideScreen.Common.Services.Impl public async Task> ReadLongAsync(string address) { var operateResult = await siemensS7Net.ReadInt64Async(address); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -321,7 +324,6 @@ namespace GuideScreen.Common.Services.Impl public async Task> ReadFloatAsync(string address) { var operateResult = await siemensS7Net.ReadFloatAsync(address); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -333,7 +335,6 @@ namespace GuideScreen.Common.Services.Impl public async Task> ReadDoubleAsync(string address) { var operateResult = await siemensS7Net.ReadDoubleAsync(address); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -346,7 +347,6 @@ namespace GuideScreen.Common.Services.Impl public async Task WriteAsync(string address, bool value) { var operateResult = await siemensS7Net.WriteAsync(address, value); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -360,7 +360,6 @@ namespace GuideScreen.Common.Services.Impl { var operateResult = await siemensS7Net.WriteAsync(address, value); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -373,7 +372,6 @@ namespace GuideScreen.Common.Services.Impl public async Task WriteAsync(string address, Int16 value) { var operateResult = await siemensS7Net.WriteAsync(address, value); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -386,7 +384,6 @@ namespace GuideScreen.Common.Services.Impl public async Task WriteAsync(string address, Int32 value) { var operateResult = await siemensS7Net.WriteAsync(address, value); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -399,7 +396,6 @@ namespace GuideScreen.Common.Services.Impl public async Task WriteAsync(string address, float value) { var operateResult = await siemensS7Net.WriteAsync(address, value); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -412,7 +408,6 @@ namespace GuideScreen.Common.Services.Impl public async Task WriteAsync(string address, double value) { var operateResult = await siemensS7Net.WriteAsync(address, value); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } @@ -425,61 +420,13 @@ namespace GuideScreen.Common.Services.Impl public async Task WriteAsync(string address, long value) { var operateResult = await siemensS7Net.WriteAsync(address, value); - VerifyResult(operateResult); var result = ConvertResult(operateResult); return result; } #endregion - /// - /// 验证结果 如果启用了 ErrorMessage 就不抛出异常信息 - /// - /// - /// - /// - private bool VerifyResult(OperateResult result, string address = "", object value = null) - { - - var message = $"address:{address}"; - if (value != null) - { - message += $",value:{value}"; - } - - object content = null; - - if (result.GetProperties().Where(f => f.Name == "Content").Count() > 0) - { - content = result.GetProperty("Content"); - } - if (content != null) - { - message += $",content:{content}"; - } - - message += "," + result.Message; - - if (result.IsSuccess) - { - InfoMessage.Invoke(this, "PLC信息:" + message); - return true; - } - else - { - if (ErrorMessage == null) - { - throw new Exception(result.Message); - } - else - { - ErrorMessage.Invoke(this, "PLC异常:" + message); - return false; - } - } - - } - + /// /// 转换 result (将框架结果结构转换成当前程序结果结构) /// diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PLCControllerService.cs b/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PLCControllerService.cs index 05f52c0..70e544d 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PLCControllerService.cs +++ b/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PLCControllerService.cs @@ -1,4 +1,5 @@ using GuideScreen.Common.Common; +using Masuit.Tools.Reflection; using System; using System.Collections.Generic; using System.Linq; @@ -21,8 +22,6 @@ namespace GuideScreen.Common.Services.Impl public PLCControllerService(IPLCCommunicationService pLCCommunicationService) { this.pLCCommunicationService = pLCCommunicationService; - this.pLCCommunicationService.ErrorMessage += PLCCommunicationService_ErrorMessage; - this.pLCCommunicationService.InfoMessage += PLCCommunicationService_InfoMessage; ; } private void PLCCommunicationService_InfoMessage(object sender, string e) @@ -59,8 +58,58 @@ namespace GuideScreen.Common.Services.Impl /// public bool GetHeartbeat() { - var ret = this.pLCCommunicationService.ReadBool(PLCPointConstants.HeartbeatSignal); - return ret; + var result = this.pLCCommunicationService.ReadBool(PLCPointConstants.HeartbeatSignal); + var res = VerifyResult(result, PLCPointConstants.HeartbeatSignal); + return res; } + + /// + /// 验证结果 如果启用了 ErrorMessage 就不抛出异常信息 + /// + /// + /// + /// + private bool VerifyResult(PLCResult result, string address = "", object value = null) + { + + var message = $"address:{address}"; + if (value != null) + { + message += $",value:{value}"; + } + + object content = null; + + if (result.GetProperties().Where(f => f.Name == "Content").Count() > 0) + { + content = result.GetProperty("Content"); + } + if (content != null) + { + message += $",content:{content}"; + } + + message += "," + result.Message; + + if (result.IsSuccess) + { + InfoMessage.Invoke(this, "PLC信息:" + message); + return true; + } + else + { + if (ErrorMessage == null) + { + throw new Exception(result.Message); + } + else + { + ErrorMessage.Invoke(this, "PLC异常:" + message); + return false; + } + } + + } + } } diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PassengerFlowStatisticsService.cs b/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PassengerFlowStatisticsService.cs index 5c0fb13..da8a5ad 100644 --- a/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PassengerFlowStatisticsService.cs +++ b/guidescreen/GuideScreen/GuideScreen.Common/Services/Impl/PassengerFlowStatisticsService.cs @@ -1,21 +1,341 @@ -using System; +using GuideScreen.Common.Services.Models; +using GuideScreen.SDK.Monitoring; +using System; using System.Collections.Generic; +using System.Diagnostics.Tracing; +using System.IO; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; +using System.Windows.Input; +using static GuideScreen.SDK.Monitoring.CHCNetSDK; namespace GuideScreen.Common.Services.Impl { /// /// 客流统计服务 实现 /// - internal class PassengerFlowStatisticsService : IPassengerFlowStatisticsService + internal class PassengerFlowStatisticsServiceByHikvision : IPassengerFlowStatisticsService { - public void Init(string ipAddress, string port, string name, string pwd) + + private CHCNetSDK.UNION_STATTIME m_struStatTime = new CHCNetSDK.UNION_STATTIME(); + private CHCNetSDK.UNION_STATFRAME m_struStatFrame = new CHCNetSDK.UNION_STATFRAME(); + + public CHCNetSDK.LOGINRESULTCALLBACK LoginCallBack = null; + private CHCNetSDK.EXCEPYIONCALLBACK m_fExceptionCB = null; + private CHCNetSDK.MSGCallBack_V31 m_falarmData_V31 = null; + private CHCNetSDK.MSGCallBack m_falarmData = null; + + public event EventHandler ActionEvent; + public event EventHandler ExceptionEvent; + + private int lUserID; + private int lAlarmHandle; + private int iListenHandle; + + /// + /// 视频设备SDK初始化 + /// + /// + public bool Init() { + bool m_bInitSDK = CHCNetSDK.NET_DVR_Init(); + if (!m_bInitSDK) + { + return false; + } + //保存SDK日志 To save the SDK log + CHCNetSDK.NET_DVR_SetLogToFile(3, Path.Combine(AppContext.BaseDirectory, "SdkLog"), true); + + //设置透传报警信息类型 + CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struLocalCfg = new CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG(); + struLocalCfg.byAlarmJsonPictureSeparate = 1;//控制JSON透传报警数据和图片是否分离,0-不分离(COMM_VCA_ALARM返回),1-分离(分离后走COMM_ISAPI_ALARM回调返回) + + Int32 nSize = Marshal.SizeOf(struLocalCfg); + IntPtr ptrLocalCfg = Marshal.AllocHGlobal(nSize); + Marshal.StructureToPtr(struLocalCfg, ptrLocalCfg, false); + + if (!CHCNetSDK.NET_DVR_SetSDKLocalCfg(17, ptrLocalCfg)) //NET_DVR_LOCAL_CFG_TYPE_GENERAL + { + var iLastErr = CHCNetSDK.NET_DVR_GetLastError(); + var strErr = "NET_DVR_SetSDKLocalCfg failed, error code= " + iLastErr; + throw new Exception(strErr); + } + Marshal.FreeHGlobal(ptrLocalCfg); + //设置异常消息回调函数 + if (m_fExceptionCB == null) + { + m_fExceptionCB = new CHCNetSDK.EXCEPYIONCALLBACK(cbExceptionCB); + } + CHCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, IntPtr.Zero, m_fExceptionCB, IntPtr.Zero); + + //设置报警回调函数 + if (m_falarmData_V31 == null) + { + m_falarmData_V31 = new CHCNetSDK.MSGCallBack_V31(ProcessCommAlarm_PDC); + } + + CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(m_falarmData_V31, IntPtr.Zero); + + return true; + } + + /// + /// 释放SDK资源 + /// + public void CleaUp() + { + //释放SDK资源,在程序结束之前调用 + CHCNetSDK.NET_DVR_Cleanup(); } - + /// + /// 登录视频设备 + /// + /// Ip地址 + /// 端口 + /// 用户名 + /// 密码 + public void Login(string ipAddress, int port, string userName, string password) + { + CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO(); + + //设备IP地址或者域名 + byte[] byIP = System.Text.Encoding.Default.GetBytes(ipAddress); + struLogInfo.sDeviceAddress = new byte[129]; + byIP.CopyTo(struLogInfo.sDeviceAddress, 0); + + //设备用户名 + byte[] byUserName = System.Text.Encoding.Default.GetBytes(userName); + struLogInfo.sUserName = new byte[64]; + byUserName.CopyTo(struLogInfo.sUserName, 0); + + //设备密码 + byte[] byPassword = System.Text.Encoding.Default.GetBytes(password); + struLogInfo.sPassword = new byte[64]; + byPassword.CopyTo(struLogInfo.sPassword, 0); + + struLogInfo.wPort = (ushort)port;//设备服务端口号 + + struLogInfo.cbLoginResult = LoginCallBack; + struLogInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 + + if ((struLogInfo.bUseAsynLogin == true) && (LoginCallBack == null)) + { + LoginCallBack = new CHCNetSDK.LOGINRESULTCALLBACK((lUserID, dwResult, lpDeviceInfo, pUser) => //注册回调函数 + { + string strLoginCallBack = $"登录设备,lUserID:{lUserID},dwResult:{dwResult}"; + + if (dwResult == 0) + { + uint iErrCode = CHCNetSDK.NET_DVR_GetLastError(); + strLoginCallBack += ",错误号:" + iErrCode; + throw new Exception(strLoginCallBack); + } + else + { + strLoginCallBack.WriteInfoLog(); + } + }); + } + + struLogInfo.byLoginMode = 0; //0-Private, 1-ISAPI, 2-自适应 + struLogInfo.byHttps = 0; //0-不适用tls,1-使用tls 2-自适应 + + CHCNetSDK.NET_DVR_DEVICEINFO_V40 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40(); + + //登录设备 Login the device + var m_lUserID = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo); + if (m_lUserID < 0) + { + var iLastErr = CHCNetSDK.NET_DVR_GetLastError(); + var strErr = $"NET_DVR_Login_V30 failed, error code= {iLastErr}"; //登录失败,输出错误号 Failed to login and output the error code + throw new Exception(strErr); + } + } + + /// + /// 登出 + /// + public void Logout() + { + if (lUserID > 0) + { + CHCNetSDK.NET_DVR_Logout(lUserID); + lUserID = -1; + } + } + + /// + /// 部防 + /// + /// + public void OpenAlarm() + { + CHCNetSDK.NET_DVR_SETUPALARM_PARAM struAlarmParam = new CHCNetSDK.NET_DVR_SETUPALARM_PARAM(); + struAlarmParam.dwSize = (uint)Marshal.SizeOf(struAlarmParam); + struAlarmParam.byLevel = 1; //0- 一级布防,1- 二级布防 + struAlarmParam.byAlarmInfoType = 1;//智能交通设备有效,新报警信息类型 + struAlarmParam.byFaceAlarmDetection = 1;//1-人脸侦测 + lAlarmHandle = CHCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, ref struAlarmParam); + if (lAlarmHandle < 0) + { + var iLastErr = CHCNetSDK.NET_DVR_GetLastError(); + var strErr = $"布防失败,错误号:{iLastErr}"; //布防失败,输出错误号 + throw new Exception(strErr) ; + } + else + { + "布防成功".WriteInfoLog(); + } + } + + /// + /// 撤防 + /// + public void CloseAlarm() + { + if (lAlarmHandle < 0) + { + return; + } + if (!CHCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)) + { + var iLastErr = CHCNetSDK.NET_DVR_GetLastError(); + var strErr = "撤防失败,错误号:" + iLastErr; //撤防失败,输出错误号 + throw new Exception(strErr); + } + else + { + "撤防成功".WriteInfoLog(); + lAlarmHandle = -1; + } + } + + /// + /// 启用监听 + /// + /// + public void StartListen(string listenIpAddress,int port) + { + + if (m_falarmData == null) + { + m_falarmData = new CHCNetSDK.MSGCallBack(MsgCallback); + } + + iListenHandle = CHCNetSDK.NET_DVR_StartListen_V30(listenIpAddress, (ushort)port, m_falarmData, IntPtr.Zero); + if (iListenHandle < 0) + { + var iLastErr = CHCNetSDK.NET_DVR_GetLastError(); + var strErr = "启动监听失败,错误号:" + iLastErr; //撤防失败,输出错误号 + throw new Exception(strErr); + } + else + { + "成功启动监听!".WriteInfoLog(); + } + } + + /// + /// 关闭监听 + /// + public void CloseListen(string ListenIpAddress) + { + if (iListenHandle < 0) + { + return; + } + if (!CHCNetSDK.NET_DVR_StopListen_V30(iListenHandle)) + { + var iLastErr = CHCNetSDK.NET_DVR_GetLastError(); + var strErr = "停止监听失败,错误号:" + iLastErr; //撤防失败,输出错误号 + throw new Exception(strErr); + } + else + { + "停止监听!".WriteInfoLog(); + iListenHandle = -1; + } + } + + private void cbExceptionCB(uint dwType, int lUserID, int lHandle, IntPtr pUser) + { + //异常消息信息类型 + string stringAlarm = $"异常消息回调,信息类型:0x{Convert.ToString(dwType, 16)}, lUserID:{lUserID}, lHandle:{lHandle}"; + + } + + private void MsgCallback(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser) + { + //通过lCommand来判断接收到的报警信息类型,不同的lCommand对应不同的pAlarmInfo内容 + ProcessCommAlarm_PDC(lCommand, ref pAlarmer, pAlarmInfo, dwBufLen, pUser); + } + + private bool ProcessCommAlarm_PDC(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser) + { + //只记录客流统计 + if (lCommand != CHCNetSDK.COMM_ALARM_PDC) + { + return true; + } + CHCNetSDK.NET_DVR_PDC_ALRAM_INFO struPDCInfo = new CHCNetSDK.NET_DVR_PDC_ALRAM_INFO(); + uint dwSize = (uint)Marshal.SizeOf(struPDCInfo); + struPDCInfo = (CHCNetSDK.NET_DVR_PDC_ALRAM_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_PDC_ALRAM_INFO)); + + string stringAlarm = $"客流量统计,进入人数:{struPDCInfo.dwEnterNum},离开人数:{struPDCInfo.dwLeaveNum}"; + + uint dwUnionSize = (uint)Marshal.SizeOf(struPDCInfo.uStatModeParam); + IntPtr ptrPDCUnion = Marshal.AllocHGlobal((Int32)dwUnionSize); + Marshal.StructureToPtr(struPDCInfo.uStatModeParam, ptrPDCUnion, false); + + if (struPDCInfo.byMode == 0) //单帧统计结果,此处为UTC时间 + { + m_struStatFrame = (CHCNetSDK.UNION_STATFRAME)Marshal.PtrToStructure(ptrPDCUnion, typeof(CHCNetSDK.UNION_STATFRAME)); + stringAlarm = $"{stringAlarm},单帧统计,相对时标:{m_struStatFrame.dwRelativeTime},绝对时标:{m_struStatFrame.dwAbsTime}"; + } + string strStartTime=string.Empty, strEndTime=string.Empty; + if (struPDCInfo.byMode == 1) //最小时间段统计结果 + { + m_struStatTime = (CHCNetSDK.UNION_STATTIME)Marshal.PtrToStructure(ptrPDCUnion, typeof(CHCNetSDK.UNION_STATTIME)); + + //开始时间 + strStartTime = string.Format("{0:D4}", m_struStatTime.tmStart.dwYear) + + string.Format("{0:D2}", m_struStatTime.tmStart.dwMonth) + + string.Format("{0:D2}", m_struStatTime.tmStart.dwDay) + " " + + string.Format("{0:D2}", m_struStatTime.tmStart.dwHour) + ":" + + string.Format("{0:D2}", m_struStatTime.tmStart.dwMinute) + ":" + + string.Format("{0:D2}", m_struStatTime.tmStart.dwSecond); + + //结束时间 + strEndTime = string.Format("{0:D4}", m_struStatTime.tmEnd.dwYear) + + string.Format("{0:D2}", m_struStatTime.tmEnd.dwMonth) + + string.Format("{0:D2}", m_struStatTime.tmEnd.dwDay) + " " + + string.Format("{0:D2}", m_struStatTime.tmEnd.dwHour) + ":" + + string.Format("{0:D2}", m_struStatTime.tmEnd.dwMinute) + ":" + + string.Format("{0:D2}", m_struStatTime.tmEnd.dwSecond); + + stringAlarm = $"{stringAlarm},最小时间段统计,开始时间:{strStartTime},结束时间:{strEndTime}"; + } + Marshal.FreeHGlobal(ptrPDCUnion); + + //写入日志 + stringAlarm.WriteInfoLog(); + + //报警设备IP地址 + string strIP = Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0'); + + var model = new PassengerFlowStatisticsModel + { + EnterNum = (int)struPDCInfo.dwEnterNum, + LeaveNum= (int)struPDCInfo.dwLeaveNum, + StartTime=DateTime.Parse(strStartTime), + EndTime= DateTime.Parse(strEndTime), + }; + ActionEvent?.Invoke(this, model); + return true; + } } } diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Services/Models/PassengerFlowStatisticsModel.cs b/guidescreen/GuideScreen/GuideScreen.Common/Services/Models/PassengerFlowStatisticsModel.cs new file mode 100644 index 0000000..ca385d6 --- /dev/null +++ b/guidescreen/GuideScreen/GuideScreen.Common/Services/Models/PassengerFlowStatisticsModel.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GuideScreen.Common.Services.Models +{ + /// + /// 客流统计 model + /// + public class PassengerFlowStatisticsModel + { + /// + /// 主键 ID + /// + public int ID { get; set; } + + /// + /// 进入人数 + /// + public int EnterNum { get; set; } + + /// + /// 离开人数 + /// + public int LeaveNum { get; set; } + + /// + /// 开始时间 + /// + public DateTime StartTime { get; set; } + + /// + /// 结束时间 + /// + public DateTime EndTime { get; set; } + + /// + /// 设备IP + /// + public string DeviceIP { get; set; } + } +} diff --git a/guidescreen/GuideScreen/GuideScreen.Common/Services/Models/PassengerFlowStatisticsTotalModel.cs b/guidescreen/GuideScreen/GuideScreen.Common/Services/Models/PassengerFlowStatisticsTotalModel.cs new file mode 100644 index 0000000..4f8befa --- /dev/null +++ b/guidescreen/GuideScreen/GuideScreen.Common/Services/Models/PassengerFlowStatisticsTotalModel.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GuideScreen.Common.Services.Models +{ + internal class PassengerFlowStatisticsTotalModel + { + + /// + /// x轴类型名称 + /// + public string XTypeName { get; set; } + + /// + /// 进入人数 + /// + public int EnterNum { get; set; } + + /// + /// 离开人数 + /// + public int LeaveNum { get; set; } + } +}