/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 2022/3/8 23:33:07
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
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.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Extensions;
using CoreCms.Net.Utility.Helper;
using SqlSugar;
namespace CoreCms.Net.Services
{
///
/// 用户签到明细表 接口实现
///
public class CoreCmsUserCheckInDetailsServices : BaseServices, ICoreCmsUserCheckInDetailsServices
{
private readonly ICoreCmsUserCheckInDetailsRepository _dal;
private readonly IUnitOfWork _unitOfWork;
private readonly ICoreCmsSettingServices _settingServices;
private readonly ICoreCmsUserPointLogServices _userPointLogServices;
private readonly ICoreCmsUserBalanceServices _userBalanceServices;
private readonly ICoreCmsCumulativeCheckInRulesServices _cumulativeCheckInRulesServices;
private readonly ICoreCmsContinuousCheckInRulesServices _continuousCheckInRulesServices;
private readonly ICoreCmsUserServices _userServices;
private readonly ICoreCmsUserCheckInServices _userCheckInServices;
public CoreCmsUserCheckInDetailsServices(IUnitOfWork unitOfWork, ICoreCmsUserCheckInDetailsRepository dal, ICoreCmsSettingServices settingServices, ICoreCmsUserPointLogServices userPointLogServices, ICoreCmsUserBalanceServices userBalanceServices, ICoreCmsCumulativeCheckInRulesServices cumulativeCheckInRulesServices, ICoreCmsContinuousCheckInRulesServices continuousCheckInRulesServices, ICoreCmsUserServices userServices, ICoreCmsUserCheckInServices userCheckInServices)
{
this._dal = dal;
_settingServices = settingServices;
_userPointLogServices = userPointLogServices;
_userBalanceServices = userBalanceServices;
_cumulativeCheckInRulesServices = cumulativeCheckInRulesServices;
_continuousCheckInRulesServices = continuousCheckInRulesServices;
_userServices = userServices;
_userCheckInServices = userCheckInServices;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
///
/// 获取缓存的所有数据
///
///
public async Task DoCheckIn(CoreCmsUserCheckInDetails entity)
{
var jm = new AdminUiCallBack();
try
{
var dt = DateTime.Now;
var dtStr = dt.ToString("yyyy-MM-dd");
var checkDataStr = entity.checkInData.ToString("yyyy-MM-dd");
if (dtStr != checkDataStr)
{
jm.msg = "签到日期不符,签到提交日期非今日";
return jm;
}
var id = await _dal.InsertAsync(entity);
var userCheckIn = await _userCheckInServices.QueryByClauseAsync(p => p.userId == entity.userId);
if (userCheckIn != null)
{
//累计签到
userCheckIn.cumulativeCheckInCount += 1;
//判断是否是连续签到
//判断是否是连续签到逻辑是:获取用户最后一次的签到记录,检查查询到的签到记录的checkInData是不是昨天的checkInData,是的话就是连续签到,continuousCheckInCount++,不是的话就是断签了,continuousCheckInCount设置成1重新开始就行了。
var lastCheck = await _dal.QueryByClauseAsync(p => p.id < id, true);
if (lastCheck == null)
{
userCheckIn.continuousCheckInCount = 1;
}
else
{
var yesterdayDataStr = dt.AddDays(-1).ToString("yyyy-MM-dd");
var lastCheckDataStr = lastCheck.checkInData.ToString("yyyy-MM-dd");
if (yesterdayDataStr == lastCheckDataStr)
{
//累加
userCheckIn.continuousCheckInCount += 1;
}
else
{
//重置
userCheckIn.continuousCheckInCount = 1;
}
}
await _userCheckInServices.UpdateAsync(userCheckIn);
}
else
{
userCheckIn = new CoreCmsUserCheckIn();
userCheckIn.userId = entity.userId;
userCheckIn.continuousCheckInCount = 1;
userCheckIn.cumulativeCheckInCount = 1;
await _userCheckInServices.InsertAsync(userCheckIn);
}
//初始化获得的积分
var point = 0;
//初始化获得的余额
var money = 0;
var allConfigs = await _settingServices.GetConfigDictionaries();
var showStoresSwitch = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CheckInIsOpen).ObjectToInt(2); //是否开启签到
if (showStoresSwitch == 1)
{
//普通签到赠送处理
//签到赠送的数量
var checkInCommonNum = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CheckInCommonNum).ObjectToInt(0);
if (checkInCommonNum > 0)
{
//签到赠送的类别
var checkInCommonType = CommonHelper.GetConfigDictionary(allConfigs, SystemSettingConstVars.CheckInCommonType).ObjectToInt(0);
switch (checkInCommonType)
{
case (int)GlobalEnumVars.CheckInCommonType.积分:
point += checkInCommonNum;
//储值积分
await _userPointLogServices.SetPoint(entity.userId, checkInCommonNum, (int)GlobalEnumVars.UserPointSourceTypes.PointTypeSign, "日历签到,获得" + checkInCommonNum + "积分");
break;
case (int)GlobalEnumVars.CheckInCommonType.余额:
money += checkInCommonNum;
//储值余额
await _userBalanceServices.Change(entity.userId, (int)GlobalEnumVars.UserBalanceSourceTypes.CheckIn, checkInCommonNum, id.ToString());
break;
}
}
//判断累计签到次数是否满足
var cumulativeCheckInRules = await _cumulativeCheckInRulesServices.QueryAsync(true, true);
//获取用户总签到次数(使用userCheckIn的签到次数统计也可以,但是查询实时数据最可靠。根据个人来)
//var cumulativeCheckInCount = await _dal.GetCountAsync(p => p.userId == entity.userId);
var cumulativeCheckInCount = userCheckIn.cumulativeCheckInCount;
//遍历规则
async void Action(CoreCmsCumulativeCheckInRules p)
{
if (cumulativeCheckInCount == p.days)
{
switch (p.type)
{
case (int)GlobalEnumVars.CheckInCommonType.积分:
point += p.num;
//储值积分
await _userPointLogServices.SetPoint(entity.userId, p.num, (int)GlobalEnumVars.UserPointSourceTypes.PointTypeSign, "日历签到,获得" + p.num + "积分");
break;
case (int)GlobalEnumVars.CheckInCommonType.余额:
money += p.num;
//储值余额
await _userBalanceServices.Change(entity.userId, (int)GlobalEnumVars.UserBalanceSourceTypes.CheckIn, p.num, id.ToString());
break;
}
}
//原则上应该还要加个日志。确定是否这个时间已经领取过了。
}
cumulativeCheckInRules.ForEach(Action);
//判断连续签到次数是否满足
var continuousCheckInRules = await _continuousCheckInRulesServices.GetDataWidthChild();
//获取用户数据
var user = await _userServices.QueryByIdAsync(entity.userId);
//获取用户当前已经连续签到的次数
var userContinuousCheckInNum = userCheckIn.continuousCheckInCount;
//遍历处理结果
foreach (var rule in from p in continuousCheckInRules where p.days == userContinuousCheckInNum select p.details.Find(o => o.userGradeId == user.grade) into rule where rule != null select rule)
{
switch (rule.type)
{
case (int)GlobalEnumVars.CheckInCommonType.积分:
point += rule.num;
//储值积分
await _userPointLogServices.SetPoint(entity.userId, rule.num, (int)GlobalEnumVars.UserPointSourceTypes.PointTypeSign, "日历签到,获得" + rule.num + "积分");
break;
case (int)GlobalEnumVars.CheckInCommonType.余额:
money += rule.num;
//储值余额
await _userBalanceServices.Change(entity.userId, (int)GlobalEnumVars.UserBalanceSourceTypes.CheckIn, rule.num, id.ToString());
break;
}
}
jm.code = 0;
jm.msg = "签到成功共获得" + point + "积分" + money + "余额";
jm.data = userCheckIn;
jm.otherData = cumulativeCheckInRules;
}
else
{
jm.code = 1;
jm.msg = "日历签到暂未开启";
}
}
catch (Exception e)
{
jm.code = 1;
jm.msg = "更新失败";
jm.data = e;
}
return jm;
}
}
}