Quellcode durchsuchen

任务消息推送

leiy vor 1 Jahr
Ursprung
Commit
012a957c36

+ 10 - 5
OASystem/OASystem.Api/Controllers/AuthController.cs

@@ -14,6 +14,7 @@ using OASystem.Domain.Dtos.QiYeWeChat;
 using OASystem.Domain.Entities.System;
 using TinyPinyin;
 using System.Globalization;
+using OASystem.API.OAMethodLib.Hubs;
 
 namespace OASystem.API.Controllers
 {
@@ -32,7 +33,7 @@ namespace OASystem.API.Controllers
         private readonly IQiYeWeChatApiService _qiYeWeChatApiServic;
 
         public AuthController(IConfiguration config, LoginRepository loginRep, IMapper mapper,MessageRepository message,
-            SystemMenuPermissionRepository systemMenuPermissionRepository, IQiYeWeChatApiService qiYeWeChatApiService)
+            SystemMenuPermissionRepository systemMenuPermissionRepository, IQiYeWeChatApiService qiYeWeChatApiService, MessageHub msgHub)
         {
             _config = config;
             _loginRep = loginRep;
@@ -62,12 +63,16 @@ namespace OASystem.API.Controllers
 
             #endregion
             Result authData = null;
+            string uName = string.Empty;
+            int uId = 0;
             if (userData.Data != null)
             {
-                var uid = (userData.Data as UserLoginInfoView).UserId;
-                authData = _SystemMenuPermissionRepository.QueryMenuLoad(uid, dto.PortType);
+                uId = (userData.Data as UserLoginInfoView).UserId;
+                uName = (userData.Data as UserLoginInfoView).CnName;
+                authData = _SystemMenuPermissionRepository.QueryMenuLoad(uId, dto.PortType);
             }
 
+
             var view = new LoginView
             {
                 UserInfo = userData == null ? null : userData.Data,
@@ -87,7 +92,7 @@ namespace OASystem.API.Controllers
 
                 if (expDt >= createZebraTime)  //超时重新获取token
                 {
-                    authorToken = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
+                    authorToken = GeneralMethod.GetToken(_config, dto.Number, uId,uName, createZebraTime);
                 }
 
                 view.Expires = expDt;
@@ -97,7 +102,7 @@ namespace OASystem.API.Controllers
             else
             {
                 view.Expires = createZebraTime.AddMinutes(30);
-                view.Token = GeneralMethod.GetToken(_config, dto.Number, createZebraTime);
+                view.Token = GeneralMethod.GetToken(_config, dto.Number, uId, uName, createZebraTime);
                 TimeSpan ts = view.Expires.AddMinutes(-1) - createZebraTime; //设置redis 过期时间 比 jwt 时间 快一分钟
                 await RedisRepository.RedisFactory.CreateRedisRepository().StringSetAsync<string>(authorId, view.Token, ts);//string 存
 

+ 8 - 5
OASystem/OASystem.Api/OAMethodLib/GeneralMethod.cs

@@ -86,10 +86,13 @@ namespace OASystem.API.OAMethodLib
         /// <param name="Number"></param>
         /// <param name="exp"></param>
         /// <returns></returns>
-        public static string GetToken(IConfiguration _config,string Number,DateTime exp) 
+        public static string GetToken(IConfiguration _config, string Number, int uId, string uName, DateTime exp)
         {
+            string userId = Guid.NewGuid().ToString().Replace("-", "");
             var claims = new[] {
-                new Claim(ClaimTypes.NameIdentifier, "Future"),
+                new Claim(ClaimTypes.NameIdentifier, uName),
+                new Claim(ClaimTypes.NameIdentifier, uId.ToString()),
+                new Claim(ClaimTypes.NameIdentifier, userId),
                 new Claim("Number",Number)
             };
             var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["JwtSecurityKey"]));
@@ -100,9 +103,9 @@ namespace OASystem.API.OAMethodLib
                 claims: claims,
                 expires: exp,
                 signingCredentials: creds);
-           
-            
-            return   new JwtSecurityTokenHandler().WriteToken(token);
+
+
+            return new JwtSecurityTokenHandler().WriteToken(token);
 
         }
 

+ 95 - 0
OASystem/OASystem.Api/OAMethodLib/Hubs/MessageHub.cs

