Răsfoiți Sursa

雪花漂移算法增加是否启用判断
实现员工、组织架构、职位管理功能

zhontai 3 ani în urmă
părinte
comite
39acfb53cb
32 a modificat fișierele cu 1286 adăugiri și 43 ștergeri
  1. 1 0
      Admin.Core.Common/Attributes/SnowflakeAttribute.cs
  2. 42 7
      Admin.Core.Model/Personnel/EmployeeEntity.cs
  3. 9 1
      Admin.Core.Model/Personnel/OrganizationEntity.cs
  4. 3 3
      Admin.Core.Repository/Base/DbHelper.cs
  5. 20 4
      Admin.Core.Repository/Base/IRepositoryBase.cs
  6. 39 6
      Admin.Core.Repository/Base/RepositoryBase.cs
  7. 11 0
      Admin.Core.Repository/Personnel/Employee/EmployeeRepository.cs
  8. 8 0
      Admin.Core.Repository/Personnel/Employee/IEmployeeRepository.cs
  9. 8 0
      Admin.Core.Repository/Personnel/Position/IPositionRepository.cs
  10. 11 0
      Admin.Core.Repository/Personnel/Position/PositionRepository.cs
  11. 5 5
      Admin.Core.Service/Admin/Permission/Input/PermissionAddDotInput.cs
  12. 143 0
      Admin.Core.Service/Personnel/Employee/EmployeeService.cs
  13. 29 0
      Admin.Core.Service/Personnel/Employee/IEmployeeService.cs
  14. 67 0
      Admin.Core.Service/Personnel/Employee/Input/EmployeeAddInput.cs
  15. 19 0
      Admin.Core.Service/Personnel/Employee/Input/EmployeeUpdateInput.cs
  16. 8 0
      Admin.Core.Service/Personnel/Employee/Output/EmployeeGetOutput.cs
  17. 42 0
      Admin.Core.Service/Personnel/Employee/Output/EmployeeListOutput.cs
  18. 41 0
      Admin.Core.Service/Personnel/Employee/_MapConfig.cs
  19. 10 0
      Admin.Core.Service/Personnel/Organization/Input/OrganizationAddInput.cs
  20. 2 0
      Admin.Core.Service/Personnel/Organization/_MapConfig.cs
  21. 25 0
      Admin.Core.Service/Personnel/Position/IPositionService.cs
  22. 28 0
      Admin.Core.Service/Personnel/Position/Input/PositionAddInput.cs
  23. 18 0
      Admin.Core.Service/Personnel/Position/Input/PositionUpdateInput.cs
  24. 8 0
      Admin.Core.Service/Personnel/Position/Output/PositionGetOutput.cs
  25. 37 0
      Admin.Core.Service/Personnel/Position/Output/PositionListOutput.cs
  26. 99 0
      Admin.Core.Service/Personnel/Position/PositionService.cs
  27. 20 0
      Admin.Core.Service/Personnel/Position/_MapConfig.cs
  28. 42 12
      Admin.Core/Admin.Core.Model.xml
  29. 216 5
      Admin.Core/Admin.Core.Service.xml
  30. 94 0
      Admin.Core/Admin.Core.xml
  31. 92 0
      Admin.Core/Controllers/Personnel/EmployeeController.cs
  32. 89 0
      Admin.Core/Controllers/Personnel/PositionController.cs

+ 1 - 0
Admin.Core.Common/Attributes/SnowflakeAttribute.cs

@@ -5,5 +5,6 @@ namespace Admin.Core.Common.Attributes
     [AttributeUsage(AttributeTargets.Property)]
     public class SnowflakeAttribute : Attribute
     {
+        public bool Enable { get; set; } = true;
     }
 }

+ 42 - 7
Admin.Core.Model/Personnel/EmployeeEntity.cs

@@ -3,6 +3,7 @@ using Admin.Core.Model.Admin;
 using Admin.Core.Model.Enums;
 using FreeSql.DataAnnotations;
 using System;
+using System.Collections.Generic;
 
 namespace Admin.Core.Model.Personnel
 {
@@ -22,16 +23,23 @@ namespace Admin.Core.Model.Personnel
         public TenantEntity Tenant { get; set; }
 
         /// <summary>
-        /// 员工编号
+        /// 用户Id
         /// </summary>
-        public string Code { get; set; }
+        public long? UserId { get; set; }
+
+        public UserEntity User { get; set; }
 
         /// <summary>
-        /// 部门Id
+        /// 姓名
         /// </summary>
-        public long OrganizationId { get; set; }
+        [Column(StringLength = 20)]
+        public string Name { get; set; }
 
-        public OrganizationEntity Organization { get; set; }
+        /// <summary>
+        /// 昵称
+        /// </summary>
+        [Column(StringLength = 20)]
+        public string NickName { get; set; }
 
         /// <summary>
         /// 性别
@@ -39,10 +47,17 @@ namespace Admin.Core.Model.Personnel
         public Sex Sex { get; set; }
 
         /// <summary>
-        /// 手机
+        /// 
         /// </summary>
         [Column(StringLength = 20)]
-        public string Phone { get; set; }
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 主属部门Id
+        /// </summary>
+        public long OrganizationId { get; set; }
+
+        public OrganizationEntity Organization { get; set; }
 
         /// <summary>
         /// 职位Id
@@ -50,5 +65,25 @@ namespace Admin.Core.Model.Personnel
         public long PositionId { get; set; }
 
         public PositionEntity Position { get; set; }
+
+        /// <summary>
+        /// 手机号
+        /// </summary>
+        [Column(StringLength = 20)]
+        public string Phone { get; set; }
+
+        /// <summary>
+        /// 邮箱
+        /// </summary>
+        [Column(StringLength = 250)]
+        public string Email { get; set; }
+
+        /// <summary>
+        /// 入职时间
+        /// </summary>
+        public DateTime HireDate { get; set; }
+
+        [Navigate(ManyToMany = typeof(EmployeeOrganizationEntity))]
+        public ICollection<OrganizationEntity> Organizations { get; set; }
     }
 }

+ 9 - 1
Admin.Core.Model/Personnel/OrganizationEntity.cs

@@ -43,10 +43,15 @@ namespace Admin.Core.Model.Personnel
         [Column(StringLength = 50)]
         public string Value { get; set; }
 
+        /// <summary>
+        /// 主管Id
+        /// </summary>
+        public long? PrimaryEmployeeId { get; set; }
+
         /// <summary>
         /// 主管
         /// </summary>
-        public long? PrimaryUserId { get; set; }
+        public EmployeeEntity PrimaryEmployee { get; set; }
 
         /// <summary>
         /// 员工人数
@@ -68,5 +73,8 @@ namespace Admin.Core.Model.Personnel
         /// 排序
         /// </summary>
 		public int Sort { get; set; }
+
+        [Navigate(ManyToMany = typeof(EmployeeOrganizationEntity))]
+        public ICollection<EmployeeEntity> Employees { get; set; }
     }
 }

+ 3 - 3
Admin.Core.Repository/Base/DbHelper.cs

@@ -136,8 +136,8 @@ namespace Admin.Core.Repository
             }
 
             if (e.Column.CsType == typeof(long)
-            && e.Property.GetCustomAttribute<SnowflakeAttribute>(false) != null
-            && (e.Value == null || (long)e.Value == default || (long?)e.Value == default))
+            && e.Property.GetCustomAttribute<SnowflakeAttribute>(false) is SnowflakeAttribute snowflakeAttribute
+            && snowflakeAttribute.Enable && (e.Value == null || (long)e.Value == default || (long?)e.Value == default))
             {
                 e.Value = YitIdHelper.NextId();
             }
@@ -173,7 +173,7 @@ namespace Admin.Core.Repository
                         break;
                 }
             }
-            else if (e.AuditValueType == FreeSql.Aop.AuditValueType.Update)
+            else if (e.AuditValueType == AuditValueType.Update)
             {
                 switch (e.Property.Name)
                 {

+ 20 - 4
Admin.Core.Repository/Base/IRepositoryBase.cs

@@ -30,18 +30,27 @@ namespace Admin.Core.Repository
         Task<TEntity> GetAsync(Expression<Func<TEntity, bool>> exp);
 
         /// <summary>
-        /// 删除
+        /// 递归删除
         /// </summary>
-        /// <param name="id"></param>
+        /// <param name="exp"></param>
+        /// <param name="disableGlobalFilterNames">禁用全局过滤器名</param>
         /// <returns></returns>
-        Task<bool> SoftDeleteAsync(TKey id);
+        Task<bool> RecursiveDeleteAsync(Expression<Func<TEntity, bool>> exp, params string[] disableGlobalFilterNames);
+
+        /// <summary>
+        /// 递归软删除
+        /// </summary>
+        /// <param name="exp"></param>
+        /// <param name="disableGlobalFilterNames">禁用全局过滤器名</param>
+        /// <returns></returns>
+        Task<bool> RecursiveSoftDeleteAsync(Expression<Func<TEntity, bool>> exp, params string[] disableGlobalFilterNames);
 
         /// <summary>
         /// 软删除
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-        Task<bool> SoftDeleteAsync(Expression<Func<TEntity, bool>> exp, params string[] name);
+        Task<bool> SoftDeleteAsync(TKey id);
 
         /// <summary>
         /// 批量删除
@@ -49,6 +58,13 @@ namespace Admin.Core.Repository
         /// <param name="id"></param>
         /// <returns></returns>
         Task<bool> SoftDeleteAsync(TKey[] id);
+
+        /// <summary>
+        /// 软删除
+        /// </summary>
+        /// <param name="disableGlobalFilterNames">禁用全局过滤器名</param>
+        /// <returns></returns>
+        Task<bool> SoftDeleteAsync(Expression<Func<TEntity, bool>> exp, params string[] disableGlobalFilterNames);
     }
 
     public interface IRepositoryBase<TEntity> : IRepositoryBase<TEntity, long> where TEntity : class

+ 39 - 6
Admin.Core.Repository/Base/RepositoryBase.cs

@@ -29,7 +29,37 @@ namespace Admin.Core.Repository
             return Select.Where(exp).ToOneAsync();
         }
 
-        public async Task<bool> SoftDeleteAsync(TKey id)
+        public virtual async Task<bool> RecursiveDeleteAsync(Expression<Func<TEntity, bool>> exp, params string[] disableGlobalFilterNames)
+        {
+            await Select
+            .Where(exp)
+            .DisableGlobalFilter(disableGlobalFilterNames)
+            .AsTreeCte()
+            .ToDelete()
+            .ExecuteAffrowsAsync();
+
+            return true;
+        }
+
+        public virtual async Task<bool> RecursiveSoftDeleteAsync(Expression<Func<TEntity, bool>> exp, params string[] disableGlobalFilterNames)
+        {
+            await Select
+            .Where(exp)
+            .DisableGlobalFilter(disableGlobalFilterNames)
+            .AsTreeCte()
+            .ToUpdate()
+            .SetDto(new
+            {
+                IsDeleted = true,
+                ModifiedUserId = User.Id,
+                ModifiedUserName = User.Name
+            })
+            .ExecuteAffrowsAsync();
+
+            return true;
+        }
+
+        public virtual async Task<bool> SoftDeleteAsync(TKey id)
         {
             await UpdateDiy
                 .SetDto(new
@@ -40,10 +70,11 @@ namespace Admin.Core.Repository
                 })
                 .WhereDynamic(id)
                 .ExecuteAffrowsAsync();
+
             return true;
         }
 
-        public async Task<bool> SoftDeleteAsync(Expression<Func<TEntity, bool>> exp, params string[] name)
+        public virtual async Task<bool> SoftDeleteAsync(TKey[] ids)
         {
             await UpdateDiy
                 .SetDto(new
@@ -52,13 +83,13 @@ namespace Admin.Core.Repository
                     ModifiedUserId = User.Id,
                     ModifiedUserName = User.Name
                 })
-                .Where(exp)
-                .DisableGlobalFilter(name)
+                .WhereDynamic(ids)
                 .ExecuteAffrowsAsync();
+
             return true;
         }
 
-        public async Task<bool> SoftDeleteAsync(TKey[] ids)
+        public virtual async Task<bool> SoftDeleteAsync(Expression<Func<TEntity, bool>> exp, params string[] disableGlobalFilterNames)
         {
             await UpdateDiy
                 .SetDto(new
@@ -67,8 +98,10 @@ namespace Admin.Core.Repository
                     ModifiedUserId = User.Id,
                     ModifiedUserName = User.Name
                 })
-                .WhereDynamic(ids)
+                .Where(exp)
+                .DisableGlobalFilter(disableGlobalFilterNames)
                 .ExecuteAffrowsAsync();
+
             return true;
         }
     }

+ 11 - 0
Admin.Core.Repository/Personnel/Employee/EmployeeRepository.cs

@@ -0,0 +1,11 @@
+using Admin.Core.Model.Personnel;
+
+namespace Admin.Core.Repository.Personnel
+{
+    public class EmployeeRepository : RepositoryBase<EmployeeEntity>, IEmployeeRepository
+    {
+        public EmployeeRepository(MyUnitOfWorkManager muowm) : base(muowm)
+        {
+        }
+    }
+}

+ 8 - 0
Admin.Core.Repository/Personnel/Employee/IEmployeeRepository.cs

@@ -0,0 +1,8 @@
+using Admin.Core.Model.Personnel;
+
+namespace Admin.Core.Repository.Personnel
+{
+    public interface IEmployeeRepository : IRepositoryBase<EmployeeEntity>
+    {
+    }
+}

+ 8 - 0
Admin.Core.Repository/Personnel/Position/IPositionRepository.cs

@@ -0,0 +1,8 @@
+using Admin.Core.Model.Personnel;
+
+namespace Admin.Core.Repository.Personnel
+{
+    public interface IPositionRepository : IRepositoryBase<PositionEntity>
+    {
+    }
+}

+ 11 - 0
Admin.Core.Repository/Personnel/Position/PositionRepository.cs

@@ -0,0 +1,11 @@
+using Admin.Core.Model.Personnel;
+
+namespace Admin.Core.Repository.Personnel
+{
+    public class PositionRepository : RepositoryBase<PositionEntity>, IPositionRepository
+    {
+        public PositionRepository(MyUnitOfWorkManager muowm) : base(muowm)
+        {
+        }
+    }
+}

+ 5 - 5
Admin.Core.Service/Admin/Permission/Input/PermissionAddDotInput.cs

@@ -14,6 +14,11 @@ namespace Admin.Core.Service.Admin.Permission.Input
         /// </summary>
         public long ParentId { get; set; }
 
+        /// <summary>
+        /// 关联接口
+        /// </summary>
+        public long[] ApiIds { get; set; }
+
         /// <summary>
         /// 权限名称
         /// </summary>
@@ -33,10 +38,5 @@ namespace Admin.Core.Service.Admin.Permission.Input
         /// 图标
         /// </summary>
         public string Icon { get; set; }
-
-        /// <summary>
-        /// 接口
-        /// </summary>
-        public long[] ApiIds { get; set; }
     }
 }

+ 143 - 0
Admin.Core.Service/Personnel/Employee/EmployeeService.cs

