xiaoyong931011
2023-04-01 1e4640d648e22fa4813be480c934c25d77efe2d6
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
package cc.mrbird.febs.mall.service.impl;
 
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion;
import cc.mrbird.febs.mall.dto.ApiMallScoreSignRecordDto;
import cc.mrbird.febs.mall.dto.ScoreSettingDto;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
import cc.mrbird.febs.mall.mapper.MallMemberMapper;
import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
import cc.mrbird.febs.mall.mapper.MallScoreSignRecordMapper;
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cc.mrbird.febs.mall.service.IScoreService;
import cc.mrbird.febs.mall.vo.ApiMallScoreSignRecordVo;
import cc.mrbird.febs.mall.vo.ScoreSignVo;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
 
/**
 * @author wzy
 * @date 2022-05-09
 **/
@Slf4j
@Service
@RequiredArgsConstructor
public class ScoreServiceImpl implements IScoreService {
 
    private final MallMemberWalletMapper mallMemberWalletMapper;
    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
    private final MallScoreSignRecordMapper mallScoreSignRecordMapper;
    private final IMallMoneyFlowService mallMoneyFlowService;
    private final IApiMallMemberWalletService walletService;
    private final MallMemberMapper mallMemberMapper;
 
    @Override
    public ScoreSignVo scoreSign() {
        MallMember member = LoginUserUtil.getLoginUser();
 
        MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(member.getId());
 
        ScoreSignVo scoreSign = new ScoreSignVo();
        scoreSign.setMineScore(wallet.getPrizeScore().intValue());
 
        DataDictionaryCustom signScpreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.SIGN_SCORE.getType(), DataDictionaryEnum.SIGN_SCORE.getCode());
        if (signScpreDic != null) {
            scoreSign.setSetting(Integer.parseInt(signScpreDic.getValue()));
        }
        return scoreSign;
    }
 
    @Override
    public MallScoreSignRecord judgeScoreIsContinuity(MallScoreSignRecord mallScoreSignRecord) {
        if (mallScoreSignRecord.getSignTime() == null) {
            return mallScoreSignRecord;
        }
 
        // 若最新签到日期,与当天相差大于一天,则更新数据库(避免定时器更新失败)
        if (DateUtil.betweenDay(mallScoreSignRecord.getSignTime(), new Date(), true) > 1 || mallScoreSignRecord.getTotalCnt() == 7) {
            mallScoreSignRecord.setTotalCnt(0);
            mallScoreSignRecordMapper.updateById(mallScoreSignRecord);
        }
        return mallScoreSignRecord;
    }
 
    @Override
    public List<ApiMallScoreSignRecordVo> findMallScoreSignRecordList(ApiMallScoreSignRecordDto apiMallScoreSignRecordDto) {
 
        MallMember member = LoginUserUtil.getLoginUser();
        IPage<ApiMallScoreSignRecordVo> page = new Page<>(apiMallScoreSignRecordDto.getPageNum(), apiMallScoreSignRecordDto.getPageSize());
        apiMallScoreSignRecordDto.setMemberId(member.getId());
        IPage<ApiMallScoreSignRecordVo> apiMallScoreSignRecordVos = mallScoreSignRecordMapper.selectApiOrderListInPage(page, apiMallScoreSignRecordDto);
        return apiMallScoreSignRecordVos.getRecords();
    }
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void sign() {
        MallMember member = LoginUserUtil.getLoginUser();
 
        DataDictionaryCustom signScoreDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.SIGN_SCORE.getType(),
                DataDictionaryEnum.SIGN_SCORE.getCode());
        if (signScoreDic == null) {
            throw new FebsException("签到活动未开启");
        }
        Integer signScore = Integer.parseInt(signScoreDic.getValue());
 
        MallScoreSignRecord mallScoreSignRecord = mallScoreSignRecordMapper.selectRecentSignRecord(member.getId());
        if (mallScoreSignRecord == null) {
            mallScoreSignRecord = new MallScoreSignRecord();
        }
 
        if (mallScoreSignRecord.getSignTime() != null && DateUtil.betweenDay(mallScoreSignRecord.getSignTime(), new Date(), true) == 0) {
            throw new FebsException("今日已签到");
        }
        /**
         * 用户注册时间开始计算
         * 判断签到时间是否大于规定的signScoreDays,超出则获得的积分数为signScoreCnt
         */
//        Integer count = mallScoreSignRecordMapper.selectCountByMemberId(member.getId());
        DataDictionaryCustom signScoreDaysDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.SIGN_SCORE_DAYS.getType(),
                DataDictionaryEnum.SIGN_SCORE_DAYS.getCode());
        Integer signScoreDays = Integer.parseInt(signScoreDaysDic.getValue());
 
        MallMember mallMember = mallMemberMapper.selectById(member.getId());
        Date createdTime = mallMember.getCreatedTime();
 
        DateTime dateTime = DateUtil.offsetDay(createdTime, signScoreDays);
        /**
         * 签到时间不在系统设置的第一个阶段,则获取签到设置-签到积分后续获得积分数量
         */
        if(DateUtil.compare(dateTime, new Date()) < 0){
            DataDictionaryCustom signScoreCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                    DataDictionaryEnum.SIGN_SCORE_CNT.getType(),
                    DataDictionaryEnum.SIGN_SCORE_CNT.getCode());
            Integer signScoreCnt = Integer.parseInt(signScoreCntDic.getValue());
            signScore = signScoreCnt;
        }
        mallScoreSignRecord.setMemberId(member.getId());
        mallScoreSignRecord.setTotalCnt(signScore);
        mallScoreSignRecord.setSignTime(new Date());
        mallScoreSignRecord.setScore(signScore);
        mallScoreSignRecordMapper.insert(mallScoreSignRecord);
 
        BigDecimal amount = BigDecimal.valueOf(mallScoreSignRecord.getScore());
        walletService.add(amount, member.getId(), "prizeScore");
        mallMoneyFlowService.addMoneyFlow(
                member.getId(),
                amount,
                MoneyFlowTypeEnum.SCORE_SIGN.getValue(), 
                null,
                FlowTypeEnum.PRIZE_SCORE.getValue());
    }
}