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, Integer firstScore, Long businessId, int type, String remark, BusParameterSettings parameterSetting) {
|
|
|
SysVipInfo vipInfo = sysVipInfoDao.selectById(vipId);
|
|
|
//添加自己的积分
|
if (firstScore > 0) {
|
addScore(
|
vipInfo.getId(),
|
oprationUserId,
|
shopId,
|
firstScore,
|
businessId,
|
type,
|
remark
|
);
|
}
|
|
if (StringUtils.isNotBlank(parameterSetting.getParamValue())
|
&& vipInfo.getRecommendId() != null) {
|
//推荐注册老带新积分奖励
|
SysVipInfo referrerVip = sysVipInfoDao.selectById(vipInfo.getRecommendId());
|
Integer secondScore = new Integer(parameterSetting.getParamValue());
|
if (secondScore > 0) {
|
addScore(
|
referrerVip.getId(),
|
oprationUserId,
|
shopId,
|
secondScore,
|
businessId,
|
type,
|
remark
|
);
|
}
|
//推荐注册二级带新积分奖励
|
if (StringUtils.isNotBlank(parameterSetting.getParamValue1())
|
&& referrerVip.getRecommendId() != null) {
|
Integer threeScore = new Integer(parameterSetting.getParamValue());
|
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);
|
}
|
}
|