添加项目文件。

This commit is contained in:
JianWeie
2021-12-20 21:27:32 +08:00
parent 747486f5cb
commit 82d825b7a5
3514 changed files with 887941 additions and 0 deletions

View File

@@ -0,0 +1,162 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Helper;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 用户余额表 接口实现
/// </summary>
public class CoreCmsUserBalanceServices : BaseServices<CoreCmsUserBalance>, ICoreCmsUserBalanceServices
{
private readonly ICoreCmsUserBalanceRepository _dal;
private readonly IUnitOfWork _unitOfWork;
private readonly IServiceProvider _serviceProvider;
public CoreCmsUserBalanceServices(IUnitOfWork unitOfWork, ICoreCmsUserBalanceRepository dal,
IServiceProvider serviceProvider
)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_serviceProvider = serviceProvider;
}
/// <summary>
/// 余额变动记录
/// </summary>
/// <param name="userId">当前用户id,当是店铺的时候取店铺创始人的userId</param>
/// <param name="type">类型</param>
/// <param name="money">金额,永远是正的</param>
/// <param name="sourceId">资源id</param>
/// <param name="cateMoney">服务费金额 (提现)</param>
/// <returns></returns>
public async Task<WebApiCallBack> Change(int userId, int type, decimal money, string sourceId = "", decimal cateMoney = 0)
{
using var container = _serviceProvider.CreateScope();
var userServices = container.ServiceProvider.GetService<ICoreCmsUserServices>();
var jm = new WebApiCallBack();
if (money != 0)
{
//取用户实际余额
var userInfo = await userServices.QueryByIdAsync(userId);
if (userInfo == null)
{
jm.data = jm.code = 11004;
jm.msg = GlobalErrorCodeVars.Code11004;
return jm;
}
//取描述,并简单校验
var res = UserHelper.GetMemo(type, money, cateMoney);
if (string.IsNullOrEmpty(res))
{
return jm;
}
var memo = res;
if (type != (int)GlobalEnumVars.UserBalanceSourceTypes.Admin)
{
//后台充值或调不改绝对值
}
//如果是减余额的操作,还是加余额操作
if (type == (int)GlobalEnumVars.UserBalanceSourceTypes.Pay || type == (int)GlobalEnumVars.UserBalanceSourceTypes.Tocash)
{
money = -money - cateMoney;
}
if (type != (int)GlobalEnumVars.UserBalanceSourceTypes.Service)
{
//后台充值或调不改绝对值
}
var balance = userInfo.balance + money;
if (balance < 0)
{
jm.data = jm.code = 11007;
jm.msg = GlobalErrorCodeVars.Code11007;
return jm;
}
var balanceModel = new CoreCmsUserBalance();
balanceModel.userId = userId;
balanceModel.type = type;
balanceModel.money = money;
balanceModel.balance = balance;
balanceModel.sourceId = sourceId;
balanceModel.memo = memo;
balanceModel.createTime = DateTime.Now;
//增加记录
var balanceModelId = await _dal.InsertAsync(balanceModel);
balanceModel.id = balanceModelId;
//更新用户数据
await userServices.UpdateAsync(p => new CoreCmsUser() { balance = balance }, p => p.id == userId);
jm.data = balanceModel;
}
jm.status = true;
return jm;
}
/// <summary>
/// 获取用户的邀请佣金
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<decimal> GetInviteCommission(int userId)
{
var type = (int)GlobalEnumVars.UserBalanceSourceTypes.Distribution;
var money = await _dal.GetSumAsync(p => p.userId == userId && p.type == type, p => p.money);
return money;
}
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
public new async Task<IPageList<CoreCmsUserBalance>> QueryPageAsync(Expression<Func<CoreCmsUserBalance, bool>> predicate,
Expression<Func<CoreCmsUserBalance, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
}
}

View File

@@ -0,0 +1,367 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Linq;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 银行卡信息 接口实现
/// </summary>
public class CoreCmsUserBankCardServices : BaseServices<CoreCmsUserBankCard>, ICoreCmsUserBankCardServices
{
private readonly ICoreCmsUserBankCardRepository _dal;
private readonly ICoreCmsAreaServices _areaServices;
private readonly ICoreCmsSettingServices _settingServices;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsUserBankCardServices(IUnitOfWork unitOfWork, ICoreCmsUserBankCardRepository dal, ICoreCmsAreaServices areaServices, ICoreCmsSettingServices settingServices)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_areaServices = areaServices;
_settingServices = settingServices;
}
/// <summary>
/// 我的银行卡列表
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<WebApiCallBack> AddBankCards(CoreCmsUserBankCard entity)
{
var jm = new WebApiCallBack();
jm.otherData = entity;
if (string.IsNullOrEmpty(entity.cardNumber))
{
jm.msg = "请输入银行卡号"; return jm;
}
if (entity.cardNumber.Length < 16 || entity.cardNumber.Length > 19)
{
jm.msg = "请输入16-19位银行卡号"; return jm;
}
if (string.IsNullOrEmpty(entity.accountName))
{
jm.msg = "请输入开户账户名"; return jm;
}
if (string.IsNullOrEmpty(entity.bankName))
{
jm.msg = "请输入银行名称"; return jm;
}
if (string.IsNullOrEmpty(entity.accountBank))
{
jm.msg = "请输入开户行名称"; return jm;
}
var card = await _dal.QueryByClauseAsync(p => p.userId == entity.userId && p.cardNumber == entity.cardNumber);
if (card != null)
{
jm.msg = "该卡片已经添加"; return jm;
}
var model = new CoreCmsUserBankCard();
model.userId = entity.userId;
model.bankName = entity.bankName;
model.bankCode = entity.bankCode;
model.bankAreaId = entity.bankAreaId;
model.accountBank = entity.accountBank;
model.accountName = entity.accountName;
model.cardNumber = entity.cardNumber;
model.cardType = entity.cardType;
model.isdefault = entity.isdefault;
model.createTime = DateTime.Now;
if (model.isdefault == true)
{
// 如果要添加默认 先判断是否有默认卡
var def = await _dal.ExistsAsync(p => p.userId == entity.userId && p.isdefault == true);
if (def)
{
await _dal.UpdateAsync(p => new CoreCmsUserBankCard() { isdefault = false }, p => p.isdefault == true && p.userId == entity.userId);
await _dal.InsertAsync(model);
jm.status = true;
jm.msg = "保存成功";
}
else
{
await _dal.InsertAsync(model);
jm.status = true;
jm.msg = "保存成功";
}
}
else
{
await _dal.InsertAsync(model);
jm.status = true;
jm.msg = "保存成功";
}
return jm;
}
/// <summary>
/// 我的银行卡列表
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<WebApiCallBack> GetMyBankcardsList(int userId)
{
var jm = new WebApiCallBack();
jm.status = true;
var res = await _dal.QueryListByClauseAsync(p => p.userId == userId);
if (res != null && res.Any())
{
foreach (var item in res)
{
var areas =await _areaServices.GetAreaFullName(item.bankAreaId); ;
item.bankAreaName = areas.status ? areas.data.ToString() : "";
item.cardNumber = UserHelper.BankCardNoFormat(item.cardNumber, 4, 4, '*');
item.cardTypeName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.BankType>(item.cardType);
item.bankLogo = BankConst.BankLogoUrl + item.bankCode;
}
}
jm.data = res;
return jm;
}
/// <summary>
/// 删除银行卡
/// </summary>
/// <param name="id"></param>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<WebApiCallBack> Removebankcard(int id, int userId)
{
var jm = new WebApiCallBack();
// 先判断该银行卡是否存在
var data = await _dal.QueryByClauseAsync(p => p.id == id && p.userId == userId);
if (data != null)
{
// 如果要删除的是默认的卡
if (data.isdefault)
{
// 查询是否有其他银行卡
var otherData = await _dal.QueryByClauseAsync(p => p.id != id && p.userId == userId);
if (otherData != null)
{
otherData.isdefault = true;
await _dal.UpdateAsync(otherData);
await _dal.DeleteAsync(data);
jm.status = true;
jm.msg = "删除成功";
}
else
{
jm.status = await _dal.DeleteAsync(data);
jm.msg = jm.status ? "删除成功" : "删除失败";
}
}
else
{
jm.status = await _dal.DeleteByIdAsync(id);
jm.msg = jm.status ? "删除成功" : "删除失败";
}
}
else
{
jm.msg = "该卡片不存在";
}
return jm;
}
/// <summary>
/// 获取用户默认银行卡信息
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<WebApiCallBack> GetDefaultBankCard(int userId)
{
var jm = new WebApiCallBack();
var defCard = await _dal.QueryByClauseAsync(p => p.userId == userId && p.isdefault == true);
if (defCard != null)
{
var areas = await _areaServices.GetAreaFullName(defCard.bankAreaId); ;
defCard.bankAreaName = areas.status ? areas.data.ToString() : "";
defCard.cardNumber = UserHelper.BankCardNoFormat(defCard.cardNumber, 4, 4, '*');
defCard.cardTypeName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.BankType>(defCard.cardType);
defCard.bankLogo = BankConst.BankLogoUrl + defCard.bankCode;
jm.data = defCard;
}
else
{
var card = await _dal.QueryByClauseAsync(p => p.userId == userId, p => p.createTime, OrderByType.Asc);
if (card != null)
{
var areas = await _areaServices.GetAreaFullName(card.bankAreaId); ;
card.bankAreaName = areas.status ? areas.data.ToString() : "";
card.cardNumber = UserHelper.BankCardNoFormat(card.cardNumber, 4, 4, '*');
card.cardTypeName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.BankType>(card.cardType);
card.bankLogo = BankConst.BankLogoUrl + card.bankCode;
jm.data = card;
}
}
jm.status = jm.data != null;
jm.msg = jm.data != null ? "获取成功" : "无数据获取";
return jm;
}
/// <summary>
/// 获取银行卡组织信息
/// </summary>
/// <param name="cardCode"></param>
/// <returns></returns>
public WebApiCallBack BankCardsOrganization(string cardCode)
{
var jm = new WebApiCallBack();
var url = "https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=" + cardCode + "&cardBinCheck=true";
var res = HttpHelper.PostSend(url, "");
var resObj = JObject.Parse(res);
if (!resObj.ContainsKey("validated"))
{
jm.msg = GlobalErrorCodeVars.Code11021;
jm.code = 11021;
return jm;
}
if (!resObj["validated"].ObjectToBool())
{
jm.msg = GlobalErrorCodeVars.Code11021;
jm.code = 11021;
return jm;
}
else
{
var name = EnumHelper.GetEnumDescriptionByKey<GlobalEnumVars.BankList>(resObj["bank"].ObjectToString());
var type = (int)GlobalEnumVars.BankType.BankTypeDc;
var typeName = string.Empty;
switch (resObj["cardType"].ObjectToString())
{
case "DC":
type = (int)GlobalEnumVars.BankType.BankTypeDc;
typeName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.BankType>((int)GlobalEnumVars.BankType.BankTypeDc);
break;
case "CC":
type = (int)GlobalEnumVars.BankType.BankTypeCc;
typeName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.BankType>((int)GlobalEnumVars.BankType.BankTypeCc);
break;
}
var bankCode = resObj["bank"].ObjectToString();
jm.status = true;
jm.data = new
{
name,
type,
typeName,
bankCode
};
}
return jm;
}
/// <summary>
/// 设置默认的银行卡
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<WebApiCallBack> SetDefault(int userId, int id)
{
var jm = new WebApiCallBack();
var card = await _dal.QueryByClauseAsync(p => p.userId == userId && p.id == id);
if (card != null)
{
// 是否有默认
var defCard = await _dal.QueryByClauseAsync(p => p.userId == userId && p.isdefault == true);
if (defCard != null)
{
await _dal.UpdateAsync(it => new CoreCmsUserBankCard() { isdefault = false },
p => p.id == defCard.id);
await _dal.UpdateAsync(it => new CoreCmsUserBankCard() { isdefault = true },
p => p.id == card.id);
jm.status = true;
jm.msg = "保存成功";
}
}
else
{
jm.msg = "该银行卡不存在";
}
jm.status = true;
return jm;
}
/// <summary>
/// 获取银行卡信息
/// </summary>
/// <param name="userId"></param>
/// <param name="id"></param>
/// <returns></returns>
public async Task<WebApiCallBack> GetBankcardInfo(int userId, int id)
{
var jm = new WebApiCallBack();
var card = await _dal.QueryByClauseAsync(p => p.userId == userId && p.id == id);
if (card != null)
{
card.bankLogo = BankConst.BankLogoUrl + card.bankCode;
card.cardNumber = UserHelper.BankCardNoFormat(card.cardNumber, 4, 4, '*');
card.cardTypeName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.BankType>(card.cardType);
jm.status = true;
jm.msg = "获取成功";
jm.data = card;
}
else
{
jm.status = false;
jm.msg = "该银行卡不存在";
}
return jm;
}
}
}

View File

@@ -0,0 +1,40 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Threading.Tasks;
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.ViewModels.UI;
namespace CoreCms.Net.Services
{
/// <summary>
/// 用户等级表 接口实现
/// </summary>
public class CoreCmsUserGradeServices : BaseServices<CoreCmsUserGrade>, ICoreCmsUserGradeServices
{
private readonly ICoreCmsUserGradeRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsUserGradeServices(IUnitOfWork unitOfWork, ICoreCmsUserGradeRepository dal)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
}
}

View File

@@ -0,0 +1,39 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Threading.Tasks;
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.ViewModels.UI;
namespace CoreCms.Net.Services
{
/// <summary>
/// 用户日志 接口实现
/// </summary>
public class CoreCmsUserLogServices : BaseServices<CoreCmsUserLog>, ICoreCmsUserLogServices
{
private readonly ICoreCmsUserLogRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsUserLogServices(IUnitOfWork unitOfWork, ICoreCmsUserLogRepository dal)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
}
}

View File

@@ -0,0 +1,253 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
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.Entities.Expression;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 用户积分记录表 接口实现
/// </summary>
public class CoreCmsUserPointLogServices : BaseServices<CoreCmsUserPointLog>, ICoreCmsUserPointLogServices
{
private readonly ICoreCmsUserPointLogRepository _dal;
private readonly IUnitOfWork _unitOfWork;
private readonly IServiceProvider _serviceProvider;
public CoreCmsUserPointLogServices(IUnitOfWork unitOfWork, ICoreCmsUserPointLogRepository dal,
IServiceProvider serviceProvider
)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_serviceProvider = serviceProvider;
}
/// <summary>
/// 积分消费日志设置
/// </summary>
/// <param name="userId">用户</param>
/// <param name="num"></param>
/// <param name="type"></param>
/// <param name="remarks"></param>
/// <returns></returns>
public async Task<WebApiCallBack> SetPoint(int userId, int num, int type, string remarks)
{
using (var container = _serviceProvider.CreateScope())
{
var userServices = container.ServiceProvider.GetService<ICoreCmsUserServices>();
var res = new WebApiCallBack() { methodDescription = "积分消费日志设置" };
//获取积分账号信息
var userModel = await userServices.QueryByIdAsync(userId);
if (userModel == null)
{
res.msg = "更新消费积分日志获取用户信息失败";
return res;
}
var newPoint = num + userModel.point;
//积分余额判断
if (newPoint < 0)
{
res.msg = "积分余额不足";
return res;
}
//插入记录
var log = new CoreCmsUserPointLog();
log.userId = userId;
log.type = type;
log.num = num;
log.balance = newPoint;
log.remarks = remarks;
log.createTime = DateTime.Now;
await _dal.InsertAsync(log);
await userServices.UpdateAsync(p => new CoreCmsUser() { point = p.point + num }, p => p.id == userModel.id);
res.status = true;
res.msg = "积分更改成功";
return res;
}
}
/// <summary>
/// 订单完成送积分操作
/// </summary>
/// <param name="userId"></param>
/// <param name="money"></param>
/// <param name="orderId"></param>
public async Task OrderComplete(int userId, decimal money, string orderId)
{
using (var container = _serviceProvider.CreateScope())
{
var _settingServices = container.ServiceProvider.GetService<ICoreCmsSettingServices>();
var allConfigs = await _settingServices.GetConfigDictionaries();
var ordersRewardProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersRewardProportion).ObjectToInt();
if (ordersRewardProportion > 0)
{
var point = Convert.ToInt32(money / ordersRewardProportion);
await SetPoint(userId, point, (int)GlobalEnumVars.UserPointSourceTypes.PointTypeRebate,
"订单:" + orderId + " 积分奖励");
}
}
}
/// <summary>
/// 判断今天是否签到
/// </summary>
/// <param name="userId"></param>
public async Task<WebApiCallBack> IsSign(int userId)
{
var jm = new WebApiCallBack();
jm.msg = "今天还没有签到";
var where = PredicateBuilder.True<CoreCmsUserPointLog>();
where = where.And(p => p.userId == userId && p.type == (int)GlobalEnumVars.UserPointSourceTypes.PointTypeSign);
var dt = DateTime.Now;
var startTime = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0);
var endTime = new DateTime(dt.Year, dt.Month, dt.Day, 23, 59, 59);
where = where.And(p => p.createTime > startTime && p.createTime < endTime);
var bl = await _dal.ExistsAsync(where);
jm.status = bl;
jm.msg = bl ? "今天已经签到了" : "今天还没有签到";
return jm;
}
/// <summary>
/// 用户签到
/// </summary>
/// <param name="userId"></param>
public async Task<WebApiCallBack> Sign(int userId)
{
using (var container = _serviceProvider.CreateScope())
{
var _settingServices = container.ServiceProvider.GetService<ICoreCmsSettingServices>();
var jm = new WebApiCallBack();
var res = await IsSign(userId);
if (res.status)
{
jm.msg = "今天已经签到,无需重复签到";
}
//获取店铺签到积分设置
var allConfigs = await _settingServices.GetConfigDictionaries();
var signPointType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SignPointType).ObjectToInt();
//判断是固定积分计算还是随机积分计算
var point = 0;
if (signPointType == (int)GlobalEnumVars.UserPointSignTypes.RandomPoint)
{
//随机计算
//获取最小随机值
var signRandomMin = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SignRandomMin).ObjectToInt(1);
//获取最大随机值
var signRandomMax = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SignRandomMax).ObjectToInt(10);
Random ran = new Random();
point = ran.Next(signRandomMin, signRandomMax);
}
else
{
//固定计算
//首次签到积分
var firstSignPoint = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.FirstSignPoint).ObjectToInt(1);
//连续签到追加
var continuitySignAdditional = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.ContinuitySignAdditional).ObjectToInt(1);
//签到最多积分
var signMostPoint = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.SignMostPoint).ObjectToInt(1);
//最大连续签到天数
var maxContinuityDay = 0;
//获取连续签到天数
if (continuitySignAdditional > 0)
{
maxContinuityDay = (signMostPoint - firstSignPoint) / continuitySignAdditional;
}
else
{
//连续追加0的话说明每天签到积分都一样多那么最大连续签到天数就是1天
maxContinuityDay = 1;
}
var day = DateTime.Now.AddDays(-maxContinuityDay);
var logs = await _dal.QueryListByClauseAsync(p =>
p.userId == userId && p.type == (int)(int)GlobalEnumVars.UserPointSourceTypes.PointTypeSign &&
p.createTime > day);
var newRes = new List<string>();
if (logs != null && logs.Any())
{
foreach (var item in logs)
{
var dtStr = item.createTime.ToString("yyyy-MM-dd");
if (!newRes.Contains(dtStr))
{
newRes.Add(dtStr);
}
}
}
var intDay = 0; //连续签到天数
for (int i = 1; i <= maxContinuityDay; i++)
{
var now = DateTime.Now.AddDays(-i).ToString("yyyy-MM-dd"); ;
if (newRes.Contains(now))
{
intDay++;
}
else
{
break;
}
}
//积分
point = firstSignPoint + continuitySignAdditional * intDay;
point = point > signMostPoint ? signMostPoint : point;
}
jm.data = point;
//插入数据库
var result = await SetPoint(userId, point, (int)GlobalEnumVars.UserPointSourceTypes.PointTypeSign, "积分签到,获得" + point + "积分");
jm.msg = result.msg;
jm.status = result.status;
return jm;
}
}
}
}

