feat: 移动主机分组.

This commit is contained in:
lijiahang
2023-11-13 18:32:14 +08:00
parent 9f7e0c945f
commit faa34a3600
27 changed files with 810 additions and 252 deletions

View File

@@ -2,7 +2,8 @@ package com.orion.ops.module.infra.api;
import com.orion.ops.module.infra.entity.dto.data.DataGroupCreateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupUpdateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupMoveDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRenameDTO;
import com.orion.ops.module.infra.enums.DataGroupTypeEnum;
import java.util.List;
@@ -31,9 +32,15 @@ public interface DataGroupApi {
* @param dto dto
* @return effect
*/
Integer renameDataGroup(DataGroupUpdateDTO dto);
Integer renameDataGroup(DataGroupRenameDTO dto);
// FIXME drag
/**
* 移动分组
*
* @param dto dto
* @return effect
*/
Integer moveDataGroup(DataGroupMoveDTO dto);
/**
* 通过缓存查询数据分组

View File

@@ -0,0 +1,38 @@
package com.orion.ops.module.infra.entity.dto.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 数据分组 移动请求业务对象
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-11-7 18:44
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "DataGroupMoveDTO", description = "数据分组 移动请求业务对象")
public class DataGroupMoveDTO implements Serializable {
@NotNull
@Schema(description = "id")
private Long id;
@NotNull
@Schema(description = "目标id")
private Long targetId;
@NotNull
@Schema(description = "移动位置")
private Integer position;
}

View File

@@ -6,12 +6,13 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
/**
* 数据分组 更新请求业务对象
* 数据分组 重命名请求业务对象
*
* @author Jiahang Li
* @version 1.0.0
@@ -21,21 +22,16 @@ import java.io.Serializable;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "DataGroupUpdateDTO", description = "数据分组 更新请求业务对象")
public class DataGroupUpdateDTO implements Serializable {
@Schema(name = "DataGroupRenameDTO", description = "数据分组 重命名请求业务对象")
public class DataGroupRenameDTO implements Serializable {
@NotNull
@Schema(description = "id")
private Long id;
@Schema(description = "父id")
private Long parentId;
@NotBlank
@Size(max = 32)
@Schema(description = "组名称")
private String name;
@Schema(description = "排序")
private Integer sort;
}

View File

@@ -6,9 +6,11 @@ import com.orion.ops.module.infra.convert.DataGroupProviderConvert;
import com.orion.ops.module.infra.entity.dto.DataGroupCacheDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupCreateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupUpdateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupMoveDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRenameDTO;
import com.orion.ops.module.infra.entity.request.data.DataGroupCreateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupUpdateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupMoveRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupRenameRequest;
import com.orion.ops.module.infra.enums.DataGroupTypeEnum;
import com.orion.ops.module.infra.service.DataGroupService;
import lombok.extern.slf4j.Slf4j;
@@ -40,12 +42,19 @@ public class DataGroupApiImpl implements DataGroupApi {
}
@Override
public Integer renameDataGroup(DataGroupUpdateDTO dto) {
public Integer renameDataGroup(DataGroupRenameDTO dto) {
Valid.valid(dto);
DataGroupUpdateRequest request = DataGroupProviderConvert.MAPPER.toRequest(dto);
DataGroupRenameRequest request = DataGroupProviderConvert.MAPPER.toRequest(dto);
return dataGroupService.renameDataGroup(request);
}
@Override
public Integer moveDataGroup(DataGroupMoveDTO dto) {
Valid.valid(dto);
DataGroupMoveRequest request = DataGroupProviderConvert.MAPPER.toRequest(dto);
return dataGroupService.moveDataGroup(request);
}
@Override
public List<DataGroupDTO> getDataGroupList(DataGroupTypeEnum type) {
List<DataGroupCacheDTO> rows = dataGroupService.getDataGroupListByCache(type.name());

View File

@@ -3,7 +3,7 @@ package com.orion.ops.module.infra.convert;
import com.orion.ops.module.infra.entity.domain.DataGroupDO;
import com.orion.ops.module.infra.entity.dto.DataGroupCacheDTO;
import com.orion.ops.module.infra.entity.request.data.DataGroupCreateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupUpdateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupRenameRequest;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@@ -21,7 +21,7 @@ public interface DataGroupConvert {
DataGroupDO to(DataGroupCreateRequest request);
DataGroupDO to(DataGroupUpdateRequest request);
DataGroupDO to(DataGroupRenameRequest request);
DataGroupCacheDTO toCache(DataGroupDO domain);

View File

@@ -4,9 +4,11 @@ import com.orion.ops.module.infra.entity.domain.DataGroupDO;
import com.orion.ops.module.infra.entity.dto.DataGroupCacheDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupCreateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupUpdateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupMoveDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRenameDTO;
import com.orion.ops.module.infra.entity.request.data.DataGroupCreateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupUpdateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupMoveRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupRenameRequest;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@@ -28,11 +30,13 @@ public interface DataGroupProviderConvert {
DataGroupDTO to(DataGroupDO domain);
DataGroupDO to(DataGroupUpdateDTO update);
DataGroupDO to(DataGroupRenameDTO update);
DataGroupCreateRequest toRequest(DataGroupCreateDTO request);
DataGroupUpdateRequest toRequest(DataGroupUpdateDTO request);
DataGroupRenameRequest toRequest(DataGroupRenameDTO request);
DataGroupMoveRequest toRequest(DataGroupMoveDTO request);
List<DataGroupDTO> toList(List<DataGroupCacheDTO> list);

View File

@@ -27,6 +27,20 @@ public interface DataGroupDAO extends IMapper<DataGroupDO> {
*/
Integer selectMaxSort(@Param("parentId") Long parentId, @Param("type") String type);
/**
* 修改排序
*
* @param parentId parentId
* @param condition 条件
* @param referSort 对比值
* @param addition 自增步长
* @return effect
*/
Integer updateSort(@Param("parentId") Long parentId,
@Param("condition") String condition,
@Param("referSort") Integer referSort,
@Param("addition") Integer addition);
/**
* 通过 parentId 查询
*

View File

@@ -0,0 +1,38 @@
package com.orion.ops.module.infra.entity.request.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 数据分组 移动请求对象
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-11-7 18:44
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "DataGroupMoveRequest", description = "数据分组 移动请求对象")
public class DataGroupMoveRequest implements Serializable {
@NotNull
@Schema(description = "id")
private Long id;
@NotNull
@Schema(description = "目标id")
private Long targetId;
@NotNull
@Schema(description = "移动位置")
private Integer position;
}

View File

@@ -22,20 +22,14 @@ import java.io.Serializable;
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "DataGroupUpdateRequest", description = "数据分组 更新请求对象")
public class DataGroupUpdateRequest implements Serializable {
public class DataGroupRenameRequest implements Serializable {
@NotNull
@Schema(description = "id")
private Long id;
@Schema(description = "父id")
private Long parentId;
@Size(max = 32)
@Schema(description = "组名称")
private String name;
@Schema(description = "排序")
private Integer sort;
}

View File

@@ -2,7 +2,8 @@ package com.orion.ops.module.infra.service;
import com.orion.ops.module.infra.entity.dto.DataGroupCacheDTO;
import com.orion.ops.module.infra.entity.request.data.DataGroupCreateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupUpdateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupMoveRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupRenameRequest;
import java.util.List;
@@ -29,9 +30,15 @@ public interface DataGroupService {
* @param request request
* @return effect
*/
Integer renameDataGroup(DataGroupUpdateRequest request);
Integer renameDataGroup(DataGroupRenameRequest request);
// FIXME drag
/**
* 移动分组
*
* @param request request
* @return effect
*/
Integer moveDataGroup(DataGroupMoveRequest request);
/**
* 通过缓存查询数据分组 - 列表

View File

@@ -3,8 +3,10 @@ package com.orion.ops.module.infra.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.orion.lang.utils.collect.Lists;
import com.orion.ops.framework.biz.operator.log.core.uitls.OperatorLogs;
import com.orion.ops.framework.common.constant.Const;
import com.orion.ops.framework.common.constant.ErrorMessage;
import com.orion.ops.framework.common.enums.MovePosition;
import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.framework.redis.core.utils.RedisStrings;
import com.orion.ops.module.infra.convert.DataGroupConvert;
@@ -13,7 +15,8 @@ import com.orion.ops.module.infra.define.cache.DataGroupCacheKeyDefine;
import com.orion.ops.module.infra.entity.domain.DataGroupDO;
import com.orion.ops.module.infra.entity.dto.DataGroupCacheDTO;
import com.orion.ops.module.infra.entity.request.data.DataGroupCreateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupUpdateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupMoveRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupRenameRequest;
import com.orion.ops.module.infra.service.DataGroupRelService;
import com.orion.ops.module.infra.service.DataGroupService;
import lombok.extern.slf4j.Slf4j;
@@ -63,7 +66,7 @@ public class DataGroupServiceImpl implements DataGroupService {
}
@Override
public Integer renameDataGroup(DataGroupUpdateRequest request) {
public Integer renameDataGroup(DataGroupRenameRequest request) {
Long id = Valid.notNull(request.getId(), ErrorMessage.ID_MISSING);
String name = Valid.notBlank(request.getName());
// 查询
@@ -77,6 +80,8 @@ public class DataGroupServiceImpl implements DataGroupService {
.build();
// 查询数据是否冲突
this.checkDataGroupPresent(updateRecord);
// 添加日志参数
OperatorLogs.add(OperatorLogs.BEFORE, record.getName());
// 更新
int effect = dataGroupDAO.updateById(updateRecord);
// 删除缓存
@@ -85,12 +90,71 @@ public class DataGroupServiceImpl implements DataGroupService {
return effect;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer moveDataGroup(DataGroupMoveRequest request) {
Long id = request.getId();
Long targetId = request.getTargetId();
MovePosition position = Valid.valid(MovePosition::of, request.getPosition());
// 查询节点是否存在
DataGroupDO moveRecord = dataGroupDAO.selectById(id);
DataGroupDO targetRecord = dataGroupDAO.selectById(targetId);
Valid.notNull(moveRecord, ErrorMessage.GROUP_ABSENT);
Valid.notNull(targetRecord, ErrorMessage.GROUP_ABSENT);
// 更新
String type = moveRecord.getType();
Long targetParentId = targetRecord.getParentId();
int effect = 0;
// 修改排序
if (MovePosition.TOP.equals(position)) {
// 移动到元素上 将大于等于 targetRecord 的排序都加 10
dataGroupDAO.updateSort(targetParentId, ">=",
targetRecord.getSort(), Const.DEFAULT_SORT);
// 修改 parentId sort
DataGroupDO update = DataGroupDO.builder()
.id(id)
.parentId(targetParentId)
.sort(targetRecord.getSort())
.build();
effect = dataGroupDAO.updateById(update);
} else if (MovePosition.IN.equals(position)) {
// 移动到元素中 获取最大排序
Integer newSort = dataGroupDAO.selectMaxSort(targetId, type) + Const.DEFAULT_SORT;
// 修改 parentId sort
DataGroupDO update = DataGroupDO.builder()
.id(id)
.parentId(targetId)
.sort(newSort)
.build();
effect = dataGroupDAO.updateById(update);
} else if (MovePosition.BOTTOM.equals(position)) {
// 移动到元素下 将大于 targetRecord 的排序都加 10
dataGroupDAO.updateSort(targetParentId, ">",
targetRecord.getSort(), Const.DEFAULT_SORT);
// 修改 parentId sort
DataGroupDO update = DataGroupDO.builder()
.id(id)
.parentId(targetParentId)
.sort(targetRecord.getSort() + 1)
.build();
effect = dataGroupDAO.updateById(update);
}
// 删除缓存
RedisStrings.delete(DataGroupCacheKeyDefine.DATA_GROUP_LIST.format(type),
DataGroupCacheKeyDefine.DATA_GROUP_TREE.format(type));
// 添加日志参数
OperatorLogs.add(OperatorLogs.SOURCE, moveRecord.getName());
OperatorLogs.add(OperatorLogs.TARGET, targetRecord.getName());
OperatorLogs.add(OperatorLogs.POSITION_NAME, position.name());
return effect;
}
@Override
public List<DataGroupCacheDTO> getDataGroupListByCache(String type) {
// 查询缓存
String key = DataGroupCacheKeyDefine.DATA_GROUP_LIST.format(type);
List<DataGroupCacheDTO> list = RedisStrings.getJsonArray(key, DataGroupCacheKeyDefine.DATA_GROUP_LIST);
if (list.isEmpty()) {
if (Lists.isEmpty(list)) {
// 查询数据库
list = dataGroupDAO.of()
.createWrapper()
@@ -116,7 +180,7 @@ public class DataGroupServiceImpl implements DataGroupService {
// 查询缓存
String key = DataGroupCacheKeyDefine.DATA_GROUP_TREE.format(type);
List<DataGroupCacheDTO> treeData = RedisStrings.getJsonArray(key, DataGroupCacheKeyDefine.DATA_GROUP_TREE);
if (treeData.isEmpty()) {
if (Lists.isEmpty(treeData)) {
// 查询列表缓存
List<DataGroupCacheDTO> rows = this.getDataGroupListByCache(type);
// 添加默认值 防止穿透
@@ -127,7 +191,7 @@ public class DataGroupServiceImpl implements DataGroupService {
} else {
// 构建树
DataGroupCacheDTO rootNode = DataGroupCacheDTO.builder()
.parentId(Const.ROOT_PARENT_ID)
.id(Const.ROOT_PARENT_ID)
.sort(Const.DEFAULT_SORT)
.build();
this.buildGroupTree(rootNode, rows);
@@ -151,7 +215,7 @@ public class DataGroupServiceImpl implements DataGroupService {
List<DataGroupCacheDTO> nodes) {
// 获取子节点
List<DataGroupCacheDTO> childrenNodes = nodes.stream()
.filter(s -> parentNode.getParentId().equals(s.getParentId()))
.filter(s -> parentNode.getId().equals(s.getParentId()))
.sorted(Comparator.comparing(DataGroupCacheDTO::getSort))
.collect(Collectors.toList());
if (childrenNodes.isEmpty()) {
@@ -183,6 +247,8 @@ public class DataGroupServiceImpl implements DataGroupService {
// 删除缓存
RedisStrings.delete(DataGroupCacheKeyDefine.DATA_GROUP_LIST.format(type),
DataGroupCacheKeyDefine.DATA_GROUP_TREE.format(type));
// 添加日志参数
OperatorLogs.add(OperatorLogs.NAME, record.getName());
return effect;
}

View File

@@ -21,6 +21,13 @@
id, parent_id, name, type, sort, create_time, update_time, creator, updater, deleted
</sql>
<update id="updateSort">
UPDATE data_group
SET sort = sort + #{addition}
WHERE parent_id = #{parentId}
AND sort ${condition} #{referSort}
</update>
<select id="selectMaxSort" resultType="java.lang.Integer">
SELECT IFNULL(MAX(sort), 0)
FROM data_group