新建CVD项目 来自PVD项目

main
xiaoguo 1 year ago
parent acbde8859a
commit 66542d1172

@ -0,0 +1,37 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<!--<Nullable>enable</Nullable>-->
<ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Common\Configuration\**" />
<Content Remove="Common\Configuration\**" />
<EmbeddedResource Remove="Common\Configuration\**" />
<None Remove="Common\Configuration\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Autofac" Version="7.1.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Masuit.Tools.Core" Version="2.6.7.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.12" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.12">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="NLog" Version="5.2.5" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
</ItemGroup>
<ItemGroup>
<Reference Include="HslCommunication">
<HintPath>bin\SDK\HslCommunication.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

@ -0,0 +1,105 @@
namespace PVDEMCS.Common.Constant
{
/// <summary>
/// 点位所属动作
/// </summary>
public sealed class ActionType
{
/// <summary>
/// 启动停止
/// </summary>
public const String StartStop = "StartStop";
/// <summary>
/// 故障
/// </summary>
public const String Fault = "Fault";
}
/// <summary>
/// 设备类型
/// </summary>
public sealed class EquipmentType
{
/// <summary>
/// Ionbond
/// </summary>
public const String Ionbond = "Ionbond";
/// <summary>
/// Balzers
/// </summary>
public const String Balzers = "Balzers";
/// <summary>
/// Cemecon
/// </summary>
public const String CemeCon = "CemeCon";
}
/// <summary>
/// 设备类型补偿
/// </summary>
public sealed class EquipmentTypeOffset
{
/// <summary>
/// Ionbond补偿时间
/// </summary>
public const String IonbondOffset = "IonbondOffset";
/// <summary>
/// Balzers补偿时间
/// </summary>
public const String BalzersOffset = "BalzersOffset";
/// <summary>
/// Cemecon补偿时间
/// </summary>
public const String CemeConOffset = "CemeConOffset";
}
/// <summary>
/// 设备状态
/// </summary>
public sealed class EquipmentState
{
/// <summary>
/// 运行
/// </summary>
public const String Run = "Run";
/// <summary>
/// 待机
/// </summary>
public const String Stop = "Stop";
/// <summary>
/// 报警
/// </summary>
public const String Alarm = "Alarm";
public static readonly string[] States = new string[] { Run, Stop, Alarm };
public static bool HaveState(string state)
{
return States.Contains(state);
}
}
/// <summary>
/// 报警模式
/// </summary>
public sealed class EquipmentAlarmModel
{
/// <summary>
/// 自动
/// </summary>
public const String Auto = "Auto";
/// <summary>
/// 手动
/// </summary>
public const String Manual = "Manual";
}
}

@ -0,0 +1,59 @@
using System.Reflection;
using System.Security.AccessControl;
using Autofac;
using Autofac.Extensions.DependencyInjection;
using Module = Autofac.Module;
namespace PVDEMCS.Common.DI;
/// <summary>
/// 自定义扩展 Autofac 方法
/// </summary>
public static class AutoFacBuilderExtensions
{
/// <summary>
/// 添加Autofac扩展
/// </summary>
/// <param name="builder"></param>
public static void AddAutofacExt(this WebApplicationBuilder builder)
{
// 通过工厂替换把Autofac整合进来
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(
build =>
{
build.RegisterModule(new AutoFacManager());
});
}
}
public class AutoFacManager : Module
{
// 重写 Autofac 管道 Load方法, 在这里注入
protected override void Load(ContainerBuilder builder)
{
/* 2
* IDependency
* IDependency
*/
Type baseType = typeof(IDependency);
#region 依赖注入
/* 3
* CLR COMAppDomain AppDomain
*/
var assemblies = AppDomain.CurrentDomain.GetAssemblies();//这种写法AppDomain重新启动后会丢失程序集
//var assemblies = Assembly.GetAssembly(baseType);
/* 4
*
* IsAssignableFromtrueIDependency
* IsAbstract
* AsImplementedInterfaces
* InstancePerLifetimeScopeLifetime
*/
builder.RegisterAssemblyTypes(assemblies).Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract).AsImplementedInterfaces().SingleInstance();
#endregion
base.Load(builder);
}
}

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PVDEMCS.Common.DI
{
/// <summary>
/// 依赖注入接口表示该接口的实现类将自动注册到IoC容器中
/// </summary>
public interface IDependency
{
}
}

@ -0,0 +1,144 @@

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Reflection;
namespace PVDEMCS.Common.EF
{
public static class EFSqlHelper
{
private class PropertyMapp
{
public string Name { get; set; }
public Type Type { get; set; }
public bool IsSame(PropertyMapp mapp)
{
if (mapp == null)
{
return false;
}
bool same = mapp.Name == Name && mapp.Type == Type;
return same;
}
}
public static DbTransaction GetDbTransaction(this IDbContextTransaction source)
{
return (source as IInfrastructure<DbTransaction>).Instance;
}
public static IEnumerable<T> FromSqlQuery<T>(this DbContext context, string query, List<DbParameter> parameters = null, CommandType commandType = CommandType.Text, int? commandTimeOutInSeconds = null) where T : new()
{
return FromSqlQuery<T>(context.Database, query, parameters, commandType, commandTimeOutInSeconds);
}
public static IEnumerable<T> FromSqlQuery<T>(this DatabaseFacade database, string query, List<DbParameter> parameters = null, CommandType commandType = CommandType.Text, int? commandTimeOutInSeconds = null) where T : new()
{
const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
List<PropertyMapp> entityFields = (from PropertyInfo aProp in typeof(T).GetProperties(flags)
select new PropertyMapp
{
Name = aProp.Name,
Type = Nullable.GetUnderlyingType(aProp.PropertyType) ?? aProp.PropertyType
}).ToList();
List<PropertyMapp> dbDataReaderFields = new List<PropertyMapp>();
List<PropertyMapp> commonFields = null;
using (var command = database.GetDbConnection().CreateCommand())
{
if (command.Connection.State != ConnectionState.Open)
{
command.Connection.Open();
}
var currentTransaction = database.CurrentTransaction;
if (currentTransaction != null)
{
command.Transaction = currentTransaction.GetDbTransaction();
}
command.CommandText = query;
command.CommandType = commandType;
if (commandTimeOutInSeconds != null)
{
command.CommandTimeout = (int)commandTimeOutInSeconds;
}
if (parameters != null)
{
command.Parameters.AddRange(parameters.ToArray());
}
using (var result = command.ExecuteReader())
{
while (result.Read())
{
if (commonFields == null)
{
for (int i = 0; i < result.FieldCount; i++)
{
dbDataReaderFields.Add(new PropertyMapp
{
Name = result.GetName(i),
Type = result.GetFieldType(i)
});
}
commonFields = entityFields.Where
(x => dbDataReaderFields.Any(d =>
d.IsSame(x))).Select(x => x).ToList();
}
var entity = new T();
foreach (var aField in commonFields)
{
PropertyInfo propertyInfos = entity.GetType().GetProperty(aField.Name);
var value = (result[aField.Name] == DBNull.Value) ? null : result[aField.Name]; //if field is nullable
propertyInfos.SetValue(entity, value, null);
}
yield return entity;
}
}
}
}
public static IEnumerable<T> FromSqlQuery<T>(this DbContext context, string query, Func<DbDataReader, T> map, List<DbParameter> parameters = null, CommandType commandType = CommandType.Text, int? commandTimeOutInSeconds = null)
{
return FromSqlQuery(context.Database, query, map, parameters, commandType, commandTimeOutInSeconds);
}
public static IEnumerable<T> FromSqlQuery<T>(this DatabaseFacade database, string query, Func<DbDataReader, T> map, List<DbParameter> parameters = null, CommandType commandType = CommandType.Text, int? commandTimeOutInSeconds = null)
{
using (var command = database.GetDbConnection().CreateCommand())
{
if (command.Connection.State != ConnectionState.Open)
{
command.Connection.Open();
}
var currentTransaction = database.CurrentTransaction;
if (currentTransaction != null)
{
command.Transaction = currentTransaction.GetDbTransaction();
}
command.CommandText = query;
command.CommandType = commandType;
if (commandTimeOutInSeconds != null)
{
command.CommandTimeout = (int)commandTimeOutInSeconds;
}
if (parameters != null)
{
command.Parameters.AddRange(parameters.ToArray());
}
using (var result = command.ExecuteReader())
{
while (result.Read())
{
yield return map(result);
}
}
}
}
}
}

@ -0,0 +1,100 @@
using GuideScreen.Common.Common;
using PVDEMCS.Services;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PVDEMCS.Common.Log
{
/// <summary>
/// 日志扩展
/// </summary>
public static class LogExtensions
{
private static ILogService _logService;
static LogExtensions()
{
}
/// <summary>
/// 日志服务
/// </summary>
public static void Load(ILogService logService)
{
_logService = logService;
}
/// <summary>
/// 写入Error级别日志
/// </summary>
/// <param name="ex">异常对象</param>
public static void WriteErrorLog(this Exception ex)
{
var error = new StringBuilder();
while (ex != null)
{
error.AppendLine($"{ex.Message}:{Environment.NewLine}");
error.AppendLine($"{ex.StackTrace};");
ex = ex.InnerException;
}
_logService.Error(error.ToString());
}
/// <summary>
/// 写入Fatal级别日志
/// </summary>
/// <param name="ex">异常对象</param>
public static void WriteFatalLog(this Exception ex)
{
var error = new StringBuilder();
while (ex != null)
{
error.AppendLine($"{ex.Message}:{Environment.NewLine}");
error.AppendLine($"{ex.StackTrace};");
ex = ex.InnerException;
}
_logService.Fatal(error.ToString());
}
/// <summary>
/// 写入info级别日志
/// </summary>
/// <param name="str"></param>
public static void WriteInfoLog(this string str)
{
_logService.Info(str);
}
/// <summary>
/// 写入debug级别日志
/// </summary>
/// <param name="str"></param>
public static void WriteDebugLog(this string str)
{
_logService.Debug(str);
}
/// <summary>
/// 写入Error级别日志
/// </summary>
/// <param name="str"></param>
public static void WriteErrorLog(this string str)
{
_logService.Error(str);
}
/// <summary>
/// 写入Error级别日志
/// </summary>
/// <param name="str"></param>
public static void WriteFatalLog(this string str)
{
_logService.Fatal(str);
}
}
}

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GuideScreen.Common.Common
{
/// <summary>
/// 日志级别
/// </summary>
public enum LogInfoLevel
{
/*信息级别*/
Info,
/*debug级别*/
Debug,
/*错误级别*/
Error,
/*致命级别*/
Fatal
}
}

@ -0,0 +1,79 @@
using HslCommunication;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PVDEMCS.Common
{
public class Result
{
//
// 摘要:
// 指示本次操作是否成功。
// Indicates whether this operation was successful.
public bool IsSuccess { get; set; } = true;
//
// 摘要:
// 具体的错误描述。
// Specific error description.
public string Message { get; set; }
public int ErrorCode { get; set; }
//
// 摘要:
// 实例化一个默认的结果对象
public Result()
{
}
//
// 摘要:
// 使用指定的消息实例化一个默认的结果对象
//
// 参数:
// msg:
// 错误消息
public Result(string msg)
{
IsSuccess = false;
Message = msg;
}
//
// 摘要:
// 使用错误代码,消息文本来实例化对象
//
// 参数:
// err:
// 错误代码
//
// msg:
// 错误消息
public Result(int err, string msg)
{
IsSuccess = false;
ErrorCode = err;
Message = msg;
}
}
public class Result<T> : Result
{
public T Content { get; set; }
public Result()
{
}
public Result(T content)
{
Content = content;
}
}
}

@ -0,0 +1,96 @@
using AngleSharp.Dom;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace PVDEMCS.Common.Tools
{
public class ModelTools
{
public static class PubClone<TEntity, TResult>
{
private static readonly Func<TEntity, TResult> cache = GetFunc();
private static Func<TEntity, TResult> GetFunc()
{
var parameterExpression = Expression.Parameter(typeof(TEntity), "p");
List<MemberBinding> memberBindingList = new List<MemberBinding>();
foreach (var item in typeof(TResult).GetProperties())
{
if (!item.CanWrite)
{
continue;
}
var _Property = typeof(TEntity).GetProperty(item.Name);
if (_Property == null)
{
continue;
}
if (item.PropertyType.FullName != _Property.PropertyType.FullName)
{
continue;
}
MemberExpression property = Expression.Property(parameterExpression, typeof(TEntity).GetProperty(item.Name));
MemberBinding memberBinding = Expression.Bind(item, property);
memberBindingList.Add(memberBinding);
}
MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TResult)), memberBindingList.ToArray());
Expression<Func<TEntity, TResult>> lambda = Expression.Lambda<Func<TEntity, TResult>>(memberInitExpression, new ParameterExpression[] { parameterExpression });
return lambda.Compile();
}
public static TResult Trans(TEntity tIn)
{
if (tIn == null)
{
return default;
}
return cache(tIn);
}
public static List<TResult> TransList(List<TEntity> list)
{
List<TResult> result = new List<TResult>();
foreach (var item in list)
{
result.Add(Trans(item));
}
return result;
}
}
public static void SetUpdateModel<TEntity>(TEntity entity)
{
foreach (var item in typeof(TEntity).GetProperties())
{
if (!item.CanWrite)
{
continue;
}
var _Property = typeof(TEntity).GetProperty(item.Name);
if (_Property == null)
{
continue;
}
if (item.PropertyType.FullName != _Property.PropertyType.FullName)
{
continue;
}
if (item.Name == "")
{
}
}
}
}
}

@ -0,0 +1,254 @@
using AngleSharp.Dom;
using Masuit.Tools;
using Masuit.Tools.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using PVDEMCS.Common;
using PVDEMCS.Common.Constant;
using PVDEMCS.Devices;
using PVDEMCS.Devices.Impl;
using PVDEMCS.Services;
using PVDEMCS.Services.Models;
using SharpCompress.Common;
using System;
namespace PVDEMCS.Controllers
{
/// <summary>
/// PLC控制器
/// </summary>
[ApiController]
[Route("[controller]/[action]")]
public class DeviceController : Controller
{
private IDeviceService _deviceService;
private IDeviceRun _deviceRun;
public DeviceController(IDeviceService deviceService, IDeviceRun deviceRun)
{
_deviceService = deviceService;
_deviceRun = deviceRun;
}
#region PLC控制器
/// <summary>
/// 获取PLC控制器分页列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
[HttpGet]
public Result<PagedList<DeviceInfo>> GetDevicePageList(string deviceCode, string deviceName, bool? activated, int page, int size = 20)
{
var result = _deviceService.GetDevicePageList(deviceCode, deviceName, activated, page, size);
if (result.IsSuccess)
{
GetDeviceIsConnected(result.Content.Data);
}
return result;
}
/// <summary>
/// 获取PLC控制器列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// /// <returns></returns>
[HttpGet]
public Result<List<DeviceInfo>> GetDeviceInfoList(string deviceCode, string deviceName, bool? activated = null)
{
var result = _deviceService.GetDeviceInfoList(deviceCode, deviceName, activated);
if (result.IsSuccess)
{
GetDeviceIsConnected(result.Content);
}
return result;
}
[NonAction]
private void GetDeviceIsConnected(List<DeviceInfo> list)
{
if (!list.IsNullOrEmpty() && !_deviceRun.GetDeviceIsConnected.IsNullOrEmpty())
{
foreach (var item in list)
{
if (_deviceRun.GetDeviceIsConnected.Keys.Contains(item.DeviceCode))
{
item.isConnected = _deviceRun.GetDeviceIsConnected[item.DeviceCode];
}
}
}
}
/// <summary>
/// 获取PLC控制器明细
/// </summary>
/// <param name="id">主键Id</param>
/// <returns></returns>
[HttpGet]
public Result<DeviceInfo> GetDeviceDetail(string id)
{
var result = _deviceService.GetDeviceDetail(id);
return result;
}
/// <summary>
/// 添加PLC控制器
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public Result<string> AddDevice(DeviceInfo entity)
{
var result = _deviceService.AddDevice(entity);
_deviceRun.Run();
return result;
}
/// <summary>
/// 更新PLC控制器
/// </summary>
/// <param name="entity"></param>
[HttpPost]
public Result UpdateDevice(DeviceInfo entity)
{
var result = _deviceService.UpdateDevice(entity);
_deviceRun.Run();
return result;
}
/// <summary>
/// 删除PLC控制器
/// </summary>
/// <param name="id"></param>
[HttpPost]
public Result DeleteDevice(string id)
{
var result = _deviceService.DeleteDevice(id);
_deviceRun.Run();
return result;
}
#endregion
#region PLC点位
/// <summary>
/// 获取PLC控制器点位分页列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
[HttpGet]
public Result<PagedList<DevicePoint>> GetDevicePointPageList(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated, int page, int size = 20)
{
var result = _deviceService.GetDevicePointPageList(deviceId, deviceName, deviceCode, equipmentName, equipmentCode, equipmentType, pointCode, pointName, activated, page, size);
if (result.IsSuccess)
{
GetPointValue(result.Content.Data);
}
return result;
}
/// <summary>
/// 获取PLC控制器点位列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
/// <returns></returns>
[HttpGet]
public Result<List<DevicePoint>> GetDevicePointList(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated)
{
var result = _deviceService.GetDevicePointList(deviceId, deviceName, deviceCode, equipmentName, equipmentCode, equipmentType, pointCode, pointName, activated);
GetPointValue(result.Content);
return result;
}
[NonAction]
private void GetPointValue(List<DevicePoint> list)
{
var points = _deviceRun.GetDevicePoints;
if (!list.IsNullOrEmpty() && !points.IsNullOrEmpty())
{
foreach (var item in list)
{
item.ObjectValue = points.Where(f => f.PointCode == item.PointCode).Select(f => f.ObjectValue).FirstOrDefault();
}
}
}
/// <summary>
/// 获取PLC控制器点位明细
/// </summary>
/// <param name="id">Id</param>
/// <returns></returns>
[HttpGet]
public Result<DevicePoint> GetDevicePointDetail(string id)
{
var result = _deviceService.GetDevicePointDetail(id);
return result;
}
/// <summary>
/// 添加PLC控制器点位
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public Result<string> AddDevicePoint(DevicePoint entity)
{
var result = _deviceService.AddDevicePoint(entity);
_deviceRun.Run();
return result;
}
/// <summary>
/// 更新PLC控制器点位
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
[HttpPost]
public Result UpdateDevicePoint(DevicePoint entity)
{
var result = _deviceService.UpdateDevicePoint(entity);
_deviceRun.Run();
return result;
}
/// <summary>
/// 删除PLC控制器点位
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost]
public Result DeleteDevicePoint(string id)
{
var result = _deviceService.DeleteDevicePoint(id);
_deviceRun.Run();
return result;
}
#endregion
}
}

@ -0,0 +1,114 @@
using Masuit.Tools;
using Masuit.Tools.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using PVDEMCS.Common;
using PVDEMCS.Common.Constant;
using PVDEMCS.Devices;
using PVDEMCS.Services;
using PVDEMCS.Services.Impl;
using PVDEMCS.Services.Models;
using System;
namespace PVDEMCS.Controllers
{
/// <summary>
/// 设备管理
/// </summary>
[ApiController]
[Route("[controller]/[action]")]
public class EquipmentController : Controller
{
private IEquipmentService _equipmentService;
private IDeviceRun _deviceRun;
public EquipmentController(IEquipmentService equipmentService, IDeviceRun deviceRun)
{
this._equipmentService = equipmentService;
_deviceRun = deviceRun;
}
/// <summary>
/// 获取设备分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
[HttpGet]
public Result<PagedList<EquipmentInfo>> GetEquipmentPageList(string equipmentName, string equipmentCode, string equipmentType, bool? activated, int page, int size = 20)
{
var result = this._equipmentService.GetEquipmentPageList(equipmentName, equipmentCode, equipmentType, activated, page, size);
return result;
}
/// <summary>
/// 获取设备列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="activated">是否启用</param>
[HttpGet]
public Result<List<EquipmentInfo>> GetEquipmentList(string equipmentName, string equipmentCode, string equipmentType, bool? activated)
{
var result = this._equipmentService.GetEquipmentList(equipmentName, equipmentCode, equipmentType, activated);
return result;
}
/// <summary>
/// 获取设备明显
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public Result<EquipmentInfo> GetEquipmentDetail(string id)
{
var result = this._equipmentService.GetEquipmentDetail(id);
return result;
}
/// <summary>
/// 添加设备信息
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
public Result AddEquipment(EquipmentInfo info)
{
var result = this._equipmentService.AddEquipment(info);
_deviceRun.Run();
return result;
}
/// <summary>
/// 更新设备信息
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
public Result UpdateEquipment(EquipmentInfo info)
{
var result = this._equipmentService.UpdateEquipment(info);
_deviceRun.Run();
return result;
}
/// <summary>
/// 删除设备信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost]
public Result DeleteEquipment(string id)
{
var result = this._equipmentService.DeleteEquipment(id);
_deviceRun.Run();
return result;
}
}
}

