Files
housemove3/Api/Ewide.Application/Service/HouseSafety/HouseMember/HouseMemberService.cs
路 范 c03092bc0c .
2021-09-24 14:33:10 +08:00

327 lines
11 KiB
C#

using Dapper;
using Ewide.Core;
using Ewide.Core.Extension;
using Ewide.Core.Service;
using Furion.DatabaseAccessor;
using Furion.DataEncryption;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System;
namespace Ewide.Application.Service
{
[ApiDescriptionSettings(Name = "HouseMember")]
public class HouseMemberService : IHouseMemberService, IDynamicApiController, ITransient
{
private readonly IDapperRepository _dapperRepository;
private readonly IRepository<SysUser> _sysUserRep; // 用户表仓储
private readonly IUserManager _userManager;
private readonly ISysUserService _sysUserService;
private readonly ISysEmpService _sysEmpService;
public HouseMemberService(
IDapperRepository dapperRepository,
IRepository<SysUser> sysUserRep,
IUserManager userManager,
ISysUserService sysUserService,
ISysEmpService sysEmpService
)
{
_dapperRepository = dapperRepository;
_sysUserRep = sysUserRep;
_userManager = userManager;
_sysUserService = sysUserService;
_sysEmpService = sysEmpService;
}
/// <summary>
/// 分页查询用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/houseMember/page")]
public async Task<dynamic> QueryMemberPageList([FromBody] UserInput input)
{
var dataScopes = await _userManager.GetUserAllDataScopeList();
var sql = @"SELECT
SU.*,
SO.Name OrgName,
SUR.RoleName,
SUR.RoleCode
FROM sys_user SU
LEFT JOIN sys_emp SE ON SU.Id = SE.Id
LEFT JOIN sys_org SO ON SE.OrgId = SO.Id
LEFT JOIN (
SELECT
SUR.SysUserId,
GROUP_CONCAT(SR.Name) RoleName,
GROUP_CONCAT(SR.Code) RoleCode
FROM sys_user_role SUR
LEFT JOIN sys_role SR ON SUR.SysRoleId = SR.Id
GROUP BY SUR.SysUserId
) SUR ON SU.Id = SUR.SysUserId
WHERE 1=1";
var param = new DynamicParameters();
if (!string.IsNullOrEmpty(input.SearchValue))
{
sql += @" AND (SU.Account Like @SearchValue
OR SU.Name Like @SearchValue
OR SU.Phone Like @SearchValue)";
param.Add("SearchValue", "%" + input.SearchValue + "%");
}
if (!string.IsNullOrEmpty(input.SysEmpParam.OrgId))
{
var filter = " AND (SO.Id = @OrgId {0}) ";
filter = String.Format(filter, input.TreeNodeDataScope.GetValueOrDefault(1) == 2 ? " OR SO.Pids Like CONCAT('%[', @OrgId, ']%') " : "");
sql += filter;
param.Add("OrgId", input.SysEmpParam.OrgId);
}
if (input.SearchStatus >= 0)
{
sql += " AND SU.Status = @Status";
param.Add("Status", input.SearchStatus);
}
if (!_userManager.SuperAdmin)
{
sql += " AND SU.AdminType <> @AdminType";
param.Add("AdminType", AdminType.SuperAdmin);
sql += " AND SU.Id <> @UserId";
param.Add("UserId", _userManager.UserId);
if (dataScopes.Count > 0)
{
sql += " AND SO.Id IN @OrgIds";
param.Add("OrgIds", dataScopes.ToArray());
}
}
var users = await _dapperRepository.QueryPageData<UserOutput>(sql, input, param);
//foreach (var user in users.Items)
//{
// user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id);
//}
return PageDataResult<UserOutput>.PageResult(users);
}
/// <summary>
/// 增加用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/houseMember/add")]
[UnitOfWork]
public async Task AddUser(AddHouseMemberInput input)
{
var id = await _sysUserService.AddUser(input);
var grantRoleInput = input.Adapt<UpdateUserInput>();
grantRoleInput.Id = id;
// 添加角色
grantRoleInput.GrantRoleIdList.Add(input.RoleId);
await _sysUserService.GrantUserRole(grantRoleInput);
}
/// <summary>
/// 获取角色
/// </summary>
/// <param name="orgId"></param>
/// <returns></returns>
[HttpGet("/houseMember/defaultRole")]
public async Task<dynamic> DefaultRole([FromQuery] string orgId)
{
return (await GetDefaultRole(orgId)).Adapt<RoleOutput>();
}
/// <summary>
/// 获取用户拥有角色
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/houseMember/ownRole")]
public async Task<dynamic> GetUserOwnRole([FromQuery] QueryUserInput input)
{
return await _sysUserService.GetUserOwnRole(input);
}
[HttpGet("/houseMember/defaultRoleRange")]
public async Task<dynamic> DefaultRoleRange()
{
return (await GetRoleRange()).Select(p => p.Adapt<RoleOutput>()).ToList();
}
/// <summary>
/// 删除用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/houseMember/delete")]
[UnitOfWork]
public async Task DeleteUser(DeleteUserInput input)
{
/*
* 未处理逻辑
* 片区监管员在本片区已有安全员的情况下无法删除
*/
await _sysUserService.DeleteUser(input);
}
/// <summary>
/// 更新用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/houseMember/edit")]
[UnitOfWork]
public async Task UpdateUser(UpdateUserInput input)
{
/*
* 未处理逻辑
* 如果移动组织架构,会产生以下几种逻辑
* 片区1监管员(无安全员或有其他监管员)=>片区2,直接成功
* 片区1监管员(有安全员并且无其他监管员)=>片区2,无法移动
* 片区1安全员=>片区2(有监管员),直接成功
* 片区1安全员=>片区2(无监管员),无法移动,需要创建监管员
*/
await _sysUserService.UpdateUser(input);
}
/// <summary>
/// 查看用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/houseMember/detail")]
public async Task<dynamic> GetUser([FromQuery] QueryUserInput input)
{
var sql = @"SELECT
SU.*,
SO.Name OrgName,
SUR.RoleName,
SUR.RoleCode
FROM sys_user SU
LEFT JOIN sys_emp SE ON SU.Id = SE.Id
LEFT JOIN sys_org SO ON SE.OrgId = SO.Id
LEFT JOIN (
SELECT
SUR.SysUserId,
GROUP_CONCAT(SR.Name) RoleName,
GROUP_CONCAT(SR.Code) RoleCode
FROM sys_user_role SUR
LEFT JOIN sys_role SR ON SUR.SysRoleId = SR.Id
GROUP BY SUR.SysUserId
) SUR ON SU.Id = SUR.SysUserId
WHERE SU.Id=@Id";
var user = (await _dapperRepository.QueryAsync<UserOutput>(sql, new { input.Id })).SingleOrDefault();
if (user != null)
{
user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id);
}
return user;
}
/// <summary>
/// 修改用户状态
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/houseMember/changeStatus")]
public async Task ChangeUserStatus(UpdateUserInput input)
{
await _sysUserService.ChangeUserStatus(input);
}
/// <summary>
/// 授权用户数据范围
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/houseMember/grantData")]
public async Task GrantUserData(UpdateUserInput input)
{
await _sysUserService.GrantUserData(input);
}
/// <summary>
/// 获取用户拥有数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/houseMember/ownData")]
public async Task<dynamic> GetUserOwnData([FromQuery] QueryUserInput input)
{
return await _sysUserService.GetUserOwnData(input);
}
/// <summary>
/// 获取当前机构中所创建的默认角色
/// 片区中的第一个帐号必定为片区监管员
/// </summary>
/// <param name="orgId"></param>
/// <returns></returns>
[NonAction]
private async Task<SysRole> GetDefaultRole(string orgId)
{
var roles = await GetRoleRange();
if (roles.Count < 2) throw Oops.Oh("未配置正确的角色");
var _sysOrgRep = Db.GetRepository<SysOrg>();
var org = await _sysOrgRep.DetachedEntities.FirstOrDefaultAsync(p => p.Id == orgId);
// 如果当前组织为街道, 则直接返回安全员
if (org == null || org.Type <= (int)OrgType.)
{
return roles.LastOrDefault();
}
var _sysEmpRep = Db.GetRepository<SysEmp>();
var _sysUserRoleRep = Db.GetRepository<SysUserRole>();
var userIds = await _sysEmpRep.DetachedEntities.Where(p => p.OrgId == orgId).Select(p => p.Id).ToListAsync();
var roleIds = await _sysUserRoleRep.DetachedEntities.Where(p => userIds.Contains(p.SysUserId)).Select(p => p.SysRoleId).ToListAsync();
var _sysRoleRep = Db.GetRepository<SysRole>();
var isExistZoneManager = await _sysRoleRep.DetachedEntities.AnyAsync(p => roleIds.Contains(p.Id) && p.Code == Enum.GetName(HouseManagerRole.ZoneManager).ToUnderScoreCase());
// 存在片区监管员,返回安全员, 否则返回监管员
if (isExistZoneManager)
{
return roles.LastOrDefault();
}
return roles.FirstOrDefault();
}
/// <summary>
/// 获取可创建的角色列表
/// </summary>
/// <returns></returns>
[NonAction]
private async Task<List<SysRole>> GetRoleRange()
{
var codes = (new[] {
Enum.GetName(HouseManagerRole.ZoneManager),
Enum.GetName(HouseManagerRole.HouseSecurityManager),
}).Select(p => p.ToUnderScoreCase());
var _sysRoleRep = Db.GetRepository<SysRole>();
var roles = await _sysRoleRep.DetachedEntities.Where(p => codes.Contains(p.Code)).ToListAsync();
return roles;
}
}
}