diff --git a/CoreCms.Net.Services/Pay/WeChatPayServices.cs b/CoreCms.Net.Services/Pay/WeChatPayServices.cs index 507e6f1f..2d388c36 100644 --- a/CoreCms.Net.Services/Pay/WeChatPayServices.cs +++ b/CoreCms.Net.Services/Pay/WeChatPayServices.cs @@ -29,6 +29,7 @@ using Newtonsoft.Json.Linq; using QRCoder; using SKIT.FlurlHttpClient.Wechat.Api; using SKIT.FlurlHttpClient.Wechat.Api.Models; +using SqlSugar; namespace CoreCms.Net.Services { @@ -80,7 +81,7 @@ namespace CoreCms.Net.Services var payment = await billPaymentsServices.QueryByClauseAsync(p => p.paymentId == entity.paymentId); var checkBeforeAddOrder = await checkBeforeAddOrderServices.QueryByClauseAsync(p => p.orderId == payment.sourceId); - if (checkBeforeAddOrder != null && checkBeforeAddOrder.requireOrder == (int)GlobalEnumVars.RequireOrderType.需要) + if (checkBeforeAddOrder is { requireOrder: (int)GlobalEnumVars.RequireOrderType.需要 }) { var order = await transactionComponentOrderServices.QueryByClauseAsync(p => p.outOrderId == payment.sourceId); @@ -158,26 +159,38 @@ namespace CoreCms.Net.Services var openId = string.Empty; if (tradeType == GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString() || tradeType == GlobalEnumVars.WeiChatPayTradeType.JSAPI_OFFICIAL.ToString()) { - var userAccount = await _userServices.QueryByIdAsync(_user.ID); - if (userAccount == null) - { - jm.msg = "用户账户获取失败"; - return jm; - } + //var userAccount = await _userServices.QueryByIdAsync(_user.ID); + //if (userAccount == null) + //{ + // jm.msg = "用户账户获取失败"; + // return jm; + //} - if (userAccount.userWx <= 0) - { - jm.msg = "账户关联微信用户信息获取失败"; - return jm; - } + //if (userAccount.userWx <= 0) + //{ + // jm.msg = "账户关联微信用户信息获取失败"; + // return jm; + //} - var user = await _userWeChatInfoServices.QueryByClauseAsync(p => p.id == userAccount.userWx); + //var user = await _userWeChatInfoServices.QueryByClauseAsync(p => p.id == userAccount.userWx); + //if (user == null) + //{ + // jm.msg = "微信用户信息获取失败"; + // return jm; + //} + + var type = tradeType == GlobalEnumVars.WeiChatPayTradeType.JSAPI.ToString() + ? (int)GlobalEnumVars.UserAccountTypes.微信小程序 + : (int)GlobalEnumVars.UserAccountTypes.微信公众号; + + var user = await _userWeChatInfoServices.QueryByClauseAsync(p => p.userId == _user.ID && p.type == type, p => p.createTime, OrderByType.Desc); if (user == null) { jm.msg = "微信用户信息获取失败"; return jm; } + openId = user.openid; } diff --git a/CoreCms.Net.Services/User/CoreCmsUserServices.cs b/CoreCms.Net.Services/User/CoreCmsUserServices.cs index 2b1e1f67..0322bc29 100644 --- a/CoreCms.Net.Services/User/CoreCmsUserServices.cs +++ b/CoreCms.Net.Services/User/CoreCmsUserServices.cs @@ -34,826 +34,884 @@ using Microsoft.Extensions.DependencyInjection; using SqlSugar; -namespace CoreCms.Net.Services +namespace CoreCms.Net.Services; + +/// +/// 用户表 接口实现 +/// +public class CoreCmsUserServices : BaseServices, ICoreCmsUserServices { - /// - /// 用户表 接口实现 - /// - 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; + + + 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) { - 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; + _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; + } - 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) + #region 更新余额 + + /// + /// 更新余额 + /// + /// + /// + /// + /// + public async Task UpdateBalance(int id, decimal money, string memo) + { + var jm = new AdminUiCallBack(); + + var model = await _dal.QueryByIdAsync(id); + if (model == null) { - this._dal = dal; - base.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; - } - - - #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; - + jm.msg = "不存在此信息"; return jm; } - #endregion - - #region 更新积分 - /// - /// 更新积分 - /// - /// - /// - public async Task UpdatePiont(FMUpdateUserPoint entity) + var newMoney = model.balance + money; + var up = await _dal.UpdateAsync(p => new CoreCmsUser() { balance = newMoney }, p => p.id == id); + if (up) { - var jm = new AdminUiCallBack(); + 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(); - var model = await _dal.QueryByIdAsync(entity.id); - if (model == null) - { - jm.msg = "不存在此信息"; - return jm; - } + jm.code = await _userBalanceServices.InsertAsync(balance) > 0 ? 0 : 1; + } - 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.msg = jm.code == 0 ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure; - jm.code = await _userPointLogServices.InsertAsync(point) > 0 ? 0 : 1; - } + return jm; + } - jm.msg = jm.code == 0 ? GlobalConstVars.EditSuccess : GlobalConstVars.EditFailure; + #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; } - #endregion - #region 获取用户的积分 - - /// - /// 获取用户的积分 - /// - /// 用户序列 - /// 订单金额 - /// 货品序列 - /// 购物车类型 - /// - public async Task GetUserPoint(int userId, decimal orderMoney, int[] ids, int cartType) + 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; - GetUserPointResult dto = new GetUserPointResult(); - //1是2否 - var allConfigs = await _settingServices.GetConfigDictionaries(); + return jm; + } - 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; + #endregion - 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); + #region 获取用户的积分 - //订单积分折现比例(多少积分可以折现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(); + /// + /// 获取用户的积分 + /// + /// 用户序列 + /// 订单金额 + /// 货品序列 + /// 购物车类型 + /// + public async Task GetUserPoint(int userId, decimal orderMoney, int[] ids, int cartType) + { + var dto = new GetUserPointResult(); + //1是2否 + var allConfigs = await _settingServices.GetConfigDictionaries(); - 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; - } - } - - } - } + var pointSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointSwitch) + .ObjectToInt(); //是否开启积分功能 + if (pointSwitch == 2) + { + dto.@switch = 2; return dto; } - #endregion - #region 修改用户密码,如果用户之前没有密码,那么就不校验原密码 - /// - /// 修改用户密码,如果用户之前没有密码,那么就不校验原密码 - /// - public async Task ChangePassword(int userId, string newPwd, string password = "") + var user = await _dal.QueryByClauseAsync(p => p.id == userId); + if (user != null) { - var jm = new WebApiCallBack(); + dto.point = user.point; - //修改密码验证原密码 - - var user = await _dal.QueryByIdAsync(userId); - if (user == null) + var pointExchangeModel = CommonHelper + .GetConfigDictionary(allConfigs, SystemSettingConstVars.PointExchangeModel) + .ObjectToInt(); //判断是全局模式还是单品模式 + if (pointExchangeModel == 1) { - jm.msg = GlobalErrorCodeVars.Code10000; - return jm; - } - - if (!string.IsNullOrEmpty(user.passWord)) - { - if (string.IsNullOrEmpty(password)) + if (orderMoney != 0) { - jm.msg = "请输入原密码!"; - return jm; - } + //计算可用积分//订单积分使用比例 + var ordersPointProportion = CommonHelper + .GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion) + .ObjectToDecimal(10); + var proportion = Math.Round(ordersPointProportion / 100, 4); + //最多可以抵扣的金额 + var maxPointDeductedMoney = Math.Round(orderMoney * proportion, 4); - if (user.passWord != CommonHelper.EnPassword(password, user.createTime)) - { - jm.msg = "原密码不正确!"; - return jm; + //订单积分折现比例(多少积分可以折现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; } } - - if (string.IsNullOrEmpty(newPwd) || newPwd.Length < 6 || newPwd.Length > 16) + else if (pointExchangeModel == 2) { - jm.msg = GlobalErrorCodeVars.Code11009; - return jm; - } + using var container = _serviceProvider.CreateScope(); - var md5Pwd = CommonHelper.EnPassword(newPwd, user.createTime); + var cartServices = container.ServiceProvider.GetService(); + var productsServices = container.ServiceProvider.GetService(); - 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; - } - - 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) + //获取购物车数据 + var cartProducts = await cartServices.QueryListByClauseAsync(p => + p.type == cartType && p.userId == userId && ids.Contains(p.id)); + if (cartProducts.Any()) { - 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) + //获取购物车货品序列 + var cartIds = cartProducts.Select(p => p.productId).ToList(); + //根据货品序列去找货品 + var products = await productsServices.QueryListByClauseAsync(p => cartIds.Contains(p.id)); + if (products.Any()) { - if (string.IsNullOrEmpty(entity.avatar)) + //可抵扣金额 + decimal money = 0; + //迭代货品,获取到最高可优惠金额,进行累加 + foreach (var item in products) { - entity.avatar = wxUserInfo.avatar; + var numObj = cartProducts.Find(p => p.productId == item.id); + if (numObj != null) money += numObj.nums * item.pointsDeduction; } - if (string.IsNullOrEmpty(entity.nickname)) - { - entity.nickname = wxUserInfo.nickName; - } - userInfo.sex = wxUserInfo?.gender ?? 3; - userInfo.userWx = wxUserInfo?.id ?? 0; + + //计算抵扣这么多金额需要多少积分。 + //订单积分折现比例(多少积分可以折现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; } } - //如果没有头像和昵称,那么就取系统头像和昵称吧 - if (!string.IsNullOrEmpty(entity.avatar)) - { - userInfo.avatarImage = entity.avatar; - } - else - { - var allConfigs = await _settingServices.GetConfigDictionaries(); - 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 && entity.invitecode > 0 && userInfo.parentId > 0) - { - var allConfigs = await _settingServices.GetConfigDictionaries(); - var inviterUserIntegral = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.InviterUserIntegral).ObjectToInt(); //是否开启积分功能 - if (inviterUserIntegral > 0) - { - await _userPointLogServices.SetPoint(userInfo.parentId, inviterUserIntegral, (int)GlobalEnumVars.UserPointSourceTypes.PointTypeInviterUser, "发展用户:" + userId + "赠送积分"); - } - } - userInfo = await _dal.QueryByIdAsync(userId); } - else + } + + 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)) { - //如果有这个账号的话,判断一下是不是传密码了,如果传密码了,就是注册,这里就有问题,因为已经注册过 - if (!string.IsNullOrEmpty(entity.password)) - { - jm.msg = GlobalErrorCodeVars.Code11019; - return jm; - } + 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; + } + + 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 updateAsync = await _userWeChatInfoServices.UpdateAsync(p => new CoreCmsUserWeChatInfo() { userId = userInfo.id }, p => p.openid == entity.sessionAuthId); - if (updateAsync) - { - //多个微信可能同时授权一个号码登录。 - //如果已经存在微信用户(A)数据绑定了手机号码。 - //使用新微信(B)登录,同时又授权此手机号码绑定。 - //小程序内微信支付时候,因为登录的微信(B)与拉取手机号码绑定后获取到数据是(A)。 - //会导致微信数据报错() - 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); + 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 (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; } } - if (userInfo.status == (int)GlobalEnumVars.UserStatus.正常) + //如果没有头像和昵称,那么就取系统头像和昵称吧 + if (!string.IsNullOrEmpty(entity.avatar)) { - jm.status = true; - jm.msg = "成功"; - jm.otherData = userInfo; - - if (platform == (int)GlobalEnumVars.CoreShopSystemCategory.Api) - { - var claims = new List { - new Claim(ClaimTypes.Name, userInfo.nickName), - new Claim(JwtRegisteredClaimNames.Jti, userInfo.id.ToString()), - new Claim(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); + userInfo.avatarImage = entity.avatar; } 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 allConfigs = await _settingServices.GetConfigDictionaries(); + var defaultImage = + CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ShopDefaultImage); + userInfo.avatarImage = defaultImage; } - var user = await _dal.QueryByClauseAsync(p => p.id == order.userId, true); + userInfo.nickName = !string.IsNullOrEmpty(entity.nickname) + ? entity.nickname + : UserHelper.FormatMobile(entity.mobile); - // 获取付款单,我们只拿付款单的实际金额去计算,不用订单的金额。这样直接不用去计算优惠了,只看用户付了多少。从上面提佣金出来。 - var billPayments = await _billPaymentsServices.QueryByClauseAsync(p => p.sourceId == orderId && p.status == (int)GlobalEnumVars.BillPaymentsStatus.Payed); - if (billPayments.money <= 0) return jm; + if (entity.invitecode > 0) { - //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; + var pid = UserHelper.GetUserIdByShareCode(entity.invitecode); + var pInfo = await _dal.QueryByClauseAsync(p => p.id == pid); + if (pInfo != null) { - //钱挪到会员余额里面 - 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); - } - } + 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 && entity.invitecode > 0 && userInfo.parentId > 0) + { + var allConfigs = await _settingServices.GetConfigDictionaries(); + var inviterUserIntegral = CommonHelper + .GetConfigDictionary(allConfigs, SystemSettingConstVars.InviterUserIntegral) + .ObjectToInt(); //是否开启积分功能 + if (inviterUserIntegral > 0) + await _userPointLogServices.SetPoint(userInfo.parentId, inviterUserIntegral, + (int)GlobalEnumVars.UserPointSourceTypes.PointTypeInviterUser, "发展用户:" + userId + "赠送积分"); + } + + userInfo = await _dal.QueryByIdAsync(userId); + } + 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; } - #endregion + 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 +} \ No newline at end of file diff --git a/CoreCms.Net.Web.Admin/Controllers/WeChat/CoreCmsUserWeChatInfoController.cs b/CoreCms.Net.Web.Admin/Controllers/WeChat/CoreCmsUserWeChatInfoController.cs index f07e09fe..43b63a85 100644 --- a/CoreCms.Net.Web.Admin/Controllers/WeChat/CoreCmsUserWeChatInfoController.cs +++ b/CoreCms.Net.Web.Admin/Controllers/WeChat/CoreCmsUserWeChatInfoController.cs @@ -30,6 +30,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using NPOI.HSSF.UserModel; using SqlSugar; +using static CoreCms.Net.Configuration.GlobalEnumVars; namespace CoreCms.Net.Web.Admin.Controllers { @@ -255,6 +256,13 @@ namespace CoreCms.Net.Web.Admin.Controllers { //返回数据 var jm = new AdminUiCallBack { code = 0 }; + + var userAccountTypes = EnumHelper.EnumToList(); + jm.data = new + { + userAccountTypes + }; + return jm; } #endregion diff --git a/CoreCms.Net.Web.Admin/wwwroot/views/user/wechatuserinfo/index.html b/CoreCms.Net.Web.Admin/wwwroot/views/user/wechatuserinfo/index.html index eec165f9..ba157dc7 100644 --- a/CoreCms.Net.Web.Admin/wwwroot/views/user/wechatuserinfo/index.html +++ b/CoreCms.Net.Web.Admin/wwwroot/views/user/wechatuserinfo/index.html @@ -117,7 +117,19 @@ [ { type: "checkbox", fixed: "left" }, { field: 'id', title: '微信序列', width: 70, sort: false }, - //{ field: 'type', title: '第三方登录类型', sort: false,width: 105 }, + //{ field: 'type', title: '第三方登录类型', sort: false, width: 105 }, + { + field: 'type', title: '登录类型', align: "center", + templet: function (data) { + var str = ''; + for (i = 0; i < d.data.userAccountTypes.length; i++) { + if (data.type === d.data.userAccountTypes[i].value) { str = d.data.userAccountTypes[i].title } + } + //return str; + return ""; + + }, width: 90 + }, { field: 'userId', title: '用户序列', sort: false, width: 80 }, { field: 'openid', title: 'openId', sort: false }, //{ field: 'sessionKey', title: '缓存key', sort: false,width: 105 },