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.
307 lines
12 KiB
307 lines
12 KiB
2 years ago
|
using Furion.DatabaseAccessor;
|
||
|
using Furion.DependencyInjection;
|
||
|
using Furion.DynamicApiController;
|
||
|
using Furion.FriendlyException;
|
||
|
using Mapster;
|
||
|
using Microsoft.AspNetCore.Authorization;
|
||
|
using Microsoft.AspNetCore.Mvc;
|
||
|
using Microsoft.EntityFrameworkCore;
|
||
|
using Microsoft.Extensions.Options;
|
||
|
using Senparc.Weixin.WxOpen.AdvancedAPIs.Sns;
|
||
|
using System.ComponentModel.DataAnnotations;
|
||
|
using System.Linq;
|
||
|
using System.Threading.Tasks;
|
||
|
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 = "company", Order = 30)]
|
||
|
public class CompanyService : ICompanyService, IDynamicApiController, ITransient
|
||
|
{
|
||
|
private readonly ICacheService _cacheService;
|
||
|
private readonly IRepository<Employee> _employeeRepository;
|
||
|
private readonly IRepository<Company> _repository;
|
||
|
private readonly IUserManager _userManager;
|
||
|
private readonly IRepository<User> _userRepository;
|
||
|
private readonly IRepository<VehicleGroup> _vehicleGroupRepository;
|
||
|
private readonly WeixinSettingOptions _weixinSettingOptions;
|
||
|
private readonly IRepository<Yard> _yardRepository;
|
||
|
private readonly IRepository<UserYard> _userYardRepository;
|
||
|
|
||
|
public CompanyService(
|
||
|
IRepository<Company> repository,
|
||
|
IRepository<Employee> employeeRepository,
|
||
|
IRepository<User> userRepository,
|
||
|
IRepository<VehicleGroup> vehicleGroupRepository,
|
||
|
IUserManager userManager,
|
||
|
ICacheService cacheService,
|
||
|
IRepository<Yard> yardRepository,
|
||
|
IOptions<WeixinSettingOptions> weixinSettingOptions,
|
||
|
IRepository<UserYard> userYardRepository
|
||
|
)
|
||
|
{
|
||
|
_employeeRepository = employeeRepository;
|
||
|
_userRepository = userRepository;
|
||
|
_vehicleGroupRepository = vehicleGroupRepository;
|
||
|
_repository = repository;
|
||
|
_userManager = userManager;
|
||
|
_cacheService = cacheService;
|
||
|
_yardRepository = yardRepository;
|
||
|
_weixinSettingOptions = weixinSettingOptions.Value;
|
||
|
_userYardRepository = userYardRepository;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// 获取当前公司信息
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
[HttpGet]
|
||
|
[Route("api/v1/company")]
|
||
|
public async Task<CompanyOutput> GetAsync()
|
||
|
{
|
||
|
return await _cacheService.GetCompanyAsync(_userManager.CompanyId, _userManager.UserId);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 根据Id获取公司信息
|
||
|
/// </summary>
|
||
|
/// <param name="companyId"></param>
|
||
|
/// <returns></returns>
|
||
|
[HttpGet]
|
||
|
[Route("api/v1/company/{companyId}")]
|
||
|
public async Task<CompanyOutput> GetByIdAsync(long companyId)
|
||
|
{
|
||
|
return await _cacheService.GetCompanyAsync(companyId, _userManager.UserId);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 更新公司信息
|
||
|
/// </summary>
|
||
|
/// <param name="companyUpdate"></param>
|
||
|
/// <returns></returns>
|
||
|
[HttpPut]
|
||
|
[Route("api/v1/company")]
|
||
|
public async Task UpdateAsync(CompanyUpdateInput companyUpdate)
|
||
|
{
|
||
|
var company = await _repository.FindAsync(companyUpdate.Id);
|
||
|
if (company.IsNotNull())
|
||
|
{
|
||
|
company.CompanyName = companyUpdate.CompanyName;
|
||
|
company.Latitude = companyUpdate.Latitude;
|
||
|
company.Longitude = companyUpdate.Longitude;
|
||
|
company.Address = companyUpdate.Address;
|
||
|
}
|
||
|
var companyId = (await _repository.UpdateNowAsync(company)).Entity.Id;
|
||
|
if (companyId == 0)
|
||
|
{
|
||
|
throw Oops.Bah("更新失败");
|
||
|
}
|
||
|
await _cacheService.RemoveCompanyAsync(_userManager.CompanyId);
|
||
|
await _cacheService.RemoveUserAsync(_userManager.UserId);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 平台入驻
|
||
|
/// </summary>
|
||
|
/// <param name="registerInuput"></param>
|
||
|
/// <returns></returns>
|
||
|
[AllowAnonymous]
|
||
|
[UnitOfWork]
|
||
|
[HttpPost]
|
||
|
[Route("api/v1/register")]
|
||
|
public async Task RegisterAsync(RegisterInuput registerInuput)
|
||
|
{
|
||
|
var jsCode2JsonResult =
|
||
|
await SnsApi.JsCode2JsonAsync(_weixinSettingOptions.WxOpenAppId, _weixinSettingOptions.WxOpenAppSecret,
|
||
|
registerInuput.JsCode);
|
||
|
if (jsCode2JsonResult.IsNull())
|
||
|
{
|
||
|
throw Oops.Bah(ErrorCode.D1506);
|
||
|
}
|
||
|
var user = await _userRepository.FirstOrDefaultAsync(x => x.OpenId == jsCode2JsonResult.openid);
|
||
|
if (user.IsNotNull())
|
||
|
{
|
||
|
var employeeList = await _employeeRepository.DetachedEntities
|
||
|
.Where(x => x.UserId == user.Id && x.Status == (int)CommonStatusEnum.ENABLE)
|
||
|
.ToListAsync();
|
||
|
var cIds = employeeList.Select(x => x.CompanyId).ToArray();
|
||
|
|
||
|
//如果未包含管理员权限,可以一直注册
|
||
|
if (employeeList.Where(x => x.RoleId == (long)RoleStatusEnum.Administrator && x.Status == (int)CommonStatusEnum.ENABLE).Any())
|
||
|
{
|
||
|
throw Oops.Bah("您已注册公司");
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
var entity = registerInuput.Adapt<Company>();
|
||
|
entity.Status = (int)CommonStatusEnum.REVIEW;
|
||
|
entity.ContactPerson = registerInuput.UserName ?? "企业管理员";
|
||
|
entity.ContactPhone = registerInuput.Phone;
|
||
|
entity.CompanyLogo = CommonConst.DEFAULT_AVATARURL;
|
||
|
entity.StopTag = CommonConst.DEFAULT_STAPTAG;
|
||
|
var companyId = (await _repository.InsertNowAsync(entity)).Entity.Id;
|
||
|
if (companyId > 0)
|
||
|
{
|
||
|
var userId = user.IsNull() ? 0 : user.Id;
|
||
|
if (user.IsNull())
|
||
|
{
|
||
|
//用户
|
||
|
userId = (await _userRepository.InsertNowAsync(new User
|
||
|
{
|
||
|
OpenId = jsCode2JsonResult.openid,
|
||
|
AvatarUrl = registerInuput.AvatarUrl,
|
||
|
UserName = registerInuput.UserName ?? "企业管理员",
|
||
|
Phone = registerInuput.Phone,
|
||
|
Status = CommonStatusEnum.ENABLE
|
||
|
})).Entity.Id;
|
||
|
}
|
||
|
//员工
|
||
|
await _employeeRepository.InsertNowAsync(new Employee
|
||
|
{
|
||
|
UserId = userId,
|
||
|
AvatarUrl = CommonConst.DEFAULT_AVATARURL,
|
||
|
EmployeeName = registerInuput.UserName ?? "企业管理员",
|
||
|
EmployeePhone = registerInuput.Phone,
|
||
|
CompanyId = companyId,
|
||
|
RoleId = (int)RoleStatusEnum.Administrator,
|
||
|
RoleName = typeof(RoleStatusEnum).GetDescription((int)RoleStatusEnum.Administrator),
|
||
|
Status = (int)CommonStatusEnum.ENABLE,
|
||
|
IsDefault = true
|
||
|
});
|
||
|
//车辆分组
|
||
|
await _vehicleGroupRepository.InsertNowAsync(new VehicleGroup
|
||
|
{
|
||
|
CompanyId = companyId,
|
||
|
Name = "默认分组",
|
||
|
ParentId = 0
|
||
|
});
|
||
|
//车场
|
||
|
var yardId = (await _yardRepository.InsertNowAsync(new Yard
|
||
|
{
|
||
|
CompanyId = companyId,
|
||
|
Status = (int)CommonStatusEnum.ENABLE,
|
||
|
ContactPerson = registerInuput.UserName ?? "企业管理员",
|
||
|
ContactPhone = registerInuput.Phone,
|
||
|
Longitude = registerInuput.Longitude,
|
||
|
Latitude = registerInuput.Latitude,
|
||
|
Address = registerInuput.Address,
|
||
|
|
||
|
})).Entity.Id;
|
||
|
|
||
|
//用户车场映射
|
||
|
await _userYardRepository.InsertNowAsync(new UserYard
|
||
|
{
|
||
|
UserId = userId,
|
||
|
YardId = yardId,
|
||
|
CompanyId = companyId,
|
||
|
IsDefault = true
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// 获取位置名称
|
||
|
/// </summary>
|
||
|
/// <param name="longitude"></param>
|
||
|
/// <param name="latitude"></param>
|
||
|
/// <returns></returns>
|
||
|
[HttpGet]
|
||
|
[AllowAnonymous]
|
||
|
[Route("api/v1/address/{longitude}/{latitude}")]
|
||
|
public string GetAddress([Required] decimal longitude, [Required] decimal latitude)
|
||
|
{
|
||
|
string adress = MapHelper.GetLocationByLngLat(longitude, latitude);
|
||
|
return adress;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 修改公司停留标示
|
||
|
/// </summary>
|
||
|
/// <param name="stopTag"></param>
|
||
|
/// <returns></returns>
|
||
|
[HttpPut]
|
||
|
[Route("api/v1/company/stoptag/{stopTag}")]
|
||
|
public async Task UpdatStopTagAsync([Required] long stopTag)
|
||
|
{
|
||
|
var company = await _repository.FirstOrDefaultAsync(x => x.Id == _userManager.CompanyId);
|
||
|
if (company.IsNull())
|
||
|
{
|
||
|
throw Oops.Bah("公司不存在");
|
||
|
}
|
||
|
company.StopTag = stopTag;
|
||
|
await _repository.UpdateNowAsync(company);
|
||
|
await _cacheService.RemoveCompanyAsync(_userManager.CompanyId);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// 一键派工是否显示工程名称
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
[HttpPut]
|
||
|
[Route("api/v1/company/opendispatch")]
|
||
|
public async Task UpdateIsOpenDispatchAsync()
|
||
|
{
|
||
|
var company = await _repository.FirstOrDefaultAsync(x => x.Id == _userManager.CompanyId);
|
||
|
if (company.IsNull())
|
||
|
{
|
||
|
throw Oops.Bah("公司不存在");
|
||
|
|
||
|
}
|
||
|
company.IsOpenDispatch = !company.IsOpenDispatch;
|
||
|
await _repository.UpdateNowAsync(company);
|
||
|
await _cacheService.RemoveCompanyAsync(_userManager.CompanyId);
|
||
|
}
|
||
|
|
||
|
|
||
|
/// <summary>
|
||
|
/// 调度角色是否有添 加工程名称的权限
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
[HttpPut]
|
||
|
[Route("api/v1/company/schedulingaddproject")]
|
||
|
public async Task UpdateIsSchedulingAddProjectAsync()
|
||
|
{
|
||
|
var company = await _repository.FirstOrDefaultAsync(x => x.Id == _userManager.CompanyId);
|
||
|
if (company.IsNull())
|
||
|
{
|
||
|
throw Oops.Bah("公司不存在");
|
||
|
|
||
|
}
|
||
|
company.IsSchedulingAddProject = !company.IsSchedulingAddProject;
|
||
|
await _repository.UpdateNowAsync(company);
|
||
|
await _cacheService.RemoveCompanyAsync(_userManager.CompanyId);
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
///
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
[HttpPut]
|
||
|
[Route("api/v1/company/isOpenVehicleType")]
|
||
|
public async Task UpdateIsOpenVehicleTypeAsync()
|
||
|
{
|
||
|
var company = await _repository.FirstOrDefaultAsync(x => x.Id == _userManager.CompanyId);
|
||
|
if (company.IsNull())
|
||
|
{
|
||
|
throw Oops.Bah("公司不存在");
|
||
|
|
||
|
}
|
||
|
company.IsOpenVehicleType = !company.IsOpenVehicleType;
|
||
|
await _repository.UpdateNowAsync(company);
|
||
|
await _cacheService.RemoveCompanyAsync(_userManager.CompanyId);
|
||
|
}
|
||
|
}
|
||
|
}
|