wenjy 2 days ago
commit 4010fb89e9

@ -34,7 +34,7 @@ namespace SlnMesnac.Config
public string configId { get; set; } public string configId { get; set; }
/// <summary> /// <summary>
/// 数据库类型MySql-0;SqlServer-1;Sqlite-2;Oracle-3 /// 数据库类型MySql-0;SqlServer-1;Sqlite-2;Oracle-34
/// </summary> /// </summary>
public int dbType { get; set; } public int dbType { get; set; }

@ -0,0 +1,37 @@
using System.Runtime.Serialization;
using SqlSugar;
namespace SlnMesnac.Model.domain
{
/// <summary>
/// 异常监控编码对应表
/// </summary>
[SugarTable("BaseCode"), TenantAttribute("mes")]
[DataContract(Name = "BaseCode 基础表")]
public class BaseCode
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "code")]
public string Code { get; set; }
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "state")]
public string State { get; set; }
/// <summary>
/// 1 RFid 2 视觉
///</summary>
[SugarColumn(ColumnName = "category")]
public int Category { get; set; }
}
}

@ -0,0 +1,24 @@
using System.Collections.Generic;
namespace SlnMesnac.Model.domain
{
public class Page
{
public int PageIndex { get; set; }
public int PageSize { get; set; }
public int TotalCount { get; set; }
public int TotalPage { get; set; }
public List<object> Data { get; set; }
}
public class Page<T>:Page
{
public List<T> Data { get; set; }
/// <summary>
/// 判断有没有下一页
/// </summary>
public bool HasNext => TotalPage > PageIndex;
}
}