@@ -0,0 +1,143 @@
+using Admin.Core.Common.Attributes;
+using Admin.Core.Common.Configs;
+using Admin.Core.Common.Helpers;
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
+using Admin.Core.Model.Personnel;
+using Admin.Core.Repository;
+using Admin.Core.Repository.Personnel;
+using Admin.Core.Service.Personnel.Employee.Input;
+using Admin.Core.Service.Personnel.Employee.Output;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace Admin.Core.Service.Personnel.Employee
+{
+    /// <summary>
+    /// 员工服务
+    /// </summary>
+    public class EmployeeService : BaseService, IEmployeeService
+    {
+        private readonly IEmployeeRepository _employeeRepository;
+        private readonly IRepositoryBase<EmployeeOrganizationEntity> _employeeOrganizationRepository;
+
+        public EmployeeService(
+            IEmployeeRepository userRepository,
+            IRepositoryBase<EmployeeOrganizationEntity> employeeOrganizationRepository
+        )
+        {
+            _employeeRepository = userRepository;
+            _employeeOrganizationRepository = employeeOrganizationRepository;
+        }
+
+        public async Task<ResponseOutput<EmployeeGetOutput>> GetAsync(long id)
+        {
+            var res = new ResponseOutput<EmployeeGetOutput>();
+
+            var entity = await _employeeRepository.Select
+            .WhereDynamic(id)
+            .IncludeMany(a => a.Organizations.Select(b => new OrganizationEntity { Id = b.Id }))
+            .ToOneAsync();
+
+            var entityDto = Mapper.Map<EmployeeGetOutput>(entity);
+            return res.Ok(entityDto);
+        }
+
+        public async Task<IResponseOutput> PageAsync(PageInput<EmployeeEntity> input)
+        {
+            var list = await _employeeRepository.Select
+            .WhereDynamicFilter(input.DynamicFilter)
+            .Count(out var total)
+            .OrderByDescending(true, a => a.Id)
+            .IncludeMany(a => a.Organizations.Select(b => new OrganizationEntity { Name = b.Name }))
+            .Page(input.CurrentPage, input.PageSize)
+            .ToListAsync();
+
+            var data = new PageOutput<EmployeeListOutput>()
+            {
+                List = Mapper.Map<List<EmployeeListOutput>>(list),
+                Total = total
+            };
+
+            return ResponseOutput.Ok(data);
+        }
+
+        [Transaction]
+        public async Task<IResponseOutput> AddAsync(EmployeeAddInput input)
+        {
+            var entity = Mapper.Map<EmployeeEntity>(input);
+            var employeeId = (await _employeeRepository.InsertAsync(entity))?.Id;
+
+            if (!(employeeId > 0))
+            {
+                return ResponseOutput.NotOk();
+            }
+
+            //附属部门
+            if (input.OrganizationIds != null && input.OrganizationIds.Any())
+            {
+                var organizations = input.OrganizationIds.Select(organizationId => new EmployeeOrganizationEntity { EmployeeId = employeeId.Value, OrganizationId = organizationId });
+                await _employeeOrganizationRepository.InsertAsync(organizations);
+            }
+
+            return ResponseOutput.Ok();
+        }
+
+        [Transaction]
+        public async Task<IResponseOutput> UpdateAsync(EmployeeUpdateInput input)
+        {
+            if (!(input?.Id > 0))
+            {
+                return ResponseOutput.NotOk();
+            }
+
+            var employee = await _employeeRepository.GetAsync(input.Id);
+            if (!(employee?.Id > 0))
+            {
+                return ResponseOutput.NotOk("用户不存在!");
+            }
+
+            Mapper.Map(input, employee);
+            await _employeeRepository.UpdateAsync(employee);
+
+            await _employeeOrganizationRepository.DeleteAsync(a => a.EmployeeId == employee.Id);
+
+            //附属部门
+            if (input.OrganizationIds != null && input.OrganizationIds.Any())
+            {
+                var organizations = input.OrganizationIds.Select(organizationId => new EmployeeOrganizationEntity { EmployeeId = employee.Id, OrganizationId = organizationId });
+                await _employeeOrganizationRepository.InsertAsync(organizations);
+            }
+
+            return ResponseOutput.Ok();
+        }
+
+        public async Task<IResponseOutput> DeleteAsync(long id)
+        {
+            var result = false;
+            if (id > 0)
+            {
+                result = (await _employeeRepository.DeleteAsync(m => m.Id == id)) > 0;
+            }
+
+            return ResponseOutput.Result(result);
+        }
+
+        [Transaction]
+        public async Task<IResponseOutput> SoftDeleteAsync(long id)
+        {
+            var result = await _employeeRepository.SoftDeleteAsync(id);
+
+            return ResponseOutput.Result(result);
+        }
+
+        [Transaction]
+        public async Task<IResponseOutput> BatchSoftDeleteAsync(long[] ids)
+        {
+            var result = await _employeeRepository.SoftDeleteAsync(ids);
+
+            return ResponseOutput.Result(result);
+        }
+    }
+}

+ 29 - 0
Admin.Core.Service/Personnel/Employee/IEmployeeService.cs

@@ -0,0 +1,29 @@
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
+using Admin.Core.Model.Personnel;
+using Admin.Core.Service.Personnel.Employee.Input;
+using Admin.Core.Service.Personnel.Employee.Output;
+using System.Threading.Tasks;
+
+namespace Admin.Core.Service.Personnel.Employee
+{
+    /// <summary>
+    /// Ô±¹¤·þÎñ
+    /// </summary>
+    public interface IEmployeeService
+    {
+        Task<ResponseOutput<EmployeeGetOutput>> GetAsync(long id);
+
+        Task<IResponseOutput> PageAsync(PageInput<EmployeeEntity> input);
+
+        Task<IResponseOutput> AddAsync(EmployeeAddInput input);
+
+        Task<IResponseOutput> UpdateAsync(EmployeeUpdateInput input);
+
+        Task<IResponseOutput> DeleteAsync(long id);
+
+        Task<IResponseOutput> SoftDeleteAsync(long id);
+
+        Task<IResponseOutput> BatchSoftDeleteAsync(long[] ids);
+    }
+}

+ 67 - 0
Admin.Core.Service/Personnel/Employee/Input/EmployeeAddInput.cs

@@ -0,0 +1,67 @@
+using Admin.Core.Model.Enums;
+using System;
+using System.ComponentModel.DataAnnotations;
+
+namespace Admin.Core.Service.Personnel.Employee.Input
+{
+    /// <summary>
+    /// 添加
+    /// </summary>
+    public class EmployeeAddInput
+    {
+        /// <summary>
+        /// 用户Id
+        /// </summary>
+        public long? UserId { get; set; }
+
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 昵称
+        /// </summary>
+        public string NickName { get; set; }
+
+        /// <summary>
+        /// 性别
+        /// </summary>
+        public Sex Sex { get; set; }
+
+        /// <summary>
+        /// 工号
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 主属部门Id
+        /// </summary>
+        public long OrganizationId { get; set; }
+
+        /// <summary>
+        /// 附属部门
+        /// </summary>
+        public long[] OrganizationIds { get; set; }
+
+        /// <summary>
+        /// 职位Id
+        /// </summary>
+        public long PositionId { get; set; }
+
+        /// <summary>
+        /// 手机号
+        /// </summary>
+        public string Phone { get; set; }
+
+        /// <summary>
+        /// 邮箱
+        /// </summary>
+        public string Email { get; set; }
+
+        /// <summary>
+        /// 入职时间
+        /// </summary>
+        public DateTime HireDate { get; set; }
+    }
+}

+ 19 - 0
Admin.Core.Service/Personnel/Employee/Input/EmployeeUpdateInput.cs

@@ -0,0 +1,19 @@
+
+namespace Admin.Core.Service.Personnel.Employee.Input
+{
+    /// <summary>
+    /// 修改
+    /// </summary>
+    public class EmployeeUpdateInput: EmployeeAddInput
+    {
+        /// <summary>
+        /// 编号
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 版本
+        /// </summary>
+        public long Version { get; set; }
+    }
+}

+ 8 - 0
Admin.Core.Service/Personnel/Employee/Output/EmployeeGetOutput.cs

