using IoTIntegrationPlatform.Common; using IoTIntegrationPlatform.Interface; using IoTIntegrationPlatform.Model.common; using IoTIntegrationPlatform.Model.Dto; using IoTIntegrationPlatform.Model.Enum; using IoTIntegrationPlatform.Model.Model; using MySqlX.XDevAPI.Relational; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static IoTIntegrationPlatform.Model.Enum.EnumDevice; namespace IoTIntegrationPlatform.Services { /// /// 设备服务 /// public class DeviceService : IDeviceService { private ISqlSugarClient db { get; } public DeviceService(ISqlSugarClient _db) { db = _db; } #region 类句柄操作 private IntPtr handle; private bool disposed = false; //关闭句柄 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1060:MovePInvokesToNativeMethodsClass"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Interoperability", "CA1401:PInvokesShouldNotBeVisible"), System.Runtime.InteropServices.DllImport("Kernel32")] public extern static Boolean CloseHandle(IntPtr handle); /// /// 释放对象资源 /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } /// /// 释放对象资源 /// /// protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (handle != IntPtr.Zero) { CloseHandle(handle); handle = IntPtr.Zero; } } disposed = true; } ~DeviceService() { Dispose(false); } #endregion #region 平台型号 /// /// 获取平台型号 /// /// /// /// public PlatformModel GetPlatformModelInfo(int platformModelId, string code) { PlatformModel model = new PlatformModel(); try { model = db.Queryable() .Where(it => it.IsValid == true) .WhereIF(platformModelId > 0, it => it.PlatformModelId == platformModelId) .WhereIF(!string.IsNullOrEmpty(code), it => it.PlatformModelCode.Equals(code)) .First(); } catch (Exception ex) { Logging.Error(ex, ex.Message); } return model; } /// /// 获取平台型号列表 /// /// /// /// public List GetPlatformModelList(BaseParm parm, ref int page) { List list = new List(); try { list = db.Queryable() .Where(it => it.IsValid == true) .WhereIF(!string.IsNullOrEmpty(parm.Code), it => it.PlatformModelCode.Equals(parm.Code)) .ToPageList(parm.PageIndex, parm.PageSize, ref page); } catch (Exception ex) { Logging.Error(ex, ex.Message); } return list; } /// /// 添加平台型号 /// /// /// public bool AddPlatformModel(PlatformModel model) { bool result = false; try { model.CreateTime = DateTime.Now; model.UpdateTime = DateTime.Now; model.IsValid = true; int row = db.Insertable(model).ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, "添加平台设备型号"); } return result; } /// /// 编辑平台设备型号 /// /// /// public bool UpdatedPlatformModel(PlatformModel model) { bool result = false; try { var row = db.Updateable(model).IgnoreColumns(it => new { it.PlatformModelId, it.CreateTime, it.IsValid }) .Where(it => it.PlatformModelId == model.PlatformModelId) .ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } /// /// 删除平台设备型号 /// /// /// public bool DeletePlatformModel(int id) { bool result = false; try { int row = db.Updateable() .SetColumns(it => new PlatformModel { UpdateTime = DateTime.Now, IsValid = false }) .Where(it => it.PlatformModelId == id) .ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } #endregion #region 平台型号明细 /// /// 获取设备明细信息 /// /// /// /// /// /// /// public PlatformModelDetail GetPlatformModelDetailInfo(int detailId, string deviceName, int platformModelId, int deviceType, int deviceCommunicationType) { PlatformModelDetail model = new PlatformModelDetail(); try { model = db.Queryable() .Where(it => it.IsValid == true) .WhereIF(detailId > 0, it => it.PlatformModelDetailId == detailId) .WhereIF(!string.IsNullOrEmpty(deviceName), it => it.DeviceName.Contains(deviceName)) .WhereIF(platformModelId > 0, it => it.PlatformModelId == platformModelId) .WhereIF(deviceType > 0, it => it.DeviceType == (EnumDeviceType)deviceType) .WhereIF(deviceType > 0, it => it.DeviceCommunicationType == (EnumDeviceCommunicationType)deviceCommunicationType) .First(); } catch (Exception ex) { Logging.Error(ex, ex.Message); } return model; } /// /// 获取平台型号明细列表 /// /// /// /// public List GetPlatformModelDetailList(BaseParm parm, ref int page) { List list = new List(); try { list = db.Queryable() .Where(it => it.IsValid == true) .WhereIF(!string.IsNullOrEmpty(parm.Name), it => it.DeviceName.Contains(parm.Name)) .WhereIF(parm.Int1 > 0, it => it.DeviceType == (EnumDeviceType)parm.Int1) .WhereIF(parm.Int2 > 0, it => it.DeviceCommunicationType == (EnumDeviceCommunicationType)parm.Int2) .WhereIF(parm.Type > 0, it => it.ModbusRegisterType == (EnumModbusRegisterType)parm.Type) .OrderBy(it => it.CreateTime) .ToPageList(parm.PageIndex, parm.PageSize, ref page); } catch (Exception ex) { Logging.Error(ex, ex.Message); } return list; } /// /// 添加平台型号明细 /// /// /// public bool AddPlatformModelDetail(PlatformModelDetail model) { bool result = false; try { model.CreateTime = DateTime.Now; model.UpdateTime = DateTime.Now; model.IsValid = true; int row = db.Insertable(model).ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, "添加平台设备型号"); } return result; } /// /// 编辑平台设备型号 /// /// /// public bool UpdatedPlatformModelDetail(PlatformModelDetail model) { bool result = false; try { var row = db.Updateable(model).IgnoreColumns(it => new { it.PlatformModelDetailId, it.CreateTime, it.IsValid }) .Where(it => it.PlatformModelDetailId == model.PlatformModelDetailId) .ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } /// /// 删除平台设备型号 /// /// /// public bool DeletePlatformModelDetail(int id) { bool result = false; try { int row = db.Updateable() .SetColumns(it => new PlatformModelDetail { UpdateTime = DateTime.Now, IsValid = false }) .Where(it => it.PlatformModelDetailId == id) .ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } #endregion #region 平台设备 /// /// 获取平台设备信息 /// /// /// /// /// public PlatformDeviceInfo GetPlatformDeviceInfoInfo(int platformId, string code, int customerId) { PlatformDeviceInfo model = new PlatformDeviceInfo(); try { model = db.Queryable() .Where(it => it.IsValid == true) .WhereIF(platformId > 0, it => it.PlatformId == platformId) .WhereIF(!string.IsNullOrEmpty(code), it => it.PlatformCode.Equals(code)) .WhereIF(customerId > 0, it => it.CustomerId == customerId) .First(); } catch (Exception ex) { Logging.Error(ex, ex.Message); } return model; } /// /// 获取平台设备列表 /// /// /// /// public List GetPlatformDeviceList(BaseParm parm, ref int page) { List list = new List(); try { list = db.Queryable() .Where(it => it.IsValid == true) .WhereIF(!string.IsNullOrEmpty(parm.Param), it => it.PlatformCode.Contains(parm.Param)) .WhereIF(!string.IsNullOrEmpty(parm.Code), it => it.PlatformCode.Equals(parm.Code))//平台编号 .WhereIF(parm.Int1 > 0, it => it.PlatformModelId == parm.Int1)//平台型号id .WhereIF(parm.CustomerId > 0, it => it.CustomerId == parm.CustomerId)//客户id .WhereIF(parm.Status > 0, it => it.PlatformStatus == (EnumPlatformStatus)parm.Status)//平台状态 .Select(it => new PlatformDeviceInfoDto() { PlatformId = it.PlatformId, PlatformCode = it.PlatformCode, PlatformModelId = it.PlatformModelId, CustomerId = it.CustomerId, EffectiveTime = it.EffectiveTime, ExpireTime = it.ExpireTime, DeviceMac = it.DeviceMac, HeartbeatTime = it.HeartbeatTime, DeviceState = it.DeviceState, PlatformStatus = it.PlatformStatus, Remark = it.Remark, UpdateTime = it.UpdateTime, OperationId = it.OperationId, OperationName = it.OperationName, CustomerCode = SqlFunc.Subqueryable().Where(t => t.IsValid && t.CustomerId == it.CustomerId).Select(t => t.CustomerCode), CustomerName = SqlFunc.Subqueryable().Where(t => t.IsValid && t.CustomerId == it.CustomerId).Select(t => t.CustomerName), PlatformModelCode = SqlFunc.Subqueryable().Where(t => t.IsValid && t.PlatformModelId == it.PlatformModelId).Select(t => t.PlatformModelCode), PlatformModelName = SqlFunc.Subqueryable().Where(t => t.IsValid && t.PlatformModelId == it.PlatformModelId).Select(t => t.PlatformModelName) }) .ToPageList(parm.PageIndex, parm.PageSize, ref page); } catch (Exception ex) { Logging.Error(ex, ex.Message); } return list; } /// /// 添加平台设备 /// /// /// public bool AddPlatformDeviceInfo(PlatformDeviceInfo model) { bool result = false; db.Ado.BeginTran(); try { //序列号 string serialNumber = RandomHelper.GenerateRandomStr(16); model.CreateTime = DateTime.Now; model.UpdateTime = DateTime.Now; model.DeviceMac = DeviceHelper.GenerateDeviceMacAddress(serialNumber); model.HeartbeatTime = DateTime.Now; model.DeviceState = EnumDeviceStatus.Close; model.IsValid = true; model.PlatformStatus = EnumPlatformStatus.NotActivated; model.PlatformId = db.Insertable(model).ExecuteReturnIdentity(); //根据物联网平台型号id获取平台型号明细设备 //物联网平台型号id int platformModelId = model.PlatformModelId; //获取当前平台型号下的明细设备 List platformModelDeviceList = db.Queryable().Where(it => it.IsValid && it.PlatformModelId == platformModelId).OrderBy(it => it.PlatformModelDetailId).ToList(); //平台子设备 List subDevicelist = new List(); foreach (var item in platformModelDeviceList) { PlatformDeviceDetail subDevicdModel = new PlatformDeviceDetail(); subDevicdModel = Mapping.EntityMapping(item); subDevicdModel.DeviceId = Guid.NewGuid().ToString(); subDevicdModel.PlatformId = model.PlatformId; subDevicdModel.DeviceName = item.DeviceName; subDevicdModel.DeviceType = item.DeviceType; subDevicdModel.DeviceTypeName = EnumExtension.GetDescription(subDevicdModel.DeviceType); subDevicdModel.DeviceState = EnumDeviceStatus.Close; subDevicdModel.DeviceValue = item.DeviceValue; subDevicdModel.CreateTime = DateTime.Now; subDevicdModel.UpdateTime = DateTime.Now; subDevicdModel.IsValid = true; subDevicelist.Add(subDevicdModel); } int row = db.Insertable(subDevicelist).ExecuteCommand(); if (row > 0) { db.Ado.CommitTran(); result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); db.Ado.RollbackTran(); } return result; } /// /// 编辑平台设备 /// /// /// public bool UpdatedPlatformDeviceInfo(PlatformDeviceInfo model) { bool result = false; try { model.UpdateTime = DateTime.Now; var row = db.Updateable(model).IgnoreColumns(it => new { it.PlatformId, it.PlatformCode, it.UpdateTime, it.IsValid }) .Where(it => it.PlatformId == model.PlatformId) .ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } /// /// 批量编辑平台设备状态 /// /// /// public bool BatchUpdatePlatformDeviceStatus(List dataList) { bool result = false; db.Ado.BeginTran(); try { foreach (var item in dataList) { db.Updateable() .SetColumns(it => new PlatformDeviceInfo() { UpdateTime = DateTime.Now, DeviceState = item.DeviceState }) .Where(it => it.IsValid && it.PlatformId == item.PlatformId) .ExecuteCommand(); } db.Ado.CommitTran(); } catch (Exception ex) { db.Ado.RollbackTran(); Logging.Error(ex, "BatchUpdateDeviceStatus"); } return result; } /// /// 编辑平台状态 /// /// /// public bool UpdatedPlatformState(PlatformDeviceInfo model) { bool result = false; try { model.UpdateTime = DateTime.Now; var row = 0; if (model.PlatformStatus == EnumPlatformStatus.NotActivated) { model.ExpireTime = DateTime.Now; row = db.Updateable(model).UpdateColumns(it => new { it.PlatformStatus, it.UpdateTime }).Where(it => it.PlatformId == model.PlatformId).ExecuteCommand(); } else if (model.PlatformStatus == EnumPlatformStatus.Normal) { model.EffectiveTime = DateTime.Now; row = db.Updateable(model).UpdateColumns(it => new { it.PlatformStatus, it.UpdateTime, it.EffectiveTime, it.ExpireTime }).Where(it => it.PlatformId == model.PlatformId).ExecuteCommand(); } else if (model.PlatformStatus == EnumPlatformStatus.HaveExpired) { model.ExpireTime = DateTime.Now; row = db.Updateable(model).UpdateColumns(it => new { it.PlatformStatus, it.UpdateTime, it.ExpireTime }).Where(it => it.PlatformId == model.PlatformId).ExecuteCommand(); } if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } /// /// 删除平台设备 /// /// /// public bool DeletePlatformDeviceInfo(int platformId) { bool result = false; try { int row = db.Updateable() .SetColumns(it => new PlatformDeviceInfo { UpdateTime = DateTime.Now, IsValid = false }) .Where(it => it.PlatformId == platformId) .ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } /// /// 根据mac地址修改平台设备心跳时间 /// /// /// public bool UpdateGatewayDeviceHeartTime(string deviceMac) { bool result = false; try { int row = db.Updateable() .SetColumns(it => new PlatformDeviceInfo { UpdateTime = DateTime.Now, HeartbeatTime = DateTime.Now, DeviceState = EnumDeviceStatus.Open }) .Where(it => it.IsValid && it.DeviceMac == deviceMac) .ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } #endregion #region 平台设备明细 /// /// 获取平台设备明细列表 /// /// /// /// public List GetPlatformDeviceDetailList(BaseParm parm, ref int page) { List list = new List(); try { list = db.Queryable() .Where(it => it.IsValid) .WhereIF(parm.Id > 0, it => it.PlatformId == parm.Id)//平台id .WhereIF(!string.IsNullOrEmpty(parm.Name), it => it.DeviceName.Contains(parm.Name))//设备名称 .WhereIF(parm.Int1 > 0, it => it.DeviceType == (EnumDeviceType)parm.Int1)//设备类型 .WhereIF(parm.Int2 > 0, it => it.DeviceCommunicationType == (EnumDeviceCommunicationType)parm.Int2)//设备通讯方式 .OrderBy(it => it.PlatformModelDetailId) .Select(it => new PlatformDeviceDetailDto() { DeviceCommunicationTypeName = "Rs485", ModbusRegisterTypeName = "保持寄存器" }, true)//开启自动映射 .ToPageList(parm.PageIndex, parm.PageSize, ref page); } catch (Exception ex) { Logging.Error(ex, ex.Message); } return list; } /// /// 编辑平台设备 /// /// /// public bool UpdatedPlatformSubDeviceInfo(PlatformDeviceDetail model) { bool result = false; try { var row = db.Updateable(model).IgnoreColumns(it => new { it.DeviceId, it.PlatformId, it.CreateTime, it.IsValid }) .Where(it => it.DeviceId == model.DeviceId) .ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } /// /// 编辑平台明细设备值 /// /// /// public bool UpdatedPlatformSubDeviceValue(PlatformDeviceDetail model) { bool result = false; try { model.UpdateTime = DateTime.Now; var row = db.Updateable(model).UpdateColumns(it => new { it.DeviceValue, it.UpdateTime }).Where(it => it.DeviceId == model.DeviceId).ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } /// /// 删除平台子设备 /// /// /// public bool DeletePlatformSubDeviceInfo(string deviceId) { bool result = false; try { int row = db.Updateable() .SetColumns(it => new PlatformDeviceDetail { UpdateTime = DateTime.Now, IsValid = false }) .Where(it => it.DeviceId == deviceId) .ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } /// /// 编辑设备状态或值(根据设备ID) /// /// /// /// /// public bool UpdateDeviceStateOrValue(string deviceId, EnumDeviceStatus deviceStatus, string deviceValue) { bool result = false; try { //int row = db.Updateable() // .SetColumns(it => new PlatformDeviceDetail { UpdateTime = DateTime.Now, DeviceState = deviceStatus, DeviceValue = deviceValue }) // .Where(it => it.DeviceId == deviceId) // .ExecuteCommand(); if (1 > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } /// /// 获取设备信息 /// /// /// /// /// public PlatformDeviceDetail GetDevideInfo(string device_id) { PlatformDeviceDetail model = new PlatformDeviceDetail(); try { model = db.Queryable() .Where(it => it.IsValid) .WhereIF(!string.IsNullOrEmpty(device_id), it => it.DeviceId.Equals(device_id)) .First(); } catch (Exception ex) { Logging.Error(ex, ex.Message); } return model; } /// /// 编辑设备读取数据状态 /// /// /// public bool UpdateDeviceReadState(PlatformDeviceDetail model) { bool result = false; try { model.UpdateTime = DateTime.Now; var row = db.Updateable(model).UpdateColumns(it => new { it.UpdateTime, it.IsRead }).Where(it => it.DeviceId == model.DeviceId).ExecuteCommand(); if (row > 0) { result = true; } } catch (Exception ex) { Logging.Error(ex, ex.Message); } return result; } #endregion } }