Commit 4433472b by lcx

修改返回signalr的方法

parent 7157d4fc
...@@ -24,35 +24,34 @@ namespace Performance.Api.Controllers ...@@ -24,35 +24,34 @@ namespace Performance.Api.Controllers
[Route("api/[controller]")] [Route("api/[controller]")]
public class AllotController : Controller public class AllotController : Controller
{ {
private AllotService _allotService; private readonly IHostingEnvironment _evn;
private ResultComputeService _resultComputeService; private readonly ClaimService _claim;
private ConfigService _configService; private readonly IBackgroundTaskQueue _backgroundTaskQueue;
private IHostingEnvironment _evn; private readonly IServiceScopeFactory _serviceScopeFactory;
private ILogger<AllotController> _logger; private readonly AllotService _allotService;
private ClaimService _claim; private readonly ConfigService _configService;
private LogManageService _logManageService; private readonly NotificationsService _notificationsService;
private IBackgroundTaskQueue _backgroundTaskQueue; private readonly ResultComputeService _resultComputeService;
private IServiceScopeFactory _serviceScopeFactory;
public AllotController(
public AllotController(AllotService allotService,
ResultComputeService resultComputeService,
ConfigService configService,
ILogger<AllotController> logger,
IHostingEnvironment evn, IHostingEnvironment evn,
ClaimService claim,
IBackgroundTaskQueue backgroundTaskQueue, IBackgroundTaskQueue backgroundTaskQueue,
IServiceScopeFactory serviceScopeFactory, IServiceScopeFactory serviceScopeFactory,
ClaimService claim, AllotService allotService,
LogManageService logManageService) ConfigService configService,
NotificationsService notificationsService,
ResultComputeService resultComputeService
)
{ {
_allotService = allotService;
_resultComputeService = resultComputeService;
_logger = logger;
_evn = evn; _evn = evn;
_claim = claim; _claim = claim;
_logManageService = logManageService;
_configService = configService;
_backgroundTaskQueue = backgroundTaskQueue; _backgroundTaskQueue = backgroundTaskQueue;
_serviceScopeFactory = serviceScopeFactory; _serviceScopeFactory = serviceScopeFactory;
_allotService = allotService;
_configService = configService;
_notificationsService = notificationsService;
_resultComputeService = resultComputeService;
} }
/// <summary> /// <summary>
...@@ -177,7 +176,7 @@ public ApiResponse Import([FromForm] IFormCollection form) ...@@ -177,7 +176,7 @@ public ApiResponse Import([FromForm] IFormCollection form)
/// <summary> /// <summary>
/// 上传文件 /// 上传文件
/// </summary> /// </summary>
/// <param name="form"></param> /// <param name="allotId"></param>
/// <returns></returns> /// <returns></returns>
[Route("ImportExtraction/{allotId}")] [Route("ImportExtraction/{allotId}")]
[HttpPost] [HttpPost]
...@@ -236,11 +235,13 @@ public ApiResponse Generate([CustomizeValidator(RuleSet = "Delete"), FromBody] A ...@@ -236,11 +235,13 @@ public ApiResponse Generate([CustomizeValidator(RuleSet = "Delete"), FromBody] A
if (allot.States == (int)AllotStates.Wait) if (allot.States == (int)AllotStates.Wait)
return new ApiResponse(ResponseType.OK, "当前绩效正在等待生成"); return new ApiResponse(ResponseType.OK, "当前绩效正在等待生成");
_logManageService.WriteMsg("生成绩效准备中", $"准备生成{allot.Year}-{allot.Month.ToString().PadLeft(2, '0')}月份绩效,请稍等!", 1, allot.ID, "ReceiveMessage", true); int userId = _claim.GetUserId();
var uuid = Guid.NewGuid().ToString("N");
_notificationsService.SendGenerateMessage(userId, allot, uuid, $"准备生成{allot.Year}-{allot.Month.ToString().PadLeft(2, '0')}月份绩效,请稍等!");
_allotService.UpdateAllotStates(allot.ID, (int)AllotStates.Wait, EnumHelper.GetDescription(AllotStates.Wait), allot.Generate); _allotService.UpdateAllotStates(allot.ID, (int)AllotStates.Wait, EnumHelper.GetDescription(AllotStates.Wait), allot.Generate);
if (_evn.IsEnvironment("Localhost")) if (_evn.IsEnvironment("Localhost"))
{ {
_allotService.Generate(allot, email); _allotService.Generate(allot, email, uuid, userId);
} }
else else
{ {
...@@ -251,13 +252,13 @@ public ApiResponse Generate([CustomizeValidator(RuleSet = "Delete"), FromBody] A ...@@ -251,13 +252,13 @@ public ApiResponse Generate([CustomizeValidator(RuleSet = "Delete"), FromBody] A
using (var scope = _serviceScopeFactory.CreateScope()) using (var scope = _serviceScopeFactory.CreateScope())
{ {
var scopedServices = scope.ServiceProvider.GetRequiredService<AllotService>(); var scopedServices = scope.ServiceProvider.GetRequiredService<AllotService>();
scopedServices.Generate(allot, email); scopedServices.Generate(allot, email, uuid, userId);
await Task.Delay(TimeSpan.FromSeconds(5), token); await Task.Delay(TimeSpan.FromSeconds(5), token);
} }
}); });
} }
_logManageService.WriteMsg("等待绩效生成", $"等待绩效生成{allot.Year}-{allot.Month.ToString().PadLeft(2, '0')}月份绩效!", 1, allot.ID, "ReceiveMessage"); _notificationsService.SendGenerateMessage(userId, allot, uuid, $"等待绩效生成{allot.Year}-{allot.Month.ToString().PadLeft(2, '0')}月份绩效,请稍等!");
//_allotService.Generate(allot, email); //_allotService.Generate(allot, email);
////BackgroundJob.Enqueue(() => _allotService.Generate(allot, email)); ////BackgroundJob.Enqueue(() => _allotService.Generate(allot, email));
return new ApiResponse(ResponseType.OK); return new ApiResponse(ResponseType.OK);
......
...@@ -110,6 +110,33 @@ ...@@ -110,6 +110,33 @@
<param name="userId">用户id</param> <param name="userId">用户id</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Performance.Api.Controllers.AccountController.SelfInfos">
<summary>
查询用户信息
</summary>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.AccountController.InsertUser(Performance.DtoModels.UserRequest)">
<summary>
新增用户
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.AccountController.UpdateUser(Performance.DtoModels.UserRequest)">
<summary>
编辑用户
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.AccountController.DeleteUser(Performance.DtoModels.UserRequest)">
<summary>
新增用户
</summary>
<param name="request"></param>
<returns></returns>
</member>
<member name="T:Performance.Api.Controllers.AgainAllotController"> <member name="T:Performance.Api.Controllers.AgainAllotController">
<summary> <summary>
科室二次分配 科室二次分配
...@@ -177,6 +204,13 @@ ...@@ -177,6 +204,13 @@
<param name="form"></param> <param name="form"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Performance.Api.Controllers.AllotController.ImportExtraction(System.Int32)">
<summary>
上传文件
</summary>
<param name="allotId"></param>
<returns></returns>
</member>
<member name="M:Performance.Api.Controllers.AllotController.Generate(Performance.DtoModels.AllotRequest)"> <member name="M:Performance.Api.Controllers.AllotController.Generate(Performance.DtoModels.AllotRequest)">
<summary> <summary>
绩效生成 绩效生成
......
...@@ -221,6 +221,71 @@ ...@@ -221,6 +221,71 @@
结果值 结果值
</summary> </summary>
</member> </member>
<member name="F:Performance.DtoModels.Classify.Notification">
<summary>
通知
</summary>
</member>
<member name="F:Performance.DtoModels.Classify.Progress">
<summary>
进度条
</summary>
</member>
<member name="F:Performance.DtoModels.NoticeType.success">
<summary>
成功
</summary>
</member>
<member name="F:Performance.DtoModels.NoticeType.info">
<summary>
消息
</summary>
</member>
<member name="F:Performance.DtoModels.NoticeType.warning">
<summary>
警告
</summary>
</member>
<member name="F:Performance.DtoModels.NoticeType.error">
<summary>
错误
</summary>
</member>
<member name="F:Performance.DtoModels.NoticeType.exception">
<summary>
异常
</summary>
</member>
<member name="P:Performance.DtoModels.MessageInfo.Classify">
<summary>
分类
</summary>
</member>
<member name="P:Performance.DtoModels.MessageInfo.Type">
<summary>
类型
</summary>
</member>
<member name="P:Performance.DtoModels.MessageInfo.Title">
<summary>
标题
</summary>
</member>
<member name="P:Performance.DtoModels.MessageInfo.Message">
<summary>
消息
</summary>
</member>
<member name="P:Performance.DtoModels.MessageInfo.Percentage">
<summary>
百分比
</summary>
</member>
<member name="P:Performance.DtoModels.MessageInfo.TypeValue">
<summary>
类型值
</summary>
</member>
<member name="P:Performance.DtoModels.PerAgainData.RowNumber"> <member name="P:Performance.DtoModels.PerAgainData.RowNumber">
<summary> <summary>
行号 行号
...@@ -2273,6 +2338,11 @@ ...@@ -2273,6 +2338,11 @@
角色 角色
</summary> </summary>
</member> </member>
<member name="P:Performance.DtoModels.UserRequest.RoleArr">
<summary>
角色Arr
</summary>
</member>
<member name="P:Performance.DtoModels.UserRequest.HosIDArray"> <member name="P:Performance.DtoModels.UserRequest.HosIDArray">
<summary> <summary>
用户医院ID 用户医院ID
......
...@@ -151,6 +151,9 @@ ...@@ -151,6 +151,9 @@
<member name="P:Performance.EntityModels.PerformanceDbContext.log_dbug"> <member name="P:Performance.EntityModels.PerformanceDbContext.log_dbug">
<summary> </summary> <summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.PerformanceDbContext.log_signalr">
<summary> </summary>
</member>
<member name="P:Performance.EntityModels.PerformanceDbContext.mod_dic"> <member name="P:Performance.EntityModels.PerformanceDbContext.mod_dic">
<summary> 部分公共数据抽取SQL </summary> <summary> 部分公共数据抽取SQL </summary>
</member> </member>
...@@ -2961,6 +2964,61 @@ ...@@ -2961,6 +2964,61 @@
1、绩效生成日志 2、绩效提取日志 3、绩效提取进度 1、绩效生成日志 2、绩效提取日志 3、绩效提取进度
</summary> </summary>
</member> </member>
<member name="T:Performance.EntityModels.log_signalr">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.Id">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.HospitalId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.AllotId">
<summary>
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.Classify">
<summary>
分类
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.TypeValue">
<summary>
类型值
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.Type">
<summary>
类型
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.Title">
<summary>
标题
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.Message">
<summary>
消息
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.Percentage">
<summary>
百分比
</summary>
</member>
<member name="P:Performance.EntityModels.log_signalr.CreateTime">
<summary>
</summary>
</member>
<member name="T:Performance.EntityModels.mod_dic"> <member name="T:Performance.EntityModels.mod_dic">
<summary> <summary>
部分公共数据抽取SQL 部分公共数据抽取SQL
...@@ -5731,6 +5789,11 @@ ...@@ -5731,6 +5789,11 @@
删除状态 1可用 2删除 删除状态 1可用 2删除
</summary> </summary>
</member> </member>
<member name="P:Performance.EntityModels.sys_user.ParentID">
<summary>
父级ID
</summary>
</member>
<member name="T:Performance.EntityModels.sys_user_hospital"> <member name="T:Performance.EntityModels.sys_user_hospital">
<summary> <summary>
......
...@@ -236,6 +236,9 @@ public AutoMapperConfigs() ...@@ -236,6 +236,9 @@ public AutoMapperConfigs()
CreateMap<HistoryData, report_original_surgery>() CreateMap<HistoryData, report_original_surgery>()
.ForMember(dest => dest.PersonTime, opt => opt.MapFrom(src => src.ResultData)) .ForMember(dest => dest.PersonTime, opt => opt.MapFrom(src => src.ResultData))
.ReverseMap(); .ReverseMap();
CreateMap<log_signalr, MessageInfo>()
.ReverseMap();
} }
public void xx() public void xx()
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
using System.ComponentModel; using System.ComponentModel;
using System.Text; using System.Text;
namespace Performance.Services namespace Performance.DtoModels
{ {
public enum Classify public enum Classify
{ {
......
...@@ -3,19 +3,27 @@ ...@@ -3,19 +3,27 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace Performance.Services namespace Performance.DtoModels
{ {
public class MessageInfo public class MessageInfo
{ {
public MessageInfo(NoticeType typeValue) public MessageInfo(NoticeType typeValue, string uuid = null, Classify classify = Classify.Notification)
{ {
TypeValue = typeValue; TypeValue = typeValue;
Uuid = uuid;
Classify = classify;
} }
public string Uuid { get; set; }
public int HospitalId { get; set; }
public int AllotId { get; set; }
/// <summary> /// <summary>
/// 分类 /// 分类
/// </summary> /// </summary>
public Classify Classify { get; set; } = Classify.Notification; public Classify Classify { get; set; }
/// <summary> /// <summary>
/// 类型 /// 类型
......
...@@ -164,6 +164,9 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options) ...@@ -164,6 +164,9 @@ public PerformanceDbContext(DbContextOptions<PerformanceDbContext> options)
/// <summary> </summary> /// <summary> </summary>
public virtual DbSet<log_dbug> log_dbug { get; set; } public virtual DbSet<log_dbug> log_dbug { get; set; }
/// <summary> </summary>
public virtual DbSet<log_signalr> log_signalr { get; set; }
/// <summary> 部分公共数据抽取SQL </summary> /// <summary> 部分公共数据抽取SQL </summary>
public virtual DbSet<mod_dic> mod_dic { get; set; } public virtual DbSet<mod_dic> mod_dic { get; set; }
......
//-----------------------------------------------------------------------
// <copyright file=" log_signalr.cs">
// * FileName: .cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Performance.EntityModels
{
/// <summary>
///
/// </summary>
[Table("log_signalr")]
public class log_signalr
{
/// <summary>
///
/// </summary>
[Key]
public int Id { get; set; }
/// <summary>
///
/// </summary>
public int HospitalId { get; set; }
/// <summary>
///
/// </summary>
public int AllotId { get; set; }
/// <summary>
/// 分类
/// </summary>
public int Classify { get; set; }
/// <summary>
/// 类型值
/// </summary>
public int TypeValue { get; set; }
/// <summary>
/// 类型
/// </summary>
public string Type { get; set; }
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 消息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 百分比
/// </summary>
public Nullable<decimal> Percentage { get; set; }
/// <summary>
///
/// </summary>
public Nullable<DateTime> CreateTime { get; set; }
}
}
//-----------------------------------------------------------------------
// <copyright file=" log_signalr.cs">
// * FileName: log_signalr.cs
// </copyright>
//-----------------------------------------------------------------------
using System;
using Performance.EntityModels;
namespace Performance.Repository
{
/// <summary>
/// log_signalr Repository
/// </summary>
public partial class PerforLogdsignalrRepository : PerforRepository<log_signalr>
{
public PerforLogdsignalrRepository(PerformanceDbContext context) : base(context)
{
}
}
}
...@@ -10,40 +10,48 @@ ...@@ -10,40 +10,48 @@
namespace Performance.Services namespace Performance.Services
{ {
[Authorize]
public class AllotLogHub : Hub public class AllotLogHub : Hub
{ {
private readonly IMemoryCache cache; private readonly IMemoryCache cache;
private readonly ILogger<AllotLogHub> logger; private readonly ILogger<AllotLogHub> logger;
private readonly NotificationsService service;
public AllotLogHub( public AllotLogHub(
IMemoryCache cache, IMemoryCache cache,
ILogger<AllotLogHub> logger, ILogger<AllotLogHub> logger
NotificationsService service
) )
{ {
this.cache = cache; this.cache = cache;
this.logger = logger; this.logger = logger;
this.service = service;
} }
private readonly MemoryCacheHelper helper = new MemoryCacheHelper(); public override Task OnConnectedAsync()
public void LoginService(string userId)
{ {
if (helper.Exists(userId)) string key = Context.User.Claims.FirstOrDefault(t => t.Type == "id")?.Value;
helper.Remove(userId); if (!string.IsNullOrEmpty(key))
{
var dateTime = DateTime.Now; if (cache.TryGetValue(key, out _))
var slidingtimespan = helper.ToUnixTimestampBySeconds(dateTime.AddMinutes(30)); {
var absolutetimespan = helper.ToUnixTimestampBySeconds(dateTime.AddHours(2)); cache.Remove(key);
helper.Set(userId, Context.ConnectionId, slidingtimespan, absolutetimespan); }
cache.Set(key, Context.ConnectionId);
}
logger.LogInformation($"用户在{DateTime.Now.ToString("yyyy年MM月dd日 hh时mm分ss秒")}创建连接");
return base.OnConnectedAsync();
} }
public void LogoutService(string userId) public override Task OnDisconnectedAsync(Exception exception)
{
string key = Context.User.Claims.FirstOrDefault(t => t.Type == "id")?.Value;
if (!string.IsNullOrEmpty(key))
{
if (cache.TryGetValue(key, out _))
{ {
if (helper.Exists(userId)) cache.Remove(key);
helper.Remove(userId); }
}
logger.LogInformation($"用户在{DateTime.Now.ToString("yyyy年MM月dd日 hh时mm分ss秒")}断开连接");
return base.OnDisconnectedAsync(exception);
} }
} }
} }
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Infrastructure; using Performance.Infrastructure;
using Performance.Repository;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
...@@ -11,23 +15,40 @@ namespace Performance.Services ...@@ -11,23 +15,40 @@ namespace Performance.Services
public class NotificationsService : IAutoInjection public class NotificationsService : IAutoInjection
{ {
private readonly ILogger logger; private readonly ILogger logger;
private readonly IMemoryCache cache;
private readonly IHubContext<AllotLogHub> hubContext; private readonly IHubContext<AllotLogHub> hubContext;
private readonly PerforLogdsignalrRepository repository;
public NotificationsService( public NotificationsService(
ILogger<NotificationsService> logger, ILogger<NotificationsService> logger,
IHubContext<AllotLogHub> hubContext IMemoryCache cache,
IHubContext<AllotLogHub> hubContext,
PerforLogdsignalrRepository repository
) )
{ {
this.logger = logger; this.logger = logger;
this.cache = cache;
this.hubContext = hubContext; this.hubContext = hubContext;
this.repository = repository;
}
public void SendGenerateMessage(int userId, per_allot allot, string uuid, string message, NoticeType typeValue = NoticeType.info)
{
var info = new MessageInfo(typeValue, uuid, Classify.Notification)
{
HospitalId = allot.HospitalId,
AllotId = allot.ID,
Title = "生成绩效",
Message = message
};
SendMessage(userId, info);
} }
private readonly MemoryCacheHelper helper = new MemoryCacheHelper();
public void SendMessage(int userId, MessageInfo data) public void SendMessage(int userId, MessageInfo data)
{ {
string key = userId.ToString(); string key = userId.ToString();
if (helper.Exists(key) && helper.Get(key) is string connectionId && !string.IsNullOrEmpty(connectionId)) if (cache.TryGetValue(key, out string connectionId) && !string.IsNullOrEmpty(connectionId))
{ {
SendMessageToClient(connectionId, data); SendMessageToClient(connectionId, data);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment