后台新增学员的最近一个月的学习统计api

This commit is contained in:
none 2023-04-18 15:49:39 +08:00
parent 3e36fcd1f0
commit b34c744da9
5 changed files with 80 additions and 35 deletions

View File

@ -127,12 +127,17 @@
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-json</artifactId> <artifactId>hutool-json</artifactId>
<version>5.8.15</version> <version>5.8.16</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-http</artifactId> <artifactId>hutool-http</artifactId>
<version>5.8.15</version> <version>5.8.16</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-core</artifactId>
<version>5.8.16</version>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -40,8 +40,7 @@ import java.util.Map;
@Slf4j @Slf4j
public class SystemController { public class SystemController {
@Autowired @Autowired private ImageCaptchaService imageCaptchaService;
private ImageCaptchaService imageCaptchaService;
@GetMapping("/image-captcha") @GetMapping("/image-captcha")
public JsonResponse imageCaptcha() throws IOException { public JsonResponse imageCaptcha() throws IOException {

View File

@ -15,6 +15,9 @@
*/ */
package xyz.playedu.api.controller.backend; package xyz.playedu.api.controller.backend;
import cn.hutool.core.date.DateTime;
import lombok.Data;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -49,6 +52,7 @@ import java.util.stream.Collectors;
/** /**
* @Author 杭州白书科技有限公司 * @Author 杭州白书科技有限公司
*
* @create 2023/2/23 09:48 * @create 2023/2/23 09:48
*/ */
@RestController @RestController
@ -56,29 +60,23 @@ import java.util.stream.Collectors;
@RequestMapping("/backend/v1/user") @RequestMapping("/backend/v1/user")
public class UserController { public class UserController {
@Autowired @Autowired private UserService userService;
private UserService userService;
@Autowired @Autowired private UserDepartmentService userDepartmentService;
private UserDepartmentService userDepartmentService;
@Autowired @Autowired private DepartmentService departmentService;
private DepartmentService departmentService;
@Autowired @Autowired private ApplicationContext context;
private ApplicationContext context;
@Autowired @Autowired private UserCourseHourRecordService userCourseHourRecordService;
private UserCourseHourRecordService userCourseHourRecordService;
@Autowired @Autowired private UserCourseRecordService userCourseRecordService;
private UserCourseRecordService userCourseRecordService;
@Autowired @Autowired private CourseHourService courseHourService;
private CourseHourService courseHourService;
@Autowired @Autowired private CourseService courseService;
private CourseService courseService;
@Autowired private UserLearnDurationStatsService userLearnDurationStatsService;
@BackendPermissionMiddleware(slug = BPermissionConstant.USER_INDEX) @BackendPermissionMiddleware(slug = BPermissionConstant.USER_INDEX)
@GetMapping("/index") @GetMapping("/index")
@ -224,7 +222,7 @@ public class UserController {
String defaultAvatar = BCtx.getConfig().get(CConfig.MEMBER_DEFAULT_AVATAR); String defaultAvatar = BCtx.getConfig().get(CConfig.MEMBER_DEFAULT_AVATAR);
List<String[]> errorLines = new ArrayList<>(); List<String[]> errorLines = new ArrayList<>();
errorLines.add(new String[]{"错误行", "错误信息"}); // 错误表-表头 errorLines.add(new String[] {"错误行", "错误信息"}); // 错误表-表头
// 读取存在的部门 // 读取存在的部门
List<Department> departments = departmentService.all(); List<Department> departments = departmentService.all();
@ -264,14 +262,14 @@ public class UserController {
i++; // 索引值 i++; // 索引值
if (userItem.getEmail() == null || userItem.getEmail().trim().length() == 0) { if (userItem.getEmail() == null || userItem.getEmail().trim().length() == 0) {
errorLines.add(new String[]{"" + (i + startLine) + "", "未输入邮箱账号"}); errorLines.add(new String[] {"" + (i + startLine) + "", "未输入邮箱账号"});
} else { } else {
// 邮箱重复判断 // 邮箱重复判断
Integer repeatLine = emailRepeat.get(userItem.getEmail()); Integer repeatLine = emailRepeat.get(userItem.getEmail());
if (repeatLine != null) { if (repeatLine != null) {
errorLines.add( errorLines.add(
new String[]{ new String[] {
"" + (i + startLine) + "", "与第" + repeatLine + "行邮箱重复" "" + (i + startLine) + "", "与第" + repeatLine + "行邮箱重复"
}); });
} else { } else {
emailRepeat.put(userItem.getEmail(), i + startLine); emailRepeat.put(userItem.getEmail(), i + startLine);
@ -281,7 +279,7 @@ public class UserController {
// 部门数据检测 // 部门数据检测
if (userItem.getDeps() == null || userItem.getDeps().trim().length() == 0) { if (userItem.getDeps() == null || userItem.getDeps().trim().length() == 0) {
errorLines.add(new String[]{"" + (i + startLine) + "", "未选择部门"}); errorLines.add(new String[] {"" + (i + startLine) + "", "未选择部门"});
} else { } else {
String[] tmpDepList = userItem.getDeps().trim().split("\\|"); String[] tmpDepList = userItem.getDeps().trim().split("\\|");
Integer[] tmpDepIds = new Integer[tmpDepList.length]; Integer[] tmpDepIds = new Integer[tmpDepList.length];
@ -291,8 +289,8 @@ public class UserController {
// 判断部门id是否存在 // 判断部门id是否存在
if (tmpDepId == null || tmpDepId == 0) { if (tmpDepId == null || tmpDepId == 0) {
errorLines.add( errorLines.add(
new String[]{ new String[] {
"" + (i + startLine) + "", "部门『" + tmpDepList[j] + "』不存在" "" + (i + startLine) + "", "部门『" + tmpDepList[j] + "』不存在"
}); });
continue; continue;
} }
@ -304,13 +302,13 @@ public class UserController {
// 姓名为空检测 // 姓名为空检测
String tmpName = userItem.getName(); String tmpName = userItem.getName();
if (tmpName == null || tmpName.trim().length() == 0) { if (tmpName == null || tmpName.trim().length() == 0) {
errorLines.add(new String[]{"" + (i + startLine) + "", "昵称为空"}); errorLines.add(new String[] {"" + (i + startLine) + "", "昵称为空"});
} }
// 密码为空检测 // 密码为空检测
String tmpPassword = userItem.getPassword(); String tmpPassword = userItem.getPassword();
if (tmpPassword == null || tmpPassword.trim().length() == 0) { if (tmpPassword == null || tmpPassword.trim().length() == 0) {
errorLines.add(new String[]{"" + (i + startLine) + "", "密码为空"}); errorLines.add(new String[] {"" + (i + startLine) + "", "密码为空"});
} }
// 待插入数据 // 待插入数据
@ -338,7 +336,7 @@ public class UserController {
List<String> existsEmails = userService.existsEmailsByEmails(emails); List<String> existsEmails = userService.existsEmailsByEmails(emails);
if (existsEmails.size() > 0) { if (existsEmails.size() > 0) {
for (String tmpEmail : existsEmails) { for (String tmpEmail : existsEmails) {
errorLines.add(new String[]{"" + emailRepeat.get(tmpEmail) + "", "邮箱已注册"}); errorLines.add(new String[] {"" + emailRepeat.get(tmpEmail) + "", "邮箱已注册"});
} }
} }
if (errorLines.size() > 1) { if (errorLines.size() > 1) {
@ -441,12 +439,47 @@ public class UserController {
@GetMapping("/{id}/learn-stats") @GetMapping("/{id}/learn-stats")
@SneakyThrows @SneakyThrows
public JsonResponse learn(@PathVariable(name = "id") Integer id) { public JsonResponse learn(@PathVariable(name = "id") Integer id) {
User user = userService.findOrFail(id);
// 学习时长统计
// 今天昨天本周本月
// 最近一个月的每天学习时长 // 最近一个月的每天学习时长
String todayStr = DateTime.now().toDateStr();
String startDateStr = DateTime.of(DateTime.now().getTime() - 86400000L * 30).toDateStr();
long startTime = new DateTime(startDateStr).getTime();
long endTime = new DateTime(todayStr).getTime();
return JsonResponse.data(null); List<UserLearnDurationStats> monthRecords =
userLearnDurationStatsService.dateBetween(id, startDateStr, todayStr);
Map<Date, Long> date2duration =
monthRecords.stream()
.collect(
Collectors.toMap(
UserLearnDurationStats::getCreatedDate,
UserLearnDurationStats::getDuration));
@Data
class StatsItem {
private String key;
private Long value;
}
List<StatsItem> data = new ArrayList<>();
while (startTime <= endTime) {
String dateKey = DateTime.of(startTime).toDateStr();
Date tmpDate = new Date(startTime);
Long duration = 0L;
if (date2duration.get(tmpDate) != null) {
duration = date2duration.get(tmpDate);
}
StatsItem tmpItem = new StatsItem();
tmpItem.setKey(dateKey);
tmpItem.setValue(duration);
data.add(tmpItem);
startTime += 86400000;
}
return JsonResponse.data(data);
} }
} }

View File

@ -38,4 +38,6 @@ public interface UserLearnDurationStatsService extends IService<UserLearnDuratio
Long todayUserDuration(Integer userId); Long todayUserDuration(Integer userId);
Long userDuration(Integer userId); Long userDuration(Integer userId);
List<UserLearnDurationStats> dateBetween(Integer userId, String startAt, String endAt);
} }

View File

@ -109,4 +109,10 @@ public class UserLearnDurationStatsServiceImpl
Long totalDuration = getBaseMapper().getUserDuration(userId); Long totalDuration = getBaseMapper().getUserDuration(userId);
return totalDuration == null ? 0L : totalDuration; return totalDuration == null ? 0L : totalDuration;
} }
@Override
public List<UserLearnDurationStats> dateBetween(Integer userId, String startAt, String endAt) {
return list(
query().getWrapper().eq("user_id", userId).between("created_date", startAt, endAt));
}
} }