226 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			226 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								using APT.BaseData.Domain.ApiModel.EX;
							 | 
						|||
| 
								 | 
							
								using APT.BaseData.Domain.ApiModel.Platform;
							 | 
						|||
| 
								 | 
							
								using APT.BaseData.Domain.Entities;
							 | 
						|||
| 
								 | 
							
								using APT.BaseData.Domain.Enums.PF;
							 | 
						|||
| 
								 | 
							
								using APT.BaseData.Domain.IServices.FM;
							 | 
						|||
| 
								 | 
							
								using APT.Infrastructure.Api;
							 | 
						|||
| 
								 | 
							
								using APT.Infrastructure.Api.Redis;
							 | 
						|||
| 
								 | 
							
								using APT.Infrastructure.Core;
							 | 
						|||
| 
								 | 
							
								using APT.Utility;
							 | 
						|||
| 
								 | 
							
								using Newtonsoft.Json;
							 | 
						|||
| 
								 | 
							
								using System;
							 | 
						|||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						|||
| 
								 | 
							
								using System.Linq;
							 | 
						|||
| 
								 | 
							
								using static APT.BaseData.Domain.ApiModel.SocketInfo;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace APT.BaseData.Services.Services.EX
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    public static class WebSocketService
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        //private IFMNotificatoinService _notificatoinService;
							 | 
						|||
| 
								 | 
							
								        //public WebSocketService(IFMNotificatoinService notificatoinService)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //{
							 | 
						|||
| 
								 | 
							
								        //    _notificatoinService = notificatoinService;
							 | 
						|||
