public static RemoteDispatchDto ToRemoteDispatchDto(this Sys_RemoteDispatch ms)
 {
     return(new RemoteDispatchDto
     {
         Id = ms.Key, ActivePower = ms.ActivePower, ControlMode = ms.ControlMode, CreateTime = ms.CreateTime, DELETE_FLAG = ms.DELETE_FLAG, ReactivePower = ms.ReactivePower, SN = ms.SN, SOC = ms.SOC, Status = ms.Status, UpdateTime = ms.UpdateTime, UserName = ms.UserName
     });
 }
        public OperationResult <Sys_RemoteDispatch> AddRemoteDispatch(string api_Account, long timeStamp, string sign, string token, string sn, int activePower, int reactivePower, decimal soc, int status, int controlMode, string ipAddress)
        {
            Guid key = Guid.Empty;

            Guid.TryParse(token, out key);
            var userCache = TokenService.GetCache(key);

            bool flag = false;

            #region 判断
            if (userCache == null || userCache.ExpirationTime < DateTime.Now)
            {
                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_LoginFailed));
            }

            if (userCache.ipAddress != ipAddress)
            {
                var ul = new SYS_LOG {
                    Key = Guid.NewGuid(), CREATE_DATETIME = DateTime.Now, THREAD = OperationCode.Error_UserChangesDevice.ToString(), LEVEL = LogLevel.ERROR.ToString(), LOGGER = "Services.RemoteDispatchService", MESSAGE = "用户更换设备", EXCEPTION = "ipAddress_1:" + userCache.ipAddress + ",ipAddress:" + ipAddress, CREATE_ACCOUNT = "", LOG_CONTENT = ""
                };
                _sysLogService.Add(ul);
                _sysLogService.Save();

                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_UserChangesDevice));
            }

            var query = from a1 in _sys_ROLE.GetAll()
                        join r1 in _sys_ROLEUSER.GetAll() on a1.Key equals r1.ROLEID
                        where r1.USERID == userCache.UserId
                        select new
            {
                userType = a1.ROLENAME
            };

            List <string> user_Types = new List <string>();
            foreach (var q in query)
            {
                user_Types.Add(q.userType);
            }

            if (!checkSignForRemoteDispatch(api_Account, timeStamp, sign, token, sn, activePower, reactivePower, soc, status, controlMode))
            {
                string secretKey = _cryptoService.GetSecretKey(api_Account);
                var    ul        = new SYS_LOG {
                    Key = Guid.NewGuid(), CREATE_DATETIME = DateTime.Now, THREAD = OperationCode.Error_Sign.ToString(), LEVEL = LogLevel.ERROR.ToString(), LOGGER = "Services.RemoteDispatchService", MESSAGE = "签名错误", EXCEPTION = "api_Account:" + api_Account + ",timeStamp:" + timeStamp + ",sign:" + sign + ",token:" + token + ", sn:" + sn + ",ipAddress:" + ipAddress + ",SecretKey:" + secretKey, CREATE_ACCOUNT = "", LOG_CONTENT = ""
                };
                _sysLogService.Add(ul);
                _sysLogService.Save();

                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_Sign));
            }

            if (!_parameterValidateService.CheckTimestamp(timeStamp))
            {
                var ul = new SYS_LOG {
                    Key = Guid.NewGuid(), CREATE_DATETIME = DateTime.Now, THREAD = OperationCode.Error_TimeStamp.ToString(), LEVEL = LogLevel.ERROR.ToString(), LOGGER = "Services.RemoteDispatchService", MESSAGE = "时间戳错误", EXCEPTION = "api_Account:" + api_Account + ",timeStamp:" + timeStamp + ",sign:" + sign + ",token:" + token + ", sn:" + sn + ",ipAddress:" + ipAddress, CREATE_ACCOUNT = "", LOG_CONTENT = ""
                };
                _sysLogService.Add(ul);
                _sysLogService.Save();

                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_TimeStamp));
            }

            if (!_parameterValidateService.ApiAccountExist(api_Account))
            {
                var ul = new SYS_LOG {
                    Key = Guid.NewGuid(), CREATE_DATETIME = DateTime.Now, THREAD = OperationCode.Error_ApiAccountNotExist.ToString(), LEVEL = LogLevel.ERROR.ToString(), LOGGER = "Services.RemoteDispatchService", MESSAGE = "api账号不存在", EXCEPTION = "api_Account:" + api_Account + ",timeStamp:" + timeStamp + ",sign:" + sign + ",token:" + token + ", sn:" + sn + ",ipAddress:" + ipAddress, CREATE_ACCOUNT = "", LOG_CONTENT = ""
                };
                _sysLogService.Add(ul);
                _sysLogService.Save();

                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_ApiAccountNotExist));
            }
            #endregion

            SYS_USER user = _userRepository.GetAll().Where(x => x.Key == userCache.UserId).FirstOrDefault();

            #region 获取用户系统列表
            int pIndex               = 1;
            int pSize                = int.MaxValue;
            int totalCount           = 0;
            IList <VT_SYSTEM> result = new List <VT_SYSTEM>();

            if (user_Types.Contains("customer"))
            {
                result = GetSystemByUser(pIndex, pSize, userCache.UserId, this.CompanyId, out totalCount);
            }
            else if (user_Types.Contains("installer"))
            {
                if (user != null)
                {
                    result = GetSystemByInstaller(pIndex, pSize, user.LICNO, this.CompanyId, out totalCount);
                }
            }
            else if (user_Types.Contains("servicer"))
            {
                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_NoPermissionsToQuery));
            }
            else if (user_Types.Contains("admin"))
            {
                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_NoPermissionsToQuery));
            }
            else if (user_Types.Contains("systemmanager"))
            {
                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_NoPermissionsToQuery));
            }
            else if (user_Types.Contains("reseller"))
            {
                result = GetSystemByReseller(pIndex, pSize, userCache.UserId, this.CompanyId, out totalCount);
            }
            else if (user_Types.Contains("servicepartner"))
            {
                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_NoPermissionsToQuery));
            }

            if (result == null || result.Count == 0)
            {
                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_NoPermissionsToQuery));
            }
            #endregion

            if (!string.IsNullOrWhiteSpace(sn))
            {
                if (_snRepository.GetAll().Where(x => x.SN_NO == sn.Trim() && x.CompanyId == this.CompanyId && x.DELETE_FLAG == 0).FirstOrDefault() == null)
                {
                    var ul = new SYS_LOG {
                        Key = Guid.NewGuid(), CREATE_DATETIME = DateTime.Now, THREAD = OperationCode.Error_SNNotExist.ToString(), LEVEL = LogLevel.ERROR.ToString(), LOGGER = "Services.RemoteDispatchService", MESSAGE = "sn不存在", EXCEPTION = "api_Account:" + api_Account + ",timeStamp:" + timeStamp + ",sign:" + sign + ",token:" + token + ", sn:" + sn + ",ipAddress:" + ipAddress, CREATE_ACCOUNT = "", LOG_CONTENT = ""
                    };
                    _sysLogService.Add(ul);
                    _sysLogService.Save();

                    return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_SNNotExist));
                }

                if (result.Where(x => x.SYS_SN == sn).Count() == 0)
                {
                    string username = user == null ? "" : user.USERNAME;
                    var    ul       = new SYS_LOG {
                        Key = Guid.NewGuid(), CREATE_DATETIME = DateTime.Now, THREAD = OperationCode.Error_NoPermissionsToQuery.ToString(), LEVEL = LogLevel.ERROR.ToString(), LOGGER = "Services.RemoteDispatchService", MESSAGE = "用户无此权限,调取用户:" + username, EXCEPTION = "api_Account:" + api_Account + ",timeStamp:" + timeStamp + ",sign:" + sign + ",token:" + token + ", sn:" + sn + ",ipAddress:" + ipAddress, CREATE_ACCOUNT = "", LOG_CONTENT = ""
                    };
                    _sysLogService.Add(ul);
                    _sysLogService.Save();

                    return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_NoPermissionsToQuery));
                }

                Sys_RemoteDispatch rd = new Sys_RemoteDispatch();
                rd.Key           = Guid.NewGuid();
                rd.SN            = sn;
                rd.UserName      = user.USERNAME;
                rd.ActivePower   = activePower;
                rd.ReactivePower = reactivePower;
                rd.SOC           = soc;
                rd.Status        = status;
                rd.ControlMode   = controlMode;
                rd.DELETE_FLAG   = 0;
                rd.CreateTime    = DateTime.Now;

                try
                {
                    _remotedispatchRepository.Add(rd);
                    _remotedispatchRepository.Save();
                    flag = true;
                }
                catch
                {
                    flag = false;
                }
            }
            else
            {
                if (user != null)
                {
                    IList <Sys_RemoteDispatch> rDList = new List <Sys_RemoteDispatch>();

                    foreach (var item in result)
                    {
                        Sys_RemoteDispatch rd = new Sys_RemoteDispatch();
                        rd.Key           = Guid.NewGuid();
                        rd.SN            = item.SYS_SN;
                        rd.UserName      = user.USERNAME;
                        rd.ActivePower   = activePower;
                        rd.ReactivePower = reactivePower;
                        rd.SOC           = soc;
                        rd.Status        = status;
                        rd.ControlMode   = controlMode;
                        rd.DELETE_FLAG   = 0;
                        rd.CreateTime    = DateTime.Now;

                        rDList.Add(rd);
                    }

                    try
                    {
                        _remotedispatchRepository.AddBulk(rDList);
                        _remotedispatchRepository.Save();
                        flag = true;
                    }
                    catch
                    {
                        flag = false;
                    }
                }
            }

            if (flag)
            {
                var ul = new SYS_LOG {
                    Key = Guid.NewGuid(), CREATE_DATETIME = DateTime.Now, THREAD = OperationCode.Success.ToString(), LEVEL = LogLevel.INFO.ToString(), LOGGER = "Services.RemoteDispatchService", MESSAGE = "命令发送成功", EXCEPTION = "api_Account:" + api_Account + ",timeStamp:" + timeStamp + ",sign:" + sign + ",token:" + token + ", sn:" + sn + ",ipAddress:" + ipAddress + ",activePower:" + activePower + ",reactivePower:" + reactivePower + ",soc:" + soc + ",status:" + status + ",controlMode:" + controlMode, CREATE_ACCOUNT = user.USERNAME, LOG_CONTENT = ""
                };
                _sysLogService.Add(ul);
                _sysLogService.Save();

                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Success));
            }
            else
            {
                var ul = new SYS_LOG {
                    Key = Guid.NewGuid(), CREATE_DATETIME = DateTime.Now, THREAD = OperationCode.Error_SendCommandFailed.ToString(), LEVEL = LogLevel.ERROR.ToString(), LOGGER = "Services.RemoteDispatchService", MESSAGE = "命令发送失败", EXCEPTION = "api_Account:" + api_Account + ",timeStamp:" + timeStamp + ",sign:" + sign + ",token:" + token + ", sn:" + sn + ",ipAddress:" + ipAddress, CREATE_ACCOUNT = "", LOG_CONTENT = ""
                };
                _sysLogService.Add(ul);
                _sysLogService.Save();

                return(new OperationResult <Sys_RemoteDispatch>(OperationCode.Error_SendCommandFailed));
            }
        }