using Admin.NET.Core; using Admin.NET.Core.Service; using Elastic.Transport; using Furion; using Furion.DatabaseAccessor; using Furion.DataEncryption; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using SKIT.FlurlHttpClient.Wechat.Api; using SKIT.FlurlHttpClient.Wechat.Api.Models; using System.Collections.Generic; using System.Linq; using System.Linq.Dynamic.Core; using System.Threading.Tasks; namespace Admin.NET.Application { /// /// 家长信息表服务 /// [ApiDescriptionSettings("测评服务", Name = "BusStudentsFramily", Order = 100)] public class BusStudentsFramilyService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _busStudentsFramilyRep; private readonly IHttpContextAccessor _httpContextAccessor; private readonly WechatApiClient _wechatApiClient; private readonly UserManager _userManager; private readonly SysConfigService _sysConfigService; /// /// /// /// /// /// /// public BusStudentsFramilyService( SqlSugarRepository busStudentsFramilyRep, IHttpContextAccessor httpContextAccessor, WechatApiClientFactory wechatApiHttpClient, UserManager userManager, SysConfigService sysConfigService ) { _busStudentsFramilyRep = busStudentsFramilyRep; _httpContextAccessor = httpContextAccessor; _wechatApiClient = wechatApiHttpClient.CreateWxOpenClient(); _userManager = userManager; _sysConfigService = sysConfigService; } /// /// 分页查询家长信息表 /// /// /// [HttpGet("page")] public async Task> Page([FromQuery] BusStudentsFramilyInput input) { var busStudentsFramilys = await _busStudentsFramilyRep.AsQueryable() //.Where(!string.IsNullOrEmpty(input.Uuid), u => u.Uuid == input.Uuid) .WhereIF(!string.IsNullOrEmpty(input.Phone), u => u.Phone == input.Phone) .WhereIF(!string.IsNullOrEmpty(input.NickName), u => u.NickName == input.NickName) // .Where(u => u.framilyRole == input.framilyRole) // .Where(u => u.Sort == input.Sort) .Where(u => u.TenantId == _userManager.TenantId) .OrderBy(u => u.CreateTime, OrderByType.Desc) .OrderBuilder(input) .Select(s => new BusStudentsFramilyOutput() { Uuid = s.Uuid, Phone = s.Phone, NickName = s.NickName, framilyRole = s.framilyRole, Sort = s.Sort, TenantId = s.TenantId.Value, Id = s.Id }) .ToPagedListAsync(input.Page, input.PageSize); return busStudentsFramilys; } /// /// 增加家长信息表 /// /// /// [HttpPost("add")] public async Task Add(AddBusStudentsFramilyInput input) { var busStudentsFramily = input.Adapt(); await _busStudentsFramilyRep.InsertAsync(busStudentsFramily); } /// /// 删除家长信息表 /// /// /// [HttpPost("delete")] public async Task Delete(DeleteBusStudentsFramilyInput input) { var busStudentsFramily = await _busStudentsFramilyRep.AsQueryable().FirstAsync(u => u.Id == input.Id); await _busStudentsFramilyRep.FakeDeleteAsync(busStudentsFramily); } /// /// 更新家长信息表 /// /// /// [HttpPost("edit")] public async Task Update(UpdateBusStudentsFramilyInput input) { var isExist = await _busStudentsFramilyRep.AsQueryable().AnyAsync(u => u.Id == input.Id); if (!isExist) throw Oops.Oh(ErrorCodeEnum.D3000); var busStudentsFramily = input.Adapt(); await _busStudentsFramilyRep.UpdateAsync(busStudentsFramily); } /// /// 获取家长信息表 /// /// /// [HttpGet("detail")] public async Task Get([FromQuery] QueryeBusStudentsFramilyInput input) { return (await _busStudentsFramilyRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取家长信息表列表 /// /// /// [HttpGet("list")] public async Task> List([FromQuery] BusStudentsFramilyInput input) { return await _busStudentsFramilyRep.AsQueryable(). Select(s => new BusStudentsFramilyOutput() { Uuid = s.Uuid, Phone = s.Phone, NickName = s.NickName, framilyRole = s.framilyRole, Sort = s.Sort, TenantId = s.TenantId.Value, Id = s.Id }) .ToListAsync(); } /// /// 获取微信openid /// /// /// [HttpPost("WeChatOauth")] [AllowAnonymous] public async Task WeChatOauth(WeChatRequestDto requestDto) { var weChatResposeDto = new WeChatResposeDto(); var reqJsCode2Session = new SnsJsCode2SessionRequest() { JsCode = requestDto.Code, }; var resCode2Session = await _wechatApiClient.ExecuteSnsJsCode2SessionAsync(reqJsCode2Session); if (resCode2Session.ErrorCode != (int)WechatReturnCodeEnum.请求成功) throw Oops.Oh(resCode2Session.ErrorMessage + " " + resCode2Session.ErrorCode); var wxUser = new BusStudentsFramily() { Uuid = resCode2Session.OpenId }; var any = await _busStudentsFramilyRep.AsQueryable() .AnyAsync(u => u.Uuid.Equals(resCode2Session.OpenId) && !u.IsDelete); if (any) { wxUser = await _busStudentsFramilyRep.AsQueryable().Where(c => c.Uuid.Equals(resCode2Session.OpenId) && !c.IsDelete) .FirstAsync(c => c.Uuid == resCode2Session.OpenId && c.TenantId > 0); } else { wxUser.TenantId = 1300000000001;//默认初始化租户,后期卖给其他机构需定向传值 // 生成Token令牌 await _busStudentsFramilyRep.InsertAsync(wxUser); } var tokenExpire = await _sysConfigService.GetTokenExpire(); var accessToken = JWTEncryption.Encrypt(new Dictionary { { ClaimConst.UserId, wxUser.Id }, { ClaimConst.NickName, wxUser.NickName }, { ClaimConst.LoginMode, LoginModeEnum.APP }, }, tokenExpire); // 设置Swagger自动登录 _httpContextAccessor.HttpContext.SigninToSwagger(accessToken); weChatResposeDto.Token = accessToken; weChatResposeDto.OpenId = resCode2Session.OpenId; weChatResposeDto.Session_key = resCode2Session.SessionKey; weChatResposeDto.Id = wxUser.Id; return weChatResposeDto; } /// /// 获取用户手机号信息 /// /// /// [HttpPost] public async Task GetUserPhonenumber(EnGetPhoneRequestDto dto) { bool status = false; try { //var getaccessinfo = WeChatUtil.GetAccess_token(WeChatConst.Appid, WeChatConst.Key); //var phoneinfo = WeChatUtil.GetUserPhonenumber(getaccessinfo.access_token, JsonUtil.ToJson(new PhoneRequestDto() { code = dto.Code })); var accessToken = await GetCgibinToken(); var reqUserPhoneNumber = new WxaBusinessGetUserPhoneNumberRequest() { Code = dto.Code, AccessToken = accessToken, }; var resUserPhoneNumber = await _wechatApiClient.ExecuteWxaBusinessGetUserPhoneNumberAsync(reqUserPhoneNumber); if (resUserPhoneNumber.ErrorCode != (int)WechatReturnCodeEnum.请求成功) throw Oops.Oh(resUserPhoneNumber.ErrorMessage + " " + resUserPhoneNumber.ErrorCode); var oauthinfo = await _busStudentsFramilyRep.AsQueryable().FirstAsync(c => c.Uuid == dto.OpenId && c.TenantId > 0); if (oauthinfo != null) { // DingHookHelper.DingTalkHookMessage("SysOauthUserService", string.Format("code:{0};--jsons{1}", dto.Code, JsonUtil.ToJson(phoneinfo))); oauthinfo.Phone = resUserPhoneNumber.PhoneInfo?.PhoneNumber; oauthinfo.Avatar = "https://lwpostgradute.oss-cn-hangzhou.aliyuncs.com/defaultAvatarUrl.png"; oauthinfo.NickName = "家长" + new Random().Next(832468, 999999); await _busStudentsFramilyRep.UpdateAsync(oauthinfo); status = true; } } catch (Exception ex) { throw Oops.Oh(ex.Message).StatusCode(200); } return status; } /// /// 获取Access_token /// private async Task GetCgibinToken() { var reqCgibinToken = new CgibinTokenRequest(); var resCgibinToken = await _wechatApiClient.ExecuteCgibinTokenAsync(reqCgibinToken); if (resCgibinToken.ErrorCode != (int)WechatReturnCodeEnum.请求成功) throw Oops.Oh(resCgibinToken.ErrorMessage + " " + resCgibinToken.ErrorCode); return resCgibinToken.AccessToken; } /// /// 保存用户信息并解密手机号 /// /// /// //[HttpPost] ////[AllowAnonymous] //public async Task EncryptedInfo(EncryptedDto encryptedDto) //{ // string phone = string.Empty; // try // { // var accessToken = await GetCgibinToken(); // var reqUserPhoneNumber = new WxaBusinessGetUserPhoneNumberRequest() // { // Code = encryptedDto.code, // AccessToken = accessToken, // }; // var resUserPhoneNumber = await _wechatApiClient.ExecuteWxaBusinessGetUserPhoneNumberAsync(reqUserPhoneNumber); // if (resUserPhoneNumber.ErrorCode != (int)WechatReturnCodeEnum.请求成功) // throw Oops.Oh(resUserPhoneNumber.ErrorMessage + " " + resUserPhoneNumber.ErrorCode); // var result = WeChatUtil.Code2Session(WeChatConst.Appid, WeChatConst.Key, encryptedDto.code); // var any = await _busStudentsFramilyRep.AsQueryable().AnyAsync(c => c.Uuid == encryptedDto.openId && !c.IsDelete); // if (any) // { // var single = await _busStudentsFramilyRep.AsQueryable().FirstAsync(c => c.Uuid == encryptedDto.openId && !c.IsDelete); // single.Phone = resUserPhoneNumber.PhoneInfo?.PhoneNumber; // single.Avatar = "https://lwpostgradute.oss-cn-hangzhou.aliyuncs.com/defaultAvatarUrl.png"; // single.NickName = "家长" + new Random().Next(832468, 999999); // await _busStudentsFramilyRep.UpdateAsync(single); // } // else // { // await _busStudentsFramilyRep.InsertAsync(new BusStudentsFramily() // { // Avatar = "https://lwpostgradute.oss-cn-hangzhou.aliyuncs.com/defaultAvatarUrl.png", // // Gender = encryptedDto.gender.ToString(), // NickName = "家长" + new Random().Next(832468, 999999), // Phone = resUserPhoneNumber.PhoneInfo?.PhoneNumber, // TenantId = 1300000000001,//默认初始化租户,后期卖给其他机构需定向传值 // Uuid = encryptedDto.openId, // // Source = "小程序" // }); // } // } // catch (Exception ex) // { // throw Oops.Oh(ex.Message); // } //} /// /// 清空缓存后下次登录返回用户信息 /// /// /// [HttpGet("WeChatLogin")] [AllowAnonymous] public async Task WeChatLogin([FromQuery] WeChatRequestDto weChatLogin) { var user = new WchatOauthDto(); var reqJsCode2Session = new SnsJsCode2SessionRequest() { JsCode = weChatLogin.Code, }; var resCode2Session = await _wechatApiClient.ExecuteSnsJsCode2SessionAsync(reqJsCode2Session); if (resCode2Session.ErrorCode != (int)WechatReturnCodeEnum.请求成功) throw Oops.Oh(resCode2Session.ErrorMessage + " " + resCode2Session.ErrorCode); var wxUser = await _busStudentsFramilyRep.AsQueryable() .Where(u => u.Uuid.Equals(resCode2Session.OpenId) && !u.IsDelete) .FirstAsync(); _ = wxUser ?? throw Oops.Oh(ErrorCodeEnum.D1002).StatusCode(200); user.Id = wxUser.Id; user.TenantId = wxUser.TenantId.Value; user.OpenId = wxUser.Uuid; var tokenExpire = await _sysConfigService.GetTokenExpire(); var accessToken = JWTEncryption.Encrypt(new Dictionary { { ClaimConst.UserId, wxUser.Id }, { ClaimConst.RealName, wxUser.NickName }, { ClaimConst.LoginMode, LoginModeEnum.APP }, }, tokenExpire); user.AccessToken = accessToken; return user; } } }