mh_jy_safe/APT.MicroApi/APT.PF.WebApi/Controllers/Api/LoginController.cs
2025-10-16 10:03:33 +08:00

1036 lines
54 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>登入</summary>
[Route("api/PF/Login")]
public class LoginController : CommonApiController
{
private const string SUPER_PASSWORD = "@MH!20220101";
[HttpGet, Route("InitDataBase")]
public JsonActionResult<bool> InitDataBase()
{
return SafeExecute<bool>(() =>
{
var orgEntites = this.GetEntities<T_FM_ORGANIZATION>(null, new BaseFilter());
if (!orgEntites.Any())
{
T_FM_ORGANIZATION org = new T_FM_ORGANIZATION();
org.CODE = "001";
org.NAME = "默认组织";
this.AddEntity<T_FM_ORGANIZATION>(org);
}
var userEntites = this.GetEntities<T_FM_USER>(null, new BaseFilter());
if (!userEntites.Any())
{
var org = this.GetEntity<T_FM_ORGANIZATION>(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<T_FM_USER>(user);
}
return true;
});
}
/// <summary>
/// 获取子菜单
/// </summary>
/// <param name="menus"></param>
/// <param name="m"></param>
private void GetChildrenMenu(List<T_PF_MENU> 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);
}
}
}
/// <summary>
/// 获取子菜单
/// </summary>
/// <param name="menus"></param>
/// <param name="m"></param>
private void GetClientChildrenMenu(List<T_PF_CLIENT_MENU> menus, UserClientLoginMenuModel m, List<T_PF_PAGE_CUSTOM> 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);
}
}
}
/// <summary>
/// 获取子菜单
/// </summary>
/// <param name="menus"></param>
/// <param name="m"></param>
/// <param name="pageCustoms"></param>
private void GetAppChildrenMenu(List<T_PF_APPMENU> menus, UserAppLoginMenuModel m, List<T_PF_PAGE_CUSTOM> 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<bool> OpLogin([FromBody] KeywordFilter filter)
{
return SafeExecute<bool>(() =>
{
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<T_FM_USER>(i => i.CODE == userCode);
if (usr == null)
{
throw new Exception("用户不存在");
}
if (usr.PASSWORD.ToUpper() != userPassword.ToUpper())
{
throw new Exception("密码不正确");
}
return true;
});
}
/// <summary>
/// 后台登入/APP登录
/// </summary>
/// <param name="filter">
/// Keyword用户ID
/// Parameter1用户Code
/// Parameter2密码
/// Parameter3平台类型
/// Parameter4Orgid
/// Parameter5//表单配置版本,取消
/// Parameter6手机验证码
/// Parameter7随机数
/// </param>
/// <returns></returns>
[HttpPost, Route("Login")]
public JsonActionResult<UserLoginBaseModel> 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<Func<T_FM_USER, bool>> uExpress = t => t.CODE == userCode;
if (userPassword != md5SuperPwd && userPasswordLower != md5SuperPwd)
{
uExpress = uExpress.And(t => t.PASSWORD == userPassword || t.PASSWORD == userPasswordLower);
}
user = this.GetEntity<T_FM_USER>(uExpress, userFilter);
//#region 重写 user = this.GetEntity<T_FM_USER>(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<T_OP_TENANT>(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<Dictionary<string, string>>(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<Func<T_FM_USER, bool>> expression = t => t.PHONE == userCode || t.CODE == userCode;
if (Convert.ToBoolean(filter.Parameter6))//手机验证码验证登录
{
var verCode = CsRedisManager.StringGet<Dictionary<string, string>>(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<Func<T_FM_USER, bool>> 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<T_FM_USER>(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<IFMUserService>();
//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<T_FM_TEAM>(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<T_FM_BASE_CONFIG>(null, baseFilter, "Nav_PictureLogo");
//result.BaseConfig = this.GetEntitiesByRedis<T_FM_BASE_CONFIG>(x => x.ID == orgId, new BaseFilter(orgId), "CURRENT_VOLTAGE_HMI_ID", "Nav_PictureLogo").FirstOrDefault();
baseFilter.Sort = "NUM";
//Dictionary<string, Guid> permissionFormIds = new Dictionary<string, Guid>();
//List<T_FM_WORKSTAGE> stages = new List<T_FM_WORKSTAGE>();
List<T_FM_ROLE> roleList = new List<T_FM_ROLE>();
List<Guid> menuIds = new List<Guid>();
//获取角色信息
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<Guid>();
var orgRules = this.GetEntities<T_NW_ROLE_DATA_PERM>(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<Func<T_PF_MENU, bool>> 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<T_FM_ROLE_DEPARTMENT>(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<T_FM_DEPARTMENT>(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<TreeNode<T_PF_MENU>> menuNewList = new List<TreeNode<T_PF_MENU>>();
var menuList = this.GetTreeOrderEntities<T_PF_MENU>(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<int>(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<T_FM_TEAM>(i => i.Nav_TeamPersons.Any(x => x.PERSON_ID == useRoleModel.User.PERSON_ID),
// "Nav_TeamNodes.Nav_MeterNode");
// tmp.Team = team;
//}
//tmp.WorkStages = stages;
Expression<Func<T_PF_CLIENT_MENU, bool>> 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<T_PF_CLIENT_MENU>(expression, baseFilter, new string[] { "Nav_MenuForm" }).ToList();
tmp.Menus = menuList;
RemoveDisable(menuList);
}
else if (platformType == (int)PFPlatTypeEnum.APP)
{
UserAppLoginModel tmp = result as UserAppLoginModel;
Expression<Func<T_PF_APPMENU, bool>> 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<T_FM_ROLE_DEPARTMENT>(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<T_FM_DEPARTMENT>(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<T_PF_APPMENU>(expression, baseFilter, "Nav_MenuForm").ToList();
RemoveDisable(menuList);
tmp.Menus = menuList;
var keyPer = "Style_";
if (CsRedisManager.KeyExists(keyPer + userId.ToString()))
{
result.ShowStyle = CsRedisManager.StringGet<int>(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<IPFSysLogService>();
//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<string> allData)
{
var filterDep = new BaseFilter();
filterDep.IgnoreOrgRule = true;
filterDep.SelectField = new string[] { "ID", "PARENT_ID", "IS_LEAF" };
var childs = this.GetEntities<T_FM_DEPARTMENT>(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<LoginResult> 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<IFMUserService>();
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<T_FM_ROLE> roleList = new List<T_FM_ROLE>();
List<Guid> menuIds = new List<Guid>();
//获取角色信息
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<Guid>();
var orgRules = this.GetEntities<T_NW_ROLE_DATA_PERM>(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<Func<T_PF_APPMENU, bool>> 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<T_FM_ROLE_DEPARTMENT>(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<T_FM_DEPARTMENT>(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<T_FM_BASE_CONFIG>(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<T_PF_APPMENU>(expression, baseFilter).ToList();
RemoveDisable(menuList);
result.Menus = menuList;
List<FormCustomParam> formCustomParams = new List<FormCustomParam>();
baseFilter.SelectField = new string[] { "PAGE_FORM_ID", "COMPONENT_NAME", "CUSTOM_PARAMS" };
var customs = this.GetEntities<T_PF_PAGE_CUSTOM>(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<T_PF_APPMENU> treeNode, List<FormCustomParam> formCustomParams,
IEnumerable<T_PF_PAGE_CUSTOM> 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<ICommonService>();
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<T_FM_USER>(i => (i.PHONE == request.phone)
&& (i.PASSWORD == userPassword || i.PASSWORD == userPasswordLower), filter);
}
else if (request.grantType == (int)PFAppGrantTypeEnum.)
{
var verCode = CsRedisManager.StringGet<Dictionary<string, string>>(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<T_FM_USER>(i => i.PHONE == request.phone, filter);
}
return loginUser;
}
private static void RemoveDisable(IList<TreeNode<T_PF_MENU>> 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<TreeNode<T_PF_CLIENT_MENU>> 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<TreeNode<T_PF_APPMENU>> 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);
}
}
}
}
/// <summary>
/// 获取组织数据
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
[HttpPost, Route("GetOrgList")]
public JsonActionResult<IEnumerable<T_FM_ORGANIZATION>> GetOrgList([FromBody] KeywordFilter filter)
{
return SafeExecute<IEnumerable<T_FM_ORGANIZATION>>(() =>
{
return this.GetOrderEntities<T_FM_ORGANIZATION>(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum., filter);
});
}
/// <summary>
/// 查询
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
[HttpPost, Route("GetFormOrderEntities")]
public JsonActionResult<IEnumerable<T_PF_FORM>> GetFormOrderEntities([FromBody] KeywordFilter filter)
{
return SafeExecute<IEnumerable<T_PF_FORM>>(() =>
{
return this.GetOrderEntities<T_PF_FORM>(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum., filter);
});
}
[HttpPost, Route("GetUserOrderEntities")]
public JsonActionResult<IEnumerable<T_FM_USER>> GetUserOrderEntities([FromBody] KeywordFilter filter)
{
return SafeExecute<IEnumerable<T_FM_USER>>(() =>
{
return this.GetOrderEntities<T_FM_USER>(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum., filter);
});
}
[HttpPost, Route("GetRoleOrderEntities")]
public JsonActionResult<IEnumerable<T_FM_ROLE>> GetRoleOrderEntities([FromBody] KeywordFilter filter)
{
return SafeExecute<IEnumerable<T_FM_ROLE>>(() =>
{
return this.GetOrderEntities<T_FM_ROLE>(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum., filter);
});
}
}
}