Compare commits

..

3 Commits

Author SHA1 Message Date
xxx
877aec3b01 返回线上课学员的学习记录最早的学习时间 2023-11-15 10:07:51 +08:00
xxx
e8399362ea fixed: 定时任务的执行时机 2023-11-15 09:22:01 +08:00
xxx
5dcde4f911 readme 2023-11-14 16:14:04 +08:00
7 changed files with 46 additions and 7 deletions

View File

@ -4,7 +4,7 @@
## 系统介绍
**PlayEdu** 是由白书科技团队经营多年线上教育系统打造出的一款全新的企业培训解决方案,致力于为更多企业机构搭建私有化内部培训平台。**PlayEdu** 基于 Java + MySQL 开发;采用前后端分离模式;前台采用 React18 为核心框架,后台采用 SpringBoot3 为核心框架。提供部门管理、学员管理、在线视频学习、学员进度追踪、视频私有化存储等培训主要功能。**与此同时,我们在开源版本的基础上还提供了功能更加丰富的企业版本。企业版本在开源功能的基础上提供了包括视频云端存储、视频加密、音频学习、文档(PDF|WORD|PPT)在线学习、在线考试、学习计划培训等功能。企业版本更多信息请点击下方的企业版链接查看。**
**PlayEdu** 是由白书科技团队经营多年线上教育系统打造出的一款全新的企业培训解决方案,致力于为更多企业机构搭建私有化内部培训平台。**PlayEdu** 基于 Java + MySQL 开发;采用前后端分离模式;前端采用 React18 为核心框架,后端采用 SpringBoot3 为核心框架。提供部门管理、学员管理、在线视频学习、学员进度追踪、视频私有化存储等培训主要功能。**与此同时,我们在开源版本的基础上还提供了功能更加丰富的企业版本。企业版本在开源功能的基础上提供了包括视频云端存储、视频加密、音频学习、文档(PDF|WORD|PPT)在线学习、在线考试、学习计划培训等功能。企业版本更多信息请点击下方的企业版链接查看。**
## 常用链接
@ -14,7 +14,7 @@
| **企业版** | [https://www.playedu.xyz/commercial](https://www.playedu.xyz/commercial) |
| 部署文档 | [https://www.playedu.xyz/book](https://www.playedu.xyz/book) |
| 系统演示 | [https://www.playedu.xyz/demo](https://www.playedu.xyz/demo) |
| 问答社区 | [https://www.playedu.xyz/qa?scene=new](https://www.playedu.xyz/qa?scene=new) |
| 问答社区 | [https://www.playedu.xyz/qa](https://www.playedu.xyz/qa) |
## 依赖前端项目

View File

@ -36,6 +36,7 @@ import xyz.playedu.common.types.JsonResponse;
import xyz.playedu.common.types.mapper.UserCourseHourRecordUserFirstCreatedAtMapper;
import xyz.playedu.common.types.paginate.PaginationResult;
import xyz.playedu.common.types.paginate.UserPaginateFilter;
import xyz.playedu.course.domain.UserCourseHourRecord;
import xyz.playedu.course.domain.UserCourseRecord;
import xyz.playedu.course.service.CourseService;
import xyz.playedu.course.service.UserCourseHourRecordService;
@ -141,6 +142,14 @@ public class CourseUserController {
userService.getDepIdsGroup(result.getData().stream().map(User::getId).toList()));
data.put("departments", departmentService.id2name());
// 获取每个学员的最早学习时间
List<UserCourseHourRecord> perUserEarliestRecords =
userCourseHourRecordService.getCoursePerUserEarliestRecord(courseId);
data.put(
"per_user_earliest_records",
perUserEarliestRecords.stream()
.collect(Collectors.toMap(UserCourseHourRecord::getUserId, e -> e)));
return JsonResponse.data(data);
}

View File

@ -33,17 +33,17 @@ public class LDAPSchedule {
@Scheduled(fixedRate = 3600000)
public void sync() {
if (!ldapBus.enabledLDAP()) {
log.info("未配置LDAP服务");
return;
}
// 系统刚启动不执行
if (times == 0) {
times++;
return;
}
if (!ldapBus.enabledLDAP()) {
log.info("未配置LDAP服务");
return;
}
try {
ldapBus.departmentSync();
} catch (Exception e) {

View File

@ -50,4 +50,6 @@ public interface UserCourseHourRecordMapper extends BaseMapper<UserCourseHourRec
Long paginateCount(UserCourseHourRecordPaginateFilter filter);
List<UserCourseHourRecord> getUserPerCourseEarliestRecord(Integer userId);
List<UserCourseHourRecord> getCoursePerUserEarliestRecord(Integer courseId);
}

View File

@ -68,4 +68,6 @@ public interface UserCourseHourRecordService extends IService<UserCourseHourReco
int page, int size, UserCourseHourRecordPaginateFilter filter);
List<UserCourseHourRecord> getUserPerCourseEarliestRecord(Integer userId);
List<UserCourseHourRecord> getCoursePerUserEarliestRecord(Integer courseId);
}

View File

@ -184,4 +184,9 @@ public class UserCourseHourRecordServiceImpl
public List<UserCourseHourRecord> getUserPerCourseEarliestRecord(Integer userId) {
return getBaseMapper().getUserPerCourseEarliestRecord(userId);
}
@Override
public List<UserCourseHourRecord> getCoursePerUserEarliestRecord(Integer courseId) {
return getBaseMapper().getCoursePerUserEarliestRecord(courseId);
}
}

View File

@ -168,4 +168,25 @@
AND `b`.`course_id` = `a`.`course_id`
AND `b`.`user_id` = `a`.`user_id`;
</select>
<select id="getCoursePerUserEarliestRecord" resultType="xyz.playedu.course.domain.UserCourseHourRecord">
SELECT
`a`.*
FROM
`user_course_hour_records` AS `a`
INNER JOIN (
SELECT
min(`created_at`) AS `min_created_at`,
`course_id`,
`user_id`
FROM
`user_course_hour_records`
WHERE
`course_id` = #{courseId}
GROUP BY
`course_id`,
`user_id`) AS `b` ON `b`.`min_created_at` = `a`.`created_at`
AND `b`.`course_id` = `a`.`course_id`
AND `b`.`user_id` = `a`.`user_id`;
</select>
</mapper>