Ver Fonte

用户管理接口修改

zhontai há 2 anos atrás
pai
commit
77357b0b85
22 ficheiros alterados com 459 adições e 287 exclusões
  1. 1 1
      src/platform/ZhonTai.Admin/Domain/Employee/EmployeeEntity.cs
  2. 44 0
      src/platform/ZhonTai.Admin/Domain/Employee/Input/EmployeeAddInput.cs
  3. 1 1
      src/platform/ZhonTai.Admin/Domain/Employee/Input/EmployeeUpdateInput.cs
  4. 3 2
      src/platform/ZhonTai.Admin/Domain/Employee/Output/EmployeeGetOutput.cs
  5. 1 1
      src/platform/ZhonTai.Admin/Domain/Employee/Output/EmployeeListOutput.cs
  6. 2 2
      src/platform/ZhonTai.Admin/Domain/EmployeeOrganization/EmployeeOrganizationEntity.cs
  7. 10 0
      src/platform/ZhonTai.Admin/Domain/User/UserEntity.cs
  8. 1 1
      src/platform/ZhonTai.Admin/HttpApi/Controllers/EmployeeController.cs
  9. 1 0
      src/platform/ZhonTai.Admin/Repositories/Employee/EmployeeRepository.cs
  10. 8 8
      src/platform/ZhonTai.Admin/Services/Employee/EmployeeService.cs
  11. 2 2
      src/platform/ZhonTai.Admin/Services/Employee/IEmployeeService.cs
  12. 0 60
      src/platform/ZhonTai.Admin/Services/Employee/Input/EmployeeAddInput.cs
  13. 2 2
      src/platform/ZhonTai.Admin/Services/Employee/_MapConfig.cs
  14. 22 0
      src/platform/ZhonTai.Admin/Services/User/Dto/EmployeeAddInput.cs
  15. 18 0
      src/platform/ZhonTai.Admin/Services/User/Dto/EmployeeUpdateInput.cs
  16. 14 4
      src/platform/ZhonTai.Admin/Services/User/Dto/UserAddInput.cs
  17. 1 0
      src/platform/ZhonTai.Admin/Services/User/Dto/UserGetOutput.cs
  18. 23 5
      src/platform/ZhonTai.Admin/Services/User/Dto/UserUpdateInput.cs
  19. 0 2
      src/platform/ZhonTai.Admin/Services/User/IUserService.cs
  20. 117 43
      src/platform/ZhonTai.Admin/Services/User/UserService.cs
  21. 0 4
      src/platform/ZhonTai.Admin/Services/User/_MapConfig.cs
  22. 188 149
      src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

+ 1 - 1
src/platform/ZhonTai.Admin/Domain/Employee/EmployeeEntity.cs

@@ -41,7 +41,7 @@ public partial class EmployeeEntity : EntityFull, ITenant
     /// <summary>
     /// 直属主管Id
     /// </summary>
-    public long ManagerUserId { get; set; }
+    public long? ManagerUserId { get; set; }
 
     public UserEntity ManagerUser { get; set; }
 

+ 44 - 0
src/platform/ZhonTai.Admin/Domain/Employee/Input/EmployeeAddInput.cs

@@ -0,0 +1,44 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using ZhonTai.Admin.Domain.Organization;
+
+namespace ZhonTai.Admin.Domain.Employee.Input;
+
+/// <summary>
+/// 添加
+/// </summary>
+public class EmployeeAddInput
+{
+    /// <summary>
+    /// 工号
+    /// </summary>
+    public string JobNumber { get; set; }
+
+    /// <summary>
+    /// 性别
+    /// </summary>
+    public SexEnum? Sex { get; set; }
+
+    /// <summary>
+    /// 主属部门Id
+    /// </summary>
+    public long MainOrgId { get; set; }
+
+    /// <summary>
+    /// 所属部门
+    /// </summary>
+    public long[] OrgIds { get; set; }
+
+    public ICollection<OrganizationEntity> Orgs { get; set; }
+
+    /// <summary>
+    /// 职位
+    /// </summary>
+    public string Position { get; set; }
+
+    /// <summary>
+    /// 入职时间
+    /// </summary>
+    public DateTime? EntryTime { get; set; }
+}

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Employee/Input/EmployeeUpdateInput.cs → src/platform/ZhonTai.Admin/Domain/Employee/Input/EmployeeUpdateInput.cs

@@ -1,5 +1,5 @@
 
-namespace ZhonTai.Admin.Services.Employee.Input;
+namespace ZhonTai.Admin.Domain.Employee.Input;
 
 /// <summary>
 /// 修改

+ 3 - 2
src/platform/ZhonTai.Admin/Services/Employee/Output/EmployeeGetOutput.cs → src/platform/ZhonTai.Admin/Domain/Employee/Output/EmployeeGetOutput.cs

@@ -1,6 +1,7 @@
-using ZhonTai.Admin.Services.Employee.Input;
+
+using ZhonTai.Admin.Domain.Employee.Input;
 