| 
								 | 
							
								        //}
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// webscoket 打开
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="clientInfo"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static WebSocketResponseInfo OnOpenWebSocket(WebSocketClientInfo clientInfo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            Console.WriteLine($"Socket连接:{clientInfo?.UserId}");
							 | 
						|||
| 
								 | 
							
								            //clientInfo.WebSocketConnection.Close();
							 | 
						|||
| 
								 | 
							
								            //var tenant = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<TenantInfo>();
							 | 
						|||
| 
								 | 
							
								            //clientInfo.Tenant = tenant?.Name;
							 | 
						|||
| 
								 | 
							
								            //BaseFilter baseFilter = new BaseFilter();
							 | 
						|||
| 
								 | 
							
								            //baseFilter.IgnoreOrgRule = true;
							 | 
						|||
| 
								 | 
							
								            //baseFilter.IsMultipleDb = true;
							 | 
						|||
| 
								 | 
							
								            //var commonService = ServiceLocator.Instance.GetService<ICommonService>();
							 | 
						|||
| 
								 | 
							
								            //var consumeService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<ISOConsumeChargingOrderService>();
							 | 
						|||
| 
								 | 
							
								            //var cueerntInfo = commonService.GetEntity<T_CP_CHARGING_PILE>(x=>x.CURRENT_CLIENT_ID == clientInfo.UserId, baseFilter);//当前占用充电桩          
							 | 
						|||
| 
								 | 
							
								            //if (cueerntInfo!=null && cueerntInfo.CURRENT_CLIENT_ID!=null)
							 | 
						|||
| 
								 | 
							
								            //{
							 | 
						|||
| 
								 | 
							
								            //    var user = commonService.GetEntity<T_OP_CLINET_OPENID>(x => x.CLIENT_ID == clientInfo.UserId, baseFilter);
							 | 
						|||
| 
								 | 
							
								            //    baseFilter.Sort = "CREATE_TIME";
							 | 
						|||
| 
								 | 
							
								            //    baseFilter.Order = DbOrder.DESC;
							 | 
						|||
| 
								 | 
							
								            //    var order = commonService.GetEntity<T_SO_CHARGING_ORDER>(x => x.OPEN_ID == user.OPEN_ID && x.CHARGING_PILE_ID == cueerntInfo.ID, baseFilter, "Nav_ChargingPile");            
							 | 
						|||
| 
								 | 
							
								            //    if (order!=null && order.ORDER_STATUS == (int)FCOrderStatus.充电中)//充电中
							 | 
						|||
| 
								 | 
							
								            //    {
							 | 
						|||
| 
								 | 
							
								            //        SocketData socketData = new SocketData()
							 | 
						|||
| 
								 | 
							
								            //        {
							 | 
						|||
| 
								 | 
							
								            //            status = (int)MQChargingStatusEnum.充电进行
							 | 
						|||
| 
								 | 
							
								            //        };
							 | 
						|||
| 
								 | 
							
								            //        OrderReallyData orderReallyData = new OrderReallyData()
							 | 
						|||
| 
								 | 
							
								            //        {
							 | 
						|||
| 
								 | 
							
								            //            code = order.CODE,
							 | 
						|||
| 
								 | 
							
								            //            chargeMode = order.CHARGE_TYPE,                    
							 | 
						|||
| 
								 | 
							
								            //        };
							 | 
						|||
| 
								 | 
							
								            //        ChargeInfo charge = new ChargeInfo()
							 | 
						|||
| 
								 | 
							
								            //        {
							 | 
						|||
| 
								 | 
							
								            //            stakeId = order.CHARGING_PILE_ID.ToString(),
							 | 
						|||
| 
								 | 
							
								            //            stakeCode = order.Nav_ChargingPile.CODE,
							 | 
						|||
| 
								 | 
							
								            //            stakeName = order.Nav_ChargingPile.NAME
							 | 
						|||
| 
								 | 
							
								            //        };
							 | 
						|||
| 
								 | 
							
								            //        if (order.CHARGE_TYPE == 1)//固定金额
							 | 
						|||
| 
								 | 
							
								            //        {
							 | 
						|||
| 
								 | 
							
								            //            orderReallyData.chargeMoney = order.CHARGE_VALUE;
							 | 
						|||
| 
								 | 
							
								            //        }
							 | 
						|||
| 
								 | 
							
								            //        else if (order.CHARGE_TYPE == 2)//固定时长
							 | 
						|||
| 
								 | 
							
								            //        {
							 | 
						|||
| 
								 | 
							
								            //            orderReallyData.chargeTime = order.CHARGE_VALUE;
							 | 
						|||
| 
								 | 
							
								            //        }
							 | 
						|||
| 
								 | 
							
								            //        orderReallyData.stake = charge;
							 | 
						|||
| 
								 | 
							
								            //        #region 计算金额/充电时长   
							 | 
						|||
| 
								 | 
							
								            //        var  model = consumeService.ConsumeOrder(order.CODE);
							 | 
						|||
| 
								 | 
							
								            //        var time = Convert.ToInt32((order.END_TIME - order.START_TIME)?.TotalMinutes);
							 | 
						|||
| 
								 | 
							
								            //        orderReallyData.time = time;
							 | 
						|||
| 
								 | 
							
								            //        orderReallyData.used = model.Order.ENERGY_USED;
							 | 
						|||
| 
								 | 
							
								            //        orderReallyData.amount = model.Order.AMOUNT;
							 | 
						|||
| 
								 | 
							
								            //        #endregion
							 | 
						|||
| 
								 | 
							
								            //        socketData.data = orderReallyData;
							 | 
						|||
| 
								 | 
							
								            //        var notificatoinService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<ISONotificatoinService>();
							 | 
						|||
| 
								 | 
							
								            //        notificatoinService.SendNotification(user.CLIENT_ID, socketData);
							 | 
						|||
| 
								 | 
							
								            //    }
							 | 
						|||
| 
								 | 
							
								            //}           
							 | 
						|||
| 
								 | 
							
								            return null;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// websocket 关闭
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="userId"></param>
							 | 
						|||
| 
								 | 
							
								        public static void OnCloseWebSocket(Guid userId, WebSocketClientInfo clientInfo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            Console.WriteLine($"Socket连接断开:{userId}");
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// websocket 信息
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="clientInfo"></param>
							 | 
						|||
| 
								 | 
							
								        /// <param name="requestInfo"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        public static WebSocketResponseInfo OnMessageWebSocket(WebSocketClientInfo clientInfo,
							 | 
						|||
| 
								 | 
							
								                WebSocketRequestInfo requestInfo)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            if (requestInfo != null)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                switch (requestInfo.TypeCode)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    case "M0002":
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            var service = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IFMNotificatoinService>();
							 | 
						|||
| 
								 | 
							
								                            var clientInfoByManu = JsonConvert.DeserializeObject<SendNotificationModel>(requestInfo.Data);
							 | 
						|||
| 
								 | 
							
								                            List<WebSocketClientInfo> ingoreClientInfos = new List<WebSocketClientInfo>();
							 | 
						|||
| 
								 | 
							
								                            ingoreClientInfos.Add(clientInfo);
							 | 
						|||
| 
								 | 
							
								                            service.SendNotification(clientInfoByManu, ingoreClientInfos);
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        break;
							 | 
						|||
| 
								 | 
							
								                    case "M0003":
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            var service = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IFMNotificatoinService>();
							 | 
						|||
| 
								 | 
							
								                            var clientInfoByManu = JsonConvert.DeserializeObject<SendNotificationModel>(requestInfo.Data);
							 | 
						|||
| 
								 | 
							
								                            List<WebSocketClientInfo> ingoreClientInfos = new List<WebSocketClientInfo>();
							 | 
						|||
| 
								 | 
							
								                            ingoreClientInfos.Add(clientInfo);
							 | 
						|||
| 
								 | 
							
								                            service.SendAlarmNotification(clientInfoByManu, ingoreClientInfos);
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        break;
							 | 
						|||
| 
								 | 
							
								                    case "P0001":
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            BaseFilter baseFilter = new BaseFilter();
							 | 
						|||
| 
								 | 
							
								                            baseFilter.IgnoreOrgRule = true;
							 | 
						|||
| 
								 | 
							
								                            baseFilter.IsMultipleDb = true;
							 | 
						|||
| 
								 | 
							
								                            var commonService = ServiceLocator.Instance.GetService<ICommonService>();
							 | 
						|||
| 
								 | 
							
								                            //var consumeService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<ISOConsumeChargingOrderService>();
							 | 
						|||
| 
								 | 
							
								                            //var cueerntInfo = commonService.GetEntity<T_CP_CHARGING_PILE>(x => x.CURRENT_CLIENT_ID == clientInfo.UserId, baseFilter);//当前占用充电桩          
							 | 
						|||
| 
								 | 
							
								                            //if (cueerntInfo != null && cueerntInfo.CURRENT_CLIENT_ID != null)
							 | 
						|||
| 
								 | 
							
								                            //{
							 | 
						|||
| 
								 | 
							
								                            //    //var user = commonService.GetEntity<T_OP_CLINET_OPENID>(x => x.CLIENT_ID == clientInfo.UserId, baseFilter);
							 | 
						|||
| 
								 | 
							
								                            //    baseFilter.Sort = "CREATE_TIME";
							 | 
						|||
| 
								 | 
							
								                            //    baseFilter.Order = DbOrder.DESC;
							 | 
						|||
| 
								 | 
							
								                            //    var order = commonService.GetEntity<T_SO_CHARGING_ORDER>(x => x.CLIENT_ID == clientInfo.UserId.ToString() && x.CHARGING_PILE_ID == cueerntInfo.ID, baseFilter, "Nav_ChargingPile");
							 | 
						|||
| 
								 | 
							
								                            //    if (order != null && order.ORDER_STATUS == (int)FCOrderStatus.充电中)//充电中
							 | 
						|||
| 
								 | 
							
								                            //    {
							 | 
						|||
| 
								 | 
							
								                            //        SocketData socketData = new SocketData()
							 | 
						|||
| 
								 | 
							
								                            //        {
							 | 
						|||
| 
								 | 
							
								                            //            status = (int)MQChargingStatusEnum.充电进行
							 | 
						|||
| 
								 | 
							
								                            //        };
							 | 
						|||
| 
								 | 
							
								                            //        OrderReallyData orderReallyData = new OrderReallyData()
							 | 
						|||
| 
								 | 
							
								                            //        {
							 | 
						|||
| 
								 | 
							
								                            //            code = order.CODE,
							 | 
						|||
| 
								 | 
							
								                            //            tenantCode = order.CODE.Substring(2, 4),
							 | 
						|||
| 
								 | 
							
								                            //            chargeMode = order.CHARGE_TYPE,
							 | 
						|||
| 
								 | 
							
								                            //            orderStatus = order.ORDER_STATUS
							 | 
						|||
| 
								 | 
							
								                            //        };
							 | 
						|||
| 
								 | 
							
								                            //        Domain.ApiModel.SocketInfo.ChargeInfo charge = new Domain.ApiModel.SocketInfo.ChargeInfo()
							 | 
						|||
| 
								 | 
							
								                            //        {
							 | 
						|||
| 
								 | 
							
								                            //            stakeId = order.CHARGING_PILE_ID.ToString(),
							 | 
						|||
| 
								 | 
							
								                            //            stakeCode = order.Nav_ChargingPile.CODE,
							 | 
						|||
| 
								 | 
							
								                            //            stakeName = order.Nav_ChargingPile.NAME
							 | 
						|||
| 
								 | 
							
								                            //        };
							 | 
						|||
| 
								 | 
							
								                            //        if (order.CHARGE_TYPE == 1)//固定金额
							 | 
						|||
| 
								 | 
							
								                            //        {
							 | 
						|||
| 
								 | 
							
								                            //            orderReallyData.chargeMoney = order.CHARGE_VALUE;
							 | 
						|||
| 
								 | 
							
								                            //        }
							 | 
						|||
| 
								 | 
							
								                            //        else if (order.CHARGE_TYPE == 2)//固定时长
							 | 
						|||
| 
								 | 
							
								                            //        {
							 | 
						|||
| 
								 | 
							
								                            //            orderReallyData.chargeTime = order.CHARGE_VALUE;
							 | 
						|||
| 
								 | 
							
								                            //        }
							 | 
						|||
| 
								 | 
							
								                            //        orderReallyData.stake = charge;
							 | 
						|||
| 
								 | 
							
								                            //        #region 计算金额/充电时长   
							 | 
						|||
| 
								 | 
							
								                            //        var model = consumeService.ConsumeOrder(order.CODE);
							 | 
						|||
| 
								 | 
							
								                            //        var time = Convert.ToInt32((order.END_TIME - order.START_TIME)?.TotalMinutes);
							 | 
						|||
| 
								 | 
							
								                            //        orderReallyData.time = time;
							 | 
						|||
| 
								 | 
							
								                            //        orderReallyData.used = model.Order.ENERGY_USED;
							 | 
						|||
| 
								 | 
							
								                            //        orderReallyData.amount = model.Order.AMOUNT;
							 | 
						|||
| 
								 | 
							
								                            //        #endregion
							 | 
						|||
| 
								 | 
							
								                            //        socketData.data = orderReallyData;
							 | 
						|||
| 
								 | 
							
								                            //        var notificatoinService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IFMNotificatoinService>();
							 | 
						|||
| 
								 | 
							
								                            //        notificatoinService.SendNotification((Guid)clientInfo.UserId, socketData);
							 | 
						|||
| 
								 | 
							
								                            //    }
							 | 
						|||
| 
								 | 
							
								                            //}
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        break;
							 | 
						|||
| 
								 | 
							
								                    case "MQ02":
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            BaseFilter filter = new BaseFilter();
							 | 
						|||
| 
								 | 
							
								                            filter.Sort = "CREATE_TIME";
							 | 
						|||
| 
								 | 
							
								                            filter.Order = DbOrder.DESC;
							 | 
						|||
| 
								 | 
							
								                            filter.IgnoreOrgRule = true;
							 | 
						|||
| 
								 | 
							
								                            filter.IsMultipleDb = true;
							 | 
						|||
| 
								 | 
							
								                            var commonService = ServiceLocator.Instance.GetService<ICommonService>();
							 | 
						|||
| 
								 | 
							
								                            //var endInfo = JsonConvert.DeserializeObject<EndStake>(requestInfo.Data);
							 | 
						|||
| 
								 | 
							
								                            //var order = commonService.GetEntity<T_SO_CHARGING_ORDER>(x => x.CODE == endInfo.code, filter, "Nav_ChargingPile");
							 | 
						|||
| 
								 | 
							
								                            //var orgId = (Guid)order.ORG_ID;
							 | 
						|||
| 
								 | 
							
								                            //#region 发送指令
							 | 
						|||
| 
								 | 
							
								                            //MqttMesage mqttMesage = new MqttMesage()
							 | 
						|||
| 
								 | 
							
								                            //{
							 | 
						|||
| 
								 | 
							
								                            //    cmd = ((int)PFThemeTypeEnum.P_结束充电).ToString().PadLeft(3, '0'),
							 | 
						|||
| 
								 | 
							
								                            //    title = order.Nav_ChargingPile.CODE,
							 | 
						|||
| 
								 | 
							
								                            //    charge_no = order.CODE,
							 | 
						|||
| 
								 | 
							
								                            //    //terminal_sn = order.Nav_ChargingPile.SEQUENCE,
							 | 
						|||
| 
								 | 
							
								                            //    //terminal_no = order.Nav_ChargingPile.CODE,
							 | 
						|||
| 
								 | 
							
								                            //    timestamp = DataHelper.GetTimeSpanFrom1970Ticks(DateTime.Now)
							 | 
						|||
| 
								 | 
							
								                            //};
							 | 
						|||
| 
								 | 
							
								                            //filter.OrgId = order.ORG_ID;
							 | 
						|||
| 
								 | 
							
								                            //var mqConfs = commonService.GetEntitiesByRedis<T_PF_MQTT_CONFIG>(null, filter, "", "Nav_MqttConfigTheme");
							 | 
						|||
| 
								 | 
							
								                            //if (mqConfs == null || !mqConfs.Any())
							 | 
						|||
| 
								 | 
							
								                            //    throw new Exception("主题配置不存在");
							 | 
						|||
| 
								 | 
							
								                            //var mqConf = mqConfs.FirstOrDefault();
							 | 
						|||
| 
								 | 
							
								                            //BaseFilter basefilter = new BaseFilter();
							 | 
						|||
| 
								 | 
							
								                            //basefilter.OrgId = mqConf.ORG_ID;
							 | 
						|||
| 
								 | 
							
								                            //basefilter.IsSpecifyDb = true;
							 | 
						|||
| 
								 | 
							
								                            //basefilter.SpecifyDbConn = order.DbConn;
							 | 
						|||
| 
								 | 
							
								                            //var org = commonService.GetEntity<T_FM_ORGANIZATION>(null, basefilter);
							 | 
						|||
| 
								 | 
							
								                            //var mqName = org.TENANT_CODE + "_" + mqConf.NAME;
							 | 
						|||
| 
								 | 
							
								                            //CsRedisManager.GetClient().RPush<MqttMesage>(mqName.GetPubRedisKey(), mqttMesage);
							 | 
						|||
| 
								 | 
							
								                            //#endregion
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                        break;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            return null;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |