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 { @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 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 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); } }