用户等级-等级与计算

This commit is contained in:
khalil
2025-06-06 17:40:00 +08:00
parent 36c3555832
commit 6a96512d93
14 changed files with 333 additions and 1 deletions

View File

@@ -0,0 +1,57 @@
package com.accompany.payment.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
@ApiModel
@TableName("user_recharge_level")
public class UserRechargeLevel {
/**
* 用户UID
*/
@TableId(type = IdType.NONE)
@ApiModelProperty("用户UID")
private Long uid;
@ApiModelProperty("等级")
@TableField("`level`")
private String level;
@ApiModelProperty("总充值金币")
private BigDecimal totalGold;
@ApiModelProperty("充值金币")
private BigDecimal rechargeGold;
@ApiModelProperty("受转赠金币")
private BigDecimal giveGold;
@ApiModelProperty("近60天总充值金币")
@TableField("`last_60_total_gold`")
private BigDecimal last60TotalGold;
@ApiModelProperty("近60天充值金币")
@TableField("`last_60_recharge_gold`")
private BigDecimal last60RechargeGold;
@ApiModelProperty("近60天受转赠金币")
@TableField("`last_60_give_gold`")
private BigDecimal last60GiveGold;
/**
* 更新时间
*/
@ApiModelProperty("更新时间")
private Date updateTime;
}

View File

@@ -0,0 +1,36 @@
package com.accompany.payment.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel
@TableName("user_recharge_level_config")
public class UserRechargeLevelConfig {
/**
* 等级
*/
@TableId(value = "`level`")
private String level;
@ApiModelProperty("代理用户默认等级")
private Boolean rechargeUserDefault;
@ApiModelProperty("总充值金额")
private BigDecimal goldThreshold;
@ApiModelProperty("充值金额")
@TableField("last_60_gold_threshold")
private BigDecimal last60GoldThreshold;
@ApiModelProperty("remark")
private String remark;
}

View File

@@ -67,6 +67,7 @@ public interface ChargeRecordMapperMgr {
@Param("endTime") Date endTime);
BigDecimal getUserChargeGold(@Param("uid") Long uid);
BigDecimal getUserLast60ChargeGold(@Param("uid") Long uid);
Long getHistoryRechargeAmountByChannel(@Param("userId") long userId, @Param("channel") String channel);

View File

@@ -0,0 +1,10 @@
package com.accompany.payment.mapper;
import com.accompany.payment.model.UserRechargeLevelConfig;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserRechargeLevelConfigMapper extends BaseMapper<UserRechargeLevelConfig> {
}

View File

@@ -0,0 +1,19 @@
package com.accompany.payment.mapper;
import com.accompany.payment.model.UserRechargeLevel;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.Date;
@Mapper
public interface UserRechargeLevelMapper extends BaseMapper<UserRechargeLevel> {
void saveOrUpdate(@Param("uid") Long uid, @Param("level") String level,
@Param("totalGold") BigDecimal totalGold, @Param("rechargeGold")BigDecimal rechargeGold, @Param("giveGold")BigDecimal giveGold,
@Param("last60TotalGold")BigDecimal last60Gold, @Param("last60RechargeGold")BigDecimal last60RechargeGold, @Param("last60GiveGold")BigDecimal last60GiveGold,
@Param("updateTime")Date updateTime);
}

View File

@@ -0,0 +1,37 @@
package com.accompany.payment.service;
import com.accompany.payment.mapper.UserRechargeLevelConfigMapper;
import com.accompany.payment.model.UserRechargeLevelConfig;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.List;
@Service
public class UserRechargeLevelConfigService extends ServiceImpl<UserRechargeLevelConfigMapper, UserRechargeLevelConfig> {
@Autowired
private RechargeUserService rechargeUserService;
public String calLevel(Long uid, BigDecimal totalGold, BigDecimal last60TotalGold){
List<UserRechargeLevelConfig> levelList = lambdaQuery()
.orderByDesc(UserRechargeLevelConfig::getGoldThreshold, UserRechargeLevelConfig::getLast60GoldThreshold).list();
if (CollectionUtils.isEmpty(levelList)){
return null;
}
boolean isRechargeUser = rechargeUserService.isRechargeUser(uid);
for (UserRechargeLevelConfig level : levelList){
if (level.getRechargeUserDefault() && isRechargeUser){
return level.getLevel();
} else if (totalGold.compareTo(level.getGoldThreshold()) >= 0 && last60TotalGold.compareTo(level.getLast60GoldThreshold()) >= 0) {
return level.getLevel();
}
}
return null;
}
}

