refactor: 规范化代码.

This commit is contained in:
lijiahang
2023-11-14 18:38:46 +08:00
parent 4202890d07
commit d4c21a2324
32 changed files with 309 additions and 301 deletions

View File

@@ -11,6 +11,8 @@ import com.orion.ops.framework.common.constant.FieldConst;
*/ */
public interface OperatorLogKeys extends FieldConst { public interface OperatorLogKeys extends FieldConst {
String GROUP_NAME = "groupName";
String ID_LIST = "idList"; String ID_LIST = "idList";
String USERNAME = "username"; String USERNAME = "username";

View File

@@ -67,17 +67,9 @@ public class HostController {
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "通过 id 查询主机") @Operation(summary = "通过 id 查询主机")
@Parameter(name = "id", description = "id", required = true) @Parameter(name = "id", description = "id", required = true)
@Parameter(name = "extra", description = "是否查询额外信息")
@Parameter(name = "config", description = "是否查询配置信息")
@PreAuthorize("@ss.hasPermission('asset:host:query')") @PreAuthorize("@ss.hasPermission('asset:host:query')")
public HostVO getHost(@RequestParam("id") Long id, public HostVO getHost(@RequestParam("id") Long id) {
@RequestParam(name = "extra", required = false) boolean extra, return hostService.getHostById(id);
@RequestParam(name = "config", required = false) boolean config) {
HostQueryRequest request = new HostQueryRequest();
request.setId(id);
request.setExtra(extra);
request.setConfig(config);
return hostService.getHostById(request);
} }
@IgnoreLog(IgnoreLogMode.RET) @IgnoreLog(IgnoreLogMode.RET)

View File

@@ -7,10 +7,14 @@ import com.orion.ops.framework.log.core.enums.IgnoreLogMode;
import com.orion.ops.framework.web.core.annotation.RestWrapper; import com.orion.ops.framework.web.core.annotation.RestWrapper;
import com.orion.ops.module.asset.convert.HostGroupConvert; import com.orion.ops.module.asset.convert.HostGroupConvert;
import com.orion.ops.module.asset.define.operator.HostGroupOperatorType; import com.orion.ops.module.asset.define.operator.HostGroupOperatorType;
import com.orion.ops.module.asset.entity.request.host.HostGroupRelUpdateRequest;
import com.orion.ops.module.asset.entity.vo.HostGroupTreeVO; import com.orion.ops.module.asset.entity.vo.HostGroupTreeVO;
import com.orion.ops.module.infra.api.DataGroupApi; import com.orion.ops.module.infra.api.DataGroupApi;
import com.orion.ops.module.infra.api.DataGroupRelApi; import com.orion.ops.module.infra.api.DataGroupRelApi;
import com.orion.ops.module.infra.entity.dto.data.*; 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.DataGroupMoveDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRenameDTO;
import com.orion.ops.module.infra.enums.DataGroupTypeEnum; import com.orion.ops.module.infra.enums.DataGroupTypeEnum;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@@ -91,17 +95,17 @@ public class HostGroupController {
@GetMapping("/rel-list") @GetMapping("/rel-list")
@Operation(summary = "查询分组主机") @Operation(summary = "查询分组主机")
@Parameter(name = "groupId", description = "groupId", required = true) @Parameter(name = "groupId", description = "groupId", required = true)
@PreAuthorize("@ss.hasPermission('asset:host-group:query-rel')") @PreAuthorize("@ss.hasPermission('asset:host-group:query')")
public Set<Long> queryHostGroupRel(@RequestParam("groupId") Long groupId) { public Set<Long> queryHostGroupRel(@RequestParam("groupId") Long groupId) {
return dataGroupRelApi.getGroupRelList(DataGroupTypeEnum.HOST, groupId); return dataGroupRelApi.getGroupRelIdByGroupId(DataGroupTypeEnum.HOST, groupId);
} }
@OperatorLog(HostGroupOperatorType.UPDATE_REL) @OperatorLog(HostGroupOperatorType.UPDATE_REL)
@PostMapping("/update-rel") @PostMapping("/update-rel")
@Operation(summary = "修改分组主机") @Operation(summary = "修改分组主机")
@PreAuthorize("@ss.hasPermission('asset:host-group:update-rel')") @PreAuthorize("@ss.hasPermission('asset:host:update')")
public HttpWrapper<?> updateGroupHost(@Validated @RequestBody DataGroupRelUpdateDTO request) { public HttpWrapper<?> updateGroupHost(@Validated @RequestBody HostGroupRelUpdateRequest request) {
dataGroupRelApi.updateGroupRel(request); dataGroupRelApi.updateGroupRel(request.getGroupId(), request.getHostIdList());
return HttpWrapper.ok(); return HttpWrapper.ok();
} }

View File

@@ -32,8 +32,8 @@ public class HostGroupOperatorType extends InitializingOperatorTypes {
new OperatorType(L, CREATE, "创建主机分组 <sb>${name}</sb>"), new OperatorType(L, CREATE, "创建主机分组 <sb>${name}</sb>"),
new OperatorType(L, RENAME, "重命名主机分组 <sb>${before}</sb> -> <sb>${name}</sb>"), new OperatorType(L, RENAME, "重命名主机分组 <sb>${before}</sb> -> <sb>${name}</sb>"),
new OperatorType(L, MOVE, "移动主机分组 <sb>${source}</sb> 到 <sb>${target}(${position})</sb>"), new OperatorType(L, MOVE, "移动主机分组 <sb>${source}</sb> 到 <sb>${target}(${position})</sb>"),
new OperatorType(H, DELETE, "删除主机分组 <sb>${name}</sb>"), new OperatorType(H, DELETE, "删除主机分组 <sb>${groupName}</sb>"),
new OperatorType(M, UPDATE_REL, "修改分组内主机 <sb>${name}</sb>"), new OperatorType(M, UPDATE_REL, "修改分组内主机 <sb>${groupName}</sb>"),
}; };
} }

View File

@@ -40,6 +40,9 @@ public class HostCreateRequest implements Serializable {
@Schema(description = "主机地址") @Schema(description = "主机地址")
private String address; private String address;
@Schema(description = "主机分组")
private List<Long> groupIdList;
@Size(max = 5) @Size(max = 5)
@Schema(description = "tags") @Schema(description = "tags")
private List<Long> tags; private List<Long> tags;

View File

@@ -40,16 +40,13 @@ public class HostQueryRequest extends PageRequest {
@Schema(description = "主机地址") @Schema(description = "主机地址")
private String address; private String address;
@Schema(description = "是否为收藏")
private Boolean favorite;
@Schema(description = "tag") @Schema(description = "tag")
private List<Long> tags; private List<Long> tags;
@Schema(description = "是否查询额外信息") @Schema(description = "是否查询 tag 信息")
private Boolean extra; private Boolean queryTag;
@Schema(description = "是否查询配置信息") @Schema(description = "是否查询配置信息")
private Boolean config; private Boolean queryConfig;
} }

View File

@@ -45,6 +45,9 @@ public class HostUpdateRequest implements Serializable {
@Schema(description = "主机地址") @Schema(description = "主机地址")
private String address; private String address;
@Schema(description = "主机分组")
private List<Long> groupIdList;
@Size(max = 5) @Size(max = 5)
@Schema(description = "tags") @Schema(description = "tags")
private List<Long> tags; private List<Long> tags;

View File

@@ -10,7 +10,7 @@ import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Set;
/** /**
* 主机 视图响应对象 * 主机 视图响应对象
@@ -52,13 +52,10 @@ public class HostVO implements Serializable {
@Schema(description = "修改人") @Schema(description = "修改人")
private String updater; private String updater;
@Schema(description = "是否收藏")
private Boolean favorite;
@Schema(description = "tags") @Schema(description = "tags")
private List<TagDTO> tags; private List<TagDTO> tags;
@Schema(description = "configs") @Schema(description = "分组 id")
private Map<String, HostConfigVO> configs; private Set<Long> groupIdList;
} }

View File

@@ -36,10 +36,10 @@ public interface HostService {
/** /**
* 通过 id 查询主机 * 通过 id 查询主机
* *
* @param request request * @param id id
* @return row * @return row
*/ */
HostVO getHostById(HostQueryRequest request); HostVO getHostById(Long id);
/** /**
* 查询主机 * 查询主机

View File

@@ -11,25 +11,24 @@ import com.orion.ops.framework.common.constant.Const;
import com.orion.ops.framework.common.constant.ErrorMessage; import com.orion.ops.framework.common.constant.ErrorMessage;
import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.framework.redis.core.utils.RedisMaps; import com.orion.ops.framework.redis.core.utils.RedisMaps;
import com.orion.ops.framework.security.core.utils.SecurityUtils;
import com.orion.ops.module.asset.convert.HostConfigConvert;
import com.orion.ops.module.asset.convert.HostConvert; import com.orion.ops.module.asset.convert.HostConvert;
import com.orion.ops.module.asset.dao.HostConfigDAO; import com.orion.ops.module.asset.dao.HostConfigDAO;
import com.orion.ops.module.asset.dao.HostDAO; import com.orion.ops.module.asset.dao.HostDAO;
import com.orion.ops.module.asset.define.cache.HostCacheKeyDefine; import com.orion.ops.module.asset.define.cache.HostCacheKeyDefine;
import com.orion.ops.module.asset.entity.domain.HostConfigDO;
import com.orion.ops.module.asset.entity.domain.HostDO; import com.orion.ops.module.asset.entity.domain.HostDO;
import com.orion.ops.module.asset.entity.dto.HostCacheDTO; import com.orion.ops.module.asset.entity.dto.HostCacheDTO;
import com.orion.ops.module.asset.entity.request.host.HostCreateRequest; import com.orion.ops.module.asset.entity.request.host.HostCreateRequest;
import com.orion.ops.module.asset.entity.request.host.HostQueryRequest; import com.orion.ops.module.asset.entity.request.host.HostQueryRequest;
import com.orion.ops.module.asset.entity.request.host.HostUpdateRequest; import com.orion.ops.module.asset.entity.request.host.HostUpdateRequest;
import com.orion.ops.module.asset.entity.vo.HostConfigVO;
import com.orion.ops.module.asset.entity.vo.HostVO; import com.orion.ops.module.asset.entity.vo.HostVO;
import com.orion.ops.module.asset.service.HostConfigService; import com.orion.ops.module.asset.service.HostConfigService;
import com.orion.ops.module.asset.service.HostService; import com.orion.ops.module.asset.service.HostService;
import com.orion.ops.module.infra.api.DataGroupRelApi;
import com.orion.ops.module.infra.api.FavoriteApi; import com.orion.ops.module.infra.api.FavoriteApi;
import com.orion.ops.module.infra.api.TagRelApi; import com.orion.ops.module.infra.api.TagRelApi;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRelCreateDTO;
import com.orion.ops.module.infra.entity.dto.tag.TagDTO; import com.orion.ops.module.infra.entity.dto.tag.TagDTO;
import com.orion.ops.module.infra.enums.DataGroupTypeEnum;
import com.orion.ops.module.infra.enums.FavoriteTypeEnum; import com.orion.ops.module.infra.enums.FavoriteTypeEnum;
import com.orion.ops.module.infra.enums.TagTypeEnum; import com.orion.ops.module.infra.enums.TagTypeEnum;
import lombok.SneakyThrows; import lombok.SneakyThrows;
@@ -37,10 +36,8 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -55,10 +52,6 @@ import java.util.stream.Collectors;
@Service @Service
public class HostServiceImpl implements HostService { public class HostServiceImpl implements HostService {
// FIXME 这里的收藏删除
private static final ThreadLocal<List<Long>> FAVORITE_HOLDER = new ThreadLocal<>();
@Resource @Resource
private HostDAO hostDAO; private HostDAO hostDAO;
@@ -74,6 +67,9 @@ public class HostServiceImpl implements HostService {
@Resource @Resource
private FavoriteApi favoriteApi; private FavoriteApi favoriteApi;
@Resource
private DataGroupRelApi dataGroupRelApi;
@Override @Override
public Long createHost(HostCreateRequest request) { public Long createHost(HostCreateRequest request) {
log.info("HostService-createHost request: {}", JSON.toJSONString(request)); log.info("HostService-createHost request: {}", JSON.toJSONString(request));
@@ -87,9 +83,17 @@ public class HostServiceImpl implements HostService {
log.info("HostService-createHost effect: {}", effect); log.info("HostService-createHost effect: {}", effect);
Long id = record.getId(); Long id = record.getId();
// 插入 tag // 插入 tag
List<Long> tags = request.getTags(); tagRelApi.addTagRelAsync(TagTypeEnum.HOST, id, request.getTags());
if (!Lists.isEmpty(tags)) { // 引用分组
tagRelApi.addTagRel(TagTypeEnum.HOST, id, tags); List<Long> groupIdList = request.getGroupIdList();
if (!Lists.isEmpty(groupIdList)) {
List<DataGroupRelCreateDTO> groupRelList = groupIdList.stream()
.map(s -> DataGroupRelCreateDTO.builder()
.groupId(s)
.relId(id)
.build())
.collect(Collectors.toList());
dataGroupRelApi.addGroupRel(groupRelList);
} }
// 创建配置 // 创建配置
hostConfigService.initHostConfig(id); hostConfigService.initHostConfig(id);
@@ -113,22 +117,33 @@ public class HostServiceImpl implements HostService {
// 更新 // 更新
int effect = hostDAO.updateById(updateRecord); int effect = hostDAO.updateById(updateRecord);
log.info("HostService-updateHostById effect: {}", effect); log.info("HostService-updateHostById effect: {}", effect);
// 引用分组
dataGroupRelApi.updateGroupRel(DataGroupTypeEnum.HOST, request.getGroupIdList(), id);
// 删除缓存 // 删除缓存
RedisMaps.delete(HostCacheKeyDefine.HOST_INFO); RedisMaps.delete(HostCacheKeyDefine.HOST_INFO);
// 更新 tag // 更新 tag
tagRelApi.setTagRel(TagTypeEnum.HOST, id, request.getTags()); tagRelApi.setTagRelAsync(TagTypeEnum.HOST, id, request.getTags());
return effect; return effect;
} }
@Override @Override
public HostVO getHostById(HostQueryRequest request) { @SneakyThrows
// 查询 public HostVO getHostById(Long id) {
HostDO record = hostDAO.selectById(request.getId()); // 查询 tag 信息
Future<List<TagDTO>> tagFuture = tagRelApi.getRelTagsAsync(TagTypeEnum.HOST, id);
// 查询分组信息
Future<Set<Long>> groupIdFuture = dataGroupRelApi.getGroupIdByRelIdAsync(DataGroupTypeEnum.HOST, id);
// 查询主机
HostDO record = hostDAO.selectById(id);
Valid.notNull(record, ErrorMessage.HOST_ABSENT); Valid.notNull(record, ErrorMessage.HOST_ABSENT);
// 转换 // 转换
HostVO vo = HostConvert.MAPPER.to(record); HostVO vo = HostConvert.MAPPER.to(record);
// 查询拓展信息 // 设置 tag 信息
this.setExtraInfo(request, Lists.singleton(vo)); List<TagDTO> tags = tagFuture.get();
// 设置分组信息
vo.setTags(tags);
Set<Long> groupIdList = groupIdFuture.get();
vo.setGroupIdList(groupIdList);
return vo; return vo;
} }
@@ -158,22 +173,18 @@ public class HostServiceImpl implements HostService {
@Override @Override
public DataGrid<HostVO> getHostPage(HostQueryRequest request) { public DataGrid<HostVO> getHostPage(HostQueryRequest request) {
try { // 条件
// 条件 LambdaQueryWrapper<HostDO> wrapper = this.buildQueryWrapper(request);
LambdaQueryWrapper<HostDO> wrapper = this.buildQueryWrapper(request); if (wrapper == null) {
if (wrapper == null) { return DataGrid.of(Lists.empty());
return DataGrid.of(Lists.empty());
}
// 查询
DataGrid<HostVO> hosts = hostDAO.of(wrapper)
.page(request)
.dataGrid(HostConvert.MAPPER::to);
// 查询拓展信息
this.setExtraInfo(request, hosts.getRows());
return hosts;
} finally {
FAVORITE_HOLDER.remove();
} }
// 查询
DataGrid<HostVO> hosts = hostDAO.of(wrapper)
.page(request)
.dataGrid(HostConvert.MAPPER::to);
// 查询拓展信息
this.setExtraInfo(request, hosts.getRows());
return hosts;
} }
@Override @Override
@@ -187,14 +198,16 @@ public class HostServiceImpl implements HostService {
// 删除 // 删除
int effect = hostDAO.deleteById(id); int effect = hostDAO.deleteById(id);
log.info("HostService-deleteHostById effect: {}", effect); log.info("HostService-deleteHostById effect: {}", effect);
// 删除缓存
RedisMaps.delete(HostCacheKeyDefine.HOST_INFO, id);
// 删除配置 // 删除配置
hostConfigDAO.deleteByHostId(id); hostConfigDAO.deleteByHostId(id);
// 删除分组
dataGroupRelApi.deleteByRelId(DataGroupTypeEnum.HOST, id);
// 删除缓存
RedisMaps.delete(HostCacheKeyDefine.HOST_INFO, id);
// 删除 tag 引用 // 删除 tag 引用
tagRelApi.deleteRelId(TagTypeEnum.HOST, id); tagRelApi.deleteRelIdAsync(TagTypeEnum.HOST, id);
// 删除收藏引用 // 删除收藏引用
favoriteApi.deleteByRelId(FavoriteTypeEnum.HOST, id); favoriteApi.deleteByRelIdAsync(FavoriteTypeEnum.HOST, id);
return effect; return effect;
} }
@@ -236,48 +249,19 @@ public class HostServiceImpl implements HostService {
* @param request request * @param request request
* @return wrapper * @return wrapper
*/ */
@SneakyThrows
private LambdaQueryWrapper<HostDO> buildQueryWrapper(HostQueryRequest request) { private LambdaQueryWrapper<HostDO> buildQueryWrapper(HostQueryRequest request) {
boolean setIdList = Booleans.isTrue(request.getFavorite()) || Lists.isNotEmpty(request.getTags()); String searchValue = request.getSearchValue();
List<List<Long>> idListGrouping = new ArrayList<>(); LambdaQueryWrapper<HostDO> wrapper = hostDAO.wrapper();
// 查询收藏
Future<List<Long>> favoriteFuture = null;
if (Booleans.isTrue(request.getFavorite())) {
favoriteFuture = favoriteApi.getFavoriteRelIdList(FavoriteTypeEnum.HOST, SecurityUtils.getLoginUserId());
}
// tag 条件 // tag 条件
if (Lists.isNotEmpty(request.getTags())) { if (Lists.isNotEmpty(request.getTags())) {
List<Long> tagRelIdList = tagRelApi.getRelIdByTagId(request.getTags()); List<Long> tagRelIdList = tagRelApi.getRelIdByTagId(request.getTags());
if (tagRelIdList.isEmpty()) { if (tagRelIdList.isEmpty()) {
return null; return null;
} }
idListGrouping.add(tagRelIdList); wrapper.in(HostDO::getId, tagRelIdList);
}
// 获取收藏结果
if (favoriteFuture != null) {
List<Long> favorites = favoriteFuture.get();
// 无收藏
if (Lists.isEmpty(favorites)) {
return null;
}
idListGrouping.add(favorites);
}
// flat
List<Long> idList = null;
if (setIdList && !idListGrouping.isEmpty()) {
idList = idListGrouping.get(0);
// 交集
for (int i = 1; i < idListGrouping.size(); i++) {
idList.retainAll(idListGrouping.get(i));
}
if (idList.isEmpty()) {
return null;
}
} }
// 基础条件 // 基础条件
String searchValue = request.getSearchValue(); wrapper.eq(HostDO::getId, request.getId())
LambdaQueryWrapper<HostDO> wrapper = hostDAO.wrapper()
.eq(HostDO::getId, request.getId())
.like(HostDO::getName, request.getName()) .like(HostDO::getName, request.getName())
.like(HostDO::getCode, request.getCode()) .like(HostDO::getCode, request.getCode())
.like(HostDO::getAddress, request.getAddress()) .like(HostDO::getAddress, request.getAddress())
@@ -287,9 +271,6 @@ public class HostServiceImpl implements HostService {
.like(HostDO::getCode, searchValue).or() .like(HostDO::getCode, searchValue).or()
.like(HostDO::getAddress, searchValue) .like(HostDO::getAddress, searchValue)
); );
if (setIdList) {
wrapper.in(HostDO::getId, idList);
}
return wrapper; return wrapper;
} }
@@ -299,61 +280,19 @@ public class HostServiceImpl implements HostService {
* @param request request * @param request request
* @param hosts hosts * @param hosts hosts
*/ */
@SneakyThrows
private void setExtraInfo(HostQueryRequest request, List<HostVO> hosts) { private void setExtraInfo(HostQueryRequest request, List<HostVO> hosts) {
if (hosts.isEmpty()) { if (hosts.isEmpty()) {
return; return;
} }
List<Long> idList = hosts.stream().map(HostVO::getId).collect(Collectors.toList()); List<Long> idList = hosts.stream().map(HostVO::getId).collect(Collectors.toList());
// 查询额外信息 // 查询 tag 信息
Future<List<List<TagDTO>>> tagsFuture = null; if (Booleans.isTrue(request.getQueryTag())) {
Future<List<Long>> favoriteFuture = null; // 设置 tag 信息
if (Booleans.isTrue(request.getExtra())) { List<List<TagDTO>> tagList = tagRelApi.getRelTags(TagTypeEnum.HOST, idList);
// tag
tagsFuture = tagRelApi.getRelTags(TagTypeEnum.HOST, idList);
// 从缓存中读取 收藏
List<Long> favorites = FAVORITE_HOLDER.get();
if (favorites != null) {
favoriteFuture = CompletableFuture.completedFuture(favorites);
} else {
favoriteFuture = favoriteApi.getFavoriteRelIdList(FavoriteTypeEnum.HOST, SecurityUtils.getLoginUserId());
}
}
// 查询配置
if (Booleans.isTrue(request.getConfig())) {
// 配置分组
Map<Long, List<HostConfigDO>> hostConfigGrouping = hostConfigDAO.getHostConfigByHostIdList(idList)
.stream()
.collect(Collectors.groupingBy(HostConfigDO::getHostId));
// 设置配置
hosts.forEach(s -> {
List<HostConfigDO> configs = hostConfigGrouping.get(s.getId());
if (Lists.isEmpty(configs)) {
return;
}
Map<String, HostConfigVO> configMap = configs.stream()
.collect(Collectors.toMap(
HostConfigDO::getType,
HostConfigConvert.MAPPER::to,
(v1, v2) -> v2
));
s.setConfigs(configMap);
});
}
// 设置 tag 信息
List<List<TagDTO>> tagList = null;
if (tagsFuture != null && (tagList = tagsFuture.get()) != null) {
for (int i = 0; i < hosts.size(); i++) { for (int i = 0; i < hosts.size(); i++) {
hosts.get(i).setTags(tagList.get(i)); hosts.get(i).setTags(tagList.get(i));
} }
} }
// 设置收藏信息
List<Long> favoriteIdList = null;
if (favoriteFuture != null && (favoriteIdList = favoriteFuture.get()) != null) {
for (HostVO host : hosts) {
host.setFavorite(favoriteIdList.contains(host.getId()));
}
}
} }
} }

View File

@@ -1,12 +1,12 @@
package com.orion.ops.module.infra.api; package com.orion.ops.module.infra.api;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRelCreateDTO; import com.orion.ops.module.infra.entity.dto.data.DataGroupRelCreateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRelUpdateDTO;
import com.orion.ops.module.infra.enums.DataGroupTypeEnum; import com.orion.ops.module.infra.enums.DataGroupTypeEnum;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.Future;
/** /**
* 数据分组关联 对外服务类 * 数据分组关联 对外服务类
@@ -20,26 +20,37 @@ public interface DataGroupRelApi {
/** /**
* 设置关联 * 设置关联
* *
* @param dto dto * @param groupId groupId
* @param relIdList relIdList
*/ */
void updateGroupRel(DataGroupRelUpdateDTO dto); void updateGroupRel(Long groupId, List<Long> relIdList);
/**
* 设置关联
*
* @param type type
* @param groupIdList groupIdList
* @param relId relId
*/
void updateGroupRel(DataGroupTypeEnum type, List<Long> groupIdList, Long relId);
/** /**
* 添加关联 * 添加关联
* *
* @param dto dto * @param groupId groupId
* @param relId relId
*/ */
void addGroupRel(DataGroupRelCreateDTO dto); void addGroupRel(Long groupId, Long relId);
/** /**
* 添加关联 * 批量添加关联
* *
* @param list list * @param list list
*/ */
void addGroupRel(List<DataGroupRelCreateDTO> list); void addGroupRel(List<DataGroupRelCreateDTO> list);
/** /**
* 通过缓存查询数据分组关联 * 通过 type 查询 relId 缓存
* <p> * <p>
* groupId - relId * groupId - relId
* *
@@ -49,13 +60,22 @@ public interface DataGroupRelApi {
Map<Long, Set<Long>> getGroupRelList(DataGroupTypeEnum type); Map<Long, Set<Long>> getGroupRelList(DataGroupTypeEnum type);
/** /**
* 通过缓存查询数据分组关联 * 通过 groupId 查询 relId 缓存
* *
* @param type type * @param type type
* @param groupId groupId * @param groupId groupId
* @return rows * @return relId
*/ */
Set<Long> getGroupRelList(DataGroupTypeEnum type, Long groupId); Set<Long> getGroupRelIdByGroupId(DataGroupTypeEnum type, Long groupId);
/**
* 通过 relId 查询 groupId
*
* @param type type
* @param relId relId
* @return groupId
*/
Future<Set<Long>> getGroupIdByRelIdAsync(DataGroupTypeEnum type, Long relId);
/** /**
* 删除数据分组关联 * 删除数据分组关联

View File

@@ -3,7 +3,6 @@ package com.orion.ops.module.infra.api;
import com.orion.ops.module.infra.enums.FavoriteTypeEnum; import com.orion.ops.module.infra.enums.FavoriteTypeEnum;
import java.util.List; import java.util.List;
import java.util.concurrent.Future;
/** /**
* 收藏 对外服务类 * 收藏 对外服务类
@@ -21,7 +20,7 @@ public interface FavoriteApi {
* @param userId userId * @param userId userId
* @return relIdList * @return relIdList
*/ */
Future<List<Long>> getFavoriteRelIdList(FavoriteTypeEnum type, Long userId); List<Long> getFavoriteRelIdList(FavoriteTypeEnum type, Long userId);
/** /**
* 通过 relId 删除收藏 * 通过 relId 删除收藏
@@ -29,7 +28,7 @@ public interface FavoriteApi {
* @param type type * @param type type
* @param relId relId * @param relId relId
*/ */
void deleteByRelId(FavoriteTypeEnum type, Long relId); void deleteByRelIdAsync(FavoriteTypeEnum type, Long relId);
/** /**
* 通过 relId 删除收藏 * 通过 relId 删除收藏
@@ -37,6 +36,6 @@ public interface FavoriteApi {
* @param type type * @param type type
* @param relIdList relIdList * @param relIdList relIdList
*/ */
void deleteByRelIdList(FavoriteTypeEnum type, List<Long> relIdList); void deleteByRelIdListAsync(FavoriteTypeEnum type, List<Long> relIdList);
} }

View File

@@ -22,7 +22,7 @@ public interface TagRelApi {
* @param relId relId * @param relId relId
* @param tagIdList tagIdList * @param tagIdList tagIdList
*/ */
void addTagRel(TagTypeEnum type, Long relId, List<Long> tagIdList); void addTagRelAsync(TagTypeEnum type, Long relId, List<Long> tagIdList);
/** /**
* 设置标签引用 先删除后新增 * 设置标签引用 先删除后新增
@@ -31,7 +31,7 @@ public interface TagRelApi {
* @param relId relId * @param relId relId
* @param tagIdList tagIdList * @param tagIdList tagIdList
*/ */
void setTagRel(TagTypeEnum type, Long relId, List<Long> tagIdList); void setTagRelAsync(TagTypeEnum type, Long relId, List<Long> tagIdList);
/** /**
* 获取引用 tag * 获取引用 tag
@@ -40,7 +40,7 @@ public interface TagRelApi {
* @param relId relId * @param relId relId
* @return tag * @return tag
*/ */
Future<List<TagDTO>> getRelTags(TagTypeEnum type, Long relId); Future<List<TagDTO>> getRelTagsAsync(TagTypeEnum type, Long relId);
/** /**
* 获取引用 tag * 获取引用 tag
@@ -49,7 +49,7 @@ public interface TagRelApi {
* @param relIdList relIdList * @param relIdList relIdList
* @return tag * @return tag
*/ */
Future<List<List<TagDTO>>> getRelTags(TagTypeEnum type, List<Long> relIdList); List<List<TagDTO>> getRelTags(TagTypeEnum type, List<Long> relIdList);
/** /**
* 查询 tag 关联的所有 id * 查询 tag 关联的所有 id
@@ -73,7 +73,7 @@ public interface TagRelApi {
* @param type type * @param type type
* @param relId relId * @param relId relId
*/ */
void deleteRelId(TagTypeEnum type, Long relId); void deleteRelIdAsync(TagTypeEnum type, Long relId);
/** /**
* 通过 relIdList 删除 * 通过 relIdList 删除
@@ -81,6 +81,6 @@ public interface TagRelApi {
* @param type type * @param type type
* @param relIdList relIdList * @param relIdList relIdList
*/ */
void deleteRelIdList(TagTypeEnum type, List<Long> relIdList); void deleteRelIdListAsync(TagTypeEnum type, List<Long> relIdList);
} }

View File

@@ -1,34 +0,0 @@
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;
import java.util.List;
/**
* 数据分组关联 更新请求对象
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-11-7 18:44
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "DataGroupRelUpdateDTO", description = "数据分组关联 更新请求对象")
public class DataGroupRelUpdateDTO implements Serializable {
@NotNull
@Schema(description = "组id")
private Long groupId;
@Schema(description = "引用id")
private List<Long> relIdList;
}

View File

@@ -3,20 +3,22 @@ package com.orion.ops.module.infra.api.impl;
import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.module.infra.api.DataGroupRelApi; import com.orion.ops.module.infra.api.DataGroupRelApi;
import com.orion.ops.module.infra.convert.DataGroupRelProviderConvert; import com.orion.ops.module.infra.convert.DataGroupRelProviderConvert;
import com.orion.ops.module.infra.entity.domain.DataGroupRelDO;
import com.orion.ops.module.infra.entity.dto.DataGroupRelCacheDTO; import com.orion.ops.module.infra.entity.dto.DataGroupRelCacheDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRelCreateDTO; import com.orion.ops.module.infra.entity.dto.data.DataGroupRelCreateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRelUpdateDTO;
import com.orion.ops.module.infra.entity.request.data.DataGroupRelCreateRequest; import com.orion.ops.module.infra.entity.request.data.DataGroupRelCreateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupRelUpdateRequest;
import com.orion.ops.module.infra.enums.DataGroupTypeEnum; import com.orion.ops.module.infra.enums.DataGroupTypeEnum;
import com.orion.ops.module.infra.service.DataGroupRelService; import com.orion.ops.module.infra.service.DataGroupRelService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -34,17 +36,22 @@ public class DataGroupRelApiImpl implements DataGroupRelApi {
private DataGroupRelService dataGroupRelService; private DataGroupRelService dataGroupRelService;
@Override @Override
public void updateGroupRel(DataGroupRelUpdateDTO dto) { public void updateGroupRel(Long groupId, List<Long> relIdList) {
Valid.valid(dto); Valid.notNull(groupId);
DataGroupRelUpdateRequest request = DataGroupRelProviderConvert.MAPPER.toRequest(dto); dataGroupRelService.updateGroupRel(groupId, relIdList);
dataGroupRelService.updateGroupRel(request);
} }
@Override @Override
public void addGroupRel(DataGroupRelCreateDTO dto) { public void updateGroupRel(DataGroupTypeEnum type, List<Long> groupIdList, Long relId) {
Valid.valid(dto); Valid.notNull(relId);
DataGroupRelCreateRequest request = DataGroupRelProviderConvert.MAPPER.toRequest(dto); dataGroupRelService.updateGroupRel(type.name(), groupIdList, relId);
dataGroupRelService.addGroupRel(request); }
@Override
public void addGroupRel(Long groupId, Long relId) {
Valid.notNull(groupId);
Valid.notNull(relId);
dataGroupRelService.addGroupRel(groupId, relId);
} }
@Override @Override
@@ -65,13 +72,23 @@ public class DataGroupRelApiImpl implements DataGroupRelApi {
} }
@Override @Override
public Set<Long> getGroupRelList(DataGroupTypeEnum type, Long groupId) { public Set<Long> getGroupRelIdByGroupId(DataGroupTypeEnum type, Long groupId) {
List<DataGroupRelCacheDTO> rows = dataGroupRelService.getGroupRelListByCache(type.name(), groupId); List<DataGroupRelCacheDTO> rows = dataGroupRelService.getGroupRelListByCache(type.name(), groupId);
return rows.stream() return rows.stream()
.map(DataGroupRelCacheDTO::getRelId) .map(DataGroupRelCacheDTO::getRelId)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
@Override
@Async("asyncExecutor")
public Future<Set<Long>> getGroupIdByRelIdAsync(DataGroupTypeEnum type, Long relId) {
Set<Long> groupIdList = dataGroupRelService.getGroupRelByRelId(type.name(), relId)
.stream()
.map(DataGroupRelDO::getGroupId)
.collect(Collectors.toSet());
return CompletableFuture.completedFuture(groupIdList);
}
@Override @Override
public Integer deleteByRelId(DataGroupTypeEnum type, Long relId) { public Integer deleteByRelId(DataGroupTypeEnum type, Long relId) {
return dataGroupRelService.deleteByRelId(type.name(), relId); return dataGroupRelService.deleteByRelId(type.name(), relId);

View File

@@ -11,8 +11,6 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
/** /**
* 收藏 对外服务实现类 * 收藏 对外服务实现类
@@ -31,27 +29,25 @@ public class FavoriteApiImpl implements FavoriteApi {
private FavoriteDAO favoriteDAO; private FavoriteDAO favoriteDAO;
@Override @Override
@Async("asyncExecutor") public List<Long> getFavoriteRelIdList(FavoriteTypeEnum type, Long userId) {
public Future<List<Long>> getFavoriteRelIdList(FavoriteTypeEnum type, Long userId) {
Valid.allNotNull(type, userId); Valid.allNotNull(type, userId);
// 查询 // 查询
FavoriteQueryRequest request = new FavoriteQueryRequest(); FavoriteQueryRequest request = new FavoriteQueryRequest();
request.setType(type.name()); request.setType(type.name());
request.setUserId(userId); request.setUserId(userId);
List<Long> relIdList = favoriteService.getFavoriteRelIdList(request); return favoriteService.getFavoriteRelIdList(request);
return CompletableFuture.completedFuture(relIdList);
} }
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public void deleteByRelId(FavoriteTypeEnum type, Long relId) { public void deleteByRelIdAsync(FavoriteTypeEnum type, Long relId) {
Valid.allNotNull(type, relId); Valid.allNotNull(type, relId);
favoriteDAO.deleteFavoriteByRelId(type.name(), relId); favoriteDAO.deleteFavoriteByRelId(type.name(), relId);
} }
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public void deleteByRelIdList(FavoriteTypeEnum type, List<Long> relIdList) { public void deleteByRelIdListAsync(FavoriteTypeEnum type, List<Long> relIdList) {
Valid.notNull(type); Valid.notNull(type);
Valid.notEmpty(relIdList); Valid.notEmpty(relIdList);
favoriteDAO.deleteFavoriteByRelIdList(type.name(), relIdList); favoriteDAO.deleteFavoriteByRelIdList(type.name(), relIdList);

View File

@@ -1,5 +1,7 @@
package com.orion.ops.module.infra.api.impl; package com.orion.ops.module.infra.api.impl;
import com.orion.lang.utils.collect.Lists;
import com.orion.ops.framework.common.utils.Valid;
import com.orion.ops.module.infra.api.TagRelApi; import com.orion.ops.module.infra.api.TagRelApi;
import com.orion.ops.module.infra.convert.TagProviderConvert; import com.orion.ops.module.infra.convert.TagProviderConvert;
import com.orion.ops.module.infra.entity.dto.TagCacheDTO; import com.orion.ops.module.infra.entity.dto.TagCacheDTO;
@@ -30,31 +32,34 @@ public class TagRelApiImpl implements TagRelApi {
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public void addTagRel(TagTypeEnum type, Long relId, List<Long> tagIdList) { public void addTagRelAsync(TagTypeEnum type, Long relId, List<Long> tagIdList) {
Valid.notNull(relId);
if (Lists.isEmpty(tagIdList)) {
return;
}
tagRelService.addTagRel(type.name(), relId, tagIdList); tagRelService.addTagRel(type.name(), relId, tagIdList);
} }
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public void setTagRel(TagTypeEnum type, Long relId, List<Long> tagIdList) { public void setTagRelAsync(TagTypeEnum type, Long relId, List<Long> tagIdList) {
Valid.notNull(relId);
tagRelService.setTagRel(type.name(), relId, tagIdList); tagRelService.setTagRel(type.name(), relId, tagIdList);
} }
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public Future<List<TagDTO>> getRelTags(TagTypeEnum type, Long relId) { public Future<List<TagDTO>> getRelTagsAsync(TagTypeEnum type, Long relId) {
List<TagCacheDTO> values = tagRelService.getRelTags(type.name(), relId); List<TagCacheDTO> values = tagRelService.getRelTags(type.name(), relId);
return CompletableFuture.completedFuture(TagProviderConvert.MAPPER.toList(values)); return CompletableFuture.completedFuture(TagProviderConvert.MAPPER.toList(values));
} }
@Override @Override
@Async("asyncExecutor") public List<List<TagDTO>> getRelTags(TagTypeEnum type, List<Long> relIdList) {
public Future<List<List<TagDTO>>> getRelTags(TagTypeEnum type, List<Long> relIdList) { return tagRelService.getRelTags(type.name(), relIdList)
List<List<TagDTO>> values = tagRelService.getRelTags(type.name(), relIdList)
.stream() .stream()
.map(TagProviderConvert.MAPPER::toList) .map(TagProviderConvert.MAPPER::toList)
.collect(Collectors.toList()); .collect(Collectors.toList());
return CompletableFuture.completedFuture(values);
} }
@Override @Override
@@ -69,13 +74,13 @@ public class TagRelApiImpl implements TagRelApi {
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public void deleteRelId(TagTypeEnum type, Long relId) { public void deleteRelIdAsync(TagTypeEnum type, Long relId) {
tagRelService.deleteRelId(type.name(), relId); tagRelService.deleteRelId(type.name(), relId);
} }
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public void deleteRelIdList(TagTypeEnum type, List<Long> relIdList) { public void deleteRelIdListAsync(TagTypeEnum type, List<Long> relIdList) {
tagRelService.deleteRelIdList(type.name(), relIdList); tagRelService.deleteRelIdList(type.name(), relIdList);
} }

View File

@@ -1,9 +1,7 @@
package com.orion.ops.module.infra.convert; package com.orion.ops.module.infra.convert;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRelCreateDTO; import com.orion.ops.module.infra.entity.dto.data.DataGroupRelCreateDTO;
import com.orion.ops.module.infra.entity.dto.data.DataGroupRelUpdateDTO;
import com.orion.ops.module.infra.entity.request.data.DataGroupRelCreateRequest; import com.orion.ops.module.infra.entity.request.data.DataGroupRelCreateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupRelUpdateRequest;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
@@ -23,8 +21,6 @@ public interface DataGroupRelProviderConvert {
DataGroupRelCreateRequest toRequest(DataGroupRelCreateDTO request); DataGroupRelCreateRequest toRequest(DataGroupRelCreateDTO request);
DataGroupRelUpdateRequest toRequest(DataGroupRelUpdateDTO request);
List<DataGroupRelCreateRequest> toList(List<DataGroupRelCreateDTO> list); List<DataGroupRelCreateRequest> toList(List<DataGroupRelCreateDTO> list);
} }

View File

@@ -1,8 +1,8 @@
package com.orion.ops.module.infra.service; package com.orion.ops.module.infra.service;
import com.orion.ops.module.infra.entity.domain.DataGroupRelDO;
import com.orion.ops.module.infra.entity.dto.DataGroupRelCacheDTO; import com.orion.ops.module.infra.entity.dto.DataGroupRelCacheDTO;
import com.orion.ops.module.infra.entity.request.data.DataGroupRelCreateRequest; import com.orion.ops.module.infra.entity.request.data.DataGroupRelCreateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupRelUpdateRequest;
import java.util.List; import java.util.List;
@@ -18,16 +18,27 @@ public interface DataGroupRelService {
/** /**
* 设置关联 * 设置关联
* *
* @param request request * @param groupId groupId
* @param relIdList relIdList
*/ */
void updateGroupRel(DataGroupRelUpdateRequest request); void updateGroupRel(Long groupId, List<Long> relIdList);
/**
* 设置关联
*
* @param type type
* @param groupIdList groupIdList
* @param relId relId
*/
void updateGroupRel(String type, List<Long> groupIdList, Long relId);
/** /**
* 添加关联 * 添加关联
* *
* @param request request * @param groupId groupId
* @param relId relId
*/ */
void addGroupRel(DataGroupRelCreateRequest request); void addGroupRel(Long groupId, Long relId);
/** /**
* 添加关联 * 添加关联
@@ -37,7 +48,7 @@ public interface DataGroupRelService {
void addGroupRel(List<DataGroupRelCreateRequest> list); void addGroupRel(List<DataGroupRelCreateRequest> list);
/** /**
* 通过缓存查询数据分组关联 * 通过 type 查询 relId 缓存
* *
* @param type type * @param type type
* @return rows * @return rows
@@ -45,7 +56,7 @@ public interface DataGroupRelService {
List<DataGroupRelCacheDTO> getGroupRelListByCache(String type); List<DataGroupRelCacheDTO> getGroupRelListByCache(String type);
/** /**
* 通过缓存查询数据分组关联 * 通过 groupId 查询 relId 缓存
* *
* @param type type * @param type type
* @param groupId groupId * @param groupId groupId
@@ -53,6 +64,15 @@ public interface DataGroupRelService {
*/ */
List<DataGroupRelCacheDTO> getGroupRelListByCache(String type, Long groupId); List<DataGroupRelCacheDTO> getGroupRelListByCache(String type, Long groupId);
/**
* 通过 relId 查询 groupRel
*
* @param type type
* @param relId relId
* @return rows
*/
List<DataGroupRelDO> getGroupRelByRelId(String type, Long relId);
/** /**
* 删除数据分组关联 * 删除数据分组关联
* *

View File

@@ -40,7 +40,7 @@ public interface PreferenceService {
* @param type type * @param type type
* @return 偏好 * @return 偏好
*/ */
Future<Map<String, Object>> getPreference(Long userId, PreferenceTypeEnum type); Future<Map<String, Object>> getPreferenceAsync(Long userId, PreferenceTypeEnum type);
/** /**
* 删除用户偏好 * 删除用户偏好

View File

@@ -43,6 +43,6 @@ public interface SystemUserRoleService {
* @param roleCode roleCode * @param roleCode roleCode
* @param userIdList userIdList * @param userIdList userIdList
*/ */
void asyncDeleteUserCacheRole(String roleCode, List<Long> userIdList); void deleteUserCacheRoleAsync(String roleCode, List<Long> userIdList);
} }

View File

@@ -77,7 +77,7 @@ public interface SystemUserService {
* @param id id * @param id id
* @param username username * @param username username
*/ */
void deleteSystemUserRel(Long id, String username); void deleteSystemUserRelAsync(Long id, String username);
/** /**
* 重置密码 * 重置密码

View File

@@ -16,7 +16,6 @@ import com.orion.ops.module.infra.entity.domain.DataGroupDO;
import com.orion.ops.module.infra.entity.domain.DataGroupRelDO; import com.orion.ops.module.infra.entity.domain.DataGroupRelDO;
import com.orion.ops.module.infra.entity.dto.DataGroupRelCacheDTO; import com.orion.ops.module.infra.entity.dto.DataGroupRelCacheDTO;
import com.orion.ops.module.infra.entity.request.data.DataGroupRelCreateRequest; import com.orion.ops.module.infra.entity.request.data.DataGroupRelCreateRequest;
import com.orion.ops.module.infra.entity.request.data.DataGroupRelUpdateRequest;
import com.orion.ops.module.infra.service.DataGroupRelService; import com.orion.ops.module.infra.service.DataGroupRelService;
import com.orion.spring.SpringHolder; import com.orion.spring.SpringHolder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -25,6 +24,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Supplier; import java.util.function.Supplier;
@@ -49,14 +49,14 @@ public class DataGroupRelServiceImpl implements DataGroupRelService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void updateGroupRel(DataGroupRelUpdateRequest request) { public void updateGroupRel(Long groupId, List<Long> relIdList) {
Long groupId = request.getGroupId(); Valid.notNull(groupId);
// 查询分组 // 查询分组
DataGroupDO group = dataGroupDAO.selectById(groupId); DataGroupDO group = dataGroupDAO.selectById(groupId);
Valid.notNull(group, ErrorMessage.GROUP_ABSENT); Valid.notNull(group, ErrorMessage.GROUP_ABSENT);
List<Long> relIdList = request.getRelIdList(); String type = group.getType();
// 设置日志参数 // 设置日志参数
OperatorLogs.add(OperatorLogs.NAME, group.getName()); OperatorLogs.add(OperatorLogs.GROUP_NAME, group.getName());
if (Lists.isEmpty(relIdList)) { if (Lists.isEmpty(relIdList)) {
// 为空删除 // 为空删除
dataGroupRelDAO.deleteByGroupId(groupId); dataGroupRelDAO.deleteByGroupId(groupId);
@@ -84,21 +84,44 @@ public class DataGroupRelServiceImpl implements DataGroupRelService {
List<DataGroupRelDO> insertRecords = relIdList.stream() List<DataGroupRelDO> insertRecords = relIdList.stream()
.map(s -> DataGroupRelDO.builder() .map(s -> DataGroupRelDO.builder()
.groupId(groupId) .groupId(groupId)
.type(group.getType()) .type(type)
.relId(s) .relId(s)
.build()) .build())
.collect(Collectors.toList()); .collect(Collectors.toList());
dataGroupRelDAO.insertBatch(insertRecords); dataGroupRelDAO.insertBatch(insertRecords);
} }
} }
// 删除缓存
this.deleteCache(type, Lists.of(groupId));
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void addGroupRel(DataGroupRelCreateRequest request) { public void updateGroupRel(String type, List<Long> groupIdList, Long relId) {
Valid.notNull(relId);
// 删除引用
this.deleteByRelId(type, relId);
// 插入引用
if (!Lists.isEmpty(groupIdList)) {
List<DataGroupRelDO> relList = groupIdList.stream()
.map(s -> DataGroupRelDO.builder()
.type(type)
.groupId(s)
.relId(relId)
.build())
.collect(Collectors.toList());
dataGroupRelDAO.insertBatch(relList);
// 删除缓存
this.deleteCache(type, groupIdList);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void addGroupRel(Long groupId, Long relId) {
DataGroupRelCreateRequest record = DataGroupRelCreateRequest.builder() DataGroupRelCreateRequest record = DataGroupRelCreateRequest.builder()
.groupId(Valid.notNull(request.getGroupId())) .groupId(Valid.notNull(groupId))
.relId(Valid.notNull(request.getRelId())) .relId(Valid.notNull(relId))
.build(); .build();
// 插入 // 插入
SpringHolder.getBean(DataGroupRelService.class) SpringHolder.getBean(DataGroupRelService.class)
@@ -117,8 +140,7 @@ public class DataGroupRelServiceImpl implements DataGroupRelService {
// 查询分组信息 // 查询分组信息
List<DataGroupDO> groups = dataGroupDAO.selectBatchIds(groupMapping.keySet()); List<DataGroupDO> groups = dataGroupDAO.selectBatchIds(groupMapping.keySet());
Valid.eq(groups.size(), groupMapping.size(), ErrorMessage.GROUP_ABSENT); Valid.eq(groups.size(), groupMapping.size(), ErrorMessage.GROUP_ABSENT);
Map<Long, String> groupTypeMapping = groups.stream() String type = groups.get(0).getType();
.collect(Collectors.toMap(DataGroupDO::getId, DataGroupDO::getType));
// 查询关联是否存在 // 查询关联是否存在
groupMapping.forEach((k, v) -> { groupMapping.forEach((k, v) -> {
List<Long> relIdList = v.stream() List<Long> relIdList = v.stream()
@@ -144,23 +166,14 @@ public class DataGroupRelServiceImpl implements DataGroupRelService {
groupMapping.forEach((k, v) -> { groupMapping.forEach((k, v) -> {
v.forEach(s -> records.add(DataGroupRelDO.builder() v.forEach(s -> records.add(DataGroupRelDO.builder()
.groupId(k) .groupId(k)
.type(groupTypeMapping.get(k)) .type(type)
.relId(s.getRelId()) .relId(s.getRelId())
.build())); .build()));
}); });
// 插入 // 插入
dataGroupRelDAO.insertBatch(records); dataGroupRelDAO.insertBatch(records);
// 删除缓存 // 删除缓存
List<String> groupKeyList = groups.stream() this.deleteCache(type, groupMapping.keySet());
.map(DataGroupDO::getId)
.map(DataGroupCacheKeyDefine.DATA_GROUP_REL_GROUP::format)
.collect(Collectors.toList());
groups.stream()
.map(DataGroupDO::getType)
.distinct()
.map(DataGroupCacheKeyDefine.DATA_GROUP_REL_TYPE::format)
.forEach(groupKeyList::add);
RedisStrings.delete(groupKeyList);
} }
@Override @Override
@@ -190,6 +203,16 @@ public class DataGroupRelServiceImpl implements DataGroupRelService {
); );
} }
@Override
public List<DataGroupRelDO> getGroupRelByRelId(String type, Long relId) {
return dataGroupRelDAO.of()
.createWrapper()
.eq(DataGroupRelDO::getType, type)
.eq(DataGroupRelDO::getRelId, relId)
.then()
.list();
}
/** /**
* 查询分组引用缓存 * 查询分组引用缓存
* *
@@ -245,13 +268,8 @@ public class DataGroupRelServiceImpl implements DataGroupRelService {
.collect(Collectors.toList()); .collect(Collectors.toList());
// 删除数据库 // 删除数据库
int effect = dataGroupRelDAO.deleteBatchIds(relIdList); int effect = dataGroupRelDAO.deleteBatchIds(relIdList);
// 获取缓存 key
List<String> keyList = Lists.of(DataGroupCacheKeyDefine.DATA_GROUP_REL_TYPE.format(type));
groupIdList.stream()
.map(DataGroupCacheKeyDefine.DATA_GROUP_REL_GROUP::format)
.forEach(keyList::add);
// 删除缓存 // 删除缓存
RedisStrings.delete(keyList); this.deleteCache(type, groupIdList);
return effect; return effect;
} }
@@ -261,13 +279,27 @@ public class DataGroupRelServiceImpl implements DataGroupRelService {
// 删除数据库 // 删除数据库
int effect = dataGroupRelDAO.deleteByGroupId(groupIdList); int effect = dataGroupRelDAO.deleteByGroupId(groupIdList);
// 删除缓存 // 删除缓存
List<String> keyList = Lists.of(DataGroupCacheKeyDefine.DATA_GROUP_REL_TYPE.format(type)); this.deleteCache(type, groupIdList);
groupIdList.stream()
.map(DataGroupCacheKeyDefine.DATA_GROUP_REL_GROUP::format)
.forEach(keyList::add);
// 删除缓存
RedisStrings.delete(keyList);
return effect; return effect;
} }
/**
* 删除缓存
*
* @param type type
* @param groupIdList groupIdList
*/
private void deleteCache(String type, Collection<Long> groupIdList) {
// 类型缓存
List<String> keyList = Lists.of(DataGroupCacheKeyDefine.DATA_GROUP_REL_TYPE.format(type));
// 分组缓存
if (!Lists.isEmpty(groupIdList)) {
groupIdList.stream()
.map(DataGroupCacheKeyDefine.DATA_GROUP_REL_GROUP::format)
.forEach(keyList::add);
}
// 删除
RedisStrings.delete(keyList);
}
} }

View File

@@ -248,7 +248,7 @@ public class DataGroupServiceImpl implements DataGroupService {
RedisStrings.delete(DataGroupCacheKeyDefine.DATA_GROUP_LIST.format(type), RedisStrings.delete(DataGroupCacheKeyDefine.DATA_GROUP_LIST.format(type),
DataGroupCacheKeyDefine.DATA_GROUP_TREE.format(type)); DataGroupCacheKeyDefine.DATA_GROUP_TREE.format(type));
// 添加日志参数 // 添加日志参数
OperatorLogs.add(OperatorLogs.NAME, record.getName()); OperatorLogs.add(OperatorLogs.GROUP_NAME, record.getName());
return effect; return effect;
} }

View File

@@ -204,7 +204,7 @@ public class PermissionServiceImpl implements PermissionService {
UserCollectInfoVO user = SystemUserConvert.MAPPER.toCollectInfo(SecurityUtils.getLoginUser()); UserCollectInfoVO user = SystemUserConvert.MAPPER.toCollectInfo(SecurityUtils.getLoginUser());
Long id = user.getId(); Long id = user.getId();
// 获取用户系统偏好 // 获取用户系统偏好
Future<Map<String, Object>> systemPreference = preferenceService.getPreference(id, PreferenceTypeEnum.SYSTEM); Future<Map<String, Object>> systemPreference = preferenceService.getPreferenceAsync(id, PreferenceTypeEnum.SYSTEM);
// 获取用户角色 // 获取用户角色
List<String> roles = this.getUserEnabledRoles(); List<String> roles = this.getUserEnabledRoles();
// 获取用户权限 // 获取用户权限

View File

@@ -90,7 +90,7 @@ public class PreferenceServiceImpl implements PreferenceService {
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public Future<Map<String, Object>> getPreference(Long userId, PreferenceTypeEnum type) { public Future<Map<String, Object>> getPreferenceAsync(Long userId, PreferenceTypeEnum type) {
Map<String, Object> config = this.getPreferenceByCache(userId, type); Map<String, Object> config = this.getPreferenceByCache(userId, type);
return CompletableFuture.completedFuture(config); return CompletableFuture.completedFuture(config);
} }

View File

@@ -177,7 +177,7 @@ public class SystemRoleServiceImpl implements SystemRoleService {
// 删除菜单缓存 // 删除菜单缓存
permissionService.getRoleMenuCache().remove(code); permissionService.getRoleMenuCache().remove(code);
// 删除用户缓存中的角色 // 删除用户缓存中的角色
systemUserRoleService.asyncDeleteUserCacheRole(code, userIdList); systemUserRoleService.deleteUserCacheRoleAsync(code, userIdList);
return effect; return effect;
} }

View File

@@ -111,7 +111,7 @@ public class SystemUserRoleServiceImpl implements SystemUserRoleService {
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public void asyncDeleteUserCacheRole(String roleCode, List<Long> userIdList) { public void deleteUserCacheRoleAsync(String roleCode, List<Long> userIdList) {
for (Long userId : userIdList) { for (Long userId : userIdList) {
RedisStrings.<LoginUser>processSetJson(UserCacheKeyDefine.USER_INFO, s -> { RedisStrings.<LoginUser>processSetJson(UserCacheKeyDefine.USER_INFO, s -> {
List<String> roles = s.getRoles(); List<String> roles = s.getRoles();

View File

@@ -211,13 +211,13 @@ public class SystemUserServiceImpl implements SystemUserService {
int effect = systemUserDAO.deleteById(id); int effect = systemUserDAO.deleteById(id);
log.info("SystemUserService-deleteSystemUserById id: {}, effect: {}", id, effect); log.info("SystemUserService-deleteSystemUserById id: {}, effect: {}", id, effect);
// 异步删除额外信息 // 异步删除额外信息
SpringHolder.getBean(SystemUserService.class).deleteSystemUserRel(id, record.getUsername()); SpringHolder.getBean(SystemUserService.class).deleteSystemUserRelAsync(id, record.getUsername());
return effect; return effect;
} }
@Override @Override
@Async("asyncExecutor") @Async("asyncExecutor")
public void deleteSystemUserRel(Long id, String username) { public void deleteSystemUserRelAsync(Long id, String username) {
log.info("SystemUserService-deleteSystemUserRel id: {}", id); log.info("SystemUserService-deleteSystemUserRel id: {}", id);
// 删除用户列表缓存 // 删除用户列表缓存
RedisMaps.delete(UserCacheKeyDefine.USER_LIST, id); RedisMaps.delete(UserCacheKeyDefine.USER_LIST, id);

View File

@@ -10,6 +10,7 @@ export interface HostCreateRequest {
code?: string; code?: string;
address?: string; address?: string;
tags?: Array<number>; tags?: Array<number>;
groupIdList?: Array<number>;
} }
/** /**
@@ -30,8 +31,7 @@ export interface HostQueryRequest extends Pagination {
address?: string; address?: string;
favorite?: boolean; favorite?: boolean;
tags?: Array<number>; tags?: Array<number>;
extra?: boolean; queryTag?: boolean;
config?: boolean;
} }
/** /**
@@ -46,9 +46,10 @@ export interface HostQueryResponse extends TableData {
updateTime: number; updateTime: number;
creator: string; creator: string;
updater: string; updater: string;
// FIXME 删除
favorite: boolean; favorite: boolean;
tags: Record<number, string>; tags: Array<{ id: number, name: string }>;
configs: Record<string, HostConfigQueryResponse>; groupIdList: Array<number>;
} }
/** /**
@@ -90,8 +91,8 @@ export function updateHost(request: HostUpdateRequest) {
/** /**
* 通过 id 查询主机 * 通过 id 查询主机
*/ */
export function getHost(params: HostQueryRequest) { export function getHost(id: number) {
return axios.get<HostQueryResponse>('/asset/host/get', { params }); return axios.get<HostQueryResponse>('/asset/host/get', { params: { id } });
} }
/** /**

View File

@@ -14,7 +14,7 @@
</template> </template>
</a-alert> </a-alert>
<!-- 保存按钮 --> <!-- 保存按钮 -->
<a-button v-permission="['asset:host-group:update-rel']" <a-button v-permission="['asset:host:update']"
class="save-button" class="save-button"
type="primary" type="primary"
:disabled="!group.key" :disabled="!group.key"

View File

@@ -59,9 +59,10 @@
import useLoading from '@/hooks/loading'; import useLoading from '@/hooks/loading';
import useVisible from '@/hooks/visible'; import useVisible from '@/hooks/visible';
import formRules from '../types/host.form.rules'; import formRules from '../types/host.form.rules';
import { createHost, updateHost } from '@/api/asset/host'; import { createHost, getHost, updateHost } from '@/api/asset/host';
import { Message } from '@arco-design/web-vue'; import { Message } from '@arco-design/web-vue';
import TagMultiSelector from '@/components/meta/tag/tag-multi-selector.vue'; import TagMultiSelector from '@/components/meta/tag/tag-multi-selector.vue';
import { pick } from 'lodash';
const { visible, setVisible } = useVisible(); const { visible, setVisible } = useVisible();
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
@@ -76,6 +77,7 @@
code: undefined, code: undefined,
address: undefined, address: undefined,
tags: undefined, tags: undefined,
groupIdList: undefined,
}; };
}; };
@@ -93,12 +95,29 @@
}; };
// 打开修改 // 打开修改
const openUpdate = (record: any) => { const openUpdate = async (id: number) => {
title.value = '修改主机'; title.value = '修改主机';
isAddHandle.value = false; isAddHandle.value = false;
const tags = record?.hostTags?.map((s: { id: any; }) => s.id); renderForm({ ...defaultForm() });
renderForm({ ...defaultForm(), ...record, tags });
setVisible(true); setVisible(true);
await fetchHostRender(id);
};
// 渲染主机
const fetchHostRender = async (id: number) => {
try {
setLoading(true);
const { data } = await getHost(id);
const detail = Object.assign({} as Record<string, any>,
pick(data, 'id', 'name', 'code', 'address', 'groupIdList'));
// tag
const tags = (data.tags || []).map(s => s.id);
// 渲染
renderForm({ ...detail, tags });
} catch (e) {
} finally {
setLoading(false);
}
}; };
// 渲染表单 // 渲染表单