374 lines
16 KiB
C#
374 lines
16 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 家长信息表服务
|
|
/// </summary>
|
|
[ApiDescriptionSettings("测评服务", Name = "BusStudentsFramily", Order = 100)]
|
|
public class BusStudentsFramilyService : IDynamicApiController, ITransient
|
|
{
|
|
private readonly SqlSugarRepository<BusStudentsFramily> _busStudentsFramilyRep;
|
|
private readonly IHttpContextAccessor _httpContextAccessor;
|
|
private readonly WechatApiClient _wechatApiClient;
|
|
private readonly UserManager _userManager;
|
|
private readonly SysConfigService _sysConfigService;
|
|
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="busStudentsFramilyRep"></param>
|
|
/// <param name="httpContextAccessor"></param>
|
|
/// <param name="wechatApiHttpClient"></param>
|
|
/// <param name="userManager"></param>
|
|
public BusStudentsFramilyService(
|
|
SqlSugarRepository<BusStudentsFramily> busStudentsFramilyRep, IHttpContextAccessor httpContextAccessor, WechatApiClientFactory wechatApiHttpClient,
|
|
UserManager userManager, SysConfigService sysConfigService
|
|
)
|
|
{
|
|
_busStudentsFramilyRep = busStudentsFramilyRep;
|
|
_httpContextAccessor = httpContextAccessor;
|
|
_wechatApiClient = wechatApiHttpClient.CreateWxOpenClient();
|
|
_userManager = userManager;
|
|
_sysConfigService = sysConfigService;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 分页查询家长信息表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpGet("page")]
|
|
public async Task<SqlSugarPagedList<BusStudentsFramilyOutput>> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 增加家长信息表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("add")]
|
|
public async Task Add(AddBusStudentsFramilyInput input)
|
|
{
|
|
var busStudentsFramily = input.Adapt<BusStudentsFramily>();
|
|
await _busStudentsFramilyRep.InsertAsync(busStudentsFramily);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 删除家长信息表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("delete")]
|
|
public async Task Delete(DeleteBusStudentsFramilyInput input)
|
|
{
|
|
var busStudentsFramily = await _busStudentsFramilyRep.AsQueryable().FirstAsync(u => u.Id == input.Id);
|
|
await _busStudentsFramilyRep.FakeDeleteAsync(busStudentsFramily);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 更新家长信息表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[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<BusStudentsFramily>();
|
|
await _busStudentsFramilyRep.UpdateAsync(busStudentsFramily);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取家长信息表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpGet("detail")]
|
|
public async Task<BusStudentsFramilyOutput> Get([FromQuery] QueryeBusStudentsFramilyInput input)
|
|
{
|
|
return (await _busStudentsFramilyRep.AsQueryable().FirstAsync(u => u.Id == input.Id)).Adapt<BusStudentsFramilyOutput>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取家长信息表列表
|
|
/// </summary>
|
|
/// <param name="input"></param>
|
|
/// <returns></returns>
|
|
[HttpGet("list")]
|
|
public async Task<List<BusStudentsFramilyOutput>> 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();
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 获取微信openid
|
|
/// </summary>
|
|
/// <param name="requestDto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost("WeChatOauth")]
|
|
[AllowAnonymous]
|
|
public async Task<WeChatResposeDto> 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<string, object>
|
|
{
|
|
{ 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;
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 获取用户手机号信息
|
|
/// </summary>
|
|
/// <param name="dto"></param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public async Task<bool> GetUserPhonenumber(EnGetPhoneRequestDto dto)
|
|
{
|
|
bool status = false;
|
|
try
|
|
{
|
|
//var getaccessinfo = WeChatUtil.GetAccess_token<AccessTokenResult>(WeChatConst.Appid, WeChatConst.Key);
|
|
//var phoneinfo = WeChatUtil.GetUserPhonenumber<UserPhone_Info>(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;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取Access_token
|
|
/// </summary>
|
|
private async Task<string> 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;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 保存用户信息并解密手机号
|
|
/// </summary>
|
|
/// <param name="encryptedDto"></param>
|
|
/// <returns></returns>
|
|
//[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<WeChatOauthinfo>(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);
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 清空缓存后下次登录返回用户信息
|
|
/// </summary>
|
|
/// <param name="weChatLogin"></param>
|
|
/// <returns></returns>
|
|
[HttpGet("WeChatLogin")]
|
|
[AllowAnonymous]
|
|
public async Task<WchatOauthDto> 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<string, object>
|
|
{
|
|
{ ClaimConst.UserId, wxUser.Id },
|
|
{ ClaimConst.RealName, wxUser.NickName },
|
|
{ ClaimConst.LoginMode, LoginModeEnum.APP },
|
|
}, tokenExpire);
|
|
user.AccessToken = accessToken;
|
|
return user;
|
|
}
|
|
|
|
|
|
}
|
|
}
|