|  |  | 
 |  |  | using System.Threading.Tasks; | 
 |  |  | using Volo.Abp; | 
 |  |  | using Volo.Abp.Application.Services; | 
 |  |  | using Volo.Abp.Caching; | 
 |  |  | using Volo.Abp.Domain.Repositories; | 
 |  |  | using Volo.Abp.Identity; | 
 |  |  | using Volo.Abp.Identity.Application.Contracts.Account; | 
 |  |  | using Volo.Abp.IdentityModel; | 
 |  |  | using Volo.Abp.Threading; | 
 |  |  | using ZeroD.Util; | 
 |  |  | using ZeroD.Util.Fadd; | 
 |  |  | using static LifePayment.Domain.Shared.LifePaymentConstant; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 
 |  |  |         private readonly IRepository<User, Guid> _userRepository; | 
 |  |  |         private readonly IRepository<UserChannle, Guid> _userChannleRep; | 
 |  |  |         private readonly IIdentityUserAppService _identityUserService; | 
 |  |  |         private readonly IDistributedCache<string> _distributedCache; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         public AccountService( | 
 |  |  |                IWxManager wxManager, | 
 |  |  | 
 |  |  |                IRepository<User, Guid> userRepository, | 
 |  |  |                IIdentityUserAppService identityUserService, | 
 |  |  |                IRepository<LifePayUser, Guid> lifePayUserRepository, | 
 |  |  |                IRepository<UserChannle, Guid> userChannleRep) | 
 |  |  |                IRepository<UserChannle, Guid> userChannleRep, | 
 |  |  |                IDistributedCache<string> distributedCache) | 
 |  |  |         { | 
 |  |  |             _configuration = configuration; | 
 |  |  |             _wxManager = wxManager; | 
 |  |  | 
 |  |  |             _authenticator = authenticator; | 
 |  |  |             _userRepository = userRepository; | 
 |  |  |             _userChannleRep = userChannleRep; | 
 |  |  |             _distributedCache = distributedCache; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         #region 查询 | 
 |  |  |  | 
 |  |  |         public async Task<WxMiniAppIndentityInfo> GetLifePayWxIndentity(string code) | 
 |  |  |         { | 
 |  |  |             var res = await _wxManager.GetWxOauth2AccessToken(code); | 
 |  |  |             var result = new WxMiniAppIndentityInfo | 
 |  |  |             var cacheData = await _distributedCache.GetAsync(code); | 
 |  |  |             var result = new WxMiniAppIndentityInfo(); | 
 |  |  |             if (cacheData != null) | 
 |  |  |             { | 
 |  |  |                 SessionKey = res.SessionKey, | 
 |  |  |                 OpenId = res.OpenId, | 
 |  |  |                 UnionId = res.UnionId | 
 |  |  |             }; | 
 |  |  |                 result.OpenId = cacheData; | 
 |  |  |             } | 
 |  |  |             else | 
 |  |  |             { | 
 |  |  |                 var res = await _wxManager.GetWxOauth2AccessToken(code); | 
 |  |  |                 result = new WxMiniAppIndentityInfo | 
 |  |  |                 { | 
 |  |  |                     SessionKey = res.SessionKey, | 
 |  |  |                     OpenId = res.OpenId, | 
 |  |  |                     UnionId = res.UnionId | 
 |  |  |                 }; | 
 |  |  |                 if (!string.IsNullOrEmpty(res.OpenId)) | 
 |  |  |                 { | 
 |  |  |                     await _distributedCache.SetAsync(code, res.OpenId, options: new Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions() | 
 |  |  |                     { | 
 |  |  |                         AbsoluteExpirationRelativeToNow = TimeSpan.FromHours(24) | 
 |  |  |                     }); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  | 
 |  |  |         /// <param name="input"></param> | 
 |  |  |         /// <returns></returns> | 
 |  |  |         /// <exception cref="UserFriendlyException"></exception> | 
 |  |  |         public async Task<Guid> LifePayPhoneMesssageCodeLogin(LifePayPhoneMesssageCodeLoginInput input) | 
 |  |  |         public async Task<LifePayPhoneMesssageCodeLoginOutput> LifePayPhoneMesssageCodeLogin(LifePayPhoneMesssageCodeLoginInput input) | 
 |  |  |         { | 
 |  |  |             //var vcodeType = VerificationCodeBusinessTypeEnum.LifePayPhoneMesssageCodeLogin; | 
 |  |  |  | 
 |  |  |             //var checkResult = await _verificationCodeManager.CheckVerificationCodeByBusinessType(vcodeType, | 
 |  |  |             //                                                                                     input.PhoneNumber, | 
 |  |  |             //                                                                                     input.Code, | 
 |  |  |             //                                                                                     true); | 
 |  |  |             //CheckExtensions.IfTrueThrowUserFriendlyException(!checkResult, | 
 |  |  |             //                                                 CustomeErrorMessage.SometingWrongOrSometing, "验证码", "已失效"); | 
 |  |  |  | 
 |  |  |             string[] channlesNum = new string[0]; | 
 |  |  |             var lifeUser = await _lifePayUserRepository.Where(x => x.PhoneNumber == input.PhoneNumber).FirstOrDefaultAsync(); | 
 |  |  |             if (lifeUser == null) | 
 |  |  |             { | 
 |  |  | 
 |  |  |                 lifeUser.LastLoginTime = DateTime.Now; | 
 |  |  |                 await _lifePayUserRepository.UpdateAsync(lifeUser); | 
 |  |  |             } | 
 |  |  |             var backClientUser = await _userRepository.Where(x => x.ClientId == Constant.ClientType.Back | 
 |  |  |             && x.PhoneNumber == input.PhoneNumber).FirstOrDefaultAsync(); | 
 |  |  |             if (backClientUser != null) | 
 |  |  |             { | 
 |  |  |                 channlesNum = await _userChannleRep.Where(x => x.UserId == backClientUser.Id).Select(s => s.ChannleId).ToArrayAsync(); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             return lifeUser.Id; | 
 |  |  |             LifePayPhoneMesssageCodeLoginOutput result = new LifePayPhoneMesssageCodeLoginOutput() | 
 |  |  |             { | 
 |  |  |                 UserId = lifeUser.Id, | 
 |  |  |                 IsBackClientUser = backClientUser == null ? false : true, | 
 |  |  |                 ChannlesNum = channlesNum | 
 |  |  |             }; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public async Task<LifePayPhoneMesssageCodeLoginOutput> LifePayUserMesssageByIduser(Guid id) | 
 |  |  |         { | 
 |  |  |             string[] channlesNum = new string[0]; | 
 |  |  |             var lifeUser = await _lifePayUserRepository.Where(x => x.Id == id).FirstOrDefaultAsync(); | 
 |  |  |             CheckExtensions.IfTrueThrowUserFriendlyException(lifeUser == null, | 
 |  |  |                                                              "用户不存在"); | 
 |  |  |             var backClientUser = await _userRepository.Where(x => x.ClientId == Constant.ClientType.Back | 
 |  |  |              && x.PhoneNumber == lifeUser.PhoneNumber).FirstOrDefaultAsync(); | 
 |  |  |             if (backClientUser != null) | 
 |  |  |             { | 
 |  |  |                 channlesNum = await _userChannleRep.Where(x => x.UserId == backClientUser.Id).Select(s => s.ChannleId).ToArrayAsync(); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             LifePayPhoneMesssageCodeLoginOutput result = new LifePayPhoneMesssageCodeLoginOutput() | 
 |  |  |             { | 
 |  |  |                 UserId = id, | 
 |  |  |                 IsBackClientUser = backClientUser == null ? false : true, | 
 |  |  |                 ChannlesNum = channlesNum | 
 |  |  |             }; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |             return result;  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |         public async Task<IdentityModelTokenCacheItem> GetTokenForWeb(AccessRequestDto accessRequestDto, string webClientIp) | 
 |  |  |         { | 
 |  |  | 
 |  |  |             var user = await _userRepository.Where(r => r.UserName == accessRequestDto.UserName && !r.IsDeleted).FirstOrDefaultAsync(); | 
 |  |  |  | 
 |  |  |             // 记录日志 | 
 |  |  |            // await PublishUserOperateHistoryEvent(LogsSpecies.Login, LogsSpecies.Login, user.Id, user.Id, creatorName: user.Name); | 
 |  |  |             // await PublishUserOperateHistoryEvent(LogsSpecies.Login, LogsSpecies.Login, user.Id, user.Id, creatorName: user.Name); | 
 |  |  |  | 
 |  |  |             return result; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         public async Task<Guid> CreateAccount(CreateAccountInput input, bool isSend, bool isAdminCreate = false, string password = null) | 
 |  |  |         public async Task<Guid> CreateAccount(CreateAccountInput input, bool isSend, bool isAdminCreate = false) | 
 |  |  |         { | 
 |  |  |             if (input.ClientId == LifePaymentConstant.ClientId.Back) | 
 |  |  |             { | 
 |  |  |                 CheckExtensions.IfTrueThrowUserFriendlyException(!input.CompanyOrgId.HasValue || !input.DepartmentOrgId.HasValue, | 
 |  |  |                                                                  "所属公司和部门不能为空"); | 
 |  |  |             } | 
 |  |  |             //if (input.ClientId == LifePaymentConstant.ClientId.Back) | 
 |  |  |             //{ | 
 |  |  |             //    CheckExtensions.IfTrueThrowUserFriendlyException(!input.CompanyOrgId.HasValue || !input.DepartmentOrgId.HasValue, | 
 |  |  |             //                                                     "所属公司和部门不能为空"); | 
 |  |  |             //} | 
 |  |  |  | 
 |  |  |             var any = await _userRepository.Where(x => x.PhoneNumber == input.PhoneNumber && x.ClientId == input.ClientId).AnyAsync(); | 
 |  |  |             CheckExtensions.IfTrueThrowUserFriendlyException(any, | 
 |  |  |                                                              CustomeErrorMessage.PhoneNumberRepeatSaveFail); | 
 |  |  |  | 
 |  |  |             password ??= GlobalRandom.GetRandomPassword(); | 
 |  |  |             /// input.Password ??= GlobalRandom.GetRandomPassword(); | 
 |  |  |  | 
 |  |  |             CheckExtensions.IfTrueThrowUserFriendlyException(string.IsNullOrEmpty(input.Password), | 
 |  |  |                                                              "请输入密码"); | 
 |  |  |             var res = await _identityUserService.CreateAsync(new IdentityUserCreateDto | 
 |  |  |             { | 
 |  |  |                 Name = input.Name, | 
 |  |  | 
 |  |  |                 UserName = input.UserName, | 
 |  |  |                 RoleNames = input.RoleNames, | 
 |  |  |                 ClientId = input.ClientId, | 
 |  |  |                 Password = password, | 
 |  |  |                 Password = input.Password, | 
 |  |  |             }); | 
 |  |  |             var user = await _userRepository.InsertAsync(new User | 
 |  |  |             { |