-namespace ZhonTai.Admin.Services.Employee.Output;
+namespace ZhonTai.Admin.Domain.Employee.Output;
 
 public class EmployeeGetOutput : EmployeeUpdateInput
 {

+ 1 - 1
src/platform/ZhonTai.Admin/Services/Employee/Output/EmployeeListOutput.cs → src/platform/ZhonTai.Admin/Domain/Employee/Output/EmployeeListOutput.cs

@@ -1,6 +1,6 @@
 using System;
 
-namespace ZhonTai.Admin.Services.Employee.Output;
+namespace ZhonTai.Admin.Domain.Employee.Output;
 
 public class EmployeeListOutput
 {

+ 2 - 2
src/platform/ZhonTai.Admin/Domain/EmployeeOrganization/EmployeeOrganizationEntity.cs

@@ -6,7 +6,7 @@ using ZhonTai.Admin.Domain.Organization;
 namespace ZhonTai.Admin.Domain;
 
 /// <summary>
-/// 员工属部门
+/// 员工属部门
 /// </summary>
 [Table(Name = "ad_employee_organization")]
 [Index("idx_{tablename}_01", nameof(EmployeeId) + "," + nameof(OrganizationId), true)]
@@ -25,7 +25,7 @@ public partial class EmployeeOrganizationEntity : EntityAdd
     /// <summary>
     /// 部门Id
     /// </summary>
-		public long OrganizationId { get; set; }
+	public long OrganizationId { get; set; }
 
     /// <summary>
     /// 部门

+ 10 - 0
src/platform/ZhonTai.Admin/Domain/User/UserEntity.cs

@@ -5,6 +5,7 @@ using ZhonTai.Admin.Core.Entities;
 using ZhonTai.Admin.Domain.Tenant;
 using ZhonTai.Admin.Domain.Role;
 using ZhonTai.Admin.Domain.UserRole;
+using ZhonTai.Admin.Domain.Employee;
 
 namespace ZhonTai.Admin.Domain.User;
 
@@ -71,6 +72,15 @@ public partial class UserEntity : EntityFull, ITenant
     [Column(MapType = typeof(int))]
     public UserStatusEnum Status { get; set; }
 
+    /// <summary>
+    /// 角色列表
+    /// </summary>
     [Navigate(ManyToMany = typeof(UserRoleEntity))]
     public ICollection<RoleEntity> Roles { get; set; }
+
+    /// <summary>
+    /// 员工
+    /// </summary>
+    [Navigate(nameof(Id))]
+    public EmployeeEntity Emp { get; set; }
 }

+ 1 - 1
src/platform/ZhonTai.Admin/HttpApi/Controllers/EmployeeController.cs

@@ -2,7 +2,7 @@
 using ZhonTai.Admin.Services.Employee;
 using Microsoft.AspNetCore.Mvc;
 using System.Threading.Tasks;
-using ZhonTai.Admin.Services.Employee.Input;
+using ZhonTai.Admin.Domain.Employee.Input;
 using Microsoft.AspNetCore.Mvc.ModelBinding;
 
 namespace ZhonTai.Admin.HttpApi.Controllers;

+ 1 - 0
src/platform/ZhonTai.Admin/Repositories/Employee/EmployeeRepository.cs

@@ -8,5 +8,6 @@ public class EmployeeRepository : RepositoryBase<EmployeeEntity>, IEmployeeRepos
 {
     public EmployeeRepository(DbUnitOfWorkManager uowm) : base(uowm)
     {
+
     }
 }

+ 8 - 8
src/platform/ZhonTai.Admin/Services/Employee/EmployeeService.cs

@@ -3,8 +3,8 @@ using System.Threading.Tasks;
 using ZhonTai.Admin.Core.Attributes;
 using ZhonTai.Admin.Core.Dto;
 using ZhonTai.Admin.Domain;
-using ZhonTai.Admin.Services.Employee.Input;
-using ZhonTai.Admin.Services.Employee.Output;
+using ZhonTai.Admin.Domain.Employee.Input;
+using ZhonTai.Admin.Domain.Employee.Output;
 using ZhonTai.Admin.Core.Repositories;
 using ZhonTai.Admin.Domain.Employee;
 using ZhonTai.Admin.Domain.Organization;
@@ -91,10 +91,10 @@ public class EmployeeService : BaseService, IEmployeeService
             return ResultOutput.NotOk();
         }
 
