|
|
|
@ -2,9 +2,13 @@ package com.ibeetl.jlw.service;
|
|
|
|
|
|
|
|
|
|
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.map.MapUtil;
|
|
|
|
|
import cn.hutool.core.util.ArrayUtil;
|
|
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import cn.hutool.core.util.RandomUtil;
|
|
|
|
|
import cn.jlw.util.ToolUtils;
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
|
@ -18,6 +22,7 @@ import com.ibeetl.jlw.entity.CourseInfo;
|
|
|
|
|
import com.ibeetl.jlw.entity.FileEntity;
|
|
|
|
|
import com.ibeetl.jlw.entity.ResourcesInfo;
|
|
|
|
|
import com.ibeetl.jlw.entity.TeacherOpenCourseMergeResourcesInfo;
|
|
|
|
|
import com.ibeetl.jlw.enums.MoveEnum;
|
|
|
|
|
import com.ibeetl.jlw.web.query.ResourcesInfoQuery;
|
|
|
|
|
import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeResourcesInfoQuery;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
@ -38,9 +43,14 @@ import javax.annotation.Nullable;
|
|
|
|
|
import javax.validation.constraints.NotBlank;
|
|
|
|
|
import javax.validation.constraints.NotNull;
|
|
|
|
|
import java.io.*;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.math.RoundingMode;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
import static cn.hutool.core.util.ObjectUtil.defaultIfNull;
|
|
|
|
|
import static com.ibeetl.admin.core.util.ExcelUtil.getCellFormatValue;
|
|
|
|
|
import static java.lang.Math.min;
|
|
|
|
|
import static java.math.BigDecimal.ROUND_HALF_UP;
|
|
|
|
|
import static java.util.stream.Collectors.joining;
|
|
|
|
|
import static java.util.stream.Collectors.toSet;
|
|
|
|
|
import static org.apache.commons.lang3.StringUtils.join;
|
|
|
|
@ -447,4 +457,195 @@ public class TeacherOpenCourseMergeResourcesInfoService extends CoreBaseService<
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 位置移动
|
|
|
|
|
* 小于0的数字,是代表置顶。大于0代表非置顶
|
|
|
|
|
* @param id
|
|
|
|
|
* @param moveType
|
|
|
|
|
*/
|
|
|
|
|
public void move(@NotNull(message = "ID不能为空!") Long id, @NotNull(message = "移动类型不能为空!") MoveEnum moveType) {
|
|
|
|
|
List<TeacherOpenCourseMergeResourcesInfo> links = teacherOpenCourseMergeResourcesInfoDao.getByIds(id.toString());
|
|
|
|
|
|
|
|
|
|
Assert.notEmpty(links, "未查询到要移动的元素!");
|
|
|
|
|
|
|
|
|
|
TeacherOpenCourseMergeResourcesInfo mergeCourseInfo = links.get(0);
|
|
|
|
|
|
|
|
|
|
// 定义排序值
|
|
|
|
|
Double calcedOrder = null;
|
|
|
|
|
|
|
|
|
|
switch (moveType) {
|
|
|
|
|
|
|
|
|
|
case MOVE_TOP: {
|
|
|
|
|
List<TeacherOpenCourseMergeResourcesInfo> result = teacherOpenCourseMergeResourcesInfoDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseMergeResourcesInfo::getResourcesInfoStatus, 1)
|
|
|
|
|
.andEq(TeacherOpenCourseMergeResourcesInfo::getTeacherOpenCourseMergeCourseInfoId, mergeCourseInfo.getTeacherOpenCourseMergeCourseInfoId())
|
|
|
|
|
.asc(TeacherOpenCourseMergeResourcesInfo::getOrderIndex)
|
|
|
|
|
.limit(1, 1)
|
|
|
|
|
.select(TeacherOpenCourseMergeResourcesInfo::getOrderIndex);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(result)) {
|
|
|
|
|
TeacherOpenCourseMergeResourcesInfo minOrderClientLink = result.get(0);
|
|
|
|
|
// 最小的排序值
|
|
|
|
|
BigDecimal minLinkOrder = minOrderClientLink.getOrderIndex();
|
|
|
|
|
// 置顶就现有的最小值减1。但是需要确保结果小于0
|
|
|
|
|
calcedOrder = NumberUtil.sub(min(minLinkOrder.floatValue(), 0), 1);
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case MOVE_LEFT: {
|
|
|
|
|
List<TeacherOpenCourseMergeResourcesInfo> result = teacherOpenCourseMergeResourcesInfoDao.createLambdaQuery()
|
|
|
|
|
.andEq(TeacherOpenCourseMergeResourcesInfo::getResourcesInfoStatus, 1)
|
|
|
|
|
.andNotEq(TeacherOpenCourseMergeResourcesInfo::getTeacherOpenCourseMergeResourcesInfoId, mergeCourseInfo.getTeacherOpenCourseMergeResourcesInfoId())
|
|
|
|
|
.andEq(TeacherOpenCourseMergeResourcesInfo::getTeacherOpenCourseMergeCourseInfoId, mergeCourseInfo.getTeacherOpenCourseMergeCourseInfoId())
|
|
|
|
|
.andLess(TeacherOpenCourseMergeResourcesInfo::getOrderIndex, mergeCourseInfo.getOrderIndex())
|
|
|
|
|
.andEq(TeacherOpenCourseMergeResourcesInfo::getResourcesInfoStatus, 1)
|
|
|
|
|
.desc(TeacherOpenCourseMergeResourcesInfo::getOrderIndex)
|
|
|
|
|
.limit(1, 2)
|
|
|
|
|
.select(TeacherOpenCourseMergeResourcesInfo::getOrderIndex);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(result)) {
|
|
|
|
|
// 找到应该安插的位置
|
|
|
|
|
BigDecimal LinkOrder0 = result.get(0).getOrderIndex();
|
|
|
|
|
BigDecimal LinkOrder1 = LinkOrder0.subtract(BigDecimal.ONE);
|
|
|
|
|
if (result.size() == 2) {
|
|
|
|
|
LinkOrder1 = result.get(1).getOrderIndex();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BigDecimal min = NumberUtil.min(LinkOrder0, LinkOrder1);
|
|
|
|
|
BigDecimal max = NumberUtil.max(LinkOrder0, LinkOrder1);
|
|
|
|
|
|
|
|
|
|
// 左移位后的值
|
|
|
|
|
calcedOrder = RandomUtil.randomDouble(min.doubleValue(), max.doubleValue(), 6, RoundingMode.HALF_UP);
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case MOVE_RIGHT: {
|
|
|
|
|
List<TeacherOpenCourseMergeResourcesInfo> result = teacherOpenCourseMergeResourcesInfoDao.createLambdaQuery()
|
|
|
|
|
.andGreat(TeacherOpenCourseMergeResourcesInfo::getOrderIndex, mergeCourseInfo.getOrderIndex())
|
|
|
|
|
.andEq(TeacherOpenCourseMergeResourcesInfo::getResourcesInfoStatus, 1)
|
|
|
|
|
.andNotEq(TeacherOpenCourseMergeResourcesInfo::getTeacherOpenCourseMergeResourcesInfoId, mergeCourseInfo.getTeacherOpenCourseMergeResourcesInfoId())
|
|
|
|
|
.andEq(TeacherOpenCourseMergeResourcesInfo::getTeacherOpenCourseMergeCourseInfoId, mergeCourseInfo.getTeacherOpenCourseMergeCourseInfoId())
|
|
|
|
|
.asc(TeacherOpenCourseMergeResourcesInfo::getOrderIndex)
|
|
|
|
|
.limit(1, 2)
|
|
|
|
|
.select(TeacherOpenCourseMergeResourcesInfo::getOrderIndex);
|
|
|
|
|
|
|
|
|
|
if (CollectionUtil.isNotEmpty(result)) {
|
|
|
|
|
// 找到应该安插的位置
|
|
|
|
|
BigDecimal LinkOrder0 = result.get(0).getOrderIndex();
|
|
|
|
|
BigDecimal LinkOrder1 = LinkOrder0.add(BigDecimal.ONE);
|
|
|
|
|
if (result.size() == 2) {
|
|
|
|
|
LinkOrder1 = result.get(1).getOrderIndex();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BigDecimal min = NumberUtil.min(LinkOrder0, LinkOrder1);
|
|
|
|
|
BigDecimal max = NumberUtil.max(LinkOrder0, LinkOrder1);
|
|
|
|
|
|
|
|
|
|
// 右移位后的值
|
|
|
|
|
calcedOrder = RandomUtil.randomDouble(min.doubleValue(), max.doubleValue(), 6, RoundingMode.HALF_UP);
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
default:
|
|
|
|
|
log.error("不支持的移动类型!");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (calcedOrder == null) {
|
|
|
|
|
// 改变排序记录值
|
|
|
|
|
TeacherOpenCourseMergeResourcesInfo updatePO = new TeacherOpenCourseMergeResourcesInfo();
|
|
|
|
|
updatePO.setTeacherOpenCourseMergeCourseInfoId(mergeCourseInfo.getTeacherOpenCourseMergeCourseInfoId());
|
|
|
|
|
updatePO.setOrderIndex(BigDecimal.valueOf(calcedOrder));
|
|
|
|
|
updateTemplate(updatePO);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 功能描述: <br>
|
|
|
|
|
* 拖动
|
|
|
|
|
* 只传左元素ID,表示:拖动元素 在 左元素的左侧;
|
|
|
|
|
* 只传右元素ID,表示:拖动元素 在 右元素的右侧;
|
|
|
|
|
* 左右元素ID都传,则拖动元素放置在两个元素的中间。
|
|
|
|
|
*
|
|
|
|
|
* @param id 拖动元素的ID
|
|
|
|
|
* @param leftId 左元素ID 偏小数值对应的元素ID
|
|
|
|
|
* @param rightId 右元素ID 偏大数值对应的元素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<TeacherOpenCourseMergeResourcesInfo> allElement = teacherOpenCourseMergeResourcesInfoDao.getByIds(ArrayUtil.join(new Long[]{ id, leftId, rightId }, ","));
|
|
|
|
|
|
|
|
|
|
// 自身ID是否存在
|
|
|
|
|
boolean hasSelf = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(id));
|
|
|
|
|
// 是否有左元素
|
|
|
|
|
boolean hasLeft = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(leftId));
|
|
|
|
|
// 是否有元素
|
|
|
|
|
boolean hasRight = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(rightId));
|
|
|
|
|
|
|
|
|
|
// 断言
|
|
|
|
|
Assert.isTrue(hasSelf, "未查询到要移动的元素!");
|
|
|
|
|
Assert.isFalse(!hasLeft && !hasRight, "左右元素ID不能同时为空!");
|
|
|
|
|
|
|
|
|
|
// 自身元素
|
|
|
|
|
TeacherOpenCourseMergeResourcesInfo selfElement = allElement.stream()
|
|
|
|
|
.filter(item -> item.getTeacherOpenCourseMergeResourcesInfoId().equals(id)).findFirst().get();
|
|
|
|
|
// 左侧元素
|
|
|
|
|
TeacherOpenCourseMergeResourcesInfo leftElement = allElement.stream()
|
|
|
|
|
.filter(item -> item.getTeacherOpenCourseMergeResourcesInfoId().equals(leftId)).findFirst().orElse(null);
|
|
|
|
|
// 右侧元素
|
|
|
|
|
TeacherOpenCourseMergeResourcesInfo rightElement = allElement.stream()
|
|
|
|
|
.filter(item -> item.getTeacherOpenCourseMergeResourcesInfoId().equals(rightId)).findFirst().orElse(null);
|
|
|
|
|
|
|
|
|
|
// 定义排序值
|
|
|
|
|
BigDecimal clacedOrder = null;
|
|
|
|
|
|
|
|
|
|
// 左移动,无法确定右侧边界,适用于置顶
|
|
|
|
|
if (hasLeft && !hasRight) {
|
|
|
|
|
BigDecimal leftOrder = defaultIfNull(leftElement.getOrderIndex(), BigDecimal.ZERO);
|
|
|
|
|
// 数据库里存小数点后六位的排序值
|
|
|
|
|
// 随机取值 0.0001 到 0.0005之间
|
|
|
|
|
BigDecimal randomNum = RandomUtil.randomBigDecimal(new BigDecimal("0.0001"), new BigDecimal("0.0005")).setScale(6, ROUND_HALF_UP);
|
|
|
|
|
// 计算后的排序值
|
|
|
|
|
clacedOrder = leftOrder.subtract(randomNum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 右移动,无法确定左侧边界,适用于置底
|
|
|
|
|
else if (!hasLeft && hasRight) {
|
|
|
|
|
BigDecimal rightOrder = defaultIfNull(rightElement.getOrderIndex(), BigDecimal.ZERO);
|
|
|
|
|
// 数据库里存小数点后六位的排序值
|
|
|
|
|
// 随机取值 0.0001 到 0.0005之间
|
|
|
|
|
BigDecimal randomNum = RandomUtil.randomBigDecimal(new BigDecimal("0.0001"), new BigDecimal("0.0005")).setScale(6, ROUND_HALF_UP);
|
|
|
|
|
// 计算后的排序值
|
|
|
|
|
clacedOrder = rightOrder.add(randomNum);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 可以确定左右两侧边界,移动的比较精准
|
|
|
|
|
else if (hasLeft && hasRight) {
|
|
|
|
|
BigDecimal leftOrder = defaultIfNull(leftElement.getOrderIndex(), BigDecimal.ZERO);
|
|
|
|
|
BigDecimal rightOrder = defaultIfNull(rightElement.getOrderIndex(), BigDecimal.ONE);
|
|
|
|
|
// 随机取值
|
|
|
|
|
BigDecimal randomNum = RandomUtil.randomBigDecimal(leftOrder, rightOrder).setScale(6, ROUND_HALF_UP);
|
|
|
|
|
// 计算后的排序值
|
|
|
|
|
clacedOrder = rightOrder.add(randomNum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 最后更新排序值
|
|
|
|
|
if (clacedOrder != null) {
|
|
|
|
|
TeacherOpenCourseMergeResourcesInfo updatePO = new TeacherOpenCourseMergeResourcesInfo();
|
|
|
|
|
updatePO.setTeacherOpenCourseMergeResourcesInfoId(selfElement.getTeacherOpenCourseMergeResourcesInfoId());
|
|
|
|
|
updatePO.setOrderIndex(clacedOrder);
|
|
|
|
|
updateTemplate(updatePO);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|