View File

@@ -0,0 +1,678 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
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.UI;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Http;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 用户表 接口实现
/// </summary>
public class CoreCmsUserServices : BaseServices<CoreCmsUser>, 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 IUnitOfWork _unitOfWork;
private readonly PermissionRequirement _permissionRequirement;
private readonly IHttpContextAccessor _httpContextAccessor;
public CoreCmsUserServices(IUnitOfWork unitOfWork
, ICoreCmsUserRepository dal
, ICoreCmsUserBalanceServices userBalanceServices
, ICoreCmsSettingServices settingServices
, ICoreCmsUserPointLogServices userPointLogServices, ICoreCmsSmsServices smsServices, ICoreCmsUserWeChatInfoServices userWeChatInfoServices, ICoreCmsUserGradeServices userGradeServices, PermissionRequirement permissionRequirement, IHttpContextAccessor httpContextAccessor, ICoreCmsUserLogServices userLogServices)
{
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;
}
#region
/// <summary>
/// 更新余额
/// </summary>
/// <param name="id"></param>
/// <param name="money"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> UpdateBalance(int id, decimal money)
{
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 = 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
/// <summary>
/// 更新积分
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public async Task<AdminUiCallBack> 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
/// <summary>
/// 获取用户的积分
/// </summary>
/// <param name="userId">用户序列</param>
/// <param name="orderMoney">订单金额</param>
/// <returns></returns>
public async Task<GetUserPointResult> GetUserPoint(int userId, decimal orderMoney)
{
GetUserPointResult 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;
if (orderMoney != 0)
{
//计算可用积分
var ordersPointProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersPointProportion).ObjectToInt(10);//订单积分使用比例
//最多可以抵扣的金额
var maxPointDeductedMoney = Math.Round((orderMoney * ordersPointProportion) / 100, 2);
//订单积分折现比例(多少积分可以折现1块钱)
var pointDiscountedProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointDiscountedProportion).ObjectToInt(100);
//计算需要多少积分
var needsPoint = maxPointDeductedMoney * pointDiscountedProportion;
//确定是否有那么多积分去抵扣比例计算出的能抵扣的钱
dto.availablePoint = Convert.ToInt32(needsPoint > user.point ? user.point : needsPoint);
dto.pointExchangeMoney = dto.availablePoint / pointDiscountedProportion;
}
}
return dto;
}
#endregion
#region
/// <summary>
/// 修改用户密码,如果用户之前没有密码,那么就不校验原密码
/// </summary>
public async Task<WebApiCallBack> 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
/// <summary>
/// 绑定上级
/// </summary>
/// <param name="superiorId"></param>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<WebApiCallBack> 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);
jm.status = bl;
jm.msg = bl ? "填写邀请码成功!" : "填写邀请码失败!";
return jm;
}
#endregion
#region
/// <summary>
/// 获取我的上级邀请人
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<WebApiCallBack> 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;
}
/// <summary>
/// 获取下级推广用户数量
/// </summary>
/// <param name="parentId">父类序列</param>
/// <param name="type">1获取1级其他为2级</param>
/// <param name="thisMonth">当月</param>
/// <returns></returns>
public async Task<int> QueryChildCountAsync(int parentId, int type = 1, bool thisMonth = false)
{
return await _dal.QueryChildCountAsync(parentId, type, thisMonth);
}
/// <summary>
/// 判断userId是否是pid的父节点或者祖父节点,如果是就返回true如果不是就返回false
/// </summary>
/// <param name="userId"></param>
/// <param name="pid"></param>
/// <returns></returns>
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
/// <summary>
/// 忘记密码,找回密码
/// </summary>
/// <param name="userId"></param>
/// <param name="newPwd"></param>
/// <param name="cTime"></param>
/// <returns></returns>
public async Task<WebApiCallBack> 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
/// <summary>
/// 修改密码
/// </summary>
/// <param name="userId">用户序列</param>
/// <param name="newPwd">新密码</param>
/// <param name="createTime">创建时间</param>
/// <returns></returns>
private async Task<WebApiCallBack> 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
/// <summary>
/// 手机短信验证码登陆,同时兼有手机短信注册的功能,还有第三方账户绑定的功能
/// </summary>
/// <param name="entity">实体数据</param>
/// <param name="loginType">登录方式(1普通,2短信,3微信小程序拉取手机号)</param>
/// <param name="platform"></param>
/// <returns></returns>
public async Task<WebApiCallBack> SmsLogin(FMWxAccountCreate entity, int loginType = (int)GlobalEnumVars.LoginType.WeChatPhoneNumber, int platform = 1)
{
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;
}
}
//如果没有头像和昵称,那么就取系统头像和昵称吧
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;
}
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
//会导致微信数据报错()
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.)
{
var claims = new List<Claim> {
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.status = true;
jm.msg = "注册成功";
jm.data = JwtToken.BuildJwtToken(claims.ToArray(), _permissionRequirement);
//录入登录日志
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
/// <summary>
/// 根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <returns></returns>
public async Task<IPageList<CoreCmsUser>> QueryPageAsync(Expression<Func<CoreCmsUser, bool>> predicate,
Expression<Func<CoreCmsUser, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize);
}
/// <summary>
/// 按天统计新会员
/// </summary>
/// <returns></returns>
public async Task<List<StatisticsOut>> Statistics(int day)
{
return await _dal.Statistics(day);
}
/// <summary>
/// 按天统计当天下单活跃会员
/// </summary>
/// <returns></returns>
public async Task<List<StatisticsOut>> StatisticsOrder(int day)
{
return await _dal.StatisticsOrder(day);
}
}
}

