268 lines
13 KiB
C#
268 lines
13 KiB
C#
|
|
using APT.BaseData.Domain.ApiModel.EX;
|
|||
|
|
using APT.BaseData.Domain.Entities.FM;
|
|||
|
|
using APT.BaseData.Domain.Enums;
|
|||
|
|
using APT.BaseData.Domain.IServices.FM;
|
|||
|
|
using APT.Infrastructure.Api;
|
|||
|
|
using APT.Infrastructure.Core;
|
|||
|
|
using APT.Migrations;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using static APT.BaseData.Domain.ApiModel.SocketInfo;
|
|||
|
|
|
|||
|
|
namespace APT.BaseData.Services.Services.FM
|
|||
|
|
{
|
|||
|
|
public class NotificationService : CommonService, IFMNotificatoinService
|
|||
|
|
{
|
|||
|
|
public NotificationService(IRepository repository)
|
|||
|
|
: base(repository)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private T_FM_NOTIFICATION AddNotification(SendNotificationModel model, List<T_FM_NOTIFICATION> addNotifications,
|
|||
|
|
List<T_FM_NOTIFICATION_PERMIT> addNotificationPermits)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (model == null) return null;
|
|||
|
|
T_FM_NOTIFICATION notification = new T_FM_NOTIFICATION();
|
|||
|
|
notification.TITLE = model.Title;
|
|||
|
|
notification.ECMSAGE = model.Message;
|
|||
|
|
notification.NOTIFICATION_SHOW_TYPE = model.ShowInfoType;
|
|||
|
|
notification.NOTIFICATION_CLIENT_TYPE = model.ClientType;
|
|||
|
|
notification.ORG_ID = model.OrgId;
|
|||
|
|
notification.USER_ID = model.UserId;
|
|||
|
|
addNotifications.Add(notification);
|
|||
|
|
|
|||
|
|
SysPermission sysPermission = Infrastructure.Api.AppContext.SysPermission;
|
|||
|
|
if (model.CheckOrgType == (int)FMNotificationOrgTypeEnum.本组织)
|
|||
|
|
{
|
|||
|
|
T_FM_NOTIFICATION_PERMIT permit = new T_FM_NOTIFICATION_PERMIT();
|
|||
|
|
permit.ORG_ID = notification.ORG_ID;
|
|||
|
|
permit.NOTIFICATION_ID = notification.ID;
|
|||
|
|
permit.PERMIT_TYPE = (int)FMNotificationPermitTypeEnum.组织;
|
|||
|
|
permit.PERMIT_KEY_ID = notification.ORG_ID;
|
|||
|
|
addNotificationPermits.Add(permit);
|
|||
|
|
}
|
|||
|
|
else if (model.CheckOrgType == (int)FMNotificationOrgTypeEnum.本组织及下级组织)
|
|||
|
|
{
|
|||
|
|
List<Guid> orgIds = new List<Guid>();
|
|||
|
|
orgIds.Add(notification.ORG_ID.Value);
|
|||
|
|
|
|||
|
|
OrgCache orgCache = null;
|
|||
|
|
if (notification.ORG_ID != null &&
|
|||
|
|
sysPermission.OrgCaches.TryGetValue(notification.ORG_ID.Value, out orgCache))
|
|||
|
|
orgIds.AddRange(orgCache.AllChildrenIds);
|
|||
|
|
foreach (var item in orgIds)
|
|||
|
|
{
|
|||
|
|
T_FM_NOTIFICATION_PERMIT permit = new T_FM_NOTIFICATION_PERMIT();
|
|||
|
|
permit.ORG_ID = notification.ORG_ID;
|
|||
|
|
permit.NOTIFICATION_ID = notification.ID;
|
|||
|
|
permit.PERMIT_TYPE = (int)FMNotificationPermitTypeEnum.组织;
|
|||
|
|
permit.PERMIT_KEY_ID = item;
|
|||
|
|
addNotificationPermits.Add(permit);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (model.CheckOrgType == (int)FMNotificationOrgTypeEnum.忽略组织)
|
|||
|
|
{
|
|||
|
|
T_FM_NOTIFICATION_PERMIT permit = new T_FM_NOTIFICATION_PERMIT();
|
|||
|
|
permit.ORG_ID = notification.ORG_ID;
|
|||
|
|
permit.NOTIFICATION_ID = notification.ID;
|
|||
|
|
permit.PERMIT_TYPE = (int)FMNotificationPermitTypeEnum.所有人;
|
|||
|
|
addNotificationPermits.Add(permit);
|
|||
|
|
}
|
|||
|
|
return notification;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 发送通知公告
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="notificationType"></param>
|
|||
|
|
/// <param name="title"></param>
|
|||
|
|
/// <param name="message"></param>
|
|||
|
|
public void SendNotification(FMNotificationTypeEnum notificationType, FMNotificationClientTypeEnum clientType,
|
|||
|
|
string title, string message)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
SendNotificationModel sendNotificationModel = new SendNotificationModel();
|
|||
|
|
sendNotificationModel.CheckOrgType = (int)FMNotificationOrgTypeEnum.本组织;
|
|||
|
|
sendNotificationModel.ShowInfoType = (int)FMNotificationShowTypeEnum.弹窗;
|
|||
|
|
sendNotificationModel.Title = title;
|
|||
|
|
sendNotificationModel.ClientType = (int)clientType;
|
|||
|
|
sendNotificationModel.Message = message;
|
|||
|
|
sendNotificationModel.NotificatoinType = (int)notificationType;
|
|||
|
|
if (Infrastructure.Api.AppContext.CurrentSession != null)
|
|||
|
|
{
|
|||
|
|
sendNotificationModel.UserId = Infrastructure.Api.AppContext.CurrentSession.UserID;
|
|||
|
|
sendNotificationModel.OrgId = Infrastructure.Api.AppContext.CurrentSession.OrgId;
|
|||
|
|
}
|
|||
|
|
List<WebSocketClientInfo> clientInfos = null;
|
|||
|
|
if (sendNotificationModel.UserId != null)
|
|||
|
|
clientInfos = WebSocketServiceHelper.ClintInfos.Where(t => t.UserId == sendNotificationModel.UserId).ToList();
|
|||
|
|
SendNotification(sendNotificationModel, clientInfos);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 发送通知公告
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="sendNotificationModel"></param>
|
|||
|
|
/// <param name="ingoreClientInfos"></param>
|
|||
|
|
public void SendNotification(SendNotificationModel sendNotificationModel, List<WebSocketClientInfo> clientInfos)
|
|||
|
|
{
|
|||
|
|
if (clientInfos.Count == 0)
|
|||
|
|
return;
|
|||
|
|
var defClient = clientInfos.FirstOrDefault();
|
|||
|
|
if (string.IsNullOrEmpty(defClient.DbConn))
|
|||
|
|
return;
|
|||
|
|
using (var context = new MigrationContext(defClient.DbConn))
|
|||
|
|
{
|
|||
|
|
if (sendNotificationModel == null) return;
|
|||
|
|
SysPermission sysPermission = Infrastructure.Api.AppContext.SysPermission;
|
|||
|
|
var orgId = sendNotificationModel.OrgId != null ? sendNotificationModel.OrgId :
|
|||
|
|
(defClient.OrgId);
|
|||
|
|
List<T_FM_NOTIFICATION> addNotifications = new List<T_FM_NOTIFICATION>();
|
|||
|
|
List<T_FM_NOTIFICATION_PERMIT> addNotificationPermits = new List<T_FM_NOTIFICATION_PERMIT>();
|
|||
|
|
List<T_FM_NOTIFICATION_ACCEPTED> addNotificationAccepts = new List<T_FM_NOTIFICATION_ACCEPTED>();
|
|||
|
|
var notification = this.AddNotification(sendNotificationModel, addNotifications, addNotificationPermits);
|
|||
|
|
|
|||
|
|
NotificationModel notificationModel = new NotificationModel();
|
|||
|
|
notificationModel.NotificationId = notification.ID;
|
|||
|
|
notificationModel.Title = sendNotificationModel.Title;
|
|||
|
|
notificationModel.Message = sendNotificationModel.Message;
|
|||
|
|
notificationModel.ShowInfoType = sendNotificationModel.ShowInfoType;
|
|||
|
|
notificationModel.Time = DateTime.Now;
|
|||
|
|
notificationModel.NotificatoinType = sendNotificationModel.NotificatoinType;
|
|||
|
|
|
|||
|
|
|
|||
|
|
clientInfos.ForEach(t =>
|
|||
|
|
{
|
|||
|
|
if (t.UserId != null)
|
|||
|
|
{
|
|||
|
|
T_FM_NOTIFICATION_ACCEPTED accept = new T_FM_NOTIFICATION_ACCEPTED();
|
|||
|
|
accept.ORG_ID = notification.ORG_ID;
|
|||
|
|
accept.NOTIFICATION_ID = notification.ID;
|
|||
|
|
accept.USER_ID = t.UserId.Value;
|
|||
|
|
addNotificationAccepts.Add(accept);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
//var commonService = ServiceLocator.Instance.GetService<ICommonService>();
|
|||
|
|
if (sendNotificationModel.UserId != null)
|
|||
|
|
{
|
|||
|
|
notificationModel.UserId = sendNotificationModel.UserId;
|
|||
|
|
|
|||
|
|
var user = context.GetEntity<T_FM_USER>(i => i.ID == sendNotificationModel.UserId, null);
|
|||
|
|
if (user != null)
|
|||
|
|
notificationModel.UserName = user.NAME;
|
|||
|
|
}
|
|||
|
|
WebSocketServiceHelper.SendToAll(new WebSocketResponseInfo()
|
|||
|
|
{
|
|||
|
|
TypeCode = "M001",
|
|||
|
|
Data = notificationModel
|
|||
|
|
}, (t) =>
|
|||
|
|
{
|
|||
|
|
bool ret = false;
|
|||
|
|
if (t.ClientType != WebSocketClientTypeEnum.默认 &&
|
|||
|
|
sendNotificationModel.ClientType != (int)FMNotificationClientTypeEnum.默认 &&
|
|||
|
|
t.ClientType != (WebSocketClientTypeEnum)sendNotificationModel.ClientType)
|
|||
|
|
ret = false;
|
|||
|
|
if (clientInfos.Any(t1 => t1 == t))
|
|||
|
|
ret = false;
|
|||
|
|
else if (sendNotificationModel.CheckOrgType == (int)FMNotificationOrgTypeEnum.本组织)
|
|||
|
|
{
|
|||
|
|
ret = t.OrgId != null && orgId != null && t.OrgId == orgId;
|
|||
|
|
}
|
|||
|
|
else if (sendNotificationModel.CheckOrgType == (int)FMNotificationOrgTypeEnum.本组织及下级组织)
|
|||
|
|
{
|
|||
|
|
if (t.OrgId != null && orgId != null && t.OrgId == orgId) ret = true;
|
|||
|
|
if (sysPermission != null)
|
|||
|
|
{
|
|||
|
|
OrgCache orgCache = null;
|
|||
|
|
if (orgId != null && sysPermission.OrgCaches.TryGetValue(orgId.Value, out orgCache))
|
|||
|
|
ret = t.OrgId != null && orgCache.AllChildrenIds.Contains(t.OrgId.Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (sendNotificationModel.CheckOrgType == (int)FMNotificationOrgTypeEnum.忽略组织)
|
|||
|
|
{
|
|||
|
|
ret = true;
|
|||
|
|
}
|
|||
|
|
return ret;
|
|||
|
|
});
|
|||
|
|
context.Add(addNotifications);
|
|||
|
|
context.Add(addNotificationPermits);
|
|||
|
|
context.Add(addNotificationAccepts);
|
|||
|
|
context.SaveChanges();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 发送报警通知公告
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="sendNotificationModel"></param>
|
|||
|
|
/// <param name="ingoreClientInfos"></param>
|
|||
|
|
public void SendAlarmNotification(SendNotificationModel sendNotificationModel, List<WebSocketClientInfo> clientInfos)
|
|||
|
|
{
|
|||
|
|
if (clientInfos.Count == 0)
|
|||
|
|
return;
|
|||
|
|
var defClient = clientInfos.FirstOrDefault();
|
|||
|
|
if (string.IsNullOrEmpty(defClient.DbConn))
|
|||
|
|
return;
|
|||
|
|
using (var context = new MigrationContext(defClient.DbConn))
|
|||
|
|
{
|
|||
|
|
if (sendNotificationModel.AlarmId != null)
|
|||
|
|
{
|
|||
|
|
//var alarm = context.GetEntity<T_KR_ALARM_NOTIFICATION>(i => i.ID == sendNotificationModel.AlarmId, null);
|
|||
|
|
//alarm.STATUS = (int)KRMessagStatus.已读;
|
|||
|
|
//context.UpdateEntity(alarm);
|
|||
|
|
//context.SaveChanges();
|
|||
|
|
}
|
|||
|
|
SysPermission sysPermission = Infrastructure.Api.AppContext.SysPermission;
|
|||
|
|
var orgId = sendNotificationModel.OrgId != null ? sendNotificationModel.OrgId :
|
|||
|
|
(defClient.OrgId);
|
|||
|
|
var commonService = ServiceLocator.Instance.GetService<ICommonService>();
|
|||
|
|
foreach (var item in clientInfos)
|
|||
|
|
{
|
|||
|
|
var userId = item.UserId ?? Guid.Empty;
|
|||
|
|
|
|||
|
|
var orders = new Dictionary<string, DbOrder>();
|
|||
|
|
orders.Add("CREATE_TIME", DbOrder.DESC);
|
|||
|
|
var selectField = new string[] { "ID", "USER_ID", "STATUS", "CREATE_TIME", "Nav_AlarmLog.DESCRIBE", "Nav_AlarmLog.Nav_Equipment.NAME", "Nav_AlarmLog.Nav_Appliance.NAME" };
|
|||
|
|
//var alarms = context.GetOrderPageEntities<T_KR_ALARM_NOTIFICATION>(x => x.USER_ID == userId && x.STATUS == (int)KRMessagStatus.未读, orders, null, 1, 0,
|
|||
|
|
// "Nav_AlarmLog.Nav_Equipment", "Nav_AlarmLog.Nav_Appliance");
|
|||
|
|
//var lastAlarm = alarms.Items.FirstOrDefault();
|
|||
|
|
//var total = 0;
|
|||
|
|
//if (lastAlarm != null)
|
|||
|
|
//{
|
|||
|
|
// total = alarms.TotalCount;
|
|||
|
|
//}
|
|||
|
|
//var model = new AlarmNotificationModel
|
|||
|
|
//{
|
|||
|
|
// AlarmId = lastAlarm?.ID,
|
|||
|
|
// Message = lastAlarm == null ? ""
|
|||
|
|
// : "[" + lastAlarm?.Nav_AlarmLog?.Nav_Equipment?.NAME + lastAlarm?.Nav_AlarmLog?.Nav_Appliance?.NAME + "]" + lastAlarm?.Nav_AlarmLog?.DESCRIBE,
|
|||
|
|
// TotalCount = total
|
|||
|
|
//};
|
|||
|
|
//WebSocketServiceHelper.SendToUser(userId, new WebSocketResponseInfo()
|
|||
|
|
//{
|
|||
|
|
// TypeCode = "M0003",
|
|||
|
|
// Data = model
|
|||
|
|
//});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SendNotification(Guid userId, SocketData socketData)
|
|||
|
|
{
|
|||
|
|
WebSocketServiceHelper.SendToUser(userId, new WebSocketResponseInfo()
|
|||
|
|
{
|
|||
|
|
TypeCode = "MQ01",
|
|||
|
|
Data = socketData
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|