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 { /// /// 公司服务 /// [ApiDescriptionSettings(Name = "company", Order = 30)] public class CompanyService : ICompanyService, IDynamicApiController, ITransient { private readonly ICacheService _cacheService; private readonly IRepository _employeeRepository; private readonly IRepository _repository; private readonly IUserManager _userManager; private readonly IRepository _userRepository; private readonly IRepository _vehicleGroupRepository; private readonly WeixinSettingOptions _weixinSettingOptions; private readonly IRepository _yardRepository; private readonly IRepository _userYardRepository; public CompanyService( IRepository repository, IRepository employeeRepository, IRepository userRepository, IRepository vehicleGroupRepository, IUserManager userManager, ICacheService cacheService, IRepository yardRepository, IOptions weixinSettingOptions, IRepository userYardRepository ) { _employeeRepository = employeeRepository; _userRepository = userRepository; _vehicleGroupRepository = vehicleGroupRepository; _repository = repository; _userManager = userManager; _cacheService = cacheService; _yardRepository = yardRepository; _weixinSettingOptions = weixinSettingOptions.Value; _userYardRepository = userYardRepository; } /// /// 获取当前公司信息 /// /// [HttpGet] [Route("api/v1/company")] public async Task GetAsync() { return await _cacheService.GetCompanyAsync(_userManager.CompanyId, _userManager.UserId); } /// /// 根据Id获取公司信息 /// /// /// [HttpGet] [Route("api/v1/company/{companyId}")] public async Task GetByIdAsync(long companyId) { return await _cacheService.GetCompanyAsync(companyId, _userManager.UserId); } /// /// 更新公司信息 /// /// /// [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); } /// /// 平台入驻 /// /// /// [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(); 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 }); } } /// /// 获取位置名称 /// /// /// /// [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; } /// /// 修改公司停留标示 /// /// /// [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); } /// /// 一键派工是否显示工程名称 /// /// [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); } /// /// 调度角色是否有添 加工程名称的权限 /// /// [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); } /// /// /// /// [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); } } }