@@ -0,0 +1,95 @@
+using Microsoft.AspNetCore.Cors;
+using Microsoft.AspNetCore.SignalR;
+using System.ComponentModel.DataAnnotations;
+
+namespace OASystem.API.OAMethodLib.Hubs
+{
+    /// <summary>
+    /// 站内通信 Hub
+    /// </summary>
+    public class MessageHub : Hub
+    {
+        private readonly ILogger<MessageHub> _logger;
+
+        public static List<HubUser> _userList = new List<HubUser> { };
+        public MessageHub(ILogger<MessageHub> logger)
+        {
+            _logger = logger;
+        }
+
+
+        //发送消息--发送给所有连接的客户端
+        public Task SendMessage(string msg)
+        {
+            return Clients.All.SendAsync("ReceiveMessage", msg);
+        }
+        //发送消息--发送给指定用户
+        public Task SendPrivateMessage(string connectionId, string message)
+        {
+            return Clients.Client(connectionId).SendAsync("ReceiveMessage", message);
+        }
+
+
+
+        /// <summary>
+        /// 登录功能,将用户ID和ConntectionId关联起来
+        /// </summary>
+        /// <param name="userId"></param>
+        public void Login(int userId,string userName)
+        {
+            try
+            {
+                HubUser hu = _userList.Find(a => a.UserId == userId);
+                if (hu != null)
+                {
+                    _userList.Remove(hu);
+                }
+                string connectionId = Context.ConnectionId;
+                _userList.Add(new HubUser
+                {
+                    UserId = userId,
+                    UserName = userName,
+                    ConnectionId = connectionId
+                });
+                Console.WriteLine($"{userId}登录成功,ConnectionId={connectionId}");
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"{userId}登录失败");
+            }
+            
+        }
+
+        /// <summary>
+        /// 退出功能,当客户端退出时调用
+        /// </summary>
+        /// <param name="userId"></param>
+        public void Logout(int userId)
+        {
+            HubUser hu = _userList.Find(a => a.UserId == userId);
+            if (hu != null)
+            {
+                _userList.Remove(hu);
+            }
+            Console.WriteLine($"{userId}退出成功,ConnectionId={hu.ConnectionId}");
+        }
+
+        public class HubUser
+        {
+            /// <summary>
+            /// 连接ID
+            /// </summary>
+            [Key]
+            public string ConnectionId { get; set; } = string.Empty;
+            /// <summary>
+            /// 用户id
+            /// </summary>
+            public int UserId { get; set; }
+            /// <summary>
+            /// 姓名
+            /// </summary>
+            public string UserName { get; set; }
+        }
+    }
+}
+

+ 116 - 107
OASystem/OASystem.Api/OAMethodLib/Quartz/Business/TaskAssignment.cs

@@ -1,4 +1,6 @@
-using OASystem.Domain.Entities.Groups;
+using Microsoft.AspNetCore.SignalR;
+using OASystem.API.OAMethodLib.Hubs;
+using OASystem.Domain.Entities.Groups;
 using OASystem.Domain.Entities.PersonnelModule;
 using OASystem.Infrastructure.Repositories.PersonnelModule;
 using ILogger = Microsoft.Extensions.Logging.ILogger;