@ -0,0 +1,344 @@
using Masuit.Tools;
using Masuit.Tools.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using PVDEMCS.Common;
using PVDEMCS.Common.Constant;
using PVDEMCS.Services;
using PVDEMCS.Services.Models;
using System;
namespace PVDEMCS.Controllers
{
/// <summary>
/// 设备数据记录与统计
/// </summary>
[ApiController]
[Route("[controller]/[action]")]
public class EquipmentRecordController : Controller
{
private IEquipmentRecordService _equipmentRecordService;
private IEquipmentService _equipmentService;
public EquipmentRecordController(IEquipmentRecordService equipmentRecordService, IEquipmentService equipmentService)
{
this._equipmentRecordService = equipmentRecordService;
this._equipmentService = equipmentService;
}
#region 设备状态记录
/// <summary>
/// 获取设备状态记录分页列表(分钟)
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
[HttpGet]
public Result<PagedList<EquipmentRecord>> GetEquipmentRecordPageList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size = 20)
{
var result = _equipmentRecordService.GetEquipmentRecordPageList(equipmentId, equipmentName, equipmentCode, equipmentType, begTime, endTime, page, size);
return result;
}
/// <summary>
/// 获取设备状态记录列表(分钟)
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns></returns>
[HttpGet]
public Result<List<EquipmentRecord>> GetEquipmentRecordList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime)
{
var result = _equipmentRecordService.GetEquipmentRecordList(equipmentId, equipmentName, equipmentCode, equipmentType, begTime, endTime);
return result;
}
/// <summary>
/// 添加或更新设备状态记录
/// 1.如果设备最新记录状态没有改变则更新结束时间
/// 2.如果没有记录则添加记录
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="state">设备状态,运行:Run待机:Stop报警:Alarm</param>
/// <param name="dateTime">记录时间</param>
/// <returns></returns>
//[HttpPost]
//public Result AddUpdateEquipmentRecord(string equipmentId, string state, DateTime dateTime)
//{
// var result = _equipmentRecordService.AddUpdateEquipmentRecord(equipmentId, state, dateTime);
// return result;
//}
///// <summary>
///// 进行设备状态记录统计(日统计)
///// </summary>
///// <param name="date"></param>
///// <returns></returns>
//[HttpPost]
//public Result RunEquipmentRecordTotal(DateTime date)
//{
// var result = _equipmentRecordService.RunEquipmentRecordTotal(date);
// return result;
//}
#endregion
#region 设备记录统计
/// <summary>
/// 获取设备状态记录统计(日)分页列表(分钟)
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
[HttpGet]
public Result<PagedList<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size = 20)
{
var result = _equipmentRecordService.GetEquipmentRecordDayTotalPageList(equipmentName, equipmentCode, equipmentType, begTime, endTime, page, size);
return result;
}
/// <summary>
/// 获取设备状态记录统计(日)列表(分钟)
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
[HttpGet]
public Result<List<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime)
{
var result = _equipmentRecordService.GetEquipmentRecordDayTotalList(equipmentName, equipmentCode, equipmentType, begTime, endTime);
return result;
}
/// <summary>
/// 获取设备状态记录统计分页列表(小时)
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
[HttpGet]
public Result<PagedList<EquipmentRecordTotal>> GetEquipmentRecordTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size = 20)
{
var result = _equipmentRecordService.GetEquipmentRecordTotalPageList(equipmentName, equipmentCode, equipmentType, begTime, endTime, page, size);
if (result.IsSuccess)
{
foreach (var item in result.Content.Data)
{
item.TotalAlarmTime = Math.Round(item.TotalAlarmTime / 60, 2);
item.TotalStopTime = Math.Round(item.TotalStopTime / 60, 2);
item.TotalRunningTime = Math.Round(item.TotalRunningTime / 60, 2);
}
}
return result;
}
/// <summary>
/// 获取设备状态记录统计列表(小时)
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
[HttpGet]
public Result<List<EquipmentRecordTotal>> GetEquipmentRecordTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime)
{
var result = _equipmentRecordService.GetEquipmentRecordTotalList(equipmentName, equipmentCode, equipmentType, begTime, endTime);
if (result.IsSuccess)
{
foreach (var item in result.Content)
{
item.TotalAlarmTime = Math.Round(item.TotalAlarmTime / 60, 2);
item.TotalStopTime = Math.Round(item.TotalStopTime / 60, 2);
item.TotalRunningTime = Math.Round(item.TotalRunningTime / 60, 2);
}
}
return result;
}
/// <summary>
/// 根据设备Id获取记录统计小时
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <returns></returns>
[HttpGet]
public Result<EquipmentRecordTotal> GetEquipmentRecordTotalDetail(string equipmentId)
{
var result = _equipmentRecordService.GetEquipmentRecordTotalDetail(equipmentId);
if (result.IsSuccess && !result.Content.IsNullOrEmpty())
{
result.Content.TotalAlarmTime = Math.Round(result.Content.TotalAlarmTime / 60, 2);
result.Content.TotalStopTime = Math.Round(result.Content.TotalStopTime / 60, 2);
result.Content.TotalRunningTime = Math.Round(result.Content.TotalRunningTime / 60, 2);
}
return result;
}
/// <summary>
/// 获取设备OEE信息
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="begDate">开始时间</param>
/// <param name="endDate">结束时间</param>
/// <returns></returns>
[HttpGet]
public Result<EquipmentOEETotal> GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate)
{
var result = _equipmentRecordService.GetEquipmentOEEMonthTotal(equipmentId, begDate, endDate);
if (result.IsSuccess && !result.Content.IsNullOrEmpty())
{
result.Content.TotalAlarmTime = Math.Round(result.Content.TotalAlarmTime / 60, 2);
result.Content.TotalStopTime = Math.Round(result.Content.TotalStopTime / 60, 2);
result.Content.TotalRunningTime = Math.Round(result.Content.TotalRunningTime / 60, 2);
}
return result;
}
/// <summary>
/// 获取设备总览
/// </summary>
/// <returns></returns>
[HttpGet]
public Result<List<EquipmentStateView>> GetEquipmentStateView()
{
var equipments = _equipmentService.GetEquipmentList();
var ret = new List<EquipmentStateView>();
//获取所有设备状态汇总
var allTotal = equipments.Content.GroupBy(f => f.State).Select(f => new
{
State = f.Key,
count = f.Count()
}).ToList();
var equipmentStateView = new EquipmentStateView();
equipmentStateView.EquipmentType = "All";
var alarm = allTotal.Where(f => f.State == EquipmentState.Alarm).FirstOrDefault();
if (!alarm.IsNullOrEmpty())
{
equipmentStateView.Alarm = alarm.count;
}
var run = allTotal.Where(f => f.State == EquipmentState.Run).FirstOrDefault();
if (!run.IsNullOrEmpty())
{
equipmentStateView.Run = run.count;
}
var stop = allTotal.Where(f => f.State == EquipmentState.Stop).FirstOrDefault();
if (!stop.IsNullOrEmpty())
{
equipmentStateView.Stop = stop.count;
}
ret.Add(equipmentStateView);
//根据设备类型获取状态汇总
var equimentTypeTotal = equipments.Content.GroupBy(f => new { f.EquipmentType, f.State }).Select(f => new
{
equipmentType = f.Key.EquipmentType,
State = f.Key.State,
count = f.Count()
}).ToList();
var equimentTypes = new string[] { EquipmentType.Balzers, EquipmentType.CemeCon, EquipmentType.Ionbond };
foreach (var type in equimentTypes)
{
equipmentStateView = new EquipmentStateView();
equipmentStateView.EquipmentType = type;
if (equimentTypeTotal.Count > 0)
{
var alarmType = equimentTypeTotal.Where(f => f.State == EquipmentState.Alarm && f.equipmentType == type).FirstOrDefault();
if (!alarmType.IsNullOrEmpty())
{
equipmentStateView.Alarm = alarmType.count;
}
var runType = equimentTypeTotal.Where(f => f.State == EquipmentState.Run && f.equipmentType == type).FirstOrDefault();
if (!runType.IsNullOrEmpty())
{
equipmentStateView.Run = runType.count;
}
var stopType = equimentTypeTotal.Where(f => f.State == EquipmentState.Stop && f.equipmentType == type).FirstOrDefault();
if (!stopType.IsNullOrEmpty())
{
equipmentStateView.Stop = stopType.count;
}
}
ret.Add(equipmentStateView);
}
return new Result<List<EquipmentStateView>>(ret);
}
/// <summary>
/// 获取报警设备列表
/// </summary>
/// <returns></returns>
[HttpGet]
public Result<List<EquipmentInfo>> GetEquipmentAlarmList()
{
var equipments = _equipmentService.GetEquipmentList();
var alarmList = equipments.Content.Where(f => f.State == EquipmentState.Alarm).ToList();
return new Result<List<EquipmentInfo>>(alarmList);
}
/// <summary>
/// 获取设备状态记录月统计(小时)
/// </summary>
/// <returns></returns>
[HttpGet]
public Result<List<EquipmentRecordStateMonthTotal>> GetEquipmentRecordStateMonthTotal()
{
var result = _equipmentRecordService.GetEquipmentRecordStateMonthTotal();
if (result.IsSuccess)
{
foreach (var item in result.Content)
{
item.TotalAlarmTime = Math.Round(item.TotalAlarmTime / 60, 2);
item.TotalStopTime = Math.Round(item.TotalStopTime / 60, 2);
item.TotalRunningTime = Math.Round(item.TotalRunningTime / 60, 2);
}
}
return result;
}
/// <summary>
/// 获取设备记录开炉次数月统计
/// </summary>
/// <returns></returns>
[HttpGet]
public Result<List<EquipmentRecordFurnaceMonthTotal>> GetEquipmentRecordFurnaceMonthTotal()
{
var result = _equipmentRecordService.GetEquipmentRecordFurnaceMonthTotal();
return result;
}
/// <summary>
/// 获取设备记录OEE月统计
/// </summary>
/// <returns></returns>
[HttpGet]
public Result<List<EquipmentOEEMonthTotal>> GetEquipmentRecordOEEMonthTotal()
{
var result = _equipmentRecordService.GetEquipmentRecordOEEMonthTotal();
return result;
}
#endregion
}
}

@ -0,0 +1,111 @@
using Masuit.Tools.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using PVDEMCS.Common;
using PVDEMCS.Services;
using PVDEMCS.Services.Models;
using System.Xml.Linq;
namespace PVDEMCS.Controllers
{
/// <summary>
/// 系统参数设置
/// </summary>
[ApiController]
[Route("[controller]/[action]")]
public class SysConfigController : Controller
{
private ISysConfigService _sysConfigService;
public SysConfigController(ISysConfigService sysConfigService)
{
this._sysConfigService = sysConfigService;
}
/// <summary>
/// 获取系统参数设置分页列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
[HttpGet]
public Result<PagedList<SysConfig>> GetSysConfigPageList(string configName, string configKey, int page, int size = 20)
{
var result = this._sysConfigService.GetSysConfigPageList(configName, configKey, page, size);
return result;
}
/// <summary>
/// 获取系统参数设置列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <returns></returns>
[HttpGet]
public Result<List<SysConfig>> GetSysConfigList(string configName, string configKey)
{
var result = this._sysConfigService.GetSysConfigList(configName, configKey);
return result;
}
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet]
public Result<SysConfig> GetSysConfigDetailById(string id)
{
var result = this._sysConfigService.GetSysConfigDetailById(id);
return result;
}
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="name"></param>
/// /// <param name="key"></param>
/// <returns></returns>
[HttpGet]
public Result<SysConfig> GetSysConfigDetailNameOrKey(string name, string key = "")
{
var result = this._sysConfigService.GetSysConfigDetailNameOrKey(name, key);
return result;
}
/// <summary>
/// 添加系统参数设置
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
public Result AddSysConfig(SysConfig info)
{
var result = this._sysConfigService.AddSysConfig(info);
return result;
}
/// <summary>
/// 更新系统参数设置
/// </summary>
/// <param name="info"></param>
[HttpPost]
public Result UpdateSysConfig(SysConfig info)
{
var result = this._sysConfigService.UpdateSysConfig(info);
return result;
}
/// <summary>
/// 删除系统参数设置
/// </summary>
/// <param name="id"></param>
[HttpPost]
public Result DeleteSysConfig(string id)
{
var result = this._sysConfigService.DeleteSysConfig(id);
return result;
}
}
}

@ -0,0 +1,166 @@
using Masuit.Tools.Models;
using Microsoft.AspNetCore.Mvc;
using PVDEMCS.Common;
using PVDEMCS.Services.Models;
using PVDEMCS.Services;
using System;
using Masuit.Tools.Security;
using Masuit.Tools;
using Microsoft.AspNetCore.Identity;
using System.Security.Policy;
namespace PVDEMCS.Controllers
{
/// <summary>
/// 用户信息
/// </summary>
[ApiController]
[Route("[controller]/[action]")]
public class UserController : Controller
{
private string salt = "75846542";
private ISysUserService _sysUserService;
public UserController(ISysUserService sysUserService)
{
this._sysUserService = sysUserService;
}
/// <summary>
/// 获取用户信息分页列表
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="activated">是否其哟个</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
[HttpGet]
public Result<PagedList<SysUser>> GetSysUserPageList(string userName, bool? activated, int page, int size = 20)
{
var result = this._sysUserService.GetSysUserPageList(userName, activated, page, size);
return result;
}
/// <summary>
/// 登录
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="pwd">密码</param>
/// <returns></returns>
[HttpPost]
public Result<SysUser> Lgoin(string userName, string pwd)
{
var user = _sysUserService.GetSysUserDetail("", userName);
if (!user.IsSuccess)
{
return user;
}
if (!user.Content.IsNullOrEmpty())
{
var value = Hash(pwd);
if (user.Content.Password == value)
{
user.Content.Password = null;
return user;
}
}
user.Content = null;
user.Message = "用户名或密码不正确!";
return user;
}
/// <summary>
/// 修改密码
/// </summary>
/// <param name="id">用户id</param>
/// <param name="oldPwd">旧密码</param>
/// <param name="newPwd">新密码</param>
/// <returns></returns>
[HttpPost]
public Result UpdatePassword(string id, string oldPwd, string newPwd)
{
var result = this._sysUserService.GetSysUserDetail(id, "");
if (!result.IsSuccess)
{
return result;
}
var old = Hash(oldPwd);
if (old != result.Content.Password)
{
return new Result("原密码不正确!");
}
var pwd = Hash(newPwd);
var res = _sysUserService.UpdatePassword(id, pwd);
if (!res.IsSuccess)
{
return res;
}
return new Result();
}
/// <summary>
/// 获取用户明细
/// </summary>
/// <param name="id">用户id</param>
/// <returns></returns>
[HttpGet]
public Result<SysUser> GetSysUserDetail(string id)
{
var result = this._sysUserService.GetSysUserDetail(id, "");
if (result.IsSuccess)
{
result.Content.Password = null;
}
return result;
}
/// <summary>
/// 添加用户
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
public Result AddSysUser(SysUser info)
{
info.Password = Hash(info.Password);
var result = this._sysUserService.AddSysUser(info);
return result;
}
/// <summary>
/// 更新用户
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
public Result UpdateSysUser(SysUser info)
{
info.Password = null;
var result = this._sysUserService.UpdateSysUser(info);
return result;
}
/// <summary>
/// 删除用户
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpPost]
public Result DeleteSysUser(string id)
{
var result = this._sysUserService.DeleteUser(id);
return result;
}
[NonAction]
private string Hash(string value)
{
byte[] passwordAndSaltBytes = System.Text.Encoding.UTF8.GetBytes(value + salt);
byte[] hashBytes = new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes);
string hashString = Convert.ToBase64String(hashBytes);
return hashString;
}
}
}

@ -0,0 +1,31 @@
namespace PVDEMCS.Devices
{
public sealed class DeviceProtocol
{
//
// 摘要:
// 1200系列
public const string S7_1200 = "S7_1200";
//
// 摘要:
// 300系列
public const string S7_300 = "S7_300";
//
// 摘要:
// 400系列
public const string S7_400 = "S7_400";
//
// 摘要:
// 1500系列PLC
public const string S7_1500 = "S7_1500";
//
// 摘要:
// 200的smart系列
public const string S7_200Smart = "S7_200Smart";
//
// 摘要:
// 200系统需要额外配置以太网模块
public const string S7_200 = "S7_200";
}
}

@ -0,0 +1,34 @@
using PVDEMCS.Common.DI;
using PVDEMCS.Services;
using PVDEMCS.Services.Models;
using System.Threading;
namespace PVDEMCS.Devices
{
/// <summary>
/// 设备运行
/// </summary>
public interface IDeviceRun : IDependency
{
/// <summary>
/// 获取所有点位信息
/// </summary>
List<DevicePoint> GetDevicePoints { get; }
/// <summary>
/// 获取控制器连接状态
/// </summary>
Dictionary<string, bool> GetDeviceIsConnected { get; }
/// <summary>
/// 开始运行
/// </summary>
void Run();
/// <summary>
/// 停止运行
/// </summary>
void Stop();
}
}

@ -0,0 +1,262 @@
using HslCommunication.Core.Address;
using HslCommunication;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using HslCommunication.Profinet.Siemens;
using PVDEMCS.Common.DI;
using PVDEMCS.Common;
namespace PVDEMCS.Devices
{
/// <summary>
/// PLC通信接口
/// </summary>
public interface IPLCCommunicationService
{
/// <summary>
/// 是否已连接
/// </summary>
bool IsConnected { get; }
#region 同步
/// <summary>
/// 连接PLC长连接
/// </summary>
/// <param name="address"></param>
/// <param name="port"></param>
Result Connection(string address, int port = 0);
/// <summary>
/// 关闭连接PLC长连接
/// </summary>
Result ColseConnection();
/// <summary>
/// 读取指定地址的byte[]值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Result<byte[]> ReadBytes(string address, ushort length);
/// <summary>
/// 读取指定地址的bool值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Result<bool> ReadBool(string address);
/// <summary>
/// 读取指定地址的byte值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Result<byte> ReadByte(string address);
/// <summary>
/// 读取指定地址的Int16值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Result<short> ReadInt16(string address);
/// <summary>
/// 读取指定地址的Int32值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Result<int> ReadInt32(string address);
/// <summary>
/// 读取指定地址的long值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Result<long> ReadLong(string address);
/// <summary>
/// 读取指定地址的Float值
/// </summary>
/// <returns></returns>
Result<float> ReadFloat(string address);
/// <summary>
/// 读取指定地址的double值
/// </summary>
/// <returns></returns>
Result<double> ReadDouble(string address);
/// <summary>
/// 写入bool值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Result Write(string address, bool value);
/// <summary>
/// 写入byte值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Result Write(string address, byte value);
/// <summary>
/// 写入Int16值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Result Write(string address, short value);
/// <summary>
/// 写入Int32值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Result Write(string address, int value);
/// <summary>
/// 写入float值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Result Write(string address, float value);
/// <summary>
/// 写入double值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Result Write(string address, double value);
/// <summary>
/// 写入long值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Result Write(string address, long value);
#endregion
#region 异步
/// <summary>
/// 连接PLC长连接
/// </summary>
/// <param name="address"></param>
/// <param name="port"></param>
Task<Result> ConnectionAsync(string address, int port = 0);
/// <summary>
/// 关闭连接PLC长连接
/// </summary>
Task<Result> ColseConnectionAsyn();
/// <summary>
/// 读取指定地址的byte[]值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Task<Result<byte[]>> ReadBytesAsync(string address, ushort length);
/// <summary>
/// 读取指定地址的bool值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Task<Result<bool>> ReadBoolAsync(string address);
/// <summary>
/// 读取指定地址的byte值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Task<Result<byte>> ReadByteAsync(string address);
/// <summary>
/// 读取指定地址的Int16值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Task<Result<short>> ReadInt16Async(string address);
/// <summary>
/// 读取指定地址的Int32值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Task<Result<int>> ReadInt32Async(string address);
/// <summary>
/// 读取指定地址的long值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
Task<Result<long>> ReadLongAsync(string address);
/// <summary>
/// 读取指定地址的Float值
/// </summary>
/// <returns></returns>
Task<Result<float>> ReadFloatAsync(string address);
/// <summary>
/// 读取指定地址的double值
/// </summary>
/// <returns></returns>
Task<Result<double>> ReadDoubleAsync(string address);
/// <summary>
/// 写入bool值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Task<Result> WriteAsync(string address, bool value);
/// <summary>
/// 写入byte值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Task<Result> WriteAsync(string address, byte value);
/// <summary>
/// 写入Int16值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Task<Result> WriteAsync(string address, short value);
/// <summary>
/// 写入Int32值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Task<Result> WriteAsync(string address, int value);
/// <summary>
/// 写入float值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Task<Result> WriteAsync(string address, float value);
/// <summary>
/// 写入double值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Task<Result> WriteAsync(string address, double value);
/// <summary>
/// 写入long值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
Task<Result> WriteAsync(string address, long value);
#endregion
}
}

@ -0,0 +1,282 @@
using Masuit.Tools;
using PVDEMCS.Common;
using PVDEMCS.Common.Log;
using PVDEMCS.Devices;
using PVDEMCS.Services.Models;
using System.Security.Cryptography;
namespace PVDEMCS.Devices.Impl
{
/// <summary>
/// 控制器点位监控
/// </summary>
public class DeviceMonitor
{
private DeviceInfo deviceInfo;
private IPLCCommunicationService plcCommunicationService;
private List<DevicePoint> devicePoints;
private object lockObj = new object();
private bool isRun = false;
public DeviceMonitor(DeviceInfo deviceInfo)
{
this.deviceInfo = deviceInfo;
devicePoints = new List<DevicePoint>();
PointMonitor();
}
/// <summary>
/// PLC 点位改变触发
/// </summary>
public event EventHandler<DevicePoint> PointChange;
/// <summary>
/// 获取错误相信
/// </summary>
public event EventHandler<string> ErrorMessage;
/// <summary>
/// 控制器编号
/// </summary>
public string DeviceCode
{
get
{
return deviceInfo.DeviceCode;
}
}
/// <summary>
/// 间隔时间
/// </summary>
public int Interval { get; set; } = 2000;
public IPLCCommunicationService PLCCommunicationService
{
get
{
return plcCommunicationService;
}
}
/// <summary>
/// 连接状态
/// </summary>
public bool IsConnected
{
get
{
return plcCommunicationService.IsConnected;
}
}
/// <summary>
/// 监控是否运行
/// </summary>
public bool IsRun
{
get { return isRun; }
}
/// <summary>
/// 当前点位集合
/// </summary>
public ICollection<DevicePoint> Points
{
get
{
return devicePoints;
}
}
/// <summary>
/// PLC地址与端口
/// </summary>
public void Init(string address, int port = 0)
{
deviceInfo.Host = address;
deviceInfo.Port = port;
}
/// <summary>
/// 获取PLC通信接口
/// </summary>
/// <param name="plcCommunicationService"></param>
public void Init(IPLCCommunicationService plcCommunicationService)
{
this.plcCommunicationService = plcCommunicationService;
}
/// <summary>
/// 加载点位集合
/// </summary>
/// <param name="points"></param>
public void Load(params DevicePoint[] points)
{
if (points.IsNullOrEmpty())
{
throw new ArgumentException($"{nameof(points)}: 不能为空!");
}
if (devicePoints.Where(f => points.Select(ff => ff.PointCode).Contains(f.PointCode)).Count() > 0)
{
throw new ArgumentException($"{nameof(points)}: PointCode 不能重复!");
}
devicePoints.AddRange(points);
}
/// <summary>
/// 清理所有点位
/// </summary>
public void Clear()
{
devicePoints.Clear();
}
/// <summary>
/// 开始监控
/// </summary>
public async Task<bool> StartAsync()
{
if (plcCommunicationService == null)
{
plcCommunicationService = new S7CommunicationService(deviceInfo.Protocol);
}
if (!plcCommunicationService.IsConnected)
{
var result = await plcCommunicationService.ConnectionAsync(deviceInfo.Host, deviceInfo.Port);
if (!result.IsSuccess)
{
ErrorMessage?.Invoke(this, "开始PLC连接失败" + result.Message);
return await Task.FromResult(false);
}
isRun = true;
$"PLC控制器{deviceInfo.DeviceCode}连接成功".WriteInfoLog();
}
return await Task.FromResult(true);
}
/// <summary>
/// 停止监控
/// </summary>
public async Task<bool> StopAsync()
{
if (plcCommunicationService.IsConnected)
{
var result = await plcCommunicationService.ColseConnectionAsyn();
if (!result.IsSuccess)
{
ErrorMessage?.Invoke(this, "关闭PLC连接失败" + result.Message);
return await Task.FromResult(false);
}
isRun = false;
return await Task.FromResult(true);
}
return await Task.FromResult(true);
}
private void PointMonitor()
{
Task.Run(() =>
{
while (true)
{
lock (lockObj)
{
if (Points.Count > 0 && isRun && plcCommunicationService.IsConnected)
{
devicePoints.ForEach(async point =>
{
await CallDevicePoint(point);
});
}
Thread.Sleep(Interval);
}
}
});
}
/// <summary>
/// 获取PLC点位信息
/// </summary>
/// <param name="point"></param>
/// <returns></returns>
private async Task CallDevicePoint(DevicePoint point)
{
var type = Type.GetType(point.DataType);
var plcService = plcCommunicationService;
//Boolean
if (type.Equals(typeof(bool)))
{
var result = await plcService.ReadBoolAsync(point.Address);
GetReturnValue(point, result);
return;
}
//Byte
if (type.Equals(typeof(byte)))
{
var result = await plcService.ReadByteAsync(point.Address);
GetReturnValue(point, result);
return;
}
//Byte
if (type.Equals(typeof(byte)))
{
var result = await plcService.ReadByteAsync(point.Address);
GetReturnValue(point, result);
return;
}
//Int16
if (type.Equals(typeof(short)))
{
var result = await plcService.ReadInt16Async(point.Address);
GetReturnValue(point, result);
return;
}
//Int32
if (type.Equals(typeof(int)))
{
var result = await plcService.ReadInt32Async(point.Address);
GetReturnValue(point, result);
return;
}
//Int64
if (type.Equals(typeof(long)))
{
var result = await plcService.ReadLongAsync(point.Address);
GetReturnValue(point, result);
return;
}
//float
if (type.Equals(typeof(float)))
{
var result = await plcService.ReadFloatAsync(point.Address);
GetReturnValue(point, result);
return;
}
//double
if (type.Equals(typeof(double)))
{
var result = await plcService.ReadDoubleAsync(point.Address);
GetReturnValue(point, result);
return;
}
}
private void GetReturnValue<T>(DevicePoint point, Result<T> result)
{
if (result.IsSuccess)
{
if (point.ObjectValue == null || !point.ObjectValue.Equals(result.Content))
{
point.ObjectValue = result.Content;
PointChange?.Invoke(this, point);
$"点位发生变更:{point.ToJsonString()}".WriteInfoLog();
}
}
else
{
ErrorMessage?.Invoke(this, result.Message);
}
}
}
}

