|
@@ -1,19 +1,26 @@
|
|
|
package cn.newfeifan.mall.module.distri.service.integral;
|
|
|
|
|
|
-import cn.newfeifan.mall.framework.common.exception.ErrorCode;
|
|
|
import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
|
import cn.newfeifan.mall.module.distri.constant.DistriConstants;
|
|
|
-import cn.newfeifan.mall.module.distri.controller.app.consumptionchangelog.vo.ConsumptionChangeLogSaveReqVO;
|
|
|
+import cn.newfeifan.mall.module.distri.controller.app.integralchangelog.vo.IntegralChangeLogSaveReqVO;
|
|
|
import cn.newfeifan.mall.module.distri.controller.app.ptprofitlog.vo.PtProfitLogSaveReqVO;
|
|
|
import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
|
|
|
-import cn.newfeifan.mall.module.distri.dal.mysql.duser.DuserMapper;
|
|
|
+import cn.newfeifan.mall.module.distri.dal.dataobject.orderpercentage.OrderPercentageDO;
|
|
|
+import cn.newfeifan.mall.module.distri.dal.dataobject.ptprofit.PtProfitDO;
|
|
|
import cn.newfeifan.mall.module.distri.dal.mysql.ptprofit.PtProfitMapper;
|
|
|
import cn.newfeifan.mall.module.distri.enums.CaclEnum;
|
|
|
-import cn.newfeifan.mall.module.distri.enums.ConsumptionEnum;
|
|
|
-import cn.newfeifan.mall.module.distri.enums.SocialStatusUpdateEnum;
|
|
|
-import cn.newfeifan.mall.module.distri.service.consumptionchangelog.ConsumptionChangeLogService;
|
|
|
+import cn.newfeifan.mall.module.distri.enums.IntegralEnum;
|
|
|
+import cn.newfeifan.mall.module.distri.enums.IntegralTypeEnum;
|
|
|
+import cn.newfeifan.mall.module.distri.enums.ProfitTypeEnum;
|
|
|
+import cn.newfeifan.mall.module.distri.service.integralchangelog.IntegralChangeLogService;
|
|
|
+import cn.newfeifan.mall.module.distri.service.duser.DuserService;
|
|
|
+import cn.newfeifan.mall.module.distri.service.orderpercentage.OrderPercentageService;
|
|
|
import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
|
|
|
+import cn.newfeifan.mall.module.member.dal.dataobject.user.MemberUserDO;
|
|
|
+import cn.newfeifan.mall.module.member.service.user.MemberUserService;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import org.springframework.context.annotation.Lazy;
|
|
|
+import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
@@ -24,7 +31,6 @@ import java.util.*;
|
|
|
|
|
|
import cn.newfeifan.mall.module.distri.controller.app.integral.vo.*;
|
|
|
import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
|
|
|
-import cn.newfeifan.mall.framework.common.pojo.PageResult;
|
|
|
import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
|
|
|
|
|
|
import cn.newfeifan.mall.module.distri.dal.mysql.integral.IntegralMapper;
|
|
@@ -32,6 +38,8 @@ import cn.newfeifan.mall.module.distri.dal.mysql.integral.IntegralMapper;
|
|
|
import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
|
|
import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
|
|
|
+import static cn.newfeifan.mall.module.member.enums.ErrorCodeConstants.USER_NOT_PAY_PASSWORD;
|
|
|
+import static cn.newfeifan.mall.module.member.enums.ErrorCodeConstants.USER_PAY_PASS_WORD_ERROR;
|
|
|
|
|
|
/**
|
|
|
* 推荐用户积分 Service 实现类
|
|
@@ -42,20 +50,23 @@ import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
|
|
|
@Validated
|
|
|
public class IntegralServiceImpl implements IntegralService {
|
|
|
|
|
|
- @Resource
|
|
|
- private DuserMapper duserMapper;
|
|
|
-
|
|
|
@Resource
|
|
|
private IntegralMapper integralMapper;
|
|
|
-
|
|
|
@Resource
|
|
|
private PtProfitMapper ptProfitMapper;
|
|
|
-
|
|
|
@Resource
|
|
|
private PtProfitLogService ptProfitLogService;
|
|
|
-
|
|
|
@Resource
|
|
|
- private ConsumptionChangeLogService consumptionChangeLogService;
|
|
|
+ private IntegralChangeLogService integralChangeLogService;
|
|
|
+ @Resource
|
|
|
+ private OrderPercentageService orderPercentageService;
|
|
|
+ @Resource
|
|
|
+ @Lazy
|
|
|
+ private DuserService duserService;
|
|
|
+ @Resource
|
|
|
+ private MemberUserService memberUserService;
|
|
|
+ @Resource
|
|
|
+ private PasswordEncoder passwordEncoder;
|
|
|
|
|
|
@Override
|
|
|
public Long createIntegral(IntegralSaveReqVO createReqVO) {
|
|
@@ -75,14 +86,6 @@ public class IntegralServiceImpl implements IntegralService {
|
|
|
integralMapper.updateById(updateObj);
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void deleteIntegral(Long id) {
|
|
|
- // 校验存在
|
|
|
- validateIntegralExists(id);
|
|
|
- // 删除
|
|
|
- integralMapper.deleteById(id);
|
|
|
- }
|
|
|
-
|
|
|
private void validateIntegralExists(Long id) {
|
|
|
if (integralMapper.selectById(id) == null) {
|
|
|
throw exception(INTEGRAL_NOT_EXISTS);
|
|
@@ -91,12 +94,7 @@ public class IntegralServiceImpl implements IntegralService {
|
|
|
|
|
|
@Override
|
|
|
public IntegralDO getIntegral(Long id) {
|
|
|
- return integralMapper.selectOne(new LambdaQueryWrapperX<IntegralDO>().eq(IntegralDO::getUserId,id));
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public PageResult<IntegralDO> getIntegralPage(IntegralPageReqVO pageReqVO) {
|
|
|
- return integralMapper.selectPage(pageReqVO);
|
|
|
+ return integralMapper.selectOne(new LambdaQueryWrapperX<IntegralDO>().eq(IntegralDO::getUserId, id));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -104,195 +102,323 @@ public class IntegralServiceImpl implements IntegralService {
|
|
|
return integralMapper.selectOne(new LambdaQueryWrapper<IntegralDO>().eq(IntegralDO::getUserId, descendant));
|
|
|
}
|
|
|
|
|
|
+ private void verifyUserIntegral(Long userIntegral, Long useIntegral) {
|
|
|
+ if (userIntegral < useIntegral) {
|
|
|
+ throw exception(USER_INTEGRAL_LESS_TRANSITION_INTEGRAL);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* add by Ben
|
|
|
* 修改用户积分
|
|
|
*
|
|
|
* @param generateUserId 要修改积分的用户
|
|
|
- * @param userId 要修改积分的用户
|
|
|
- * @param caclEnum 导致积分变化的事件类型枚举
|
|
|
- * @param amount 用户可用积分变化金额,可为负数
|
|
|
- * @param freezeAmount 用户冻结积分变化金额,可为负数
|
|
|
+ * @param userId 要修改积分的用户
|
|
|
+ * @param integralEnum 导致积分变化的事件类型枚举
|
|
|
+ * @param amount 用户可用积分变化金额,可为负数
|
|
|
* @return 返回是否执行成功。执行失败,通常是就是用户积分不足,没积分抵扣
|
|
|
*/
|
|
|
@Override
|
|
|
- public Boolean updateUserIntegral(Long generateUserId,//导致产生积分变动的用户ID
|
|
|
- Long userId, CaclEnum caclEnum, Long amount, Long freezeAmount,
|
|
|
- Long tradeOrderId,
|
|
|
- String OrderNum
|
|
|
- ) {
|
|
|
- Boolean success = null;
|
|
|
-
|
|
|
- //修改用户积分钱包的积分
|
|
|
- int effectRowNum = ptProfitMapper.updateUserIntegral(amount,amount,freezeAmount,freezeAmount,userId);
|
|
|
-
|
|
|
- if (effectRowNum==1) {//如果成功修改积分记录
|
|
|
- success = true;
|
|
|
-
|
|
|
- //用户修改后的当前可用的钱包余额
|
|
|
- Long afterAmount = null;
|
|
|
- //用户修改后的冻结积分钱包余额
|
|
|
- Long afterFreezeAmount = null;
|
|
|
-
|
|
|
- //查询用户修改后的积分
|
|
|
- Map<String, Object> map = ptProfitMapper.selectUserIntegral(userId);
|
|
|
- Object currentQuotaObj = map.get("current_quota");
|
|
|
- Object freezeQuotaObj = map.get("freeze_quota");
|
|
|
-
|
|
|
- afterAmount = (Long)currentQuotaObj;
|
|
|
- afterFreezeAmount = (Long)freezeQuotaObj;
|
|
|
-
|
|
|
-// if(afterAmount<0||afterFreezeAmount<0){
|
|
|
-// throw new RuntimeException("用户钱包为负数:用户IO为"+userId+"的用户可用钱包为"+afterAmount+",冻结钱包为"+afterFreezeAmount);
|
|
|
-// }
|
|
|
-
|
|
|
- //记录用户的积分变动日志
|
|
|
- ptProfitLogService.addMessage(generateUserId,//导致产生积分变动的用户ID
|
|
|
- userId, caclEnum, amount, afterAmount,
|
|
|
- freezeAmount, afterFreezeAmount,null,tradeOrderId,OrderNum);
|
|
|
-
|
|
|
- }else if(effectRowNum<1){//如果钱包积分不足,不够抵扣
|
|
|
- success = false;
|
|
|
- } else if (effectRowNum>1) {
|
|
|
-// success = false;
|
|
|
- throw new RuntimeException("用户IO为"+userId+"的用户钱包不只一个!");
|
|
|
+ public void updateUserIntegral(Long generateUserId,//导致产生积分变动的用户ID
|
|
|
+ Long userId, IntegralEnum integralEnum, Long amount,
|
|
|
+ Long tradeOrderId,
|
|
|
+ String OrderNum,
|
|
|
+ Integer integralType,
|
|
|
+ Long highQuota
|
|
|
+ ) {
|
|
|
+ if (amount == null || amount == 0L) return;
|
|
|
+
|
|
|
+ // 用户钱包
|
|
|
+ IntegralDO integralDO = integralMapper.selectOne(new LambdaQueryWrapperX<IntegralDO>().eq(IntegralDO::getUserId, userId));
|
|
|
+ Long afterIntegralPoints = 0L;
|
|
|
+
|
|
|
+ // 溢出额度
|
|
|
+ Long ancestorQuotaAmount = null;
|
|
|
+ Long getHighQuota = 0L; // 实得直推奖奖
|
|
|
+
|
|
|
+ // 校验用户积分是否足够
|
|
|
+ if (integralType.equals(IntegralTypeEnum.RED_INTEGRAL.getType())) {
|
|
|
+ verifyUserIntegral(integralDO.getRedCurrentQuota(), amount);
|
|
|
+ getHighQuota = -amount;
|
|
|
+
|
|
|
+ // 修改用户积分
|
|
|
+ integralDO.setRedCurrentQuota(integralDO.getRedCurrentQuota() - amount);
|
|
|
+ afterIntegralPoints = integralDO.getRedCurrentQuota();
|
|
|
+
|
|
|
+ if (highQuota != null) {
|
|
|
+ // 增加峰值
|
|
|
+ integralDO.setHighQuota(integralDO.getHighQuota() + highQuota); //剩余峰值
|
|
|
+ integralDO.setHighQuotaTotal(integralDO.getHighQuotaTotal() + highQuota); //累计峰值
|
|
|
+ }
|
|
|
+ } else if (integralType.equals(IntegralTypeEnum.GREEN_INTEGRAL.getType())) {
|
|
|
+ verifyUserIntegral(integralDO.getGreenCurrentQuota(), amount);
|
|
|
+ getHighQuota = -amount;
|
|
|
+
|
|
|
+ // 修改用户积分
|
|
|
+ integralDO.setGreenCurrentQuota(integralDO.getGreenCurrentQuota() - amount);
|
|
|
+ afterIntegralPoints = integralDO.getGreenCurrentQuota();
|
|
|
+ } else if (integralType.equals(IntegralTypeEnum.YELLOW_INTEGRAL.getType())) {
|
|
|
+ // 峰值小于获得额度
|
|
|
+ if (integralDO.getHighQuota() < amount) {
|
|
|
+ ancestorQuotaAmount = amount - integralDO.getHighQuota();
|
|
|
+ getHighQuota = integralDO.getHighQuota();
|
|
|
+ highQuota = -integralDO.getHighQuota();
|
|
|
+
|
|
|
+ integralDO.setYellowCurrentQuota(integralDO.getYellowCurrentQuota() + integralDO.getHighQuota());
|
|
|
+ integralDO.setHighQuota(0L);
|
|
|
+ } else {
|
|
|
+ getHighQuota = amount;
|
|
|
+ highQuota = -amount;
|
|
|
+ integralDO.setHighQuota(integralDO.getHighQuota() - amount);
|
|
|
+ integralDO.setYellowCurrentQuota(integralDO.getYellowCurrentQuota() + amount);
|
|
|
+ }
|
|
|
+ afterIntegralPoints = integralDO.getYellowCurrentQuota();
|
|
|
}
|
|
|
|
|
|
- return success;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 修改用户身价
|
|
|
- * @param userId 用户ID
|
|
|
- * @param socialStatusUpdateEnum 身价变动类别
|
|
|
- * @param socialStatusPoint 身价变化值
|
|
|
- * @param ObjectId 导致身价变动的对应业务对象ID,如订单ID、收藏记录ID、新注册用户ID等
|
|
|
- * @return 升级后的身价名称,如果返回null,表明没升级
|
|
|
- */
|
|
|
- public String updateUserSocialStatus(Long userId, SocialStatusUpdateEnum socialStatusUpdateEnum, Integer socialStatusPoint,
|
|
|
- Long ObjectId){
|
|
|
- //升级后的身价名称,如果返回null,表明没升级
|
|
|
- String newSocialStatusName = null;
|
|
|
- //用户身价升了几级
|
|
|
- Integer socialStatusUpgradation = 0;
|
|
|
+ integralMapper.updateById(integralDO);
|
|
|
|
|
|
- DuserDO duser = duserMapper.selectOne("user_id", userId);
|
|
|
- Long oldSocialStatus = duser.getSocialStatusId();//升级前身价等级
|
|
|
+ amount = integralType.equals(IntegralTypeEnum.RED_INTEGRAL.getType()) ||
|
|
|
+ integralType.equals(IntegralTypeEnum.GREEN_INTEGRAL.getType()) ? -amount : amount;
|
|
|
|
|
|
- return newSocialStatusName;
|
|
|
+ // 记录积分变动日志
|
|
|
+ IntegralChangeLogSaveReqVO changeLog = IntegralChangeLogSaveReqVO.builder()
|
|
|
+ .userId(userId)
|
|
|
+ .integralPoints(amount)
|
|
|
+ .afterIntegralPoints(afterIntegralPoints)
|
|
|
+ .practicalIntegralPoints(getHighQuota)
|
|
|
+ .generateUserId(generateUserId)
|
|
|
+ .orderId(tradeOrderId)
|
|
|
+ .orderNo(OrderNum)
|
|
|
+ .integralStatus(integralEnum.getType())
|
|
|
+ .maxAvailablePointsAmount(highQuota)
|
|
|
+ .afterMaxAvailablePointsAmount(integralDO.getHighQuota())
|
|
|
+ .ancestorQuotaAmount(ancestorQuotaAmount)
|
|
|
+ .integralType(integralType)
|
|
|
+ .build();
|
|
|
+ integralChangeLogService.createIntegralChangeLog(changeLog);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void updateIntegralFreezeHighQuota(Long generateUserId, Long userId, CaclEnum caclEnum, Long totalFreezeHighQuota, Long tradeOrderId, String orderNum) {
|
|
|
- IntegralDO integralDO = integralMapper.selectOne(new LambdaQueryWrapper<IntegralDO>().eq(IntegralDO::getUserId, userId));
|
|
|
- integralDO.setFreezeHighQuota(integralDO.getFreezeHighQuota() + totalFreezeHighQuota);
|
|
|
- integralMapper.updateById(integralDO);
|
|
|
+ public void updateUserIntegralByBonus(Long generateUserId, Long userId, IntegralEnum integralEnum, Long amount, Long orderId, String orderNo) {
|
|
|
+ if (amount == null || amount == 0L) return;
|
|
|
+
|
|
|
+ // 用户钱包
|
|
|
+ IntegralDO integralDO = integralMapper.selectOne(new LambdaQueryWrapperX<IntegralDO>().eq(IntegralDO::getUserId, userId));
|
|
|
+ // 参数比例
|
|
|
+ OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
|
|
|
|
|
|
- //记录用户的积分变动日志
|
|
|
- PtProfitLogSaveReqVO profitLogSaveReqVO = PtProfitLogSaveReqVO.builder()
|
|
|
- .freezeHighQuota(totalFreezeHighQuota)
|
|
|
- .afterFreezeHighQuota(integralDO.getFreezeHighQuota())
|
|
|
+ // 记录积分变动日志
|
|
|
+ IntegralChangeLogSaveReqVO yellowChangeLog = IntegralChangeLogSaveReqVO.builder()
|
|
|
+ .integralType(IntegralTypeEnum.YELLOW_INTEGRAL.getType())
|
|
|
.userId(userId)
|
|
|
.generateUserId(generateUserId)
|
|
|
- .profitStatus(caclEnum.getType())
|
|
|
- .orderId(tradeOrderId)
|
|
|
- .orderNo(orderNum)
|
|
|
+ .integralStatus(integralEnum.getType())
|
|
|
+ .orderId(orderId)
|
|
|
+ .orderNo(orderNo)
|
|
|
.build();
|
|
|
- ptProfitLogService.createPtProfitLog(profitLogSaveReqVO);
|
|
|
+ IntegralChangeLogSaveReqVO greenChangeLog = IntegralChangeLogSaveReqVO.builder()
|
|
|
+ .integralType(IntegralTypeEnum.GREEN_INTEGRAL.getType())
|
|
|
+ .userId(userId)
|
|
|
+ .generateUserId(generateUserId)
|
|
|
+ .integralStatus(integralEnum.getType())
|
|
|
+ .orderId(orderId)
|
|
|
+ .orderNo(orderNo)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ String bonusYellowIntegral = orderPercentageDO.getBonusYellowIntegral();
|
|
|
+ String bonusGreenIntegral = orderPercentageDO.getBonusGreenIntegral();
|
|
|
+
|
|
|
+ Long ancestorYellowQuotaAmount = 0L; // 溢出黄积分额度
|
|
|
+ Long ancestorGreenQuotaAmount = 0L; // 溢出绿积分额度
|
|
|
+ Long getYellowHighQuota; // 实得直推奖黄积分
|
|
|
+ Long getGreenHighQuota; // 实得直推奖绿积分
|
|
|
+ if (integralDO.getHighQuota() < amount) {
|
|
|
+ ancestorYellowQuotaAmount = calcIntegral((amount - integralDO.getHighQuota()), bonusYellowIntegral);
|
|
|
+ getYellowHighQuota = calcIntegral(integralDO.getHighQuota(), bonusYellowIntegral);
|
|
|
+
|
|
|
+ ancestorGreenQuotaAmount = calcIntegral((amount - integralDO.getHighQuota()), bonusGreenIntegral);
|
|
|
+ getGreenHighQuota = calcIntegral(integralDO.getHighQuota(), bonusGreenIntegral);
|
|
|
+ } else {
|
|
|
+ getYellowHighQuota = calcIntegral(amount, bonusYellowIntegral);
|
|
|
+
|
|
|
+ getGreenHighQuota = calcIntegral(amount, bonusGreenIntegral);
|
|
|
+ }
|
|
|
+
|
|
|
+ integralDO.setYellowCurrentQuota(integralDO.getYellowCurrentQuota() + getYellowHighQuota);
|
|
|
+ integralDO.setGreenCurrentQuota(integralDO.getGreenCurrentQuota() + getGreenHighQuota);
|
|
|
+ integralDO.setHighQuota(integralDO.getHighQuota() - getYellowHighQuota - getGreenHighQuota);
|
|
|
+ integralDO.setAncestorQuota(integralDO.getAncestorQuota() + getYellowHighQuota + getGreenHighQuota);
|
|
|
+
|
|
|
+ yellowChangeLog
|
|
|
+ .setIntegralPoints(getYellowHighQuota)
|
|
|
+ .setPracticalIntegralPoints(getYellowHighQuota)
|
|
|
+ .setAfterIntegralPoints(integralDO.getYellowCurrentQuota())
|
|
|
+ .setAncestorQuotaAmount(ancestorYellowQuotaAmount)
|
|
|
+ .setMaxAvailablePointsAmount(-getYellowHighQuota)
|
|
|
+ .setAfterMaxAvailablePointsAmount(integralDO.getHighQuota() + getGreenHighQuota);
|
|
|
+
|
|
|
+ greenChangeLog.
|
|
|
+ setIntegralPoints(getGreenHighQuota)
|
|
|
+ .setPracticalIntegralPoints(getGreenHighQuota)
|
|
|
+ .setAfterIntegralPoints(integralDO.getGreenCurrentQuota())
|
|
|
+ .setAncestorQuotaAmount(ancestorGreenQuotaAmount)
|
|
|
+ .setMaxAvailablePointsAmount(-getGreenHighQuota)
|
|
|
+ .setAfterMaxAvailablePointsAmount(integralDO.getHighQuota() + getYellowHighQuota);
|
|
|
+
|
|
|
+ // 修改用户积分
|
|
|
+ integralMapper.updateById(integralDO);
|
|
|
+
|
|
|
+ // 插入积分变动日志
|
|
|
+ integralChangeLogService.createIntegralChangeLogs(Arrays.asList(yellowChangeLog, greenChangeLog));
|
|
|
+
|
|
|
+ // 用户获得直推奖后要扣除平台的余额
|
|
|
+ if (getYellowHighQuota + getGreenHighQuota > 0) {
|
|
|
+ PtProfitDO ptProfitDO = ptProfitMapper.selectList().get(0);
|
|
|
+ ptProfitDO.setPtGrossAdd(ptProfitDO.getPtGrossAdd() - getYellowHighQuota - getGreenHighQuota);
|
|
|
+ ptProfitDO.setPtTotalAdd(ptProfitDO.getPtTotalAdd() - getYellowHighQuota - getGreenHighQuota);
|
|
|
+
|
|
|
+ PtProfitLogSaveReqVO ptProfitLog = PtProfitLogSaveReqVO.builder()
|
|
|
+ .profitStatus(integralEnum.getType())
|
|
|
+ .profitType(ProfitTypeEnum.PT_PROFIT.getType())
|
|
|
+ .amount(-(getYellowHighQuota + getGreenHighQuota))
|
|
|
+ .afterAmount(ptProfitDO.getPtGrossAdd())
|
|
|
+ .orderId(orderId)
|
|
|
+ .orderNo(orderNo)
|
|
|
+ .generateUserId(userId)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ ptProfitMapper.updateById(ptProfitDO);
|
|
|
+ ptProfitLogService.createPtProfitLog(ptProfitLog);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算积分
|
|
|
+ * @param amount 值
|
|
|
+ * @param bonusIntegral 比例
|
|
|
+ * @return 值
|
|
|
+ */
|
|
|
+ private Long calcIntegral(Long amount, String bonusIntegral) {
|
|
|
+ return (long) (amount * Double.parseDouble(bonusIntegral));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void updateUserIntegral(Long userId, CaclEnum caclEnum, Long payIntegral, Long tradeOrderId, String orderNum) {
|
|
|
//退还订单支付过期积分
|
|
|
IntegralDO integralDO = integralMapper.selectOne(new LambdaQueryWrapper<IntegralDO>().eq(IntegralDO::getUserId, userId));
|
|
|
- integralDO.setCurrentQuota(integralDO.getCurrentQuota() + payIntegral);
|
|
|
+ integralDO.setRedCurrentQuota(integralDO.getRedCurrentQuota() + payIntegral);
|
|
|
|
|
|
integralMapper.updateById(integralDO);
|
|
|
|
|
|
- ptProfitLogService.addMessage(userId,userId,caclEnum,payIntegral,integralDO.getCurrentQuota(),0L,0L,null,tradeOrderId,orderNum);
|
|
|
+ ptProfitLogService.addMessage(userId, userId, caclEnum, payIntegral, integralDO.getRedCurrentQuota(), 0L, 0L, null, tradeOrderId, orderNum);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void updateUserConsumptionPoints(Long userId, ConsumptionEnum consumptionEnum, Long consumptionPoints, Long orderId, String orderNum) {
|
|
|
- IntegralDO integralDO = integralMapper.selectOne(IntegralDO::getUserId, userId);
|
|
|
+ public Boolean quotaTransition(IntegralTransitionRespVO respVO) {
|
|
|
+ Long userId = getLoginUserId();
|
|
|
+ DuserDO duser = duserService.getDuserByUser(userId);
|
|
|
|
|
|
- // 修改用户消费积分
|
|
|
- integralDO.setConsumptionPoints(integralDO.getConsumptionPoints() + consumptionPoints);
|
|
|
- integralMapper.updateById(integralDO);
|
|
|
+ // 获取用户信息并检查支付密码
|
|
|
+ MemberUserDO user = memberUserService.getUser(userId);
|
|
|
+ if (user.getPayPassword() == null || user.getPayPassword().isEmpty()) {
|
|
|
+ throw exception(USER_NOT_PAY_PASSWORD);
|
|
|
+ }
|
|
|
|
|
|
- consumptionChangeLogService.createConsumptionChangeLog(
|
|
|
- ConsumptionChangeLogSaveReqVO.builder()
|
|
|
- .userId(userId)
|
|
|
- .generateUserId(userId)
|
|
|
- .consumptionStatus(consumptionEnum.getType())
|
|
|
- .consumptionPoints(consumptionPoints)
|
|
|
- .afterConsumptionPoints(integralDO.getConsumptionPoints())
|
|
|
- .orderId(orderId)
|
|
|
- .orderNo(orderNum)
|
|
|
- .build());
|
|
|
- }
|
|
|
+ // 支付密码错误
|
|
|
+ if (!passwordEncoder.matches(respVO.getPayPassword(), user.getPayPassword())) {
|
|
|
+ throw exception(USER_PAY_PASS_WORD_ERROR);
|
|
|
+ }
|
|
|
|
|
|
- @Override
|
|
|
- public Boolean quotaTransition(Long quota) {
|
|
|
- Long userId = getLoginUserId();
|
|
|
+ // 转换倍率
|
|
|
+ OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
|
|
|
|
|
|
// 输入的佣金要放大才能与数据库中匹配
|
|
|
- quota = quota * DistriConstants.INTEGRAL_PAGE2DB;
|
|
|
- IntegralDO integralDO = integralMapper.selectOne(IntegralDO::getUserId,userId);
|
|
|
-
|
|
|
- if(integralDO.getCurrentQuota() < quota){
|
|
|
- ErrorCode ERROR = new ErrorCode(1_002_030_003, "可用积分不足");
|
|
|
- throw exception(ERROR);
|
|
|
+ respVO.setQuota(respVO.getQuota() * DistriConstants.INTEGRAL_PAGE2DB);
|
|
|
+
|
|
|
+ // 变动积分
|
|
|
+ Long practicalConsumptionPoints = 0L;
|
|
|
+ // 变动积分剩余
|
|
|
+ Long afterIntegralPoints = 0L;
|
|
|
+ // 增加积分剩余
|
|
|
+ Long afterAddIntegralPoints = 0L;
|
|
|
+ IntegralDO integralDO = integralMapper.selectOne(IntegralDO::getUserId, userId);
|
|
|
+ Integer integralStatus = 0;
|
|
|
+
|
|
|
+ // 确定转账类型
|
|
|
+ switch (respVO.getIntegralType()) {
|
|
|
+ case 1: //红转绿
|
|
|
+ // 身份校验
|
|
|
+ if (duser.getCategoryId().equals(1L) || duser.getCategoryId().equals(2L))
|
|
|
+ throw exception(USER_IS_NOT_AGENT);
|
|
|
+
|
|
|
+ // 存量校验
|
|
|
+ verifyIntegral(integralDO.getRedCurrentQuota(), respVO.getQuota());
|
|
|
+
|
|
|
+ integralDO.setRedCurrentQuota(integralDO.getRedCurrentQuota() - respVO.getQuota());
|
|
|
+ practicalConsumptionPoints = (long) (respVO.getQuota() * Double.parseDouble(orderPercentageDO.getAgentRedTransitionGreen()));
|
|
|
+ integralDO.setGreenCurrentQuota(integralDO.getGreenCurrentQuota() + practicalConsumptionPoints);
|
|
|
+ afterIntegralPoints = integralDO.getRedCurrentQuota();
|
|
|
+ afterAddIntegralPoints = integralDO.getGreenCurrentQuota();
|
|
|
+
|
|
|
+ integralStatus = IntegralEnum.RED_INTEGRAL_TRANSITION_GREEN_INTEGRAL.getType();
|
|
|
+ break;
|
|
|
+ case 2: //黄转红
|
|
|
+ verifyIntegral(integralDO.getYellowCurrentQuota(), respVO.getQuota());
|
|
|
+
|
|
|
+ integralDO.setYellowCurrentQuota(integralDO.getYellowCurrentQuota() - respVO.getQuota());
|
|
|
+ if (duser.getCategoryId().equals(1L) || duser.getCategoryId().equals(2L)) { //普通用户和会员
|
|
|
+ practicalConsumptionPoints = (long) (respVO.getQuota() * Double.parseDouble(orderPercentageDO.getMemberYellowTransitionRed()));
|
|
|
+ } else { // 代理商
|
|
|
+ practicalConsumptionPoints = (long) (respVO.getQuota() * Double.parseDouble(orderPercentageDO.getAgentYellowTransitionRed()));
|
|
|
+ }
|
|
|
+ integralDO.setRedCurrentQuota(integralDO.getRedCurrentQuota() + practicalConsumptionPoints);
|
|
|
+ afterIntegralPoints = integralDO.getYellowCurrentQuota();
|
|
|
+ afterAddIntegralPoints = integralDO.getRedCurrentQuota();
|
|
|
+
|
|
|
+ integralStatus = IntegralEnum.YELLOW_INTEGRAL_TRANSITION_RED_INTEGRAL.getType();
|
|
|
+ break;
|
|
|
+ // 目前没有绿积分转换
|
|
|
}
|
|
|
|
|
|
- integralDO.setCurrentQuota(integralDO.getCurrentQuota() - quota);
|
|
|
- integralDO.setConsumptionPoints(integralDO.getConsumptionPoints() + quota);
|
|
|
integralMapper.updateById(integralDO);
|
|
|
|
|
|
- consumptionChangeLogService.createConsumptionChangeLog(
|
|
|
- ConsumptionChangeLogSaveReqVO.builder()
|
|
|
+ // 记录扣减变动日志
|
|
|
+ integralChangeLogService.createIntegralChangeLog(
|
|
|
+ IntegralChangeLogSaveReqVO.builder()
|
|
|
.userId(userId)
|
|
|
- .consumptionStatus(ConsumptionEnum.COMMISSION_TRANSITION.getType())
|
|
|
- .consumptionPoints(quota)
|
|
|
- .afterConsumptionPoints(integralDO.getConsumptionPoints())
|
|
|
+ .integralStatus(integralStatus)
|
|
|
+ .integralPoints(-respVO.getQuota())
|
|
|
+ .practicalIntegralPoints(-respVO.getQuota())
|
|
|
+ .afterIntegralPoints(afterIntegralPoints)
|
|
|
+ .integralType(respVO.getIntegralType())
|
|
|
+ .generateUserId(userId)
|
|
|
.build());
|
|
|
|
|
|
- ptProfitLogService.createPtProfitLog(
|
|
|
- PtProfitLogSaveReqVO.builder()
|
|
|
- .amount(-quota)
|
|
|
- .afterAmount(integralDO.getCurrentQuota())
|
|
|
+ // 记录增加变动日志
|
|
|
+ integralChangeLogService.createIntegralChangeLog(
|
|
|
+ IntegralChangeLogSaveReqVO.builder()
|
|
|
.userId(userId)
|
|
|
+ .integralStatus(integralStatus)
|
|
|
+ .integralPoints(respVO.getQuota())
|
|
|
+ .practicalIntegralPoints(practicalConsumptionPoints)
|
|
|
+ .afterIntegralPoints(afterAddIntegralPoints)
|
|
|
+ .integralType(Objects.equals(respVO.getIntegralType(), IntegralTypeEnum.RED_INTEGRAL.getType()) ?
|
|
|
+ IntegralTypeEnum.GREEN_INTEGRAL.getType() : IntegralTypeEnum.RED_INTEGRAL.getType())
|
|
|
.generateUserId(userId)
|
|
|
- .profitStatus(CaclEnum.COMMISSION_TRANSITION.getType())
|
|
|
.build());
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public Boolean updateUserConsumptionPoints(Long generateUserId, Long userId, Long amount, Long tradeOrderId, String orderNum) {
|
|
|
- IntegralDO integralDO = integralMapper.selectOne(IntegralDO::getUserId, userId);
|
|
|
- // 消费分不足
|
|
|
- if(integralDO.getConsumptionPoints() < amount){
|
|
|
- return false;
|
|
|
+ /**
|
|
|
+ * 校验用户积分是否充足
|
|
|
+ *
|
|
|
+ * @param userIntegral 用户积分
|
|
|
+ * @param transitionIntegral 转换积分
|
|
|
+ */
|
|
|
+ private void verifyIntegral(Long userIntegral, Long transitionIntegral) {
|
|
|
+ if (userIntegral < transitionIntegral) {
|
|
|
+ throw exception(USER_INTEGRAL_LESS_TRANSITION_INTEGRAL);
|
|
|
}
|
|
|
-
|
|
|
- // 修改用户消费积分
|
|
|
- integralDO.setConsumptionPoints(integralDO.getConsumptionPoints() - amount);
|
|
|
- integralMapper.updateById(integralDO);
|
|
|
-
|
|
|
- consumptionChangeLogService.createConsumptionChangeLog(
|
|
|
- ConsumptionChangeLogSaveReqVO.builder()
|
|
|
- .userId(userId)
|
|
|
- .generateUserId(generateUserId)
|
|
|
- .consumptionStatus(ConsumptionEnum.PAY_ORDER.getType())
|
|
|
- .consumptionPoints(-amount)
|
|
|
- .afterConsumptionPoints(integralDO.getConsumptionPoints())
|
|
|
- .orderId(tradeOrderId)
|
|
|
- .orderNo(orderNum)
|
|
|
- .build());
|
|
|
-
|
|
|
- return true;
|
|
|
}
|
|
|
}
|