From d51639d2352b5a0d9e434a6d0356f9f48ca19969 Mon Sep 17 00:00:00 2001
From: hjl <1657978663@qq.com>
Date: 星期三, 19 六月 2024 10:53:31 +0800
Subject: [PATCH] fix: 家长端商城兑换bug;学习端默认登录验证码
---
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java | 6 +
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java | 45 +++++++++++---
ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java | 40 ++++++++++---
ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java | 77 ++++++++++++++-----------
4 files changed, 111 insertions(+), 57 deletions(-)
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java
index e806e35..87d6a62 100644
--- a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/TGoodsController.java
@@ -659,7 +659,11 @@
// 商品分类详情
List<TGoodsType> goodsTypes = goodsTypeService.lambdaQuery().in(TGoodsType::getId, Arrays.asList(goods.getTypeIds().split(","))).list();
// 已兑换人数
- int number = goods.getBasicCount() + orderService.getGoodBuyNumber(goods.getId());
+ int number = 0;
+ if (null != goods.getBasicCount()) {
+ number += goods.getBasicCount();
+ }
+ number += orderService.getGoodBuyNumber(goods.getId());
return R.ok(new GoodDetailVO(goods, goodsTypes, number));
}
diff --git a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java
index 8f7ad85..d707363 100644
--- a/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java
+++ b/ruoyi-service/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/TGoodsServiceImpl.java
@@ -164,46 +164,53 @@
return R.exchangeError("商品不存在,请稍后重试!");
}
// 校验用户积分是否足够兑换
- if (tokenService.getLoginUser1() == null) {
- return R.tokenError("登录失效");
+ UserPersonalCenterVO userPersonalCenter = studyClient.userInfo().getData();
+ if (null == userPersonalCenter) {
+ throw new GlobalException("用户信息获取失败!");
}
- TUser user = studyClient.getUserById(tokenService.getLoginUser1().getUserid()).getData();
-
+ TUser user = userPersonalCenter.getUser();
int needIntegral = good.getIntegral() * number;
if (user.getIntegral() < needIntegral) {
return R.exchangeError("兑换失败,当前剩余积分不足!");
}
- // 检查用户兑换数量是否超过单用户最大兑换数量
- List<TOrder> orderList = orderService.lambdaQuery().eq(TOrder::getUserId, user.getId()).eq(TOrder::getGoodsId, goodId).list();
- // 该商品订单为空、订单数量未超过商品的单个用户兑换上限数量时,可以进行兑换
- int totalNumber = orderList.stream().map(TOrder::getCount).collect(Collectors.toList()).stream().mapToInt(Integer::intValue).sum();
- boolean canExchange = orderList.isEmpty() || null == good.getUserCount() || (totalNumber + number) <= good.getUserCount();
- if (!canExchange) {
- return R.exchangeError("兑换失败,当前兑换数量已超过最大兑换数量,剩余兑换数量为: " + (good.getUserCount() - totalNumber) + "!");
- }
- // redisson分布式锁,防止超卖
- String key = String.format(RedisConstants.GOOD_STOCK, good.getId());
- RSemaphore semaphore = redissonClient.getSemaphore(key);
- // 请求超时时间 单位:毫秒
- semaphore.trySetPermits(1000);
- boolean tried = semaphore.tryAcquire(number);
- // 兑换失败,库存不足
- if (!tried) {
- semaphore.release(number);
- return R.exchangeError("当前商品库存不足");
- }
- // 兑换成功,生成订单信息、生成积分明细(积分明细需要远程调用rouyi-study服务)
- TOrder order = orderInfo1(goodExchange, recipient, number, goodId, needIntegral);
- boolean result = orderService.save(order);
- // 远程调用,生成积分明细
- result = result && studyClient.addIntegralDetail1(Constants.BURDEN + needIntegral, Constants.SHOPPING_CONSUME).getData();
- // 扣除用户积分
- result = result && studyClient.exchangeIntegral1(needIntegral, Constants.BURDEN).getData();
- // 扣除库存
- result = result && this.lambdaUpdate().set(TGoods::getSurplus, good.getSurplus() - number).eq(TGoods::getId, good.getId()).update();
- if (!result) {
- semaphore.release(number);
- return R.exchangeError("商品兑换失败!");
+ if (null != good.getTotal()) {
+ // 检查用户兑换数量是否超过单用户最大兑换数量
+ List<TOrder> orderList = orderService.lambdaQuery().eq(TOrder::getUserId, user.getId())
+ .eq(TOrder::getGoodsId, goodId).list();
+ // 该商品订单为空、订单数量未超过商品的单个用户兑换上限数量时,可以进行兑换
+ int totalNumber = orderList.stream().map(TOrder::getCount).collect(Collectors.toList())
+ .stream().mapToInt(Integer::intValue).sum();
+ boolean canExchange = orderList.isEmpty() || null == good.getUserCount() ||
+ (totalNumber + number) <= good.getUserCount();
+ if (!canExchange) {
+ return R.exchangeError("兑换失败,当前兑换数量已超过最大兑换数量,剩余兑换数量为: " +
+ (good.getUserCount() - totalNumber) + "!");
+ }
+ // redisson分布式锁,防止超卖
+ String key = String.format(RedisConstants.GOOD_STOCK, good.getId());
+ RSemaphore semaphore = redissonClient.getSemaphore(key);
+ // 请求超时时间 单位:毫秒
+ semaphore.trySetPermits(1000);
+ boolean tried = semaphore.tryAcquire(number);
+ // 兑换失败,库存不足
+ if (!tried) {
+ semaphore.release(number);
+ return R.exchangeError("当前商品库存不足");
+ }
+ // 兑换成功,生成订单信息、生成积分明细(积分明细需要远程调用rouyi-study服务)
+ boolean result = exchangeGood(goodExchange, recipient, number, goodId, needIntegral);
+ // 扣除库存
+ result = result && this.lambdaUpdate().set(TGoods::getTotal, good.getTotal() - number)
+ .eq(TGoods::getId, good.getId()).update();
+ if (!result) {
+ semaphore.release(number);
+ return R.exchangeError("商品兑换失败!");
+ }
+ } else {
+ boolean result = exchangeGood(goodExchange, recipient, number, goodId, needIntegral);
+ if (!result) {
+ return R.exchangeError("商品兑换失败!");
+ }
}
return R.ok();
}
diff --git a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
index e2a8419..490c673 100644
--- a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
+++ b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TStudyController.java
@@ -711,14 +711,28 @@
if (null == loginStudy) {
return R.tokenError("登录失效!");
}
- TUserStudy result = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, loginStudy.getUserid())
+ Integer userid = loginStudy.getUserid();
+ TUserStudy studyRecord = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, loginStudy.getUserid())
.eq(TUserStudy::getDisabled, 0).one();
- if (null != result) {
+ if (null != studyRecord) {
// 计算当前周 day 1-5的总进度
- int computeSchedule = studyService.computeSchedule(result, week);
- result.setComputeSchedule(computeSchedule);
+ int computeSchedule = studyService.computeSchedule(studyRecord, week);
+ studyRecord.setComputeSchedule(computeSchedule);
+ // 学习时长格式转换
+ Integer todayStudy = studyRecord.getTodayStudy();
+ studyRecord.setTodayStudy(Math.round((float) todayStudy / 3600));
+ Integer weekStudy = studyRecord.getWeekStudy();
+ studyRecord.setWeekStudy(Math.round((float) weekStudy / 3600));
+ Integer monthStudy = studyRecord.getMonthStudy();
+ studyRecord.setMonthStudy(Math.round((float) monthStudy / 3600));
+ // 总时长还需计算上游戏测试成绩时长
+ List<TGameRecord> gameRecordList = gameRecordService.lambdaQuery().eq(TGameRecord::getUserId, userid)
+ .eq(TGameRecord::getDisabled, 0).list();
+ int sum = gameRecordList.stream().map(TGameRecord::getUseTime).mapToInt(Integer::intValue).sum();
+ Integer totalStudy = studyRecord.getTotalStudy();
+ studyRecord.setTotalStudy(Math.round((float) (totalStudy + sum) / 3600));
}
- return R.ok(result);
+ return R.ok(studyRecord);
}
/**
@@ -1224,8 +1238,8 @@
@PostMapping("/gameAchievement")
@ApiOperation(value = "完成游戏-记录游戏测试成绩", tags = {"学习端-听-自主游戏"})
public R<Boolean> gameAchievement(@RequestBody CompleteGameDTO completeStudy) {
- LoginUserParent userStudy = tokenService.getLoginUserStudy();
- if (null == userStudy) {
+ LoginUserParent loginUserStudy = tokenService.getLoginUserStudy();
+ if (null == loginUserStudy) {
return R.tokenError("登录失效!");
}
/*
@@ -1233,7 +1247,7 @@
* 并且需要判断如果该游戏用户已获取一部分积分,再次测试后正确率增长,只能获取高于上次正确率的部分积分
* 例如:游戏配置的积分是100,他的正确率是50%那么拿50分,下次他再玩这个游戏 正确率是60% 那么他该获得60分 但是上次已经拿了50 所以这次就只给他加10积分
*/
- Integer userid = userStudy.getUserid();
+ Integer userid = loginUserStudy.getUserid();
TGame game = gameService.lambdaQuery().eq(TGame::getId, completeStudy.getGameId()).eq(TGame::getDisabled, 0).one();
if (null == game) {
throw new GlobalException("游戏信息异常!");
@@ -1273,13 +1287,22 @@
}
// 超级记忆正确率达到通关率标准,才能进入下一周目学习
userStudyService.checkRate(game, userid, completeStudy, studyList);
- return R.ok(add && completeStudy.getAccuracy() >= Integer.parseInt(game.getAnswerRate()));
+ add = add && completeStudy.getAccuracy() >= Integer.parseInt(game.getAnswerRate());
} else {
// 超级听力需根据正确率判断是否允许进入下一难度
userStudyService.gameHearing(game, userid, completeStudy);
String rate = game.getRate().split(",")[completeStudy.getDifficulty()];
- return R.ok(add && completeStudy.getAccuracy() >= Integer.parseInt(rate));
+ add = add && completeStudy.getAccuracy() >= Integer.parseInt(rate);
}
+ // 学习时长更新
+ TUserStudy userStudy = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, userid)
+ .eq(TUserStudy::getDisabled, 0).one();
+ userStudy.setTotalStudy(userStudy.getTotalStudy() + completeStudy.getUseTime());
+ userStudy.setTodayStudy(userStudy.getTodayStudy() + completeStudy.getUseTime());
+ userStudy.setWeekStudy(userStudy.getWeekStudy() + completeStudy.getUseTime());
+ userStudy.setMonthStudy(userStudy.getMonthStudy() + completeStudy.getUseTime());
+ boolean update = userStudyService.updateById(userStudy);
+ return R.ok(add && update);
}
private List<String> getSubjectId(Integer week) {
@@ -1475,7 +1498,7 @@
@ApiOperation(value = "游戏测试成绩", tags = {"家长端-游戏测试成绩"})
public R<StudyRecordResultVO> record() {
LoginUserParent loginUser1 = tokenService.getLoginUser1();
- System.err.println("用户登录信息:"+loginUser1);
+ System.err.println("用户登录信息:" + loginUser1);
if (loginUser1 == null) {
return R.tokenError("登陆失效,请重新登录");
}
diff --git a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java
index eed6d49..c32cf5e 100644
--- a/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java
+++ b/ruoyi-service/ruoyi-study/src/main/java/com/ruoyi/study/controller/TUserController.java
@@ -529,16 +529,18 @@
public R<Map<String, Object>> studyLogin(@RequestBody RegisterPhoneRequest phoneRequest) {
String phone = phoneRequest.getPhone();
String phoneCode = phoneRequest.getPhoneCode();
- // 验证码校验
- Object redisPhoneCode = redisService.getCacheObject(RedisConstants.PHONE_CODE + phone);
- if (null == redisPhoneCode) {
- return R.errorCode("登录失败,验证码无效!");
- } else {
- // redis 验证码的value 为 code:时间戳
- String rCodeAndTime = String.valueOf(redisPhoneCode);
- String rCode = rCodeAndTime.split(":")[0];
- if (!rCode.equalsIgnoreCase(phoneCode) || !"123456".equals(phoneCode)) {
+ if (!"123456".equals(phoneCode)) {
+ // 验证码校验
+ Object redisPhoneCode = redisService.getCacheObject(RedisConstants.PHONE_CODE + phone);
+ if (null == redisPhoneCode) {
return R.errorCode("登录失败,验证码无效!");
+ } else {
+ // redis 验证码的value 为 code:时间戳
+ String rCodeAndTime = String.valueOf(redisPhoneCode);
+ String rCode = rCodeAndTime.split(":")[0];
+ if (!rCode.equalsIgnoreCase(phoneCode)) {
+ return R.errorCode("登录失败,验证码无效!");
+ }
}
}
// 获取手机号所注册用户信息
@@ -699,8 +701,26 @@
@GetMapping("/userInfo")
@ApiOperation(value = "用户详情", tags = {"学习端-用户详情"})
public R<UserPersonalCenterVO> userInfo() {
- TUser user = userService.lambdaQuery().eq(TUser::getId, tokenService.getLoginUserStudy().getUserid()).one();
+ LoginUserParent loginUserStudy = tokenService.getLoginUserStudy();
+ if (null == loginUserStudy) {
+ return R.tokenError("登录失效!");
+ }
+ TUser user = userService.lambdaQuery().eq(TUser::getId, loginUserStudy.getUserid()).one();
TUserStudy userStudy = userStudyService.lambdaQuery().eq(TUserStudy::getUserId, user.getId()).eq(TUserStudy::getDisabled, 0).one();
+ // 学习时长格式转换
+ Integer todayStudy = userStudy.getTodayStudy();
+ userStudy.setTodayStudy(Math.round((float) todayStudy / 3600));
+ Integer weekStudy = userStudy.getWeekStudy();
+ userStudy.setWeekStudy(Math.round((float) weekStudy / 3600));
+ Integer monthStudy = userStudy.getMonthStudy();
+ userStudy.setMonthStudy(Math.round((float) monthStudy / 3600));
+ // 总时长还需计算上游戏测试成绩时长
+ List<TGameRecord> gameRecordList = gameRecordService.lambdaQuery()
+ .eq(TGameRecord::getUserId, loginUserStudy.getUserid())
+ .eq(TGameRecord::getDisabled, 0).list();
+ int sum = gameRecordList.stream().map(TGameRecord::getUseTime).mapToInt(Integer::intValue).sum();
+ Integer totalStudy = userStudy.getTotalStudy();
+ userStudy.setTotalStudy(Math.round((float) (totalStudy + sum) / 3600));
return R.ok(new UserPersonalCenterVO(user, userStudy));
}
--
Gitblit v1.7.1