移动系统liao
2024-08-15 f43970a061d3c90520b4e8f48caa17a204d9a085
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
/***********************************************************************
 *            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
{
    /// <summary>
    /// 用户签到明细表 接口实现
    /// </summary>
    public class CoreCmsUserCheckInDetailsServices : BaseServices<CoreCmsUserCheckInDetails>, 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;
        }
 
 
        /// <summary>
        /// 获取缓存的所有数据
        /// </summary>
        /// <returns></returns>
        public async Task<AdminUiCallBack> 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;
        }
 
    }
}