@ -0,0 +1,29 @@
using System;
using System.Runtime.Serialization;
using SqlSugar;
namespace SlnMesnac.Model.domain
{
[SugarTable("ScanLog"), Tenant("mes")]
[DataContract(Name = "ScanLog ɨÃèÈÕÖ¾")]
public class ScanLogModel
{
/// <summary>
///
///</summary>
[SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
[SugarColumn(ColumnName = "create_time")]
public DateTime CreateTime { get; set; }
[SugarColumn(ColumnName = "data_type")]
public int DataType { get; set; }
[SugarColumn(ColumnName = "rfid")]
public string Rfid { get; set; }
[SugarColumn(ColumnName = "code")]
public string Code { get; set; }
[SugarColumn(ColumnName = "ocr")]
public string Ocr { get; set; }
[SugarColumn(ColumnName = "url")]
public string Url { get; set; }
}
}

@ -6,6 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0" />
</ItemGroup> </ItemGroup>

@ -0,0 +1,13 @@
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service.@base;
namespace SlnMesnac.Repository.service.ScanLog
{
public interface IScanLogService:IBaseService<ScanLogModel>
{
void CreatTable();
Page<ScanLogModel> QueryPage(int pageIndex, int pageSize);
}
}

@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service.@base;
namespace SlnMesnac.Repository.service.ScanLog
{
public class ScanLogServiceImpl:BaseServiceImpl<ScanLogModel>,IScanLogService
{
public ScanLogServiceImpl(Repository<ScanLogModel> rep) : base(rep)
{
}
public void CreatTable()
{
_rep.Context.CodeFirst.InitTables<ScanLogModel>();
List<ScanLogModel> ls = new List<ScanLogModel>();
for (int i = 0; i < 100; i++)
{
ls.Add(new ScanLogModel()
{
CreateTime = DateTime.Now,
DataType = 1,
Rfid = "12",
Code = "21",
Ocr = "2",
Url="badi.com"
});
}
this.Insert(ls);
}
public Page<ScanLogModel> QueryPage(int pageIndex, int pageSize)
{
int totalCount = 0;
var list= _rep.Context.Queryable<ScanLogModel>().OrderByDescending(x => x.CreateTime)
.ToPageList(pageIndex, pageSize, ref totalCount);
Page<ScanLogModel> page = new Page<ScanLogModel>();
page.Data=list;
page.PageIndex = pageIndex;
page.PageSize = pageSize;
page.TotalCount = totalCount;
page.TotalPage = (int)Math.Ceiling(totalCount / (double)pageSize);
return page;
}
}
}

@ -0,0 +1,48 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Caching.Memory;
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service.@base;
namespace SlnMesnac.Repository.service
{
public class BaseCodeServiceImpl:BaseServiceImpl<BaseCode>,IBaseCodeService
{
private readonly IMemoryCache _memoryCache;
public BaseCodeServiceImpl(Repository<BaseCode> rep, IMemoryCache memoryCache) : base(rep)
{
_memoryCache = memoryCache;
}
public void CreateBaseCode()
{
_rep.Context.CodeFirst.InitTables(typeof(BaseCode));
}
public List<BaseCode> QuListCache()
{
string key = "QuListCache";
if (_memoryCache.TryGetValue<List<BaseCode>>(key, out var list))
{
return list;
}
var entity = Query();
_memoryCache.Set(key, entity, TimeSpan.FromMinutes(5));
return entity;
}
/// <summary>
/// 根据Code去查询单个数据
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public BaseCode QueryCode(string code)
{
return Query(x => x.Code == code).First();
}
}
}

@ -0,0 +1,13 @@
using System.Collections.Generic;
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service.@base;
namespace SlnMesnac.Repository.service
{
public interface IBaseCodeService:IBaseService<BaseCode>
{
void CreateBaseCode();
List<BaseCode> QuListCache();
BaseCode QueryCode(string code);
}
}

@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service;
using SlnMesnac.Repository.service.ScanLog;
using TouchSocket.Core;
using TouchSocket.Rpc;
using TouchSocket.WebApi;
namespace SlnMesnac.TouchSocket
{
public class ApiServer : RpcServer
{
private readonly IScanLogService _scanService;
private readonly IBaseCodeService _baseCodeService;
public Action<ScanLogSocket>? ScanLogSocketAction;
public Action<ScanStatusSocket>? ScanStatusSocketAction;
public ApiServer(IScanLogService scanService, IBaseCodeService baseCodeService)
{
_scanService = scanService;
_baseCodeService = baseCodeService;
}
/// <summary>
/// 扫描的状态回传
/// </summary>
/// <param name="messageHeader"></param>
/// <param name="containerRegisterQuery"></param>
/// <returns></returns>
[EnableCors("cors")]
[WebApi(HttpMethodType.POST)]
public Back ScanStatus(ScanStatusSocket scanStatus)
{
if (scanStatus.is_alarm == 1 && scanStatus.device_status != null && scanStatus.device_status.Count > 0)
{
List<string> ls = new List<string>();
var baseCodes = _baseCodeService.QuListCache();
foreach (var baseCode in scanStatus.device_status)
{
var enBaseCode = baseCodes.FirstOrDefault(x=>x.Code==baseCode);
if (enBaseCode != null)
{
ls.Add(enBaseCode.State);
}
}
scanStatus.status_txt = ls;
}
ScanStatusSocketAction?.Invoke(scanStatus);
return new Back();
}
/// <summary>
/// 入库开始
/// </summary>
/// <param name="messageHeader"></param>
/// <param name="containerRegisterQuery"></param>
/// <returns></returns>
[EnableCors("cors")]
[WebApi(HttpMethodType.POST)]
public Back ScanBack(ScanLogSocket scanStatus)
{
ScanLogSocketAction?.Invoke(scanStatus);
_scanService.Insert(new ScanLogModel()
{
CreateTime = scanStatus.CreateTime,
DataType = scanStatus.data_type,
Code = scanStatus.code,
Rfid = scanStatus.rfid,
Ocr = scanStatus.ocr,
Url = scanStatus.url
});
return new Back();
}
}
}

@ -0,0 +1,13 @@
using System;
namespace SlnMesnac.TouchSocket
{
public class Back
{
public int Code { get; set; } =200;
public string msg { get; set; } = "操作成功";
public string timestamp { get; set; } = DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString();
}
}

@ -0,0 +1,30 @@
using System;
public class ScanLogSocket
{
/// <summary>
///
///</summary>
public DateTime CreateTime
{
get
{
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp);
return dateTimeOffset.UtcDateTime;
}
}
public long timestamp { get; set; }
public int data_type { get; set; }
public string rfid { get; set; }
public string code { get; set; }
public string ocr { get; set; }
public string url { get; set; }
}

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
public class ScanStatusSocket
{
public DateTime CreateTime
{
get
{
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp);
return dateTimeOffset.UtcDateTime;
}
}
public long timestamp { get; set; }
public int data_type { get; set; }
public int is_alarm { get; set; }
public List<string> device_status { get; set; }
public List<string> status_txt { get; set; }
}

@ -12,6 +12,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\SlnMesnac.Repository\SlnMesnac.Repository.csproj" />
<ProjectReference Include="..\SlnMesnac.Serilog\SlnMesnac.Serilog.csproj" /> <ProjectReference Include="..\SlnMesnac.Serilog\SlnMesnac.Serilog.csproj" />
</ItemGroup> </ItemGroup>