@ -0,0 +1,232 @@
using AngleSharp.Css.Dom;
using Masuit.Tools;
using PVDEMCS.Common.Constant;
using PVDEMCS.Common.Log;
using PVDEMCS.Devices;
using PVDEMCS.Services;
using PVDEMCS.Services.Impl;
using PVDEMCS.Services.Models;
using System.Linq;
using System.Threading;
namespace PVDEMCS.Devices.Impl
{
/// <summary>
/// 设备运行
/// </summary>
public class DeviceRun : IDeviceRun
{
private IDeviceService deviceService;
private IEquipmentRecordService equipmentRecordService;
private List<DeviceMonitor> monitors = new List<DeviceMonitor>();
private object lockObj = new object();
private object lockObj1 = new object();
public DeviceRun(IDeviceService deviceService, IEquipmentRecordService equipmentRecordService)
{
this.deviceService = deviceService;
this.equipmentRecordService = equipmentRecordService;
TaskRun();
}
/// <summary>
/// 获取所有点位信息
/// </summary>
public List<DevicePoint> GetDevicePoints
{
get
{
return monitors.SelectMany(f => f.Points).ToList();
}
}
/// <summary>
/// 获取控制器连接状态
/// </summary>
public Dictionary<string, bool> GetDeviceIsConnected
{
get
{
return monitors.ToDictionary(f => f.DeviceCode, f => f.IsConnected);
}
}
/// <summary>
/// 开始运行
/// </summary>
public void Run()
{
Stop();
monitors.Clear();
var result = deviceService.GetDeviceInfoList("", "", true);
if (result.IsSuccess)
{
var devices = result.Content;
foreach (var device in devices)
{
var deviceMonitor = new DeviceMonitor(device);
var devicePoints = deviceService.GetDevicePointList(device.Id, activated: true);
if (devicePoints.IsSuccess && devicePoints.Content.Count > 0)
{
deviceMonitor.Load(devicePoints.Content.ToArray());
}
deviceMonitor.ErrorMessage += DeviceMonitor_ErrorMessage;
deviceMonitor.PointChange += DeviceMonitor_PointChnage; ;
monitors.Add(deviceMonitor);
Task<bool> task = deviceMonitor.StartAsync();
($"PLC控制器{device.DeviceCode},开始启动...").WriteInfoLog();
}
}
}
/// <summary>
/// 停止运行
/// </summary>
public void Stop()
{
foreach (var item in monitors)
{
var task = item.StopAsync();
}
}
//
private void TaskRun()
{
//监控设备连接
Task.Run(() =>
{
while (true)
{
foreach (var item in monitors)
{
var task = item.StartAsync();
}
Thread.Sleep(5000);
}
});
//添加设备记录
Task.Run(() =>
{
while (true)
{
try
{
RunEquipmentRecord();
Thread.Sleep(3000);
}
catch (Exception ex)
{
ex.WriteErrorLog();
}
}
});
//设备记录日统计
Task.Run(() =>
{
while (true)
{
try
{
equipmentRecordService.RunEquipmentRecordDayTotal(DateTime.Now);
Thread.Sleep(1000 * 60);
}
catch (Exception ex)
{
ex.WriteErrorLog();
}
}
});
//设备记录统计
Task.Run(() =>
{
while (true)
{
equipmentRecordService.RunEquipmentRecordTotal();
Thread.Sleep(1000 * 1800);
}
});
}
//记录设备数据
private void RunEquipmentRecord()
{
try
{
foreach (var monitor in monitors)
{
if (!monitor.IsRun)
{
continue;
}
var points = monitor.Points;
if (points.IsNullOrEmpty())
{
continue;
}
var equipmentIds = points.Select(f => f.EquipmentId).Distinct();
foreach (var id in equipmentIds)
{
var list = points.Where(f => f.EquipmentId == id).ToList();
if (list.Count >= 2)
{
var startStop = list.Where(f => f.ActionType == ActionType.StartStop).FirstOrDefault();
var fault = list.Where(f => f.ActionType == ActionType.Fault).FirstOrDefault();
if (!startStop.IsNullOrEmpty() &&
!fault.IsNullOrEmpty() &&
!startStop.ObjectValue.IsNullOrEmpty() &&
!fault.ObjectValue.IsNullOrEmpty())
{
var state = EquipmentState.Stop;
//如果运行状态比警告状态高这里先判断运行状态如果运行状态为false在判断警告状态
if (startStop.GetValue<bool>())
{
state = EquipmentState.Run;
}
else if (fault.GetValue<bool>())
{
state = EquipmentState.Alarm;
}
//如果为报警状态,则判断是否设为手动,且为不报警,则屏蔽报警信号,不做记录
if (state == EquipmentState.Alarm &&
startStop.Model == EquipmentAlarmModel.Manual &&
!startStop.IsAlarm)
{
continue;
}
equipmentRecordService.AddUpdateEquipmentRecord(id, state, DateTime.Now);
}
}
}
}
}
catch (Exception ex)
{
ex.WriteErrorLog();
}
}
private void DeviceMonitor_PointChnage(object sender, DevicePoint e)
{
}
private void DeviceMonitor_ErrorMessage(object sender, string e)
{
e.WriteErrorLog();
}
}
}

