diff --git a/src/main/java/com/sqx/common/utils/RedisUtils.java b/src/main/java/com/sqx/common/utils/RedisUtils.java index 6a7914c1..6761c2e6 100644 --- a/src/main/java/com/sqx/common/utils/RedisUtils.java +++ b/src/main/java/com/sqx/common/utils/RedisUtils.java @@ -1,5 +1,6 @@ package com.sqx.common.utils; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.sqx.modules.redisService.RedisService; @@ -10,12 +11,14 @@ import org.springframework.stereotype.Component; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.concurrent.TimeUnit; /** * Redis工具类 - * */ @Component public class RedisUtils { @@ -33,19 +36,31 @@ public class RedisUtils { private SetOperations setOperations; @Autowired private ZSetOperations zSetOperations; - /** 默认过期时长,单位:秒 */ + /** + * 默认过期时长,单位:秒 + */ public final static long DEFAULT_EXPIRE = 60 * 60 * 24; - /** 不设置过期时长 */ + /** + * 不设置过期时长 + */ public final static long NOT_EXPIRE = -1; private final static Gson Gson = new Gson(); - /** - * 获取缓存里的数据 如果不存在 则插入 并返回 - * @param key redis Key - * @param clazz 返回类型 - * @param method RedisService调用的方法名 如果数据不存在会执行该调用方法 - */ - public List getListData(String key, Class clazz,String method) { + + public Map> getMapData(String key, String method, Class clazz) { + String jsonStr = getDate(key, method); + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode jsonNode = objectMapper.readTree(jsonStr); + + return jsonNodeToMap(jsonNode, clazz); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public List getListData(String key, Class clazz, String method) { String jsonStr = getDate(key, method); ObjectMapper objectMapper = new ObjectMapper(); try { @@ -59,26 +74,27 @@ public class RedisUtils { /** * 获取缓存里的数据 如果不存在 则插入 并返回 - * @param key redis Key - * @param clazz 返回类型 + * + * @param key redis Key + * @param clazz 返回类型 * @param method RedisService调用的方法名 如果数据不存在会执行该调用方法 */ - public T getObjectDate(String key, Class clazz,String method) { + public T getObjectDate(String key, Class clazz, String method) { String jsonStr = getDate(key, method); return this.fromJson(jsonStr, clazz); } - public String getDate(String key, String method) { + public String getDate(String key, String method) { if (!this.hasKey(key)) { try { // 获取Lookup对象 MethodHandles.Lookup lookup = MethodHandles.lookup(); // 构建方法类型(这里假设方法无参数,返回类型为void) - MethodType methodType = MethodType.methodType(void.class , String.class); + MethodType methodType = MethodType.methodType(void.class, String.class); // 获取方法句柄 MethodHandle methodHandle = lookup.findVirtual(redisService.getClass(), method, methodType); // 调用方法句柄 - methodHandle.invoke(redisService,key); + methodHandle.invoke(redisService, key); } catch (Exception e) { e.printStackTrace(); return null; @@ -93,9 +109,9 @@ public class RedisUtils { return redisTemplate.hasKey(key); } - public void set(String key, Object value, long expire){ + public void set(String key, Object value, long expire) { valueOperations.set(key, toJson(value)); - if(expire != NOT_EXPIRE){ + if (expire != NOT_EXPIRE) { redisTemplate.expire(key, expire, TimeUnit.SECONDS); } @@ -114,13 +130,13 @@ public class RedisUtils { } - public void set(String key, Object value){ + public void set(String key, Object value) { set(key, value, DEFAULT_EXPIRE); } public T get(String key, Class clazz, long expire) { String value = valueOperations.get(key); - if(expire != NOT_EXPIRE){ + if (expire != NOT_EXPIRE) { redisTemplate.expire(key, expire, TimeUnit.SECONDS); } return value == null ? null : fromJson(value, clazz); @@ -132,7 +148,7 @@ public class RedisUtils { public String get(String key, long expire) { String value = valueOperations.get(key); - if(expire != NOT_EXPIRE){ + if (expire != NOT_EXPIRE) { redisTemplate.expire(key, expire, TimeUnit.SECONDS); } return value; @@ -164,9 +180,9 @@ public class RedisUtils { /** * Object转成JSON数据 */ - private String toJson(Object object){ - if(object instanceof Integer || object instanceof Long || object instanceof Float || - object instanceof Double || object instanceof Boolean || object instanceof String){ + private String toJson(Object object) { + if (object instanceof Integer || object instanceof Long || object instanceof Float || + object instanceof Double || object instanceof Boolean || object instanceof String) { return String.valueOf(object); } return Gson.toJson(object); @@ -175,7 +191,25 @@ public class RedisUtils { /** * JSON数据,转成Object */ - private T fromJson(String json, Class clazz){ + private T fromJson(String json, Class clazz) { return Gson.fromJson(json, clazz); } + + + public Map> jsonNodeToMap(JsonNode jsonNode, Class clazz) { + Map> resultMap = new HashMap<>(); + ObjectMapper objectMapper = new ObjectMapper(); + + if (jsonNode.isObject()) { + // 获取字段名(也就是键)的迭代器 + Iterator fieldNames = jsonNode.fieldNames(); + while (fieldNames.hasNext()) { + String key = fieldNames.next(); + JsonNode elementNode = jsonNode.get(key); + resultMap.put(key, objectMapper.convertValue(elementNode, + objectMapper.getTypeFactory().constructCollectionType(List.class, clazz))); + } + } + return resultMap; + } } diff --git a/src/main/java/com/sqx/modules/app/controller/app/AppController.java b/src/main/java/com/sqx/modules/app/controller/app/AppController.java index 1dd37c5f..7ff8f36d 100644 --- a/src/main/java/com/sqx/modules/app/controller/app/AppController.java +++ b/src/main/java/com/sqx/modules/app/controller/app/AppController.java @@ -81,7 +81,7 @@ public class AppController { .eq("zhi_fu_bao", zhiFuBao)); if (count > 0) { - return Result.error("一个支付宝账号仅可绑定一个支付宝用户"); + return Result.error("一个支付宝账号仅可绑定一个用户"); } if (!ApiAccessLimitUtil.isAccessAllowed(userId.toString(), "updateZFB", 3, "month")) { return Result.error("每月仅支持修改三次,请联系管理员"); diff --git a/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java b/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java index 17a246d8..320a10ed 100644 --- a/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java +++ b/src/main/java/com/sqx/modules/discSpinning/controller/DiscSpinningController.java @@ -151,10 +151,10 @@ public class DiscSpinningController { public Result draw(@ApiIgnore @RequestAttribute("userId") Long userId, @Nullable @ApiIgnore @RequestBody Map maps) { double amount = 0; Long orderId = null; + Integer i = recordService.countDraw(userId); if (maps == null || !maps.containsKey("source") || !"task".equals(maps.get("source"))) { //任务抽奖 int drawCount = Integer.parseInt(commonRepository.findOne(901).getValue()); - Integer i = recordService.countDraw(userId); if (i != null && i >= drawCount) { return Result.error("当日可抽奖次数已超限"); } @@ -166,7 +166,7 @@ public class DiscSpinningController { } } return new Result().put("data", - discSpinningService.draws(amount, orderId, userId, maps == null || maps.get("source") == null ? "order" : maps.get("source").toString())); + discSpinningService.draws(i == null ? 1 : i + 1, amount, orderId, userId, maps == null || maps.get("source") == null ? "order" : maps.get("source").toString())); } @ApiOperation("大转盘奖项领取") diff --git a/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningAmount.java b/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningAmount.java index 2c1ea319..12ada871 100644 --- a/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningAmount.java +++ b/src/main/java/com/sqx/modules/discSpinning/entity/DiscSpinningAmount.java @@ -18,6 +18,8 @@ import lombok.Data; public class DiscSpinningAmount extends Model { @ApiModelProperty("主键id") private Long id; + @ApiModelProperty("从第几次开始变化") + private Integer num; @ApiModelProperty("描述") private String name; @ApiModelProperty("0-1 小于 多少为该奖励") diff --git a/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java b/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java index 00475220..0823efc6 100644 --- a/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java +++ b/src/main/java/com/sqx/modules/discSpinning/service/DiscSpinningService.java @@ -8,7 +8,7 @@ import com.sqx.modules.discSpinning.entity.DiscSpinningRecord; public interface DiscSpinningService extends IService { //抽奖 - DiscSpinningRecord draws(double orderAmount, Long orderId, Long userId, String source); + DiscSpinningRecord draws(int drawCount, double orderAmount, Long orderId, Long userId, String source); //领奖 void receiveAsync(DiscSpinningRecord receive); diff --git a/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java index 23b075e2..ec8d1f9d 100644 --- a/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java +++ b/src/main/java/com/sqx/modules/discSpinning/service/impl/DiscSpinningServiceImpl.java @@ -33,10 +33,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Random; +import java.util.*; @Service public class DiscSpinningServiceImpl extends ServiceImpl implements DiscSpinningService { @@ -125,11 +122,11 @@ public class DiscSpinningServiceImpl extends ServiceImpl prizes = baseMapper.selectList(new QueryWrapper().eq("disc_type", "order".equals(source) ? 1 : 2).orderByAsc("odds")); @@ -153,7 +150,14 @@ public class DiscSpinningServiceImpl extends ServiceImpl amounts = redisUtils.getListData(RedisKeys.getDateKey("spinning:amount"), DiscSpinningAmount.class, "setDiscSpinningAmounts"); + List amounts = new ArrayList<>(); + Map> amountMaps = redisUtils.getMapData(RedisKeys.getDateKey("spinning:amount"), "setDiscSpinningAmounts", DiscSpinningAmount.class); + for (int i = drawCount; i >= 0; i--) { + if (amountMaps.containsKey(i + "")) { + amounts = amountMaps.get(i + ""); + break; + } + } for (DiscSpinning prize : prizes) { if (randomNum.compareTo(prize.getNumber()) < 0) { if (prize.getType() == 2) { diff --git a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java index 6378726b..c25b7b8f 100644 --- a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java +++ b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java @@ -2,7 +2,6 @@ package com.sqx.modules.redisService.impl; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.sqx.common.utils.RedisKeys; import com.sqx.common.utils.RedisUtils; @@ -14,8 +13,10 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.Date; -import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Service public class RedisServiceImpl implements RedisService { @Lazy @@ -27,7 +28,11 @@ public class RedisServiceImpl implements RedisService { @Override public void setDiscSpinningAmounts(String key) { List amounts = amountService.list(new QueryWrapper().eq("status", 1).orderByAsc("max_amount")); - redisUtils.set(key, amounts); + Map> map = + amounts.stream().collect(Collectors.groupingBy( + disc -> disc.getNum() == null ? 0 : disc.getNum() + )); + redisUtils.set(key, map); } @Override