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
 | 
						|
            });
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |