diff --git a/ReadService/Program.cs b/ReadService/Program.cs
new file mode 100644
index 0000000..343061c
--- /dev/null
+++ b/ReadService/Program.cs
@@ -0,0 +1,38 @@
+using Autofac.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Serilog;
+namespace ReadService
+{
+ public class Program
+ {
+
+ static void Main(string[] args)
+ {
+ var host = CreateHostBuilder(args).Build();
+ host.Run();
+
+ //ReadBusiness.ListenRead();
+ }
+
+
+ ///
+ /// CreateHostBuilder
+ ///
+ ///
+ ///
+ public static IHostBuilder CreateHostBuilder(string[] args) =>
+ Host.CreateDefaultBuilder(args)
+ .UseSerilog()
+ .UseServiceProviderFactory(new AutofacServiceProviderFactory())
+ .ConfigureServices((hostContext, services) =>
+ {
+ services.AddHostedService();
+ })
+ .ConfigureWebHostDefaults(webBuilder =>
+ {
+ webBuilder.UseStartup();
+ });
+ }
+}
\ No newline at end of file
diff --git a/ReadService/ReadBusiness.cs b/ReadService/ReadBusiness.cs
new file mode 100644
index 0000000..095cf8b
--- /dev/null
+++ b/ReadService/ReadBusiness.cs
@@ -0,0 +1,83 @@
+using Microsoft.Extensions.Hosting;
+using Serilog;
+using SlnMesnac.Common;
+using SlnMesnac.Model.domain;
+using SlnMesnac.Repository.service;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace ReadService
+{
+ public class ReadBusiness : IHostedService
+ {
+
+ private IMesProductReadInfoService _mesProductReadInfoService;
+
+
+ public ReadBusiness(IMesProductReadInfoService mesProductReadInfoService)
+ {
+ _mesProductReadInfoService = mesProductReadInfoService;
+ }
+
+
+ public Task StartAsync(CancellationToken cancellationToken)
+ {
+ // 启动你的监听逻辑
+ ListenRead();
+ return Task.CompletedTask;
+ }
+
+ public Task StopAsync(CancellationToken cancellationToken)
+ {
+ // 对于清理工作,可以在这里实现
+ return Task.CompletedTask;
+ }
+
+
+
+ public void ListenRead()
+ {
+ SpeechStr.Instance.Speak("开始监听朗读业务");
+ Console.WriteLine("开始监听朗读业务");
+ Task.Run(() =>
+ {
+
+ while (true)
+ {
+ try
+ {
+ // Log.Information("读取业务");
+ MesProductReadInfo? mesProductReadInfo = _mesProductReadInfoService.Query(x => x.UseFlag == 1 && x.ReadStatus != 2).OrderBy(x => x.ReadId).FirstOrDefault();
+ if (mesProductReadInfo != null)
+ {
+ Log.Information($"总次数:{mesProductReadInfo.ReadTotal} 朗读第次数{mesProductReadInfo.ReadCount} 开始朗读:====>{mesProductReadInfo.ReadInfo}");
+ SpeechStr.Instance.Speak(mesProductReadInfo.ReadInfo);
+ mesProductReadInfo.ReadCount++;
+ mesProductReadInfo.ReadStatus = 1;
+ mesProductReadInfo.UpdateTime = DateTime.Now;
+ if (mesProductReadInfo.ReadCount >= mesProductReadInfo.ReadTotal)
+ {
+ mesProductReadInfo.ReadStatus = 2;
+ mesProductReadInfo.EndTime = DateTime.Now;
+ }
+ _mesProductReadInfoService.Update(mesProductReadInfo);
+ Thread.Sleep(1500);
+ }
+ else
+ {
+ Thread.Sleep(1000 * 10);
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex.Message);
+ }
+ }
+ });
+ }
+
+ }
+}
diff --git a/ReadService/ReadService.csproj b/ReadService/ReadService.csproj
new file mode 100644
index 0000000..e702a31
--- /dev/null
+++ b/ReadService/ReadService.csproj
@@ -0,0 +1,39 @@
+
+
+
+ Exe
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ReadService/Startup.cs b/ReadService/Startup.cs
new file mode 100644
index 0000000..752a072
--- /dev/null
+++ b/ReadService/Startup.cs
@@ -0,0 +1,109 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using SlnMesnac.Config;
+using SlnMesnac.Serilog;
+using System;
+using Autofac;
+using Microsoft.Extensions.Configuration;
+using SlnMesnac.Ioc;
+using SlnMesnac.Extensions;
+using SlnMesnac.Generate;
+using SlnMesnac.TouchSocket;
+
+#region << 版 本 注 释 >>
+/*--------------------------------------------------------------------
+* 版权所有 (c) 2024 WenJY 保留所有权利。
+* CLR版本:4.0.30319.42000
+* 机器名称:LAPTOP-E0N2L34V
+* 命名空间:ConsoleApp
+* 唯一标识:04133b44-1390-4f6a-aaef-88f4127d88f0
+*
+* 创建者:WenJY
+* 电子邮箱:wenjy@mesnac.com
+* 创建时间:2024-04-23 18:06:27
+* 版本:V1.0.0
+* 描述:
+*
+*--------------------------------------------------------------------
+* 修改人:
+* 时间:
+* 修改说明:
+*
+* 版本:V1.0.0
+*--------------------------------------------------------------------*/
+#endregion << 版 本 注 释 >>
+namespace ConsoleApp
+{
+ ///
+ ///
+ ///
+ public class Startup
+ {
+ ///
+ ///
+ ///
+ ///
+ public Startup(IConfiguration configuration)
+ {
+ Configuration = configuration;
+ }
+
+ ///
+ ///
+ ///
+ public IConfiguration Configuration { get; }
+
+ ///
+ /// This method gets called by the runtime. Use this method to add services to the container.
+ ///
+ ///
+ [Obsolete]
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddControllers();
+
+
+ //注册AppConfig
+ services.AddSingleton(provider =>
+ {
+ var configuration = provider.GetService();
+ return configuration.GetSection("AppConfig").Get();
+
+ });
+
+ //注册ORM
+ services.AddSqlSugarSetup();
+
+ //// 注册 ElectricBusiness
+ //services.AddScoped();
+
+ }
+
+ ///
+ /// AutoFac自动注入
+ ///
+ ///
+ public void ConfigureContainer(ContainerBuilder builder)
+ {
+ DependencyConfigurator.Configure(builder);
+ }
+
+ ///
+ /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
+ ///
+ ///
+ ///
+ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+ {
+
+ //启用Serilog中间件
+ app.UseSerilogExtensions();
+
+
+
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/ReadService/appsettings.json b/ReadService/appsettings.json
new file mode 100644
index 0000000..16cfa9b
--- /dev/null
+++ b/ReadService/appsettings.json
@@ -0,0 +1,77 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "AllowedHosts": "*",
+ "AppConfig": {
+ "logPath": "E:\\c#\\京源环保\\程序设计\\生产控制\\SlnMesnac\\SlnMesnac.WPF\\bin\\Debug\\net6.0-windows",
+ "stationId": 11,
+ "SqlConfig": [
+ {
+ "configId": "mes",
+ "dbType": 0,
+ // "connStr": "Data Source=175.27.215.92;Port=3306;Initial Catalog=hwjy-cloud;uid=root;pwd=haiwei@123;Charset=utf8mb4;SslMode=none"
+ "connStr": "Data Source=172.16.12.100;Port=3306;Initial Catalog=hwjy-cloud;uid=root;pwd=JyhbRk@123456;Charset=utf8mb4;SslMode=none"
+ }
+ //{
+ // "configId": "local",
+ // "dbType": 2,
+ // "connStr": "DataSource=E:\\c#\\京源环保\\程序设计\\生产控制\\SlnMesnac\\SlnMesnac.WPF\\bin\\Debug\\net6.0-windows\\data\\data.db"
+ //}
+ //{
+ // "configId": "mesTD",
+ // "dbType": 17,
+ // "connStr": "Host=175.27.215.92;Port=6030;Username=root;Password=taosdata;Database=db_hwmes"
+ //},
+
+ //{
+ // "configId": "scada",
+ // "dbType": 0,
+ // "connStr": "Data Source=175.27.215.92;Port=3306;Initial Catalog=jy-scada;uid=root;pwd=haiwei@123;Charset=utf8mb4;SslMode=none"
+ //}
+ ],
+ "PlcConfig": [
+ {
+ "configId": 1,
+ "plcType": "SiemensPlc",
+ "plcIp": "192.168.2.220",
+ // "plcIp": "127.0.0.1",
+ "plcPort": 102,
+ "plcKey": "plc",
+ "isFlage": true
+ },
+ {
+ "configId": 2, //MES信号处理
+ "plcType": "SiemensPlc",
+ "plcIp": "127.0.0.1",
+ "plcPort": 103,
+ "plcKey": "mesSingal",
+ "isFlage": false
+ }
+ ],
+ "RfidConfig": [
+ {
+ // 小包码垛位RFID
+ "configId": 1,
+ "equipIp": "192.168.2.27",
+ "equipPort": 20108,
+ "equipKey": "secondFloorPallet",
+ "isFlage": true
+ },
+ {
+ // 小包出口位RFID
+ "configId": 2,
+ "equipIp": "192.168.2.28",
+ "equipPort": 20108,
+ "equipKey": "secondFloorOut",
+ "isFlage": true
+ }
+ ]
+ //"redisConfig": "175.27.215.92:6379,password=redis@2023"
+
+ }
+}
diff --git a/SlnMesnac.Common/SlnMesnac.Common.csproj b/SlnMesnac.Common/SlnMesnac.Common.csproj
index 1b54830..cabb13c 100644
--- a/SlnMesnac.Common/SlnMesnac.Common.csproj
+++ b/SlnMesnac.Common/SlnMesnac.Common.csproj
@@ -11,6 +11,7 @@
+
diff --git a/SlnMesnac.Common/SpeechStr.cs b/SlnMesnac.Common/SpeechStr.cs
new file mode 100644
index 0000000..419ced2
--- /dev/null
+++ b/SlnMesnac.Common/SpeechStr.cs
@@ -0,0 +1,65 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Speech.Synthesis;
+using System.Text;
+using System.Threading.Tasks;
+
+
+namespace SlnMesnac.Common
+{
+ public class SpeechStr
+ {
+ private static readonly Lazy lazy = new Lazy(() => new SpeechStr());
+ private readonly SpeechSynthesizer synthesizer;
+
+
+ public static SpeechStr Instance
+ {
+ get
+ {
+ return lazy.Value;
+ }
+ }
+
+
+ public SpeechStr()
+ {
+ synthesizer = new SpeechSynthesizer();
+ // 可选:配置语音合成器
+ synthesizer.Rate = 1; // 设置语速
+ synthesizer.Volume = 100; // 设置音量
+ }
+
+ // 异步播放文本的方法
+ public async Task SpeakAsync(string text)
+ {
+ if (string.IsNullOrEmpty(text))
+ {
+ throw new ArgumentException("Text cannot be null or empty.", nameof(text));
+ }
+
+ await Task.Run(() => synthesizer.SpeakAsync(text));
+ }
+
+ // 同步播放文本的方法
+ public void Speak(string text)
+ {
+ if (string.IsNullOrEmpty(text))
+ {
+ throw new ArgumentException("Text cannot be null or empty.", nameof(text));
+ }
+
+ synthesizer.Speak(text);
+ }
+
+ public void StopSpeaking()
+ {
+ synthesizer.SpeakAsyncCancelAll();
+ }
+ }
+
+
+
+}
diff --git a/SlnMesnac.Model/domain/MesProductReadInfo.cs b/SlnMesnac.Model/domain/MesProductReadInfo.cs
new file mode 100644
index 0000000..1f83c24
--- /dev/null
+++ b/SlnMesnac.Model/domain/MesProductReadInfo.cs
@@ -0,0 +1,69 @@
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Security.Principal;
+using System.Text;
+
+namespace SlnMesnac.Model.domain
+{
+ ///
+ /// 待朗读信息信息
+ ///
+ [SugarTable("mes_product_read_info"), TenantAttribute("mes")]
+ public class MesProductReadInfo
+ {
+ ///
+ /// 主键ID
+ ///
+ [SugarColumn(ColumnName = "read_id", IsPrimaryKey = true, IsIdentity = true)]
+ public long ReadId { get; set; }
+
+ ///
+ /// 待朗读信息
+ ///
+ [SugarColumn(ColumnName = "read_info")]
+ public string ReadInfo { get; set; }
+
+ ///
+ /// 可用标志:0-不可用,1-可朗读
+ ///
+ [SugarColumn(ColumnName = "use_flag")]
+ public int? UseFlag { get; set; }
+
+ ///
+ /// 朗读总次数
+ ///
+ [SugarColumn(ColumnName = "read_total")]
+ public int ReadTotal { get; set; }
+
+ ///
+ /// 已朗读次数
+ ///
+ [SugarColumn(ColumnName = "read_count")]
+ public int? ReadCount { get; set; }
+
+ ///
+ /// 朗读状态:0-未开始;1-朗读中;2-朗读结束
+ ///
+ [SugarColumn(ColumnName = "read_status")]
+ public int? ReadStatus { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ [SugarColumn(ColumnName = "creat_time")]
+ public DateTime? CreatTime { get; set; } // datetime 对应 DateTime?
+
+ ///
+ /// 更新时间
+ ///
+ [SugarColumn(ColumnName = "update_time")]
+ public DateTime? UpdateTime { get; set; } // datetime 对应 DateTime?
+
+ ///
+ /// 朗读结束时间
+ ///
+ [SugarColumn(ColumnName = "end_time")]
+ public DateTime? EndTime { get; set; } // datetime 对应 DateTime
+ }
+}
diff --git a/SlnMesnac.Repository/service/IMesProductReadInfoService.cs b/SlnMesnac.Repository/service/IMesProductReadInfoService.cs
new file mode 100644
index 0000000..89232f2
--- /dev/null
+++ b/SlnMesnac.Repository/service/IMesProductReadInfoService.cs
@@ -0,0 +1,13 @@
+using SlnMesnac.Model.domain;
+using SlnMesnac.Repository.service.@base;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace SlnMesnac.Repository.service
+{
+ public interface IMesProductReadInfoService : IBaseService
+ {
+
+ }
+}
diff --git a/SlnMesnac.Repository/service/Impl/MesProductReadInfoServiceImpl.cs b/SlnMesnac.Repository/service/Impl/MesProductReadInfoServiceImpl.cs
new file mode 100644
index 0000000..e94133f
--- /dev/null
+++ b/SlnMesnac.Repository/service/Impl/MesProductReadInfoServiceImpl.cs
@@ -0,0 +1,42 @@
+using Microsoft.Extensions.DependencyInjection;
+using SlnMesnac.Model.domain;
+using SlnMesnac.Repository.service.@base;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+#region << 版 本 注 释 >>
+/*--------------------------------------------------------------------
+* 版权所有 (c) 2024 WenJY 保留所有权利。
+* CLR版本:4.0.30319.42000
+* 机器名称:LAPTOP-E0N2L34V
+* 命名空间:SlnMesnac.Repository.service.Impl
+* 唯一标识:052967bb-62b3-4a80-b2b9-135493fa7a73
+*
+* 创建者:WenJY
+* 电子邮箱:wenjy@mesnac.com
+* 创建时间:2024-04-10 16:46:27
+* 版本:V1.0.0
+* 描述:
+*
+*--------------------------------------------------------------------
+* 修改人:
+* 时间:
+* 修改说明:
+*
+* 版本:V1.0.0
+*--------------------------------------------------------------------*/
+#endregion << 版 本 注 释 >>
+namespace SlnMesnac.Repository.service.Impl
+{
+ public class MesProductReadInfoServiceImpl : BaseServiceImpl, IMesProductReadInfoService
+ {
+ private IServiceProvider _serviceProvider;
+ public MesProductReadInfoServiceImpl(Repository rep, IServiceProvider serviceProvider) : base(rep)
+ {
+ _serviceProvider = serviceProvider;
+ }
+
+ }
+}
diff --git a/SlnMesnac.sln b/SlnMesnac.sln
index 6fe744e..0f719af 100644
--- a/SlnMesnac.sln
+++ b/SlnMesnac.sln
@@ -33,6 +33,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SlnMesnac.Extensions", "Sln
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SlnMesnac.Generate", "SlnMesnac.Generate\SlnMesnac.Generate.csproj", "{DD53E273-786B-4947-8CF0-B7C472E10B8D}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Other", "Other", "{30102E9A-38CE-4BD6-AA98-98498DE35329}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReadService", "ReadService\ReadService.csproj", "{19FF8FA9-3FC6-4755-9468-4B66D9D6A7EC}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -99,10 +103,17 @@ Global
{DD53E273-786B-4947-8CF0-B7C472E10B8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DD53E273-786B-4947-8CF0-B7C472E10B8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DD53E273-786B-4947-8CF0-B7C472E10B8D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {19FF8FA9-3FC6-4755-9468-4B66D9D6A7EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {19FF8FA9-3FC6-4755-9468-4B66D9D6A7EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {19FF8FA9-3FC6-4755-9468-4B66D9D6A7EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {19FF8FA9-3FC6-4755-9468-4B66D9D6A7EC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {19FF8FA9-3FC6-4755-9468-4B66D9D6A7EC} = {30102E9A-38CE-4BD6-AA98-98498DE35329}
+ EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D414D640-C2DE-44E2-930E-DD095881CDC1}
EndGlobalSection