@ -0,0 +1,537 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using HslCommunication.BasicFramework;
using HslCommunication.Core.Address;
using HslCommunication.Core.IMessage;
using HslCommunication.Core;
using HslCommunication;
using HslCommunication.Profinet.Siemens;
using HslCommunication.Reflection;
using PVDEMCS.Common.Tools;
using PVDEMCS.Devices;
using PVDEMCS.Common;
namespace PVDEMCS.Devices.Impl
{
/// <summary>
/// PLC通信服务 SiemensS7 smart200 实现
/// </summary>
internal class S7CommunicationService : IPLCCommunicationService
{
private SiemensS7Net siemensS7Net = null;
/// <summary>
/// 是否已连接
/// </summary>
public bool IsConnected { get; private set; }
public S7CommunicationService(string deviceProtocol)
{
switch (deviceProtocol)
{
case DeviceProtocol.S7_400:
siemensS7Net = new SiemensS7Net(SiemensPLCS.S400);
break;
case DeviceProtocol.S7_1200:
siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200);
break;
case DeviceProtocol.S7_1500:
siemensS7Net = new SiemensS7Net(SiemensPLCS.S1500);
break;
case DeviceProtocol.S7_200:
siemensS7Net = new SiemensS7Net(SiemensPLCS.S200);
break;
case DeviceProtocol.S7_300:
siemensS7Net = new SiemensS7Net(SiemensPLCS.S300);
break;
case DeviceProtocol.S7_200Smart:
siemensS7Net = new SiemensS7Net(SiemensPLCS.S200Smart);
break;
default:
throw new ArgumentException($"DeviceProtocol 参数不正确,没有{deviceProtocol}协议");
}
siemensS7Net.ConnectTimeOut = 3000;
}
#region 同步
/// <summary>
/// 连接PLC长连接
/// </summary>
/// <param name="address"></param>
/// <param name="port"></param>
public Result Connection(string address, int port = 0)
{
siemensS7Net.IpAddress = address;
if (port > 0)
{
siemensS7Net.Port = port;
}
var operateResult = siemensS7Net.ConnectServer();
var result = ConvertResult(operateResult);
if (result.IsSuccess)
{
IsConnected = true;
}
return result;
}
/// <summary>
/// 关闭连接PLC长连接
/// </summary>
public Result ColseConnection()
{
var operateResult = siemensS7Net.ConnectClose();
var result = ConvertResult(operateResult);
if (result.IsSuccess)
{
IsConnected = false;
}
return result;
}
/// <summary>
/// 读取指定地址的byte[]值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public Result<byte[]> ReadBytes(string address, ushort length)
{
var operateResult = siemensS7Net.Read(address, length);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的bool值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public Result<bool> ReadBool(string address)
{
var operateResult = siemensS7Net.ReadBool(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的byte值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public Result<byte> ReadByte(string address)
{
var operateResult = siemensS7Net.ReadByte(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的Int16值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public Result<short> ReadInt16(string address)
{
var operateResult = siemensS7Net.ReadInt16(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的Int32值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public Result<int> ReadInt32(string address)
{
var operateResult = siemensS7Net.ReadInt32(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的long值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public Result<long> ReadLong(string address)
{
var operateResult = siemensS7Net.ReadInt64(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的Float值
/// </summary>
/// <returns></returns>
public Result<float> ReadFloat(string address)
{
var operateResult = siemensS7Net.ReadFloat(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的double值
/// </summary>
/// <returns></returns>
public Result<double> ReadDouble(string address)
{
var operateResult = siemensS7Net.ReadDouble(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入bool值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public Result Write(string address, bool value)
{
var operateResult = siemensS7Net.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入byte值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public Result Write(string address, byte value)
{
var operateResult = siemensS7Net.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入Int16值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public Result Write(string address, short value)
{
var operateResult = siemensS7Net.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入Int32值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public Result Write(string address, int value)
{
var operateResult = siemensS7Net.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入float值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public Result Write(string address, float value)
{
var operateResult = siemensS7Net.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入double值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public Result Write(string address, double value)
{
var operateResult = siemensS7Net.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入long值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public Result Write(string address, long value)
{
var operateResult = siemensS7Net.Write(address, value);
var result = ConvertResult(operateResult);
return result;
}
#endregion
#region 异步
/// <summary>
/// 连接PLC长连接
/// </summary>
/// <param name="address"></param>
/// <param name="port"></param>
public async Task<Result> ConnectionAsync(string address, int port = 0)
{
siemensS7Net.IpAddress = address;
if (port > 0)
{
siemensS7Net.Port = port;
}
var operateResult = await siemensS7Net.ConnectServerAsync();
var result = ConvertResult(operateResult);
if (operateResult.IsSuccess)
{
IsConnected = true;
}
return result;
}
/// <summary>
/// 关闭连接PLC长连接
/// </summary>
public async Task<Result> ColseConnectionAsyn()
{
var operateResult = await siemensS7Net.ConnectCloseAsync();
var result = ConvertResult(operateResult);
if (operateResult.IsSuccess)
{
IsConnected = false;
}
return result;
}
/// <summary>
/// 读取指定地址的byte[]值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public async Task<Result<byte[]>> ReadBytesAsync(string address, ushort length)
{
var operateResult = await siemensS7Net.ReadAsync(address, length);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的bool值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public async Task<Result<bool>> ReadBoolAsync(string address)
{
var operateResult = await siemensS7Net.ReadBoolAsync(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的byte值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public async Task<Result<byte>> ReadByteAsync(string address)
{
var operateResult = await siemensS7Net.ReadByteAsync(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的Int16值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public async Task<Result<short>> ReadInt16Async(string address)
{
var operateResult = await siemensS7Net.ReadInt16Async(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的Int32值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public async Task<Result<int>> ReadInt32Async(string address)
{
var operateResult = await siemensS7Net.ReadInt32Async(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的long值
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public async Task<Result<long>> ReadLongAsync(string address)
{
var operateResult = await siemensS7Net.ReadInt64Async(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的Float值
/// </summary>
/// <returns></returns>
public async Task<Result<float>> ReadFloatAsync(string address)
{
var operateResult = await siemensS7Net.ReadFloatAsync(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 读取指定地址的double值
/// </summary>
/// <returns></returns>
public async Task<Result<double>> ReadDoubleAsync(string address)
{
var operateResult = await siemensS7Net.ReadDoubleAsync(address);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入bool值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public async Task<Result> WriteAsync(string address, bool value)
{
var operateResult = await siemensS7Net.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入byte值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public async Task<Result> WriteAsync(string address, byte value)
{
var operateResult = await siemensS7Net.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入Int16值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public async Task<Result> WriteAsync(string address, short value)
{
var operateResult = await siemensS7Net.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入Int32值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public async Task<Result> WriteAsync(string address, int value)
{
var operateResult = await siemensS7Net.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入float值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public async Task<Result> WriteAsync(string address, float value)
{
var operateResult = await siemensS7Net.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入double值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public async Task<Result> WriteAsync(string address, double value)
{
var operateResult = await siemensS7Net.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
/// <summary>
/// 写入long值
/// </summary>
/// <param name="address">写入地址</param>
/// <param name="value"></param>
public async Task<Result> WriteAsync(string address, long value)
{
var operateResult = await siemensS7Net.WriteAsync(address, value);
var result = ConvertResult(operateResult);
return result;
}
#endregion
/// <summary>
/// 转换 result (将框架结果结构转换成当前程序结果结构)
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
private Result ConvertResult(OperateResult result)
{
var retResult = ModelTools.PubClone<OperateResult, Result>.Trans(result);
return retResult;
}
/// <summary>
/// 转换 result (将框架结果结构转换成当前程序结果结构)
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
private Result<T> ConvertResult<T>(OperateResult<T> result)
{
VerifyTimeOut(result);
var retResult = ModelTools.PubClone<OperateResult<T>, Result<T>>.Trans(result);
retResult.Content = result.Content;
return retResult;
}
/// <summary>
/// 判断连接是否中断
/// </summary>
/// <param name="result"></param>
private void VerifyTimeOut(OperateResult result)
{
var msg = result.Message;
if (result!=null && !result.IsSuccess)
{
var isTimeOut = msg.Contains("连接") && msg.Contains("失败") && msg.Contains("超时时间为");
if (isTimeOut)
{
IsConnected = false;
}
}
}
}
}

@ -0,0 +1,32 @@
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<variable name="appName" value="PVDEMCS"/>
<targets>
<target name="logconsole" xsi:type="Console"
layout="${longdate} [${uppercase:${level}}] ${callsite}(${callsite-filename:includeSourcePath=False}:${callsite-linenumber}) - ${message} ${exception:format=ToString}"
/>
<target name="logfile"
xsi:type="File"
fileName="${basedir}/logs/${appName}-${shortdate}.log"
layout="${longdate} [${uppercase:${level}}] ${callsite}(${callsite-filename:includeSourcePath=False}:${callsite-linenumber}) - ${message} ${exception:format=ToString}"
maxArchiveFiles="999"
archiveFileName="${basedir}/logs/${appName}-${shortdate}-${###}.log"
createDirs="true"
archiveAboveSize="102400"
archiveEvery="Day"
encoding="UTF-8"
/>
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="logfile" />
</rules>
</nlog>

@ -0,0 +1,100 @@
using Masuit.Tools;
using Masuit.Tools.Reflection;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Models;
using PVDEMCS;
using PVDEMCS.Common.DI;
using PVDEMCS.Common.Log;
using PVDEMCS.Devices;
using PVDEMCS.Services;
using System.Configuration;
using System.Reflection;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
//options.SwaggerDoc("v1", new OpenApiInfo { Title = "PVDEMCS Api", Version = "v1" });
var xmlPathApp = Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml");
options.IncludeXmlComments(xmlPathApp, true);
});
//添加跨域策略
builder.Services.AddCors(options =>
{
options.AddPolicy("CorsPolicy", opt => opt.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().WithExposedHeaders("X-Pagination"));
});
//注册服务
builder.AddAutofacExt();
//
//builder.Services.AddDbContext<EFContext>(options =>
//{
// options.UseMySQL(builder.Configuration.GetConnectionString("MySqlConnection"));
//});
var app = builder.Build();
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
//}
app.UseSwagger();
app.UseSwaggerUI();
//使用跨域策略
app.UseCors("CorsPolicy");
//app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Lifetime.ApplicationStarted.Register(() =>
{
var logService = app.Services.GetService<ILogService>();
LogExtensions.Load(logService);
var deviceRun = app.Services.GetService<IDeviceRun>();
deviceRun.Run();
//var equipmentList = app.Services.GetService<IEquipmentService>();
//var equipmentRecord = app.Services.GetService<IEquipmentRecordService>();
//var ids = equipmentList.GetEquipmentList().Content.Select(f => f.Id).ToList();
//var startDate = DateTime.Parse("2023-01-01");
//var obj = new object();
//var result = System.Threading.Tasks.Parallel.ForEach(ids, id =>
// {
// Test.CreateData(startDate, id, (id, state, dt) =>
// {
// lock (obj)
// {
// equipmentRecord.AddUpdateEquipmentRecord(id, state, dt);
// }
// });
// });
//while (true)
//{
// if (startDate > DateTime.Now)
// {
// return;
// }
// equipmentRecord.RunEquipmentRecordDayTotal(startDate);
// startDate = startDate.AddDays(1);
// Thread.Sleep(100);
//}
});
app.Run();

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<DeleteExistingFiles>false</DeleteExistingFiles>
<ExcludeApp_Data>false</ExcludeApp_Data>
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<PublishProvider>FileSystem</PublishProvider>
<PublishUrl>bin\Release\net6.0\publish\</PublishUrl>
<WebPublishMethod>FileSystem</WebPublishMethod>
<_TargetId>Folder</_TargetId>
</PropertyGroup>
</Project>

@ -0,0 +1,31 @@
{
"profiles": {
"PVDEMCS": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"dotnetRunMessages": true,
"applicationUrl": "http://localhost:5223"
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
},
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:34771",
"sslPort": 0
}
}
}

@ -0,0 +1,129 @@
using Masuit.Tools.Models;
using PVDEMCS.Common;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories;
using PVDEMCS.Services.Repositories.Entities;
namespace PVDEMCS.Services
{
/// <summary>
/// PLC控制器 服务层 接口
/// </summary>
public interface IDeviceService : IDependency
{
#region PLC控制器
/// <summary>
/// 获取PLC控制器分页列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<DeviceInfo>> GetDevicePageList(string deviceCode, string deviceName, bool? activated, int page, int size);
/// <summary>
/// 获取PLC控制器列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// <returns></returns>
Result<List<DeviceInfo>> GetDeviceInfoList(string deviceCode="", string deviceName = "", bool? activated = false);
/// <summary>
/// 获取PLC控制器明细
/// </summary>
/// <param name="id">主键Id</param>
/// <returns></returns>
Result<DeviceInfo> GetDeviceDetail(string id);
/// <summary>
/// 添加PLC控制器
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result<string> AddDevice(DeviceInfo entity);
/// <summary>
/// 更新PLC控制器
/// </summary>
/// <param name="entity"></param>
Result UpdateDevice(DeviceInfo entity);
/// <summary>
/// 删除PLC控制器
/// </summary>
/// <param name="id"></param>
Result DeleteDevice(string id);
#endregion
#region PLC点位
/// <summary>
/// 获取PLC控制器点位分页列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<DevicePoint>> GetDevicePointPageList(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated, int page, int size);
/// <summary>
/// 获取PLC控制器点位列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
/// <param name="activated">是否启用</param>
/// <returns></returns>
Result<List<DevicePoint>> GetDevicePointList(string deviceId, string deviceName="", string deviceCode = "", string equipmentName = "", string equipmentCode = "", string equipmentType = "", string pointCode = "", string pointName = "", bool? activated = true);
/// <summary>
/// 获取PLC控制器点位明细
/// </summary>
/// <param name="id">Id</param>
/// <returns></returns>
Result<DevicePoint> GetDevicePointDetail(string id);
/// <summary>
/// 添加PLC控制器点位
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result<string> AddDevicePoint(DevicePoint entity);
/// <summary>
/// 更新PLC控制器点位
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result UpdateDevicePoint(DevicePoint entity);
/// <summary>
/// 删除PLC控制器点位
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result DeleteDevicePoint(string id);
#endregion
}
}

@ -0,0 +1,150 @@
using Masuit.Tools.Models;
using PVDEMCS.Common.DI;
using PVDEMCS.Common;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
namespace PVDEMCS.Services
{
/// <summary>
/// 设备数据记录与统计 服务层 接口
/// </summary>
public interface IEquipmentRecordService : IDependency
{
#region 设备状态记录
/// <summary>
/// 获取设备状态记录分页列表
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<EquipmentRecord>> GetEquipmentRecordPageList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size);
/// <summary>
/// 获取设备状态记录列表
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns></returns>
Result<List<EquipmentRecord>> GetEquipmentRecordList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime);
/// <summary>
/// 根据设备Id获取记录统计
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <returns></returns>
Result<EquipmentRecordTotal> GetEquipmentRecordTotalDetail(string equipmentId);
/// <summary>
/// 添加或更新设备状态记录
/// 1.如果设备最新记录状态没有改变则更新结束时间
/// 2.如果没有记录则添加记录
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="state">设备状态,运行:Run待机:Stop报警:Alarm</param>
/// <param name="dateTime">记录时间</param>
/// <returns></returns>
Result AddUpdateEquipmentRecord(string equipmentId, string state, DateTime dateTime);
/// <summary>
/// 进行设备状态记录统计(日统计)
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
Result RunEquipmentRecordDayTotal(DateTime date);
/// <summary>
/// 进行设备状态记录统计
/// </summary>
/// <returns></returns>
Result RunEquipmentRecordTotal();
#endregion
#region 设备记录统计
/// <summary>
/// 获取设备状态记录统计分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
Result<PagedList<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size);
/// <summary>
/// 获取设备状态记录统计列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
Result<List<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime);
/// <summary>
/// 获取设备状态记录统计分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
Result<PagedList<EquipmentRecordTotal>> GetEquipmentRecordTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size);
/// <summary>
/// 获取设备状态记录统计列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
Result<List<EquipmentRecordTotal>> GetEquipmentRecordTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime);
/// <summary>
/// 获取设备状态记录月统计
/// </summary>
/// <returns></returns>
Result<List<EquipmentRecordStateMonthTotal>> GetEquipmentRecordStateMonthTotal();
/// <summary>
/// 获取设备记录开炉次数月统计
/// </summary>
/// <returns></returns>
Result<List<EquipmentRecordFurnaceMonthTotal>> GetEquipmentRecordFurnaceMonthTotal();
/// <summary>
/// 获取设备记录OEE月统计
/// </summary>
/// <returns></returns>
Result<List<EquipmentOEEMonthTotal>> GetEquipmentRecordOEEMonthTotal();
/// <summary>
/// 获取设备OEE信息
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="begDate">开始时间</param>
/// <param name="endDate">结束时间</param>
/// <returns></returns>
Result<EquipmentOEETotal> GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate);
#endregion
}
}

@ -0,0 +1,63 @@
using Masuit.Tools.Models;
using PVDEMCS.Common.DI;
using PVDEMCS.Common;
using PVDEMCS.Services.Repositories.Entities;
using PVDEMCS.Services.Models;
namespace PVDEMCS.Services
{
/// <summary>
/// 设备管理 服务层 接口
/// </summary>
public interface IEquipmentService : IDependency
{
/// <summary>
/// 获取设备分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<EquipmentInfo>> GetEquipmentPageList(string equipmentName = "", string equipmentCode = "", string equipmentType = "", bool? activated = true, int page = 1, int size = 20);
/// <summary>
/// 获取设备列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="activated">是否启用</param>
Result<List<EquipmentInfo>> GetEquipmentList(string equipmentName = "", string equipmentCode = "", string equipmentType = "", bool? activated = true);
/// <summary>
/// 获取设备明显
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result<EquipmentInfo> GetEquipmentDetail(string id);
/// <summary>
/// 添加设备信息
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
Result AddEquipment(EquipmentInfo info);
/// <summary>
/// 更新设备信息
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
Result UpdateEquipment(EquipmentInfo info);
/// <summary>
/// 删除设备信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result DeleteEquipment(string id);
}
}

@ -0,0 +1,36 @@
using GuideScreen.Common.Common;
using PVDEMCS.Common.DI;
using System;
namespace PVDEMCS.Services
{
/// <summary>
/// 日志服务 接口
/// </summary>
public interface ILogService : IDependency
{
string LogDirectory { get; }
void ClearAgoDays(int day);
void Debug(string msg, Exception err);
void Debug(string msg, params object[] args);
void Error(string msg, Exception err);
void Error(string msg, params object[] args);
void Fatal(string msg, Exception err);
void Fatal(string msg, params object[] args);
void Info(string msg, Exception err);
void Info(string msg, params object[] args);
void Trace(string msg, Exception err);
void Trace(string msg, params object[] args);
}
}

@ -0,0 +1,67 @@
using Masuit.Tools.Models;
using PVDEMCS.Common.DI;
using PVDEMCS.Common;
using PVDEMCS.Services.Repositories.Entities;
using PVDEMCS.Services.Models;
namespace PVDEMCS.Services
{
/// <summary>
/// 系统参数设置 服务层 接口
/// </summary>
public interface ISysConfigService : IDependency
{
/// <summary>
/// 获取系统参数设置分页列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<SysConfig>> GetSysConfigPageList(string configName, string configKey, int page, int size);
/// <summary>
/// 获取系统参数设置列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <returns></returns>
Result<List<SysConfig>> GetSysConfigList(string configName, string configKey);
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result<SysConfig> GetSysConfigDetailById(string id);
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="name"></param>
/// <param name="key"></param>
/// <returns></returns>
Result<SysConfig> GetSysConfigDetailNameOrKey(string name, string key = "");
/// <summary>
/// 添加系统参数设置
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
Result AddSysConfig(SysConfig info);
/// <summary>
/// 更新系统参数设置
/// </summary>
/// <param name="info"></param>
Result UpdateSysConfig(SysConfig info);
/// <summary>
/// 删除系统参数设置
/// </summary>
/// <param name="id"></param>
Result DeleteSysConfig(string id);
}
}

@ -0,0 +1,61 @@
using Masuit.Tools.Models;
using PVDEMCS.Common.DI;
using PVDEMCS.Common;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
namespace PVDEMCS.Services
{
/// <summary>
/// 用户信息 服务层 接口
/// </summary>
public interface ISysUserService : IDependency
{
/// <summary>
/// 获取用户信息分页列表
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="activated">是否其哟个</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<SysUser>> GetSysUserPageList(string userName, bool? activated, int page, int size);
/// <summary>
/// 获取用户明细
/// </summary>
/// <param name="id">id</param>
/// <param name="userName">名称</param>
/// <returns></returns>
Result<SysUser> GetSysUserDetail(string id, string userName);
/// <summary>
/// 添加用户
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
Result AddSysUser(SysUser info);
/// <summary>
/// 更新用户
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
Result UpdateSysUser(SysUser info);
/// <summary>
/// 更新用户密码
/// </summary>
/// <param name="id">用户id</param>
/// <param name="pwd">密码</param>
/// <returns></returns>
Result UpdatePassword(string id, string pwd);
/// <summary>
/// 删除用户
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result DeleteUser(string id);
}
}

@ -0,0 +1,214 @@
using Masuit.Tools.Models;
using Microsoft.AspNetCore.Mvc.RazorPages;
using PVDEMCS.Common;
using PVDEMCS.Common.Tools;
using PVDEMCS.Devices;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories;
using PVDEMCS.Services.Repositories.Entities;
using PVDEMCS.Services.Repositories.Impl;
using System;
namespace PVDEMCS.Services.Impl
{
/// <summary>
/// PLC控制器 服务层 实现
/// </summary>
internal class DeviceService : IDeviceService
{
private readonly IDeviceRepository _deviceRepository;
public DeviceService(IDeviceRepository deviceRepository)
{
this._deviceRepository = deviceRepository;
}
#region PLC控制器
/// <summary>
/// 获取PLC控制器分页列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<DeviceInfo>> GetDevicePageList(string deviceCode, string deviceName, bool? activated, int page, int size)
{
var result = _deviceRepository.GetDevicePageList(deviceCode, deviceName, activated, page, size);
return result;
}
/// <summary>
/// 获取PLC控制器列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// <returns></returns>
public Result<List<DeviceInfo>> GetDeviceInfoList(string deviceCode, string deviceName, bool? activated = false)
{
var result = _deviceRepository.GetDeviceInfoList(deviceCode, deviceName, activated);
return result;
}
/// <summary>
/// 获取PLC控制器明细
/// </summary>
/// <param name="id">主键Id</param>
/// <returns></returns>
public Result<DeviceInfo> GetDeviceDetail(string id)
{
var result = new Result<DeviceInfo>();
var value = _deviceRepository.GetDeviceDetail(id);
if (!value.IsSuccess)
{
result.Message = value.Message;
return result;
}
result.Content = ModelTools.PubClone<DeviceInfoEntity, DeviceInfo>.Trans(value.Content);
return result;
}
/// <summary>
/// 添加PLC控制器
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public Result<string> AddDevice(DeviceInfo info)
{
var entity = ModelTools.PubClone<DeviceInfo, DeviceInfoEntity>.Trans(info);
var result = _deviceRepository.AddDevice(entity);
return result;
}
/// <summary>
/// 更新PLC控制器
/// </summary>
/// <param name="info"></param>
public Result UpdateDevice(DeviceInfo info)
{
var entity = ModelTools.PubClone<DeviceInfo, DeviceInfoEntity>.Trans(info);
var result = _deviceRepository.UpdateDevice(entity);
return result;
}
/// <summary>
/// 删除PLC控制器
/// </summary>
/// <param name="id"></param>
public Result DeleteDevice(string id)
{
var result = _deviceRepository.DeleteDevice(id);
return result;
}
#endregion
#region PLC点位
/// <summary>
/// 获取PLC控制器点位分页列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<DevicePoint>> GetDevicePointPageList(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated, int page, int size)
{
var result = _deviceRepository.GetDevicePointPageList(deviceId, deviceName, deviceCode, equipmentName, equipmentCode, equipmentType, pointCode, pointName, activated, page, size);
return result;
}
/// <summary>
/// 获取PLC控制器点位列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
/// <param name="activated">是否启用</param>
/// <returns></returns>
public Result<List<DevicePoint>> GetDevicePointList(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated)
{
var result = _deviceRepository.GetDevicePointList(deviceId, deviceName, deviceCode, equipmentName, equipmentCode, equipmentType, pointCode, pointName, activated);
return result;
}
/// <summary>
/// 获取PLC控制器点位明细
/// </summary>
/// <param name="id">Id</param>
/// <returns></returns>
public Result<DevicePoint> GetDevicePointDetail(string id)
{
var result = new Result<DevicePoint>();
var value = _deviceRepository.GetDevicePointDetail(id);
if (!value.IsSuccess)
{
result.Message = value.Message;
return result;
}
result.Content = ModelTools.PubClone<DevicePointEntity, DevicePoint>.Trans(value.Content);
return result;
}
/// <summary>
/// 添加PLC控制器点位
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public Result<string> AddDevicePoint(DevicePoint info)
{
var entity = ModelTools.PubClone<DevicePoint, DevicePointEntity>.Trans(info);
var result = _deviceRepository.AddDevicePoint(entity);
return result;
}
/// <summary>
/// 更新PLC控制器点位
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public Result UpdateDevicePoint(DevicePoint info)
{
var entity = ModelTools.PubClone<DevicePoint, DevicePointEntity>.Trans(info);
var result = _deviceRepository.UpdateDevicePoint(entity);
return result;
}
/// <summary>
/// 删除PLC控制器点位
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result DeleteDevicePoint(string id)
{
var result = _deviceRepository.DeleteDevicePoint(id);
return result;
}
#endregion
}
}

@ -0,0 +1,226 @@
using Masuit.Tools.Models;
using PVDEMCS.Common.DI;
using PVDEMCS.Common;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories;
using Microsoft.AspNetCore.Mvc.RazorPages;
using PVDEMCS.Common.Constant;
using System;
using PVDEMCS.Common.Tools;
using PVDEMCS.Services.Repositories.Entities;
namespace PVDEMCS.Services.Impl
{
/// <summary>
/// 设备数据记录与统计 服务层 实现
/// </summary>
internal class EquipmentRecordService : IEquipmentRecordService
{
private readonly IEquipmentRecordRepository _equipmentRecordRepository;
public EquipmentRecordService(IEquipmentRecordRepository equipmentRecordRepository)
{
this._equipmentRecordRepository = equipmentRecordRepository;
}
#region 设备状态记录
/// <summary>
/// 获取设备状态记录分页列表
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<EquipmentRecord>> GetEquipmentRecordPageList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size)
{
var result = this._equipmentRecordRepository.GetEquipmentRecordPageList(equipmentId, equipmentName, equipmentCode, equipmentType, begTime, endTime, page, size);
return result;
}
/// <summary>
/// 获取设备状态记录列表
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns></returns>
public Result<List<EquipmentRecord>> GetEquipmentRecordList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime)
{
var result = this._equipmentRecordRepository.GetEquipmentRecordList(equipmentId, equipmentName, equipmentCode, equipmentType, begTime, endTime);
return result;
}
/// <summary>
/// 添加或更新设备状态记录
/// 1.如果设备最新记录状态没有改变则更新结束时间
/// 2.如果没有记录则添加记录
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="state">设备状态,运行:Run待机:Stop报警:Alarm</param>
/// <returns></returns>
public Result AddUpdateEquipmentRecord(string equipmentId, string state, DateTime dateTime)
{
var result = this._equipmentRecordRepository.AddUpdateEquipmentRecord(equipmentId, state, dateTime);
return result;
}
/// <summary>
/// 进行设备状态记录统计(日统计)
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public Result RunEquipmentRecordDayTotal(DateTime date)
{
var result = this._equipmentRecordRepository.RunEquipmentRecordDayTotal(date);
return result;
}
/// <summary>
/// 进行设备状态记录统计
/// </summary>
/// <returns></returns>
public Result RunEquipmentRecordTotal()
{
var result = this._equipmentRecordRepository.RunEquipmentRecordTotal();
return result;
}
#endregion
#region 设备记录统计
/// <summary>
/// 获取设备状态记录统计分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
public Result<PagedList<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size)
{
var result = this._equipmentRecordRepository.GetEquipmentRecordDayTotalPageList(equipmentName, equipmentCode, equipmentType, begTime, endTime, page, size);
return result;
}
/// <summary>
/// 获取设备状态记录统计列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
public Result<List<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime)
{
var result = this._equipmentRecordRepository.GetEquipmentRecordDayTotalList(equipmentName, equipmentCode, equipmentType, begTime, endTime);
return result;
}
/// <summary>
/// 获取设备状态记录统计分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
public Result<PagedList<EquipmentRecordTotal>> GetEquipmentRecordTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size)
{
var result = this._equipmentRecordRepository.GetEquipmentRecordTotalPageList(equipmentName, equipmentCode, equipmentType, begTime, endTime, page, size);
return result;
}
/// <summary>
/// 获取设备状态记录统计列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
public Result<List<EquipmentRecordTotal>> GetEquipmentRecordTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime)
{
var result = this._equipmentRecordRepository.GetEquipmentRecordTotalList(equipmentName, equipmentCode, equipmentType, begTime, endTime);
return result;
}
/// <summary>
/// 根据设备Id获取记录统计
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <returns></returns>
public Result<EquipmentRecordTotal> GetEquipmentRecordTotalDetail(string equipmentId)
{
var result = new Result<EquipmentRecordTotal>();
var value = this._equipmentRecordRepository.GetEquipmentRecordTotalDetail(equipmentId);
if (!value.IsSuccess)
{
result.Message = value.Message;
return result;
}
result.Content = ModelTools.PubClone<EquipmentRecordTotalEntity, EquipmentRecordTotal>.Trans(value.Content);
return result;
}
/// <summary>
/// 获取设备状态记录月统计
/// </summary>
/// <returns></returns>
public Result<List<EquipmentRecordStateMonthTotal>> GetEquipmentRecordStateMonthTotal()
{
var result = this._equipmentRecordRepository.GetEquipmentRecordStateMonthTotal();
return result;
}
/// <summary>
/// 获取设备记录开炉次数月统计
/// </summary>
/// <returns></returns>
public Result<List<EquipmentRecordFurnaceMonthTotal>> GetEquipmentRecordFurnaceMonthTotal()
{
var result = this._equipmentRecordRepository.GetEquipmentRecordFurnaceMonthTotal();
return result;
}
/// <summary>
/// 获取设备记录OEE月统计
/// </summary>
/// <returns></returns>
public Result<List<EquipmentOEEMonthTotal>> GetEquipmentRecordOEEMonthTotal()
{
var result = this._equipmentRecordRepository.GetEquipmentRecordOEEMonthTotal();
return result;
}
/// <summary>
/// 获取设备OEE信息
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="begDate">开始时间</param>
/// <param name="endDate">结束时间</param>
/// <returns></returns>
public Result<EquipmentOEETotal> GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate)
{
var result = this._equipmentRecordRepository.GetEquipmentOEEMonthTotal(equipmentId, begDate, endDate);
return result;
}
#endregion
}
}

@ -0,0 +1,159 @@
using Masuit.Tools.Models;
using PVDEMCS.Common.DI;
using PVDEMCS.Common;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories;
using Microsoft.AspNetCore.Mvc.RazorPages;
using PVDEMCS.Common.Constant;
using PVDEMCS.Common.Tools;
using PVDEMCS.Services.Repositories.Entities;
using PVDEMCS.Services.Repositories.Impl;
using PVDEMCS.Devices;
using Masuit.Tools;
namespace PVDEMCS.Services.Impl
{
/// <summary>
/// 设备管理 服务层 接口
/// </summary>
internal class EquipmentService : IEquipmentService
{
private readonly IEquipmentRepository _equipmentRepository;
private readonly IDeviceRun _deviceRun;
public EquipmentService(IEquipmentRepository equipmentRepository, IDeviceRun deviceRun)
{
this._equipmentRepository = equipmentRepository;
this._deviceRun = deviceRun;
}
/// <summary>
/// 获取设备分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<EquipmentInfo>> GetEquipmentPageList(string equipmentName, string equipmentCode, string equipmentType, bool? activated, int page, int size)
{
var result = this._equipmentRepository.GetEquipmentPageList(equipmentName, equipmentCode, equipmentType, activated, page, size);
if (result.IsSuccess)
{
GetEquipmentState(result.Content.Data);
}
return result;
}
/// <summary>
/// 获取设备列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="activated">是否启用</param>
public Result<List<EquipmentInfo>> GetEquipmentList(string equipmentName, string equipmentCode, string equipmentType, bool? activated)
{
var result = this._equipmentRepository.GetEquipmentList(equipmentName, equipmentCode, equipmentType, activated);
if (result.IsSuccess)
{
GetEquipmentState(result.Content);
}
return result;
}
/// <summary>
/// 获取设备状态
/// </summary>
/// <param name="equipmentInfos"></param>
private void GetEquipmentState(List<EquipmentInfo> equipmentInfos)
{
var points = _deviceRun.GetDevicePoints;
if (!equipmentInfos.IsNullOrEmpty() && !points.IsNullOrEmpty())
{
foreach (var equipmentInfo in equipmentInfos)
{
var list = points.Where(f => f.EquipmentId == equipmentInfo.Id).ToList();
if (list.Count >= 2)
{
var startStop = list.Where(f => f.ActionType == ActionType.StartStop).FirstOrDefault();
var fault = list.Where(f => f.ActionType == ActionType.Fault).FirstOrDefault();
if (!startStop.IsNullOrEmpty() &&
!fault.IsNullOrEmpty() &&
!startStop.ObjectValue.IsNullOrEmpty() &&
!fault.ObjectValue.IsNullOrEmpty())
{
var state = EquipmentState.Stop;
//如果运行状态比警告状态高这里先判断运行状态如果运行状态为false在判断警告状态
if (startStop.GetValue<bool>())
{
state = EquipmentState.Run;
}
else if (fault.GetValue<bool>())
{
state = EquipmentState.Alarm;
}
equipmentInfo.State = state;
}
}
}
}
}
/// <summary>
/// 获取设备明显
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result<EquipmentInfo> GetEquipmentDetail(string id)
{
var result = new Result<EquipmentInfo>();
var value = _equipmentRepository.GetEquipmentDetail(id);
if (!value.IsSuccess)
{
result.Message = value.Message;
return result;
}
result.Content = ModelTools.PubClone<EquipmentInfoEntity, EquipmentInfo>.Trans(value.Content);
return result;
}
/// <summary>
/// 添加设备信息
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public Result AddEquipment(EquipmentInfo info)
{
var entity = ModelTools.PubClone<EquipmentInfo, EquipmentInfoEntity>.Trans(info);
var result = _equipmentRepository.AddEquipment(entity);
return result;
}
/// <summary>
/// 更新设备信息
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public Result UpdateEquipment(EquipmentInfo info)
{
var entity = ModelTools.PubClone<EquipmentInfo, EquipmentInfoEntity>.Trans(info);
var result = _equipmentRepository.UpdateEquipment(entity);
return result;
}
/// <summary>
/// 删除设备信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result DeleteEquipment(string id)
{
var result = _equipmentRepository.DeleteEquipment(id);
return result;
}
}
}

@ -0,0 +1,129 @@
using GuideScreen.Common.Common;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NLog;
using PVDEMCS.Services;
namespace PVDEMCS.Services.Impl
{
/// <summary>
/// 日志服务 实现
/// </summary>
internal class LogService : ILogService
{
private Logger logger;
private LogService(Logger logger)
{
this.logger = logger;
}
public LogService(string name)
: this(LogManager.GetLogger(name))
{
}
public LogService()
{
logger = LogManager.GetCurrentClassLogger();
}
public string LogDirectory
{
get
{
return Path.Combine(AppContext.BaseDirectory, "Logs");
}
}
public void Debug(string msg, params object[] args)
{
logger.Debug(msg, args);
}
public void Debug(string msg, Exception err)
{
logger.Debug(msg, err);
}
public void Info(string msg, params object[] args)
{
logger.Info(msg, args);
}
public void Info(string msg, Exception err)
{
logger.Info(msg, err);
}
public void Trace(string msg, params object[] args)
{
logger.Trace(msg, args);
}
public void Trace(string msg, Exception err)
{
logger.Trace(msg, err);
}
public void Error(string msg, params object[] args)
{
logger.Error(msg, args);
}
public void Error(string msg, Exception err)
{
logger.Error(msg, err);
}
public void Fatal(string msg, params object[] args)
{
logger.Fatal(msg, args);
}
public void Fatal(string msg, Exception err)
{
logger.Fatal(msg, err);
}
/// <summary>
/// 清理多少天前日志
/// </summary>
/// <param name="day"></param>
public void ClearAgoDays(int day)
{
if (!Directory.Exists(LogDirectory))
{
return;
}
var files = Directory.GetFiles(LogDirectory);
if (files.Length == 0)
{
return;
}
var date = DateTime.Now.AddDays(-day);
var clearFiles = files.Select(f => new FileInfo(f)).Where(f => f.CreationTime <= date).Select(f => f.FullName);
foreach (var filePath in clearFiles)
{
try
{
Info($"日志文件:{filePath} 已过期,将进行清理...");
File.Delete(filePath);
Info($"日志文件:{filePath} 清理完成");
}
catch (Exception ex)
{
Info($"日志文件:{filePath} 清理失败!" + ex.StackTrace);
}
}
}
}
}

@ -0,0 +1,125 @@
using Masuit.Tools.Models;
using PVDEMCS.Common.DI;
using PVDEMCS.Common;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
using PVDEMCS.Services.Repositories;
using Microsoft.AspNetCore.Mvc.RazorPages;
using PVDEMCS.Common.Tools;
using PVDEMCS.Services.Repositories.Impl;
namespace PVDEMCS.Services.Impl
{
/// <summary>
/// 系统参数设置 服务层 实现
/// </summary>
internal class SysConfigService : ISysConfigService
{
private readonly ISysConfigRepository _sysConfigRepository;
public SysConfigService(ISysConfigRepository sysConfigRepository)
{
this._sysConfigRepository = sysConfigRepository;
}
/// <summary>
/// 获取系统参数设置分页列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<SysConfig>> GetSysConfigPageList(string configName, string configKey, int page, int size)
{
var result = _sysConfigRepository.GetSysConfigPageList(configName, configKey, page, size);
return result;
}
/// <summary>
/// 获取系统参数设置列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <returns></returns>
public Result<List<SysConfig>> GetSysConfigList(string configName, string configKey)
{
var result = _sysConfigRepository.GetSysConfigList(configName, configKey);
return result;
}
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result<SysConfig> GetSysConfigDetailById(string id)
{
var result = new Result<SysConfig>();
var value = _sysConfigRepository.GetSysConfigDetailById(id);
if (!value.IsSuccess)
{
result.Message = value.Message;
return result;
}
result.Content = ModelTools.PubClone<SysConfigEntity, SysConfig>.Trans(value.Content);
return result;
}
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="name">名称</param>
/// <param name="key">键值</param>
/// <returns></returns>
public Result<SysConfig> GetSysConfigDetailNameOrKey(string name, string key = "")
{
var result = new Result<SysConfig>();
var value = _sysConfigRepository.GetSysConfigDetailNameOrKey(name, key);
if (!value.IsSuccess)
{
result.Message = value.Message;
return result;
}
result.Content = ModelTools.PubClone<SysConfigEntity, SysConfig>.Trans(value.Content);
return result;
}
/// <summary>
/// 添加系统参数设置
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public Result AddSysConfig(SysConfig info)
{
var entity = ModelTools.PubClone<SysConfig, SysConfigEntity>.Trans(info);
var result = _sysConfigRepository.AddSysConfig(entity);
return result;
}
/// <summary>
/// 更新系统参数设置
/// </summary>
/// <param name="info"></param>
public Result UpdateSysConfig(SysConfig info)
{
var entity = ModelTools.PubClone<SysConfig, SysConfigEntity>.Trans(info);
var result = _sysConfigRepository.UpdateSysConfig(entity);
return result;
}
/// <summary>
/// 删除系统参数设置
/// </summary>
/// <param name="id"></param>
public Result DeleteSysConfig(string id)
{
var result = _sysConfigRepository.DeleteSysConfig(id);
return result;
}
}
}

@ -0,0 +1,107 @@
using Masuit.Tools.Models;
using PVDEMCS.Common.DI;
using PVDEMCS.Common;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
using PVDEMCS.Services.Repositories;
using PVDEMCS.Common.Tools;
using PVDEMCS.Services.Repositories.Impl;
using AngleSharp.Dom;
namespace PVDEMCS.Services.Impl
{
/// <summary>
/// 用户信息 服务层 实现
/// </summary>
public class SysUserService : ISysUserService
{
private ISysUserRepository _sysUserRepository;
public SysUserService(ISysUserRepository sysUserRepository)
{
this._sysUserRepository = sysUserRepository;
}
/// <summary>
/// 获取用户信息分页列表
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="activated">是否其哟个</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<SysUser>> GetSysUserPageList(string userName, bool? activated, int page, int size)
{
var pageList = _sysUserRepository.GetSysUserPageList(userName, activated, page, size);
return pageList;
}
/// <summary>
/// 获取用户明细
/// </summary>
/// <param name="id">id</param>
/// <param name="userName">名称</param>
/// <returns></returns>
public Result<SysUser> GetSysUserDetail(string id, string userName)
{
var result = new Result<SysUser>();
var value = _sysUserRepository.GetSysUserDetail(id, userName);
if (!value.IsSuccess)
{
result.Message = value.Message;
return result;
}
result.Content = ModelTools.PubClone<SysUserEntity, SysUser>.Trans(value.Content);
return result;
}
/// <summary>
/// 添加用户
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public Result AddSysUser(SysUser info)
{
var entity = ModelTools.PubClone<SysUser, SysUserEntity>.Trans(info);
var result = _sysUserRepository.AddSysUser(entity);
return result;
}
/// <summary>
/// 更新用户
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
public Result UpdateSysUser(SysUser info)
{
var entity = ModelTools.PubClone<SysUser, SysUserEntity>.Trans(info);
var result = _sysUserRepository.UpdateSysUser(entity);
return result;
}
/// <summary>
/// 更新用户密码
/// </summary>
/// <param name="id">用户id</param>
/// <param name="pwd">密码</param>
/// <returns></returns>
public Result UpdatePassword(string id, string pwd)
{
var result = _sysUserRepository.UpdatePassword(id, pwd);
return result;
}
/// <summary>
/// 删除用户
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result DeleteUser(string id)
{
var result = _sysUserRepository.DeleteUser(id);
return result;
}
}
}

@ -0,0 +1,55 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
namespace PVDEMCS.Services.Models;
/// <summary>
/// PLC控制器
/// </summary>
public partial class DeviceInfo
{
public string Id { get; set; }
/// <summary>
/// 控制器编号
/// </summary>
public string DeviceCode { get; set; }
/// <summary>
/// 控制器名称
/// </summary>
public string DeviceName { get; set; }
/// <summary>
/// 控制器状态,1启用0停用
/// </summary>
public bool Activated { get; set; }
/// <summary>
/// 控制器协议:PLC,HTTP,Socket
/// </summary>
public string Protocol { get; set; }
/// <summary>
/// 控制器主机地址
/// </summary>
public string Host { get; set; }
/// <summary>
/// 控制器主机端口
/// </summary>
public int Port { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 设备连接状态
/// </summary>
public Boolean isConnected { get; set; }
}

@ -0,0 +1,109 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
namespace PVDEMCS.Services.Models;
/// <summary>
/// PLC点位
/// </summary>
public partial class DevicePoint
{
public string Id { get; set; }
/// <summary>
/// 控制器Id
/// </summary>
public string DeviceId { get; set; }
/// <summary>
/// 控制器编号
/// </summary>
public string DeviceCode { get; set; }
/// <summary>
/// 控制器名称
/// </summary>
public string DeviceName { get; set; }
/// <summary>
/// 设备编码
/// </summary>
public string EquipmentId { get; set; }
/// <summary>
/// 设备编码
/// </summary>
public string EquipmentCode { get; set; }
/// <summary>
/// 设备名称
/// </summary>
public string EquipmentName { get; set; }
/// <summary>
/// 设备类型IonbondBalzersCemecon
/// </summary>
public string EquipmentType { get; set; }
/// <summary>
/// 点位所属动作启动停止start_stop故障fault
/// </summary>
public string ActionType { get; set; }
/// <summary>
/// 点位编号
/// </summary>
public string PointCode { get; set; }
/// <summary>
/// 点位名称
/// </summary>
public string PointName { get; set; }
/// <summary>
/// S7 数据存储地址,直连 存储区地址
/// </summary>
public string Address { get; set; }
/// <summary>
/// 字段类型
/// </summary>
public string DataType { get; set; }
/// <summary>
/// PLC 点位是否启用 (1 启用, 0 禁用)
/// </summary>
public bool Activated { get; set; }
/// <summary>
/// 模式Auto 自动Manual手动
/// </summary>
public String Model { get; set; }
/// <summary>
/// 是否报警true 报警false 不报警为Auto)
/// </summary>
public bool IsAlarm { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
public Object ObjectValue { get; set; }
public T GetValue<T>()
{
if (ObjectValue is T)
{
return (T)ObjectValue;
}
return default;
}
}

@ -0,0 +1,61 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace PVDEMCS.Services.Models;
/// <summary>
/// 设备信息
/// </summary>
public partial class EquipmentInfo
{
public string Id { get; set; }
/// <summary>
/// 设备编码
/// </summary>
public string EquipmentCode { get; set; }
/// <summary>
/// 设备名称
/// </summary>
public string EquipmentName { get; set; }
/// <summary>
/// 设备类型IonbondBalzersCemecon
/// </summary>
public string EquipmentType { get; set; }
/// <summary>
/// 设备状态,运行:Run待机:Stop报警:Alarm
/// </summary>
public string State { get; set; }
/// <summary>
/// 设备启停用,1启用0停用
/// </summary>
public bool Activated { get; set; }
/// <summary>
/// 排序号
/// </summary>
public int OrdrNo { get; set; }
/// <summary>
/// 模式Auto 自动Manual手动
/// </summary>
public String Model { get; set; }
/// <summary>
/// 是否报警true 报警false 不报警model为Auto)
/// </summary>
public bool IsAlarm { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}

@ -0,0 +1,18 @@
namespace PVDEMCS.Services.Models
{
/// <summary>
/// 设备OEE月统计
/// </summary>
public class EquipmentOEEMonthTotal
{
/// <summary>
/// 日期
/// </summary>
public string TotalMonth { get; set; }
/// <summary>
/// OEE值
/// </summary>
public decimal OEE { get; set; }
}
}

@ -0,0 +1,38 @@
namespace PVDEMCS.Services.Models
{
/// <summary>
/// 设备OEE月统计
/// </summary>
public class EquipmentOEETotal
{
/// <summary>
/// 设备Id
/// </summary>
public string EquipmentId { get; set; }
/// <summary>
/// 设备类型IonbondBalzersCemecon
/// </summary>
public string EquipmentType { get; set; }
/// <summary>
/// 总运行时长
/// </summary>
public decimal TotalRunningTime { get; set; }
/// <summary>
/// 总报警时长
/// </summary>
public decimal TotalAlarmTime { get; set; }
/// <summary>
/// 总待机时长
/// </summary>
public decimal TotalStopTime { get; set; }
/// <summary>
/// OEE值
/// </summary>
public decimal OEE { get; set; }
}
}

@ -0,0 +1,68 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
namespace PVDEMCS.Services.Models;
/// <summary>
/// 设备状态记录明显
/// </summary>
public partial class EquipmentRecord
{
public string Id { get; set; }
/// <summary>
/// 设备ID
/// </summary>
public string EquipmentId { get; set; }
/// <summary>
/// 设备编码
/// </summary>
public string EquipmentCode { get; set; }
/// <summary>
/// 设备名称
/// </summary>
public string EquipmentName { get; set; }
/// <summary>
/// 设备类型IonbondBalzersCemecon
/// </summary>
public string EquipmentType { get; set; }
/// <summary>
/// 设备状态,运行:Run待机:Stop报警:Alarm
/// </summary>
public string State { get; set; }
/// <summary>
/// 设备编码
/// </summary>
public DateTime StartTime { get; set; }
/// <summary>
/// 设备名称
/// </summary>
public DateTime EndTime { get; set; }
/// <summary>
/// 累计时长(分钟)
/// </summary>
public decimal TimeTotal
{
get
{
var val = (EndTime - StartTime).TotalMinutes;
if (val > 0)
{
return Math.Round(Convert.ToDecimal(val),2);
}
return 0;
}
}
}

@ -0,0 +1,18 @@

using System;
using System.Collections.Generic;
namespace PVDEMCS.Services.Models;
/// <summary>
/// 设备状态记录日统计
///
/// </summary>
public partial class EquipmentRecordDayTotal: EquipmentRecordTotal
{
/// <summary>
/// 日期
/// </summary>
public DateTime? TotalDay { get; set; }
}

@ -0,0 +1,23 @@
namespace PVDEMCS.Services.Models
{
/// <summary>
/// 设备记录开炉次数月统计
/// </summary>
public class EquipmentRecordFurnaceMonthTotal
{
/// <summary>
/// 设备类型IonbondBalzersCemecon
/// </summary>
public string EquipmentType { get; set; }
/// <summary>
/// 开炉次数
/// </summary>
public decimal FurnaceNum { get; set; }
/// <summary>
/// 日期
/// </summary>
public string TotalMonth { get; set; }
}
}

@ -0,0 +1,28 @@
namespace PVDEMCS.Services.Models
{
/// <summary>
/// 设备状态记录月统计
/// </summary>
public class EquipmentRecordStateMonthTotal
{
/// <summary>
/// 总运行时长
/// </summary>
public decimal TotalRunningTime { get; set; }
/// <summary>
/// 总报警时长
/// </summary>
public decimal TotalAlarmTime { get; set; }
/// <summary>
/// 总待机时长
/// </summary>
public decimal TotalStopTime { get; set; }
/// <summary>
/// 日期
/// </summary>
public string TotalMonth { get; set; }
}
}

@ -0,0 +1,47 @@
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations.Schema;
namespace PVDEMCS.Services.Models
{
/// <summary>
/// 设备状态记录OEE月统计
/// </summary>
public class EquipmentRecordStateOEEMonthTotal
{
/// <summary>
/// 设备Id
/// </summary>
public string EquipmentId { get; set; }
/// <summary>
/// 设备类型IonbondBalzersCemecon
/// </summary>
public string EquipmentType { get; set; }
/// <summary>
/// 总运行时长
/// </summary>
public decimal TotalRunningTime { get; set; }
/// <summary>
/// 总报警时长
/// </summary>
public decimal TotalAlarmTime { get; set; }
/// <summary>
/// 总待机时长
/// </summary>
public decimal TotalStopTime { get; set; }
/// <summary>
/// 日期
/// </summary>
public string TotalMonth { get; set; }
/// <summary>
/// OEE值
/// </summary>
public decimal OEE { get; set; }
}
}

@ -0,0 +1,56 @@

using System;
using System.Collections.Generic;
namespace PVDEMCS.Services.Models;
/// <summary>
/// 设备状态记录统计
///
/// </summary>
public partial class EquipmentRecordTotal
{
public string Id { get; set; }
/// <summary>
/// 设备Id
/// </summary>
public string EquipmentId { get; set; }
/// <summary>
/// 设备编码
/// </summary>
public string EquipmentCode { get; set; }
/// <summary>
/// 设备名称
/// </summary>
public string EquipmentName { get; set; }
/// <summary>
/// 设备类型IonbondBalzersCemecon
/// </summary>
public string EquipmentType { get; set; }
/// <summary>
/// 开炉次数
/// </summary>
public decimal FurnaceNum { get; set; }
/// <summary>
/// 总运行时长
/// </summary>
public decimal TotalRunningTime { get; set; }
/// <summary>
/// 总报警时长
/// </summary>
public decimal TotalAlarmTime { get; set; }
/// <summary>
/// 总待机时长
/// </summary>
public decimal TotalStopTime { get; set; }
}

@ -0,0 +1,28 @@
namespace PVDEMCS.Services.Models
{
/// <summary>
/// 设备状态总览
/// </summary>
public class EquipmentStateView
{
/// <summary>
/// 设备类型ALL(所有),IonbondBalzersCemecon
/// </summary>
public string EquipmentType { get; set; }
/// <summary>
/// 运行数量
/// </summary>
public int Run { get; set; }
/// <summary>
/// 待机数量
/// </summary>
public int Stop { get; set; }
/// <summary>
/// 报警数量
/// </summary>
public int Alarm { get; set; }
}
}

@ -0,0 +1,42 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
namespace PVDEMCS.Services.Models;
/// <summary>
/// 参数配置表
/// </summary>
public partial class SysConfig
{
/// <summary>
/// 参数主键
/// </summary>
public string Id { get; set; }
/// <summary>
/// 参数名称
/// </summary>
public string ConfigName { get; set; }
/// <summary>
/// 参数键名
/// </summary>
public string ConfigKey { get; set; }
/// <summary>
/// 参数键值
/// </summary>
public string ConfigValue { get; set; }
/// <summary>
/// 系统内置Y是 N否
/// </summary>
public string ConfigType { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}

@ -0,0 +1,78 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
namespace PVDEMCS.Services.Models;
/// <summary>
/// 用户信息表
/// </summary>
public partial class SysUser
{
/// <summary>
/// 用户ID
/// </summary>
public string Id { get; set; }
/// <summary>
/// 用户账号
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 用户昵称
/// </summary>
public string NickName { get; set; }
/// <summary>
/// 用户类型admin系统用户,normal普通用户
/// </summary>
public string UserType { get; set; }
/// <summary>
/// 用户邮箱
/// </summary>
public string Email { get; set; }
/// <summary>
/// 手机号码
/// </summary>
public string Phonenumber { get; set; }
/// <summary>
/// 用户性别0男 1女 2未知
/// </summary>
public string Sex { get; set; }
/// <summary>
/// 头像地址
/// </summary>
public string Avatar { get; set; }
/// <summary>
/// 密码
/// </summary>
public string Password { get; set; }
/// <summary>
/// 用户状态,1启用0停用
/// </summary>
public bool Activated { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 最后登录IP
/// </summary>
public string LoginIp { get; set; }
/// <summary>
/// 最后登录时间
/// </summary>
public DateTime? LoginDate { get; set; }
}

@ -0,0 +1,92 @@
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using Masuit.Tools.Systems;
namespace PVDEMCS.Services.Repositories.Entities.BaseEntity
{
public abstract class BaseEntity
{
[Key]
[Column("id")]
[StringLength(64)]
public string Id { get; set; }
}
public abstract class CUBaseEntity : BaseEntity
{
/// <summary>
/// 创建者
/// </summary>
[Column("create_by")]
[StringLength(32)]
[MySqlCollation("utf8mb4_bin")]
public string CreateBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[Column("create_at", TypeName = "datetime")]
public DateTime? CreateAt { get; set; }
/// <summary>
/// 修改者
/// </summary>
[Column("update_by")]
[StringLength(32)]
[MySqlCollation("utf8mb4_bin")]
public string UpdateBy { get; set; }
/// <summary>
/// 修改时间
/// </summary>
[Column("update_at", TypeName = "datetime")]
public DateTime? UpdateAt { get; set; }
public void Update()
{
UpdateAt = DateTime.Now;
UpdateBy = "1";
}
public void Create()
{
Id = SnowFlakeNew.LongId.ToString();
CreateAt = DateTime.Now;
CreateBy = "1";
Update();
}
}
public abstract class CUDBaseEntity: CUBaseEntity
{
/// <summary>
/// 删除者
/// </summary>
[Column("delete_by")]
[StringLength(32)]
[MySqlCollation("utf8mb4_bin")]
public string DeleteBy { get; set; }
/// <summary>
/// 删除时间
/// </summary>
[Column("delete_at", TypeName = "datetime")]
public DateTime? DeleteAt { get; set; }
/// <summary>
/// 是否删除
/// </summary>
[Column("is_delete", TypeName = "bit(1)")]
public bool IsDelete { get; set; }
public void Delete()
{
DeleteAt = DateTime.Now;
DeleteBy = "1";
IsDelete = true;
}
}
}

@ -0,0 +1,71 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using PVDEMCS.Services.Repositories.Entities.BaseEntity;
namespace PVDEMCS.Services.Repositories.Entities;
/// <summary>
/// PLC控制器
/// </summary>
[Table("device_info")]
public partial class DeviceInfoEntity : CUDBaseEntity
{
/// <summary>
/// 控制器编号
/// </summary>
[Required]
[Column("device_code")]
[StringLength(32)]
public string DeviceCode { get; set; }
/// <summary>
/// 控制器名称
/// </summary>
[Required]
[Column("device_name")]
[StringLength(32)]
public string DeviceName { get; set; }
/// <summary>
/// 控制器状态,1启用0停用
/// </summary>
[Column("activated", TypeName = "bit(1)")]
public bool Activated { get; set; }
/// <summary>
/// 控制器协议:PLC,HTTP,Socket
/// </summary>
[Required]
[Column("protocol")]
[StringLength(32)]
public string Protocol { get; set; }
/// <summary>
/// 控制器主机地址
/// </summary>
[Required]
[Column("host")]
[StringLength(32)]
public string Host { get; set; }
/// <summary>
/// 控制器主机端口
/// </summary>
[Required]
[Column("port")]
public int Port { get; set; }
/// <summary>
/// 备注
/// </summary>
[Column("remark")]
[StringLength(255)]
public string Remark { get; set; }
}

@ -0,0 +1,88 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using PVDEMCS.Services.Repositories.Entities.BaseEntity;
namespace PVDEMCS.Services.Repositories.Entities;
/// <summary>
/// PLC点位
/// </summary>
[Table("device_point")]
public partial class DevicePointEntity : CUDBaseEntity
{
/// <summary>
/// 控制器Id
/// </summary>
[Required]
[Column("device_id")]
[StringLength(64)]
public string DeviceId { get; set; }
/// <summary>
/// 设备Id
/// </summary>
[Required]
[Column("equipment_id")]
[StringLength(64)]
public string EquipmentId { get; set; }
/// <summary>
/// 点位编号
/// </summary>
[Required]
[Column("point_code")]
[StringLength(32)]
public string PointCode { get; set; }
/// <summary>
/// 点位名称
/// </summary>
[Required]
[Column("point_name")]
[StringLength(32)]
public string PointName { get; set; }
/// <summary>
/// S7 数据存储地址,直连 存储区地址
/// </summary>
[Required]
[Column("address")]
[StringLength(64)]
public string Address { get; set; }
/// <summary>
/// 字段类型
/// </summary>
[Required]
[Column("data_type")]
[StringLength(32)]
public string DataType { get; set; }
/// <summary>
/// 点位所属动作启动停止start_stop故障fault
/// </summary>
[Required]
[Column("action_type")]
[StringLength(32)]
public string ActionType { get; set; }
/// <summary>
/// PLC 点位是否启用 (1 启用, 0 禁用)
/// </summary>
[Column("activated", TypeName = "bit(1)")]
public bool Activated { get; set; }
/// <summary>
/// 备注
/// </summary>
[Column("remark")]
[StringLength(255)]
public string Remark { get; set; }
}

@ -0,0 +1,271 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using PVDEMCS.Services.Models;
namespace PVDEMCS.Services.Repositories.Entities;
public partial class EFContext : DbContext
{
private IConfiguration configuration;
public EFContext()
{
configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build();
}
public EFContext(DbContextOptions<EFContext> options)
: base(options)
{
}
public virtual DbSet<DeviceInfoEntity> DeviceInfos { get; set; }
public virtual DbSet<DevicePointEntity> DevicePoints { get; set; }
public virtual DbSet<EquipmentInfoEntity> EquipmentInfos { get; set; }
public virtual DbSet<EquipmentRecordEntity> EquipmentRecords { get; set; }
public virtual DbSet<EquipmentRecordDayTotalEntity> EquipmentRecordDayTotals { get; set; }
public virtual DbSet<EquipmentRecordTotalEntity> EquipmentRecordTotals { get; set; }
public virtual DbSet<SysConfigEntity> SysConfigs { get; set; }
public virtual DbSet<SysUserEntity> SysUsers { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
=> optionsBuilder.UseMySql(configuration.GetConnectionString("MySqlConnection"), Microsoft.EntityFrameworkCore.ServerVersion.Parse("8.0.34-mysql"));
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.UseCollation("utf8mb4_0900_ai_ci")
.HasCharSet("utf8mb4");
modelBuilder.Entity<DeviceInfoEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity.ToTable("device_info", tb => tb.HasComment("PLC控制器"));
entity.Property(e => e.Activated)
.HasDefaultValueSql("b'1'")
.HasComment("控制器状态,1启用0停用");
entity.Property(e => e.CreateAt).HasComment("创建时间");
entity.Property(e => e.CreateBy).HasComment("创建者");
entity.Property(e => e.DeleteAt).HasComment("删除时间");
entity.Property(e => e.DeleteBy).HasComment("删除者");
entity.Property(e => e.DeviceCode).HasComment("控制器编号");
entity.Property(e => e.DeviceName).HasComment("控制器名称");
entity.Property(e => e.Host).HasComment("控制器主机地址");
entity.Property(e => e.IsDelete)
.HasDefaultValueSql("b'0'")
.HasComment("是否删除");
entity.Property(e => e.Port).HasComment("控制器主机端口");
entity.Property(e => e.Protocol).HasComment("控制器协议:PLC,HTTP,Socket");
entity.Property(e => e.Remark).HasComment("备注");
entity.Property(e => e.UpdateAt).HasComment("修改时间");
entity.Property(e => e.UpdateBy).HasComment("修改者");
});
modelBuilder.Entity<DevicePointEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity.ToTable("device_point", tb => tb.HasComment("PLC点位"));
entity.Property(e => e.Activated)
.HasDefaultValueSql("b'1'")
.HasComment("PLC 点位是否启用 (1 启用, 0 禁用)");
entity.Property(e => e.Address).HasComment("S7 数据存储地址,直连 存储区地址");
entity.Property(e => e.CreateAt).HasComment("创建时间");
entity.Property(e => e.CreateBy).HasComment("创建者");
entity.Property(e => e.DeleteAt).HasComment("删除时间");
entity.Property(e => e.DeleteBy).HasComment("删除者");
entity.Property(e => e.DeviceId).HasComment("控制器Id");
entity.Property(e => e.IsDelete).HasDefaultValueSql("b'0'").HasComment("是否删除");
entity.Property(e => e.PointCode).HasComment("点位编号");
entity.Property(e => e.PointName).HasComment("点位名称");
entity.Property(e => e.Remark).HasComment("备注");
entity.Property(e => e.DataType).HasComment("字段类型");
entity.Property(e => e.UpdateAt).HasComment("修改时间");
entity.Property(e => e.UpdateBy).HasComment("修改者");
});
modelBuilder.Entity<EquipmentInfoEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity.ToTable("equipment_info", tb => tb.HasComment("设备信息"));
entity.Property(e => e.Activated)
.HasDefaultValueSql("b'1'")
.HasComment("设备状态,1启用0停用");
entity.Property(e => e.CreateAt).HasComment("创建时间");
entity.Property(e => e.CreateBy).HasComment("创建者");
entity.Property(e => e.DeleteAt).HasComment("删除时间");
entity.Property(e => e.DeleteBy).HasComment("删除者");
entity.Property(e => e.EquipmentCode).HasComment("设备编码");
entity.Property(e => e.EquipmentName).HasComment("设备名称");
entity.Property(e => e.EquipmentType).HasComment("设备类型IonbondBalzersCemecon");
entity.Property(e => e.Model).HasComment("模式Auto 自动Manual手动");
entity.Property(e => e.IsAlarm).HasComment("是否报警1 报警0 不报警model为Auto");
entity.Property(e => e.OrdrNo).HasComment("排序号");
entity.Property(e => e.IsDelete)
.HasDefaultValueSql("b'0'")
.HasComment("是否删除");
entity.Property(e => e.Remark).HasComment("备注");
entity.Property(e => e.UpdateAt).HasComment("修改时间");
entity.Property(e => e.UpdateBy).HasComment("修改者");
});
modelBuilder.Entity<EquipmentRecordEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity.ToTable("equipment_record", tb => tb.HasComment("设备状态记录明显"));
entity.Property(e => e.CreateAt).HasComment("创建时间");
entity.Property(e => e.CreateBy).HasComment("创建者");
entity.Property(e => e.EndTime).HasComment("设备名称");
entity.Property(e => e.EquipmentId).HasComment("设备id");
entity.Property(e => e.StartTime).HasComment("设备编码");
entity.Property(e => e.State).HasComment("设备状态,1运行2待机3报警");
entity.Property(e => e.UpdateAt).HasComment("修改时间");
entity.Property(e => e.UpdateBy).HasComment("修改者");
});
modelBuilder.Entity<EquipmentRecordDayTotalEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity.ToTable("equipment_record_day_total", tb => tb.HasComment("设备状态记录日统计\r\n"));
entity.Property(e => e.CreateAt).HasComment("创建时间");
entity.Property(e => e.CreateBy).HasComment("创建者");
entity.Property(e => e.EquipmentId).HasComment("设备Id");
entity.Property(e => e.FurnaceNum).HasComment("开炉次数");
entity.Property(e => e.TotalAlarmTime).HasComment("总报警时长");
entity.Property(e => e.TotalStopTime).HasComment("总待机时长");
entity.Property(e => e.TotalDay).HasComment("日期");
entity.Property(e => e.TotalRunningTime).HasComment("总运行时长");
entity.Property(e => e.UpdateAt).HasComment("修改时间");
entity.Property(e => e.UpdateBy).HasComment("修改者");
});
modelBuilder.Entity<EquipmentRecordTotalEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity.ToTable("equipment_record_total", tb => tb.HasComment("设备状态记录统计\r\n"));
entity.Property(e => e.CreateAt).HasComment("创建时间");
entity.Property(e => e.CreateBy).HasComment("创建者");
entity.Property(e => e.EquipmentId).HasComment("设备Id");
entity.Property(e => e.FurnaceNum).HasComment("开炉次数");
entity.Property(e => e.TotalAlarmTime).HasComment("总报警时长");
entity.Property(e => e.TotalStopTime).HasComment("总待机时长");
entity.Property(e => e.TotalRunningTime).HasComment("总运行时长");
entity.Property(e => e.UpdateAt).HasComment("修改时间");
entity.Property(e => e.UpdateBy).HasComment("修改者");
});
modelBuilder.Entity<SysConfigEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity.ToTable("sys_config", tb => tb.HasComment("参数配置表"));
entity.Property(e => e.Id).HasComment("参数主键");
entity.Property(e => e.ConfigKey)
.HasDefaultValueSql("''")
.HasComment("参数键名");
entity.Property(e => e.ConfigName)
.HasDefaultValueSql("''")
.HasComment("参数名称");
entity.Property(e => e.ConfigType)
.HasDefaultValueSql("'N'")
.IsFixedLength()
.HasComment("系统内置Y是 N否");
entity.Property(e => e.ConfigValue)
.HasDefaultValueSql("''")
.HasComment("参数键值");
entity.Property(e => e.CreateAt).HasComment("创建时间");
entity.Property(e => e.CreateBy)
.HasDefaultValueSql("''")
.HasComment("创建者");
entity.Property(e => e.DeleteAt).HasComment("删除时间");
entity.Property(e => e.DeleteBy).HasComment("删除者");
entity.Property(e => e.IsDelete)
.HasDefaultValueSql("b'0'")
.HasComment("是否删除");
entity.Property(e => e.Remark).HasComment("备注");
entity.Property(e => e.UpdateAt).HasComment("更新时间");
entity.Property(e => e.UpdateBy)
.HasDefaultValueSql("''")
.HasComment("更新者");
});
modelBuilder.Entity<SysUserEntity>(entity =>
{
entity.HasKey(e => e.Id).HasName("PRIMARY");
entity.ToTable("sys_user", tb => tb.HasComment("用户信息表"));
entity.Property(e => e.Id).HasComment("用户ID");
entity.Property(e => e.Avatar)
.HasDefaultValueSql("''")
.HasComment("头像地址");
entity.Property(e => e.CreateAt).HasComment("创建时间");
entity.Property(e => e.CreateBy)
.HasDefaultValueSql("''")
.HasComment("创建者");
entity.Property(e => e.DeleteAt).HasComment("删除时间");
entity.Property(e => e.DeleteBy).HasComment("删除者");
entity.Property(e => e.Email)
.HasDefaultValueSql("''")
.HasComment("用户邮箱");
entity.Property(e => e.IsDelete)
.HasDefaultValueSql("b'0'")
.HasComment("是否删除");
entity.Property(e => e.LoginDate).HasComment("最后登录时间");
entity.Property(e => e.LoginIp)
.HasDefaultValueSql("''")
.HasComment("最后登录IP");
entity.Property(e => e.NickName).HasComment("用户昵称");
entity.Property(e => e.Password)
.HasDefaultValueSql("''")
.HasComment("密码");
entity.Property(e => e.Phonenumber)
.HasDefaultValueSql("''")
.HasComment("手机号码");
entity.Property(e => e.Remark).HasComment("备注");
entity.Property(e => e.Sex)
.HasDefaultValueSql("'0'")
.IsFixedLength()
.HasComment("用户性别0男 1女 2未知");
entity.Property(e => e.Activated)
.HasDefaultValueSql("b'1'")
.IsFixedLength()
.HasComment("帐号状态1启用0停用");
entity.Property(e => e.UpdateAt).HasComment("更新时间");
entity.Property(e => e.UpdateBy)
.HasDefaultValueSql("''")
.HasComment("更新者");
entity.Property(e => e.UserName).HasComment("用户账号");
entity.Property(e => e.UserType)
.HasDefaultValueSql("'admin'")
.HasComment("用户类型admin系统用户,normal普通用户");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

@ -0,0 +1,72 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using PVDEMCS.Services.Repositories.Entities.BaseEntity;
namespace PVDEMCS.Services.Repositories.Entities;
/// <summary>
/// 设备信息
/// </summary>
[Table("equipment_info")]
public partial class EquipmentInfoEntity : CUDBaseEntity
{
/// <summary>
/// 设备编码
/// </summary>
[Required]
[Column("equipment_code")]
[StringLength(32)]
public string EquipmentCode { get; set; }
/// <summary>
/// 设备名称
/// </summary>
[Required]
[Column("equipment_name")]
[StringLength(32)]
public string EquipmentName { get; set; }
/// <summary>
/// 设备类型IonbondBalzersCemecon
/// </summary>
[Required]
[Column("equipment_type")]
[StringLength(32)]
public string EquipmentType { get; set; }
/// <summary>
/// 设备启停用,1启用0停用
/// </summary>
[Column("activated", TypeName = "bit(1)")]
public bool Activated { get; set; }
/// <summary>
/// 模式Auto 自动Manual手动
/// </summary>
[Column("model")]
public String Model { get; set; }
/// <summary>
/// 是否报警true 报警false 不报警model为Auto)
/// </summary>
[Column("isAlarm", TypeName = "bit(1)")]
public bool IsAlarm { get; set; }
/// <summary>
/// 排序号
/// </summary>
[Column("ordrNo")]
public int OrdrNo { get; set; }
/// <summary>
/// 备注
/// </summary>
[Column("remark")]
[StringLength(255)]
public string Remark { get; set; }
}

@ -0,0 +1,60 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using PVDEMCS.Services.Repositories.Entities.BaseEntity;
namespace PVDEMCS.Services.Repositories.Entities;
/// <summary>
/// 设备状态记录日统计
///
/// </summary>
[Table("equipment_record_day_total")]
public partial class EquipmentRecordDayTotalEntity : CUBaseEntity
{
/// <summary>
/// 设备Id
/// </summary>
[Required]
[Column("equipment_id")]
[StringLength(32)]
public string EquipmentId { get; set; }
/// <summary>
/// 开炉次数
/// </summary>
[Column("furnace_num")]
public int FurnaceNum { get; set; }
/// <summary>
/// 总运行时长
/// </summary>
[Column("total_running_time")]
[Precision(32, 2)]
public decimal TotalRunningTime { get; set; }
/// <summary>
/// 总报警时长
/// </summary>
[Column("total_alarm_time")]
[Precision(32, 2)]
public decimal TotalAlarmTime { get; set; }
/// <summary>
/// 总待机时长
/// </summary>
[Column("total_stop_time")]
[Precision(32, 2)]
public decimal TotalStopTime { get; set; }
/// <summary>
/// 日期
/// </summary>
[Column("total_day", TypeName = "datetime")]
public DateTime? TotalDay { get; set; }
}

@ -0,0 +1,50 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using PVDEMCS.Services.Repositories.Entities.BaseEntity;
namespace PVDEMCS.Services.Repositories.Entities;
/// <summary>
/// 设备状态记录明显
/// </summary>
[Table("equipment_record")]
public partial class EquipmentRecordEntity : CUBaseEntity
{
/// <summary>
/// 设备类型IonbondBalzersCemecon
/// </summary>
[Required]
[Column("equipment_id")]
[StringLength(32)]
public string EquipmentId { get; set; }
/// <summary>
/// 设备编码
/// </summary>
[Required]
[Column("start_time", TypeName = "datetime")]
[StringLength(32)]
public DateTime StartTime { get; set; }
/// <summary>
/// 设备名称
/// </summary>
[Required]
[Column("end_time", TypeName = "datetime")]
[StringLength(32)]
public DateTime EndTime { get; set; }
/// <summary>
/// 设备状态,运行:Run待机:Stop报警:Alarm
/// </summary>
[Column("state")]
public string State { get; set; }
}

@ -0,0 +1,56 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using PVDEMCS.Services.Repositories.Entities.BaseEntity;
namespace PVDEMCS.Services.Repositories.Entities;
/// <summary>
/// 设备状态记录日统计
///
/// </summary>
[Table("equipment_record_total")]
public partial class EquipmentRecordTotalEntity : CUBaseEntity
{
/// <summary>
/// 设备Id
/// </summary>
[Required]
[Column("equipment_id")]
[StringLength(32)]
public string EquipmentId { get; set; }
/// <summary>
/// 开炉次数
/// </summary>
[Column("furnace_num")]
public int FurnaceNum { get; set; }
/// <summary>
/// 总运行时长
/// </summary>
[Column("total_running_time")]
[Precision(32, 2)]
public decimal TotalRunningTime { get; set; }
/// <summary>
/// 总报警时长
/// </summary>
[Column("total_alarm_time")]
[Precision(32, 2)]
public decimal TotalAlarmTime { get; set; }
/// <summary>
/// 总待机时长
/// </summary>
[Column("total_stop_time")]
[Precision(32, 2)]
public decimal TotalStopTime { get; set; }
}

@ -0,0 +1,55 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using PVDEMCS.Services.Repositories.Entities.BaseEntity;
namespace PVDEMCS.Services.Repositories.Entities;
/// <summary>
/// 参数配置表
/// </summary>
[Table("sys_config")]
[MySqlCollation("utf8mb4_bin")]
public partial class SysConfigEntity:CUDBaseEntity
{
/// <summary>
/// 参数名称
/// </summary>
[Column("config_name")]
[StringLength(100)]
public string ConfigName { get; set; }
/// <summary>
/// 参数键名
/// </summary>
[Column("config_key")]
[StringLength(100)]
public string ConfigKey { get; set; }
/// <summary>
/// 参数键值
/// </summary>
[Column("config_value")]
[StringLength(500)]
public string ConfigValue { get; set; }
/// <summary>
/// 系统内置Y是 N否
/// </summary>
[Column("config_type")]
[StringLength(1)]
public string ConfigType { get; set; }
/// <summary>
/// 备注
/// </summary>
[Column("remark")]
[StringLength(500)]
public string Remark { get; set; }
}

@ -0,0 +1,104 @@
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
using PVDEMCS.Services.Repositories.Entities.BaseEntity;
namespace PVDEMCS.Services.Repositories.Entities;
/// <summary>
/// 用户信息表
/// </summary>
[Table("sys_user")]
[MySqlCollation("utf8mb4_bin")]
public partial class SysUserEntity : CUDBaseEntity
{
/// <summary>
/// 用户账号
/// </summary>
[Required]
[Column("user_name")]
[StringLength(30)]
public string UserName { get; set; }
/// <summary>
/// 用户昵称
/// </summary>
[Required]
[Column("nick_name")]
[StringLength(30)]
public string NickName { get; set; }
/// <summary>
/// 用户类型admin系统用户,normal普通用户
/// </summary>
[Column("user_type")]
[StringLength(2)]
public string UserType { get; set; }
/// <summary>
/// 用户邮箱
/// </summary>
[Column("email")]
[StringLength(50)]
public string Email { get; set; }
/// <summary>
/// 手机号码
/// </summary>
[Column("phonenumber")]
[StringLength(11)]
public string Phonenumber { get; set; }
/// <summary>
/// 用户性别0男 1女 2未知
/// </summary>
[Column("sex")]
[StringLength(1)]
public string Sex { get; set; }
/// <summary>
/// 头像地址
/// </summary>
[Column("avatar")]
[StringLength(100)]
public string Avatar { get; set; }
/// <summary>
/// 密码
/// </summary>
[Column("password")]
[StringLength(100)]
public string Password { get; set; }
/// <summary>
/// 帐号状态1启用0停用
/// </summary>
[Column("activated")]
[StringLength(1)]
public bool Activated { get; set; }
/// <summary>
/// 备注
/// </summary>
[Column("remark")]
[StringLength(500)]
public string Remark { get; set; }
/// <summary>
/// 最后登录IP
/// </summary>
[Column("login_ip")]
[StringLength(128)]
public string LoginIp { get; set; }
/// <summary>
/// 最后登录时间
/// </summary>
[Column("login_date", TypeName = "datetime")]
public DateTime? LoginDate { get; set; }
}

@ -0,0 +1,129 @@
using Masuit.Tools.Models;
using Masuit.Tools;
using PVDEMCS.Common;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Repositories.Entities;
using PVDEMCS.Services.Models;
namespace PVDEMCS.Services.Repositories
{
/// <summary>
/// PLC控制器 数据层 接口
/// </summary>
public interface IDeviceRepository : IDependency
{
#region PLC控制器
/// <summary>
/// 获取PLC控制器分页列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<DeviceInfo>> GetDevicePageList(string deviceCode, string deviceName, bool? activated, int page, int size);
/// <summary>
/// 获取PLC控制器列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// <returns></returns>
Result<List<DeviceInfo>> GetDeviceInfoList(string deviceCode, string deviceName, bool? activated = false);
/// <summary>
/// 获取PLC控制器明细
/// </summary>
/// <param name="id">主键Id</param>
/// <returns></returns>
Result<DeviceInfoEntity> GetDeviceDetail(string id);
/// <summary>
/// 添加PLC控制器
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result<string> AddDevice(DeviceInfoEntity entity);
/// <summary>
/// 更新PLC控制器
/// </summary>
/// <param name="entity"></param>
Result UpdateDevice(DeviceInfoEntity entity);
/// <summary>
/// 删除PLC控制器
/// </summary>
/// <param name="id"></param>
Result DeleteDevice(string id);
#endregion
#region PLC点位
/// <summary>
/// 获取PLC控制器点位分页列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<DevicePoint>> GetDevicePointPageList(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated, int page, int size);
/// <summary>
/// 获取PLC控制器点位列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
/// <param name="activated">是否启用</param>
/// <returns></returns>
Result<List<DevicePoint>> GetDevicePointList(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated);
/// <summary>
/// 获取PLC控制器点位明细
/// </summary>
/// <param name="id">Id</param>
/// <returns></returns>
Result<DevicePointEntity> GetDevicePointDetail(string id);
/// <summary>
/// 添加PLC控制器点位
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result<string> AddDevicePoint(DevicePointEntity entity);
/// <summary>
/// 更新PLC控制器点位
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result UpdateDevicePoint(DevicePointEntity entity);
/// <summary>
/// 删除PLC控制器点位
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result DeleteDevicePoint(string id);
#endregion
}
}

@ -0,0 +1,154 @@
using Masuit.Tools.Models;
using Masuit.Tools;
using PVDEMCS.Common.Constant;
using PVDEMCS.Common;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
using Microsoft.EntityFrameworkCore;
namespace PVDEMCS.Services.Repositories
{
/// <summary>
/// 设备数据记录与统计 数据层 接口
/// </summary>
public interface IEquipmentRecordRepository : IDependency
{
#region 设备状态记录
/// <summary>
/// 获取设备状态记录分页列表
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<EquipmentRecord>> GetEquipmentRecordPageList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size);
/// <summary>
/// 获取设备状态记录列表
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns></returns>
Result<List<EquipmentRecord>> GetEquipmentRecordList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime);
/// <summary>
/// 添加或更新设备状态记录
/// 1.如果设备最新记录状态没有改变则更新结束时间
/// 2.如果没有记录则添加记录
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="state">设备状态,运行:Run待机:Stop报警:Alarm</param>
/// <param name="dateTime">记录时间</param>
/// <returns></returns>
Result AddUpdateEquipmentRecord(string equipmentId, string state, DateTime dateTime);
/// <summary>
/// 进行设备状态记录统计(日统计)
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
Result RunEquipmentRecordDayTotal(DateTime date);
/// <summary>
/// 进行设备状态记录统计
/// </summary>
/// <returns></returns>
Result RunEquipmentRecordTotal();
#endregion
#region 设备记录统计
/// <summary>
/// 获取设备状态记录日统计分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
Result<PagedList<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size);
/// <summary>
/// 获取设备状态记录日统计列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
Result<List<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime);
/// <summary>
/// 获取设备状态记录统计分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
Result<PagedList<EquipmentRecordTotal>> GetEquipmentRecordTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size);
/// <summary>
/// 获取设备状态记录统计列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
Result<List<EquipmentRecordTotal>> GetEquipmentRecordTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime);
/// <summary>
/// 根据设备Id获取记录统计
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <returns></returns>
Result<EquipmentRecordTotalEntity> GetEquipmentRecordTotalDetail(string equipmentId);
/// <summary>
/// 获取设备状态记录月统计
/// </summary>
/// <returns></returns>
Result<List<EquipmentRecordStateMonthTotal>> GetEquipmentRecordStateMonthTotal();
/// <summary>
/// 获取设备记录开炉次数月统计
/// </summary>
/// <returns></returns>
Result<List<EquipmentRecordFurnaceMonthTotal>> GetEquipmentRecordFurnaceMonthTotal();
/// <summary>
/// 获取设备记录OEE月统计
/// </summary>
/// <returns></returns>
Result<List<EquipmentOEEMonthTotal>> GetEquipmentRecordOEEMonthTotal();
/// <summary>
/// 获取设备OEE信息
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="begDate">开始时间</param>
/// <param name="endDate">结束时间</param>
/// <returns></returns>
Result<EquipmentOEETotal> GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate);
#endregion
}
}

@ -0,0 +1,64 @@
using Masuit.Tools.Models;
using Masuit.Tools;
using PVDEMCS.Common;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Repositories.Entities;
using PVDEMCS.Services.Models;
namespace PVDEMCS.Services.Repositories
{
/// <summary>
/// 设备管理 数据层 接口
/// </summary>
public interface IEquipmentRepository : IDependency
{
/// <summary>
/// 获取设备分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<EquipmentInfo>> GetEquipmentPageList(string equipmentName, string equipmentCode, string equipmentType, bool? activated, int page, int size);
/// <summary>
/// 获取设备列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="activated">是否启用</param>
Result<List<EquipmentInfo>> GetEquipmentList(string equipmentName, string equipmentCode, string equipmentType, bool? activated);
/// <summary>
/// 获取设备明显
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result<EquipmentInfoEntity> GetEquipmentDetail(string id);
/// <summary>
/// 添加设备信息
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result AddEquipment(EquipmentInfoEntity entity);
/// <summary>
/// 更新设备信息
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result UpdateEquipment(EquipmentInfoEntity entity);
/// <summary>
/// 删除设备信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result DeleteEquipment(string id);
}
}

@ -0,0 +1,68 @@
using Masuit.Tools.Models;
using Masuit.Tools;
using PVDEMCS.Common;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Repositories.Entities;
using PVDEMCS.Services.Models;
namespace PVDEMCS.Services.Repositories
{
/// <summary>
/// 系统参数设置 数据层 接口
/// </summary>
public interface ISysConfigRepository : IDependency
{
/// <summary>
/// 获取系统参数设置分页列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<SysConfig>> GetSysConfigPageList(string configName, string configKey, int page, int size);
/// <summary>
/// 获取系统参数设置列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <returns></returns>
Result<List<SysConfig>> GetSysConfigList(string configName, string configKey);
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result<SysConfigEntity> GetSysConfigDetailById(string id);
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="name"></param>
/// <param name="key"></param>
/// <returns></returns>
Result<SysConfigEntity> GetSysConfigDetailNameOrKey(string name, string key = "");
/// <summary>
/// 添加系统参数设置
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result AddSysConfig(SysConfigEntity entity);
/// <summary>
/// 更新系统参数设置
/// </summary>
/// <param name="entity"></param>
Result UpdateSysConfig(SysConfigEntity entity);
/// <summary>
/// 删除系统参数设置
/// </summary>
/// <param name="id"></param>
Result DeleteSysConfig(string id);
}
}

@ -0,0 +1,62 @@
using Masuit.Tools.Models;
using Masuit.Tools;
using PVDEMCS.Common;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
namespace PVDEMCS.Services.Repositories
{
/// <summary>
/// 用户信息 数据层 接口
/// </summary>
public interface ISysUserRepository : IDependency
{
/// <summary>
/// 获取用户信息分页列表
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="activated">是否其哟个</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
Result<PagedList<SysUser>> GetSysUserPageList(string userName, bool? activated, int page, int size);
/// <summary>
/// 获取用户明细
/// </summary>
/// <param name="id">id</param>
/// <param name="userName">名称</param>
/// <returns></returns>
Result<SysUserEntity> GetSysUserDetail(string id, string userName);
/// <summary>
/// 添加用户
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result AddSysUser(SysUserEntity entity);
/// <summary>
/// 更新用户
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
Result UpdateSysUser(SysUserEntity entity);
/// <summary>
/// 更新用户密码
/// </summary>
/// <param name="id">用户id</param>
/// <param name="pwd">密码</param>
/// <returns></returns>
Result UpdatePassword(string id, string pwd);
/// <summary>
/// 删除用户
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
Result DeleteUser(string id);
}
}

@ -0,0 +1,460 @@
using AngleSharp.Dom;
using Masuit.Tools;
using Masuit.Tools.Models;
using Microsoft.AspNetCore.Mvc.RazorPages;
using PVDEMCS.Common;
using PVDEMCS.Common.Constant;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
using SharpCompress.Common;
using System;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace PVDEMCS.Services.Repositories.Impl
{
/// <summary>
/// PLC控制器 数据层 实现
/// </summary>
internal class DeviceRepository : IDeviceRepository
{
#region PLC控制器
/// <summary>
/// 获取PLC控制器分页列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<DeviceInfo>> GetDevicePageList(string deviceCode, string deviceName, bool? activated, int page, int size)
{
using (var context = new EFContext())
{
var query = QueryDevice(deviceCode, deviceName, activated, context);
var result = query.OrderBy(f => f.DeviceCode).ToPagedList(page, size);
return new Result<PagedList<DeviceInfo>>(result);
}
}
/// <summary>
/// 获取PLC控制器列表
/// </summary>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="activated">是否启用</param>
/// <returns></returns>
public Result<List<DeviceInfo>> GetDeviceInfoList(string deviceCode, string deviceName, bool? activated = false)
{
using (var context = new EFContext())
{
var query = QueryDevice(deviceCode, deviceName, activated, context);
var result = query.OrderBy(f => f.DeviceCode).ToList();
return new Result<List<DeviceInfo>>(result);
}
}
private IQueryable<DeviceInfo> QueryDevice(string deviceCode, string deviceName, bool? activated, EFContext context)
{
var query = context.DeviceInfos.Where(f => !f.IsDelete).Select(f =>
new DeviceInfo
{
Id = f.Id,
DeviceCode = f.DeviceCode,
DeviceName = f.DeviceName,
Host = f.Host,
Port = f.Port,
Protocol = f.Protocol,
Activated = f.Activated,
Remark = f.Remark,
});
if (!deviceCode.IsNullOrEmpty())
{
query = query.Where(f => f.DeviceCode.StartsWith(deviceCode));
}
if (!deviceName.IsNullOrEmpty())
{
query = query.Where(f => f.DeviceName.StartsWith(deviceName));
}
if (activated.HasValue)
{
query = query.Where(f => f.Activated == activated.Value);
}
return query;
}
/// <summary>
/// 获取PLC控制器明细
/// </summary>
/// <param name="id">主键Id</param>
/// <returns></returns>
public Result<DeviceInfoEntity> GetDeviceDetail(string id)
{
using (var context = new EFContext())
{
var result = new Result<DeviceInfoEntity>();
var detail = context.DeviceInfos.Where(f => f.Id == id).FirstOrDefault();
if (detail == null)
{
result.Message = $"没有找到Id:【{id}】的数据";
return result;
}
result.Content = detail;
return result;
}
}
/// <summary>
/// 添加PLC控制器
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public Result<string> AddDevice(DeviceInfoEntity entity)
{
using (var context = new EFContext())
{
var result = new Result<string>();
var query = context.DeviceInfos.Where(f => !f.IsDelete);
if (query.Where(f => f.DeviceName == entity.DeviceName).FirstOrDefault() != null)
{
result.Message = $"已存在DeviceName:【{entity.DeviceName}】的数据";
return result;
}
if (query.Where(f => f.DeviceCode == entity.DeviceCode).FirstOrDefault() != null)
{
result.Message = $"已存在DeviceCode:【{entity.DeviceCode}】的数据";
return result;
}
entity.Create();
context.DeviceInfos.Add(entity);
context.SaveChanges();
return new Result<string>(entity.Id);
}
}
/// <summary>
/// 更新PLC控制器
/// </summary>
/// <param name="entity"></param>
public Result UpdateDevice(DeviceInfoEntity entity)
{
using (var context = new EFContext())
{
var result = new Result();
var query = context.DeviceInfos.Where(f => !f.IsDelete);
var update = query.Where(f => f.Id == entity.Id).FirstOrDefault();
if (update == null)
{
result.Message = $"没有找到Id:【{entity.Id}】的数据";
return result;
}
if (query.Where(f => f.DeviceName == entity.DeviceName && f.Id != entity.Id).FirstOrDefault() != null)
{
result.Message = $"已存在DeviceName:【{entity.DeviceName}】的数据";
return result;
}
if (query.Where(f => f.DeviceCode == entity.DeviceCode && f.Id != entity.Id).FirstOrDefault() != null)
{
result.Message = $"已存在DeviceCode:【{entity.DeviceCode}】的数据";
return result;
}
update.DeviceCode = entity.DeviceCode;
update.DeviceName = entity.DeviceName;
update.Activated = entity.Activated;
update.Host = entity.Host;
update.Port = entity.Port;
update.Protocol = entity.Protocol;
update.Remark = entity.Remark;
entity.Update();
context.SaveChanges();
return result;
}
}
/// <summary>
/// 删除PLC控制器
/// </summary>
/// <param name="id"></param>
public Result DeleteDevice(string id)
{
using (var context = new EFContext())
{
var result = new Result();
var entity = context.DeviceInfos.Where(f => f.Id == id).FirstOrDefault();
if (entity == null)
{
result.Message = $"没有找到Id:【{id}】的数据";
return result;
}
entity.Delete();
context.SaveChanges();
return result;
}
}
#endregion
#region PLC点位
/// <summary>
/// 获取PLC控制器点位分页列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
///<param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<DevicePoint>> GetDevicePointPageList(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated, int page, int size)
{
using (var context = new EFContext())
{
var query = DevicePointQuery(deviceId, deviceName, deviceCode, equipmentName, equipmentCode, equipmentType, pointCode, pointName, activated, context);
var pageList = query.OrderBy(f => f.PointCode).ToPagedList(page, size);
return new Result<PagedList<DevicePoint>>(pageList);
}
}
/// <summary>
/// 获取PLC控制器点位列表
/// </summary>
/// <param name="deviceId">控制器Id</param>
/// <param name="deviceCode">控制器编号</param>
/// <param name="deviceName">控制器名称</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="pointCode">点位编号</param>
/// <param name="pointName">点位列表</param>
///<param name="activated">是否启用</param>
/// <returns></returns>
public Result<List<DevicePoint>> GetDevicePointList(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated)
{
using (var context = new EFContext())
{
var query = DevicePointQuery(deviceId, deviceName, deviceCode, equipmentName, equipmentCode, equipmentType, pointCode, pointName, activated, context);
var list = query.ToList();
return new Result<List<DevicePoint>>(list);
}
}
private IQueryable<DevicePoint> DevicePointQuery(string deviceId, string deviceName, string deviceCode, string equipmentName, string equipmentCode, string equipmentType, string pointCode, string pointName, bool? activated, EFContext context)
{
var query = from device in context.DeviceInfos.Where(f => !f.IsDelete)
join point in context.DevicePoints.Where(f => !f.IsDelete) on device.Id equals point.DeviceId
join equipment in context.EquipmentInfos.Where(f => !f.IsDelete) on point.EquipmentId equals equipment.Id
select new DevicePoint
{
Id = point.Id,
DeviceId = device.Id,
DeviceCode = device.DeviceCode,
DeviceName = device.DeviceName,
EquipmentId = equipment.Id,
EquipmentCode = equipment.EquipmentCode,
EquipmentName = equipment.EquipmentName,
EquipmentType = equipment.EquipmentType,
Model = equipment.Model,
IsAlarm = equipment.IsAlarm,
Activated = point.Activated,
PointCode = point.PointCode,
PointName = point.PointName,
Address = point.Address,
DataType = point.DataType,
ActionType = point.ActionType,
Remark = point.Remark,
};
if (!deviceId.IsNullOrEmpty())
{
query = query.Where(f => f.DeviceId == deviceId);
}
if (!deviceName.IsNullOrEmpty())
{
query = query.Where(f => f.DeviceName.StartsWith(deviceName));
}
if (!deviceCode.IsNullOrEmpty())
{
query = query.Where(f => f.DeviceCode.StartsWith(deviceCode));
}
if (!equipmentName.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentName.StartsWith(equipmentName));
}
if (!equipmentCode.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentCode.StartsWith(equipmentCode));
}
if (!equipmentType.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentType == equipmentType);
}
if (!pointCode.IsNullOrEmpty())
{
query = query.Where(f => f.PointCode.StartsWith(pointCode));
}
if (!pointName.IsNullOrEmpty())
{
query = query.Where(f => f.PointName.StartsWith(pointName));
}
if (activated.HasValue)
{
query = query.Where(f => f.Activated == activated.Value);
}
return query;
}
/// <summary>
/// 获取PLC控制器点位明细
/// </summary>
/// <param name="id">Id</param>
/// <returns></returns>
public Result<DevicePointEntity> GetDevicePointDetail(string id)
{
using (var context = new EFContext())
{
var result = new Result<DevicePointEntity>();
var entity = context.DevicePoints.Where(f => f.Id == id).FirstOrDefault();
if (entity == null)
{
result.Message = $"没有找到Id:【{id}】的数据";
return result;
}
result.Content = entity;
return result;
}
}
/// <summary>
/// 添加PLC控制器点位
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public Result<string> AddDevicePoint(DevicePointEntity entity)
{
using (var context = new EFContext())
{
var result = new Result<string>();
var query = context.DevicePoints.Where(f => !f.IsDelete);
if (query.Where(f => f.PointName == entity.PointName).FirstOrDefault() != null)
{
result.Message = $"已存在PointName:【{entity.PointName}】的数据";
return result;
}
if (query.Where(f => f.PointCode == entity.PointCode).FirstOrDefault() != null)
{
result.Message = $"已存在PointCode:【{entity.PointCode}】的数据";
return result;
}
entity.Create();
context.DevicePoints.Add(entity);
context.SaveChanges();
result.Content = entity.Id;
return result;
}
}
/// <summary>
/// 更新PLC控制器点位
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public Result UpdateDevicePoint(DevicePointEntity entity)
{
using (var context = new EFContext())
{
var result = new Result();
var query = context.DevicePoints.Where(f => !f.IsDelete);
var update = query.Where(f => f.Id == entity.Id).FirstOrDefault();
if (update == null)
{
result.Message = $"没有找到Id:【{entity.Id}】的数据";
return result;
}
if (query.Where(f => f.PointName == entity.PointName && f.Id != entity.Id).FirstOrDefault() != null)
{
result.Message = $"已存在PointName:【{entity.PointName}】的数据";
return result;
}
if (query.Where(f => f.PointCode == entity.PointCode && f.Id != entity.Id).FirstOrDefault() != null)
{
result.Message = $"已存在PointCode:【{entity.PointCode}】的数据";
return result;
}
update.DeviceId = entity.DeviceId;
update.EquipmentId = entity.EquipmentId;
update.PointCode = entity.PointCode;
update.PointName = entity.PointName;
update.ActionType = entity.ActionType;
update.Activated = entity.Activated;
update.Address = entity.Address;
update.DataType = entity.DataType;
update.Remark = entity.Remark;
entity.Update();
context.SaveChanges();
return result;
}
}
/// <summary>
/// 删除PLC控制器点位
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result DeleteDevicePoint(string id)
{
using (var context = new EFContext())
{
var result = new Result();
var entity = context.DevicePoints.Where(f => f.Id == id).FirstOrDefault();
if (entity == null)
{
result.Message = $"没有找到Id:【{id}】的数据";
return result;
}
entity.Delete();
context.SaveChanges();
return result;
}
}
#endregion
}
}

@ -0,0 +1,841 @@
using AngleSharp.Css.Values;
using AngleSharp.Dom;
using Masuit.Tools;
using Masuit.Tools.DateTimeExt;
using Masuit.Tools.Models;
using Microsoft.EntityFrameworkCore;
using NLog.LayoutRenderers.Wrappers;
using PVDEMCS.Common;
using PVDEMCS.Common.Constant;
using PVDEMCS.Common.DI;
using PVDEMCS.Common.EF;
using PVDEMCS.Common.Tools;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
using SixLabors.ImageSharp.Processing.Processors.Transforms;
using System.Text.RegularExpressions;
namespace PVDEMCS.Services.Repositories.Impl
{
/*
*
*/
internal class EquipmentRecordRepository : IEquipmentRecordRepository
{
private ISysConfigRepository _configRepository;
public EquipmentRecordRepository(ISysConfigRepository configRepository)
{
_configRepository = configRepository;
}
#region 设备状态记录
/// <summary>
/// 获取设备状态记录分页列表
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<EquipmentRecord>> GetEquipmentRecordPageList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size)
{
using (var context = new EFContext())
{
var query = QueryEquipmentRecord(equipmentId, equipmentName, equipmentCode, equipmentType, begTime, endTime, context);
var pageList = query.OrderByDescending(f => f.StartTime).ToPagedList(page, size);
return new Result<PagedList<EquipmentRecord>>(pageList);
}
}
/// <summary>
/// 获取设备状态记录列表
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <returns></returns>
public Result<List<EquipmentRecord>> GetEquipmentRecordList(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime)
{
using (var context = new EFContext())
{
var query = QueryEquipmentRecord(equipmentId, equipmentName, equipmentCode, equipmentType, begTime, endTime, context);
var list = query.OrderByDescending(f => f.StartTime).ToList();
return new Result<List<EquipmentRecord>>(list);
}
}
private IQueryable<EquipmentRecord> QueryEquipmentRecord(string equipmentId, string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, EFContext context)
{
var query = from record in context.EquipmentRecords
join equipment in context.EquipmentInfos.Where(f => !f.IsDelete) on record.EquipmentId equals equipment.Id
select new EquipmentRecord
{
Id = record.Id,
EquipmentId = equipment.Id,
EquipmentName = equipment.EquipmentName,
EquipmentCode = equipment.EquipmentCode,
EquipmentType = equipment.EquipmentType,
StartTime = record.StartTime,
EndTime = record.EndTime,
State = record.State,
};
if (!equipmentId.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentId == equipmentId);
}
if (!equipmentName.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentName.StartsWith(equipmentName));
}
if (!equipmentCode.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentCode.StartsWith(equipmentCode));
}
if (!equipmentType.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentType == equipmentType);
}
if (begTime.HasValue)
{
query = query.Where(f => f.StartTime >= begTime);
}
if (endTime.HasValue)
{
query = query.Where(f => f.EndTime <= endTime);
}
return query;
}
/// <summary>
/// 添加或更新设备状态记录
/// 1.如果设备最新记录状态没有改变则更新结束时间
/// 2.如果没有记录则添加记录
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="state">设备状态,运行:Run待机:Stop报警:Alarm</param>
/// <param name="dateTime">记录时间</param>
/// <returns></returns>
public Result AddUpdateEquipmentRecord(string equipmentId, string state, DateTime dateTime)
{
using (var context = new EFContext())
{
var entity = context.EquipmentRecords.Where(f => f.EquipmentId == equipmentId).OrderByDescending(f => f.StartTime).FirstOrDefault();
//如果最新记录状态没有改变
if (entity != null && entity.State == state)
{
entity.EndTime = dateTime;
entity.Update();
}
else
{
//更新最新记录结束时间
if (entity != null)
{
entity.EndTime = dateTime;
entity.Update();
}
//添加设备状态新记录
var record = new EquipmentRecordEntity
{
EquipmentId = equipmentId,
State = state,
StartTime = dateTime,
EndTime = dateTime,
};
record.Create();
context.EquipmentRecords.Add(record);
}
context.SaveChanges();
return new Result();
}
}
/// <summary>
/// 进行设备状态记录统计(日统计)
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public Result RunEquipmentRecordDayTotal(DateTime date)
{
var begDate = DateTime.Parse(date.ToString("yyyy-MM-dd"));
var endDate = begDate.AddDays(1).AddSeconds(-1);
var result = new Result();
using (var context = new EFContext())
{
var query = context.EquipmentRecords.Where(f => (f.StartTime >= begDate && f.StartTime <= endDate) || (f.EndTime >= begDate && f.EndTime <= endDate)).ToList();
//获取状态统计时间
var total = query.GroupBy(f => new { f.EquipmentId, f.State })
.Select(f => new TotalRecord
{
EquipmentId = f.Key.EquipmentId,
State = f.Key.State,
Value = Convert.ToDecimal(f.Sum(ff => (ff.EndTime - ff.StartTime).TotalMinutes)),
Date = DateTime.Parse(f.Min(ff => ff.StartTime).ToString("yyyy-MM-dd")),
}).ToList();
if (total.Count == 0)
{
result.Message = "没有汇总统计数据";
return result;
}
var furnaceQuy = (from q in query
join e in context.EquipmentInfos.Where(f => !f.IsDelete) on q.EquipmentId equals e.Id
where q.State == EquipmentState.Run
select new
{
q.EquipmentId,
e.EquipmentType,
q.StartTime,
q.EndTime
}).ToList();
//获取配置的设备的阈值
var balzersConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentType.Balzers).Content;
var cemeconConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentType.CemeCon).Content;
var ionbondConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentType.Ionbond).Content;
var balzers = 200;
var cemecon = 300;
var ionbond = 200;
if (balzersConfig != null && !balzersConfig.ConfigValue.IsNullOrEmpty())
{
int.TryParse(balzersConfig.ConfigValue, out balzers);
}
if (cemeconConfig != null && !cemeconConfig.ConfigValue.IsNullOrEmpty())
{
int.TryParse(cemeconConfig.ConfigValue, out cemecon);
}
if (ionbondConfig != null && !ionbondConfig.ConfigValue.IsNullOrEmpty())
{
int.TryParse(ionbondConfig.ConfigValue, out ionbond);
}
var minDate = total.Min(f => f.Date);
var maxDate = total.Max(f => f.Date);
var dayTotals = context.EquipmentRecordDayTotals.Where(f => f.TotalDay >= minDate && f.TotalDay <= maxDate).ToList();
foreach (var item in total.Select(f => new { f.EquipmentId, f.Date }).Distinct())
{
var value = dayTotals.Where(f => f.EquipmentId == item.EquipmentId && f.TotalDay == item.Date).FirstOrDefault();
if (value.IsNullOrEmpty())
{
value = new EquipmentRecordDayTotalEntity
{
EquipmentId = item.EquipmentId,
TotalDay = item.Date,
};
value.Create();
context.EquipmentRecordDayTotals.Add(value);
}
else
{
value.Update();
}
//运行时间
var run = total.Where(f => f.EquipmentId == value.EquipmentId && f.Date == value.TotalDay && f.State == EquipmentState.Run).FirstOrDefault();
if (!run.IsNullOrEmpty())
{
value.TotalRunningTime = run.Value;
}
//待机时间
var stop = total.Where(f => f.EquipmentId == value.EquipmentId && f.Date == value.TotalDay && f.State == EquipmentState.Stop).FirstOrDefault();
if (!stop.IsNullOrEmpty())
{
value.TotalStopTime = stop.Value;
}
//报警时间
var alarm = total.Where(f => f.EquipmentId == value.EquipmentId && f.Date == value.TotalDay && f.State == EquipmentState.Alarm).FirstOrDefault();
if (!alarm.IsNullOrEmpty())
{
value.TotalAlarmTime = alarm.Value;
}
value.FurnaceNum = 0;
//出炉数量
var furnaceList = furnaceQuy.Where(f => f.EquipmentId == value.EquipmentId && value.TotalDay.Value.ToString("yyyy-MM-dd") == f.StartTime.ToString("yyyy-MM-dd")).ToList();
foreach (var furnace in furnaceList)
{
//计算开炉次数
var minutes = (furnace.EndTime - furnace.StartTime).TotalMinutes;
switch (furnace.EquipmentType)
{
case EquipmentType.Balzers:
if (minutes >= balzers)
{
value.FurnaceNum++;
}
break;
case EquipmentType.Ionbond:
if (minutes >= ionbond)
{
value.FurnaceNum++;
}
break;
case EquipmentType.CemeCon:
if (minutes >= cemecon)
{
value.FurnaceNum++;
}
break;
}
}
}
context.SaveChanges();
return result;
}
}
/// <summary>
/// 进行设备状态记录统计
/// </summary>
/// <returns></returns>
public Result RunEquipmentRecordTotal()
{
using (var context = new EFContext())
{
var query = context.EquipmentRecordDayTotals.AsQueryable();
//获取最后更新时间
var list = context.EquipmentRecordTotals.ToList();
//var maxDate = list.Max(f => f.UpdateAt);
////如果有记录
//if (maxDate.HasValue)
//{
// query = query.Where(f => f.UpdateAt > maxDate);
//}
var values = query.GroupBy(f => f.EquipmentId).Select(f => new EquipmentRecordTotalEntity
{
EquipmentId = f.Key,
FurnaceNum = f.Sum(f => f.FurnaceNum),
TotalRunningTime = f.Sum(f => f.TotalRunningTime),
TotalAlarmTime = f.Sum(f => f.TotalAlarmTime),
TotalStopTime = f.Sum(f => f.TotalStopTime),
}).ToList();
if (values.Count == 0)
{
return new Result("没有汇总数据");
}
if (list.IsNullOrEmpty())
{
foreach (var item in values)
{
item.Create();
}
context.EquipmentRecordTotals.AddRange(values);
}
else
{
foreach (var item in list)
{
var value = values.Where(f => f.EquipmentId == item.EquipmentId).FirstOrDefault();
if (value.IsNullOrEmpty())
{
value.Create();
context.EquipmentRecordTotals.Add(value);
}
else
{
item.FurnaceNum = value.FurnaceNum;
item.TotalAlarmTime = value.TotalAlarmTime;
item.TotalRunningTime = value.TotalRunningTime;
item.TotalStopTime = value.TotalStopTime;
item.Update();
}
}
}
context.SaveChanges();
return new Result();
}
}
class TotalRecord
{
public string EquipmentId { get; set; }
public string State { get; set; }
public decimal Value { get; set; }
public DateTime Date { get; set; }
}
#endregion
#region 设备记录统计
/// <summary>
/// 获取设备状态记录日统计分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
public Result<PagedList<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size)
{
using (var context = new EFContext())
{
var query = QueryEquipmentRecordDayTotal(equipmentName, equipmentCode, equipmentType, begTime, endTime, context);
var pageList = query.OrderByDescending(f => f.EquipmentCode).ToPagedList(page, size);
return new Result<PagedList<EquipmentRecordDayTotal>>(pageList);
}
}
/// <summary>
/// 获取设备状态记录日统计列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
public Result<List<EquipmentRecordDayTotal>> GetEquipmentRecordDayTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime)
{
using (var context = new EFContext())
{
var query = QueryEquipmentRecordDayTotal(equipmentName, equipmentCode, equipmentType, begTime, endTime, context);
var pageList = query.OrderByDescending(f => f.EquipmentCode).ToList();
return new Result<List<EquipmentRecordDayTotal>>(pageList);
}
}
private IQueryable<EquipmentRecordDayTotal> QueryEquipmentRecordDayTotal(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, EFContext context)
{
var query = from recordTotal in context.EquipmentRecordDayTotals
join equipment in context.EquipmentInfos.Where(f => !f.IsDelete) on recordTotal.EquipmentId equals equipment.Id
select new EquipmentRecordDayTotal
{
Id = recordTotal.Id,
EquipmentName = equipment.EquipmentName,
EquipmentCode = equipment.EquipmentCode,
EquipmentType = equipment.EquipmentType,
FurnaceNum = recordTotal.FurnaceNum,
TotalAlarmTime = recordTotal.TotalAlarmTime,
TotalStopTime = recordTotal.TotalStopTime,
TotalRunningTime = recordTotal.TotalRunningTime,
TotalDay = recordTotal.TotalDay,
};
if (!equipmentName.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentName.StartsWith(equipmentName));
}
if (!equipmentCode.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentCode.StartsWith(equipmentCode));
}
if (!equipmentType.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentType == equipmentType);
}
if (begTime.HasValue)
{
query = query.Where(f => f.TotalDay >= begTime);
}
if (endTime.HasValue)
{
query = query.Where(f => f.TotalDay <= endTime);
}
query = query.Where(f => f.TotalDay >= begTime && f.TotalDay <= endTime);
return query;
}
/// <summary>
/// 获取设备状态记录统计分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
public Result<PagedList<EquipmentRecordTotal>> GetEquipmentRecordTotalPageList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, int page, int size)
{
using (var context = new EFContext())
{
var sql = QueryEquipmentRecordTotal(equipmentName, equipmentCode, equipmentType, begTime, endTime, context);
var list = EFSqlHelper.FromSqlQuery<EquipmentRecordTotal>(context, sql).ToList();
return new Result<PagedList<EquipmentRecordTotal>>(list.ToPagedList(page, size));
}
}
/// <summary>
/// 获取设备状态记录统计列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="begTime">开始时间</param>
/// <param name="endTime">结束时间</param>
public Result<List<EquipmentRecordTotal>> GetEquipmentRecordTotalList(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime)
{
using (var context = new EFContext())
{
var sql = QueryEquipmentRecordTotal(equipmentName, equipmentCode, equipmentType, begTime, endTime, context);
var list = EFSqlHelper.FromSqlQuery<EquipmentRecordTotal>(context, sql).ToList();
return new Result<List<EquipmentRecordTotal>>(list);
}
}
private string QueryEquipmentRecordTotal(string equipmentName, string equipmentCode, string equipmentType, DateTime? begTime, DateTime? endTime, EFContext context)
{
var sql = @$"SELECT
equipment_info.id as EquipmentId,
equipment_code as EquipmentCode,
equipment_name as EquipmentName,
SUM(furnace_num) AS FurnaceNum,
SUM( total_running_time ) AS TotalRunningTime,
SUM( total_alarm_time ) AS TotalAlarmTime,
SUM( total_stop_time ) AS TotalStopTime
FROM
equipment_record_day_total
JOIN equipment_info ON equipment_record_day_total.equipment_id = equipment_info.id
WHERE 1=1 ";
if (begTime.HasValue)
{
sql += $" AND total_day >= '{begTime.Value.ToString("yyyy-MM-dd")}'";
}
if (endTime.HasValue)
{
sql += $" AND total_day <= '{endTime.Value.ToString("yyyy-MM-dd")}'";
}
if (!equipmentName.IsNullOrEmpty())
{
sql += $" AND equipment_info.equipment_name='{equipmentName}'";
}
if (!equipmentCode.IsNullOrEmpty())
{
sql += $" AND equipment_info.equipment_code='{equipmentCode}'";
}
if (!equipmentType.IsNullOrEmpty())
{
sql += $" AND equipment_info.equipment_type='{equipmentType}'";
}
sql += " GROUP BY equipment_info.id,equipment_info.equipment_code,equipment_info.equipment_name";
return sql;
}
/// <summary>
/// 根据设备Id获取记录统计
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <returns></returns>
public Result<EquipmentRecordTotalEntity> GetEquipmentRecordTotalDetail(string equipmentId)
{
using (var context = new EFContext())
{
var entity = context.EquipmentRecordTotals.Where(f => f.EquipmentId == equipmentId).FirstOrDefault();
return new Result<EquipmentRecordTotalEntity>(entity);
}
}
/// <summary>
/// 获取设备状态记录月统计
/// </summary>
/// <returns></returns>
public Result<List<EquipmentRecordStateMonthTotal>> GetEquipmentRecordStateMonthTotal()
{
//获取今年第一天和最后一天
var endDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd");
var begDate = DateTime.Parse(endDate).AddMonths(-12).ToString("yyyy-MM-dd");
using (var context = new EFContext())
{
var sql = @$"SELECT
SUM(total_running_time) AS TotalRunningTime,
SUM(total_alarm_time) AS TotalAlarmTime,
SUM(total_stop_time) AS TotalStopTime,
DATE_FORMAT(total_day,'%Y-%m') AS TotalMonth
FROM
equipment_record_day_total
WHERE
total_day >= '{begDate}'
AND total_day <= '{endDate}'
GROUP BY
TotalMonth";
var list = EFSqlHelper.FromSqlQuery<EquipmentRecordStateMonthTotal>(context, sql).ToList();
return new Result<List<EquipmentRecordStateMonthTotal>>(list);
}
}
/// <summary>
/// 获取设备记录开炉次数月统计
/// </summary>
/// <returns></returns>
public Result<List<EquipmentRecordFurnaceMonthTotal>> GetEquipmentRecordFurnaceMonthTotal()
{
//获取今年第一天和最后一天
var endDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd");
var begDate = DateTime.Parse(endDate).AddMonths(-12).ToString("yyyy-MM-dd");
using (var context = new EFContext())
{
var sql = @$"SELECT
SUM( furnace_num ) AS FurnaceNum,
equipment_info.equipment_type AS EquipmentType,
DATE_FORMAT ( total_day,'%Y-%m' ) AS TotalMonth
FROM
equipment_record_day_total
JOIN equipment_info ON equipment_record_day_total.equipment_id = equipment_info.id
WHERE
total_day >= '{begDate}'
AND total_day <= '{endDate}'
GROUP BY
TotalMonth,
EquipmentType";
var list = EFSqlHelper.FromSqlQuery<EquipmentRecordFurnaceMonthTotal>(context, sql).ToList();
return new Result<List<EquipmentRecordFurnaceMonthTotal>>(list);
}
}
/// <summary>
/// 获取设备记录OEE月统计
/// </summary>
/// <returns></returns>
public Result<List<EquipmentOEEMonthTotal>> GetEquipmentRecordOEEMonthTotal()
{
//获取今年第一天和最后一天
var endDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd");
var begDate = DateTime.Parse(endDate).AddMonths(-12).ToString("yyyy-MM-dd");
using (var context = new EFContext())
{
var sql = $@"SELECT
info.id AS EquipmentId,
info.equipment_type AS EquipmentType,
SUM( total_running_time ) AS TotalRunningTime,
DATE_FORMAT ( total_day,'%Y-%m' ) AS TotalMonth
FROM
equipment_record_day_total a
JOIN equipment_info info ON a.equipment_id = info.id
WHERE
total_day >= '{begDate}'
AND total_day <= '{endDate}'
GROUP BY
TotalMonth,
EquipmentId,
EquipmentType";
var list = EFSqlHelper.FromSqlQuery<EquipmentRecordStateOEEMonthTotal>(context, sql).ToArray();
//计算OEE
//获取配置的设备的初尝值
var balzersConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.BalzersOffset).Content;
var cemeconConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.CemeConOffset).Content;
var ionbondConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.IonbondOffset).Content;
var balzers = 0m;
var cemecon = 0m;
var ionbond = 0m;
if (balzersConfig != null && !balzersConfig.ConfigValue.IsNullOrEmpty())
{
decimal.TryParse(balzersConfig.ConfigValue, out balzers);
}
if (cemeconConfig != null && !cemeconConfig.ConfigValue.IsNullOrEmpty())
{
decimal.TryParse(cemeconConfig.ConfigValue, out cemecon);
}
if (ionbondConfig != null && !ionbondConfig.ConfigValue.IsNullOrEmpty())
{
decimal.TryParse(ionbondConfig.ConfigValue, out ionbond);
}
foreach (var item in list)
{
var days = 0;
var minutes = 0;
var now = DateTime.Now;
//如果在本月
if (item.TotalMonth == DateTime.Now.ToString("yyyy-MM"))
{
//初尝值不包括今天
days = now.Day - 1;
//获取当月到当前的分钟
minutes = days * 60 * 24 + (now.Hour - 1) * 60 + now.Minute;
}
else
{
var sptr = item.TotalMonth.Split('-');
if (sptr.Length == 2)
{
days = DateTime.DaysInMonth(int.Parse(sptr[0]), int.Parse(sptr[1]));
minutes = days * 60 * 24;
}
}
var value = 0m;
switch (item.EquipmentType)
{
case EquipmentType.Balzers:
value = days * balzers;
break;
case EquipmentType.Ionbond:
value = days * ionbond;
break;
case EquipmentType.CemeCon:
value = days * cemecon;
break;
default:
break;
}
if (minutes > 0)
{
item.OEE = (item.TotalRunningTime + value) / minutes;
}
}
var result = list.GroupBy(f => f.TotalMonth).Select(f => new EquipmentOEEMonthTotal
{
TotalMonth = f.Key,
OEE = Math.Round(f.Sum(f => f.OEE) / f.Count(), 4) * 100
}).ToList();
return new Result<List<EquipmentOEEMonthTotal>>(result);
}
}
/// <summary>
/// 获取设备OEE信息
/// </summary>
/// <param name="equipmentId">设备Id</param>
/// <param name="begDate">开始时间</param>
/// <param name="endDate">结束时间</param>
/// <returns></returns>
public Result<EquipmentOEETotal> GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate)
{
//获取今年第一天和最后一天
var beg = begDate.ToString("yyyy-MM-dd");
var end = endDate.AddDays(1).ToString("yyyy-MM-dd");
EquipmentOEETotal ret = null;
using (var context = new EFContext())
{
var sql = $@"SELECT
info.id AS EquipmentId,
info.equipment_type AS EquipmentType,
SUM( total_running_time ) AS TotalRunningTime,
SUM( total_alarm_time ) AS TotalAlarmTime,
SUM( total_stop_time ) AS TotalStopTime
FROM
equipment_record_day_total a
JOIN equipment_info info ON a.equipment_id = info.id
WHERE
info.id = '{equipmentId}'
AND total_day >= '{beg}'
AND total_day <= '{endDate}'
GROUP BY
EquipmentId,
EquipmentType";
var list = EFSqlHelper.FromSqlQuery<EquipmentRecordStateOEEMonthTotal>(context, sql).ToArray();
if (list.Length > 0)
{
var detail = list[0];
//获取配置的设备的初尝值
var balzersConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.BalzersOffset).Content;
var cemeconConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.CemeConOffset).Content;
var ionbondConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.IonbondOffset).Content;
var balzers = 0m;
var cemecon = 0m;
var ionbond = 0m;
if (balzersConfig != null && !balzersConfig.ConfigValue.IsNullOrEmpty())
{
decimal.TryParse(balzersConfig.ConfigValue, out balzers);
}
if (cemeconConfig != null && !cemeconConfig.ConfigValue.IsNullOrEmpty())
{
decimal.TryParse(cemeconConfig.ConfigValue, out cemecon);
}
if (ionbondConfig != null && !ionbondConfig.ConfigValue.IsNullOrEmpty())
{
decimal.TryParse(ionbondConfig.ConfigValue, out ionbond);
}
var now = DateTime.Now;
var minutes = 0m;
var days = 0m;
if (endDate >= now)
{
days = Convert.ToDecimal((now - begDate).TotalDays);
}
else
{
days = Convert.ToDecimal((endDate - begDate).TotalDays);
}
if (end == DateTime.Now.ToString("yyyy-MM-dd"))
{
days = days - 1;
minutes = days * 60 * 24 + (now.Hour - 1) * 60 + now.Minute;
}
else
{
minutes = days * 60 * 24;
}
var value = 0m;
switch (detail.EquipmentType)
{
case EquipmentType.Balzers:
value = days * balzers;
break;
case EquipmentType.Ionbond:
value = days * ionbond;
break;
case EquipmentType.CemeCon:
value = days * cemecon;
break;
default:
break;
}
if (minutes > 0)
{
detail.OEE = Math.Round((detail.TotalRunningTime + value) / minutes, 4) * 100;
}
ret = ModelTools.PubClone<EquipmentRecordStateOEEMonthTotal, EquipmentOEETotal>.Trans(detail);
}
return new Result<EquipmentOEETotal>(ret);
}
}
#endregion
}
}