@@ -0,0 +1,8 @@
+using Admin.Core.Service.Personnel.Employee.Input;
+
+namespace Admin.Core.Service.Personnel.Employee.Output
+{
+    public class EmployeeGetOutput : EmployeeUpdateInput
+    {
+    }
+}

+ 42 - 0
Admin.Core.Service/Personnel/Employee/Output/EmployeeListOutput.cs

@@ -0,0 +1,42 @@
+using System;
+
+namespace Admin.Core.Service.Personnel.Employee.Output
+{
+    public class EmployeeListOutput
+    {
+        /// <summary>
+        /// 主键Id
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 账号
+        /// </summary>
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 主属部门
+        /// </summary>
+        public long OrganizationName { get; set; }
+
+        /// <summary>
+        /// 附属部门
+        /// </summary>
+        public string[] OrganizationNames { get; set; }
+
+        /// <summary>
+        /// 职位
+        /// </summary>
+        public string PositionName { get; set; }
+
+        /// <summary>
+        /// 手机号
+        /// </summary>
+        public string Phone { get; set; }
+    }
+}

+ 41 - 0
Admin.Core.Service/Personnel/Employee/_MapConfig.cs

@@ -0,0 +1,41 @@
+using Admin.Core.Model.Personnel;
+using Admin.Core.Service.Personnel.Employee.Input;
+using Admin.Core.Service.Personnel.Employee.Output;
+using AutoMapper;
+using System.Linq;
+
+namespace Admin.Core.Service.Personnel.Employee
+{
+    /// <summary>
+    /// 映射配置
+    /// 双向映射 .ReverseMap()
+    /// </summary>
+    public class MapConfig : Profile
+    {
+        public MapConfig()
+        {
+            //新增
+            CreateMap<EmployeeAddInput, EmployeeEntity>();
+
+            //修改
+            CreateMap<EmployeeUpdateInput, EmployeeEntity>();
+
+            //查询
+            CreateMap<EmployeeEntity, EmployeeGetOutput>().ForMember(
+                d => d.OrganizationIds,
+                m => m.MapFrom(s => s.Organizations.Select(a => a.Id))
+            );
+
+            //查询
+            CreateMap<EmployeeEntity, EmployeeGetOutput>().ForMember(
+                d => d.OrganizationIds,
+                m => m.MapFrom(s => s.Organizations.Select(a => a.Id))
+            );
+
+            CreateMap<EmployeeEntity, EmployeeListOutput>().ForMember(
+                d => d.OrganizationNames,
+                m => m.MapFrom(s => s.Organizations.Select(a => a.Name))
+            );
+        }
+    }
+}

+ 10 - 0
Admin.Core.Service/Personnel/Organization/Input/OrganizationAddInput.cs

@@ -25,6 +25,16 @@
         /// </summary>
         public string Value { get; set; }
 
+        /// <summary>
+        /// 主管
+        /// </summary>
+        public long? PrimaryUserId { get; set; }
+
+        /// <summary>
+        /// 员工人数
+        /// </summary>
+        public int EmployeeCount { get; set; }
+
         /// <summary>
         /// 描述
         /// </summary>

+ 2 - 0
Admin.Core.Service/Personnel/Organization/_MapConfig.cs

@@ -11,7 +11,9 @@ namespace Admin.Core.Service.Personnel.Organization
     {
         public MapConfig()
         {
+            //新增
             CreateMap<OrganizationAddInput, OrganizationEntity>();
+            //修改
             CreateMap<OrganizationUpdateInput, OrganizationEntity>();
         }
     }

+ 25 - 0
Admin.Core.Service/Personnel/Position/IPositionService.cs

@@ -0,0 +1,25 @@
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
+using Admin.Core.Model.Personnel;
+using Admin.Core.Service.Personnel.Position.Input;
+using System.Threading.Tasks;
+
+namespace Admin.Core.Service.Personnel.Position
+{
+    public interface IPositionService
+    {
+        Task<IResponseOutput> GetAsync(long id);
+
+        Task<IResponseOutput> PageAsync(PageInput<PositionEntity> input);
+
+        Task<IResponseOutput> AddAsync(PositionAddInput input);
+
+        Task<IResponseOutput> UpdateAsync(PositionUpdateInput input);
+
+        Task<IResponseOutput> DeleteAsync(long id);
+
+        Task<IResponseOutput> SoftDeleteAsync(long id);
+
+        Task<IResponseOutput> BatchSoftDeleteAsync(long[] ids);
+    }
+}

+ 28 - 0
Admin.Core.Service/Personnel/Position/Input/PositionAddInput.cs

@@ -0,0 +1,28 @@
+namespace Admin.Core.Service.Personnel.Position.Input
+{
+    /// <summary>
+    /// 添加
+    /// </summary>
+    public class PositionAddInput
+    {
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 编码
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 说明
+        /// </summary>
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 启用
+        /// </summary>
+		public bool Enabled { get; set; }
+    }
+}

+ 18 - 0
Admin.Core.Service/Personnel/Position/Input/PositionUpdateInput.cs

@@ -0,0 +1,18 @@
+namespace Admin.Core.Service.Personnel.Position.Input
+{
+    /// <summary>
+    /// 修改
+    /// </summary>
+    public partial class PositionUpdateInput : PositionAddInput
+    {
+        /// <summary>
+        /// 编号
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 版本
+        /// </summary>
+        public long Version { get; set; }
+    }
+}

+ 8 - 0
Admin.Core.Service/Personnel/Position/Output/PositionGetOutput.cs

@@ -0,0 +1,8 @@
+using Admin.Core.Service.Personnel.Position.Input;
+
+namespace Admin.Core.Service.Personnel.Position.Output
+{
+    public class PositionGetOutput : PositionUpdateInput
+    {
+    }
+}

+ 37 - 0
Admin.Core.Service/Personnel/Position/Output/PositionListOutput.cs

