/*********************************************************************** * 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; } } }