@ -0,0 +1,216 @@
using Masuit.Tools;
using Masuit.Tools.Models;
using PVDEMCS.Common;
using PVDEMCS.Common.Constant;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
namespace PVDEMCS.Services.Repositories
{
/// <summary>
/// 设备信息 数据层 实现
/// </summary>
internal class EquipmentRepository : IEquipmentRepository
{
/// <summary>
/// 获取设备分页列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="activated">是否启用</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<EquipmentInfo>> GetEquipmentPageList(string equipmentName, string equipmentCode, string equipmentType, bool? activated, int page, int size)
{
using (var context = new EFContext())
{
var query = QueryEquipment(equipmentName, equipmentCode, equipmentType, activated, context);
var result = query.OrderBy(f => f.EquipmentCode).ToPagedList(page, size);
return new Result<PagedList<EquipmentInfo>>(result);
}
}
/// <summary>
/// 获取设备列表
/// </summary>
/// <param name="equipmentName">设备名称</param>
/// <param name="equipmentCode">设备编号</param>
/// <param name="equipmentType">设备类型</param>
/// <param name="activated">是否启用</param>
public Result<List<EquipmentInfo>> GetEquipmentList(string equipmentName, string equipmentCode, string equipmentType, bool? activated)
{
using (var context = new EFContext())
{
var query = QueryEquipment(equipmentName, equipmentCode, equipmentType, activated, context);
var result = query.OrderBy(f => f.EquipmentCode).ToList();
return new Result<List<EquipmentInfo>>(result);
}
}
/// <summary>
/// 获取设备明显
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result<EquipmentInfoEntity> GetEquipmentDetail(string id)
{
using (var context = new EFContext())
{
var result = new Result<EquipmentInfoEntity>();
var entity = context.EquipmentInfos.Where(f => !f.IsDelete && f.Id == id).FirstOrDefault();
if (entity == null)
{
result.Message = $"没有找到Id:【{id}】的数据";
return result;
}
result.Content = entity;
return result;
}
}
private IQueryable<EquipmentInfo> QueryEquipment(string equipmentName, string equipmentCode, string equipmentType, bool? activated, EFContext context)
{
var query = context.EquipmentInfos.Where(f => !f.IsDelete).Select(f => new EquipmentInfo
{
Id = f.Id,
EquipmentCode = f.EquipmentCode,
EquipmentName = f.EquipmentName,
EquipmentType = f.EquipmentType,
Activated = f.Activated,
OrdrNo = f.OrdrNo,
Model = f.Model,
IsAlarm = f.IsAlarm,
Remark = f.Remark
});
if (!equipmentCode.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentCode.StartsWith(equipmentCode));
}
if (!equipmentName.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentName.StartsWith(equipmentName));
}
if (!equipmentType.IsNullOrEmpty())
{
query = query.Where(f => f.EquipmentType == equipmentType);
}
if (activated.HasValue)
{
query = query.Where(f => f.Activated == activated.Value);
}
return query;
}
/// <summary>
/// 添加设备信息
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public Result AddEquipment(EquipmentInfoEntity entity)
{
using (var context = new EFContext())
{
var result = new Result();
var query = context.EquipmentInfos.Where(f => !f.IsDelete);
if (query.Where(f => f.EquipmentCode == entity.EquipmentCode).FirstOrDefault() != null)
{
result.Message = $"EquipmentCode:【{entity.EquipmentCode}】已存在";
return result;
}
if (query.Where(f => f.EquipmentName == entity.EquipmentName).FirstOrDefault() != null)
{
result.Message = $"EquipmentName:【{entity.EquipmentName}】已存在";
return result;
}
entity.Create();
context.EquipmentInfos.Add(entity);
context.SaveChanges();
return result;
}
}
/// <summary>
/// 更新设备信息
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public Result UpdateEquipment(EquipmentInfoEntity entity)
{
using (var context = new EFContext())
{
var result = new Result();
var query = context.EquipmentInfos.Where(f => !f.IsDelete);
var update = query.Where(f => f.Id == entity.Id).FirstOrDefault();
if (update == null)
{
result.Message = $"没有找到Id:【{entity.Id}】的数据";
return result;
}
if (query.Where(f => f.EquipmentCode == entity.EquipmentCode && f.Id != entity.Id).FirstOrDefault() != null)
{
result.Message = $"EquipmentCode:【{entity.EquipmentCode}】已存在";
return result;
}
if (query.Where(f => f.EquipmentName == entity.EquipmentName && f.Id != entity.Id).FirstOrDefault() != null)
{
result.Message = $"EquipmentName:【{entity.EquipmentName}】已存在";
return result;
}
update.EquipmentCode = entity.EquipmentCode;
update.EquipmentName = entity.EquipmentName;
update.Activated = entity.Activated;
update.OrdrNo = entity.OrdrNo;
update.Remark = entity.Remark;
update.Update();
context.SaveChanges();
return result;
}
}
/// <summary>
/// 删除设备信息
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result DeleteEquipment(string id)
{
using (var context = new EFContext())
{
var result = new Result();
var query = context.EquipmentInfos.Where(f => !f.IsDelete);
var entity = query.Where(f => f.Id == id).FirstOrDefault();
if (entity == null)
{
result.Message = $"没有找到Id:【{id}】的数据";
return result;
}
entity.Delete();
context.SaveChanges();
return result;
}
}
}
}