@@ -0,0 +1,37 @@
+using System;
+
+namespace Admin.Core.Service.Personnel.Position.Output
+{
+    public class PositionListOutput
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 编码
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 说明
+        /// </summary>
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 启用
+        /// </summary>
+		public bool Enabled { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime? CreatedTime { get; set; }
+    }
+}

+ 99 - 0
Admin.Core.Service/Personnel/Position/PositionService.cs

@@ -0,0 +1,99 @@
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
+using Admin.Core.Model.Personnel;
+using Admin.Core.Repository.Personnel;
+using Admin.Core.Service.Personnel.Position.Input;
+using Admin.Core.Service.Personnel.Position.Output;
+using System.Threading.Tasks;
+
+namespace Admin.Core.Service.Personnel.Position
+{
+    public class PositionService : BaseService, IPositionService
+    {
+        private readonly IPositionRepository _positionRepository;
+
+        public PositionService(
+            IPositionRepository positionRepository
+        )
+        {
+            _positionRepository = positionRepository;
+        }
+
+        public async Task<IResponseOutput> GetAsync(long id)
+        {
+            var result = await _positionRepository.GetAsync<PositionGetOutput>(id);
+            return ResponseOutput.Ok(result);
+        }
+
+        public async Task<IResponseOutput> PageAsync(PageInput<PositionEntity> input)
+        {
+            var key = input.Filter?.Name;
+
+            var list = await _positionRepository.Select
+            .WhereIf(key.NotNull(), a => a.Name.Contains(key))
+            .Count(out var total)
+            .OrderByDescending(true, c => c.Id)
+            .Page(input.CurrentPage, input.PageSize)
+            .ToListAsync<PositionListOutput>();
+
+            var data = new PageOutput<PositionListOutput>()
+            {
+                List = list,
+                Total = total
+            };
+
+            return ResponseOutput.Ok(data);
+        }
+
+        public async Task<IResponseOutput> AddAsync(PositionAddInput input)
+        {
+            var entity = Mapper.Map<PositionEntity>(input);
+            var id = (await _positionRepository.InsertAsync(entity)).Id;
+
+            return ResponseOutput.Result(id > 0);
+        }
+
+        public async Task<IResponseOutput> UpdateAsync(PositionUpdateInput input)
+        {
+            if (!(input?.Id > 0))
+            {
+                return ResponseOutput.NotOk();
+            }
+
+            var entity = await _positionRepository.GetAsync(input.Id);
+            if (!(entity?.Id > 0))
+            {
+                return ResponseOutput.NotOk("ְλ²»´æÔÚ£¡");
+            }
+
+            Mapper.Map(input, entity);
+            await _positionRepository.UpdateAsync(entity);
+            return ResponseOutput.Ok();
+        }
+
+        public async Task<IResponseOutput> DeleteAsync(long id)
+        {
+            var result = false;
+            if (id > 0)
+            {
+                result = (await _positionRepository.DeleteAsync(m => m.Id == id)) > 0;
+            }
+
+            return ResponseOutput.Result(result);
+        }
+
+        public async Task<IResponseOutput> SoftDeleteAsync(long id)
+        {
+            var result = await _positionRepository.SoftDeleteAsync(id);
+
+            return ResponseOutput.Result(result);
+        }
+
+        public async Task<IResponseOutput> BatchSoftDeleteAsync(long[] ids)
+        {
+            var result = await _positionRepository.SoftDeleteAsync(ids);
+
+            return ResponseOutput.Result(result);
+        }
+    }
+}

+ 20 - 0
Admin.Core.Service/Personnel/Position/_MapConfig.cs

@@ -0,0 +1,20 @@
+using Admin.Core.Model.Personnel;
+using Admin.Core.Service.Personnel.Position.Input;
+using AutoMapper;
+
+namespace Admin.Core.Service.Personnel.Position
+{
+    /// <summary>
+    /// 映射配置
+    /// </summary>
+    public class MapConfig : Profile
+    {
+        public MapConfig()
+        {
+            //新增
+            CreateMap<PositionAddInput, PositionEntity>();
+            //修改
+            CreateMap<PositionUpdateInput, PositionEntity>();
+        }
+    }
+}

+ 42 - 12
Admin.Core/Admin.Core.Model.xml

@@ -674,6 +674,11 @@
             性别
             </summary>
         </member>
+        <member name="F:Admin.Core.Model.Enums.Sex.Unknown">
+            <summary>
+            未知
+            </summary>
+        </member>
         <member name="F:Admin.Core.Model.Enums.Sex.Male">
             <summary>
@@ -684,11 +689,6 @@
             </summary>
         </member>
-        <member name="F:Admin.Core.Model.Enums.Sex.Unknown">
-            <summary>
-            未知
-            </summary>
-        </member>
         <member name="T:Admin.Core.Model.Personnel.EmployeeEntity">
             <summary>
             员工
@@ -699,14 +699,19 @@
             租户Id
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.Code">
+        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.UserId">
             <summary>
-            员工编号
+            用户Id
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.OrganizationId">
+        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.Name">
             <summary>
-            部门Id
+            姓名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.NickName">
+            <summary>
+            昵称
             </summary>
         </member>
         <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.Sex">
@@ -714,9 +719,14 @@
             性别
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.Phone">
+        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.Code">
             <summary>
-            手机号
+            工号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.OrganizationId">
+            <summary>
+            主属部门Id
             </summary>
         </member>
         <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.PositionId">
@@ -724,6 +734,21 @@
             职位Id
             </summary>
         </member>
+        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.Phone">
+            <summary>
+            手机号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.Email">
+            <summary>
+            邮箱
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Personnel.EmployeeEntity.HireDate">
+            <summary>
+            入职时间
+            </summary>
+        </member>
         <member name="T:Admin.Core.Model.Personnel.EmployeeOrganizationEntity">
             <summary>
             员工附属部门
@@ -779,7 +804,12 @@
             </summary>
         </member>