View File

@@ -0,0 +1,57 @@
package com.accompany.payment.service;
import com.accompany.core.model.Users;
import com.accompany.core.service.user.UsersBaseService;
import com.accompany.payment.mapper.ChargeRecordMapperMgr;
import com.accompany.payment.mapper.UserRechargeLevelMapper;
import com.accompany.payment.model.UserRechargeLevel;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
@Service
public class UserRechargeLevelService extends ServiceImpl<UserRechargeLevelMapper, UserRechargeLevel> {
@Autowired
private UsersBaseService usersBaseService;
@Autowired
private UserRechargeLevelConfigService highRechargeLevelService;
@Autowired
private ChargeRecordMapperMgr chargeRecordMapperMgr;
public void statistics(Long uid, BigDecimal totalReceiveGoldNum, BigDecimal last60TotalReceiveGoldNum) {
Users u = usersBaseService.getUsersByUid(uid);
if (null == u){
return;
}
BigDecimal totalChargeGold = chargeRecordMapperMgr.getUserChargeGold(uid);
if (null == totalChargeGold){
totalChargeGold = BigDecimal.ZERO;
}
BigDecimal last60ChargeGold = chargeRecordMapperMgr.getUserLast60ChargeGold(uid);
if (null == last60ChargeGold){
last60ChargeGold = BigDecimal.ZERO;
}
if (null == totalReceiveGoldNum){
totalReceiveGoldNum = BigDecimal.ZERO;
}
if (null == last60TotalReceiveGoldNum){
last60TotalReceiveGoldNum = BigDecimal.ZERO;
}
BigDecimal total = totalChargeGold.add(totalReceiveGoldNum);
BigDecimal last60Total = last60ChargeGold.add(last60TotalReceiveGoldNum);
String level = highRechargeLevelService.calLevel(uid ,total, last60Total);
getBaseMapper().saveOrUpdate(uid, level,
total, totalChargeGold, totalReceiveGoldNum, last60Total, last60ChargeGold, last60TotalReceiveGoldNum, new Date());
}
}

View File

@@ -348,8 +348,14 @@
<select id="getUserChargeGold" resultType="java.math.BigDecimal">
select sum(total_gold) from charge_record
where charge_status in (2,6) and channel not in ('exchange')
where charge_status in (2)
and uid = #{uid}
</select>
<select id="getUserLast60ChargeGold" resultType="java.math.BigDecimal">
select sum(total_gold) from charge_record
where charge_status in (2)
and uid = #{uid} and create_time &gt;= DATE_FORMAT(adddate(now(), -60), '%Y-%m-%d 00:00:00')
</select>
</mapper>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.accompany.payment.mapper.UserRechargeLevelConfigMapper">
</mapper>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.accompany.payment.mapper.UserRechargeLevelMapper">
<update id="saveOrUpdate">
insert into user_recharge_level(`uid`, `level`, `total_gold`, `recharge_gold`, `give_gold`,
`last_60_total_gold`, `last_60_recharge_gold`, `last_60_give_gold`, `update_time`)
values (#{uid}, #{level}, #{totalGold}, #{rechargeGold}, #{giveGold}, #{last60TotalGold}, #{last60RechargeGold}, #{last60GiveGold}, #{updateTime})
ON DUPLICATE KEY UPDATE
`level` = values(`level`),
`total_gold` = GREATEST(`total_gold`, values(`total_gold`)),
`recharge_gold` = GREATEST(`recharge_gold`, values(`recharge_gold`)),
`give_gold` = GREATEST(`give_gold`, values(`give_gold`)),
`last_60_total_gold` = values(`last_60_total_gold`),
`last_60_recharge_gold` = values(`last_60_recharge_gold`),
`last_60_give_gold` = values(`last_60_give_gold`),
`update_time` = values(`update_time`)
</update>
</mapper>