View File

@@ -0,0 +1,59 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Threading.Tasks;
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.ViewModels.UI;
namespace CoreCms.Net.Services
{
/// <summary>
/// 用户地址表 接口实现
/// </summary>
public class CoreCmsUserShipServices : BaseServices<CoreCmsUserShip>, ICoreCmsUserShipServices
{
private readonly ICoreCmsUserShipRepository _dal;
private readonly IUnitOfWork _unitOfWork;
public CoreCmsUserShipServices(IUnitOfWork unitOfWork, ICoreCmsUserShipRepository dal)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
/// <summary>
/// 重写异步插入方法
/// </summary>
/// <param name="entity">实体数据</param>
/// <returns></returns>
public new async Task<WebApiCallBack> InsertAsync(CoreCmsUserShip entity)
{
return await _dal.InsertAsync(entity);
}
/// <summary>
/// 重写异步更新方法方法
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public new async Task<AdminUiCallBack> UpdateAsync(CoreCmsUserShip entity)
{
return await _dal.UpdateAsync(entity);
}
}
}

View File

@@ -0,0 +1,288 @@
/***********************************************************************
* Project: CoreCms
* ProjectName: 核心内容管理系统
* Web: https://www.corecms.net
* Author: 大灰灰
* Email: jianweie@163.com
* CreateTime: 2021/1/31 21:45:10
* Description: 暂无
***********************************************************************/
using System;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.Entities.Expression;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using SqlSugar;
namespace CoreCms.Net.Services
{
/// <summary>
/// 用户提现记录表 接口实现
/// </summary>
public class CoreCmsUserTocashServices : BaseServices<CoreCmsUserTocash>, ICoreCmsUserTocashServices
{
private readonly ICoreCmsUserTocashRepository _dal;
private readonly IUnitOfWork _unitOfWork;
private readonly IServiceProvider _serviceProvider;
private readonly ICoreCmsSettingServices _settingServices;
private readonly ICoreCmsUserServices _userServices;
private readonly ICoreCmsUserBalanceServices _userBalanceServices;
public CoreCmsUserTocashServices(IUnitOfWork unitOfWork, ICoreCmsUserTocashRepository dal,
IServiceProvider serviceProvider, ICoreCmsSettingServices settingServices, ICoreCmsUserServices userServices, ICoreCmsUserBalanceServices userBalanceServices)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_serviceProvider = serviceProvider;
_settingServices = settingServices;
_userServices = userServices;
_userBalanceServices = userBalanceServices;
}
/// <summary>
/// 提现申请
/// </summary>
/// <returns></returns>
public async Task<WebApiCallBack> Tocash(int userId, decimal money, int bankCardsId)
{
var jm = new WebApiCallBack();
using var container = _serviceProvider.CreateScope();
var settingServices = container.ServiceProvider.GetService<ICoreCmsSettingServices>();
var userServices = container.ServiceProvider.GetService<ICoreCmsUserServices>();
var userBankCardServices = container.ServiceProvider.GetService<ICoreCmsUserBankCardServices>();
var balanceServices = container.ServiceProvider.GetService<ICoreCmsUserBalanceServices>();
var allConfigs = await settingServices.GetConfigDictionaries();
//最小提现金额
var tocashMoneyLow = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.TocashMoneyLow).ObjectToDecimal((decimal)0.01);
//每日提现上线
var tocashMoneyLimit = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.TocashMoneyLimit).ObjectToDecimal(0);
//提现手续费
var tocashMoneyRate = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.TocashMoneyRate).ObjectToDecimal(0);
//最低提现金额
if (money < tocashMoneyLow)
{
jm.msg = "提现最低不能少于" + tocashMoneyLow + "元";
return jm;
}
//每日提现上限默认0不限制
if (tocashMoneyLimit > 0)
{
var dt = DateTime.Now;
var starTime = new DateTime(dt.Year, dt.Month, dt.Day, 0, 0, 0);
var endTime = new DateTime(dt.Year, dt.Month, dt.Day, 23, 59, 59);
//判断历史提现金额
var todayMoney = await _dal.GetSumAsync(p => p.createTime >= starTime && p.createTime <= endTime && p.userId == userId, p => p.money);
todayMoney = todayMoney + money; //历史今天提现加上本次提现;
if (todayMoney > tocashMoneyLimit)
{
jm.msg = "每日提现不能超过" + tocashMoneyLimit + "元";
return jm;
}
}
var userInfo = await userServices.QueryByIdAsync(userId);
if (userInfo == null)
{
jm.msg = GlobalErrorCodeVars.Code11004;
return jm;
}
if (money > userInfo.balance)
{
jm.msg = GlobalErrorCodeVars.Code11015;
return jm;
}
// 计算提现服务费(金额)
var cateMoney = money * (tocashMoneyRate / 100);
if (cateMoney + money > userInfo.balance)
{
jm.msg = GlobalErrorCodeVars.Code11015;
return jm;
}
//获取银行卡信息
var bankcardsInfo = await userBankCardServices.QueryByClauseAsync(p => p.userId == userId && p.id == bankCardsId);
if (bankcardsInfo == null)
{
jm.msg = GlobalErrorCodeVars.Code11016;
return jm;
}
var cashModel = new CoreCmsUserTocash();
cashModel.userId = userId;
cashModel.money = money;
cashModel.bankName = bankcardsInfo.bankName;
cashModel.bankCode = bankcardsInfo.bankCode;
cashModel.bankAreaId = bankcardsInfo.bankAreaId;
cashModel.accountBank = bankcardsInfo.accountBank;
cashModel.accountName = bankcardsInfo.accountName;
cashModel.cardNumber = bankcardsInfo.cardNumber;
cashModel.status = (int)GlobalEnumVars.UserTocashTypes.;
cashModel.withdrawals = cateMoney;
cashModel.createTime = DateTime.Now;
var res = await _dal.InsertAsync(cashModel);
if (res > 0)
{
var change = await balanceServices.Change(userId, (int)GlobalEnumVars.UserBalanceSourceTypes.Tocash, money, res.ToString(), cateMoney);
jm.status = change.status;
jm.msg = jm.status ? "提现申请成功" : "提现申请失败";
jm.data = change.data;
jm.otherData = change.otherData;
}
else
{
jm.msg = "提现申请失败";
}
return jm;
}
/// <summary>
/// 获取用户提现列表记录
/// </summary>
/// <param name="userId"></param>
/// <param name="page"></param>
/// <param name="limit"></param>
/// <param name="status"></param>
/// <returns></returns>
public async Task<WebApiCallBack> UserToCashList(int userId = 0, int page = 1, int limit = 10, int status = 0)
{
var jm = new WebApiCallBack();
var where = PredicateBuilder.True<CoreCmsUserTocash>();
if (status > 0)
{
where = where.And(p => p.status == status);
}
if (userId > 0)
{
where = where.And(p => p.userId == userId);
}
var list = await _dal.QueryPageAsync(where, p => p.createTime, OrderByType.Desc, page, limit);
if (list.Any())
{
foreach (var item in list)
{
item.statusName = EnumHelper.GetEnumDescriptionByValue<GlobalEnumVars.UserTocashTypes>(item.status);
item.cardNumber = UserHelper.BankCardNoFormat(item.cardNumber);
}
}
jm.status = true;
jm.data = list;
jm.otherData = new
{
list.TotalPages
};
return jm;
}
/// <summary>
/// 提现审核
/// </summary>
/// <param name="id"></param>
/// <param name="status"></param>
/// <returns></returns>
public async Task<WebApiCallBack> Examine(int id = 0, int status = 0)
{
var jm = new WebApiCallBack();
var info = await _dal.QueryByClauseAsync(p =>
p.id == id && p.status == (int)GlobalEnumVars.UserTocashTypes.);
if (info == null)
{
jm.msg = "没有此记录或不是待审核状态";
return jm;
}
if (status > 0)
{
var bl = await _dal.UpdateAsync(p => new CoreCmsUserTocash() { status = status, updateTime = DateTime.Now }, p =>
p.id == id && p.status == (int)GlobalEnumVars.UserTocashTypes.);
jm.status = bl;
jm.data = status;
if (bl)
{
//失败给用户退钱到余额
if (status == (int)GlobalEnumVars.UserTocashTypes.)
{
var toCashInfo = await _dal.QueryByIdAsync(id);
// 提现金额 加 服务费返还
var newMoney = toCashInfo.money + toCashInfo.withdrawals;
var up = await _userServices.UpdateAsync(p => new CoreCmsUser() { balance = p.balance + newMoney }, p => p.id == toCashInfo.userId);
if (up)
{
//添加记录
var user = await _userServices.QueryByIdAsync(toCashInfo.userId);
var balance = new CoreCmsUserBalance();
balance.type = (int)GlobalEnumVars.UserBalanceSourceTypes.Tocash;
balance.userId = toCashInfo.userId;
balance.balance = user.balance;
balance.createTime = DateTime.Now;
balance.memo = UserHelper.GetMemo(balance.type, toCashInfo.money);
balance.money = newMoney;
balance.sourceId = id.ToString();
await _userBalanceServices.InsertAsync(balance);
}
}
}
}
else
{
jm.msg = GlobalErrorCodeVars.Code10000;
jm.status = false;
}
return jm;
}
#region
/// <summary>
/// 重写根据条件查询分页数据
/// </summary>
/// <param name="predicate">判断集合</param>
/// <param name="orderByType">排序方式</param>
/// <param name="pageIndex">当前页面索引</param>
/// <param name="pageSize">分布大小</param>
/// <param name="orderByExpression"></param>
/// <param name="blUseNoLock">是否使用WITH(NOLOCK)</param>
/// <returns></returns>
public new async Task<IPageList<CoreCmsUserTocash>> QueryPageAsync(Expression<Func<CoreCmsUserTocash, bool>> predicate,
Expression<Func<CoreCmsUserTocash, object>> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
#endregion
}
}