-        <member name="P:Admin.Core.Model.Personnel.OrganizationEntity.PrimaryUserId">
+        <member name="P:Admin.Core.Model.Personnel.OrganizationEntity.PrimaryEmployeeId">
+            <summary>
+            主管Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Model.Personnel.OrganizationEntity.PrimaryEmployee">
             <summary>
             主管
             </summary>

+ 216 - 5
Admin.Core/Admin.Core.Service.xml

@@ -980,6 +980,11 @@
             父级节点
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Admin.Permission.Input.PermissionAddDotInput.ApiIds">
+            <summary>
+            关联接口
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Admin.Permission.Input.PermissionAddDotInput.Label">
             <summary>
             权限名称
@@ -1000,11 +1005,6 @@
             图标
             </summary>
         </member>
-        <member name="P:Admin.Core.Service.Admin.Permission.Input.PermissionAddDotInput.ApiIds">
-            <summary>
-            接口
-            </summary>
-        </member>
         <member name="P:Admin.Core.Service.Admin.Permission.Input.PermissionAddGroupInput.Type">
             <summary>
             权限类型
@@ -1763,6 +1763,132 @@
             日志
             </summary>
         </member>
+        <member name="T:Admin.Core.Service.Personnel.Employee.EmployeeService">
+            <summary>
+            员工服务
+            </summary>
+        </member>
+        <member name="T:Admin.Core.Service.Personnel.Employee.IEmployeeService">
+            <summary>
+            员工服务
+            </summary>
+        </member>
+        <member name="T:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput">
+            <summary>
+            添加
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.UserId">
+            <summary>
+            用户Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.Name">
+            <summary>
+            姓名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.NickName">
+            <summary>
+            昵称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.Sex">
+            <summary>
+            性别
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.Code">
+            <summary>
+            工号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.OrganizationId">
+            <summary>
+            主属部门Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.OrganizationIds">
+            <summary>
+            附属部门
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.PositionId">
+            <summary>
+            职位Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.Phone">
+            <summary>
+            手机号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.Email">
+            <summary>
+            邮箱
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput.HireDate">
+            <summary>
+            入职时间
+            </summary>
+        </member>
+        <member name="T:Admin.Core.Service.Personnel.Employee.Input.EmployeeUpdateInput">
+            <summary>
+            修改
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeUpdateInput.Id">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Input.EmployeeUpdateInput.Version">
+            <summary>
+            版本
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Output.EmployeeListOutput.Id">
+            <summary>
+            主键Id
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Output.EmployeeListOutput.Name">
+            <summary>
+            姓名
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Output.EmployeeListOutput.UserName">
+            <summary>
+            账号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Output.EmployeeListOutput.OrganizationName">
+            <summary>
+            主属部门
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Output.EmployeeListOutput.OrganizationNames">
+            <summary>
+            附属部门
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Output.EmployeeListOutput.PositionName">
+            <summary>
+            职位
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Employee.Output.EmployeeListOutput.Phone">
+            <summary>
+            手机号
+            </summary>
+        </member>
+        <member name="T:Admin.Core.Service.Personnel.Employee.MapConfig">
+            <summary>
+            映射配置
+            双向映射 .ReverseMap()
+            </summary>
+        </member>
         <member name="T:Admin.Core.Service.Personnel.Organization.Input.OrganizationAddInput">
             <summary>
             添加
@@ -1788,6 +1914,16 @@
             </summary>
         </member>
+        <member name="P:Admin.Core.Service.Personnel.Organization.Input.OrganizationAddInput.PrimaryUserId">
+            <summary>
+            主管
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Organization.Input.OrganizationAddInput.EmployeeCount">
+            <summary>
+            员工人数
+            </summary>
+        </member>
         <member name="P:Admin.Core.Service.Personnel.Organization.Input.OrganizationAddInput.Description">
             <summary>
             描述
@@ -1858,5 +1994,80 @@
             映射配置
             </summary>
         </member>
+        <member name="T:Admin.Core.Service.Personnel.Position.Input.PositionAddInput">
+            <summary>
+            添加
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Input.PositionAddInput.Name">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Input.PositionAddInput.Code">
+            <summary>
+            编码
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Input.PositionAddInput.Description">
+            <summary>
+            说明
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Input.PositionAddInput.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
+        <member name="T:Admin.Core.Service.Personnel.Position.Input.PositionUpdateInput">
+            <summary>
+            修改
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Input.PositionUpdateInput.Id">
+            <summary>
+            编号
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Input.PositionUpdateInput.Version">
+            <summary>
+            版本
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Output.PositionListOutput.Id">
+            <summary>
+            主键
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Output.PositionListOutput.Name">
+            <summary>
+            名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Output.PositionListOutput.Code">
+            <summary>
+            编码
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Output.PositionListOutput.Description">
+            <summary>
+            说明
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Output.PositionListOutput.Enabled">
+            <summary>
+            启用
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Service.Personnel.Position.Output.PositionListOutput.CreatedTime">
+            <summary>
+            创建时间
+            </summary>
+        </member>
+        <member name="T:Admin.Core.Service.Personnel.Position.MapConfig">
+            <summary>
+            映射配置
+            </summary>
+        </member>
     </members>
 </doc>

+ 94 - 0
Admin.Core/Admin.Core.xml

@@ -762,6 +762,53 @@
             域控制器
             </summary>
         </member>
+        <member name="T:Admin.Core.Controllers.Personnel.EmployeeController">
+            <summary>
+            员工管理
+            </summary>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.EmployeeController.Get(System.Int64)">
+            <summary>
+            查询单条用户
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.EmployeeController.GetPage(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Personnel.EmployeeEntity})">
+            <summary>
+            查询分页用户
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.EmployeeController.Add(Admin.Core.Service.Personnel.Employee.Input.EmployeeAddInput)">
+            <summary>
+            新增用户
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.EmployeeController.Update(Admin.Core.Service.Personnel.Employee.Input.EmployeeUpdateInput)">
+            <summary>
+            修改用户
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.EmployeeController.SoftDelete(System.Int64)">
+            <summary>
+            删除用户
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.EmployeeController.BatchSoftDelete(System.Int64[])">
+            <summary>
+            批量删除用户
+            </summary>
+            <param name="ids"></param>
+            <returns></returns>
+        </member>
         <member name="T:Admin.Core.Controllers.Personnel.OrganizationController">
             <summary>
             组织机构