@@ -13,6 +15,7 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
     {
         private readonly static TaskAllocationRepository _taskAllocationRep = AutofacIocManager.Instance.GetService<TaskAllocationRepository>();
         private readonly static ILogger _logger;
+        private readonly static IHubContext<ChatHub> _hubContext;
         /// <summary>
         /// 定时任务更改状态
         /// 每天下午六点定时更新
@@ -62,113 +65,116 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
         /// </summary>
         public static async void PostTaskNewsFeed()
         {
-            var data = _taskAllocationRep._sqlSugar
-                                         .Queryable<Pm_TaskAllocation>()
-                                         .Where(it => it.IsDel == 0 &&
-                                                      !string.IsNullOrEmpty(it.PredictEndTime) &&
-                                                      Convert.ToDateTime(it.PredictEndTime).ToString("yyyy-MM-dd").Equals(DateTime.Now.ToString("yyyy-MM-dd"))
-                                               )
-                                         .ToList();
-            if (data.Count > 0)
-            {
-                //处理要任务提醒的员工
-                List<int> primaryIds = new List<int>();
-                primaryIds = data.Select(it => it.Id).ToList();
-                var subData = _taskAllocationRep._sqlSugar
-                                                .Queryable<Pm_TaskRelevanceUser>()
-                                                .Where(it => it.IsDel == 0 &&
-                                                             primaryIds.Contains(it.TAId) &&
-                                                             it.TaskStatus <= (int)TaskEnum.UnderWay
-                                                      )
-                                                .ToList();
-
-                _taskAllocationRep._sqlSugar.BeginTran();
-                var depDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Department>().Where(it => it.IsDel == 0).ToList();
-                var groupDatas = _taskAllocationRep._sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0).ToList();
-                var userDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0).ToList();
-
-                foreach (var item in data)
-                {
-                    string depName = string.Empty;
-                    string groupName = string.Empty;
-                    var depData = depDatas.Where(it => it.Id == item.DepId).FirstOrDefault();
-                    if (depData != null) { depName = depData.DepName; }
-                    if (item.DiId == -1) { groupName = "其他"; }
-                    else
-                    {
-                        var groupData = groupDatas.Where(it => it.Id == item.DiId).FirstOrDefault();
-                        if (groupData != null) { groupName = groupData.TeamName; }
-                    }
-
-                    var subData1 = subData.Where(it => it.TAId == item.Id).ToList();
-
-                    foreach (var subItem in subData1)
-                    {
-                        string realityStartTime = string.Empty;
-                        string userName = string.Empty;
-                        if (!string.IsNullOrEmpty(subItem.BeginTime))
-                        {
-                            realityStartTime = subItem.BeginTime;
-                        }
-                        else
-                        {
-                            if (subItem.TaskStatus == -1) realityStartTime = "未开始";
-                            else if (subItem.TaskStatus == 0) realityStartTime = "已知晓";
-                        }
-
-                        var userData = userDatas.Where(it => it.Id == subItem.UserId).FirstOrDefault();
-                        if (userData != null) { userName = userData.CnName; }
-                        string msgContent = string.Format(@"任务归属:{0}<br/>
-                                                            归属团组:{1}<br/>
-                                                            预计起止时间:{2} 至 {3}<br/>
-                                                            实际开始时间:{4}<br/>
-                                                            任务优先级:{5}<br/>
-                                                            任务参与者:{6}<br/>
-                                                            任务内容:{7}", depName, groupName, item.PredictBeginTime, item.PredictEndTime,
-                                                            realityStartTime, item.TaskPriority, userName, item.TaskContent);
-                        Sys_Message _Message = new Sys_Message()
-                        {
-                            Type = MessgeTypeEnum.TaskProgressUpdate,
-                            Title = item.TaskName,
-                            IssuerId = 4, //管理员
-                            Content = msgContent,
-                            ReleaseTime = DateTime.Now,
-                            CreateUserId = 4,
-                            CreateTime = DateTime.Now,
-                            DeleteTime = "1990-01-01 00:00:00.000",
-                            DiId = item.DiId,
-                        };
-                        var msgAddId = _taskAllocationRep._sqlSugar.Insertable<Sys_Message>(_Message).ExecuteReturnIdentity();
-                        if (msgAddId < 0)
-                        {
-                            _taskAllocationRep._sqlSugar.RollbackTran();
-                            _logger.LogError("任务通知消息推送失败!");
-                            return;
-                        }
-
-                        Sys_MessageReadAuth _MessageReadAuth = new Sys_MessageReadAuth()
-                        {
-                            MsgId = msgAddId,
-                            ReadableUId = subItem.UserId,
-                            IsRead = 0,
-                            ReadTime = Convert.ToDateTime("1990-01-01 00:00:00.000"),
-                            CreateUserId = 4,
-                            CreateTime = DateTime.Now,
-                            DeleteTime = "1990-01-01 00:00:00.000"
-                        };
-
-                        var msgAuthAddId = _taskAllocationRep._sqlSugar.Insertable<Sys_MessageReadAuth>(_MessageReadAuth).ExecuteReturnIdentity();
-                        if (msgAuthAddId < 0)
-                        {
-                            _taskAllocationRep._sqlSugar.RollbackTran();
-                            _logger.LogError("任务通知消息推送失败!");
-                            return;
-                        }
-                    }
-                }
-                _taskAllocationRep._sqlSugar.CommitTran();
-            }
+            #region 消息处理
+
+           
+            //var data = _taskAllocationRep._sqlSugar
+            //                             .Queryable<Pm_TaskAllocation>()
+            //                             .Where(it => it.IsDel == 0 &&
+            //                                          !string.IsNullOrEmpty(it.PredictEndTime) &&
+            //                                          Convert.ToDateTime(it.PredictEndTime).ToString("yyyy-MM-dd").Equals(DateTime.Now.ToString("yyyy-MM-dd"))
+            //                                   )
+            //                             .ToList();
+            //if (data.Count > 0)
+            //{
+            //    //处理要任务提醒的员工
+            //    List<int> primaryIds = new List<int>();
+            //    primaryIds = data.Select(it => it.Id).ToList();
+            //    var subData = _taskAllocationRep._sqlSugar
+            //                                    .Queryable<Pm_TaskRelevanceUser>()
+            //                                    .Where(it => it.IsDel == 0 &&
+            //                                                 primaryIds.Contains(it.TAId) &&
+            //                                                 it.TaskStatus <= (int)TaskEnum.UnderWay
+            //                                          )
+            //                                    .ToList();
 
