jyy
2021-04-06 f9bb41486c8c9b89c762d5ccff850e4c23a2caa8
zq-erp/src/main/java/com/matrix/system/score/service/ScoreVipDetailService.java
@@ -1,20 +1,285 @@
package com.matrix.system.score.service;
import com.matrix.system.score.dao.ScoreVipDetailDao;
import com.matrix.system.score.entity.ScoreVipDetail;
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;
/**
 * @description 客户积分余额
 * @author jyy
 * @description 客户积分余额
 * @date 2021-02-26 15:26
 */
@Service
public class ScoreVipDetailService  extends ServiceImpl<ScoreVipDetailDao, ScoreVipDetail>{
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);
    }
}