@@ -802,6 +849,53 @@
             <param name="id"></param>
             <returns></returns>
         </member>
+        <member name="T:Admin.Core.Controllers.Personnel.PositionController">
+            <summary>
+            职位管理
+            </summary>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.PositionController.Get(System.Int64)">
+            <summary>
+            查询单条职位
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.PositionController.GetPage(Admin.Core.Common.Input.PageInput{Admin.Core.Model.Personnel.PositionEntity})">
+            <summary>
+            查询分页职位
+            </summary>
+            <param name="model"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.PositionController.Add(Admin.Core.Service.Personnel.Position.Input.PositionAddInput)">
+            <summary>
+            新增职位
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.PositionController.Update(Admin.Core.Service.Personnel.Position.Input.PositionUpdateInput)">
+            <summary>
+            修改职位
+            </summary>
+            <param name="input"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.PositionController.SoftDelete(System.Int64)">
+            <summary>
+            删除职位
+            </summary>
+            <param name="id"></param>
+            <returns></returns>
+        </member>
+        <member name="M:Admin.Core.Controllers.Personnel.PositionController.BatchSoftDelete(System.Int64[])">
+            <summary>
+            批量删除职位
+            </summary>
+            <param name="ids"></param>
+            <returns></returns>
+        </member>
         <member name="M:Admin.Core.Db.DBServiceCollectionExtensions.AddDbAsync(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment)">
             <summary>
             添加数据库

+ 92 - 0
Admin.Core/Controllers/Personnel/EmployeeController.cs

@@ -0,0 +1,92 @@
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
+using Admin.Core.Service.Personnel.Employee;
+using Microsoft.AspNetCore.Mvc;
+using System.Threading.Tasks;
+using Admin.Core.Model.Personnel;
+using Admin.Core.Service.Personnel.Employee.Input;
+
+namespace Admin.Core.Controllers.Personnel
+{
+    /// <summary>
+    /// 员工管理
+    /// </summary>
+    public class EmployeeController : AreaController
+    {
+        private readonly IEmployeeService _employeeServices;
+
+        public EmployeeController(
+            IEmployeeService employeeServices
+        )
+        {
+            _employeeServices = employeeServices;
+        }
+
+        /// <summary>
+        /// 查询单条用户
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IResponseOutput> Get(long id)
+        {
+            return await _employeeServices.GetAsync(id);
+        }
+
+        /// <summary>
+        /// 查询分页用户
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        //[ResponseCache(Duration = 60)]
+        public async Task<IResponseOutput> GetPage(PageInput<EmployeeEntity> input)
+        {
+            return await _employeeServices.PageAsync(input);
+        }
+
+        /// <summary>
+        /// 新增用户
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IResponseOutput> Add(EmployeeAddInput input)
+        {
+            return await _employeeServices.AddAsync(input);
+        }
+
+        /// <summary>
+        /// 修改用户
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPut]
+        public async Task<IResponseOutput> Update(EmployeeUpdateInput input)
+        {
+            return await _employeeServices.UpdateAsync(input);
+        }
+
+        /// <summary>
+        /// 删除用户
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpDelete]
+        public async Task<IResponseOutput> SoftDelete(long id)
+        {
+            return await _employeeServices.SoftDeleteAsync(id);
+        }
+
+        /// <summary>
+        /// 批量删除用户
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        [HttpPut]
+        public async Task<IResponseOutput> BatchSoftDelete(long[] ids)
+        {
+            return await _employeeServices.BatchSoftDeleteAsync(ids);
+        }
+    }
+}

+ 89 - 0
Admin.Core/Controllers/Personnel/PositionController.cs

@@ -0,0 +1,89 @@
+using Admin.Core.Common.Input;
+using Admin.Core.Common.Output;
+using Admin.Core.Model.Personnel;
+using Admin.Core.Service.Personnel.Position;
+using Admin.Core.Service.Personnel.Position.Input;
+using Microsoft.AspNetCore.Mvc;
+using System.Threading.Tasks;
+
+namespace Admin.Core.Controllers.Personnel
+{
+    /// <summary>
+    /// 职位管理
+    /// </summary>
+    public class PositionController : AreaController
+    {
+        private readonly IPositionService _roleServices;
+
+        public PositionController(IPositionService roleServices)
+        {
+            _roleServices = roleServices;
+        }
+
+        /// <summary>
+        /// 查询单条职位
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet]
+        public async Task<IResponseOutput> Get(long id)
+        {
+            return await _roleServices.GetAsync(id);
+        }
+
+        /// <summary>
+        /// 查询分页职位
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IResponseOutput> GetPage(PageInput<PositionEntity> model)
+        {
+            return await _roleServices.PageAsync(model);
+        }
+
+        /// <summary>
+        /// 新增职位
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task<IResponseOutput> Add(PositionAddInput input)
+        {
+            return await _roleServices.AddAsync(input);
+        }
+
+        /// <summary>
+        /// 修改职位
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        [HttpPut]
+        public async Task<IResponseOutput> Update(PositionUpdateInput input)
+        {
+            return await _roleServices.UpdateAsync(input);
+        }
+
+        /// <summary>
+        /// 删除职位
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpDelete]
+        public async Task<IResponseOutput> SoftDelete(long id)
+        {
+            return await _roleServices.SoftDeleteAsync(id);
+        }
+
+        /// <summary>
+        /// 批量删除职位
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <returns></returns>
+        [HttpPut]
+        public async Task<IResponseOutput> BatchSoftDelete(long[] ids)
+        {
+            return await _roleServices.BatchSoftDeleteAsync(ids);
+        }
+    }
+}