| package com.matrix.system.score.service; | 
|   | 
| import cn.hutool.core.date.DateTime; | 
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | 
| import com.matrix.core.constance.MatrixConstance; | 
| import com.matrix.core.exception.GlobleException; | 
| import com.matrix.core.tools.DateUtil; | 
| import com.matrix.core.tools.StringUtils; | 
| import com.matrix.system.common.bean.BusParameterSettings; | 
| import com.matrix.system.common.dao.BusParameterSettingsDao; | 
| import com.matrix.system.common.dao.SysUsersDao; | 
| import com.matrix.system.hive.bean.SysVipInfo; | 
| import com.matrix.system.hive.dao.SysVipInfoDao; | 
| import com.matrix.system.score.constant.ScoreSettingConstant; | 
| import com.matrix.system.score.dao.ScoreUseRecordDao; | 
| import com.matrix.system.score.dao.ScoreVipDetailDao; | 
| import com.matrix.system.score.entity.ScoreUseRecord; | 
| import com.matrix.system.score.entity.ScoreVipDetail; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.stereotype.Service; | 
| import org.springframework.transaction.annotation.Transactional; | 
|   | 
| import java.util.Calendar; | 
| import java.util.Date; | 
| import java.util.List; | 
|   | 
| /** | 
|  * @author jyy | 
|  * @description 客户积分余额 | 
|  * @date 2021-02-26 15:26 | 
|  */ | 
| @Service | 
| public class ScoreVipDetailService extends ServiceImpl<ScoreVipDetailDao, ScoreVipDetail> { | 
|   | 
|     @Autowired | 
|     ScoreVipDetailDao scoreVipDetailDao; | 
|   | 
|     @Autowired | 
|     ScoreUseRecordDao scoreUseRecordDao; | 
|   | 
|     @Autowired | 
|     SysVipInfoDao sysVipInfoDao; | 
|   | 
|     @Autowired | 
|     SysVipInfoDao vipInfoDao; | 
|   | 
|     @Autowired | 
|     SysUsersDao sysUsersDao; | 
|   | 
|     @Autowired | 
|     BusParameterSettingsDao busParameterSettingsDao; | 
|   | 
|     /** | 
|      * 扣除用户积分 | 
|      */ | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void deductionScore(Long vipId, Long oprationUserId, Long shopId, Integer score, Long businessId, int type, String remark) { | 
|         Long companyId = vipInfoDao.selectById(vipId).getCompanyId(); | 
|   | 
|         String createBy = MatrixConstance.SYSTEM_USER; | 
|         if (oprationUserId != null) { | 
|             createBy = sysUsersDao.selectById(oprationUserId).getSuName(); | 
|         } | 
|   | 
|         List<ScoreVipDetail> effectiveScoreList = scoreVipDetailDao.selectEffectiveScore(vipId); | 
|   | 
|         for (ScoreVipDetail scoreVipDetail : effectiveScoreList) { | 
|   | 
|             ScoreUseRecord scoreUseRecord = new ScoreUseRecord(); | 
|             scoreUseRecord.setPreScore(scoreVipDetail.getRemainScore()); | 
|   | 
|             int surplus = scoreVipDetail.getRemainScore() - score; | 
|             int currentDedution = 0; | 
|             if (surplus > 0 || surplus == 0) { | 
|                 //余额充足 | 
|                 currentDedution = score; | 
|                 scoreVipDetail.setRemainScore(surplus); | 
|                 if (surplus == 0) { | 
|                     scoreVipDetail.setState(ScoreVipDetail.SCORE_STATUS_WX); | 
|                 } | 
|                 scoreVipDetailDao.updateById(scoreVipDetail); | 
|                 score = 0; | 
|             } else { | 
|                 currentDedution = scoreVipDetail.getRemainScore(); | 
|                 scoreVipDetail.setState(ScoreVipDetail.SCORE_STATUS_WX); | 
|                 scoreVipDetail.setRemainScore(0); | 
|                 scoreVipDetailDao.updateById(scoreVipDetail); | 
|                 score = Math.abs(surplus); | 
|             } | 
|   | 
|   | 
|             //新增扣除记录 | 
|             scoreUseRecord.setCreateBy(createBy); | 
|             scoreUseRecord.setUpdateBy(createBy); | 
|             scoreUseRecord.setCreateTime(DateTime.now()); | 
|             scoreUseRecord.setUpdateTime(DateTime.now()); | 
|             scoreUseRecord.setNowScore(scoreVipDetail.getRemainScore()); | 
|             scoreUseRecord.setCompanyId(companyId); | 
|             scoreUseRecord.setScoreVipDetailId(scoreVipDetail.getId()); | 
|             scoreUseRecord.setBusinessId(businessId); | 
|             scoreUseRecord.setRecNum(-currentDedution); | 
|             scoreUseRecord.setType(type); | 
|             scoreUseRecord.setShopId(shopId); | 
|             scoreUseRecord.setVipId(vipId); | 
|             scoreUseRecord.setRemarks(remark); | 
|             scoreUseRecord.setOprationUserId(oprationUserId); | 
|             scoreUseRecordDao.insert(scoreUseRecord); | 
|   | 
|             if (surplus > 0 || surplus == 0) { | 
|                 break; | 
|             } | 
|         } | 
|         if (score > 0) { | 
|             throw new GlobleException("积分不足"); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 新增用户积分 | 
|      */ | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void addScore(Long vipId, Long oprationUserId, Long shopId, Integer score, Long businessId, int type, String remark) { | 
|         Long companyId = vipInfoDao.selectById(vipId).getCompanyId(); | 
|   | 
|         if (score < 0) { | 
|             throw new IllegalArgumentException("score必须有为大于零的数"); | 
|         } | 
|   | 
|         String createBy = MatrixConstance.SYSTEM_USER; | 
|         if (oprationUserId != null) { | 
|             createBy = sysUsersDao.selectById(oprationUserId).getSuName(); | 
|         } | 
|   | 
|         //计算过期时间 | 
|         BusParameterSettings yxqSetting = busParameterSettingsDao.selectCompanyParamByCode(ScoreSettingConstant.VALID_PERIOD_POINTS, companyId); | 
|         Calendar cal = Calendar.getInstance(); | 
|         int year = cal.get(Calendar.YEAR); | 
|         int sxYear = year + (Integer.parseInt(yxqSetting.getParamValue()) - 1); | 
|         Date sxys = DateUtil.stringToDate(sxYear + "-12-31 23:59", DateUtil.DATE_FORMAT_MM); | 
|   | 
|         ScoreVipDetail scoreVipDetail = new ScoreVipDetail(); | 
|   | 
|         scoreVipDetail.setCreateBy(createBy); | 
|         scoreVipDetail.setUpdateBy(createBy); | 
|         scoreVipDetail.setCreateTime(DateTime.now()); | 
|         scoreVipDetail.setUpdateTime(DateTime.now()); | 
|         scoreVipDetail.setState(ScoreVipDetail.SCORE_STATUS_YX); | 
|         scoreVipDetail.setRemainScore(score); | 
|         scoreVipDetail.setUsedScore(0); | 
|         scoreVipDetail.setBusinessId(businessId); | 
|         scoreVipDetail.setValiditeTime(sxys); | 
|         scoreVipDetail.setVipId(vipId); | 
|         scoreVipDetail.setGainTime(DateTime.now()); | 
|         scoreVipDetail.setAllScore(score); | 
|         scoreVipDetail.setType(type); | 
|         scoreVipDetail.setCompanyId(companyId); | 
|         scoreVipDetailDao.insert(scoreVipDetail); | 
|   | 
|         //新增添加记录 | 
|         ScoreUseRecord scoreUseRecord = new ScoreUseRecord(); | 
|         scoreUseRecord.setPreScore(score); | 
|         scoreUseRecord.setCreateBy(createBy); | 
|         scoreUseRecord.setUpdateBy(createBy); | 
|         scoreUseRecord.setCreateTime(DateTime.now()); | 
|         scoreUseRecord.setUpdateTime(DateTime.now()); | 
|         scoreUseRecord.setNowScore(score); | 
|         scoreUseRecord.setCompanyId(companyId); | 
|         scoreUseRecord.setScoreVipDetailId(scoreVipDetail.getId()); | 
|         scoreUseRecord.setBusinessId(businessId); | 
|         scoreUseRecord.setRecNum(score); | 
|         scoreUseRecord.setType(type); | 
|         scoreUseRecord.setVipId(vipId); | 
|         scoreUseRecord.setShopId(shopId); | 
|         scoreUseRecord.setOprationUserId(oprationUserId); | 
|         scoreUseRecord.setRemarks(remark); | 
|         scoreUseRecordDao.insert(scoreUseRecord); | 
|   | 
|   | 
|     } | 
|   | 
|     /** | 
|      * 根据固定等级规则新增用户积分 | 
|      */ | 
|     @Transactional(rollbackFor = Exception.class) | 
|     public void addScoreByParamSetting(Long vipId, Long oprationUserId, Long shopId, Long businessId, int type, String remark, BusParameterSettings parameterSetting) { | 
|   | 
|         if (parameterSetting != null) { | 
|             SysVipInfo vipInfo = sysVipInfoDao.selectById(vipId); | 
|             //添加自己的积分 | 
|             if (StringUtils.isNotBlank(parameterSetting.getParamValue())) { | 
|                 Integer firstScore = new Integer(parameterSetting.getParamValue()); | 
|                 if (firstScore > 0) { | 
|                     addScore( | 
|                             vipInfo.getId(), | 
|                             oprationUserId, | 
|                             shopId, | 
|                             firstScore, | 
|                             businessId, | 
|                             type, | 
|                             remark | 
|                     ); | 
|                 } | 
|             } | 
|   | 
|             if (StringUtils.isNotBlank(parameterSetting.getParamValue1()) | 
|                     && vipInfo.getRecommendId() != null) { | 
|                 //推荐注册老带新积分奖励 | 
|                 SysVipInfo referrerVip = sysVipInfoDao.selectById(vipInfo.getRecommendId()); | 
|                 Integer secondScore = new Integer(parameterSetting.getParamValue1()); | 
|                 if (secondScore > 0) { | 
|                     addScore( | 
|                             referrerVip.getId(), | 
|                             oprationUserId, | 
|                             shopId, | 
|                             secondScore, | 
|                             businessId, | 
|                             type, | 
|                             remark | 
|                     ); | 
|                 } | 
|                 //推荐注册二级带新积分奖励 | 
|                 if (StringUtils.isNotBlank(parameterSetting.getParamValue2()) | 
|                         && referrerVip.getRecommendId() != null) { | 
|                     Integer threeScore = new Integer(parameterSetting.getParamValue2()); | 
|                     if (threeScore > 0) { | 
|                         addScore( | 
|                                 referrerVip.getRecommendId(), | 
|                                 oprationUserId, | 
|                                 shopId, | 
|                                 threeScore, | 
|                                 businessId, | 
|                                 type, | 
|                                 remark | 
|                         ); | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 退积分 | 
|      */ | 
|     public void refundScore(Long vipId, Integer score, Long oldBusinessId, int type) { | 
|   | 
|         Long companyId = vipInfoDao.selectById(vipId).getCompanyId(); | 
|   | 
|         if (score < 0) { | 
|             throw new IllegalArgumentException("score必须有为大于零的数"); | 
|         } | 
|         //查询原始使用记录 | 
|         QueryWrapper queryWrapper = new QueryWrapper(); | 
|         queryWrapper.eq("business_id", oldBusinessId); | 
|         queryWrapper.eq("company_id", companyId); | 
|         queryWrapper.eq("type", type); | 
|         List<ScoreUseRecord> scoreUseRecordList = scoreUseRecordDao.selectList(queryWrapper); | 
|         scoreUseRecordList.forEach(scoreUseRecord -> { | 
|             ScoreVipDetail scoreVipDetail = scoreVipDetailDao.selectById(scoreUseRecord.getScoreVipDetailId()); | 
|             if (scoreVipDetail != null) { | 
|                 if (DateTime.now().isAfter(scoreVipDetail.getValiditeTime())) { | 
|                     //积分还有效 | 
|                     scoreVipDetail.setRemainScore(scoreVipDetail.getRemainScore() + score); | 
|                     scoreVipDetail.setUsedScore(scoreVipDetail.getUsedScore() - score); | 
|                     scoreVipDetail.setState(ScoreVipDetail.SCORE_STATUS_YX); | 
|                     scoreVipDetailDao.updateById(scoreVipDetail); | 
|                     scoreUseRecordDao.deleteById(scoreUseRecord.getId()); | 
|                 } | 
|             } | 
|   | 
|         }); | 
|     } | 
|   | 
|     public void removeByBusinessId(Long vipId, Long oldBusinessId) { | 
|         Long companyId = vipInfoDao.selectById(vipId).getCompanyId(); | 
|   | 
|         if (oldBusinessId == null) { | 
|             throw new IllegalArgumentException("oldBusinessId必须有"); | 
|         } | 
|         QueryWrapper queryWrapper = new QueryWrapper(); | 
|         queryWrapper.eq("business_id", oldBusinessId); | 
|         queryWrapper.eq("company_id", companyId); | 
|         scoreVipDetailDao.delete(queryWrapper); | 
|         scoreUseRecordDao.delete(queryWrapper); | 
|     } | 
| } |