|
|
|
@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
|
|
|
|
|
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.map.MapUtil;
|
|
|
|
|
import cn.hutool.core.stream.CollectorUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
@ -47,8 +48,12 @@ 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.collection.ListUtil.toCopyOnWriteArrayList;
|
|
|
|
|
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 java.util.stream.Collectors.joining;
|
|
|
|
|
import static java.util.stream.Collectors.toSet;
|
|
|
|
@ -87,6 +92,9 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
@Lazy
|
|
|
|
|
private TeacherOpenCourseMergeCourseInfoService teacherOpenCourseMergeCourseInfoService;
|
|
|
|
|
|
|
|
|
|
// 这里简单使用一个雪花算法,来生成新的开课课程ID
|
|
|
|
|
private static Snowflake snowflake = new Snowflake();
|
|
|
|
|
|
|
|
|
|
//树结构缓存
|
|
|
|
|
|
|
|
|
|
private Map<Long,TeacherOpenCourseMergeCourseInfo> TreeCache = new ConcurrentHashMap<>();
|
|
|
|
@ -99,7 +107,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
new CacheLoader<Long, Optional<TeacherOpenCourseMergeCourseInfoTree>>() {
|
|
|
|
|
@Override
|
|
|
|
|
public Optional<TeacherOpenCourseMergeCourseInfoTree> load(Long teacherOpenCourseId) {
|
|
|
|
|
return Optional.fromNullable(teacherOpenCourseMergeCourseInfoDao.getValueByTeacherOpenCourseId(teacherOpenCourseId));
|
|
|
|
|
return Optional.fromNullable(teacherOpenCourseMergeCourseInfoDao.getTreeLocalCacheByTeacherOpenCourseId(teacherOpenCourseId));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@ -464,13 +472,81 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 此方法,必须要保证
|
|
|
|
|
* {@link TeacherOpenCourseMergeCourseInfo#getTeacherOpenCourseMergeCourseInfoId()}
|
|
|
|
|
* {@link TeacherOpenCourseMergeCourseInfo#getCourseInfoParentId()}
|
|
|
|
|
* 这两个属性,不能为空。因为要重新赋值这两个ID,所以必须保证不为空。
|
|
|
|
|
* 代码中,也会先验证这块不为空!!!
|
|
|
|
|
* 修改TeacherOpenCourseMergeCourseInfo的ID和parentId
|
|
|
|
|
* 生成新的ID,父级ID跟着变化
|
|
|
|
|
* @param copyToList
|
|
|
|
|
* @param parentId
|
|
|
|
|
*
|
|
|
|
|
* @param copyToList 带递归层级的开课课程列表
|
|
|
|
|
* @param parentId 开课课程 父辈ID
|
|
|
|
|
* @param idPair 转换之前的ID和转换之后的ID对(用于后面的题目、资源的ID替换)
|
|
|
|
|
* @return 转换之前的ID和转换之后的ID对(用于后面的题目、资源的ID替换)
|
|
|
|
|
*/
|
|
|
|
|
public void batchUpdateSomeMergeId(List<TeacherOpenCourseMergeCourseInfo> copyToList, Long parentId) {
|
|
|
|
|
public void batchUpdateSomeMergeId(List<TeacherOpenCourseMergeCourseInfoTree> copyToList,
|
|
|
|
|
final Long parentId, ConcurrentHashMap<Long, Long> idPair) {
|
|
|
|
|
|
|
|
|
|
// 转换成线程安全的集合,来并行操作。
|
|
|
|
|
List<TeacherOpenCourseMergeCourseInfoTree> safeList = new CopyOnWriteArrayList<>(copyToList);
|
|
|
|
|
|
|
|
|
|
// 先判断必要的条件不能为空!才能继续进行下面的重置ID操作
|
|
|
|
|
safeList.stream().parallel().forEach(item -> {
|
|
|
|
|
Assert.notNull(item.getTeacherOpenCourseMergeCourseInfoId(), "开课课程ID不能为空!");
|
|
|
|
|
Assert.notNull(item.getCourseInfoParentId(), "开课课程上级ID不能为空!");
|
|
|
|
|
|
|
|
|
|
Long newId = defaultIfNull(parentId, snowflake.nextId());
|
|
|
|
|
item.setTeacherOpenCourseMergeCourseInfoId(newId);
|
|
|
|
|
// 存储ID对
|
|
|
|
|
idPair.put(item.getTeacherOpenCourseMergeCourseInfoId(), newId);
|
|
|
|
|
batchUpdateSomeMergeId(item.getChildren(), snowflake.nextId(), idPair);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void batchUpdateArrayListSomeMergeId(List<TeacherOpenCourseMergeCourseInfo> copyToList,
|
|
|
|
|
final Long parentId, ConcurrentHashMap<Long, Long> idPair) {
|
|
|
|
|
|
|
|
|
|
// 转换成线程安全的集合,来并行操作。
|
|
|
|
|
// TODO 未完待续。
|
|
|
|
|
CopyOnWriteArrayList<TeacherOpenCourseMergeCourseInfo> onWriteArrayList = toCopyOnWriteArrayList(copyToList);
|
|
|
|
|
Iterator<TeacherOpenCourseMergeCourseInfo> iterator = onWriteArrayList.stream().parallel().iterator();
|
|
|
|
|
List<TeacherOpenCourseMergeCourseInfo> reference = onWriteArrayList.stream().parallel().collect(Collectors.toList());
|
|
|
|
|
iterator.forEachRemaining(item -> {
|
|
|
|
|
|
|
|
|
|
// 先判断必要的条件不能为空!才能继续进行下面的重置ID操作
|
|
|
|
|
Assert.notNull(item.getTeacherOpenCourseMergeCourseInfoId(), "开课课程ID不能为空!");
|
|
|
|
|
Assert.notNull(item.getCourseInfoParentId(), "开课课程上级ID不能为空!");
|
|
|
|
|
|
|
|
|
|
// 查找parentId对应关系
|
|
|
|
|
List<TeacherOpenCourseMergeCourseInfo> filterMatchList = reference.stream()
|
|
|
|
|
.filter(ref -> ref.getCourseInfoParentId().equals(item.getTeacherOpenCourseMergeCourseInfoId()))
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
|
|
|
|
Long newId = defaultIfNull(parentId, snowflake.nextId());
|
|
|
|
|
item.setTeacherOpenCourseMergeCourseInfoId(newId);
|
|
|
|
|
// 存储ID对
|
|
|
|
|
idPair.put(item.getTeacherOpenCourseMergeCourseInfoId(), newId);
|
|
|
|
|
iterator.remove();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 树型集合转一维集合
|
|
|
|
|
* 带对象转换
|
|
|
|
|
*
|
|
|
|
|
* @param copyToList 树型集合
|
|
|
|
|
* @param result 结果集
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
public void treeListConvertArrayList(List<TeacherOpenCourseMergeCourseInfoTree> copyToList,
|
|
|
|
|
CopyOnWriteArrayList<TeacherOpenCourseMergeCourseInfo> result) {
|
|
|
|
|
// 启用并行操作,使用线程安全的集合用来保存
|
|
|
|
|
copyToList.stream().parallel().forEach(item -> {
|
|
|
|
|
result.add(BeanUtil.copyProperties(item, TeacherOpenCourseMergeCourseInfo.class));
|
|
|
|
|
treeListConvertArrayList(item.getChildren(), result);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -672,7 +748,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
public TeacherOpenCourseMergeCourseInfo getTreeByTeacherOpenCourseId(
|
|
|
|
|
@NotNull(message = "开课ID不能为空!") final Long teacherOpenCourseId) {
|
|
|
|
|
TeacherOpenCourseMergeCourseInfo treeLocalCacheByTeacherOpenCourseId =
|
|
|
|
|
teacherOpenCourseMergeCourseInfoDao.getTreeLocalCacheByTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
teacherOpenCourseMergeCourseInfoDao.getValueByTeacherOpenCourseId(teacherOpenCourseId);
|
|
|
|
|
|
|
|
|
|
if (ObjectUtil.isEmpty(treeLocalCacheByTeacherOpenCourseId)) {
|
|
|
|
|
return null;
|
|
|
|
|