/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* 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 NPOI.SS.Formula.Functions;
using SqlSugar;
namespace CoreCms.Net.Services
{
///
/// 用户积分记录表 接口实现
///
public class CoreCmsUserPointLogServices : BaseServices, 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;
}
///
/// 积分消费日志设置
///
/// 用户
///
///
///
///
public async Task SetPoint(int userId, int num, int type, string remarks)
{
using (var container = _serviceProvider.CreateScope())
{
var userServices = container.ServiceProvider.GetService();
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;
}
}
///
/// 订单完成送积分操作
///
///
///
///
public async Task OrderComplete(int userId, decimal money, string orderId)
{
using (var container = _serviceProvider.CreateScope())
{
var settingServices = container.ServiceProvider.GetService();
var orderItemServices = container.ServiceProvider.GetService();
var productsServices = container.ServiceProvider.GetService();
var distributionServices = container.ServiceProvider.GetService();
var allConfigs = await settingServices.GetConfigDictionaries();
//获取积分获取模式
var pointGetModel = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.PointGetModel).ObjectToInt();
if (pointGetModel == 1)
{
//如果是订单获取,直接走金额计算。
var ordersRewardProportion = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.OrdersRewardProportion).ObjectToInt();
if (ordersRewardProportion > 0)
{
//如果是经销商就不能获得积分
var user = await distributionServices.QueryListByClauseAsync(x => x.userId == userId && x.verifyStatus == 1 && x.isDelete == false );//(int)GlobalEnumVars.DistributionVerifyStatus.VerifyYes
if (user == null || user.Count == 0)
{
//如果是普通用户则货得积分
var point = Convert.ToInt32(money / ordersRewardProportion);
await SetPoint(userId, point, (int)GlobalEnumVars.UserPointSourceTypes.PointTypeRebate,
"订单:" + orderId + " 奖励");
}
}
}
else if (pointGetModel == 2)
{
//如果是单品获取模式,则找订单商品详情
var orderItems = await orderItemServices.QueryListByClauseAsync(p => p.orderId == orderId);
if (orderItems.Any())
{
var productIds = orderItems.Select(p => p.productId).ToList();
var products = await productsServices.QueryListByClauseAsync(p => productIds.Contains(p.id));
var point = 0;
foreach (var item in orderItems)
{
var pd = products.Find(p => p.id == item.productId);
if (pd != null && pd.points > 0)
{
point += pd.points * item.nums;
}
}
if (point > 0)
{
await SetPoint(userId, point, (int)GlobalEnumVars.UserPointSourceTypes.PointTypeRebate,
"订单:" + orderId + " 奖励");
}
}
}
}
}
///
/// 判断今天是否签到
///
///
public async Task IsSign(int userId)
{
var jm = new WebApiCallBack();
jm.msg = "今天还没有签到";
var where = PredicateBuilder.True();
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;
}
///
/// 用户签到
///
///
public async Task Sign(int userId)
{
using var container = _serviceProvider.CreateScope();
var settingServices = container.ServiceProvider.GetService();
var jm = new WebApiCallBack();
var res = await IsSign(userId);
if (res.status)
{
jm.msg = "今天已经签到,无需重复签到";
return jm;
}
//获取店铺签到积分设置
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();
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;
}
}
}