tianze-pro/web/src/main/java/com/ibeetl/jlw/service/StatisticalAnalysisService....

338 lines
20 KiB
Java

package com.ibeetl.jlw.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.NumberUtil;
import com.ibeetl.admin.core.entity.CoreUser;
import com.ibeetl.admin.core.service.CoreUserService;
import com.ibeetl.jlw.dao.StatisticalAnalysisDao;
import com.ibeetl.jlw.dao.SysLogDao;
import com.ibeetl.jlw.dao.TeacherOpenCourseDao;
import com.ibeetl.jlw.dao.UniversitiesCollegesDao;
import com.ibeetl.jlw.entity.*;
import com.ibeetl.jlw.enums.ChatLogSendTypeEnum;
import com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum;
import com.ibeetl.jlw.enums.SignInTypeEnum;
import com.ibeetl.jlw.web.query.*;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.beetl.sql.core.query.LambdaQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* 统计分析service
* @Version 0.0.1
* @Author 许良彤
* @Date 2022/10/7 12:25
*
*/
@Service
public class StatisticalAnalysisService {
@Autowired private StatisticalAnalysisDao statisticalAnalysisDao;
@Autowired private TeacherOpenCourseMergeSchoolClassService teacherOpenCourseMergeSchoolClassService;
@Autowired private TeacherOpenCourseMergeStudentService teacherOpenCourseMergeStudentService;
@Autowired private TeacherOpenCourseNoticeService teacherOpenCourseNoticeService;
@Autowired private StudentService studentService;
@Autowired private TeacherService teacherService;
@Autowired private CourseInfoService courseInfoService;
@Autowired private ResourcesApplicationService resourcesApplicationService;
@Autowired private UniversitiesCollegesDao universitiesCollegesDao;
@Autowired private SysLogDao sysLogDao;
@Autowired private UniversitiesCollegesService universitiesCollegesService;
@Autowired private CoreUserService coreUserService;
@Autowired private ResourcesTrainingService resourcesTrainingService;
@Autowired private ResourcesInfoService resourcesInfoService;
@Autowired private ResourcesQuestionService resourcesQuestionService;
@Autowired private TeacherOpenCourseStudentSigninLogService teacherOpenCourseStudentSigninLogService;
@Autowired private TeacherOpenCourseQuestionSettingService teacherOpenCourseQuestionSettingService;
@Autowired private TeacherOpenCourseMergeCourseInfoService teacherOpenCourseMergeCourseInfoService;
@Autowired private TeacherOpenCourseQuestionLogService teacherOpenCourseQuestionLogService;
@Autowired private TeacherOpenCourseHandsOnService teacherOpenCourseHandsOnService;
@Autowired private TeacherOpenCourseHandsOnSimulationTasksService teacherOpenCourseHandsOnSimulationTasksService;
@Autowired private HandsOnAchievementService handsOnAchievementService;
@Autowired private TeacherOpenCourseChatLogService teacherOpenCourseChatLogService;
@Autowired private TeacherOpenCourseDao teacherOpenCourseService;
private static final String PATTERN = "(?<=\"code\":\\[\").*?(?=\"\\],)";
Pattern r = Pattern.compile(PATTERN);
/**
* 统计分析
* @param
*/
public Map<String, Object> detail(Long teacherOpenCourseId, Date stime, Date etime) {
Map<String, Object> data = new HashMap<>(24);
// 暂不使用连表方式查询
// statisticalAnalysisDao.detail(teacherOpenCourseId, stime, etime);
//班级数
TeacherOpenCourseMergeSchoolClassQuery classQuery = new TeacherOpenCourseMergeSchoolClassQuery();
classQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseMergeSchoolClass> schoolClasses = teacherOpenCourseMergeSchoolClassService.getValues(classQuery);
data.put("classNum", schoolClasses.size());
//学生人数
TeacherOpenCourseMergeStudentQuery teacherOpenCourseMergeStudentQuery = new TeacherOpenCourseMergeStudentQuery();
teacherOpenCourseMergeStudentQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseMergeStudent> studentList = teacherOpenCourseMergeStudentService.getValuesByQueryNotWithPermission(teacherOpenCourseMergeStudentQuery);
data.put("studentNum", studentList.size());
//学习通过率
data.put("passRate", 90);
//授课视频
data.put("teachingVideoNum", 20);
//非视频资源
data.put("nonVideoResourcesNum", 30);
//课程公告
TeacherOpenCourseNoticeQuery teacherOpenCourseNoticeQuery = new TeacherOpenCourseNoticeQuery();
teacherOpenCourseNoticeQuery.setTeacherOpenCourseIds(teacherOpenCourseId.toString());
List<TeacherOpenCourseNotice> noticeList = teacherOpenCourseNoticeService.getValues(teacherOpenCourseNoticeQuery);
data.put("noticeNum", noticeList.size());
//签到
TeacherOpenCourseStudentSigninLogQuery signQuery = new TeacherOpenCourseStudentSigninLogQuery();
signQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseStudentSigninLog> signinLogs = teacherOpenCourseStudentSigninLogService.getValues(signQuery);
List<TeacherOpenCourseStudentSigninLog> collect = signinLogs.stream().filter(v -> v.getTeacherOpenCourseStudentSigninLogTag().equals(SignInTypeEnum.SIGN_IN)).collect(Collectors.toList());
//签到数量
data.put("signInNum", collect.size());
//到课率
data.put("signInRate", NumberUtil.div(NumberUtil.toBigDecimal(collect.size()), NumberUtil.toBigDecimal(signinLogs.size()), 2).multiply(BigDecimal.valueOf(100)).intValue());
//章节练习
//总章节数
TeacherOpenCourseMergeCourseInfoQuery teacherOpenCourseMergeCourseInfoQuery = new TeacherOpenCourseMergeCourseInfoQuery();
teacherOpenCourseMergeCourseInfoQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseMergeCourseInfo> openCourseMergeCourseInfos = teacherOpenCourseMergeCourseInfoService.getValues(teacherOpenCourseMergeCourseInfoQuery);
data.put("chapterNum", openCourseMergeCourseInfos.size());
//习题总数
TeacherOpenCourseQuestionSettingQuery teacherOpenCourseQuestionSettingQuery = new TeacherOpenCourseQuestionSettingQuery();
teacherOpenCourseQuestionSettingQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseQuestionSetting> courseQuestionSettings = teacherOpenCourseQuestionSettingService.getValues(teacherOpenCourseQuestionSettingQuery);
List<TeacherOpenCourseQuestionSetting> collect1 = courseQuestionSettings.stream().filter(v -> v.getTeacherOpenCourseQuestionSettingType().equals(ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE)).collect(Collectors.toList());
data.put("chapterTotal", collect1.size());
//参与人数
TeacherOpenCourseQuestionLogQuery teacherOpenCourseQuestionLogQuery = new TeacherOpenCourseQuestionLogQuery();
String stringJoiner = CollectionUtil.join(collect1, ",");
if (StringUtils.isNotEmpty(stringJoiner)) {
teacherOpenCourseQuestionLogQuery.setTeacherOpenCourseQuestionSettingIdPlural(stringJoiner);
List<TeacherOpenCourseQuestionLog> values = teacherOpenCourseQuestionLogService.getValues(teacherOpenCourseQuestionLogQuery);
int size = values.stream().map(TeacherOpenCourseQuestionLog::getStudentId).collect(Collectors.toSet()).size();
data.put("chapterPeople", size);
}else {
data.put("chapterPeople", 0);
}
//课程实操
TeacherOpenCourseHandsOnQuery teacherOpenCourseHandsOnQuery = new TeacherOpenCourseHandsOnQuery();
teacherOpenCourseHandsOnQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseHandsOn> handsOns = teacherOpenCourseHandsOnService.getValues(teacherOpenCourseHandsOnQuery);
data.put("handsOnNum", handsOns.size());
//实操任务总数
TeacherOpenCourseHandsOnSimulationTasksQuery tasksQuery = new TeacherOpenCourseHandsOnSimulationTasksQuery();
tasksQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseHandsOnSimulationTasks> tasksList = teacherOpenCourseHandsOnSimulationTasksService.getValues(tasksQuery);
data.put("handsOnTotal", tasksList.size());
//实操参与人数
HandsOnAchievementQuery achievementQuery = new HandsOnAchievementQuery();
List<Long> list = handsOns.stream().map(TeacherOpenCourseHandsOn::getHandsOnId).collect(Collectors.toList());
String join = CollectionUtil.join(list, ",");
if (StringUtils.isNotEmpty(join)) {
achievementQuery.setHandOnIdPlural(join);
List<HandsOnAchievement> assessmentList = handsOnAchievementService.getValues(achievementQuery);
long count = assessmentList.stream().map(HandsOnAchievement::getStudentId).count();
data.put("handsOnPeople", count);
}else {
data.put("handsOnPeople", 0);
}
//作业
List<TeacherOpenCourseQuestionSetting> settings = courseQuestionSettings.stream().filter(v -> v.getTeacherOpenCourseQuestionSettingType().equals(ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_QUESTION)).collect(Collectors.toList());
//作业总次数
data.put("homeworkNum", settings.size());
//作业习题总数
data.put("homeworkTotal", settings.size());
String str = CollectionUtil.join(settings, ",");
if (StringUtils.isNotEmpty(str)) {
teacherOpenCourseQuestionLogQuery.setTeacherOpenCourseQuestionSettingIdPlural(str);
List<TeacherOpenCourseQuestionLog> values = teacherOpenCourseQuestionLogService.getValues(teacherOpenCourseQuestionLogQuery);
int size = values.stream().map(TeacherOpenCourseQuestionLog::getStudentId).collect(Collectors.toSet()).size();
data.put("homeworkPeople", size);
}else {
//作业参与人数
data.put("homeworkPeople", 0);
}
//考试
List<TeacherOpenCourseQuestionSetting> settingList = courseQuestionSettings.stream().filter(v -> v.getTeacherOpenCourseQuestionSettingType().equals(ResourcesQuestionSnapshotFromTypeEnum.EXAM)).collect(Collectors.toList());
data.put("examNum", settingList.size());
data.put("examTotal", settingList.size());
String s = CollectionUtil.join(settingList, ",");
if (StringUtils.isNotEmpty(s)) {
teacherOpenCourseQuestionLogQuery.setTeacherOpenCourseQuestionSettingIdPlural(s);
List<TeacherOpenCourseQuestionLog> values = teacherOpenCourseQuestionLogService.getValues(teacherOpenCourseQuestionLogQuery);
int size = values.stream().map(TeacherOpenCourseQuestionLog::getStudentId).collect(Collectors.toSet()).size();
data.put("examPeople", size);
}else {
//考试参与人数
data.put("examPeople", 0);
}
//线上互动
TeacherOpenCourseChatLogQuery logQuery = new TeacherOpenCourseChatLogQuery();
logQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseChatLog> logList = teacherOpenCourseChatLogService.getValues(logQuery);
//互动参与人数
Set<Long> studentLogs = logList.stream().map(TeacherOpenCourseChatLog::getStudentId).collect(Collectors.toSet());
Set<Long> teacherLogs = logList.stream().map(TeacherOpenCourseChatLog::getTeacherId).collect(Collectors.toSet());
data.put("interactNum", studentLogs.size() + teacherLogs.size());
//发帖总数
data.put("interactTotal", logList.size());
//学生提问次数
long studentCount = logList.stream().filter(v -> v.getChatLogSendType().equals(ChatLogSendTypeEnum.student_ask)).count();
data.put("interactStudent", studentCount);
//教师提问次数
long teacherCount = logList.stream().filter(v -> v.getChatLogSendType().equals(ChatLogSendTypeEnum.specify_ask)).count();
data.put("interactTeacher", teacherCount);
return data;
}
/**
* 首页
* @param
* @return
*/
public Map<String, Object> indexDetail(Long teacherOpenCourseId) {
Map<String, Object> data = new HashMap<>();
List<TeacherOpenCourse> valuesByQuery = teacherOpenCourseService.getByIds(teacherOpenCourseId.toString());
if (CollectionUtil.isEmpty(valuesByQuery)) {
return data;
}
TeacherOpenCourse info = valuesByQuery.get(0);
//课程封面
data.put("courseInfoThumbnail", info.getTeacherOpenCourseCover());
//课程名称
data.put("courseInfoName", info.getTeacherOpenCourseTitle());
//课程简介
data.put("courseInfoContent", info.getTeacherOpenCourseSummary());
//班级
TeacherOpenCourseMergeSchoolClassQuery classQuery = new TeacherOpenCourseMergeSchoolClassQuery();
classQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseMergeSchoolClass> classList = teacherOpenCourseMergeSchoolClassService.getValues(classQuery);
data.put("classNum", classList.size());
//学生
TeacherOpenCourseMergeStudentQuery studentQuery = new TeacherOpenCourseMergeStudentQuery();
studentQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseMergeStudent> studentList = teacherOpenCourseMergeStudentService.getValuesByQueryNotWithPermission(studentQuery);
data.put("studentNum", studentList.size());
//课件
TeacherOpenCourseMergeCourseInfoQuery courseInfoQuery = new TeacherOpenCourseMergeCourseInfoQuery();
courseInfoQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseMergeCourseInfo> courseInfos = teacherOpenCourseMergeCourseInfoService.getValuesByQueryNotWithPermission(courseInfoQuery);
data.put("coursewareNum", courseInfos.size());
//视频
data.put("videoNum", courseInfos.size());
//题目
//习题总数
TeacherOpenCourseQuestionSettingQuery teacherOpenCourseQuestionSettingQuery = new TeacherOpenCourseQuestionSettingQuery();
teacherOpenCourseQuestionSettingQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseQuestionSetting> courseQuestionSettings = teacherOpenCourseQuestionSettingService.getValues(teacherOpenCourseQuestionSettingQuery);
List<TeacherOpenCourseQuestionSetting> collect1 = courseQuestionSettings.stream().filter(v -> v.getTeacherOpenCourseQuestionSettingType().equals(ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE)).collect(Collectors.toList());
data.put("subjectNum", collect1.size());
//案例
TeacherOpenCourseHandsOnQuery teacherOpenCourseHandsOnQuery = new TeacherOpenCourseHandsOnQuery();
teacherOpenCourseHandsOnQuery.setTeacherOpenCourseId(teacherOpenCourseId);
List<TeacherOpenCourseHandsOn> handsOns = teacherOpenCourseHandsOnService.getValues(teacherOpenCourseHandsOnQuery);
data.put("caseNum", handsOns.size());
//作业
List<TeacherOpenCourseQuestionSetting> collect2 = courseQuestionSettings.stream().filter(v -> v.getTeacherOpenCourseQuestionSettingType().equals(ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_QUESTION)).collect(Collectors.toList());
data.put("homeworkNum", collect2.size());
//考试
List<TeacherOpenCourseQuestionSetting> collect3 = courseQuestionSettings.stream().filter(v -> v.getTeacherOpenCourseQuestionSettingType().equals(ResourcesQuestionSnapshotFromTypeEnum.EXAM)).collect(Collectors.toList());
data.put("examNum", collect3.size());
return data;
}
public Map<String, Object> adminIndexDetail(Date stime, Date etime, Long universitiesCollegesId) {
List<Student> studentList = studentService.getStudentByStimeAndEtime(stime, etime, universitiesCollegesId);
Map<String, Object> data = new HashMap<>();
//注册学生数
data.put("studentNumber", studentList.size());
//注册老师数
List<Teacher> teachers = teacherService.getTeacherByStimeAndEtime(stime, etime, universitiesCollegesId);
data.put("teacherNumber", teachers.size());
LambdaQuery<SysLog> logDaoLambdaQuery = sysLogDao.createLambdaQuery();
if (stime != null && etime != null) {
logDaoLambdaQuery.andBetween(SysLog::getCreateTime, stime, etime);
}
List<SysLog> sysLogs = logDaoLambdaQuery.andLike(SysLog::getRequestUrl, "%login%").andLike(SysLog::getResult, "%成功%").select();
Set<String> set = new HashSet<>();
for (SysLog sysLog : sysLogs) {
String result = sysLog.getParams();
Matcher m = r.matcher(result);
if (m.find()) {
set.add(m.group());
}
}
//登录人数
data.put("loginNumber", set.size());
//登录人次
data.put("studentPersonTime", sysLogs.size());
//上线课程数
List<CourseInfo> courseInfoList = courseInfoService.getCourseInfoByStimeAndEtime(stime, etime, universitiesCollegesId);
data.put("courseNumber", courseInfoList.size());
//上线应用数
List<ResourcesApplication> resourcesApplicationList = resourcesApplicationService.getApplicationByStimeAndEtime(stime, etime);
data.put("applicationNumber", resourcesApplicationList.size());
//批改作业数
data.put("homeWorkNumber", studentList.size());
//课程学习
data.put("studyNumber", studentList.size());
//学生做题
data.put("exerciseNumber", studentList.size());
UniversitiesColleges universitiesColleges = universitiesCollegesService.queryById(universitiesCollegesId);
//学校动态码
data.put("universitiesCollegesAuthCode", universitiesColleges != null ? universitiesColleges.getUniversitiesCollegesAuthCode() : "暂无动态码");
//注册用户数
List<CoreUser> coreUserList = coreUserService.getCoreUserList(new CoreUser());
data.put("userNumber", coreUserList.size());
//案例数量
List<ResourcesTraining> values = resourcesTrainingService.getValues(new ResourcesTrainingQuery());
data.put("caseNumber", values.size());
//视频数量
ResourcesInfoQuery resourcesInfoQuery = new ResourcesInfoQuery();
resourcesInfoQuery.setResourcesInfoType(1);
List<ResourcesInfo> videoNumber = resourcesInfoService.getValues(resourcesInfoQuery);
data.put("videoNumber", videoNumber.size());
//题库数量
List<ResourcesQuestion> questionList = resourcesQuestionService.getValues(new ResourcesQuestionQuery());
data.put("questionNumber", questionList.size());
//院校数量
List<UniversitiesColleges> schoolList = universitiesCollegesService.getValues(new UniversitiesCollegesQuery());
data.put("schoolNumber", schoolList.size());
return data;
}
public Map<String, Object> adminIndexBarchart(Date stime, Date etime) {
LambdaQuery<UniversitiesColleges> lambdaQuery = universitiesCollegesDao.createLambdaQuery();
if (stime != null && etime != null) {
lambdaQuery.andBetween(UniversitiesColleges::getAddTime, stime, etime);
}
List<UniversitiesColleges> universitiesColleges = lambdaQuery.select();
Map<String, Long> collect = universitiesColleges.stream().collect(Collectors.groupingBy(UniversitiesColleges::getUniversitiesCollegesProvince, Collectors.counting()));
List<String> xList = new ArrayList<>();
List<Long> yList = new ArrayList<>();
collect.forEach((x,y) -> {
xList.add(x);
yList.add(y);
});
Map<String, Object> map = new HashMap<>();
map.put("xList" , xList);
map.put("yList" , yList);
return map;
}
}