using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Enums;
using APT.BaseData.Domain.Msg;
using APT.Infrastructure.Core;
using APT.MS.Domain.ApiModel;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.IServices.FM;
using APT.Utility;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.IdentityModel.Tokens;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Threading;
using APT.Utility;
using APT.BaseData.Domain.ApiModel;
using APT.PF.WebApi.Models;
using APT.Infrastructure.Api.Redis;
using APT.BaseData.Domain.Enums.PF;
using Newtonsoft.Json;
using APT.BaseData.Domain.Entities.NW;
using APT.Infrastructure.Api;
using IdentityModel.Client;
using System.Threading.Tasks;
using APT.MS.Domain.ApiModel.PF;
using APT.MS.Domain.Entities.BI;
using APT.Migrations;
using APT.BaseData.Domain.Entities.OP;
namespace APT.PF.WebApiControllers.Api.PF
{
/// 登入
[Route("api/PF/Login")]
public class LoginController : CommonApiController
{
private const string SUPER_PASSWORD = "@MH!20220101";
[HttpGet, Route("InitDataBase")]
public JsonActionResult InitDataBase()
{
return SafeExecute(() =>
{
var orgEntites = this.GetEntities(null, new BaseFilter());
if (!orgEntites.Any())
{
T_FM_ORGANIZATION org = new T_FM_ORGANIZATION();
org.CODE = "001";
org.NAME = "默认组织";
this.AddEntity(org);
}
var userEntites = this.GetEntities(null, new BaseFilter());
if (!userEntites.Any())
{
var org = this.GetEntity(t => true);
if (org == null)
throw new Exception("设置组织");
T_FM_USER user = new T_FM_USER();
user.CODE = "admin";
user.NAME = "Admin";
user.ORG_ID = org.ID;
user.PASSWORD = "E10ADC3949BA59ABBE56E057F20F883E";//默认密码为123456
this.AddEntity(user);
}
return true;
});
}
///
/// 获取子菜单
///
///
///
private void GetChildrenMenu(List menus, UserLoginMenuModel m)
{
var tmps = menus.Where(t => t.PARENT_ID == m.Menu.ID).OrderBy(t => t.NUM).ToList();
if (tmps != null && tmps.Any())
{
foreach (var item in tmps)
{
UserLoginMenuModel cm = new UserLoginMenuModel();
cm.Menu = item;
GetChildrenMenu(menus, cm);
if (cm.Menu.MENU_FORM_ID != null || cm.ChildMenus.Count > 0)
m.ChildMenus.Add(cm);
}
}
}
///
/// 获取子菜单
///
///
///
private void GetClientChildrenMenu(List menus, UserClientLoginMenuModel m, List pageCustoms)
{
var tmps = menus.Where(t => t.PARENT_ID == m.Menu.ID).OrderBy(t => t.NUM).ToList();
if (tmps != null && tmps.Any())
{
foreach (var item in tmps)
{
if (item.MENU_FORM_ID != null)
{
var pageCustom = pageCustoms == null ? null : pageCustoms.Where(t => t.PAGE_FORM_ID == item.MENU_FORM_ID).FirstOrDefault();
if (pageCustom != null)
item.VIRTUAL_URL = pageCustom.COMPONENT_NAME;//URL
}
UserClientLoginMenuModel cm = new UserClientLoginMenuModel();
cm.Menu = item;
GetClientChildrenMenu(menus, cm, pageCustoms);
m.ChildMenus.Add(cm);
}
}
}
///
/// 获取子菜单
///
///
///
///
private void GetAppChildrenMenu(List menus, UserAppLoginMenuModel m, List pageCustoms)
{
var tmps = menus.Where(t => t.PARENT_ID == m.Menu.ID).OrderBy(t => t.NUM).ToList();
if (tmps != null && tmps.Any())
{
foreach (var item in tmps)
{
if (item.MENU_FORM_ID != null)
{
var pageCustom = pageCustoms == null ? null : pageCustoms.Where(t => t.PAGE_FORM_ID == item.MENU_FORM_ID).FirstOrDefault();
if (pageCustom != null)
item.VIRTUAL_URL = pageCustom.COMPONENT_NAME;//URL
}
UserAppLoginMenuModel cm = new UserAppLoginMenuModel();
cm.Menu = item;
GetAppChildrenMenu(menus, cm, pageCustoms);
m.ChildMenus.Add(cm);
}
}
}
public const string VERFYCODE = "VerifyCode_";
[HttpPost, Route("OpLogin")]
public JsonActionResult OpLogin([FromBody] KeywordFilter filter)
{
return SafeExecute(() =>
{
string userCode = filter.Parameter1.ToUpper();
string userPassword = filter.Parameter2;
if (string.IsNullOrEmpty(userCode))
{
throw new Exception(ErrMsg.FM_NO_USER);
}
if (string.IsNullOrEmpty(userPassword))
{
throw new Exception(ErrMsg.FM_NO_PWD);
}
if (userCode != "SUPADMIN")
{
throw new Exception("只允许超级管理员登录");
}
var usr = this.GetEntity(i => i.CODE == userCode);
if (usr == null)
{
throw new Exception("用户不存在");
}
if (usr.PASSWORD.ToUpper() != userPassword.ToUpper())
{
throw new Exception("密码不正确");
}
return true;
});
}
///
/// 后台登入/APP登录
///
///
/// Keyword:用户ID
/// Parameter1:用户Code
/// Parameter2:密码
/// Parameter3:平台类型
/// Parameter4:Orgid
/// Parameter5://表单配置版本,取消
/// Parameter6:手机验证码
/// Parameter7:随机数
///
///
[HttpPost, Route("Login")]
public JsonActionResult Login([FromBody] KeywordFilter filter)
{
return base.SafeExecute(() =>
{
try
{
string telnetCode = Request.Headers["Tenant"];
if (string.IsNullOrEmpty(telnetCode))
{
throw new Exception("企业信息未成功加载,请重试!");
}
if (filter == null)
{
throw new Exception("参数为空,请重试!");
}
filter.OrgId = Guid.Parse(Request.Headers["orgId"].ToString());
var md5SuperPwd = DataHelper.MD5(SUPER_PASSWORD);
UserLoginBaseModel result = new UserLoginModel();
string userId = filter == null ? string.Empty : filter.Keyword;
int platformType = filter == null ? (int)PFPlatTypeEnum.后台 : string.IsNullOrEmpty(filter.Parameter3)
? (int)PFPlatTypeEnum.后台 : Convert.ToInt32(filter.Parameter3);
Guid orgId = filter.OrgId??Guid.Empty;
#region 登录优化 orgId
#endregion
T_FM_USER user = null;
if (platformType == (int)PFPlatTypeEnum.后台)
{
//if (string.IsNullOrEmpty(filter.Parameter4))
// throw new Exception(ErrMsg.FM_NO_ORG);
if (string.IsNullOrEmpty(userId))
{
string userCode = filter.Parameter1;
string userPassword = filter.Parameter2.ToUpper();
string userPasswordLower = filter.Parameter2.ToLower();
if (string.IsNullOrEmpty(userCode))
throw new Exception(ErrMsg.FM_NO_USER);
if (string.IsNullOrEmpty(userPassword))
throw new Exception(ErrMsg.FM_NO_PWD);
var userFilter = new BaseFilter();
userFilter.SelectField = new string[] { "CODE", "Nav_ProdutionUnit.Nav_Enums.VALUE", "DEPARTMENT_ID" };
userFilter.SpecifyTenant = telnetCode;
userFilter.OrgId = filter.OrgId;
Expression> uExpress = t => t.CODE == userCode;
if (userPassword != md5SuperPwd && userPasswordLower != md5SuperPwd)
{
uExpress = uExpress.And(t => t.PASSWORD == userPassword || t.PASSWORD == userPasswordLower);
}
user = this.GetEntity(uExpress, userFilter);
//#region 重写 user = this.GetEntity(uExpress, userFilter);
//var SelectField = new string[] { "CODE", "Nav_ProdutionUnit.Nav_Enums.VALUE", "DEPARTMENT_ID" };
//string conn = string.Empty;
//using (var context = new MigrationContext(ConfigurationManager.ConnectionStrings["default"]))
//{
// var tenant = context.GetEntity(i => i.CODE == telnetCode, new string[] { "Nav_TenantDB" });
// if (tenant.Nav_TenantDB != null)
// {
// conn = tenant.Nav_TenantDB.DB_CONN;
// if (ConfigurationManager.AppSettings["Env"] == ((int)BaseData.Domain.Enums.OP.EnvType.外网).ToString())
// {
// conn = tenant.Nav_TenantDB.DB_CONN_WAN;
// }
// }
//}
////没找到用户对应数据库
//if (string.IsNullOrEmpty(conn))
//{
// throw new Exception("获取用户公司信息失败!");
//}
//using (var contextSub = new MigrationContext(conn))
//{
// user = contextSub.GetEntity(uExpress, SelectField);
//}
//#endregion
if (user == null)
throw new Exception(ErrMsg.PM_PSD_ERROR);
user.MineType = string.Join(",", user.Nav_ProdutionUnit?.Select(i => i?.Nav_Enums?.VALUE));
userId = user.ID.GetString();
}
#region 手机验证码
if (Convert.ToBoolean(filter.Parameter6))
{
var verCode = CsRedisManager.StringGet>(SessionKey.VERIFY_MESSAGE_CODE + userId.ToString());
if (verCode == null)
throw new Exception("手机验证码不存在!");
if (filter.Parameter7.ToUpper() != verCode["code"].ToUpper())
throw new Exception("手机验证码不正确!");
}
#endregion
}
else if (platformType == (int)PFPlatTypeEnum.APP)
{
if (string.IsNullOrEmpty(userId))
{
string userCode = filter.Parameter1;//手机号
string userPassword = filter.Parameter2.ToUpper();//密码
string userPasswordLower = filter.Parameter2.ToLower();
if (string.IsNullOrEmpty(userCode))
throw new Exception(ErrMsg.FM_NO_USER_PHONE);
Expression> expression = t => t.PHONE == userCode || t.CODE == userCode;
if (Convert.ToBoolean(filter.Parameter6))//手机验证码验证登录
{
var verCode = CsRedisManager.StringGet>(SessionKey.VERIFY_MESSAGE_CODE + userCode.ToString());//手机号
if (verCode == null)
throw new Exception("手机验证码不存在!");
if (filter.Parameter7.ToUpper() != verCode["code"].ToUpper())
throw new Exception("手机验证码不正确!");
}
else//密码登录
{
if (string.IsNullOrEmpty(userPassword))
throw new Exception(ErrMsg.FM_NO_PWD);
//expression = expression.And(t => (t.PASSWORD == userPassword || t.PASSWORD == userPasswordLower));
// Expression> uExpress = t => t.CODE == userCode;
if (userPassword != md5SuperPwd && userPasswordLower != md5SuperPwd)
{
expression = expression.And(t => t.PASSWORD == userPassword || t.PASSWORD == userPasswordLower);
}
}
var userFilter = new BaseFilter(orgId);
//userFilter.IgnoreOrgRule = true;
//userFilter.IsMultipleDb = true;//多库查询
userFilter.OrgId = orgId;
userFilter.SelectField = new string[] { "CODE", "Nav_ProdutionUnit.Nav_Enums.VALUE", "DEPARTMENT_ID" };
user = this.GetEntity(expression, userFilter);
if (user == null)
throw new Exception(ErrMsg.PM_PSD_ERROR);
if (user.PROJECT_ID.HasValue)
{
user.MineType = string.Join(",", user.Nav_ProdutionUnit?.Select(i => i?.Nav_Enums.VALUE));
}
//filter.OrgId = user.ORG_ID;
//filter.IsSpecifyDb = true;
//filter.SpecifyDbConn = user.DbConn;//切换数据库
userId = user.ID.GetString();
}
}
var userService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService();
//var useRoleModel = userService.GetRolesByUser(new Guid(userId), filter);//获取角色权限
var useRoleModel = userService.NewGetRolesByUser(new Guid(userId), filter);//获取角色权限
var teamFilter = new BaseFilter(filter.GetOrgId());
//teamFilter.SelectField = new string[] { "ID" };
var team = this.GetEntity(i => i.Nav_TeamPersons.Any(x => x.Nav_Person.Nav_User.ID == new Guid(userId)), teamFilter);
//"Nav_TeamPersons.Nav_Person.Nav_Post", "Nav_TeamPersons.Nav_Person.Nav_User");
if (useRoleModel == null)
return null;
if (useRoleModel.User.ENABLE_STATUS == (int)FMEnableStatusEnum.禁用)
throw new Exception(ErrMsg.FM_USER_UNABLE);
/*平台登录 注释 20200816
if (isPlatformLogin && string.Compare(useRoleModel.User.CODE, "Admin", true) != 0)
throw new Exception("只允许集团管理员登录平台");
*/
if (useRoleModel.User.CODE.Contains("System"))
throw new Exception("不允许系统账号手动登入");
if (useRoleModel.User.Nav_Org != null && useRoleModel.User.Nav_Org.ENABLE_STATUS == 1)
throw new Exception("当前组织已停用不允许登入");
if (platformType == (int)PFPlatTypeEnum.客户端)
result = new UserClientLoginModel();
else if (platformType == (int)PFPlatTypeEnum.APP)
result = new UserAppLoginModel();
result.User = useRoleModel.User;
result.User.Team = team;
BaseFilter baseFilter = new BaseFilter();
baseFilter.Order = DbOrder.ASC;
//baseFilter.OrgType = FilterOrgTypeEnum.仅本组织;
baseFilter.IsParentData = true;
baseFilter.OrgId = filter.OrgId;
baseFilter.Level = -1;
baseFilter.IgnoreOrgRule = true;
//baseFilter.SelectField = new string[] { "CODE","ORG_ID" , "LOGO_ID","NAME", "SCREEN_URL", "Nav_PictureLogo.CODE", "Nav_PictureLogo.NAME", "SCREEN_TITLE", "SYS_NAME", "SLOGAN", "Nav_HomeHmi.ID" };
result.BaseConfig = this.GetEntity(null, baseFilter, "Nav_PictureLogo");
//result.BaseConfig = this.GetEntitiesByRedis(x => x.ID == orgId, new BaseFilter(orgId), "CURRENT_VOLTAGE_HMI_ID", "Nav_PictureLogo").FirstOrDefault();
baseFilter.Sort = "NUM";
//Dictionary permissionFormIds = new Dictionary();
//List stages = new List();
List roleList = new List();
List menuIds = new List();
//获取角色信息
if (useRoleModel.Roles != null && useRoleModel.Roles.Any())
{
foreach (var item in useRoleModel.Roles)
{
if (item.PLATFORM_TYPE != platformType) continue;//剔除不同平台角色
if (item.ROLE_TYPE == (int)FMRoleTypeEnum.管理角色)
{
result.UserType = (int)PFUserTypeEnum.管理员;
menuIds.Clear();
break;
}
else if (item.Nav_MenuPermissions != null && item.Nav_MenuPermissions.Count != 0)
{
var menus = item.Nav_MenuPermissions.Select(i => i.MENU_ID ?? Guid.Empty).Distinct().ToList();
menuIds.AddRange(menus);
menuIds = menuIds.Distinct().ToList();
}
roleList.Add(item);
}
}
result.Roles = roleList;
//result.CanMenuRework = roleList.Any(t => t.CAN_CHANGE_REWORK);
//获取授权信息
if (useRoleModel.Nav_RolePerm != null)//剔除不同平台表单
{
var srcRolePerm = useRoleModel.Nav_RolePerm;
RolePerm rolePerm = new RolePerm();
if (srcRolePerm.Nav_RolePermForms != null && srcRolePerm.Nav_RolePermForms.Any())
{
//var tmpList = srcRolePerm.Nav_RolePermForms.Where(t => t.Nav_PermForm != null && t.Nav_PermForm.PLATFORM_TYPE == platformType).ToList();
//if (tmpList.Any())
srcRolePerm.Nav_RolePermForms.ForEach(t => rolePerm.Nav_RolePermForms.Add(t));
}
if (srcRolePerm.Nav_RolePermPanels != null && srcRolePerm.Nav_RolePermPanels.Any())
srcRolePerm.Nav_RolePermPanels.ForEach(t => rolePerm.Nav_RolePermPanels.Add(t));
if (srcRolePerm.Nav_RolePermWorkStages != null && srcRolePerm.Nav_RolePermWorkStages.Any())
srcRolePerm.Nav_RolePermWorkStages.ForEach(t => rolePerm.Nav_RolePermWorkStages.Add(t));
result.Nav_RolePerm = rolePerm;
}
result.OrgRule = new List();
var orgRules = this.GetEntities(x => x.ENTERPRISE_ID == filter.OrgId, null);
foreach (var orgRule in orgRules)
{
result.OrgRule.Add(orgRule.PREM_ENTERPRISE_ID);
}
if (platformType == (int)PFPlatTypeEnum.后台)
{
//baseFilter.Level = -1;
UserLoginModel tmp = result as UserLoginModel;
//tmp.WorkStages = stages;
Expression> expression = t => true;
//t.ORG_ID == result.User.ORG_ID && t.IS_PERMISSION_MENU
//&& t.PLATFORM_CATEGORY == (int)PFPlatformTypeEnum.应用平台
//&& t.ENABLE_STATUS != (int)FMEnableStatusEnum.禁用;
if (result.UserType != (int)PFUserTypeEnum.管理员)
{
expression = expression.And(t => menuIds.Contains(t.ID));// && (t.MineType != null && t.MineType.Contains(user.MineType))
var filter = new BaseFilter();
var ruleIds = result.Roles.Select(i => i.ID).ToArray();
filter.SelectField = new string[] { "DEPARTMENT_ID" };
var roleDepartMents = this.GetEntities(i => (result.OrgRule.Contains(i.ORG_ID ?? Guid.Empty)
|| i.ORG_ID == result.User.ORG_ID)
&& ruleIds.Contains(i.ROLE_ID), filter);
tmp.DataRule = roleDepartMents.Select(i => i.DEPARTMENT_ID.ToString()).Distinct().ToList();
if (!tmp.DataRule.Any())//没分配任何数据权限,默认看本级和下级
{
if (user.DEPARTMENT_ID != null)
{
//默认添加
tmp.DataRule.Add(user.DEPARTMENT_ID.ToString());
//添加子集
GetChildDeps(user.DEPARTMENT_ID.ToString(), tmp.DataRule);
}
}
}
else
{
var filter = new BaseFilter();
filter.SelectField = new string[] { "ID" };
tmp.DataRule = this.GetEntities(i => (result.OrgRule.Contains(i.ORG_ID ?? Guid.Empty)
|| i.ORG_ID == result.User.ORG_ID), filter)
.Select(i => i.ID.ToString()).ToList();
}
baseFilter.SelectField = new string[] { "ID", "NAME", "MENU_FORM_PARAMS", "MENU_FORM_ID","ICON", "IS_INIT_SHOW","MineType",
"IS_PERMISSION_MENU", "IS_LEAF", "NUM", "NAME_ACRONYM", "PARENT_ID", "ORG_ID", "ENABLE_STATUS","PLATFORM_CATEGORY",
"Nav_MenuForm.CODE", "Nav_MenuForm.NAME", "Nav_MenuForm.NAME_ACRONYM", "Nav_MenuForm.PLATFORM_TYPE",
"Nav_MenuForm.FORM_TYPE", "Nav_MenuForm.MODULE_TYPE", "Nav_MenuForm.URI", "Nav_MenuForm.CUSTOM_PARAMS",
"Nav_MenuForm.JS_FILES", "Nav_MenuForm.ENABLE_STATUS", "Nav_MenuForm.TABLE_NAME", "Nav_MenuForm.IS_IGNORE_PERMISSION",
"Nav_MenuForm.AUTH_ORG_CODES", "Nav_MenuForm.SRC_ID", "PICTURE_ID", "Nav_Picture", "Nav_Picture.Nav_PictureFiles" ,"IS_RESIDENT"};
//baseFilter.SpecifyTenant = telnetCode;
//List> menuNewList = new List>();
var menuList = this.GetTreeOrderEntities(expression, baseFilter, "Nav_MenuForm").ToList();
RemoveDisable(menuList);
tmp.Menus = menuList; //menuNewList != null && menuNewList.Any() ? menuNewList : menuList;
var keyPer = "Style_";
if (CsRedisManager.KeyExists(keyPer + userId.ToString()))
{
result.ShowStyle = CsRedisManager.StringGet(keyPer + userId.ToString());
}
else
{
result.ShowStyle = 0;
}
}
else if (platformType == (int)PFPlatTypeEnum.客户端)
{
UserClientLoginModel tmp = result as UserClientLoginModel;
//if (useRoleModel.User.PERSON_ID != null)
//{
// var team = this.GetEntity(i => i.Nav_TeamPersons.Any(x => x.PERSON_ID == useRoleModel.User.PERSON_ID),
// "Nav_TeamNodes.Nav_MeterNode");
// tmp.Team = team;
//}
//tmp.WorkStages = stages;
Expression> expression = t => t.ORG_ID == result.User.ORG_ID
&& t.IS_LEAF
&& t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用;
if (result.UserType != (int)PFUserTypeEnum.管理员)
expression = expression.And(t => menuIds.Contains(t.ID));
var menuList = this.GetTreeOrderEntities(expression, baseFilter, new string[] { "Nav_MenuForm" }).ToList();
tmp.Menus = menuList;
RemoveDisable(menuList);
}
else if (platformType == (int)PFPlatTypeEnum.APP)
{
UserAppLoginModel tmp = result as UserAppLoginModel;
Expression> expression = t => t.ORG_ID == result.User.ORG_ID //&& t.IS_PERMISSION_MENU
&& t.ENABLE_STATUS != (int)FMEnableStatusEnum.禁用;
if (result.UserType != (int)PFUserTypeEnum.管理员)
{
expression = expression.And(t => menuIds.Contains(t.ID));
//var filter = new BaseFilter();
//filter.IsSpecifyDb = true;
//filter.SpecifyDbConn = filter.SpecifyDbConn;
var ruleIds = result.Roles.Select(i => i.ID).ToArray();
filter.SelectField = new string[] { "DEPARTMENT_ID" };
tmp.DataRule = this.GetEntities(i => (result.OrgRule.Contains(i.ORG_ID ?? Guid.Empty)
|| i.ORG_ID == result.User.ORG_ID)
&& ruleIds.Contains(i.ROLE_ID), filter)
.Select(i => i.DEPARTMENT_ID.ToString()).Distinct().ToList();
if (!tmp.DataRule.Any())//没分配任何数据权限,默认看本级和下级
{
if (user.DEPARTMENT_ID != null)
{
//默认添加
tmp.DataRule.Add(user.DEPARTMENT_ID.ToString());
//添加子集
GetChildDeps(user.DEPARTMENT_ID.ToString(), tmp.DataRule);
}
}
}
else
{
//var filter = new BaseFilter();
filter.SelectField = new string[] { "ID" };
tmp.DataRule = this.GetEntities(i => (result.OrgRule.Contains(i.ORG_ID ?? Guid.Empty)
|| i.ORG_ID == result.User.ORG_ID), filter)
.Select(i => i.ID.ToString()).ToList();
}
baseFilter.SelectField = new string[] { "ID", "NAME", "MENU_FORM_PARAMS", "MENU_FORM_ID","ICON",
"IS_PERMISSION_MENU", "IS_LEAF", "NUM", "NAME_ACRONYM", "PARENT_ID", "ORG_ID", "ENABLE_STATUS",
"Nav_MenuForm.CODE", "Nav_MenuForm.NAME", "Nav_MenuForm.NAME_ACRONYM", "Nav_MenuForm.PLATFORM_TYPE",
"Nav_MenuForm.FORM_TYPE", "Nav_MenuForm.MODULE_TYPE", "Nav_MenuForm.URI", "Nav_MenuForm.CUSTOM_PARAMS",
"Nav_MenuForm.JS_FILES", "Nav_MenuForm.ENABLE_STATUS", "Nav_MenuForm.TABLE_NAME", "Nav_MenuForm.IS_IGNORE_PERMISSION",
"Nav_MenuForm.AUTH_ORG_CODES", "Nav_MenuForm.SRC_ID" };
var menuList = this.GetTreeOrderEntities(expression, baseFilter, "Nav_MenuForm").ToList();
RemoveDisable(menuList);
tmp.Menus = menuList;
var keyPer = "Style_";
if (CsRedisManager.KeyExists(keyPer + userId.ToString()))
{
result.ShowStyle = CsRedisManager.StringGet(keyPer + userId.ToString());
}
else
{
result.ShowStyle = 0;
}
tmp.Nav_RolePerm = null;
}
if (result.UserType == (int)PFUserTypeEnum.管理员)
{
result.Nav_RolePerm = null;
}
//增加日志
//var sysLogService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService();
//if (platformType == (int)PFPlatTypeEnum.后台)
// sysLogService.AddLoginLog(result.User.ID, platformType);
//else
// sysLogService.AddLoginLogByApp(result.User.ID, platformType, filter);
if (result.User.NAME != "管理员")
{
T_BI_LOGIN_RECORD loginRecord = new T_BI_LOGIN_RECORD
{
USER_ID = result.User.ID,
DEPARTMENT_ID = result.User.DEPARTMENT_ID,
ORG_ID = result.User.ORG_ID,
};
if (!string.IsNullOrEmpty(filter.Parameter20))
{
loginRecord.VERSION = filter.Parameter20.Length > 990 ? filter.Parameter20.Substring(0, 990) : filter.Parameter20;
loginRecord.FROM = filter.Parameter21;
}
AddEntity(loginRecord);
}
result.Roles = null;
return result;
}
catch (Exception ex)
{
//throw new Exception(ex.Message + "," + ex.Source + "," + ex.StackTrace + "," + ex.TargetSite);
throw new Exception(ex.Message);//wyw 20230330 没必要让用户看到一串英文
}
});
}
private void GetChildDeps(string parentId, List allData)
{
var filterDep = new BaseFilter();
filterDep.IgnoreOrgRule = true;
filterDep.SelectField = new string[] { "ID", "PARENT_ID", "IS_LEAF" };
var childs = this.GetEntities(i => i.PARENT_ID == Guid.Parse(parentId), filterDep);
allData.AddRange(childs.Select(i => i.ID.ToString()).ToList());
foreach (var child in childs)
{
if (!child.IS_LEAF)
{
GetChildDeps(child.ID.ToString(), allData);
}
}
}
[HttpPost, Route("AppLogin")]
public async Task AppLogin([FromBody] TokenLoginRequest request)
{
LoginResult loginResult = new LoginResult();
try
{
if (request.grantType == (int)PFAppGrantTypeEnum.账号密码 || request.grantType == (int)PFAppGrantTypeEnum.账号验证码)
{
UserAppLoginModel result = new UserAppLoginModel();
var client = new System.Net.Http.HttpClient();
if (string.IsNullOrEmpty(request.phone))
{
loginResult.IsSuccessful = false;
loginResult.ErrorMessage = ErrMsg.FM_NO_USER_PHONE;
return loginResult;
//throw new Exception(ErrMsg.FM_NO_USER_PHONE);
}
string userId = string.Empty;
var filter = new KeywordFilter();
var user = this.GetAppUser(request);
if (user == null)
{
loginResult.IsSuccessful = false;
loginResult.ErrorMessage = ErrMsg.PM_PSD_ERROR;
return loginResult;
//throw new Exception(ErrMsg.PM_PSD_ERROR);
}
userId = user.ID.GetString();
filter.OrgId = user.ORG_ID;
filter.IsSpecifyDb = true;
filter.SpecifyDbConn = user.DbConn;//切换数据库
#region 获取token
var scope = "offline_access oEnergyPF oEnergyBD oEnergyDD oEnergyEA oEnergyED oEnergyEM oEnergyFC oEnergyFM oEnergyKR oEnergyLG" +
" oEnergyMR oEnergyNW oEnergyPM oEnergyQC oEnergyUT oEnergyMT oEnergySO oEnergyCP oEnergyFC oEnergyCM oEnergyCA";
var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
{
//Address = disco.TokenEndpoint,
Address = ConfigurationManager.AppSettings["IdentityServer"] + "connect/token",
ClientId = ConfigurationManager.AppSettings["ClientId"],
ClientSecret = ConfigurationManager.AppSettings["SecurityKey"],
Scope = scope + " offline_access",
UserName = "55274652@qq.com",
Password = "Aa123!",
});
if (tokenResponse.IsError)
{
loginResult.IsSuccessful = false;
loginResult.ErrorMessage = tokenResponse.Error ?? tokenResponse.ErrorDescription;
return loginResult;
}
// return BadRequest(new { error = tokenResponse.Error, error_description = tokenResponse.Error ?? tokenResponse.ErrorDescription });
#endregion
#region 获取APP菜单权限
var userService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService();
var useRoleModel = userService.AppGetRolesByUser(new Guid(userId), filter);//获取角色权限
if (useRoleModel == null)
{
loginResult.IsSuccessful = true;
loginResult.Data = new object();
return loginResult;
}
//return null;
if (useRoleModel.User.ENABLE_STATUS == (int)FMEnableStatusEnum.禁用)
{
loginResult.IsSuccessful = false;
loginResult.ErrorMessage = ErrMsg.FM_USER_UNABLE;
return loginResult;
}
//throw new Exception(ErrMsg.FM_USER_UNABLE);
if (useRoleModel.User.CODE.Contains("System"))
{
loginResult.IsSuccessful = false;
loginResult.ErrorMessage = "不允许系统账号手动登入";
return loginResult;
}
//throw new Exception("不允许系统账号手动登入");
if (useRoleModel.User.Nav_Org != null && useRoleModel.User.Nav_Org.ENABLE_STATUS == 1)
{
loginResult.IsSuccessful = false;
loginResult.ErrorMessage = "当前组织已停用不允许登入";
return loginResult;
}
//throw new Exception("当前组织已停用不允许登入");
result.User = useRoleModel.User;
List roleList = new List();
List menuIds = new List();
//获取角色信息
if (useRoleModel.Roles != null && useRoleModel.Roles.Any())
{
foreach (var item in useRoleModel.Roles)
{
if (item.PLATFORM_TYPE != (int)PFPlatTypeEnum.APP) continue;//剔除不同平台角色
if (item.ROLE_TYPE == (int)FMRoleTypeEnum.管理角色)
{
result.UserType = (int)PFUserTypeEnum.管理员;
menuIds.Clear();
break;
}
else if (item.Nav_MenuPermissions != null && item.Nav_MenuPermissions.Count != 0)
{
var menus = item.Nav_MenuPermissions.Select(i => i.MENU_ID ?? Guid.Empty).Distinct().ToList();
menuIds.AddRange(menus);
menuIds = menuIds.Distinct().ToList();
}
roleList.Add(item);
}
}
result.Roles = roleList;
if (useRoleModel.Nav_RolePerm != null)//剔除不同平台表单
{
var srcRolePerm = useRoleModel.Nav_RolePerm;
RolePerm rolePerm = new RolePerm();
if (srcRolePerm.Nav_RolePermForms != null && srcRolePerm.Nav_RolePermForms.Any())
{
//var tmpList = srcRolePerm.Nav_RolePermForms.Where(t => t.Nav_PermForm != null &&
//t.Nav_PermForm.PLATFORM_TYPE == (int)PFPlatTypeEnum.APP).ToList();
if (srcRolePerm.Nav_RolePermForms.Any())
srcRolePerm.Nav_RolePermForms.ForEach(t => rolePerm.Nav_RolePermForms.Add(t));
}
if (srcRolePerm.Nav_RolePermPanels != null && srcRolePerm.Nav_RolePermPanels.Any())
srcRolePerm.Nav_RolePermPanels.ForEach(t => rolePerm.Nav_RolePermPanels.Add(t));
if (srcRolePerm.Nav_RolePermWorkStages != null && srcRolePerm.Nav_RolePermWorkStages.Any())
srcRolePerm.Nav_RolePermWorkStages.ForEach(t => rolePerm.Nav_RolePermWorkStages.Add(t));
result.Nav_RolePerm = rolePerm;
}
result.OrgRule = new List();
var orgRules = this.GetEntities(x => x.ENTERPRISE_ID == filter.OrgId, null);
foreach (var orgRule in orgRules)
{
result.OrgRule.Add(orgRule.PREM_ENTERPRISE_ID);
}
// UserAppLoginModel tmp = result as UserAppLoginModel;
Expression> expression = t => t.ORG_ID == result.User.ORG_ID //&& t.IS_PERMISSION_MENU
&& t.ENABLE_STATUS != (int)FMEnableStatusEnum.禁用;
if (result.UserType != (int)PFUserTypeEnum.管理员)
{
expression = expression.And(t => menuIds.Contains(t.ID));
filter.IgnoreOrgRule = true;
var ruleIds = result.Roles.Select(i => i.ID).ToArray();
filter.SelectField = new string[] { "DEPARTMENT_ID" };
result.DataRule = this.GetEntities(i => (result.OrgRule.Contains(i.ORG_ID ?? Guid.Empty)
|| i.ORG_ID == result.User.ORG_ID)
&& ruleIds.Contains(i.ROLE_ID), filter)
.Select(i => i.DEPARTMENT_ID.ToString()).Distinct().ToList();
}
else
{
filter.IgnoreOrgRule = true;
filter.SelectField = new string[] { "ID" };
result.DataRule = this.GetEntities(i => (result.OrgRule.Contains(i.ORG_ID ?? Guid.Empty)
|| i.ORG_ID == result.User.ORG_ID), filter)
.Select(i => i.ID.ToString()).ToList();
}
var baseFilter = new BaseFilter();
baseFilter.Order = DbOrder.ASC;
baseFilter.IsParentData = true;
baseFilter.OrgId = filter.OrgId;
baseFilter.Level = -1;
baseFilter.IgnoreOrgRule = true;
baseFilter.IsSpecifyDb = true;
baseFilter.SpecifyDbConn = filter.SpecifyDbConn;
var baseconfig = this.GetEntity(x => x.ORG_ID == filter.OrgId, baseFilter);
baseFilter.Sort = "NUM";
baseFilter.SelectField = new string[] { "ID", "NAME", "MENU_FORM_PARAMS", "MENU_FORM_ID","ICON",
"IS_PERMISSION_MENU", "IS_LEAF", "NUM","PARENT_ID" , "Nav_MenuForm.CODE","Nav_MenuForm.FORM_TYPE","PICTURE_ID",
"Nav_Picture.Nav_PictureFiles"};
var menuList = this.GetTreeOrderEntities(expression, baseFilter).ToList();
RemoveDisable(menuList);
result.Menus = menuList;
List formCustomParams = new List();
baseFilter.SelectField = new string[] { "PAGE_FORM_ID", "COMPONENT_NAME", "CUSTOM_PARAMS" };
var customs = this.GetEntities(null, baseFilter);
foreach (var item in menuList)//返回自定义表单参数
{
GetFromCustomParams(item, formCustomParams, customs, baseconfig);
}
var tenantCode = result.User.Nav_Org.TENANT_CODE;
var orgId = result.User.Nav_Org.ORG_ID;
result.User.Nav_Org = null;
#endregion
loginResult.IsSuccessful = true;
loginResult.Data = new
{
access_token = tokenResponse.AccessToken,
token_type = tokenResponse.TokenType,
expiresIn = tokenResponse.ExpiresIn,
refreshToken = tokenResponse.RefreshToken,
menus = result.Menus,
formParams = formCustomParams,
user = result.User,
tenantCode = tenantCode,
orgId = orgId,
UserType = result.UserType,
dataRule = result.DataRule,
rolePerm = result.Nav_RolePerm?.Nav_RolePermForms
};
//return Ok(new
//{
// access_token = tokenResponse.AccessToken,
// token_type = tokenResponse.TokenType,
// expiresIn = tokenResponse.ExpiresIn,
// refreshToken = tokenResponse.RefreshToken,
// menus = result.Menus,
// user = result.User,
// tenantCode = tenantCode,
// orgId = orgId,
// UserType = result.UserType,
// dataRule = result.DataRule,
// rolePerm = result.Nav_RolePerm?.Nav_RolePermForms
//});
}
#region 刷新token
else
{
var client = new System.Net.Http.HttpClient();
var tokenResponse = await client.RequestRefreshTokenAsync(new RefreshTokenRequest
{
Address = ConfigurationManager.AppSettings["IdentityServer"] + "connect/token",
ClientId = ConfigurationManager.AppSettings["ClientId"],
ClientSecret = ConfigurationManager.AppSettings["SecurityKey"],
RefreshToken = request.refreshToken
});
if (tokenResponse.IsError)
{
loginResult.IsSuccessful = false;
loginResult.ErrorMessage = tokenResponse.Error ?? tokenResponse.ErrorDescription;
return loginResult;
//return BadRequest(new { error = tokenResponse.Error, error_description = tokenResponse.Error ?? tokenResponse.ErrorDescription }); ;
}
loginResult.IsSuccessful = true;
loginResult.Data = new
{
access_token = tokenResponse.AccessToken,
token_type = tokenResponse.TokenType,
refreshToken = tokenResponse.RefreshToken,
expiresIn = tokenResponse.ExpiresIn,
};
//return Ok(new
//{
// access_token = tokenResponse.AccessToken,
// token_type = tokenResponse.TokenType,
// refreshToken = tokenResponse.RefreshToken,
// expiresIn = tokenResponse.ExpiresIn,
//});
}
#endregion
//return BadRequest(new { error = "grant_type_error", error_description = "grant_type_error" });
}
catch (Exception ex)
{
loginResult.IsSuccessful = false;
loginResult.ErrorMessage = ex.Message;
//return BadRequest(new { error = "excetion", error_description = ex.Message });
}
return loginResult;
}
private void GetFromCustomParams(TreeNode treeNode, List formCustomParams,
IEnumerable customs, T_FM_BASE_CONFIG baseconfig)
{
if (treeNode.Node.MENU_FORM_ID != null)
{
if (treeNode.Node.PICTURE_ID != null)
{
treeNode.Node.IMG = baseconfig?.PICTURE_URL + treeNode.Node.Nav_Picture?.Nav_PictureFiles?.FirstOrDefault()?.IMG_FILE_PATH;
}
var custom = customs.FirstOrDefault(x => x.PAGE_FORM_ID == treeNode.Node.MENU_FORM_ID);
formCustomParams.Add(new FormCustomParam()
{
FromId = treeNode.Node.MENU_FORM_ID.ToString(),
FromCode = treeNode.Node.Nav_MenuForm.CODE,
FromAssembly = custom?.COMPONENT_NAME,
CustomParam = custom?.CUSTOM_PARAMS,
FormType = treeNode.Node.Nav_MenuForm.FORM_TYPE
});
}
if (treeNode.Children.Any())
{
foreach (var item in treeNode.Children)
{
GetFromCustomParams(item, formCustomParams, customs, baseconfig);
}
}
}
private T_FM_USER GetAppUser(TokenLoginRequest request)
{
var commonService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService();
if (string.IsNullOrEmpty(request.phone.Trim()))
return null;
T_FM_USER loginUser = null;
var filter = new BaseFilter();
filter.IgnoreOrgRule = true;
filter.IsMultipleDb = true;
string userPassword = request.password.ToUpper();//密码
string userPasswordLower = request.password.ToLower();
if (request.grantType == (int)PFAppGrantTypeEnum.账号密码)
{
loginUser = commonService.GetEntity(i => (i.PHONE == request.phone)
&& (i.PASSWORD == userPassword || i.PASSWORD == userPasswordLower), filter);
}
else if (request.grantType == (int)PFAppGrantTypeEnum.账号验证码)
{
var verCode = CsRedisManager.StringGet>(SessionKey.VERIFY_MESSAGE_CODE + request.phone);//手机号
if (verCode == null)
throw new Exception("手机验证码不存在!");
if (request.phoneCode.ToUpper() != verCode["code"].ToUpper())
throw new Exception("手机验证码不正确!");
loginUser = commonService.GetEntity(i => i.PHONE == request.phone, filter);
}
return loginUser;
}
private static void RemoveDisable(IList> menuList)
{
for (var x = menuList.Count - 1; x >= 0; x--)
{
if (menuList[x].Node.ENABLE_STATUS == (int)FMEnableStatusEnum.禁用)
{
menuList.RemoveAt(x);
}
else
{
if (menuList[x].Children != null && menuList[x].Children.Any())
{
RemoveDisable(menuList[x].Children);
}
}
}
}
private static void RemoveDisable(IList> menuList)
{
for (var x = menuList.Count - 1; x >= 0; x--)
{
if (menuList[x].Node.ENABLE_STATUS == (int)FMEnableStatusEnum.禁用)
{
menuList.RemoveAt(x);
}
else
{
if (menuList[x].Children != null && menuList[x].Children.Any())
{
RemoveDisable(menuList[x].Children);
}
}
}
}
private static void RemoveDisable(IList> menuList)
{
for (var x = menuList.Count - 1; x >= 0; x--)
{
if (menuList[x].Node.ENABLE_STATUS == (int)FMEnableStatusEnum.禁用)
{
menuList.RemoveAt(x);
}
else
{
if (menuList[x].Children != null && menuList[x].Children.Any())
{
RemoveDisable(menuList[x].Children);
}
}
}
}
///
/// 获取组织数据
///
///
///
[HttpPost, Route("GetOrgList")]
public JsonActionResult> GetOrgList([FromBody] KeywordFilter filter)
{
return SafeExecute>(() =>
{
return this.GetOrderEntities(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum.启用, filter);
});
}
///
/// 查询
///
///
///
[HttpPost, Route("GetFormOrderEntities")]
public JsonActionResult> GetFormOrderEntities([FromBody] KeywordFilter filter)
{
return SafeExecute>(() =>
{
return this.GetOrderEntities(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum.启用, filter);
});
}
[HttpPost, Route("GetUserOrderEntities")]
public JsonActionResult> GetUserOrderEntities([FromBody] KeywordFilter filter)
{
return SafeExecute>(() =>
{
return this.GetOrderEntities(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum.启用, filter);
});
}
[HttpPost, Route("GetRoleOrderEntities")]
public JsonActionResult> GetRoleOrderEntities([FromBody] KeywordFilter filter)
{
return SafeExecute>(() =>
{
return this.GetOrderEntities(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum.启用, filter);
});
}
}
}