+            //    _taskAllocationRep._sqlSugar.BeginTran();
+            //    var depDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Department>().Where(it => it.IsDel == 0).ToList();
+            //    var groupDatas = _taskAllocationRep._sqlSugar.Queryable<Grp_DelegationInfo>().Where(it => it.IsDel == 0).ToList();
+            //    var userDatas = _taskAllocationRep._sqlSugar.Queryable<Sys_Users>().Where(it => it.IsDel == 0).ToList();
+
+            //    foreach (var item in data)
+            //    {
+            //        string depName = string.Empty;
+            //        string groupName = string.Empty;
+            //        var depData = depDatas.Where(it => it.Id == item.DepId).FirstOrDefault();
+            //        if (depData != null) { depName = depData.DepName; }
+            //        if (item.DiId == -1) { groupName = "其他"; }
+            //        else
+            //        {
+            //            var groupData = groupDatas.Where(it => it.Id == item.DiId).FirstOrDefault();
+            //            if (groupData != null) { groupName = groupData.TeamName; }
+            //        }
+
+            //        var subData1 = subData.Where(it => it.TAId == item.Id).ToList();
+
+            //        foreach (var subItem in subData1)
+            //        {
+            //            string realityStartTime = string.Empty;
+            //            string userName = string.Empty;
+            //            if (!string.IsNullOrEmpty(subItem.BeginTime))
+            //            {
+            //                realityStartTime = subItem.BeginTime;
+            //            }
+            //            else
+            //            {
+            //                if (subItem.TaskStatus == -1) realityStartTime = "未开始";
+            //                else if (subItem.TaskStatus == 0) realityStartTime = "已知晓";
+            //            }
+
+            //            var userData = userDatas.Where(it => it.Id == subItem.UserId).FirstOrDefault();
+            //            if (userData != null) { userName = userData.CnName; }
+            //            string msgContent = string.Format(@"任务归属:{0}<br/>
+            //                                                归属团组:{1}<br/>
+            //                                                预计起止时间:{2} 至 {3}<br/>
+            //                                                实际开始时间:{4}<br/>
+            //                                                任务优先级:{5}<br/>
+            //                                                任务参与者:{6}<br/>
+            //                                                任务内容:{7}", depName, groupName, item.PredictBeginTime, item.PredictEndTime,
+            //                                                realityStartTime, item.TaskPriority, userName, item.TaskContent);
+            //            Sys_Message _Message = new Sys_Message()
+            //            {
+            //                Type = MessgeTypeEnum.TaskProgressUpdate,
+            //                Title = item.TaskName,
+            //                IssuerId = 4, //管理员
+            //                Content = msgContent,
+            //                ReleaseTime = DateTime.Now,
+            //                CreateUserId = 4,
+            //                CreateTime = DateTime.Now,
+            //                DeleteTime = "1990-01-01 00:00:00.000",
+            //                DiId = item.DiId,
+            //            };
+            //            var msgAddId = _taskAllocationRep._sqlSugar.Insertable<Sys_Message>(_Message).ExecuteReturnIdentity();
+            //            if (msgAddId < 0)
+            //            {
+            //                _taskAllocationRep._sqlSugar.RollbackTran();
+            //                _logger.LogError("任务通知消息推送失败!");
+            //                return;
+            //            }
+
+            //            Sys_MessageReadAuth _MessageReadAuth = new Sys_MessageReadAuth()
+            //            {
+            //                MsgId = msgAddId,
+            //                ReadableUId = subItem.UserId,
+            //                IsRead = 0,
+            //                ReadTime = Convert.ToDateTime("1990-01-01 00:00:00.000"),
+            //                CreateUserId = 4,
+            //                CreateTime = DateTime.Now,
+            //                DeleteTime = "1990-01-01 00:00:00.000"
+            //            };
+
+            //            var msgAuthAddId = _taskAllocationRep._sqlSugar.Insertable<Sys_MessageReadAuth>(_MessageReadAuth).ExecuteReturnIdentity();
+            //            if (msgAuthAddId < 0)
+            //            {
+            //                _taskAllocationRep._sqlSugar.RollbackTran();
+            //                _logger.LogError("任务通知消息推送失败!");
+            //                return;
+            //            }
+            //        }
+            //    }
+            //    _taskAllocationRep._sqlSugar.CommitTran();
+            //}
+            #endregion
 
             //查询需要提示的消息 Singlr
             string sql = string.Format(@"Select smra.Id,su.CnName As Issuer,sm.ReleaseTime,sm.Title,
@@ -180,6 +186,9 @@ namespace OASystem.API.OAMethodLib.Quartz.Business
 										 Order By smra.ReadableUId,smra.CreateTime Desc");
             var datas = _taskAllocationRep._sqlSugar.SqlQueryable<MessageReadAuthPushView>(sql).ToList();
 
+            await _hubContext.Clients.All.SendAsync("ReceiveMessage","系统通知","${da}");
+
+
         }
     }
 }

