update&add 增加了选房及片区service

This commit is contained in:
2021-05-28 21:16:19 +08:00
parent 34c47e78b2
commit 7cef14c7fd
49 changed files with 2034 additions and 110 deletions

View File

@@ -2,21 +2,24 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application.Entity
{
public class BsHouseInfo : Core.DEntityBase
[Table("bs_house_info")]
[Comment("房屋信息表")]
public class BsHouseInfo : Core.DEntityBase
{
/// <summary>
/// HouseCode主键ID
/// </summary>
[Comment("HouseCode主键ID")]
[Comment("bs_house_code主键Id")]
[MaxLength(36)]
[Required]
public string NumberId { get; set; }
public string HouseCodeId { get; set; }
/// <summary>
/// 幢名称

View File

@@ -0,0 +1,26 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application.Entity
{
[Table("bs_house_member_relation")]
[Comment("房屋与人员关联表")]
public class BsHouseMemberRelation : Core.DEntityBase
{
[Comment("sys_user主键Id")]
[MaxLength(36)]
[Required]
public string SysUserId { get; set; }
[Comment("bs_house_code主键Id")]
[MaxLength(36)]
[Required]
public string CodeId { get; set; }
}
}

View File

@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application
{
public enum ZoneRole
{
/// <summary>
/// 片区监管员
/// </summary>
ZoneManager,
/// <summary>
/// 房屋安全管理员
/// </summary>
HouseSecurityManager
}
}

View File

@@ -4,7 +4,7 @@
<name>Ewide.Application</name>
</assembly>
<members>
<member name="P:Ewide.Application.Entity.BsHouseInfo.NumberId">
<member name="P:Ewide.Application.Entity.BsHouseInfo.HouseCodeId">
<summary>
HouseCode主键ID
</summary>
@@ -359,6 +359,16 @@
单位联系人电话
</summary>
</member>
<member name="F:Ewide.Application.ZoneRole.ZoneManager">
<summary>
片区监管员
</summary>
</member>
<member name="F:Ewide.Application.ZoneRole.HouseSecurityManager">
<summary>
房屋安全管理员
</summary>
</member>
<member name="T:Ewide.Application.Service.HouseCode.HouseCodeService">
<summary>
房屋编码相关
@@ -371,6 +381,90 @@
<param name="projectId"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.QueryMemberPageList(Ewide.Core.Service.UserInput)">
<summary>
分页查询用户
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.AddUser(Ewide.Application.Service.AddHouseMemberInput)">
<summary>
增加用户
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.DefaultRole(System.String)">
<summary>
获取角色
</summary>
<param name="orgId"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.GetUserOwnRole(Ewide.Core.Service.QueryUserInput)">
<summary>
获取用户拥有角色
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.DeleteUser(Ewide.Core.Service.DeleteUserInput)">
<summary>
删除用户
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.UpdateUser(Ewide.Core.Service.UpdateUserInput)">
<summary>
更新用户
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.GetUser(Ewide.Core.Service.QueryUserInput)">
<summary>
查看用户
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.ChangeUserStatus(Ewide.Core.Service.UpdateUserInput)">
<summary>
修改用户状态
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.GrantUserData(Ewide.Core.Service.UpdateUserInput)">
<summary>
授权用户数据范围
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.GetUserOwnData(Ewide.Core.Service.QueryUserInput)">
<summary>
获取用户拥有数据
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.GetDefaultRole(System.String)">
<summary>
获取当前机构中所创建的默认角色
片区中的第一个帐号必定为片区监管员
</summary>
<param name="orgId"></param>
<returns></returns>
</member>
<member name="M:Ewide.Application.Service.HouseMemberService.GetRoleRange">
<summary>
获取可创建的角色列表
</summary>
<returns></returns>
</member>
<member name="T:Ewide.Application.Service.HouseProjectInfo.HouseProjectInfoService">
<summary>
项目管理相关服务
@@ -425,5 +519,15 @@
<param name="input"></param>
<returns></returns>
</member>
<member name="T:Ewide.Application.Service.HouseSelectorService">
<summary>
选房相关
</summary>
</member>
<member name="T:Ewide.Application.Service.HouseZoneService">
<summary>
片区相关
</summary>
</member>
</members>
</doc>

View File

@@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application.Service.HouseMember.Dto
{
class HouseMemberInput
{
}
}

View File

@@ -64,17 +64,14 @@ namespace Ewide.Application.Service.HouseCode
}
[HttpPost("/houseCode/page")]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
public async Task<dynamic> QueryPage([FromBody] QueryHouseCodeInput input)
{
var sql = @"SELECT HC.*,AA.Name AreaName,RA.Name RoadName,CA.Name CommName,Proj.AreaCode,Proj.Note,Proj.Name+'('+Proj.Note+')' FullProjName FROM bs_house_code HC
LEFT JOIN bs_house_projectinfo Proj ON Proj.Id=HC.ProjectId
LEFT JOIN sys_area_code CA ON CA.Code = Proj.AreaCode
LEFT JOIN sys_area_code RA ON RA.AdCode = SUBSTR(CA.AdCode,1,9)
LEFT JOIN sys_area_code AA ON AA.AdCode = SUBSTR(CA.AdCode,1,6) ";
//WHERE HC.Address LIKE @Address AND HC.HouseCode LIKE @HouseCode";
//return await _dapperRepository.QueryPageData(sql, input, param: new { Address = '%' + input.Address + '%', HouseCode = '%' + input.HouseCode + '%'});
return await _dapperRepository.QueryPageDataDynamic(sql, input);
LEFT JOIN sys_area_code AA ON AA.AdCode = SUBSTR(CA.AdCode,1,6) WHERE HC.Address LIKE @Address AND HC.HouseCode LIKE @HouseCode";
return await _dapperRepository.QueryPageData(sql, input, param: new { Address = '%' + input.Address + '%', HouseCode = '%' + input.HouseCode + '%'});
}
/// <summary>

View File

@@ -0,0 +1,16 @@
using Ewide.Core.Service;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application.Service
{
public class AddHouseMemberInput : AddUserInput
{
[Required(ErrorMessage = "角色不能为空")]
public string RoleId { get; set; }
}
}

View File

@@ -1,12 +1,13 @@
using System;
using Ewide.Core.Service;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application.Service.HouseMember.Dto
namespace Ewide.Application.Service
{
class HouseMemberOutput
public class HouseMemberOutput
{
}
}

View File

@@ -0,0 +1,302 @@
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;
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 _sysUserService.GetUserDataScopeIdList(_userManager.UserId);
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))
{
sql += " AND (SO.Id = @OrgId OR SO.Pids Like CONCAT('%[', @OrgId, ']%'))";
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)
{
return await _sysUserService.GetUser(input);
}
/// <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 <= 30)
{
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 == System.Enum.GetName(ZoneRole.ZoneManager).ToUnderScoreCase());
// 存在片区监管员,返回安全员, 否则返回监管员
if (isExistZoneManager)
{
return roles.LastOrDefault();
}
return roles.FirstOrDefault();
}
/// <summary>
/// 获取可创建的角色列表
/// </summary>
/// <returns></returns>
[NonAction]
private async Task<List<SysRole>> GetRoleRange()
{
var codes = System.Enum.GetNames(typeof(ZoneRole)).Select(p => p.ToUnderScoreCase());
var _sysRoleRep = Db.GetRepository<SysRole>();
var roles = await _sysRoleRep.DetachedEntities.Where(p => codes.Contains(p.Code)).ToListAsync();
return roles;
}
[HttpGet("/houseMember/test")]
[Microsoft.AspNetCore.Authorization.AllowAnonymous]
public async Task<dynamic> Test([FromQuery] string str)
{
var result1 = str.ToCamelCase();
var result2 = str.ToUnderScoreCase();
return result1 + "," + result2;
}
}
}

