|
|
|
@ -5,6 +5,9 @@ import cn.hutool.core.bean.copier.CopyOptions;
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
|
import cn.hutool.core.lang.Assert;
|
|
|
|
|
import cn.hutool.core.lang.Snowflake;
|
|
|
|
|
import cn.hutool.core.lang.tree.Tree;
|
|
|
|
|
import cn.hutool.core.lang.tree.TreeNodeConfig;
|
|
|
|
|
import cn.hutool.core.lang.tree.TreeUtil;
|
|
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import cn.hutool.extra.spring.SpringUtil;
|
|
|
|
@ -12,12 +15,8 @@ import cn.jlw.util.ToolUtils;
|
|
|
|
|
import cn.jlw.validate.ValidateConfig;
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
import com.google.common.base.Optional;
|
|
|
|
|
import com.google.common.cache.CacheLoader;
|
|
|
|
|
import com.google.common.cache.LoadingCache;
|
|
|
|
|
import com.ibeetl.admin.core.entity.CoreUser;
|
|
|
|
|
import com.ibeetl.admin.core.service.CoreBaseService;
|
|
|
|
|
import com.ibeetl.admin.core.util.CacheUtils;
|
|
|
|
|
import com.ibeetl.admin.core.util.PlatformException;
|
|
|
|
|
import com.ibeetl.admin.core.web.JsonResult;
|
|
|
|
|
import com.ibeetl.admin.core.web.JsonReturnCode;
|
|
|
|
@ -25,7 +24,7 @@ import com.ibeetl.jlw.dao.TeacherOpenCourseMergeCourseInfoDao;
|
|
|
|
|
import com.ibeetl.jlw.entity.*;
|
|
|
|
|
import com.ibeetl.jlw.entity.dto.QuestionSettingDTO;
|
|
|
|
|
import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeCourseInfoQuery;
|
|
|
|
|
import lombok.SneakyThrows;
|
|
|
|
|
import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeResourcesInfoQuery;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
|
|
@ -37,7 +36,6 @@ import org.beetl.sql.core.SqlId;
|
|
|
|
|
import org.beetl.sql.core.engine.PageQuery;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
@ -47,15 +45,16 @@ import javax.validation.constraints.NotBlank;
|
|
|
|
|
import javax.validation.constraints.NotEmpty;
|
|
|
|
|
import javax.validation.constraints.NotNull;
|
|
|
|
|
import java.io.*;
|
|
|
|
|
import java.time.Duration;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
import java.util.concurrent.CopyOnWriteArrayList;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
import static cn.hutool.core.util.ArrayUtil.join;
|
|
|
|
|
import static cn.hutool.core.util.ObjectUtil.defaultIfNull;
|
|
|
|
|
import static com.ibeetl.admin.core.util.ExcelUtil.getCellFormatValue;
|
|
|
|
|
import static com.ibeetl.jlw.enums.CopyFromEnum.FROM_OPEN_COURSE;
|
|
|
|
|
import static com.ibeetl.jlw.enums.GlobalUpStatusEnum.UP;
|
|
|
|
|
import static java.util.stream.Collectors.toSet;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -104,14 +103,14 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
/**
|
|
|
|
|
* 针对 {@link #getTreeLocalCacheByTeacherOpenCourseId} 的缓存
|
|
|
|
|
*/
|
|
|
|
|
private final LoadingCache<Long, Optional<TeacherOpenCourseMergeCourseInfoTree>> treeLocalCache
|
|
|
|
|
= CacheUtils.buildAsyncReloadingCache(Duration.ofHours(1L), // 过期时间 1 小时
|
|
|
|
|
new CacheLoader<Long, Optional<TeacherOpenCourseMergeCourseInfoTree>>() {
|
|
|
|
|
@Override
|
|
|
|
|
public Optional<TeacherOpenCourseMergeCourseInfoTree> load(Long teacherOpenCourseId) {
|
|
|
|
|
return Optional.fromNullable(teacherOpenCourseMergeCourseInfoDao.getTreeLocalCacheByTeacherOpenCourseId(teacherOpenCourseId));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
// private final LoadingCache<Long, Optional<TeacherOpenCourseMergeCourseInfoTree>> treeLocalCache
|
|
|
|
|
// = CacheUtils.buildAsyncReloadingCache(Duration.ofHours(1L), // 过期时间 1 小时
|
|
|
|
|
// new CacheLoader<Long, Optional<TeacherOpenCourseMergeCourseInfoTree>>() {
|
|
|
|
|
// @Override
|
|
|
|
|
// public Optional<TeacherOpenCourseMergeCourseInfoTree> load(Long teacherOpenCourseId) {
|
|
|
|
|
// return Optional.fromNullable(teacherOpenCourseMergeCourseInfoDao.getTreeLocalCacheByTeacherOpenCourseId(teacherOpenCourseId));
|
|
|
|
|
// }
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
public PageQuery<TeacherOpenCourseMergeCourseInfo>queryByCondition(PageQuery query){
|
|
|
|
|
PageQuery ret = teacherOpenCourseMergeCourseInfoDao.queryByCondition(query);
|
|
|
|
@ -131,20 +130,20 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
*
|
|
|
|
|
* @param key
|
|
|
|
|
*/
|
|
|
|
|
@SneakyThrows
|
|
|
|
|
@Async
|
|
|
|
|
public void invalidateCourseInfoTreeLocalCache(Long key) {
|
|
|
|
|
if(ObjectUtil.isEmpty(key)) { return; }
|
|
|
|
|
treeLocalCache.refresh(key);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 清理刷新缓存
|
|
|
|
|
*/
|
|
|
|
|
@SneakyThrows
|
|
|
|
|
@Async
|
|
|
|
|
public void invalidateAllCleanUpCourseInfoTreeLocalCache() {
|
|
|
|
|
treeLocalCache.invalidateAll();
|
|
|
|
|
}
|
|
|
|
|
// @SneakyThrows
|
|
|
|
|
// @Async
|
|
|
|
|
// public void invalidateCourseInfoTreeLocalCache(Long key) {
|
|
|
|
|
// if(ObjectUtil.isEmpty(key)) { return; }
|
|
|
|
|
// treeLocalCache.refresh(key);
|
|
|
|
|
// }
|
|
|
|
|
// /**
|
|
|
|
|
// * 清理刷新缓存
|
|
|
|
|
// */
|
|
|
|
|
// @SneakyThrows
|
|
|
|
|
// @Async
|
|
|
|
|
// public void invalidateAllCleanUpCourseInfoTreeLocalCache() {
|
|
|
|
|
// treeLocalCache.invalidateAll();
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
public void deleteByList(List list){
|
|
|
|
|
String ids = "";
|
|
|
|
@ -155,7 +154,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
if(StringUtils.isNotBlank(ids)){
|
|
|
|
|
teacherOpenCourseMergeCourseInfoDao.deleteTeacherOpenCourseMergeCourseInfoByIds(ids);
|
|
|
|
|
|
|
|
|
|
teacherOpenCourseMergeCourseInfoService.invalidateAllCleanUpCourseInfoTreeLocalCache();
|
|
|
|
|
// teacherOpenCourseMergeCourseInfoService.invalidateAllCleanUpCourseInfoTreeLocalCache();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -177,7 +176,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
teacherOpenCourseMergeCourseInfoDao.deleteTeacherOpenCourseMergeCourseInfoByIds(ids);
|
|
|
|
|
teacherOpenCourseMergeCourseInfoService.invalidateAllCleanUpCourseInfoTreeLocalCache();
|
|
|
|
|
// teacherOpenCourseMergeCourseInfoService.invalidateAllCleanUpCourseInfoTreeLocalCache();
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
throw new PlatformException("批量删除开课课程拉取失败", e);
|
|
|
|
|
}
|
|
|
|
@ -203,9 +202,9 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
insertBatch(teacherOpenCourseMergeCourseInfoList);
|
|
|
|
|
|
|
|
|
|
// 循环刷新缓存
|
|
|
|
|
for (TeacherOpenCourseMergeCourseInfo openCourseMergeCourseInfo : teacherOpenCourseMergeCourseInfoList) {
|
|
|
|
|
teacherOpenCourseMergeCourseInfoService.invalidateCourseInfoTreeLocalCache(openCourseMergeCourseInfo.getTeacherOpenCourseId());
|
|
|
|
|
}
|
|
|
|
|
// for (TeacherOpenCourseMergeCourseInfo openCourseMergeCourseInfo : teacherOpenCourseMergeCourseInfoList) {
|
|
|
|
|
// teacherOpenCourseMergeCourseInfoService.invalidateCourseInfoTreeLocalCache(openCourseMergeCourseInfo.getTeacherOpenCourseId());
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
@ -222,7 +221,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
teacherOpenCourseMergeCourseInfo.setCourseInfoStatus(1);
|
|
|
|
|
teacherOpenCourseMergeCourseInfoDao.insert(teacherOpenCourseMergeCourseInfo);
|
|
|
|
|
|
|
|
|
|
teacherOpenCourseMergeCourseInfoService.invalidateCourseInfoTreeLocalCache(teacherOpenCourseMergeCourseInfo.getTeacherOpenCourseId());
|
|
|
|
|
// teacherOpenCourseMergeCourseInfoService.invalidateCourseInfoTreeLocalCache(teacherOpenCourseMergeCourseInfo.getTeacherOpenCourseId());
|
|
|
|
|
teacherOpenCourseMergeCourseInfoQuery.setTeacherOpenCourseMergeCourseInfoId(teacherOpenCourseMergeCourseInfo.getTeacherOpenCourseMergeCourseInfoId());
|
|
|
|
|
JsonResult jsonResult = new JsonResult();
|
|
|
|
|
jsonResult.setData(teacherOpenCourseMergeCourseInfo.getTeacherOpenCourseMergeCourseInfoId());//自增的ID丢进去
|
|
|
|
@ -262,7 +261,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
String msg = "";
|
|
|
|
|
TeacherOpenCourseMergeCourseInfo teacherOpenCourseMergeCourseInfo = teacherOpenCourseMergeCourseInfoQuery.pojo();
|
|
|
|
|
teacherOpenCourseMergeCourseInfoDao.updateTemplateById(teacherOpenCourseMergeCourseInfo);
|
|
|
|
|
teacherOpenCourseMergeCourseInfoService.invalidateCourseInfoTreeLocalCache(teacherOpenCourseMergeCourseInfo.getTeacherOpenCourseId());
|
|
|
|
|
// teacherOpenCourseMergeCourseInfoService.invalidateCourseInfoTreeLocalCache(teacherOpenCourseMergeCourseInfo.getTeacherOpenCourseId());
|
|
|
|
|
|
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
@ -814,7 +813,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
// 调用子类实现
|
|
|
|
|
beansOfType.forEach((beanName, bean) -> bean.resetOperationByTeacherOpenCourseId(teacherOpenCourseId));
|
|
|
|
|
// 清理缓存
|
|
|
|
|
invalidateAllCleanUpCourseInfoTreeLocalCache();
|
|
|
|
|
// invalidateAllCleanUpCourseInfoTreeLocalCache();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -867,7 +866,8 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
*/
|
|
|
|
|
public TeacherOpenCourseMergeCourseInfoTree getTreeLocalCacheByTeacherOpenCourseId(
|
|
|
|
|
@NotNull(message = "开课ID不能为空!") final Long teacherOpenCourseId) {
|
|
|
|
|
TeacherOpenCourseMergeCourseInfoTree teacherOpenCourseMergeCourseInfoTree = treeLocalCache.getUnchecked(teacherOpenCourseId).orNull();
|
|
|
|
|
TeacherOpenCourseMergeCourseInfoTree teacherOpenCourseMergeCourseInfoTree =
|
|
|
|
|
teacherOpenCourseMergeCourseInfoDao.getTreeLocalCacheByTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
dictParser(teacherOpenCourseMergeCourseInfoTree);
|
|
|
|
|
return teacherOpenCourseMergeCourseInfoTree;
|
|
|
|
|
}
|
|
|
|
@ -879,7 +879,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
* @param teacherOpenCourseId
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public TeacherOpenCourseMergeCourseInfo getTreeByTeacherOpenCourseId(
|
|
|
|
|
public TeacherOpenCourseMergeCourseInfo getTreeByTeacherOpenCourseId1(
|
|
|
|
|
@NotNull(message = "开课ID不能为空!") final Long teacherOpenCourseId) {
|
|
|
|
|
TeacherOpenCourseMergeCourseInfo treeCacheByTeacherOpenCourseId =
|
|
|
|
|
teacherOpenCourseMergeCourseInfoDao.getValueByTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
@ -891,6 +891,60 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
return getTreeById(treeCacheByTeacherOpenCourseId.getTeacherOpenCourseMergeCourseInfoId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据开课课程ID获取开课课程信息
|
|
|
|
|
* 基于本地缓存,带到期时间
|
|
|
|
|
*
|
|
|
|
|
* @param teacherOpenCourseId
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public Tree<String> getTreeByTeacherOpenCourseId(
|
|
|
|
|
@NotNull(message = "开课ID不能为空!") final Long teacherOpenCourseId) {
|
|
|
|
|
|
|
|
|
|
List<TeacherOpenCourseMergeCourseInfoMyTree> courseInfoList = teacherOpenCourseMergeCourseInfoDao
|
|
|
|
|
.getByOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
dictParser(courseInfoList);
|
|
|
|
|
|
|
|
|
|
TeacherOpenCourseMergeResourcesInfoQuery resourcesInfoQuery = new TeacherOpenCourseMergeResourcesInfoQuery();
|
|
|
|
|
resourcesInfoQuery.setResourcesInfoStatus(UP);
|
|
|
|
|
resourcesInfoQuery.setTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
final List<TeacherOpenCourseMergeResourcesInfo> resourcesInfoList = teacherOpenCourseMergeResourcesInfoService.getValuesByQueryNotWithPermission(resourcesInfoQuery);
|
|
|
|
|
|
|
|
|
|
CopyOnWriteArrayList<TeacherOpenCourseMergeResourcesInfo> resourcesInfoCopyOnWriteArrayList = new CopyOnWriteArrayList<>(resourcesInfoList);
|
|
|
|
|
|
|
|
|
|
TreeNodeConfig defaultConfig = new TreeNodeConfig();
|
|
|
|
|
defaultConfig.setIdKey(TeacherOpenCourseMergeCourseInfoMyTree.Fields.teacherOpenCourseMergeCourseInfoId);
|
|
|
|
|
defaultConfig.setParentIdKey(TeacherOpenCourseMergeCourseInfoMyTree.Fields.courseInfoParentId);
|
|
|
|
|
defaultConfig.setNameKey(TeacherOpenCourseMergeCourseInfoMyTree.Fields.courseInfoName);
|
|
|
|
|
defaultConfig.setWeightKey(TeacherOpenCourseMergeCourseInfoMyTree.Fields.teacherOpenCourseMergeCourseInfoId);
|
|
|
|
|
|
|
|
|
|
//3.转为树结构,其中rootId参数代表根节点的父级id值
|
|
|
|
|
List<Tree<String>> build = TreeUtil.build(courseInfoList, "0", defaultConfig, ((courseInfo, treeNode) -> {
|
|
|
|
|
Long courseInfoId = courseInfo.getTeacherOpenCourseMergeCourseInfoId();
|
|
|
|
|
|
|
|
|
|
List<TeacherOpenCourseMergeResourcesInfo> filteredResourcesInfoList = resourcesInfoCopyOnWriteArrayList.stream()
|
|
|
|
|
.filter(it -> it.getTeacherOpenCourseMergeCourseInfoId().equals(courseInfoId)).collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
// 获取课程ids
|
|
|
|
|
String courseInfoIds = filteredResourcesInfoList.stream().map(TeacherOpenCourseMergeResourcesInfo::getTeacherOpenCourseMergeCourseInfoId)
|
|
|
|
|
.map(Objects::toString)
|
|
|
|
|
.collect(Collectors.joining(","));
|
|
|
|
|
// 删除临时变量
|
|
|
|
|
resourcesInfoCopyOnWriteArrayList.removeIf(it -> courseInfoIds.contains(it.getTeacherOpenCourseMergeCourseInfoId().toString()));
|
|
|
|
|
|
|
|
|
|
//对key进行映射赋值
|
|
|
|
|
treeNode.setId(courseInfoId.toString());
|
|
|
|
|
treeNode.setParentId(courseInfo.getCourseInfoParentId().toString());
|
|
|
|
|
treeNode.setName(courseInfo.getCourseInfoName());
|
|
|
|
|
treeNode.putExtra("courseInfoType", courseInfo.getCourseInfoType());
|
|
|
|
|
treeNode.putExtra("courseInfoContent", courseInfo.getCourseInfoContent());
|
|
|
|
|
treeNode.putExtra("resourcesInfo", filteredResourcesInfoList);
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
if (build == null) { return null; }
|
|
|
|
|
return build.get(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 根据课程(章节、小节)ID,获取该ID下的子集,返回一维集合
|
|
|
|
|