@ -0,0 +1,235 @@
using Masuit.Tools;
using Masuit.Tools.Models;
using PVDEMCS.Common;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
namespace PVDEMCS.Services.Repositories.Impl
{
/// <summary>
/// 系统参数设置 数据层 实现
/// </summary>
internal class SysConfigRepository : ISysConfigRepository
{
/// <summary>
/// 获取系统参数设置分页列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<SysConfig>> GetSysConfigPageList(string configName, string configKey, int page, int size)
{
using (var context = new EFContext())
{
var query = QuerySysConfig(configName, configKey, context);
var result = query.OrderBy(f => f.ConfigName).ToPagedList(page, size);
return new Result<PagedList<SysConfig>>(result);
}
}
/// <summary>
/// 获取系统参数设置列表
/// </summary>
/// <param name="configName">参数名称</param>
/// <param name="configKey">参数键值</param>
/// <returns></returns>
public Result<List<SysConfig>> GetSysConfigList(string configName, string configKey)
{
using (var context = new EFContext())
{
var query = QuerySysConfig(configName, configKey, context);
var result = query.OrderBy(f => f.ConfigName).ToList();
return new Result<List<SysConfig>>(result);
}
}
private IQueryable<SysConfig> QuerySysConfig(string configName, string configKey, EFContext context)
{
var query = context.SysConfigs.Where(f => !f.IsDelete).Select(f =>
new SysConfig
{
Id = f.Id,
ConfigKey = f.ConfigKey,
ConfigName = f.ConfigName,
ConfigValue = f.ConfigValue,
ConfigType = f.ConfigType,
Remark = f.Remark,
});
if (!configName.IsNullOrEmpty())
{
query = query.Where(f => f.ConfigName.StartsWith(configName));
}
if (!configName.IsNullOrEmpty())
{
query = query.Where(f => f.ConfigKey.StartsWith(configKey));
}
return query;
}
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result<SysConfigEntity> GetSysConfigDetailById(string id)
{
using (var context = new EFContext())
{
var result = new Result<SysConfigEntity>();
var detail = context.SysConfigs.Where(f => !f.IsDelete && f.Id == id).FirstOrDefault();
if (detail == null)
{
result.Message = $"没有找到Id:【{id}】的数据";
return result;
}
result.Content = detail;
return result;
}
}
/// <summary>
/// 获取获取系统参数设置明细
/// </summary>
/// <param name="name"></param>
/// <param name="key"></param>
/// <returns></returns>
public Result<SysConfigEntity> GetSysConfigDetailNameOrKey(string name, string key)
{
using (var context = new EFContext())
{
var result = new Result<SysConfigEntity>();
var detail = default(SysConfigEntity);
var query = context.SysConfigs.Where(f => !f.IsDelete);
if (!name.IsNullOrEmpty())
{
detail = query.Where(f => f.ConfigName == name).FirstOrDefault();
if (detail == null)
{
result.Message = $"没有找到ConfigName:【{name}】的数据";
return result;
}
}
if (!key.IsNullOrEmpty())
{
detail = query.Where(f => f.ConfigKey == key).FirstOrDefault();
if (detail == null)
{
result.Message = $"没有找到ConfigKey:【{key}】的数据";
return result;
}
}
result.Content = detail;
return result;
}
}
/// <summary>
/// 添加系统参数设置
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public Result AddSysConfig(SysConfigEntity entity)
{
using (var context = new EFContext())
{
var result = new Result();
var query = context.SysConfigs.Where(f => !f.IsDelete);
if (query.Where(f => f.ConfigName == entity.ConfigName).FirstOrDefault() != null)
{
result.Message = $"已存在名称为:【{entity.ConfigName}】的参数名称";
return result;
}
if (query.Where(f => f.ConfigKey == entity.ConfigKey).FirstOrDefault() != null)
{
result.Message = $"已存在编号为:【{entity.ConfigKey}】的参数键值";
return result;
}
entity.Create();
context.SysConfigs.Add(entity);
context.SaveChanges();
return result;
}
}
/// <summary>
/// 更新系统参数设置
/// </summary>
/// <param name="entity"></param>
public Result UpdateSysConfig(SysConfigEntity entity)
{
using (var context = new EFContext())
{
var result = new Result();
var query = context.SysConfigs.Where(f => !f.IsDelete);
var update = query.Where(f => f.Id == entity.Id).FirstOrDefault();
if (update == null)
{
result.Message = $"没有找到Id:【{entity.Id}】的数据";
return result;
}
if (query.Where(f => f.ConfigName == entity.ConfigName && f.Id != entity.Id).FirstOrDefault() != null)
{
result.Message = $"已存在名称为:【{entity.ConfigName}】的参数名称";
return result;
}
if (query.Where(f => f.ConfigKey == entity.ConfigKey && f.Id != entity.Id).FirstOrDefault() != null)
{
result.Message = $"已存在编号为:【{entity.ConfigKey}】的参数键值";
return result;
}
update.ConfigName = entity.ConfigName;
update.ConfigKey = entity.ConfigKey;
update.ConfigValue = entity.ConfigValue;
update.ConfigType = entity.ConfigType;
update.Remark = entity.Remark;
entity.Update();
context.SaveChanges();
return result;
}
}
/// <summary>
/// 删除系统参数设置
/// </summary>
/// <param name="id"></param>
public Result DeleteSysConfig(string id)
{
using (var context = new EFContext())
{
var result = new Result();
var entity = context.SysConfigs.Where(f => f.Id == id).FirstOrDefault();
if (entity == null)
{
result.Message = $"没有找到Id:【{id}】的数据";
return result;
}
entity.Delete();
context.SaveChanges();
return result;
}
}
}
}

