From 38320d8acb2cafe6a8b18f52d6995f4222af9d7a Mon Sep 17 00:00:00 2001 From: cjw Date: Fri, 12 Jul 2024 14:31:10 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=AE=E5=BD=95=E6=8B=96=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/SysCatalogTextbookController.java | 13 +++++ .../system/domain/SysCatalogTextbook.java | 6 +++ .../system/domain/bo/CatalogDragBo.java | 22 ++++++++ .../mapper/SysCatalogTextbookMapper.java | 6 +++ .../service/ISysCatalogTextbookService.java | 3 ++ .../impl/SysCatalogTextbookServiceImpl.java | 51 ++++++++++++++++++- .../system/SysCatalogTextbookMapper.xml | 32 ++++++++++++ 7 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CatalogDragBo.java diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/file/SysCatalogTextbookController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/file/SysCatalogTextbookController.java index b6a476b..2b7e194 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/file/SysCatalogTextbookController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/file/SysCatalogTextbookController.java @@ -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.TableDataInfo; 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.vo.SysCatalogTextbookVo; import org.dromara.system.service.ISysCatalogTextbookService; @@ -116,4 +117,16 @@ public class SysCatalogTextbookController extends BaseController { } return toAjax(textbookService.deleteById(catalogId)); } + + /** + * 拖动目录-同步教材 + * + * @param bo 拖动类 + */ + @SaCheckPermission("catalog:textbook:edit") + @Log(title = "目录-同步教材", businessType = BusinessType.DELETE) + @DeleteMapping("/{catalogId}") + public R drag(@Validated @RequestBody CatalogDragBo bo) { + return toAjax(textbookService.dragCatalog(bo)); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCatalogTextbook.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCatalogTextbook.java index b0895db..2c09554 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCatalogTextbook.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysCatalogTextbook.java @@ -52,4 +52,10 @@ public class SysCatalogTextbook extends TenantEntity { */ private Integer type; + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CatalogDragBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CatalogDragBo.java new file mode 100644 index 0000000..af8a699 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CatalogDragBo.java @@ -0,0 +1,22 @@ +package org.dromara.system.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + *

TODO

+ * + * @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; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysCatalogTextbookMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysCatalogTextbookMapper.java index d8cc3f5..b98204a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysCatalogTextbookMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysCatalogTextbookMapper.java @@ -19,5 +19,11 @@ public interface SysCatalogTextbookMapper extends BaseMapperPlus selectPageUserList(@Param("page") Page 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); + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCatalogTextbookService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCatalogTextbookService.java index b9ae6fe..7307610 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCatalogTextbookService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysCatalogTextbookService.java @@ -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.TableDataInfo; 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.vo.SysCatalogTextbookVo; @@ -118,4 +119,6 @@ public interface ISysCatalogTextbookService { * @return 下拉树结构列表 */ List> buildTreeSelect(SysCatalogTextbookBo bo); + + boolean dragCatalog(CatalogDragBo bo); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCatalogTextbookServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCatalogTextbookServiceImpl.java index 9ad085d..e5bbfbf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCatalogTextbookServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysCatalogTextbookServiceImpl.java @@ -4,12 +4,14 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.tree.Tree; 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.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; 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.SpringUtils; 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.system.domain.SysCatalogTextbook; 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.vo.SysCatalogTextbookVo; import org.dromara.system.mapper.SysCatalogTextbookMapper; @@ -91,11 +94,15 @@ public class SysCatalogTextbookServiceImpl implements ISysCatalogTextbookService * @param bo 目录-同步教材 * @return 是否新增成功 */ + @Lock4j @Override 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); add.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + add.getParentId()); + add.setOrderNum((long) orderNum); String[] split = StringUtils.split(add.getAncestors(), StringUtils.SEPARATOR); if (split.length < 7) { add.setType(split.length); @@ -204,6 +211,48 @@ public class SysCatalogTextbookServiceImpl implements ISysCatalogTextbookService 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 private List> buildCatalogTreeSelect(List catalogs) { if (CollUtil.isEmpty(catalogs)) { diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysCatalogTextbookMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysCatalogTextbookMapper.xml index 511b353..4d5976f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysCatalogTextbookMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysCatalogTextbookMapper.xml @@ -12,4 +12,36 @@ having ct.parent_id = #{catalogId} order by ct.order_num + + + + + update sys_catalog_textbook + set order_num = order_num + 1 + + + order_num > #{mix} + + + and order_num < #{mix} + + + + + + update sys_catalog_textbook + set order_num = order_num - 1 + + + order_num > #{mix} + + + and order_num < #{mix} + + +