| 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.dto.ScoreSettingDto; | 
| import cc.mrbird.febs.mall.entity.DataDictionaryCustom; | 
| import cc.mrbird.febs.mall.entity.MallMember; | 
| import cc.mrbird.febs.mall.entity.MallMemberWallet; | 
| import cc.mrbird.febs.mall.entity.MallScoreSignRecord; | 
| import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; | 
| import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper; | 
| import cc.mrbird.febs.mall.mapper.MallScoreSignRecordMapper; | 
| 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.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 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; | 
|   | 
| /** | 
|  * @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; | 
|   | 
|     @Override | 
|     public ScoreSignVo scoreSign() { | 
|         MallMember member = LoginUserUtil.getLoginUser(); | 
|   | 
|         MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(member.getId()); | 
|   | 
|         MallScoreSignRecord mallScoreSignRecord = mallScoreSignRecordMapper.selectRecentSignRecord(member.getId()); | 
|   | 
|         ScoreSignVo scoreSign = new ScoreSignVo(); | 
|         scoreSign.setMineScore(wallet.getPrizeScore().intValue()); | 
|   | 
|         if (mallScoreSignRecord == null) { | 
|             scoreSign.setHasSignDays(0); | 
|         } else { | 
|             mallScoreSignRecord = judgeScoreIsContinuity(mallScoreSignRecord); | 
|             scoreSign.setHasSignDays(mallScoreSignRecord.getTotalCnt()); | 
|         } | 
|   | 
|         DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), DataDictionaryEnum.SCORE_SIGN_SETTING.getCode()); | 
|         if (dic != null) { | 
|             scoreSign.setSetting(JSONObject.parseObject(dic.getValue(), ScoreSettingDto.class)); | 
|         } | 
|         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 | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void sign() { | 
|         MallMember member = LoginUserUtil.getLoginUser(); | 
|   | 
|         DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), DataDictionaryEnum.SCORE_SIGN_SETTING.getCode()); | 
|         if (dic == null) { | 
|             throw new FebsException("暂未设置积分"); | 
|         } | 
|   | 
|         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("今天已签到"); | 
|         } | 
|   | 
|         mallScoreSignRecord = judgeScoreIsContinuity(mallScoreSignRecord); | 
|   | 
|         ScoreSettingDto scoreSetting = JSONObject.parseObject(dic.getValue(),ScoreSettingDto.class); | 
|         int days = mallScoreSignRecord.getTotalCnt() == null ? 1 : mallScoreSignRecord.getTotalCnt() + 1; | 
|         switch (days) { | 
|             case 1: | 
|                 if (scoreSetting.getSignInOne() == null) { | 
|                     throw new FebsException("积分未设置"); | 
|                 } | 
|                 mallScoreSignRecord.setScore(scoreSetting.getSignInOne()); | 
|                 break; | 
|             case 2: | 
|                 if (scoreSetting.getSignInTwo() == null) { | 
|                     throw new FebsException("积分未设置"); | 
|                 } | 
|                 mallScoreSignRecord.setScore(scoreSetting.getSignInTwo()); | 
|                 break; | 
|             case 3: | 
|                 if (scoreSetting.getSignInThree() == null) { | 
|                     throw new FebsException("积分未设置"); | 
|                 } | 
|                 mallScoreSignRecord.setScore(scoreSetting.getSignInThree()); | 
|                 break; | 
|             case 4: | 
|                 if (scoreSetting.getSignInFour() == null) { | 
|                     throw new FebsException("积分未设置"); | 
|                 } | 
|                 mallScoreSignRecord.setScore(scoreSetting.getSignInFour()); | 
|                 break; | 
|             case 5: | 
|                 if (scoreSetting.getSignInFive() == null) { | 
|                     throw new FebsException("积分未设置"); | 
|                 } | 
|                 mallScoreSignRecord.setScore(scoreSetting.getSignInFive()); | 
|                 break; | 
|             case 6: | 
|                 if (scoreSetting.getSignInSix() == null) { | 
|                     throw new FebsException("积分未设置"); | 
|                 } | 
|                 mallScoreSignRecord.setScore(scoreSetting.getSignInSix()); | 
|                 break; | 
|             case 7: | 
|                 if (scoreSetting.getSignInSeven() == null) { | 
|                     throw new FebsException("积分未设置"); | 
|                 } | 
|                 mallScoreSignRecord.setScore(scoreSetting.getSignInSeven()); | 
|                 break; | 
|         } | 
|   | 
|         mallScoreSignRecord.setMemberId(member.getId()); | 
|         mallScoreSignRecord.setTotalCnt(days); | 
|         mallScoreSignRecord.setSignTime(new Date()); | 
|         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()); | 
|     } | 
| } |