@ -0,0 +1,217 @@
using AngleSharp.Dom;
using Masuit.Tools;
using Masuit.Tools.Models;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using PVDEMCS.Common;
using PVDEMCS.Common.DI;
using PVDEMCS.Services.Models;
using PVDEMCS.Services.Repositories.Entities;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace PVDEMCS.Services.Repositories
{
/// <summary>
/// 用户信息 数据层 实现
/// </summary>
internal class SysUserRepository : ISysUserRepository
{
/// <summary>
/// 获取用户信息分页列表
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="activated">是否其哟个</param>
/// <param name="page">当前页</param>
/// <param name="size">页大小</param>
/// <returns></returns>
public Result<PagedList<SysUser>> GetSysUserPageList(string userName, bool? activated, int page, int size)
{
using (var context = new EFContext())
{
var query = context.SysUsers.Where(f => !f.IsDelete).Select(f => new SysUser
{
Id = f.Id,
UserName = f.UserName,
Activated = f.Activated,
Avatar = f.Avatar,
Email = f.Email,
LoginDate = f.LoginDate,
LoginIp = f.LoginIp,
NickName = f.NickName,
Phonenumber = f.Phonenumber,
Remark = f.Remark,
Sex = f.Sex,
UserType = f.UserType,
});
if (!userName.IsNullOrEmpty())
{
query = query.Where(f => f.UserName.StartsWith(userName));
}
if (activated.HasValue)
{
query = query.Where(f => f.Activated == activated);
}
var pageList = query.ToPagedList(page, size);
return new Result<PagedList<SysUser>>(pageList);
}
}
/// <summary>
/// 获取用户明细
/// </summary>
/// <param name="id">id</param>
/// <param name="userName">名称</param>
/// <returns></returns>
public Result<SysUserEntity> GetSysUserDetail(string id, string userName)
{
var result = new Result<SysUserEntity>();
using (var context = new EFContext())
{
var query = context.SysUsers.Where(f => !f.IsDelete);
if (!id.IsNullOrEmpty())
{
query = query.Where(f => f.Id == id);
}
if (!userName.IsNullOrEmpty())
{
query = query.Where(f => f.UserName == userName);
}
var entity = query.FirstOrDefault();
if (entity.IsNullOrEmpty())
{
if (!id.IsNullOrEmpty())
{
result.Message = $"没有找到Id:【{id}】的数据";
}
if (!userName.IsNullOrEmpty())
{
result.Message = $"没有找到userName:【{userName}】的数据";
}
return result;
}
result.Content = entity;
return result;
}
}
/// <summary>
/// 添加用户
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public Result AddSysUser(SysUserEntity entity)
{
var result = new Result<SysUserEntity>();
using (var context = new EFContext())
{
var query = context.SysUsers.Where(f => !f.IsDelete);
if (query.Where(f => f.UserName == entity.UserName).FirstOrDefault() != null)
{
result.Message = $"已存在用户名为:【{entity.UserName}】的数据";
return result;
}
entity.Create();
context.SysUsers.Add(entity);
context.SaveChanges();
return result;
}
}
/// <summary>
/// 更新用户
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public Result UpdateSysUser(SysUserEntity entity)
{
var result = new Result<SysUserEntity>();
using (var context = new EFContext())
{
var query = context.SysUsers.Where(f => !f.IsDelete);
var update = query.Where(f => f.Id == entity.Id).FirstOrDefault();
if (update == null)
{
result.Message = $"没有找到Id:【{entity.Id}】的数据";
return result;
}
if (query.Where(f => f.UserName == entity.UserName && f.Id != entity.Id).FirstOrDefault() != null)
{
result.Message = $"已存在用户名为:【{entity.UserName}】的数据";
return result;
}
update.UserName = entity.UserName;
update.UserType = entity.UserType;
update.Activated = entity.Activated;
update.Avatar = entity.Avatar;
update.Email = entity.Email;
update.NickName = entity.NickName;
update.UserName = entity.UserName;
update.LoginDate = entity.LoginDate;
//update.Password = entity.Password;
update.Phonenumber = entity.Phonenumber;
update.Sex = entity.Sex;
update.Remark = entity.Remark;
update.Update();
context.SaveChanges();
return result;
}
}
/// <summary>
/// 更新用户密码
/// </summary>
/// <param name="id">用户id</param>
/// <param name="pwd">密码</param>
/// <returns></returns>
public Result UpdatePassword(string id, string pwd)
{
using (var context=new EFContext())
{
var result = new Result();
var entity = context.SysUsers.Where(f => f.Id == id).FirstOrDefault();
if (entity == null)
{
result.Message = $"没有找到Id:【{entity.Id}】的数据";
return result;
}
entity.Password= pwd;
entity.Update();
context.SaveChanges();
return result;
}
}
/// <summary>
/// 删除用户
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Result DeleteUser(string id)
{
using (var context = new EFContext())
{
var result = new Result();
var entity = context.SysUsers.Where(f => f.Id == id).FirstOrDefault();
if (entity == null)
{
result.Message = $"没有找到Id:【{id}】的数据";
return result;
}
entity.Delete();
context.SaveChanges();
return result;
}
}
}
}

@ -0,0 +1,34 @@
using Masuit.Tools;
using PVDEMCS.Common.Constant;
namespace PVDEMCS
{
public class Test
{
public static void CreateData(DateTime startDateTime, string id, Action<string, string, DateTime> action)
{
var states = new string[] { EquipmentState.Run, EquipmentState.Stop, EquipmentState.Alarm };
var random = new Random();
while (true)
{
var val1 = random.Next(states.Length);
if (val1 == states.Length)
{
val1 -= 1;
}
//state
var state = states[val1];
//当前时间
var dt = startDateTime.AddSeconds(random.Next(500, 25000));
if (dt >= DateTime.Now)
{
break;
}
action?.Invoke(id, state, dt);
startDateTime = dt;
Thread.Sleep(10);
}
}
}
}

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

@ -0,0 +1,12 @@
{
"ConnectionStrings": {
"MySqlConnection": "Server=127.0.0.1;Port=3306;Database=pvdemcs;Uid=root;Pwd=123456;pooling=true;connection lifetime=0;min pool size = 1;max pool size=500"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save