拖动,排序

beetlsql3-dev
Mlxa0324 2 years ago
parent d8b3391c3f
commit 0274ce9f57

@ -11,6 +11,7 @@ import org.beetl.sql.fetch.annotation.Fetch;
import org.beetl.sql.fetch.annotation.FetchSql;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@ -99,6 +100,9 @@ public class CourseInfo extends BaseEntity{
private Date addTime ;
// 排序值
private BigDecimal courseInfoOrder;
@UpdateIgnore
@InsertIgnore
@FetchSql("select * from resources_info t where t.course_info_id = #courseInfoId# order by order_index desc")
@ -344,4 +348,12 @@ public class CourseInfo extends BaseEntity{
public String getCourseInfoFullId() {
return this.courseInfoFullId;
}
public BigDecimal getCourseInfoOrder() {
return courseInfoOrder;
}
public void setCourseInfoOrder(BigDecimal courseInfoOrder) {
this.courseInfoOrder = courseInfoOrder;
}
}

@ -1,7 +1,11 @@
package com.ibeetl.jlw.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.jlw.Interceptor.GetFile;
import cn.jlw.util.ToolUtils;
import com.beust.jcommander.internal.Maps;
@ -14,7 +18,9 @@ import com.ibeetl.admin.core.web.JsonResult;
import com.ibeetl.jlw.dao.CourseInfoDao;
import com.ibeetl.jlw.dao.ResourcesApplicationCourseDao;
import com.ibeetl.jlw.entity.*;
import com.ibeetl.jlw.enums.MoveEnum;
import com.ibeetl.jlw.web.query.CourseInfoQuery;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.openxml4j.opc.PackagePart;
import org.apache.poi.openxml4j.opc.PackagePartName;
@ -30,12 +36,17 @@ import org.springframework.transaction.annotation.Transactional;
import javax.validation.constraints.NotNull;
import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
import static cn.hutool.core.util.ObjectUtil.defaultIfNull;
import static cn.jlw.util.ConvertM3U8.booleanMap;
import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUserId;
import static java.lang.Math.min;
import static java.math.BigDecimal.ROUND_HALF_UP;
/**
@ -43,6 +54,7 @@ import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUserId;
*/
@Service
@Slf4j
@Transactional
public class CourseInfoService extends CoreBaseService<CourseInfo>{
@ -856,25 +868,6 @@ public class CourseInfoService extends CoreBaseService<CourseInfo>{
}
/**
*
* @param moveDTO
* @return
*/
public void move(MoveDTO moveDTO) {
moveDTO.getMoveType();
moveDTO.getId();
moveDTO.getNum();
switch(moveDTO.getMoveType()) {
case MOVE_TOP:
case MOVE_LEFT:
case MOVE_RIGHT:
}
}
//线程处理 根据章节分割word
private class TaskCallable2Split implements Callable<Boolean> {
File file;
@ -1081,4 +1074,210 @@ public class CourseInfoService extends CoreBaseService<CourseInfo>{
return courseInfoDao.getCourseInfoPageByUniversitiesCollegesId(pageQuery);
}
/**
*
* 00
* @param id
* @param moveType
*/
public void move(@NotNull(message = "ID不能为空") Long id, @NotNull(message = "移动类型不能为空!") MoveEnum moveType) {
List<CourseInfo> links = courseInfoDao.createLambdaQuery().andIn(CourseInfo::getCourseInfoId, Arrays.asList(id))
.andEq(CourseInfo::getCourseInfoStatus, 1)
.select();
Assert.notEmpty(links, "未查询到要移动的元素!");
CourseInfo mergeCourseInfo = links.get(0);
switch (moveType) {
case MOVE_TOP: {
List<CourseInfo> result = courseInfoDao.createLambdaQuery()
.andEq(CourseInfo::getCourseInfoType, mergeCourseInfo.getCourseInfoType())
.andEq(CourseInfo::getCourseInfoStatus, 1)
.andNotEq(CourseInfo::getCourseInfoId, id)
.asc(CourseInfo::getCourseInfoOrder)
.limit(1, 1)
.select(CourseInfo::getCourseInfoOrder);
if (CollectionUtil.isNotEmpty(result)) {
CourseInfo minOrderClientLink = result.get(0);
// 最小的排序值
BigDecimal minLinkOrder = minOrderClientLink.getCourseInfoOrder();
// 置顶就现有的最小值减1。但是需要确保结果小于0
BigDecimal calcedOrder = BigDecimal.valueOf(NumberUtil.sub(min(minLinkOrder.floatValue(), 0), 1));
// 改变排序记录值
CourseInfo updatePO = new CourseInfo();
updatePO.setCourseInfoId(mergeCourseInfo.getCourseInfoId());
updatePO.setCourseInfoOrder(calcedOrder);
updateTemplate(updatePO);
}
} break;
case MOVE_LEFT: {
List<CourseInfo> result = courseInfoDao.createLambdaQuery()
.andEq(CourseInfo::getCourseInfoType, mergeCourseInfo.getCourseInfoType())
.andLess(CourseInfo::getCourseInfoOrder, mergeCourseInfo.getCourseInfoOrder())
.andEq(CourseInfo::getCourseInfoStatus, 1)
.andNotEq(CourseInfo::getCourseInfoId, id)
.desc(CourseInfo::getCourseInfoOrder)
.limit(1, 2)
.select(CourseInfo::getCourseInfoOrder);
if (CollectionUtil.isNotEmpty(result)) {
// 找到应该安插的位置
BigDecimal LinkOrder0 = result.get(0).getCourseInfoOrder();
BigDecimal LinkOrder1 = LinkOrder0.subtract(BigDecimal.ONE);
if (result.size() == 2) {
LinkOrder1 = result.get(1).getCourseInfoOrder();
}
BigDecimal min = NumberUtil.min(LinkOrder0, LinkOrder1);
BigDecimal max = NumberUtil.max(LinkOrder0, LinkOrder1);
// 左移位后的值
double calcedOrder = RandomUtil.randomDouble(min.doubleValue(), max.doubleValue(), 6, RoundingMode.HALF_UP);
// 改变排序记录值
CourseInfo updatePO = new CourseInfo();
updatePO.setCourseInfoId(mergeCourseInfo.getCourseInfoId());
updatePO.setCourseInfoOrder(BigDecimal.valueOf(calcedOrder));
updateTemplate(updatePO);
}
} break;
case MOVE_RIGHT: {
List<CourseInfo> result = courseInfoDao.createLambdaQuery()
.andEq(CourseInfo::getCourseInfoType, mergeCourseInfo.getCourseInfoType())
.andGreat(CourseInfo::getCourseInfoOrder, mergeCourseInfo.getCourseInfoOrder())
.andEq(CourseInfo::getCourseInfoStatus, 1)
.andNotEq(CourseInfo::getCourseInfoId, id)
.asc(CourseInfo::getCourseInfoOrder)
.limit(1, 2)
.select(CourseInfo::getCourseInfoOrder);
if (CollectionUtil.isNotEmpty(result)) {
// 找到应该安插的位置
BigDecimal LinkOrder0 = result.get(0).getCourseInfoOrder();
BigDecimal LinkOrder1 = LinkOrder0.add(BigDecimal.ONE);
if (result.size() == 2) {
LinkOrder1 = result.get(1).getCourseInfoOrder();
}
BigDecimal min = NumberUtil.min(LinkOrder0, LinkOrder1);
BigDecimal max = NumberUtil.max(LinkOrder0, LinkOrder1);
// 右移位后的值
double calcedOrder = RandomUtil.randomDouble(min.doubleValue(), max.doubleValue(), 6, RoundingMode.HALF_UP);
// 改变排序记录值
CourseInfo updatePO = new CourseInfo();
updatePO.setCourseInfoId(mergeCourseInfo.getCourseInfoId());
updatePO.setCourseInfoOrder(BigDecimal.valueOf(calcedOrder));
updateTemplate(updatePO);
}
} break;
default:
log.error("不支持的移动类型!");
break;
}
}
/**
* : <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<CourseInfo> allElement = courseInfoDao.createLambdaQuery().andIn(CourseInfo::getCourseInfoId, Arrays.asList(id, leftId, rightId))
.andEq(CourseInfo::getCourseInfoStatus, 1)
.select();
// 自身ID是否存在
boolean hasSelf = allElement.stream().anyMatch(item -> item.getCourseInfoId().equals(id));
// 是否有左元素
boolean hasLeft = allElement.stream().anyMatch(item -> item.getCourseInfoId().equals(leftId));
// 是否有元素
boolean hasRight = allElement.stream().anyMatch(item -> item.getCourseInfoId().equals(rightId));
// 断言
Assert.isTrue(hasSelf, "未查询到要移动的元素!");
Assert.isFalse(!hasLeft && !hasRight, "左右元素ID不能同时为空");
// 自身元素
CourseInfo selfElement = allElement.stream()
.filter(item -> item.getCourseInfoId().equals(id)).findFirst().get();
// 左侧元素
CourseInfo leftElement = allElement.stream()
.filter(item -> item.getCourseInfoId().equals(leftId)).findFirst().orElse(null);
// 右侧元素
CourseInfo rightElement = allElement.stream()
.filter(item -> item.getCourseInfoId().equals(rightId)).findFirst().orElse(null);
// 定义排序值
BigDecimal clacedOrder = null;
// 左移动,无法确定右侧边界,适用于置顶
if (hasLeft && !hasRight) {
BigDecimal leftOrder = defaultIfNull(leftElement.getCourseInfoOrder(), 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.getCourseInfoOrder(), 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.getCourseInfoOrder(), BigDecimal.ZERO);
BigDecimal rightOrder = defaultIfNull(rightElement.getCourseInfoOrder(), BigDecimal.ONE);
// 随机取值
BigDecimal randomNum = RandomUtil.randomBigDecimal(leftOrder, rightOrder).setScale(6, ROUND_HALF_UP);
// 计算后的排序值
clacedOrder = rightOrder.add(randomNum);
}
// 最后更新排序值
if (clacedOrder != null) {
CourseInfo updatePO = new CourseInfo();
updatePO.setCourseInfoId(selfElement.getCourseInfoId());
updatePO.setCourseInfoOrder(clacedOrder);
updateTemplate(updatePO);
}
}
}

@ -1,39 +0,0 @@
package com.ibeetl.jlw.service;
import com.ibeetl.jlw.enums.MoveEnum;
import lombok.Data;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotNull;
/**
* <p>
*
* </p>
*
* @author mlx
* @date 2022/11/4
* @modified
*/
@Validated
@Data
public class MoveDTO {
/**
* id
*/
@NotNull(message = "排序指定的ID不能为空")
private Long id;
/**
*
*/
@NotNull(message = "排序的移动类型不能为空!")
private MoveEnum moveType;
/**
*
*/
private Long num = 1L;
}

@ -1312,15 +1312,15 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
List<TeacherOpenCourseMergeCourseInfo> allElement = teacherOpenCourseMergeCourseInfoDao.getByIds(join(new Long[]{ id, leftId, rightId }, ","));
// 自身ID是否存在
boolean isHaveSelf = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(id));
boolean hasSelf = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(id));
// 是否有左元素
boolean isHaveLeft = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(leftId));
boolean hasLeft = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(leftId));
// 是否有元素
boolean isHaveRight = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(rightId));
boolean hasRight = allElement.stream().anyMatch(item -> item.getTeacherOpenCourseMergeCourseInfoId().equals(rightId));
// 断言
Assert.isTrue(isHaveSelf, "未查询到要移动的元素!");
Assert.isFalse(!isHaveLeft && !isHaveRight, "左右元素ID不能同时为空");
Assert.isTrue(hasSelf, "未查询到要移动的元素!");
Assert.isFalse(!hasLeft && !hasRight, "左右元素ID不能同时为空");
// 自身元素
TeacherOpenCourseMergeCourseInfo selfElement = allElement.stream()
@ -1336,7 +1336,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
BigDecimal clacedOrder = null;
// 左移动,无法确定右侧边界,适用于置顶
if (isHaveLeft && !isHaveRight) {
if (hasLeft && !hasRight) {
BigDecimal leftOrder = defaultIfNull(leftElement.getTeacherOpenCourseMergeCourseInfoOrder(), BigDecimal.ZERO);
// 数据库里存小数点后六位的排序值
// 随机取值 0.0001 到 0.0005之间
@ -1346,7 +1346,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
}
// 右移动,无法确定左侧边界,适用于置底
else if (!isHaveLeft && isHaveRight) {
else if (!hasLeft && hasRight) {
BigDecimal rightOrder = defaultIfNull(rightElement.getTeacherOpenCourseMergeCourseInfoOrder(), BigDecimal.ZERO);
// 数据库里存小数点后六位的排序值
// 随机取值 0.0001 到 0.0005之间
@ -1357,7 +1357,7 @@ public class TeacherOpenCourseMergeCourseInfoService extends CoreBaseService<Tea
}
// 可以确定左右两侧边界,移动的比较精准
else if (isHaveLeft && isHaveRight) {
else if (hasLeft && hasRight) {
BigDecimal leftOrder = defaultIfNull(leftElement.getTeacherOpenCourseMergeCourseInfoOrder(), BigDecimal.ZERO);
BigDecimal rightOrder = defaultIfNull(rightElement.getTeacherOpenCourseMergeCourseInfoOrder(), BigDecimal.ONE);
// 随机取值

@ -9,9 +9,9 @@ import com.ibeetl.admin.core.web.JsonResult;
import com.ibeetl.jlw.entity.CourseInfo;
import com.ibeetl.jlw.entity.FileEntity;
import com.ibeetl.jlw.entity.ResourcesApplicationCourse;
import com.ibeetl.jlw.enums.MoveEnum;
import com.ibeetl.jlw.service.CourseInfoService;
import com.ibeetl.jlw.service.CourseLabelService;
import com.ibeetl.jlw.service.MoveDTO;
import com.ibeetl.jlw.service.ResourcesApplicationCourseService;
import com.ibeetl.jlw.web.query.CourseInfoQuery;
import com.ibeetl.jlw.web.query.CourseInfoUniCollegesQuery;
@ -297,19 +297,45 @@ public class CourseInfoController{
}
/**
*
* : <br>
*
*
* @param coreUser
* @return
* @param id ID
* @param moveType
* @return {@link JsonResult}
* @Author: 87966
* @Date: 2023/1/9 16:17
*/
@PostMapping(API + "/move.do")
@PostMapping(MODEL + "/move.json")
@ResponseBody
public JsonResult move(MoveDTO moveDTO, @SCoreUser CoreUser coreUser) {
if(null == coreUser){
return JsonResult.failMessage("请登录后再操作");
}else{
courseInfoService.move(moveDTO);
return JsonResult.success();
}
public JsonResult move(Long id, MoveEnum moveType) {
courseInfoService.move(id, moveType);
return JsonResult.success();
}
/**
* : <br>
*
*
*
*
*
* ==>
* ==>
*
*
*
* @param id ID
* @param leftId ID ID
* @param rightId ID 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) {
courseInfoService.drag(id, leftId, rightId);
return JsonResult.success();
}
}

Loading…
Cancel
Save