@ -1,10 +1,16 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Text;
using Newtonsoft.Json.Linq;
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service;
using SlnMesnac.Repository.service.ScanLog;
using TouchSocket.Core; using TouchSocket.Core;
using TouchSocket.Sockets; using TouchSocket.Sockets;
#region << 版 本 注 释 >> #region << 版 本 注 释 >>
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
* (c) 2024 WenJY * (c) 2024 WenJY
@ -29,23 +35,37 @@ using TouchSocket.Sockets;
#endregion << 版 本 注 释 >> #endregion << 版 本 注 释 >>
namespace SlnMesnac.TouchSocket namespace SlnMesnac.TouchSocket
{ {
public class TcpServer public class TcpServer
{ {
private ILogger<TcpServer> _logger; private ILogger<TcpServer> _logger;
private readonly TcpService _service; private readonly TcpService _service;
/// <summary>
/// 接收客户端指令委托
/// </summary>
public delegate void ReceivedClientBuffer(byte[] buffer);
public event ReceivedClientBuffer? ReceivedClientBufferEvent;
public delegate void RefreshClientInfo(TcpService tcpService); private readonly IScanLogService _scanService;
public event RefreshClientInfo? RefreshClientInfoEvent;
private readonly IBaseCodeService _baseCodeService;
// /// <summary>
// /// 接收客户端指令委托
// /// </summary>
// public delegate void ReceivedClientBuffer(byte[] buffer);
// public event ReceivedClientBuffer? ReceivedClientBufferEvent;
//
// public delegate void RefreshClientInfo(TcpService tcpService);
// public event RefreshClientInfo? RefreshClientInfoEvent;
public TcpServer(ILogger<TcpServer> logger,TcpService tcpService)
public Action<ScanLogSocket>? ScanLogSocketAction;
public Action<ScanStatusSocket>? ScanStatusSocketAction;
public TcpServer(ILogger<TcpServer> logger,TcpService tcpService, IScanLogService scan, IBaseCodeService baseCodeService)
{ {
_logger = logger; _logger = logger;
_service = tcpService; _service = tcpService;
_scanService = scan;
_baseCodeService = baseCodeService;
} }
public void Init(int serverPort) public void Init(int serverPort)
@ -53,28 +73,84 @@ namespace SlnMesnac.TouchSocket
try try
{ {
_service.Connecting = (client, e) => { _service.Connecting = (client, e) => {
_logger.LogInformation($"客户端{client.IP}正在接入服务"); _logger.LogInformation("客户端{ClientIp}正在接入服务", client.IP);
return EasyTask.CompletedTask; return EasyTask.CompletedTask;
}; };
_service.Connected = (client, e) => { _service.Connected = (client, e) => {
_logger.LogInformation($"客户端{client.IP}接入服务成功"); _logger.LogInformation("客户端{ClientIp}接入服务成功", client.IP);
RefreshClientInfoEvent?.Invoke(_service); // RefreshClientInfoEvent?.Invoke(_service);
return EasyTask.CompletedTask; return EasyTask.CompletedTask;
}; };
_service.Disconnected = (client, e) => { _service.Disconnected = (client, e) => {
_logger.LogInformation($"客户端{client.IP}断开连接"); _logger.LogInformation("客户端{ClientIp}断开连接", client.IP);
RefreshClientInfoEvent?.Invoke(_service); // RefreshClientInfoEvent?.Invoke(_service);
return EasyTask.CompletedTask; return EasyTask.CompletedTask;
}; };
_service.Received = (client, e) => _service.Received = (client, e) =>
{ {
//从客户端收到信息
try
{
var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);//注意数据长度是byteBlock.Len var mes = Encoding.UTF8.GetString(e.ByteBlock.Buffer, 0, e.ByteBlock.Len);//注意数据长度是byteBlock.Len
_logger.LogInformation("收到数据:{Data}",mes);
// byte[] receivedBuffer = new byte[e.ByteBlock.Len];
// Array.Copy(e.ByteBlock.Buffer, 0, receivedBuffer, 0, e.ByteBlock.Len);
// ReceivedClientBufferEvent?.Invoke(receivedBuffer);
int dataType = 0;
var jObject = JObject.Parse(mes);
if (jObject.TryGetValue("data_type", out var value))
{
dataType=value.Value<int>();
}
if (dataType == 1)
{
ScanLogSocket scanStatus= mes.FromJsonString<ScanLogSocket>();
ScanLogSocketAction?.Invoke(scanStatus);
_scanService.Insert(new ScanLogModel()
{
CreateTime = scanStatus.CreateTime,
DataType = scanStatus.data_type,
Code = scanStatus.code,
Rfid = scanStatus.rfid,
Ocr = scanStatus.ocr,
Url = scanStatus.url
});
byte[] receivedBuffer = new byte[e.ByteBlock.Len];
Array.Copy(e.ByteBlock.Buffer, 0, receivedBuffer, 0, e.ByteBlock.Len);
ReceivedClientBufferEvent?.Invoke(receivedBuffer);
}
else
{
if (dataType == 2)
{
ScanStatusSocket scanStatus = mes.FromJsonString<ScanStatusSocket>();
ScanStatusSocketAction?.Invoke(scanStatus);
if (scanStatus.is_alarm == 1 && scanStatus.device_status != null && scanStatus.device_status.Count > 0)
{
List<string> ls = new List<string>();
var baseCodes = _baseCodeService.QuListCache();
foreach (var baseCode in scanStatus.device_status)
{
var enBaseCode = baseCodes.FirstOrDefault(x=>x.Code==baseCode);
if (enBaseCode != null)
{
ls.Add(enBaseCode.State);
}
}
scanStatus.status_txt = ls;
}
}
}
client.SendAsync(new Back().ToJsonString());
}
catch (Exception exception)
{
_logger.LogError(exception,exception.Message);
}
return EasyTask.CompletedTask; return EasyTask.CompletedTask;
}; };

@ -37,8 +37,8 @@ namespace SlnMesnac.TouchSocket
public static IApplicationBuilder UseTouchSocketExtensions(this IApplicationBuilder app) public static IApplicationBuilder UseTouchSocketExtensions(this IApplicationBuilder app)
{ {
var _server = app.ApplicationServices.GetService<TcpServer>(); var _server = app.ApplicationServices.GetService<WebApiServerApp>();
_server.Init(20108); _server.Init();
return app; return app;
} }

@ -0,0 +1,79 @@
using Microsoft.AspNetCore.Hosting.Server;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Http;
using TouchSocket.Rpc;
using TouchSocket.Sockets;
using TouchSocket.WebApi.Swagger;
namespace SlnMesnac.TouchSocket
{
public class WebApiServerApp
{
private ApiServer apiServer;
public WebApiServerApp(ApiServer apiServer)
{
this.apiServer = apiServer;
}
public void Init()
{
try
{
var service = new HttpService();
service.Setup(new TouchSocketConfig()
.SetListenIPHosts(7789)
.ConfigureContainer(a =>
{
a.AddRpcStore(store =>
{
store.RegisterServer<ApiServer>(apiServer);//注册服务
});
a.AddCors(corsOption =>
{
corsOption.Add("cors", corsBuilder =>
{
corsBuilder.AllowAnyMethod()
.AllowAnyOrigin();
});
});
a.AddLogger(logger =>
{
logger.AddConsoleLogger();
logger.AddFileLogger();
});
})
.ConfigurePlugins(a =>
{
a.UseCheckClear();
a.UseWebApi()
.ConfigureConverter(converter =>
{
converter.AddJsonSerializerFormatter(new Newtonsoft.Json.JsonSerializerSettings() { Formatting = Newtonsoft.Json.Formatting.None });
});
a.UseSwagger();//使用Swagger页面
//.UseLaunchBrowser();
a.UseDefaultHttpServicePlugin();
}));
service.Start();
Console.WriteLine("以下连接用于测试webApi");
Console.WriteLine($"使用http://127.0.0.1:7789/swagger/index.html");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
//Console.ReadLine();
}
}
}

@ -26,7 +26,7 @@ namespace SlnMesnac.WPF
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
services.AddControllers(); services.AddControllers();
services.AddMemoryCache();
//注册AppConfig //注册AppConfig
services.AddSingleton<AppConfig>(provider => services.AddSingleton<AppConfig>(provider =>
{ {

@ -78,7 +78,9 @@ namespace SlnMesnac.WPF.ViewModel
public MainWindowViewModel() public MainWindowViewModel()
{ {
_logger = App.ServiceProvider.GetService<ILogger<MainWindowViewModel>>(); var sp = App.ServiceProvider;
_logger = App.ServiceProvider.GetService<ILogger<MainWindowViewModel>>();
ControlOnClickCommand = new RelayCommand<object>(obj => ControlOnClick(obj)); ControlOnClickCommand = new RelayCommand<object>(obj => ControlOnClick(obj));
FormControlCommand = new RelayCommand<object>(x => FormControl(x)); FormControlCommand = new RelayCommand<object>(x => FormControl(x));

@ -12,13 +12,8 @@
"SqlConfig": [ "SqlConfig": [
{ {
"configId": "mes", "configId": "mes",
"dbType": 1, "dbType": 4,
"connStr": "server=.;uid=sa;pwd=123456;database=JiangYinMENS" "connStr": "PORT=5433;DATABASE=daxing;HOST=127.0.0.1;PASSWORD=123456;USER ID=postgres"
},
{
"configId": "mcs",
"dbType": 3,
"connStr": "Data Source=175.27.215.92/helowin;User ID=aucma_scada;Password=aucma"
} }
], ],
"PlcConfig": [ "PlcConfig": [

Loading…
Cancel
Save