目录拖动
This commit is contained in:
parent
34b479fe1a
commit
38320d8acb
|
@ -12,6 +12,7 @@ import org.dromara.common.log.enums.BusinessType;
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.web.core.BaseController;
|
import org.dromara.common.web.core.BaseController;
|
||||||
|
import org.dromara.system.domain.bo.CatalogDragBo;
|
||||||
import org.dromara.system.domain.bo.SysCatalogTextbookBo;
|
import org.dromara.system.domain.bo.SysCatalogTextbookBo;
|
||||||
import org.dromara.system.domain.vo.SysCatalogTextbookVo;
|
import org.dromara.system.domain.vo.SysCatalogTextbookVo;
|
||||||
import org.dromara.system.service.ISysCatalogTextbookService;
|
import org.dromara.system.service.ISysCatalogTextbookService;
|
||||||
|
@ -116,4 +117,16 @@ public class SysCatalogTextbookController extends BaseController {
|
||||||
}
|
}
|
||||||
return toAjax(textbookService.deleteById(catalogId));
|
return toAjax(textbookService.deleteById(catalogId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 拖动目录-同步教材
|
||||||
|
*
|
||||||
|
* @param bo 拖动类
|
||||||
|
*/
|
||||||
|
@SaCheckPermission("catalog:textbook:edit")
|
||||||
|
@Log(title = "目录-同步教材", businessType = BusinessType.DELETE)
|
||||||
|
@DeleteMapping("/{catalogId}")
|
||||||
|
public R<Void> drag(@Validated @RequestBody CatalogDragBo bo) {
|
||||||
|
return toAjax(textbookService.dragCatalog(bo));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,4 +52,10 @@ public class SysCatalogTextbook extends TenantEntity {
|
||||||
*/
|
*/
|
||||||
private Integer type;
|
private Integer type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除标志(0代表存在 2代表删除)
|
||||||
|
*/
|
||||||
|
@TableLogic
|
||||||
|
private String delFlag;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
package org.dromara.system.domain.bo;
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>TODO<p>
|
||||||
|
*
|
||||||
|
* @author cjw
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 2024/7/12 10:41
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class CatalogDragBo {
|
||||||
|
@NotNull(message = "旧目录id不能为空")
|
||||||
|
private Long oldCatalog;
|
||||||
|
@NotNull(message = "新目录id不能为空")
|
||||||
|
private Long newCatalog;
|
||||||
|
@NotBlank(message = "位置信息不能为空")
|
||||||
|
private String position;
|
||||||
|
}
|
|
@ -19,5 +19,11 @@ public interface SysCatalogTextbookMapper extends BaseMapperPlus<SysCatalogTextb
|
||||||
|
|
||||||
Page<SysCatalogTextbookVo> selectPageUserList(@Param("page") Page<SysCatalogTextbook> page, @Param("catalogId") Long catalogId);
|
Page<SysCatalogTextbookVo> selectPageUserList(@Param("page") Page<SysCatalogTextbook> page, @Param("catalogId") Long catalogId);
|
||||||
|
|
||||||
|
int selectMaxOrderNumByParentId(Long parentId);
|
||||||
|
|
||||||
|
int addOrderNum(@Param("mix") Long mix, @Param("max") Long max);
|
||||||
|
|
||||||
|
int subOrderNum(@Param("mix") Long mix, @Param("max") Long max);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.system.domain.SysCatalogTextbook;
|
import org.dromara.system.domain.SysCatalogTextbook;
|
||||||
|
import org.dromara.system.domain.bo.CatalogDragBo;
|
||||||
import org.dromara.system.domain.bo.SysCatalogTextbookBo;
|
import org.dromara.system.domain.bo.SysCatalogTextbookBo;
|
||||||
import org.dromara.system.domain.vo.SysCatalogTextbookVo;
|
import org.dromara.system.domain.vo.SysCatalogTextbookVo;
|
||||||
|
|
||||||
|
@ -118,4 +119,6 @@ public interface ISysCatalogTextbookService {
|
||||||
* @return 下拉树结构列表
|
* @return 下拉树结构列表
|
||||||
*/
|
*/
|
||||||
List<Tree<Long>> buildTreeSelect(SysCatalogTextbookBo bo);
|
List<Tree<Long>> buildTreeSelect(SysCatalogTextbookBo bo);
|
||||||
|
|
||||||
|
boolean dragCatalog(CatalogDragBo bo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,14 @@ import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
import cn.hutool.core.lang.tree.Tree;
|
import cn.hutool.core.lang.tree.Tree;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.baomidou.lock.annotation.Lock4j;
|
||||||
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
import com.baomidou.mybatisplus.core.conditions.Wrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.dromara.common.core.constant.CacheNames;
|
import org.dromara.common.core.constant.CacheNames;
|
||||||
|
import org.dromara.common.core.exception.ServiceException;
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
import org.dromara.common.core.utils.SpringUtils;
|
import org.dromara.common.core.utils.SpringUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
|
@ -20,6 +22,7 @@ import org.dromara.common.mybatis.helper.DataBaseHelper;
|
||||||
import org.dromara.common.redis.utils.CacheUtils;
|
import org.dromara.common.redis.utils.CacheUtils;
|
||||||
import org.dromara.system.domain.SysCatalogTextbook;
|
import org.dromara.system.domain.SysCatalogTextbook;
|
||||||
import org.dromara.system.domain.SysOssTextbook;
|
import org.dromara.system.domain.SysOssTextbook;
|
||||||
|
import org.dromara.system.domain.bo.CatalogDragBo;
|
||||||
import org.dromara.system.domain.bo.SysCatalogTextbookBo;
|
import org.dromara.system.domain.bo.SysCatalogTextbookBo;
|
||||||
import org.dromara.system.domain.vo.SysCatalogTextbookVo;
|
import org.dromara.system.domain.vo.SysCatalogTextbookVo;
|
||||||
import org.dromara.system.mapper.SysCatalogTextbookMapper;
|
import org.dromara.system.mapper.SysCatalogTextbookMapper;
|
||||||
|
@ -91,11 +94,15 @@ public class SysCatalogTextbookServiceImpl implements ISysCatalogTextbookService
|
||||||
* @param bo 目录-同步教材
|
* @param bo 目录-同步教材
|
||||||
* @return 是否新增成功
|
* @return 是否新增成功
|
||||||
*/
|
*/
|
||||||
|
@Lock4j
|
||||||
@Override
|
@Override
|
||||||
public Boolean insertByBo(SysCatalogTextbookBo bo) {
|
public Boolean insertByBo(SysCatalogTextbookBo bo) {
|
||||||
SysCatalogTextbook info = baseMapper.selectById(bo.getParentId());
|
Long parentId = bo.getParentId();
|
||||||
|
SysCatalogTextbook info = baseMapper.selectById(parentId);
|
||||||
|
int orderNum = baseMapper.selectMaxOrderNumByParentId(parentId) + 1;
|
||||||
SysCatalogTextbook add = MapstructUtils.convert(bo, SysCatalogTextbook.class);
|
SysCatalogTextbook add = MapstructUtils.convert(bo, SysCatalogTextbook.class);
|
||||||
add.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + add.getParentId());
|
add.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + add.getParentId());
|
||||||
|
add.setOrderNum((long) orderNum);
|
||||||
String[] split = StringUtils.split(add.getAncestors(), StringUtils.SEPARATOR);
|
String[] split = StringUtils.split(add.getAncestors(), StringUtils.SEPARATOR);
|
||||||
if (split.length < 7) {
|
if (split.length < 7) {
|
||||||
add.setType(split.length);
|
add.setType(split.length);
|
||||||
|
@ -204,6 +211,48 @@ public class SysCatalogTextbookServiceImpl implements ISysCatalogTextbookService
|
||||||
return buildCatalogTreeSelect(voList);
|
return buildCatalogTreeSelect(voList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean dragCatalog(CatalogDragBo bo) {
|
||||||
|
Long oldCatalogId = bo.getOldCatalog();
|
||||||
|
Long newCatalogId = bo.getNewCatalog();
|
||||||
|
SysCatalogTextbook oldCatalog = baseMapper.selectById(oldCatalogId);
|
||||||
|
SysCatalogTextbook newCatalog = baseMapper.selectById(newCatalogId);
|
||||||
|
if (!oldCatalog.getParentId().equals(newCatalog.getParentId())) {
|
||||||
|
throw new ServiceException("只支持同级目录的拖动");
|
||||||
|
}
|
||||||
|
if (oldCatalogId.equals(newCatalogId)) {
|
||||||
|
throw new ServiceException("不支持单个目录的拖动");
|
||||||
|
}
|
||||||
|
Long oldOrder = oldCatalog.getOrderNum();
|
||||||
|
Long newOrder = newCatalog.getOrderNum();
|
||||||
|
boolean upFlag = oldOrder > newOrder;
|
||||||
|
String position = bo.getPosition();
|
||||||
|
//移动到new的前面
|
||||||
|
if ("before".equals(position)) {
|
||||||
|
if (upFlag) {
|
||||||
|
//上移
|
||||||
|
int i = baseMapper.addOrderNum(newOrder - 1, oldOrder);
|
||||||
|
} else {
|
||||||
|
//下移
|
||||||
|
baseMapper.subOrderNum(oldOrder, newOrder);
|
||||||
|
}
|
||||||
|
} else if ("after".equals(position)) {
|
||||||
|
if (upFlag) {
|
||||||
|
//上移
|
||||||
|
int i = baseMapper.addOrderNum(newOrder, oldOrder);
|
||||||
|
} else {
|
||||||
|
//下移
|
||||||
|
baseMapper.subOrderNum(oldOrder, newOrder + 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new ServiceException("不支持的拖动方式");
|
||||||
|
}
|
||||||
|
SysCatalogTextbook update = new SysCatalogTextbook();
|
||||||
|
update.setCatalogId(oldCatalogId);
|
||||||
|
update.setOrderNum(newOrder);
|
||||||
|
return baseMapper.updateById(update) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
//@Override
|
//@Override
|
||||||
private List<Tree<Long>> buildCatalogTreeSelect(List<SysCatalogTextbookVo> catalogs) {
|
private List<Tree<Long>> buildCatalogTreeSelect(List<SysCatalogTextbookVo> catalogs) {
|
||||||
if (CollUtil.isEmpty(catalogs)) {
|
if (CollUtil.isEmpty(catalogs)) {
|
||||||
|
|
|
@ -12,4 +12,36 @@
|
||||||
having ct.parent_id = #{catalogId}
|
having ct.parent_id = #{catalogId}
|
||||||
order by ct.order_num
|
order by ct.order_num
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectMaxOrderNumByParentId" resultType="int">
|
||||||
|
select IFNULL(Max(order_num),0)
|
||||||
|
from sys_catalog_textbook
|
||||||
|
where parent_id = #{parentId}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<update id="addOrderNum">
|
||||||
|
update sys_catalog_textbook
|
||||||
|
set order_num = order_num + 1
|
||||||
|
<where>
|
||||||
|
<if test="mix != null">
|
||||||
|
order_num > #{mix}
|
||||||
|
</if>
|
||||||
|
<if test="max != null">
|
||||||
|
and order_num < #{mix}
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<update id="subOrderNum">
|
||||||
|
update sys_catalog_textbook
|
||||||
|
set order_num = order_num - 1
|
||||||
|
<where>
|
||||||
|
<if test="mix != null">
|
||||||
|
order_num > #{mix}
|
||||||
|
</if>
|
||||||
|
<if test="max != null">
|
||||||
|
and order_num < #{mix}
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</update>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|
Loading…
Reference in New Issue