-        //属部门
-        if (input.OrganizationIds != null && input.OrganizationIds.Any())
+        //属部门
+        if (input.OrgIds != null && input.OrgIds.Any())
         {
-            var organizations = input.OrganizationIds.Select(organizationId => new EmployeeOrganizationEntity
+            var organizations = input.OrgIds.Select(organizationId => new EmployeeOrganizationEntity
             { 
                 EmployeeId = employeeId.Value, 
                 OrganizationId = organizationId 
@@ -130,9 +130,9 @@ public class EmployeeService : BaseService, IEmployeeService
         await _employeeOrganizationRepository.DeleteAsync(a => a.EmployeeId == employee.Id);
 
         //附属部门
-        if (input.OrganizationIds != null && input.OrganizationIds.Any())
+        if (input.OrgIds != null && input.OrgIds.Any())
         {
-            var organizations = input.OrganizationIds.Select(organizationId => new EmployeeOrganizationEntity 
+            var organizations = input.OrgIds.Select(organizationId => new EmployeeOrganizationEntity 
             { 
                 EmployeeId = employee.Id, 
                 OrganizationId = organizationId 
@@ -151,7 +151,7 @@ public class EmployeeService : BaseService, IEmployeeService
     [Transaction]
     public async Task<IResultOutput> DeleteAsync(long id)
     {
-        //删除员工属部门
+        //删除员工属部门
         await _employeeOrganizationRepository.DeleteAsync(a => a.EmployeeId == id);
 
         //删除员工

+ 2 - 2
src/platform/ZhonTai.Admin/Services/Employee/IEmployeeService.cs

@@ -1,7 +1,7 @@
 using System.Threading.Tasks;
 using ZhonTai.Admin.Core.Dto;
-using ZhonTai.Admin.Services.Employee.Input;
-using ZhonTai.Admin.Services.Employee.Output;
+using ZhonTai.Admin.Domain.Employee.Input;
+using ZhonTai.Admin.Domain.Employee.Output;
 
 namespace ZhonTai.Admin.Services.Employee;
 

+ 0 - 60
src/platform/ZhonTai.Admin/Services/Employee/Input/EmployeeAddInput.cs

@@ -1,60 +0,0 @@
-using System;
-using ZhonTai.Admin.Domain.Employee;
-
-namespace ZhonTai.Admin.Services.Employee.Input;
-
-/// <summary>
-/// 添加
-/// </summary>
-public class EmployeeAddInput
-{
-    /// <summary>
-    /// 姓名
-    /// </summary>
-    public string Name { get; set; }
-
-    /// <summary>
-    /// 昵称
-    /// </summary>
-    public string NickName { get; set; }
-
-    /// <summary>
-    /// 性别
-    /// </summary>
-    public SexEnum Sex { get; set; }
-
-    /// <summary>
-    /// 工号
-    /// </summary>
-    public string JobNumber { get; set; }
-
-    /// <summary>
-    /// 主属部门Id
-    /// </summary>
-    public long OrganizationId { get; set; }
-
-    /// <summary>
-    /// 附属部门
-    /// </summary>
-    public long[] OrganizationIds { get; set; }
-
-    /// <summary>
-    /// 职位
-    /// </summary>
-    public string Position { get; set; }
-
-    /// <summary>
-    /// 手机号
-    /// </summary>
-    public string Phone { get; set; }
-
-    /// <summary>
-    /// 邮箱
-    /// </summary>
-    public string Email { get; set; }
-
-    /// <summary>
-    /// 入职时间
-    /// </summary>
-    public DateTime? EntryTime { get; set; }
-}

+ 2 - 2
src/platform/ZhonTai.Admin/Services/Employee/_MapConfig.cs

@@ -1,4 +1,4 @@
-using ZhonTai.Admin.Services.Employee.Output;
+using ZhonTai.Admin.Domain.Employee.Output;
 using System.Linq;
 using Mapster;
 using ZhonTai.Admin.Domain.Employee;
@@ -14,7 +14,7 @@ public class MapConfig : IRegister
     {
         config
         .NewConfig<EmployeeEntity, EmployeeGetOutput>()
-        .Map(dest => dest.OrganizationIds, src => src.Orgs.Select(a => a.Id));
+        .Map(dest => dest.OrgIds, src => src.Orgs.Select(a => a.Id));
 
         config
         .NewConfig<EmployeeEntity, EmployeeListOutput>()

+ 22 - 0
src/platform/ZhonTai.Admin/Services/User/Dto/EmployeeAddInput.cs

@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+using ZhonTai.Admin.Domain.Organization;
+
+namespace ZhonTai.Admin.Domain.User;
+
+/// <summary>
+/// 员工添加
+/// </summary>
+public class EmployeeAddInput
+{
+    /// <summary>
+    /// 主属部门Id
+    /// </summary>
+    public long MainOrgId { get; set; }
+
+    /// <summary>
+    /// 所属部门
+    /// </summary>
+    public long[] OrgIds { get; set; }
+
+    public ICollection<OrganizationEntity> Orgs { get; set; }
+}

+ 18 - 0
src/platform/ZhonTai.Admin/Services/User/Dto/EmployeeUpdateInput.cs

@@ -0,0 +1,18 @@
+
+namespace ZhonTai.Admin.Domain.User;
+
+/// <summary>
+/// 修改
+/// </summary>
+public class EmployeeUpdateInput: EmployeeAddInput
+{
+    /// <summary>
+    /// 编号
+    /// </summary>
+    public long Id { get; set; }
+
+    /// <summary>
+    /// 版本
+    /// </summary>
+    public long Version { get; set; }
+}

+ 14 - 4
src/platform/ZhonTai.Admin/Services/User/Dto/UserAddInput.cs

@@ -27,17 +27,27 @@ public class UserAddInput
     public string Name { get; set; }
 
     /// <summary>
-    /// 状态
+    /// 手机号
     /// </summary>
-    public UserStatusEnum Status { get; set; }
+    public string Mobile { get; set; }
 
     /// <summary>
-    /// 备注
+    /// 邮箱
     /// </summary>
-    public string Remark { get; set; }
+    public string Email { get; set; }
 
     /// <summary>
     /// 角色
     /// </summary>
     public long[] RoleIds { get; set; }
+
+    /// <summary>
+    /// 状态
+    /// </summary>
+    public UserStatusEnum Status { get; set; }
+
+    /// <summary>
+    /// 员工
+    /// </summary>
+    public EmployeeAddInput Emp { get; set; }
 }

+ 1 - 0
src/platform/ZhonTai.Admin/Services/User/Dto/UserGetOutput.cs

@@ -2,4 +2,5 @@
 
 public class UserGetOutput : UserUpdateInput
 {
+
 }

+ 23 - 5
src/platform/ZhonTai.Admin/Services/User/Dto/UserUpdateInput.cs

@@ -1,4 +1,7 @@
-using System.ComponentModel.DataAnnotations;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using ZhonTai.Admin.Domain.Role;
+using ZhonTai.Admin.Domain.User;
 
 namespace ZhonTai.Admin.Services.User.Dto;
 
@@ -25,20 +28,35 @@ public partial class UserUpdateInput
     public string Name { get; set; }
 
     /// <summary>
-    /// 状态
+    /// 手机号
     /// </summary>
-    public int Status { get; set; }
+    public string Mobile { get; set; }
 
     /// <summary>
-    /// 备注
+    /// 邮箱
     /// </summary>
-    public string Remark { get; set; }
+    public string Email { get; set; }
 
     /// <summary>
     /// 角色
     /// </summary>
     public long[] RoleIds { get; set; }
 
+    /// <summary>
+    /// 角色
+    /// </summary>
+    public ICollection<RoleEntity> Roles { get; set; }
+
+    /// <summary>
+    /// 状态
+    /// </summary>
+    public UserStatusEnum Status { get; set; }
+
+    /// <summary>
+    /// 员工信息
+    /// </summary>
+    public EmployeeUpdateInput Emp { get; set; }
+
     /// <summary>
     /// 版本
     /// </summary>

+ 0 - 2
src/platform/ZhonTai.Admin/Services/User/IUserService.cs

@@ -16,8 +16,6 @@ public interface IUserService
 
     Task<IResultOutput> GetAsync(long id);
 
-    Task<IResultOutput> GetSelectAsync();
-
     Task<IResultOutput> GetPageAsync(PageInput input);
 
     Task<IResultOutput> AddAsync(UserAddInput input);

+ 117 - 43
src/platform/ZhonTai.Admin/Services/User/UserService.cs

@@ -22,6 +22,9 @@ using ZhonTai.DynamicApi;
 using ZhonTai.DynamicApi.Attributes;
 using ZhonTai.Admin.Core.Helpers;
 using ZhonTai.Admin.Core.Consts;
+using ZhonTai.Admin.Domain.Employee;
+using ZhonTai.Admin.Domain;
+using ZhonTai.Admin.Domain.Organization;
 
 namespace ZhonTai.Admin.Services.User;
 
@@ -31,27 +34,17 @@ namespace ZhonTai.Admin.Services.User;
 [DynamicApi(Area = AdminConsts.AreaName)]
 public class UserService : BaseService, IUserService, IDynamicApi
 {
-    private readonly AppConfig _appConfig;
-    private readonly IUserRepository _userRepository;
-    private readonly IRepositoryBase<UserRoleEntity> _userRoleRepository;
-    private readonly ITenantRepository _tenantRepository;
-    private readonly IApiRepository _apiRepository;
-
+    private AppConfig _appConfig => LazyGetRequiredService<AppConfig>();
+    private IUserRepository _userRepository => LazyGetRequiredService<IUserRepository>();
+    private IRepositoryBase<UserRoleEntity> _userRoleRepository => LazyGetRequiredService<IRepositoryBase<UserRoleEntity>>();
+    private ITenantRepository _tenantRepository => LazyGetRequiredService<ITenantRepository>();
+    private IApiRepository _apiRepository => LazyGetRequiredService<IApiRepository>();
     private IRoleRepository _roleRepository => LazyGetRequiredService<IRoleRepository>();
+    private IEmployeeRepository _employeeRepository => LazyGetRequiredService<IEmployeeRepository>();
+    private IRepositoryBase<EmployeeOrganizationEntity> _employeeOrganizationRepository => LazyGetRequiredService<IRepositoryBase<EmployeeOrganizationEntity>>();
 
-    public UserService(
-        AppConfig appConfig,
-        IUserRepository userRepository,
-        IRepositoryBase<UserRoleEntity> userRoleRepository,
-        ITenantRepository tenantRepository,
-        IApiRepository apiRepository
-    )
+    public UserService()
     {
-        _appConfig = appConfig;
-        _userRepository = userRepository;
-        _userRoleRepository = userRoleRepository;
-        _tenantRepository = tenantRepository;
-        _apiRepository = apiRepository;
     }
 
     /// <summary>
@@ -61,14 +54,24 @@ public class UserService : BaseService, IUserService, IDynamicApi
     /// <returns></returns>
     public async Task<IResultOutput> GetAsync(long id)
     {
-        var entity = await _userRepository.Select
+        var output = await _userRepository.Select
         .WhereDynamic(id)
-        .IncludeMany(a => a.Roles.Select(b => new RoleEntity { Id = b.Id }))
-        .ToOneAsync();
-
-        var roles = await _roleRepository.Select.ToListAsync(a => new { a.Id, a.Name });
+        .IncludeMany(a => a.Roles.Select(b => new RoleEntity { Id = b.Id, Name = b.Name }))
+        .IncludeMany(a => a.Emp.Orgs.Select(b => new OrganizationEntity { Id = b.Id, Name = b.Name }))
+        .ToOneAsync(a=>new
+        {
+            a.Id,
+            a.UserName,
+            a.Name,
+            a.Roles,
+            Emp = new
+            {
+                a.Emp.MainOrgId,
+                a.Emp.Orgs
+            }
+        });
 
-        return ResultOutput.Ok(new { Form = Mapper.Map<UserGetOutput>(entity), Select = new { roles } });
+        return ResultOutput.Ok(output);
     }
 
     /// <summary>
@@ -117,17 +120,6 @@ public class UserService : BaseService, IUserService, IDynamicApi
         return output.Ok(entityDto);
     }
 
-    /// <summary>
-    /// 查询下拉数据
-    /// </summary>
-    /// <returns></returns>
-    public async Task<IResultOutput> GetSelectAsync()
-    {
-        var roles = await _roleRepository.Select.ToListAsync(a => new { a.Id, a.Name });
-
-        return ResultOutput.Ok(new { Select = new { roles } });
-    }
-
     /// <summary>
     /// 查询用户基本信息
     /// </summary>
@@ -170,6 +162,22 @@ public class UserService : BaseService, IUserService, IDynamicApi
     [Transaction]
     public async Task<IResultOutput> AddAsync(UserAddInput input)
     {
+        if (await _userRepository.Select.AnyAsync(a => a.UserName == input.UserName))
+        {
+            return ResultOutput.NotOk($"账号已存在");
+        }
+
+        if (input.Mobile.NotNull() && await _userRepository.Select.AnyAsync(a => a.Mobile == input.Mobile))
+        {
+            return ResultOutput.NotOk($"手机号已存在");
+        }
+
+        if (input.Email.NotNull() && await _userRepository.Select.AnyAsync(a => a.Email == input.Email))
+        {
+            return ResultOutput.NotOk($"邮箱已存在");
+        }
+
+        // 用户信息
         if (input.Password.IsNull())
         {
             input.Password = _appConfig.DefaultPassword;
@@ -182,15 +190,32 @@ public class UserService : BaseService, IUserService, IDynamicApi
 
         if (!(user?.Id > 0))
         {
-            return ResultOutput.NotOk();
+            return ResultOutput.NotOk("新增用户失败");
         }
 
+        //用户角色
         if (input.RoleIds != null && input.RoleIds.Any())
         {
             var roles = input.RoleIds.Select(a => new UserRoleEntity { UserId = user.Id, RoleId = a });
             await _userRoleRepository.InsertAsync(roles);
         }
 
+        // 员工信息
+        var emp = Mapper.Map<EmployeeEntity>(input.Emp);
+        emp.Id = user.Id;
+        await _employeeRepository.InsertAsync(emp);
+
+        //所属部门
+        if (input.Emp.OrgIds != null && input.Emp.OrgIds.Any())
+        {
+            var organizations = input.Emp.OrgIds.Select(organizationId => new EmployeeOrganizationEntity
+            {
+                EmployeeId = emp.Id,
+                OrganizationId = organizationId
+            });
+            await _employeeOrganizationRepository.InsertAsync(organizations);
+        }
+
         return ResultOutput.Ok();
     }
 
@@ -202,28 +227,61 @@ public class UserService : BaseService, IUserService, IDynamicApi
     [Transaction]
     public async Task<IResultOutput> UpdateAsync(UserUpdateInput input)
     {
-        if (!(input?.Id > 0))
+        var user = await _userRepository.GetAsync(input.Id);
+        if (!(user?.Id > 0))
         {
-            return ResultOutput.NotOk();
+            return ResultOutput.NotOk("用户不存在");
         }
 
-        var user = await _userRepository.GetAsync(input.Id);
-        if (!(user?.Id > 0))
+        if (await _userRepository.Select.AnyAsync(a => a.Id != input.Id && a.UserName == input.UserName))
+        {
+            return ResultOutput.NotOk($"账号已存在");
+        }
+
+        if (input.Mobile.NotNull() && await _userRepository.Select.AnyAsync(a => a.Id != input.Id && a.Mobile == input.Mobile))
         {
-            return ResultOutput.NotOk("用户不存在!");
+            return ResultOutput.NotOk($"手机号已存在");
+        }
+
+        if (input.Email.NotNull() && await _userRepository.Select.AnyAsync(a => a.Id != input.Id && a.Email == input.Email))
+        {
+            return ResultOutput.NotOk($"邮箱已存在");
         }
 
         Mapper.Map(input, user);
         await _userRepository.UpdateAsync(user);
 
+        // 用户角色
         await _userRoleRepository.DeleteAsync(a => a.UserId == user.Id);
-
         if (input.RoleIds != null && input.RoleIds.Any())
         {
             var roles = input.RoleIds.Select(a => new UserRoleEntity { UserId = user.Id, RoleId = a });
             await _userRoleRepository.InsertAsync(roles);
         }
 
+        // 员工信息
+        var emp = await _employeeRepository.GetAsync(input.Emp.Id);
+        if(emp == null)
+        {
+            emp = new EmployeeEntity();
+        }
+        Mapper.Map(input.Emp, emp);
+        emp.Id = user.Id;
+
+        await _employeeRepository.InsertOrUpdateAsync(emp);
+
+        //所属部门
+        await _employeeOrganizationRepository.DeleteAsync(a => a.EmployeeId == emp.Id);
+        if (input.Emp.OrgIds != null && input.Emp.OrgIds.Any())
+        {
+            var organizations = input.Emp.OrgIds.Select(organizationId => new EmployeeOrganizationEntity
+            {
+                EmployeeId = emp.Id,
+                OrganizationId = organizationId
+            });
+            await _employeeOrganizationRepository.InsertAsync(organizations);
+        }
+
         return ResultOutput.Ok();
     }
 
@@ -279,8 +337,14 @@ public class UserService : BaseService, IUserService, IDynamicApi
     [Transaction]
     public async Task<IResultOutput> DeleteAsync(long id)
     {
+        //删除员工所属部门
+        await _employeeOrganizationRepository.DeleteAsync(a => a.EmployeeId == id);
+        //删除员工
+        await _employeeRepository.DeleteAsync(a => a.Id == id);
+        //删除用户角色
         await _userRoleRepository.DeleteAsync(a => a.UserId == id);
-        await _userRepository.DeleteAsync(m => m.Id == id);
+        //删除用户
+        await _userRepository.DeleteAsync(a => a.Id == id);
 
         return ResultOutput.Ok();
     }
@@ -293,7 +357,13 @@ public class UserService : BaseService, IUserService, IDynamicApi
     [Transaction]
     public async Task<IResultOutput> BatchDeleteAsync(long[] ids)
     {
+        //删除员工所属部门
+        await _employeeOrganizationRepository.DeleteAsync(a => ids.Contains(a.EmployeeId));
+        //删除员工
+        await _employeeRepository.DeleteAsync(a => ids.Contains(a.Id));
+        //删除用户角色
         await _userRoleRepository.DeleteAsync(a => ids.Contains(a.UserId));
+        //删除用户
         await _userRepository.DeleteAsync(a => ids.Contains(a.Id));
 
         return ResultOutput.Ok();
@@ -307,6 +377,8 @@ public class UserService : BaseService, IUserService, IDynamicApi
     [Transaction]
     public async Task<IResultOutput> SoftDeleteAsync(long id)
     {
+        await _employeeOrganizationRepository.DeleteAsync(a => a.EmployeeId == id);
+        await _employeeRepository.SoftDeleteAsync(a => a.Id == id);
         await _userRoleRepository.DeleteAsync(a => a.UserId == id);
         await _userRepository.SoftDeleteAsync(id);
 
@@ -321,6 +393,8 @@ public class UserService : BaseService, IUserService, IDynamicApi
     [Transaction]
     public async Task<IResultOutput> BatchSoftDeleteAsync(long[] ids)
     {
+        await _employeeOrganizationRepository.DeleteAsync(a => ids.Contains(a.EmployeeId));
+        await _employeeRepository.SoftDeleteAsync(a => ids.Contains(a.Id));
         await _userRoleRepository.DeleteAsync(a => ids.Contains(a.UserId));
         await _userRepository.SoftDeleteAsync(ids);
 

+ 0 - 4
src/platform/ZhonTai.Admin/Services/User/_MapConfig.cs

@@ -12,10 +12,6 @@ public class MapConfig : IRegister
 {
     public void Register(TypeAdapterConfig config)
     {
-        config
-        .NewConfig<UserEntity, UserGetOutput>()
-        .Map(dest => dest.RoleIds, src => src.Roles.Select(a => a.Id));
-
         config
         .NewConfig<UserEntity, UserGetPageOutput>()
         .Map(dest => dest.RoleNames, src => src.Roles.Select(a => a.Name));

+ 188 - 149
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -1848,7 +1848,7 @@
         </member>
         <member name="T:ZhonTai.Admin.Domain.EmployeeOrganizationEntity">
             <summary>
-            员工属部门
+            员工属部门
             </summary>
         </member>
         <member name="P:ZhonTai.Admin.Domain.EmployeeOrganizationEntity.EmployeeId">
@@ -1911,6 +1911,56 @@
             入职时间
             </summary>
         </member>
+        <member name="T:ZhonTai.Admin.Domain.Employee.Input.EmployeeAddInput">
+            <summary>
+            添加
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Input.EmployeeAddInput.JobNumber">
+            <summary>
+            工号
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Input.EmployeeAddInput.Sex">
+            <summary>
+            性别
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Input.EmployeeAddInput.MainOrgId">
+            <summary>
+            主属部门Id
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Input.EmployeeAddInput.OrgIds">
+            <summary>
+            所属部门
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Input.EmployeeAddInput.Position">
+            <summary>
+            职位
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Input.EmployeeAddInput.EntryTime">
+            <summary>
+            入职时间
+            </summary>
+        </member>
+        <member name="T:ZhonTai.Admin.Domain.Employee.Input.EmployeeUpdateInput">
+            <summary>
+            修改
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Input.EmployeeUpdateInput.Id">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Input.EmployeeUpdateInput.Version">
+            <summary>
+            版本
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.Employee.Output.EmployeeDataOutput">
             <summary>
             员工数据导出
@@ -1981,6 +2031,66 @@
             入职时间
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeGetOutput.OrganizationName">
+            <summary>
+            主属部门
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeGetOutput.OrganizationNames">
+            <summary>
+            附属部门
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeGetOutput.Position">
+            <summary>
+            职位
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeListOutput.Id">
+            <summary>
+            主键Id
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeListOutput.Name">
+            <summary>
+            姓名
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeListOutput.NickName">
+            <summary>
+            昵称
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeListOutput.UserName">
+            <summary>
+            账号
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeListOutput.JobNumber">
+            <summary>
+            工号
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeListOutput.OrganizationName">
+            <summary>
+            主属部门
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeListOutput.OrganizationNames">
+            <summary>
+            附属部门
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeListOutput.Position">
+            <summary>
+            职位
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.Employee.Output.EmployeeListOutput.Phone">
+            <summary>
+            手机号
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.Employee.SexEnum">
             <summary>
             性别
@@ -2791,6 +2901,16 @@
             用户状态
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Domain.User.UserEntity.Roles">
+            <summary>
+            角色列表
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.User.UserEntity.Emp">
+            <summary>
+            员工
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Domain.User.UserStatusEnum">
             <summary>
             用户状态
@@ -2821,6 +2941,36 @@
             待激活
             </summary>
         </member>
+        <member name="T:ZhonTai.Admin.Domain.User.EmployeeAddInput">
+            <summary>
+            员工添加
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.User.EmployeeAddInput.MainOrgId">
+            <summary>
+            主属部门Id
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.User.EmployeeAddInput.OrgIds">
+            <summary>
+            所属部门
+            </summary>
+        </member>
+        <member name="T:ZhonTai.Admin.Domain.User.EmployeeUpdateInput">
+            <summary>
+            修改
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.User.EmployeeUpdateInput.Id">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Domain.User.EmployeeUpdateInput.Version">
+            <summary>
+            版本
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Domain.View.Dto.ViewDataOutput.TenantId">
             <summary>
             租户Id
@@ -2940,14 +3090,14 @@
             <param name="input"></param>
             <returns></returns>
         </member>
-        <member name="M:ZhonTai.Admin.HttpApi.Controllers.EmployeeController.Add(ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput)">
+        <member name="M:ZhonTai.Admin.HttpApi.Controllers.EmployeeController.Add(ZhonTai.Admin.Domain.Employee.Input.EmployeeAddInput)">
             <summary>
             新增员工
             </summary>
             <param name="input"></param>
             <returns></returns>
         </member>
-        <member name="M:ZhonTai.Admin.HttpApi.Controllers.EmployeeController.Update(ZhonTai.Admin.Services.Employee.Input.EmployeeUpdateInput)">
+        <member name="M:ZhonTai.Admin.HttpApi.Controllers.EmployeeController.Update(ZhonTai.Admin.Domain.Employee.Input.EmployeeUpdateInput)">
             <summary>
             修改员工
             </summary>
@@ -4055,14 +4205,14 @@
             <param name="input"></param>
             <returns></returns>
         </member>
-        <member name="M:ZhonTai.Admin.Services.Employee.EmployeeService.AddAsync(ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput)">
+        <member name="M:ZhonTai.Admin.Services.Employee.EmployeeService.AddAsync(ZhonTai.Admin.Domain.Employee.Input.EmployeeAddInput)">
             <summary>
             新增
             </summary>
             <param name="input"></param>
             <returns></returns>
         </member>
-        <member name="M:ZhonTai.Admin.Services.Employee.EmployeeService.UpdateAsync(ZhonTai.Admin.Services.Employee.Input.EmployeeUpdateInput)">
+        <member name="M:ZhonTai.Admin.Services.Employee.EmployeeService.UpdateAsync(ZhonTai.Admin.Domain.Employee.Input.EmployeeUpdateInput)">
             <summary>
             修改
             </summary>
@@ -4095,136 +4245,6 @@
             员工服务
             </summary>
         </member>
-        <member name="T:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput">
-            <summary>
-            添加
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.Name">
-            <summary>
-            姓名
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.NickName">
-            <summary>
-            昵称
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.Sex">
-            <summary>
-            性别
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.JobNumber">
-            <summary>
-            工号
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.OrganizationId">
-            <summary>
-            主属部门Id
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.OrganizationIds">
-            <summary>
-            附属部门
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.Position">
-            <summary>
-            职位
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.Phone">
-            <summary>
-            手机号
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.Email">
-            <summary>
-            邮箱
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeAddInput.EntryTime">
-            <summary>
-            入职时间
-            </summary>
-        </member>
-        <member name="T:ZhonTai.Admin.Services.Employee.Input.EmployeeUpdateInput">
-            <summary>
-            修改
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeUpdateInput.Id">
-            <summary>
-            编号
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Input.EmployeeUpdateInput.Version">
-            <summary>
-            版本
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeGetOutput.OrganizationName">
-            <summary>
-            主属部门
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeGetOutput.OrganizationNames">
-            <summary>
-            附属部门
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeGetOutput.Position">
-            <summary>
-            职位
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeListOutput.Id">
-            <summary>
-            主键Id
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeListOutput.Name">
-            <summary>
-            姓名
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeListOutput.NickName">
-            <summary>
-            昵称
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeListOutput.UserName">
-            <summary>
-            账号
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeListOutput.JobNumber">
-            <summary>
-            工号
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeListOutput.OrganizationName">
-            <summary>
-            主属部门
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeListOutput.OrganizationNames">
-            <summary>
-            附属部门
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeListOutput.Position">
-            <summary>
-            职位
-            </summary>
-        </member>
-        <member name="P:ZhonTai.Admin.Services.Employee.Output.EmployeeListOutput.Phone">
-            <summary>
-            手机号
-            </summary>
-        </member>
         <member name="T:ZhonTai.Admin.Services.Employee.MapConfig">
             <summary>
             映射配置
@@ -5708,14 +5728,14 @@
             姓名
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Services.User.Dto.UserAddInput.Status">
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserAddInput.Mobile">
             <summary>
-            状态
+            手机号
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Services.User.Dto.UserAddInput.Remark">
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserAddInput.Email">
             <summary>
-            备注
+            邮箱
             </summary>
         </member>
         <member name="P:ZhonTai.Admin.Services.User.Dto.UserAddInput.RoleIds">
@@ -5723,6 +5743,16 @@
             角色
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserAddInput.Status">
+            <summary>
+            状态
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserAddInput.Emp">
+            <summary>
+            员工
+            </summary>
+        </member>
         <member name="T:ZhonTai.Admin.Services.User.Dto.UserChangePasswordInput">
             <summary>
             修改密码
@@ -5838,14 +5868,14 @@
             姓名
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.Status">
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.Mobile">
             <summary>
-            状态
+            手机号
             </summary>
         </member>
-        <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.Remark">
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.Email">
             <summary>
-            备注
+            邮箱
             </summary>
         </member>
         <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.RoleIds">
@@ -5853,6 +5883,21 @@
             角色
             </summary>
         </member>
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.Roles">
+            <summary>
+            角色
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.Status">
+            <summary>
+            状态
+            </summary>
+        </member>
+        <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.Emp">
+            <summary>
+            员工信息
+            </summary>
+        </member>
         <member name="P:ZhonTai.Admin.Services.User.Dto.UserUpdateInput.Version">
             <summary>
             版本
@@ -5889,12 +5934,6 @@
             <param name="id"></param>
             <returns></returns>
         </member>
-        <member name="M:ZhonTai.Admin.Services.User.UserService.GetSelectAsync">
-            <summary>
-            查询下拉数据
-            </summary>
-            <returns></returns>
-        </member>
         <member name="M:ZhonTai.Admin.Services.User.UserService.GetBasicAsync">
             <summary>
             查询用户基本信息