diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeCourseInfo.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeCourseInfo.java index 7c646103..4a21af36 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeCourseInfo.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseMergeCourseInfo.java @@ -8,6 +8,7 @@ import org.beetl.sql.annotation.entity.AutoID; import org.beetl.sql.fetch.annotation.Fetch; import javax.validation.constraints.NotNull; +import java.math.BigDecimal; import java.util.List; /* @@ -101,6 +102,9 @@ public class TeacherOpenCourseMergeCourseInfo extends BaseEntity implements Comp //实训题IDs(和章对应) private String resourcesTrainingIds ; + + //排序值 + private BigDecimal teacherOpenCourseMergeCourseInfoOrder; //组织机构ID @@ -347,6 +351,13 @@ public class TeacherOpenCourseMergeCourseInfo extends BaseEntity implements Comp this.userId = userId; } + public BigDecimal getTeacherOpenCourseMergeCourseInfoOrder() { + return teacherOpenCourseMergeCourseInfoOrder; + } + + public void setTeacherOpenCourseMergeCourseInfoOrder(BigDecimal teacherOpenCourseMergeCourseInfoOrder) { + this.teacherOpenCourseMergeCourseInfoOrder = teacherOpenCourseMergeCourseInfoOrder; + } public void putChildren(List courseInfoList){ this.set("children", courseInfoList); diff --git a/web/src/main/java/com/ibeetl/jlw/service/StudentClientLinkService.java b/web/src/main/java/com/ibeetl/jlw/service/StudentClientLinkService.java index 9d6e275e..397f80e1 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/StudentClientLinkService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/StudentClientLinkService.java @@ -295,6 +295,5 @@ public class StudentClientLinkService extends CoreBaseService log.error("不支持的移动类型!"); break; } - } } diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeCourseInfoService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeCourseInfoService.java index 1fb537cd..20caf51a 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeCourseInfoService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeCourseInfoService.java @@ -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 links = teacherOpenCourseMergeCourseInfoDao.getByIds(id.toString()); + + Assert.notEmpty(links, "未查询到要移动的元素!"); + + TeacherOpenCourseMergeCourseInfo mergeCourseInfo = links.get(0); + + switch (moveType) { + + case MOVE_TOP: { + List 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 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 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; + } + } + + /** + * 功能描述:
+ * 拖动 + * 只传左元素,表示:拖动元素 在 左元素的左侧; + * 只传右元素,表示:拖动元素 在 右元素的右侧; + * 左右元素都传,则拖动元素放置在两个元素的中间。 + * + * @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 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) { + + } + } } diff --git a/web/src/main/java/com/ibeetl/jlw/web/StudentClientLinkController.java b/web/src/main/java/com/ibeetl/jlw/web/StudentClientLinkController.java index b29cecd0..afa7cf2d 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/StudentClientLinkController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/StudentClientLinkController.java @@ -276,7 +276,7 @@ public class StudentClientLinkController{ * @Author: 87966 * @Date: 2023/1/9 16:17 */ - @GetMapping(MODEL + "/move.json") + @PostMapping(MODEL + "/move.json") @ResponseBody public JsonResult move(Long id, MoveEnum moveType) { studentClientLinkService.move(id, moveType); diff --git a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseMergeCourseInfoController.java b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseMergeCourseInfoController.java index 63eeb4f2..57399db7 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseMergeCourseInfoController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseMergeCourseInfoController.java @@ -14,6 +14,7 @@ import com.ibeetl.admin.core.util.TimeTool; import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.jlw.entity.FileEntity; import com.ibeetl.jlw.entity.TeacherOpenCourseMergeCourseInfo; +import com.ibeetl.jlw.enums.MoveEnum; import com.ibeetl.jlw.service.TeacherOpenCourseMergeCourseInfoService; import com.ibeetl.jlw.web.query.TeacherOpenCourseMergeCourseInfoQuery; import org.apache.commons.lang3.StringUtils; @@ -568,4 +569,41 @@ public class TeacherOpenCourseMergeCourseInfoController{ return JsonResult.success(teacherOpenCourseMergeCourseInfoService.getTreeLocalCacheByTeacherOpenCourseId(teacherOpenCourseId)); } + /** + * 功能描述:
+ * 排序 移动 + * + * @param id ID + * @param moveType 移动类型 + * @return {@link JsonResult} + * @Author: 87966 + * @Date: 2023/1/9 16:17 + */ + @PostMapping(MODEL + "/move.json") + @ResponseBody + public JsonResult move(Long id, MoveEnum moveType) { + teacherOpenCourseMergeCourseInfoService.move(id, moveType); + return JsonResult.success(); + } + + /** + * 功能描述:
+ * 拖动 + * 只传左元素,表示:拖动元素 在 左元素的左侧; + * 只传右元素,表示:拖动元素 在 右元素的右侧; + * 左右元素都传,则拖动元素放置在两个元素的中间。 + * + * @param id 拖动元素的ID + * @param leftId 左元素ID + * @param rightId 右元素ID + * @return {@link JsonResult} + * @Author: 87966 + * @Date: 2023/1/9 16:44 + */ + @PostMapping(MODEL + "/drag.json") + @ResponseBody + public JsonResult drag(Long id, Long leftId, Long rightId) { + teacherOpenCourseMergeCourseInfoService.drag(id, leftId, rightId); + return JsonResult.success(); + } }