/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Linq.Expressions;
using System.Security.Claims;
using System.Threading.Tasks;
using CoreCms.Net.Auth.Policys;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.FromBody;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using SqlSugar;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinUserInfoBatchGetRequest.Types;
namespace CoreCms.Net.Services;
///
/// 用户表 接口实现
///
public class CoreCmsUserServices : BaseServices, ICoreCmsUserServices
{
private readonly ICoreCmsUserRepository _dal;
private readonly ICoreCmsUserBalanceServices _userBalanceServices;
private readonly ICoreCmsSettingServices _settingServices;
private readonly ICoreCmsUserPointLogServices _userPointLogServices;
private readonly ICoreCmsSmsServices _smsServices;
private readonly ICoreCmsUserWeChatInfoServices _userWeChatInfoServices;
private readonly ICoreCmsUserGradeServices _userGradeServices;
private readonly ICoreCmsUserLogServices _userLogServices;
private readonly IServiceProvider _serviceProvider;
private readonly IUnitOfWork _unitOfWork;
private readonly PermissionRequirement _permissionRequirement;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ICoreCmsBillPaymentsServices _billPaymentsServices;
private readonly ICoreCmsDistributionGradeRepository _distributionGradeRepository;
private readonly ICoreCmsDistributionRepository _distributionRepository;
private readonly ICoreCmsPromotionServices _coreCmsPromotionServices;
private readonly ICoreCmsCouponServices _coreCmsCouponServices;
public CoreCmsUserServices(IUnitOfWork unitOfWork
, ICoreCmsUserRepository dal
, ICoreCmsUserBalanceServices userBalanceServices
, ICoreCmsSettingServices settingServices
, ICoreCmsUserPointLogServices userPointLogServices, ICoreCmsSmsServices smsServices,
ICoreCmsUserWeChatInfoServices userWeChatInfoServices, ICoreCmsUserGradeServices userGradeServices,
PermissionRequirement permissionRequirement, IHttpContextAccessor httpContextAccessor,
ICoreCmsUserLogServices userLogServices, IServiceProvider serviceProvider,
ICoreCmsBillPaymentsServices billPaymentsServices, ICoreCmsDistributionGradeRepository distributionGradeRepository, ICoreCmsDistributionRepository distributionRepository, ICoreCmsPromotionServices coreCmsPromotionServices, ICoreCmsCouponServices coreCmsCouponServices)
{
_dal = dal;
BaseDal = dal;
_unitOfWork = unitOfWork;
_userBalanceServices = userBalanceServices;
_settingServices = settingServices;
_userPointLogServices = userPointLogServices;
_smsServices = smsServices;
_userWeChatInfoServices = userWeChatInfoServices;
_userGradeServices = userGradeServices;
_permissionRequirement = permissionRequirement;
_httpContextAccessor = httpContextAccessor;
_userLogServices = userLogServices;
_serviceProvider = serviceProvider;
_billPaymentsServices = billPaymentsServices;
_distributionGradeRepository = distributionGradeRepository;
_distributionRepository = distributionRepository;
_coreCmsPromotionServices = coreCmsPromotionServices;
_coreCmsCouponServices = coreCmsCouponServices;
}
#region 更新余额
///
/// 更新余额
///
///
///
///
///
public async Task UpdateBalance(int id, decimal money, string memo)
{
var jm = new AdminUiCallBack();
var model = await _dal.QueryByIdAsync(id);
if (model == null)
{
jm.msg = "不存在此信息";
return jm;
}
var newMoney = model.balance + money;
var up = await _dal.UpdateAsync(p => new CoreCmsUser() { balance = newMoney }, p => p.id == id);
if (up)
{
var balance = new CoreCmsUserBalance();
balance.type = (int)GlobalEnumVars.UserBalanceSourceTypes.Admin;
balance.userId = model.id;
balance.balance = newMoney;
balance.createTime = DateTime.Now;
balance.memo = !string.IsNullOrEmpty(memo) ? memo : UserHelper.GetMemo(balance.type, money);
balance.money = money;
balance.sourceId = GlobalEnumVars.UserBalanceSourceTypes.Admin.ToString();
jm.code = await _userBalanceServices.InsertAsync(balance) > 0 ? 0 : 1;
}
jm.msg = jm.code == 0 ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure;
return jm;
}
#endregion
#region 更新积分
///
/// 更新积分
///
///
///
public async Task UpdatePiont(FMUpdateUserPoint entity)
{
var jm = new AdminUiCallBack();
var model = await _dal.QueryByIdAsync(entity.id);
if (model == null)
{
jm.msg = "不存在此信息";
return jm;
}
var newPoint = model.point + entity.point;
var up = await _dal.UpdateAsync(p => new CoreCmsUser() { point = newPoint }, p => p.id == entity.id);
if (up)
{
var point = new CoreCmsUserPointLog();
point.userId = model.id;
point.type = (int)GlobalEnumVars.UserPointSourceTypes.PointTypeAdminEdit;
point.num = entity.point;
point.balance = newPoint;
point.remarks = entity.memo;
point.createTime = DateTime.Now;
jm.code = await _userPointLogServices.InsertAsync(point) > 0 ? 0 : 1;
}
jm.msg = jm.code == 0 ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure;
return jm;
}
#endregion
#region 获取用户的积分
///
/// 获取用户的积分
///
/// 用户序列
/// 订单金额
/// 货品序列
/// 购物车类型
///
public async Task GetUserPoint(int userId, decimal orderMoney, int[] ids, int cartType)
{
var dto = new GetUserPointResult();
//1是2否
var allConfigs = await _settingServices.GetConfigDictionaries();
var pointSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointSwitch)
.ObjectToInt(); //是否开启积分功能
if (pointSwitch == 2)
{
dto.@switch = 2;
return dto;
}
var user = await _dal.QueryByClauseAsync(p => p.id == userId);
if (user != null)
{
dto.point = user.point;
var pointExchangeModel = CommonHelper
.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointExchangeModel)
.ObjectToInt(); //判断是全局模式还是单品模式
if (pointExchangeModel == 1)
{
if (orderMoney != 0)
{
//计算可用积分//订单积分使用比例
var ordersPointProportion = CommonHelper
.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion)
.ObjectToDecimal(10);
var proportion = Math.Round(ordersPointProportion / 100, 4);
//最多可以抵扣的金额
var maxPointDeductedMoney = Math.Round(orderMoney * proportion, 4);
//订单积分折现比例(多少积分可以折现1块钱)
var pointDiscountedProportion = CommonHelper
.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion)
.ObjectToDecimal(100);
//计算需要多少积分
var needsPoint = maxPointDeductedMoney * pointDiscountedProportion;
//确定是否有那么多积分去抵扣比例计算出的能抵扣的钱
var availablePoint = needsPoint > user.point ? user.point : needsPoint;
dto.availablePoint = Convert.ToInt32(availablePoint);
dto.pointExchangeMoney = Math.Round(availablePoint / pointDiscountedProportion, 4);
//dto.pointExchangeMoney = dto.availablePoint / pointDiscountedProportion;
}
}
else if (pointExchangeModel == 2)
{
using var container = _serviceProvider.CreateScope();
var cartServices = container.ServiceProvider.GetService();
var productsServices = container.ServiceProvider.GetService();
//获取购物车数据
var cartProducts = await cartServices.QueryListByClauseAsync(p =>
p.type == cartType && p.userId == userId && ids.Contains(p.id));
if (cartProducts.Any())
{
//获取购物车货品序列
var cartIds = cartProducts.Select(p => p.productId).ToList();
//根据货品序列去找货品
var products = await productsServices.QueryListByClauseAsync(p => cartIds.Contains(p.id));
if (products.Any())
{
//可抵扣金额
decimal money = 0;
//迭代货品,获取到最高可优惠金额,进行累加
foreach (var item in products)
{
var numObj = cartProducts.Find(p => p.productId == item.id);
if (numObj != null) money += numObj.nums * item.pointsDeduction;
}
//计算抵扣这么多金额需要多少积分。
//订单积分折现比例(多少积分可以折现1块钱)
var pointDiscountedProportion = CommonHelper
.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion)
.ObjectToInt(100);
//计算需要多少积分
var needsPoint = money * pointDiscountedProportion;
//确定是否有那么多积分去抵扣比例计算出的能抵扣的钱
var availablePoint = needsPoint > user.point ? 0 : needsPoint;
dto.availablePoint = Convert.ToInt32(availablePoint);
dto.pointExchangeMoney = user.point > needsPoint ? money : 0;
}
}
}
}
return dto;
}
#endregion
#region 修改用户密码,如果用户之前没有密码,那么就不校验原密码
///
/// 修改用户密码,如果用户之前没有密码,那么就不校验原密码
///
public async Task ChangePassword(int userId, string newPwd, string password = "")
{
var jm = new WebApiCallBack();
//修改密码验证原密码
var user = await _dal.QueryByIdAsync(userId);
if (user == null)
{
jm.msg = GlobalErrorCodeVars.Code10000;
return jm;
}
if (!string.IsNullOrEmpty(user.passWord))
{
if (string.IsNullOrEmpty(password))
{
jm.msg = "请输入原密码!";
return jm;
}
if (user.passWord != CommonHelper.EnPassword(password, user.createTime))
{
jm.msg = "原密码不正确!";
return jm;
}
}
if (string.IsNullOrEmpty(newPwd) || newPwd.Length < 6 || newPwd.Length > 16)
{
jm.msg = GlobalErrorCodeVars.Code11009;
return jm;
}
var md5Pwd = CommonHelper.EnPassword(newPwd, user.createTime);
if (!string.IsNullOrEmpty(user.passWord) && user.passWord == md5Pwd)
{
jm.msg = "原密码和新密码一样!";
return jm;
}
var bl = await _dal.UpdateAsync(p => new CoreCmsUser() { passWord = md5Pwd, updataTime = DateTime.Now },
p => p.id == userId);
jm.status = bl;
jm.msg = bl ? "密码修改成功!" : "密码修改失败!";
return jm;
}
#endregion
#region 绑定上级
///
/// 绑定上级
///
///
///
///
public async Task SetMyInvite(int superiorId, int userId)
{
var jm = new WebApiCallBack() { msg = "填写邀请码失败" };
jm.otherData = superiorId;
//自己不能邀请自己
if (userId == superiorId)
{
jm.msg = "自己不能邀请自己";
return jm;
}
var user = await _dal.QueryByIdAsync(userId);
if (user == null)
{
jm.msg = GlobalErrorCodeVars.Code10000;
return jm;
}
if (user.parentId != 0)
{
jm.msg = "已有上级邀请,不能绑定其他的邀请";
return jm;
}
var superior = await _dal.QueryByIdAsync(superiorId);
if (superior == null)
{
jm.msg = "不存在这个邀请码";
return jm;
}
if (superior.parentId == user.id)
{
jm.msg = "不允许双方互相设置为上级";
return jm;
}
var flag = IsInvited(userId, superiorId);
if (flag)
{
jm.msg = "不允许填写下级的邀请码";
return jm;
}
var bl = await _dal.UpdateAsync(p => new CoreCmsUser() { parentId = superiorId }, p => p.id == userId);
//增加上级积分
if (bl)
{
var allConfigs = await _settingServices.GetConfigDictionaries();
var inviterUserIntegral = CommonHelper
.GetConfigDictionary(allConfigs, SystemSettingConstVars.InviterUserIntegral).ObjectToInt(); //是否开启积分功能
if (inviterUserIntegral > 0)
await _userPointLogServices.SetPoint(superiorId, inviterUserIntegral,
(int)GlobalEnumVars.UserPointSourceTypes.PointTypeInviterUser, "发展用户:" + userId + "赠送积分");
}
jm.status = bl;
jm.msg = bl ? "填写邀请码成功!" : "填写邀请码失败!";
return jm;
}
#endregion
#region 获取我的上级邀请人
///
/// 获取我的上级邀请人
///
///
///
public async Task GetMyInvite(int userId)
{
var jm = new WebApiCallBack() { status = true };
var user = await _dal.QueryByIdAsync(userId);
if (user == null)
{
jm.msg = GlobalErrorCodeVars.Code10000;
return jm;
}
if (user.parentId == 0)
{
jm.msg = "无上级邀请人";
return jm;
}
var parentUser = await _dal.QueryByClauseAsync(p => p.id == user.parentId);
if (parentUser != null)
jm.data = new
{
nickname = parentUser.nickName,
avatar = parentUser.avatarImage,
mobile = UserHelper.FormatMobile(parentUser.mobile),
ctime = parentUser.createTime
};
return jm;
}
///
/// 获取下级推广用户数量
///
/// 父类序列
/// 1获取1级,其他为2级
/// 当月
///
public async Task QueryChildCountAsync(int parentId, int type = 1, bool thisMonth = false)
{
return await _dal.QueryChildCountAsync(parentId, type, thisMonth);
}
///
/// 判断userId是否是pid的父节点或者祖父节点,如果是,就返回true,如果不是就返回false
///
///
///
///
private bool IsInvited(int userId, int pid)
{
var info = _dal.QueryById(pid);
if (info == null || info.parentId == 0)
{
return false;
}
else
{
if (info.parentId == userId)
return true;
else
return IsInvited(userId, info.parentId);
}
}
#endregion
#region 忘记密码,找回密码
///
/// 忘记密码,找回密码
///
///
///
///
///
public async Task ForgetPassword(string mobile, string code, string newPwd)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(code))
{
jm.msg = GlobalErrorCodeVars.Code10013;
return jm;
}
var smsBool = await _smsServices.Check(mobile, code, "veri");
if (!smsBool)
{
jm.msg = GlobalErrorCodeVars.Code10012;
return jm;
}
var userInfo = await _dal.QueryByClauseAsync(p => p.mobile == mobile);
if (userInfo == null)
{
jm.msg = "没有此手机号码";
return jm;
}
return await EditPwd(userInfo.id, newPwd, userInfo.createTime);
}
#endregion
#region 修改密码
///
/// 修改密码
///
/// 用户序列
/// 新密码
/// 创建时间
///
private async Task EditPwd(int userId, string newPwd, DateTime createTime)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(newPwd) || newPwd.Length < 6 || newPwd.Length > 16)
{
jm.msg = GlobalErrorCodeVars.Code11009;
return jm;
}
var md5Pwd = CommonHelper.EnPassword(newPwd, createTime);
var up = await _dal.UpdateAsync(p => new CoreCmsUser() { passWord = md5Pwd }, p => p.id == userId);
if (!up)
{
jm.status = false;
jm.msg = "密码修改失败";
return jm;
}
jm.status = true;
jm.msg = "密码修改成功";
return jm;
}
#endregion
#region 手机短信验证码登陆,同时兼有手机短信注册的功能,还有第三方账户绑定的功能
///
/// 手机短信验证码登陆,同时兼有手机短信注册的功能,还有第三方账户绑定的功能
///
/// 实体数据
/// 登录方式(1普通,2短信,3微信小程序拉取手机号)
///
///
public async Task SmsLogin(FMWxAccountCreate entity,
int loginType = (int)GlobalEnumVars.LoginType.WeChatPhoneNumber,
int platform = (int)GlobalEnumVars.CoreShopSystemCategory.Api)
{
var jm = new WebApiCallBack();
if (string.IsNullOrEmpty(entity.mobile))
{
jm.msg = "请输入手机号码";
return jm;
}
if (!CommonHelper.IsMobile(entity.mobile))
{
jm.msg = "请输入合法的手机号码";
return jm;
}
//if (loginType == (int)GlobalEnumVars.LoginType.Sms)
//{
// if (string.IsNullOrEmpty(entity.code))
// {
// jm.msg = "请输入验证码";
// return jm;
// }
// if (!await _smsServices.Check(entity.mobile, entity.code, "login"))
// {
// jm.msg = "短信验证码错误";
// return jm;
// }
//}
var isReg = false;
var userInfo = await _dal.QueryByClauseAsync(p => p.mobile == entity.mobile);
if (userInfo == null)
{
isReg = true;
userInfo = new CoreCmsUser();
userInfo.userName = entity.mobile;
userInfo.mobile = entity.mobile;
userInfo.sex = 3;
userInfo.isDelete = false;
userInfo.balance = 0;
userInfo.point = 0;
userInfo.userWx = 0;
userInfo.status = (int)GlobalEnumVars.UserStatus.正常;
userInfo.createTime = DateTime.Now;
//没有此用户,创建此用户
if (!string.IsNullOrEmpty(entity.sessionAuthId))
{
var wxUserInfo =
await _userWeChatInfoServices.QueryByClauseAsync(p => p.openid == entity.sessionAuthId);
if (wxUserInfo != null)
{
if (string.IsNullOrEmpty(entity.avatar)) entity.avatar = wxUserInfo.avatar;
if (string.IsNullOrEmpty(entity.nickname)) entity.nickname = wxUserInfo.nickName;
userInfo.sex = wxUserInfo?.gender ?? 3;
userInfo.userWx = wxUserInfo?.id ?? 0;
}
}
var allConfigs = await _settingServices.GetConfigDictionaries();
//如果没有头像和昵称,那么就取系统头像和昵称吧
if (!string.IsNullOrEmpty(entity.avatar))
{
userInfo.avatarImage = entity.avatar;
}
else
{
var defaultImage =
CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopDefaultImage);
userInfo.avatarImage = defaultImage;
}
userInfo.nickName = !string.IsNullOrEmpty(entity.nickname)
? entity.nickname
: UserHelper.FormatMobile(entity.mobile);
if (entity.invitecode > 0)
{
var pid = UserHelper.GetUserIdByShareCode(entity.invitecode);
var pInfo = await _dal.QueryByClauseAsync(p => p.id == pid);
if (pInfo != null)
{
userInfo.parentId = pid;
}
//else
//{
// jm.msg = GlobalErrorCodeVars.Code10014;
// return jm;
//}
}
if (!string.IsNullOrEmpty(entity.password))
{
//判断密码是否符合要求
if (entity.password.Length < 5 || entity.password.Length > 16)
{
jm.msg = GlobalErrorCodeVars.Code11009;
return jm;
}
userInfo.passWord = CommonHelper.EnPassword(entity.password, userInfo.createTime);
}
else
{
userInfo.passWord = "";
}
//取默认的用户等级
var userGradeInfo = await _userGradeServices.QueryByClauseAsync(p => p.isDefault == true);
userInfo.grade = userGradeInfo?.id ?? 0;
var userId = await _dal.InsertAsync(userInfo);
if (userId == 0)
{
jm.msg = GlobalErrorCodeVars.Code10000;
return jm;
}
if (userId > 0)
{
if (entity.invitecode > 0 && userInfo.parentId > 0)
{
var inviterUserIntegral = CommonHelper
.GetConfigDictionary(allConfigs, SystemSettingConstVars.InviterUserIntegral)
.ObjectToInt(); //是否开启积分功能
if (inviterUserIntegral > 0)
await _userPointLogServices.SetPoint(userInfo.parentId, inviterUserIntegral,
(int)GlobalEnumVars.UserPointSourceTypes.PointTypeInviterUser, "发展用户:" + userId + "赠送积分");
}
//是否默认注册经销商
var distributionType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.DistributionType).ObjectToInt(); //是否默认注册经销商
if (distributionType == (int)GlobalEnumVars.DistributionConditionType.RegOpen)
{
var iData = new CoreCmsDistribution();
iData.userId = userId;
var disGradeModel = await _distributionGradeRepository.QueryByClauseAsync(p => p.isDefault == true);
iData.gradeId = disGradeModel?.id ?? 0;
iData.mobile = entity.mobile;
iData.name = userInfo.nickName;
iData.weixin = "";
iData.qq = "";
iData.verifyStatus = (int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes;
iData.isDelete = false;
iData.createTime = DateTime.Now;
await _distributionRepository.InsertAsync(iData);
}
}
userInfo = await _dal.QueryByIdAsync(userId);
var isAllowGiveCoupon = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.IsAllowGiveCoupon).ObjectToInt(); //是否赠送新人优惠券
var selectGiveCoupon = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SelectGiveCoupon).ObjectToInt(); //选择注册赠送优惠券
var giveCouponNumber = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.GiveCouponNumber).ObjectToInt(); //赠送优惠券数量
if (userId > 0 && isAllowGiveCoupon == 1 && selectGiveCoupon > 0 && giveCouponNumber > 0)
{
var promotion = await _coreCmsPromotionServices.QueryByIdAsync(selectGiveCoupon);
var dt = DateTime.Now;
if (!promotion.isDel && promotion.isEnable && promotion.startTime < dt && promotion.endTime > dt)
{
await _coreCmsCouponServices.AddData(userId, promotion.id, promotion, giveCouponNumber, "新人注册赠送");
}
}
}
else
{
//如果有这个账号的话,判断一下是不是传密码了,如果传密码了,就是注册,这里就有问题,因为已经注册过
if (!string.IsNullOrEmpty(entity.password))
{
jm.msg = GlobalErrorCodeVars.Code11019;
return jm;
}
}
//判断是否是小程序里的微信登陆,如果是,就给他绑定微信账号
if (!string.IsNullOrEmpty(entity.sessionAuthId))
{
var updateAsync = await _userWeChatInfoServices.UpdateAsync(p => new CoreCmsUserWeChatInfo() { userId = userInfo.id }, p => p.openid == entity.sessionAuthId);
if (updateAsync)
{
//多个微信可能同时授权一个号码登录。
//如果已经存在微信用户(A)数据绑定了手机号码。
//使用新微信(B)登录,同时又授权此手机号码绑定。
//小程序内微信支付时候,因为登录的微信(B)与拉取手机号码绑定后获取到数据是(A)。
//会导致微信数据报错()
//2023-05-05 屏蔽此代码,是为了让公众号,小程序实现多openid指向同一个账号,但是也存在问题,就是多了之后的解绑问题,应该做个登录设备管理。
//await _userWeChatInfoServices.UpdateAsync(p => new CoreCmsUserWeChatInfo() { userId = 0 }, p => p.openid != entity.sessionAuthId && p.userId == userInfo.id);
}
//如果是别的未绑定微信用户进来,则反向直接关联。
var wxUserInfo = await _userWeChatInfoServices.QueryByClauseAsync(p => p.openid == entity.sessionAuthId);
if (wxUserInfo != null)
{
await _dal.UpdateAsync(p => new CoreCmsUser() { userWx = wxUserInfo.id }, p => p.id == userInfo.id);
}
}
if (userInfo.status == (int)GlobalEnumVars.UserStatus.正常)
{
jm.status = true;
jm.msg = "成功";
jm.otherData = userInfo;
if (platform == (int)GlobalEnumVars.CoreShopSystemCategory.Api)
{
var claims = new List
{
new(ClaimTypes.Name, userInfo.nickName),
new(JwtRegisteredClaimNames.Jti, userInfo.id.ToString()),
new(ClaimTypes.Expiration,
DateTime.Now.AddSeconds(_permissionRequirement.Expiration.TotalSeconds).ToString())
};
//用户标识
var identity = new ClaimsIdentity(JwtBearerDefaults.AuthenticationScheme);
identity.AddClaims(claims);
jm.data = JwtToken.BuildJwtToken(claims.ToArray(), _permissionRequirement);
}
else
{
jm.data = userInfo;
}
//录入登录日志
var log = new CoreCmsUserLog();
log.userId = userInfo.id;
log.state = isReg ? (int)GlobalEnumVars.UserLogTypes.注册 : (int)GlobalEnumVars.UserLogTypes.登录;
log.ip = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress != null
? _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString()
: "127.0.0.1";
log.createTime = DateTime.Now;
log.parameters =
isReg ? GlobalEnumVars.UserLogTypes.注册.ToString() : GlobalEnumVars.UserLogTypes.登录.ToString();
await _userLogServices.InsertAsync(log);
}
else
{
jm.msg = GlobalErrorCodeVars.Code11022;
return jm;
}
return jm;
}
#endregion
#region 根据条件查询分页数据
///
/// 根据条件查询分页数据
///
/// 判断集合
/// 排序方式
/// 当前页面索引
/// 分布大小
///
///
public async Task> QueryPageAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
}
#endregion
#region 按天统计新会员
///
/// 按天统计新会员
///
///
public async Task> Statistics(int day)
{
return await _dal.Statistics(day);
}
#endregion
#region 按天统计当天下单活跃会员
///
/// 按天统计当天下单活跃会员
///
///
public async Task> StatisticsOrder(int day)
{
return await _dal.StatisticsOrder(day);
}
#endregion
#region 当关闭分销和代理的时候走个人邀请好友分佣
///
/// 当关闭分销和代理的时候走个人邀请好友分佣
///
///
///
public async Task InviteCommission(string orderId)
{
using var container = _serviceProvider.CreateScope();
var _orderServices = container.ServiceProvider.GetService();
var _billPaymentsServices = container.ServiceProvider.GetService();
var jm = new WebApiCallBack();
var allConfigs = await _settingServices.GetConfigDictionaries();
//分佣类型(1百分比/2固定金额)
var commissionType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionType)
.ObjectToInt(0);
//一级佣金
var commissionFirst = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionFirst)
.ObjectToDecimal(0);
//二级佣金
var commissionSecond = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionSecond)
.ObjectToDecimal(0);
//三级佣金
var commissionThird = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CommissionFirst)
.ObjectToDecimal(0);
//是否开启三级分销(1开启,2未开启)
var openDistribution = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OpenDistribution)
.ObjectToInt(0);
//是否开启代理模块(1开启,2未开启)
var isOpenAgent = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.IsOpenAgent)
.ObjectToInt(0);
//当分销模块和代理模块都关闭的情况下,才去计算邀请好友的操作。
if (openDistribution != 2 || isOpenAgent != 2) return jm;
var order = await _orderServices.QueryByClauseAsync(p =>
p.orderId == orderId && p.status == (int)GlobalEnumVars.OrderStatus.Complete);
if (order == null)
{
jm.msg = "订单查询失败";
return jm;
}
var user = await _dal.QueryByClauseAsync(p => p.id == order.userId, true);
// 获取付款单,我们只拿付款单的实际金额去计算,不用订单的金额。这样直接不用去计算优惠了,只看用户付了多少。从上面提佣金出来。
var billPayments = await _billPaymentsServices.QueryByClauseAsync(p =>
p.sourceId == orderId && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed);
if (billPayments.money <= 0) return jm;
{
//1级佣金
var commissionLevel1 = commissionType == (int)GlobalEnumVars.InviteCommissionType.CommissionTypeFixed
? commissionFirst
: Math.Round(commissionFirst * billPayments.money / 100, 2);
//2级佣金
var commissionLevel2 = commissionType == (int)GlobalEnumVars.InviteCommissionType.CommissionTypeFixed
? commissionSecond
: Math.Round(commissionSecond * billPayments.money / 100, 2);
//3级佣金
var commissionLevel3 = commissionType == (int)GlobalEnumVars.InviteCommissionType.CommissionTypeFixed
? commissionThird
: Math.Round(commissionThird * billPayments.money / 100, 2);
//下面存储就不做递归了,三层直接判断了
if (user.parentId <= 0) return jm;
var parentLevel1 = await _dal.QueryByClauseAsync(p => p.id == user.parentId, true);
if (parentLevel1 == null) return jm;
{
//钱挪到会员余额里面
await _userBalanceServices.Change(user.parentId,
(int)GlobalEnumVars.UserBalanceSourceTypes.Distribution, commissionLevel1, orderId);
if (parentLevel1.parentId <= 0) return jm;
var parentLevel2 = await _dal.QueryByClauseAsync(p => p.id == parentLevel1.parentId, true);
//钱挪到会员余额里面
await _userBalanceServices.Change(parentLevel1.parentId,
(int)GlobalEnumVars.UserBalanceSourceTypes.Distribution, commissionLevel2, orderId);
if (parentLevel2.parentId <= 0) return jm;
{
var parentLevel3 = await _dal.QueryByClauseAsync(p => p.id == parentLevel2.parentId, true);
if (parentLevel3 != null)
//钱挪到会员余额里面
await _userBalanceServices.Change(parentLevel2.parentId,
(int)GlobalEnumVars.UserBalanceSourceTypes.Distribution, commissionLevel3, orderId);
}
}
}
return jm;
}
#endregion
}