|
|
|
@ -9,7 +9,9 @@ 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.NumberUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import cn.hutool.core.util.RandomUtil;
|
|
|
|
|
import cn.hutool.extra.spring.SpringUtil;
|
|
|
|
|
import cn.jlw.util.ToolUtils;
|
|
|
|
|
import cn.jlw.validate.ValidateConfig;
|
|
|
|
@ -23,6 +25,7 @@ import com.ibeetl.admin.core.web.JsonReturnCode;
|
|
|
|
|
import com.ibeetl.jlw.dao.TeacherOpenCourseMergeCourseInfoDao;
|
|
|
|
|
import com.ibeetl.jlw.entity.*;
|
|
|
|
|
import com.ibeetl.jlw.entity.dto.QuestionSettingDTO;
|
|
|
|
|
import com.ibeetl.jlw.enums.MoveEnum;
|
|
|
|
|
import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeCourseInfoQuery;
|
|
|
|
|
import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeResourcesInfoQuery;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
@ -45,6 +48,8 @@ import javax.validation.constraints.NotBlank;
|
|
|
|
|
import javax.validation.constraints.NotEmpty;
|
|
|
|
|
import javax.validation.constraints.NotNull;
|
|
|
|
|
import java.io.*;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.math.RoundingMode;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
import java.util.concurrent.CopyOnWriteArrayList;
|
|
|
|
@ -55,6 +60,7 @@ 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.lang.Math.min;
|
|
|
|
|
import static java.util.stream.Collectors.toSet;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -124,12 +130,12 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 指定Key刷新缓存
|
|
|
|
|
* 异步刷新。不影响正常业务逻辑
|
|
|
|
|
*
|
|
|
|
|
* @param key
|
|
|
|
|
*/
|
|
|
|
|
// /**
|
|
|
|
|
// * 指定Key刷新缓存
|
|
|
|
|
// * 异步刷新。不影响正常业务逻辑
|
|
|
|
|
// *
|
|
|
|
|
// * @param key
|
|
|
|
|
// */
|
|
|
|
|
// @SneakyThrows
|
|
|
|
|
// @Async
|
|
|
|
|
// public void invalidateCourseInfoTreeLocalCache(Long key) {
|
|
|
|
@ -1167,4 +1173,161 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 位置移动
|
|
|
|
|
* 小于0的数字,是代表置顶。大于0代表非置顶
|
|
|
|
|
* @param id
|
|
|
|
|
* @param moveType
|
|
|
|
|
*/
|
|
|
|
|
public void move(@NotNull(message = "ID不能为空!") Long id, @NotNull(message = "移动类型不能为空!") MoveEnum moveType) {
|
|
|
|
|
List<TeacherOpenCourseMergeCourseInfo> links = teacherOpenCourseMergeCourseInfoDao.getByIds(id.toString());
|
|
|
|
|
|
|
|
|
|
Assert.notEmpty(links, "未查询到要移动的元素!");
|
|
|
|
|
|
|
|
|
|
TeacherOpenCourseMergeCourseInfo mergeCourseInfo = links.get(0);
|
|
|
|
|
|
|
|
|
|
switch (moveType) {
|
|
|
|
|
|
|
|
|
|
case MOVE_TOP: {
|
|
|
|
|
List<TeacherOpenCourseMergeCourseInfo> result = teacherOpenCourseMergeCourseInfoDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseMergeCourseInfo::getCourseInfoType, mergeCourseInfo.getCourseInfoType())
|
|
|
|
|
.andEq(TeacherOpenCourseMergeCourseInfo::getCourseInfoStatus, 1)
|
|
|
|
|
.andNotEq(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoId, id)
|
|
|
|
|
.asc(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoOrder)
|
|
|
|
|
.limit(1, 1)
|
|
|
|
|
.select(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoOrder);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(result)) {
|
|
|
|
|
TeacherOpenCourseMergeCourseInfo minOrderClientLink = result.get(0);
|
|
|
|
|
// 最小的排序值
|
|
|
|
|
BigDecimal minLinkOrder = minOrderClientLink.getTeacherOpenCourseMergeCourseInfoOrder();
|
|
|
|
|
// 置顶就现有的最小值减1。但是需要确保结果小于0
|
|
|
|
|
BigDecimal calcedOrder = BigDecimal.valueOf(NumberUtil.sub(min(minLinkOrder.floatValue(), 0), 1));
|
|
|
|
|
|
|
|
|
|
// 改变排序记录值
|
|
|
|
|
TeacherOpenCourseMergeCourseInfo updatePO = new TeacherOpenCourseMergeCourseInfo();
|
|
|
|
|
updatePO.setTeacherOpenCourseMergeCourseInfoId(mergeCourseInfo.getTeacherOpenCourseMergeCourseInfoId());
|
|
|
|
|
updatePO.setTeacherOpenCourseMergeCourseInfoOrder(calcedOrder);
|
|
|
|
|
updateTemplate(updatePO);
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case MOVE_LEFT: {
|
|
|
|
|
List<TeacherOpenCourseMergeCourseInfo> result = teacherOpenCourseMergeCourseInfoDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseMergeCourseInfo::getCourseInfoType, mergeCourseInfo.getCourseInfoType())
|
|
|
|
|
.andLess(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoOrder, mergeCourseInfo.getTeacherOpenCourseMergeCourseInfoOrder())
|
|
|
|
|
.andEq(TeacherOpenCourseMergeCourseInfo::getCourseInfoStatus, 1)
|
|
|
|
|
.andNotEq(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoId, id)
|
|
|
|
|
.desc(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoOrder)
|
|
|
|
|
.limit(1, 2)
|
|
|
|
|
.select(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoOrder);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(result)) {
|
|
|
|
|
// 找到应该安插的位置
|
|
|
|
|
BigDecimal LinkOrder0 = result.get(0).getTeacherOpenCourseMergeCourseInfoOrder();
|
|
|
|
|
BigDecimal LinkOrder1 = LinkOrder0.subtract(BigDecimal.ONE);
|
|
|
|
|
if (result.size() == 2) {
|
|
|
|
|
LinkOrder1 = result.get(1).getTeacherOpenCourseMergeCourseInfoOrder();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BigDecimal min = NumberUtil.min(LinkOrder0, LinkOrder1);
|
|
|
|
|
BigDecimal max = NumberUtil.max(LinkOrder0, LinkOrder1);
|
|
|
|
|
|
|
|
|
|
// 左移位后的值
|
|
|
|
|
double calcedOrder = RandomUtil.randomDouble(min.doubleValue(), max.doubleValue(), 6, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
|
|
// 改变排序记录值
|
|
|
|
|
TeacherOpenCourseMergeCourseInfo updatePO = new TeacherOpenCourseMergeCourseInfo();
|
|
|
|
|
updatePO.setTeacherOpenCourseMergeCourseInfoId(mergeCourseInfo.getTeacherOpenCourseMergeCourseInfoId());
|
|
|
|
|
updatePO.setTeacherOpenCourseMergeCourseInfoOrder(BigDecimal.valueOf(calcedOrder));
|
|
|
|
|
updateTemplate(updatePO);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case MOVE_RIGHT: {
|
|
|
|
|
List<TeacherOpenCourseMergeCourseInfo> result = teacherOpenCourseMergeCourseInfoDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseMergeCourseInfo::getCourseInfoType, mergeCourseInfo.getCourseInfoType())
|
|
|
|
|
.andGreat(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoOrder, mergeCourseInfo.getTeacherOpenCourseMergeCourseInfoOrder())
|
|
|
|
|
.andEq(TeacherOpenCourseMergeCourseInfo::getCourseInfoStatus, 1)
|
|
|
|
|
.andNotEq(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoId, id)
|
|
|
|
|
.asc(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoOrder)
|
|
|
|
|
.limit(1, 2)
|
|
|
|
|
.select(TeacherOpenCourseMergeCourseInfo::getTeacherOpenCourseMergeCourseInfoOrder);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(result)) {
|
|
|
|
|
// 找到应该安插的位置
|
|
|
|
|
BigDecimal LinkOrder0 = result.get(0).getTeacherOpenCourseMergeCourseInfoOrder();
|
|
|
|
|
BigDecimal LinkOrder1 = LinkOrder0.add(BigDecimal.ONE);
|
|
|
|
|
if (result.size() == 2) {
|
|
|
|
|
LinkOrder1 = result.get(1).getTeacherOpenCourseMergeCourseInfoOrder();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BigDecimal min = NumberUtil.min(LinkOrder0, LinkOrder1);
|
|
|
|
|
BigDecimal max = NumberUtil.max(LinkOrder0, LinkOrder1);
|
|
|
|
|
|
|
|
|
|
// 右移位后的值
|
|
|
|
|
double calcedOrder = RandomUtil.randomDouble(min.doubleValue(), max.doubleValue(), 6, RoundingMode.HALF_UP);
|
|
|
|
|
|
|
|
|
|
// 改变排序记录值
|
|
|
|
|
TeacherOpenCourseMergeCourseInfo updatePO = new TeacherOpenCourseMergeCourseInfo();
|
|
|
|
|
updatePO.setTeacherOpenCourseMergeCourseInfoId(mergeCourseInfo.getTeacherOpenCourseMergeCourseInfoId());
|
|
|
|
|
updatePO.setTeacherOpenCourseMergeCourseInfoOrder(BigDecimal.valueOf(calcedOrder));
|
|
|
|
|
updateTemplate(updatePO);
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
log.error("不支持的移动类型!");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 功能描述: <br>
|
|
|
|
|
* 拖动
|
|
|
|
|
* 只传左元素,表示:拖动元素 在 左元素的左侧;
|
|
|
|
|
* 只传右元素,表示:拖动元素 在 右元素的右侧;
|
|
|
|
|
* 左右元素都传,则拖动元素放置在两个元素的中间。
|
|
|
|
|
*
|
|
|
|
|
* @param id 拖动元素的ID
|
|
|
|
|
* @param leftId 左元素ID
|
|
|
|
|
* @param rightId 右元素ID
|
|
|
|
|
* @Author: 87966
|
|
|
|
|
* @Date: 2023/1/9 16:44
|
|
|
|
|
*/
|
|
|
|
|
public void drag(@NotNull(message = "要移动的元素 ID不能为空!") final Long id, final Long leftId, final Long rightId) {
|
|
|
|
|
|
|
|
|
|
// 查询出来所有元素
|
|
|
|
|
List<TeacherOpenCourseMergeCourseInfo> allElement = teacherOpenCourseMergeCourseInfoDao.getByIds(join(new Long[]{ id, leftId, rightId }, ","));
|
|
|
|
|
|
|
|
|
|
// 自身ID是否存在
|
|
|
|
|
boolean isHaveSelf = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(id));
|
|
|
|
|
// 是否有左元素
|
|
|
|
|
boolean isHaveLeft = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(leftId));
|
|
|
|
|
// 是否有元素
|
|
|
|
|
boolean isHaveRight = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(rightId));
|
|
|
|
|
|
|
|
|
|
Assert.isTrue(isHaveSelf, "未查询到要移动的元素!");
|
|
|
|
|
|
|
|
|
|
Assert.isFalse(!isHaveLeft && !isHaveRight, "左右元素ID不能同时为空!");
|
|
|
|
|
|
|
|
|
|
// 左移动,无法确定右侧边界,适用于置顶
|
|
|
|
|
if (isHaveLeft && !isHaveRight) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 右移动,无法确定左侧边界,适用于置底
|
|
|
|
|
else if (!isHaveLeft && isHaveRight) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 可以确定左右两侧边界,移动的比较精准
|
|
|
|
|
else if (isHaveLeft && isHaveRight) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|