View File

@@ -0,0 +1,22 @@
using Ewide.Core.Service;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Ewide.Application.Service
{
public interface IHouseMemberService
{
Task<dynamic> QueryMemberPageList([FromBody] UserInput input);
Task AddUser(AddHouseMemberInput input);
Task<dynamic> DefaultRole([FromQuery] string orgId);
Task DeleteUser(DeleteUserInput input);
Task UpdateUser(UpdateUserInput input);
Task<dynamic> GetUser([FromQuery] QueryUserInput input);
Task ChangeUserStatus(UpdateUserInput input);
Task<dynamic> GetUserOwnRole([FromQuery] QueryUserInput input);
Task GrantUserData(UpdateUserInput input);
Task<dynamic> GetUserOwnData([FromQuery] QueryUserInput input);
Task<dynamic> DefaultRoleRange();
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application
{
public class HouseSelectorInput
{
[Required(ErrorMessage = "区域编码不可为空")]
[MinLength(9, ErrorMessage = "区域编码长度必须为9位及以上")]
public string AreaCode { get; set; }
}
}

View File

@@ -4,9 +4,9 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application.Service.HouseMember
namespace Ewide.Application
{
class HouseMemberService
public class HouseSelectorOutput
{
}
}

View File

@@ -0,0 +1,21 @@
using Ewide.Core;
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Ewide.Application.Service
{
/// <summary>
/// 选房相关
/// </summary>
[ApiDescriptionSettings(Name = "HouseSelector", Order = 180)]
public class HouseSelectorService : IHouseSelectorService, IDynamicApiController, ITransient
{
}
}

View File

@@ -0,0 +1,13 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application.Service
{
public interface IHouseSelectorService
{
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application
{
public class HouseZoneInput
{
[Required(ErrorMessage = "区域编码不可为空")]
[MinLength(9, ErrorMessage = "区域编码长度必须为9位及以上")]
public string AreaCode { get; set; }
}
}

View File

@@ -4,9 +4,9 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application.Service.HouseMember
namespace Ewide.Application
{
class IHouseMemberService
class HouseZoneOutput
{
}
}

View File

@@ -0,0 +1,39 @@
using Ewide.Core;
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Ewide.Application.Service
{
/// <summary>
/// 片区相关
/// </summary>
[ApiDescriptionSettings(Name = "HouseZone", Order = 180)]
public class HouseZoneService : IHouseZoneService, IDynamicApiController, ITransient
{
[HttpGet("/houseZone/list")]
public async Task<dynamic> GetHouseZoneList([FromQuery] HouseZoneInput input)
{
var areaCode = input.AreaCode.Substring(0, 9);
var _sysOrgRep = Db.GetRepository<SysOrg>();
var road = await _sysOrgRep.DetachedEntities.FirstOrDefaultAsync(p => p.AreaCode == areaCode);
if (road == null) throw Oops.Oh("街道编码错误");
return await _sysOrgRep.DetachedEntities
.Where(p => p.Pid == road.Id)
.Where(p => p.Type == (int)OrgType.)
.OrderBy(p => p.Sort)
.Select(p => new
{
p.Id,
p.Name
})
.ToListAsync();
}
}
}

View File

@@ -0,0 +1,14 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Application.Service
{
public interface IHouseZoneService
{
Task<dynamic> GetHouseZoneList([FromQuery] HouseZoneInput input);
}
}