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

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);
}
}
}