+ 20 - 3
OASystem/OASystem.Api/Program.cs

@@ -16,6 +16,9 @@ using QuzrtzJob.Factory;
 using System.Runtime.CompilerServices;
 using OASystem.API.OAMethodLib.QiYeWeChatAPI;
 using OASystem.API.OAMethodLib.Quartz.Jobs;
+using Microsoft.AspNetCore.Cors.Infrastructure;
+using Microsoft.AspNetCore.SignalR;
+using OASystem.API.OAMethodLib.Hubs;
 
 var builder = WebApplication.CreateBuilder(args);
 var basePath = AppContext.BaseDirectory;
@@ -278,6 +281,15 @@ builder.Services.AddSingleton<IJobFactory, IOCJobFactory>();
 
 #endregion
 
+#region SignalR
+builder.Services.AddSignalR().AddJsonProtocol(options =>
+{
+    //加配置可以传给客户端对象,否则只能传字符串
+    options.PayloadSerializerOptions.PropertyNamingPolicy = null;
+});
+
+#endregion
+
 var app = builder.Build();
 AutofacIocManager.Instance.Container = app.UseHostFiltering().ApplicationServices.GetAutofacRoot();//AutofacIocManager
 
@@ -294,9 +306,6 @@ app.UseAuthorization();  // 
 app.UseCors("Cors");  //Cors
 //app.UseCors("AllowSpecificOrigin");  //Cors
 
-#region MyRegion
-
-#endregion
 
 #region 启用swaggerUI
 if (AppSettingsHelper.Get("UseSwagger").ToBool())
@@ -334,6 +343,14 @@ app.Lifetime.ApplicationStopped.Register(() =>
 #endregion
 
 
+#region SignalR
+app.UseEndpoints(endpoints =>
+{
+    endpoints.MapControllers();
+    endpoints.MapHub<ChatHub>("/api/chatHub");
+});
+#endregion
+
 app.MapControllerRoute(
     name: "default",
     pattern: "{controller=Home}/{action=Index}/{id?}");

+ 7 - 0
OASystem/OASystem.SignalR/Class1.cs

@@ -0,0 +1,7 @@
+namespace OASystem.SignalR
+{
+    public class Class1
+    {
+
+    }
+}

+ 9 - 0
OASystem/OASystem.SignalR/OASystem.SignalR.csproj

@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>