You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
305 lines
12 KiB
305 lines
12 KiB
using Furion.DatabaseAccessor;
|
|
using Furion.DependencyInjection;
|
|
using Furion.DynamicApiController;
|
|
using Furion.FriendlyException;
|
|
using Mapster;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Options;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Znyc.Dispatching.Common.Extensions;
|
|
using Znyc.Dispatching.Core;
|
|
using Znyc.Dispatching.Core.Entitys;
|
|
using Znyc.Dispatching.Core.Extension;
|
|
using Znyc.Dispatching.Core.Helpers;
|
|
|
|
namespace Znyc.Dispatching.Application
|
|
{
|
|
/// <summary>
|
|
/// 员工服务
|
|
/// </summary>
|
|
[ApiDescriptionSettings(Name = "employee", Order = 20)]
|
|
public class EmployeeService : IEmployeeService, IDynamicApiController, ITransient
|
|
{
|
|
private string[] INDEX_STRINGS = {"A", "B", "C", "D", "E", "F", "G", "H", "I",
|
|
"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
|
|
"W", "X", "Y", "Z", "#"};
|
|
|
|
private string[] ROLEINDEX_STRINGS = { "C", "D", "J", "G", "W", "Y", "X", "#" };
|
|
|
|
|
|
private readonly ICacheService _cacheService;
|
|
private readonly IRepository<Employee> _repository;
|
|
private readonly IRepository<User> _userRepository;
|
|
private readonly IRepository<UserRole> _userRoleRepository;
|
|
private readonly IRepository<Company> _companyRepository;
|
|
private readonly IUserManager _userManager;
|
|
private readonly IRepository<VehiclePerson> _vehiclePersonRepository;
|
|
private readonly IRepository<ProjectPerson> _projectPersonRepository;
|
|
|
|
|
|
public EmployeeService(
|
|
IRepository<Employee> repository,
|
|
IRepository<User> userRepository,
|
|
IRepository<Company> companyRepository,
|
|
IUserManager userManager,
|
|
ICacheService cacheService,
|
|
IRepository<UserRole> userRoleRepository,
|
|
IOptions<SmsProviderOptions> smsProviderOptions,
|
|
IRepository<VehiclePerson> vehiclePersonRepository,
|
|
IRepository<ProjectPerson> projectPersonRepository
|
|
)
|
|
{
|
|
_repository = repository;
|
|
_userRepository = userRepository;
|
|
_companyRepository = companyRepository;
|
|
_userManager = userManager;
|
|
_cacheService = cacheService;
|
|
_userRoleRepository = userRoleRepository;
|
|
_vehiclePersonRepository = vehiclePersonRepository;
|
|
_projectPersonRepository = projectPersonRepository;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 员工信息
|
|
/// </summary>
|
|
/// <param name="currentPage"></param>
|
|
/// <param name="pageSize"></param>
|
|
/// <param name="roleId"></param>
|
|
/// <param name="status">0全部,停用-1,正常1</param>
|
|
/// <param name="key"></param>
|
|
/// <param name="orderby"></param>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
[Route("api/v1/employees/search")]
|
|
public async Task<EmployeeListPage> PageAsync([Required] int currentPage, [Required] int pageSize, [FromQuery] int status, [Required] int roleId, [FromQuery] string orderby, [FromQuery] string key = "")
|
|
{
|
|
|
|
var employees = (await _cacheService.GetEmployeeListAsync(_userManager.CompanyId))
|
|
.WhereIf(status != 0, x => x.Status == status)
|
|
.WhereIf(roleId > 0, x => x.RoleId == roleId)
|
|
.WhereIf(new long[] { (long)RoleStatusEnum.Scheduling, (long)RoleStatusEnum.CarCaptain }.Contains(_userManager.RoleId),
|
|
x => new long[] { (long)RoleStatusEnum.CrewMembers, (long)RoleStatusEnum.Outside,
|
|
(long)RoleStatusEnum.PartTimeSalesman,(long)RoleStatusEnum.Salesman }.Contains(x.RoleId))
|
|
.WhereIf(key.IsNotEmptyOrNull(), x => x.EmployeeName.Contains(key) || x.EmployeePhone.Contains(key))
|
|
.Adapt<List<EmployeeListOutput>>();
|
|
var employeeOutputs = new List<EmployeeListOutputs>();
|
|
|
|
if (orderby == "role")
|
|
{
|
|
employees = employees.OrderBy(x => x.RoleName).ToList();
|
|
foreach (var INDEX_STRING in ROLEINDEX_STRINGS)
|
|
{
|
|
employeeOutputs.Add(new EmployeeListOutputs()
|
|
{
|
|
Char = INDEX_STRING,
|
|
List = employees.Where(x => StringHelper.GetStringFirstSpell(x.RoleName) == INDEX_STRING).ToList()
|
|
});
|
|
};
|
|
}
|
|
else
|
|
{
|
|
employees = employees.OrderBy(x => x.EmployeeName).ToList();
|
|
|
|
foreach (var INDEX_STRING in INDEX_STRINGS)
|
|
{
|
|
employeeOutputs.Add(new EmployeeListOutputs()
|
|
{
|
|
Char = INDEX_STRING,
|
|
List = employees.Where(x => StringHelper.GetStringFirstSpell(x.EmployeeName) == INDEX_STRING).ToList()
|
|
});
|
|
};
|
|
}
|
|
var data = new EmployeeListPage()
|
|
{
|
|
EmployeeList = employeeOutputs,
|
|
Total = employees.Count
|
|
};
|
|
return data;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 根据id获取员工资料
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
[Route("api/v1/employee/{id}")]
|
|
public async Task<EmployeeOutput> GetByIdAsync(long id)
|
|
{
|
|
return await _cacheService.GetEmployeeAsync(id);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 添加员工信息
|
|
/// </summary>
|
|
/// <param name="employeeAdd"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
[UnitOfWork]
|
|
[NonAction]
|
|
//[Route("api/v1/employee")]
|
|
public async Task<long> AddAsync(EmployeeAddInput employeeAdd)
|
|
{
|
|
var user = await _userRepository.Where(x => x.Phone == employeeAdd.EmployeePhone).FirstOrDefaultAsync();
|
|
if (user.IsNotNull())
|
|
{
|
|
return user.Id;
|
|
}
|
|
|
|
var company = await _companyRepository.FindOrDefaultAsync(_userManager.CompanyId);
|
|
if (company.IsNotNull())
|
|
{
|
|
//用户
|
|
var userEntity = await _userRepository.InsertNowAsync(new User
|
|
{
|
|
OpenId = "",
|
|
UserName = employeeAdd.EmployeeName,
|
|
AvatarUrl = CommonConst.DEFAULT_AVATARURL_ALL,
|
|
Phone = employeeAdd.EmployeePhone,
|
|
Status = CommonStatusEnum.ENABLE
|
|
});
|
|
//员工
|
|
var employee = await _repository.InsertNowAsync(new Employee
|
|
{
|
|
UserId = userEntity.Entity.Id,
|
|
AvatarUrl = CommonConst.DEFAULT_AVATARURL,
|
|
EmployeeName = employeeAdd.EmployeeName,
|
|
EmployeePhone = employeeAdd.EmployeePhone,
|
|
CompanyId = company.Id,
|
|
RoleId = employeeAdd.RoleId,
|
|
RoleName = employeeAdd.RoleName,
|
|
IsDefault = true,
|
|
Status = (int)CommonStatusEnum.ENABLE
|
|
});
|
|
//用户角色
|
|
await _userRoleRepository.InsertNowAsync(new UserRole
|
|
{
|
|
UserId = userEntity.Entity.Id,
|
|
RoleId = employeeAdd.RoleId,
|
|
});
|
|
//清除员工列表Cache
|
|
await _cacheService.RemoveEmployeeListAsync(_userManager.CompanyId);
|
|
return employee.Entity.UserId;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 编辑员工信息
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpPut]
|
|
[UnitOfWork]
|
|
[Route("api/v1/employee")]
|
|
public async Task UpdateAsync(EmployeeUpdateInput input)
|
|
{
|
|
var employee = await _repository.FindOrDefaultAsync(input.Id);
|
|
//权限变动,清除对应缓存
|
|
if (!employee.RoleId.Equals(input.RoleId))
|
|
{
|
|
await _cacheService.RemoveTokenAsync(employee.UserId);
|
|
}
|
|
employee = input.Adapt(employee);
|
|
employee.AvatarUrl = CommonConst.Prefix_AvataUrl + employee.AvatarUrl[(employee.AvatarUrl.LastIndexOf("/") + 1)..];
|
|
var result = await _repository.UpdateNowAsync(employee);
|
|
if (result.IsNull())
|
|
{
|
|
throw Oops.Oh("更新员工信息失败");
|
|
}
|
|
//同步更新user
|
|
var user = await _userRepository.FirstOrDefaultAsync(x => x.Id == employee.UserId);
|
|
if (user.IsNotNull())
|
|
{
|
|
user.UserName = input.EmployeeName;
|
|
user.Phone = input.EmployeePhone;
|
|
user.AvatarUrl = employee.AvatarUrl;
|
|
await _userRepository.UpdateNowAsync(user);
|
|
await _cacheService.RemoveUserAsync(user.Id);
|
|
}
|
|
|
|
//更新当前用户下所有角色姓名
|
|
var employees = await _repository.Where(x => x.UserId == user.Id).ToListAsync();
|
|
foreach (var employee2 in employees)
|
|
{
|
|
if (employee.IsNotNull())
|
|
{
|
|
employee.EmployeePhone = input.EmployeePhone;
|
|
employee.EmployeeName = input.EmployeeName;
|
|
employee.AvatarUrl = CommonConst.Prefix_AvataUrl + input.AvatarUrl[(input.AvatarUrl.LastIndexOf("/") + 1)..];
|
|
await _repository.UpdateNowAsync(employee2);
|
|
await _cacheService.RemoveEmployeeAsync(employee2.Id);
|
|
await _cacheService.RemoveEmployeeListAsync(employee2.CompanyId);
|
|
}
|
|
}
|
|
|
|
|
|
//清除员工Cache
|
|
await _cacheService.RemoveEmployeeAsync(employee.Id);
|
|
//清除用户Cache
|
|
await _cacheService.RemoveUserAsync(employee.UserId);
|
|
//清除员工列表Cache
|
|
await _cacheService.RemoveEmployeeListAsync(_userManager.CompanyId);
|
|
//同步车组人员表
|
|
var vehiclePersons = await _vehiclePersonRepository.Where(x => x.IsDeleted == false && x.UserId == user.Id).ToListAsync();
|
|
foreach (var item in vehiclePersons)
|
|
{
|
|
//解除车组人员关联
|
|
if (input.Status == (int)CommonStatusEnum.DISABLE)
|
|
{
|
|
item.IsDeleted = true;
|
|
}
|
|
item.UserName = input.EmployeeName;
|
|
item.UserPhone = input.EmployeePhone;
|
|
await _vehiclePersonRepository.UpdateNowAsync(item);
|
|
//删除车组人员Cache
|
|
await _cacheService.RemoveVehiclePersonAsync(item.VehicleId);
|
|
}
|
|
//同步工程联系人表
|
|
var projectPersons = await _projectPersonRepository.Where(x => x.IsDeleted == false && x.ProjectPersonId == user.Id).ToListAsync();
|
|
foreach (var item in projectPersons)
|
|
{
|
|
item.ProjectPersonName = input.EmployeeName;
|
|
item.ProjectPersonPhone = input.EmployeePhone;
|
|
await _projectPersonRepository.UpdateNowAsync(item);
|
|
//清除工程信息Cache
|
|
await _cacheService.RemoveProjectAsync(item.ProjectId);
|
|
//清除工程列表信息Cache
|
|
await _cacheService.RemoveProjectListAsync(_userManager.CompanyId);
|
|
}
|
|
//同步用户角色表
|
|
//var userRole = await _userRoleRepository.FirstOrDefaultAsync(x => x.UserId == employee.UserId);
|
|
//userRole.RoleId = employee.RoleId;
|
|
//await _userRoleRepository.UpdateNowAsync(userRole);
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 软删除员工信息
|
|
/// </summary>
|
|
/// <param name="id"></param>
|
|
/// <returns></returns>
|
|
[HttpDelete]
|
|
[Route("api/v1/employee")]
|
|
|
|
public async Task DeleteByIdAsync(long id)
|
|
{
|
|
Employee employee = await _repository
|
|
.FirstOrDefaultAsync(x => x.Id == id && x.CompanyId == _userManager.CompanyId);
|
|
employee.IsDeleted = true;
|
|
await _repository.UpdateNowAsync(employee);
|
|
await _cacheService.RemoveCacheByUserIdAsync(employee.UserId);
|
|
await _cacheService.RemoveEmployeeAsync(employee.Id);
|
|
await _cacheService.RemoveEmployeeListAsync(_userManager.CompanyId);
|
|
await _cacheService.RemoveUserAsync(employee.UserId);
|
|
}
|
|
|
|
|
|
}
|
|
}
|