优化数据分组逻辑.

This commit is contained in:
lijiahangmax
2024-08-23 01:44:05 +08:00
parent 252c538571
commit 1fca5a1912
17 changed files with 101 additions and 213 deletions

View File

@@ -9,6 +9,7 @@ import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException; import javax.validation.ConstraintViolationException;
import javax.validation.Validator; import javax.validation.Validator;
import java.util.Collection; import java.util.Collection;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Function; import java.util.function.Function;
@@ -31,6 +32,10 @@ public class Valid extends com.orion.lang.utils.Valid {
return notBlank(s, ErrorMessage.PARAM_MISSING); return notBlank(s, ErrorMessage.PARAM_MISSING);
} }
public static <T extends Map<?, ?>> T notEmpty(T map) {
return notEmpty(map, ErrorMessage.PARAM_MISSING);
}
public static <T extends Collection<?>> T notEmpty(T object) { public static <T extends Collection<?>> T notEmpty(T object) {
return notEmpty(object, ErrorMessage.PARAM_MISSING); return notEmpty(object, ErrorMessage.PARAM_MISSING);
} }

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.infra.api; package com.orion.visor.module.infra.api;
import com.orion.visor.module.infra.entity.dto.data.DataGroupRelCreateDTO;
import com.orion.visor.module.infra.enums.DataGroupTypeEnum; import com.orion.visor.module.infra.enums.DataGroupTypeEnum;
import java.util.List; import java.util.List;
@@ -37,6 +36,7 @@ public interface DataGroupRelApi {
/** /**
* 添加关联 * 添加关联
* *
* @param type type
* @param groupId groupId * @param groupId groupId
* @param relId relId * @param relId relId
*/ */
@@ -45,9 +45,10 @@ public interface DataGroupRelApi {
/** /**
* 批量添加关联 * 批量添加关联
* *
* @param list list * @param type type
* @param groupRelListMap groupRelListMap
*/ */
void addGroupRel(DataGroupTypeEnum type, List<DataGroupRelCreateDTO> list); void addGroupRel(DataGroupTypeEnum type, Map<Long, List<Long>> groupRelListMap);
/** /**
* 通过 type 查询 relId 缓存 * 通过 type 查询 relId 缓存

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.infra.api; package com.orion.visor.module.infra.api;
import com.orion.visor.module.infra.entity.dto.data.DataGroupRelCreateDTO;
import com.orion.visor.module.infra.enums.DataGroupTypeEnum; import com.orion.visor.module.infra.enums.DataGroupTypeEnum;
import java.util.List; import java.util.List;
@@ -40,11 +39,11 @@ public interface DataGroupUserRelApi {
/** /**
* 批量添加关联 * 批量添加关联
* *
* @param type type * @param type type
* @param userId userId * @param userId userId
* @param list list * @param groupRelListMap groupRelListMap
*/ */
void addGroupRel(DataGroupTypeEnum type, Long userId, List<DataGroupRelCreateDTO> list); void addGroupRel(DataGroupTypeEnum type, Long userId, Map<Long, List<Long>> groupRelListMap);
/** /**
* 通过 type 查询 relId 缓存 * 通过 type 查询 relId 缓存

View File

@@ -1,34 +0,0 @@
package com.orion.visor.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 = "DataGroupRelCreateDTO", description = "数据分组关联 创建请求业务对象")
public class DataGroupRelCreateDTO implements Serializable {
@NotNull
@Schema(description = "组id")
private Long groupId;
@NotNull
@Schema(description = "引用id")
private Long relId;
}

View File

@@ -3,11 +3,8 @@ package com.orion.visor.module.infra.api.impl;
import com.orion.visor.framework.common.constant.Const; import com.orion.visor.framework.common.constant.Const;
import com.orion.visor.framework.common.utils.Valid; import com.orion.visor.framework.common.utils.Valid;
import com.orion.visor.module.infra.api.DataGroupRelApi; import com.orion.visor.module.infra.api.DataGroupRelApi;
import com.orion.visor.module.infra.convert.DataGroupRelProviderConvert;
import com.orion.visor.module.infra.entity.domain.DataGroupRelDO; import com.orion.visor.module.infra.entity.domain.DataGroupRelDO;
import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO; import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO;
import com.orion.visor.module.infra.entity.dto.data.DataGroupRelCreateDTO;
import com.orion.visor.module.infra.entity.request.data.DataGroupRelCreateRequest;
import com.orion.visor.module.infra.enums.DataGroupTypeEnum; import com.orion.visor.module.infra.enums.DataGroupTypeEnum;
import com.orion.visor.module.infra.service.DataGroupRelService; import com.orion.visor.module.infra.service.DataGroupRelService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -57,10 +54,9 @@ public class DataGroupRelApiImpl implements DataGroupRelApi {
} }
@Override @Override
public void addGroupRel(DataGroupTypeEnum type, List<DataGroupRelCreateDTO> list) { public void addGroupRel(DataGroupTypeEnum type, Map<Long, List<Long>> groupRelListMap) {
Valid.valid(list); Valid.notEmpty(groupRelListMap);
List<DataGroupRelCreateRequest> rows = DataGroupRelProviderConvert.MAPPER.toList(list); dataGroupRelService.addGroupRel(type.name(), Const.SYSTEM_USER_ID, groupRelListMap);
dataGroupRelService.addGroupRel(type.name(), Const.SYSTEM_USER_ID, rows);
} }
@Override @Override

View File

@@ -2,11 +2,8 @@ package com.orion.visor.module.infra.api.impl;
import com.orion.visor.framework.common.utils.Valid; import com.orion.visor.framework.common.utils.Valid;
import com.orion.visor.module.infra.api.DataGroupUserRelApi; import com.orion.visor.module.infra.api.DataGroupUserRelApi;
import com.orion.visor.module.infra.convert.DataGroupRelProviderConvert;
import com.orion.visor.module.infra.entity.domain.DataGroupRelDO; import com.orion.visor.module.infra.entity.domain.DataGroupRelDO;
import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO; import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO;
import com.orion.visor.module.infra.entity.dto.data.DataGroupRelCreateDTO;
import com.orion.visor.module.infra.entity.request.data.DataGroupRelCreateRequest;
import com.orion.visor.module.infra.enums.DataGroupTypeEnum; import com.orion.visor.module.infra.enums.DataGroupTypeEnum;
import com.orion.visor.module.infra.service.DataGroupRelService; import com.orion.visor.module.infra.service.DataGroupRelService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -50,10 +47,9 @@ public class DataGroupUserRelApiImpl implements DataGroupUserRelApi {
} }
@Override @Override
public void addGroupRel(DataGroupTypeEnum type, Long userId, List<DataGroupRelCreateDTO> list) { public void addGroupRel(DataGroupTypeEnum type, Long userId, Map<Long, List<Long>> groupRelListMap) {
Valid.valid(list); Valid.notEmpty(groupRelListMap);
List<DataGroupRelCreateRequest> rows = DataGroupRelProviderConvert.MAPPER.toList(list); dataGroupRelService.addGroupRel(type.name(), userId, groupRelListMap);
dataGroupRelService.addGroupRel(type.name(), userId, rows);
} }
@Override @Override

View File

@@ -2,7 +2,6 @@ package com.orion.visor.module.infra.convert;
import com.orion.visor.module.infra.entity.domain.DataGroupRelDO; import com.orion.visor.module.infra.entity.domain.DataGroupRelDO;
import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO; import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO;
import com.orion.visor.module.infra.entity.request.data.DataGroupRelCreateRequest;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
@@ -18,8 +17,6 @@ public interface DataGroupRelConvert {
DataGroupRelConvert MAPPER = Mappers.getMapper(DataGroupRelConvert.class); DataGroupRelConvert MAPPER = Mappers.getMapper(DataGroupRelConvert.class);
DataGroupRelDO to(DataGroupRelCreateRequest request);
DataGroupRelCacheDTO toCache(DataGroupRelDO domain); DataGroupRelCacheDTO toCache(DataGroupRelDO domain);
} }

View File

@@ -1,26 +0,0 @@
package com.orion.visor.module.infra.convert;
import com.orion.visor.module.infra.entity.dto.data.DataGroupRelCreateDTO;
import com.orion.visor.module.infra.entity.request.data.DataGroupRelCreateRequest;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* 数据分组关联 对外服务对象转换器
*
* @author Jiahang Li
* @version 1.0.0
* @since 2023-11-7 18:44
*/
@Mapper
public interface DataGroupRelProviderConvert {
DataGroupRelProviderConvert MAPPER = Mappers.getMapper(DataGroupRelProviderConvert.class);
DataGroupRelCreateRequest toRequest(DataGroupRelCreateDTO request);
List<DataGroupRelCreateRequest> toList(List<DataGroupRelCreateDTO> list);
}

View File

@@ -1,34 +0,0 @@
package com.orion.visor.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 = "DataGroupRelCreateRequest", description = "数据分组关联 创建请求对象")
public class DataGroupRelCreateRequest implements Serializable {
@NotNull
@Schema(description = "组id")
private Long groupId;
@NotNull
@Schema(description = "引用id")
private Long relId;
}

View File

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

View File

@@ -2,9 +2,9 @@ package com.orion.visor.module.infra.service;
import com.orion.visor.module.infra.entity.domain.DataGroupRelDO; import com.orion.visor.module.infra.entity.domain.DataGroupRelDO;
import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO; import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO;
import com.orion.visor.module.infra.entity.request.data.DataGroupRelCreateRequest;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 数据分组关联 服务类 * 数据分组关联 服务类
@@ -34,19 +34,23 @@ public interface DataGroupRelService {
void updateRelGroup(String type, Long userId, List<Long> groupIdList, Long relId); void updateRelGroup(String type, Long userId, List<Long> groupIdList, Long relId);
/** /**
* 添加关联 * 添加关联 只新增
* *
* @param type type
* @param userId userId
* @param groupId groupId * @param groupId groupId
* @param relId relId * @param relId relId
*/ */
void addGroupRel(String type, Long userId, Long groupId, Long relId); void addGroupRel(String type, Long userId, Long groupId, Long relId);
/** /**
* 添加关联 * 添加关联 只新增
* *
* @param list list * @param type type
* @param userId userId
* @param groupRelListMap groupRelListMap
*/ */
void addGroupRel(String type, Long userId, List<DataGroupRelCreateRequest> list); void addGroupRel(String type, Long userId, Map<Long, List<Long>> groupRelListMap);
/** /**
* 通过 type 查询 relId 缓存 * 通过 type 查询 relId 缓存

View File

@@ -2,6 +2,7 @@ package com.orion.visor.module.infra.service.impl;
import com.orion.lang.utils.Strings; import com.orion.lang.utils.Strings;
import com.orion.lang.utils.collect.Lists; import com.orion.lang.utils.collect.Lists;
import com.orion.lang.utils.collect.Maps;
import com.orion.spring.SpringHolder; import com.orion.spring.SpringHolder;
import com.orion.visor.framework.biz.operator.log.core.utils.OperatorLogs; import com.orion.visor.framework.biz.operator.log.core.utils.OperatorLogs;
import com.orion.visor.framework.common.constant.ErrorMessage; import com.orion.visor.framework.common.constant.ErrorMessage;
@@ -17,17 +18,13 @@ import com.orion.visor.module.infra.define.cache.DataGroupCacheKeyDefine;
import com.orion.visor.module.infra.entity.domain.DataGroupDO; import com.orion.visor.module.infra.entity.domain.DataGroupDO;
import com.orion.visor.module.infra.entity.domain.DataGroupRelDO; import com.orion.visor.module.infra.entity.domain.DataGroupRelDO;
import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO; import com.orion.visor.module.infra.entity.dto.DataGroupRelCacheDTO;
import com.orion.visor.module.infra.entity.request.data.DataGroupRelCreateRequest;
import com.orion.visor.module.infra.service.DataGroupRelService; import com.orion.visor.module.infra.service.DataGroupRelService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -122,64 +119,32 @@ public class DataGroupRelServiceImpl implements DataGroupRelService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void addGroupRel(String type, Long userId, Long groupId, Long relId) { public void addGroupRel(String type, Long userId, Long groupId, Long relId) {
DataGroupRelCreateRequest record = DataGroupRelCreateRequest.builder() Map<Long, List<Long>> map = new HashMap<>();
.groupId(Valid.notNull(groupId)) map.put(groupId, Lists.singleton(relId));
.relId(Valid.notNull(relId))
.build();
// 插入 // 插入
SpringHolder.getBean(DataGroupRelService.class) SpringHolder.getBean(DataGroupRelService.class).addGroupRel(type, userId, map);
.addGroupRel(type, userId, Lists.singleton(record));
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void addGroupRel(String type, Long userId, List<DataGroupRelCreateRequest> list) { public void addGroupRel(String type, Long userId, Map<Long, List<Long>> groupRelListMap) {
if (Lists.isEmpty(list)) { if (Maps.isEmpty(groupRelListMap)) {
return; return;
} }
// 通过 groupId 分组
Map<Long, List<DataGroupRelCreateRequest>> groupMapping = list.stream()
.collect(Collectors.groupingBy(DataGroupRelCreateRequest::getGroupId));
// 查询分组信息
List<DataGroupDO> groups = dataGroupDAO.selectBatchIds(groupMapping.keySet());
Valid.eq(groups.size(), groupMapping.size(), ErrorMessage.GROUP_ABSENT);
// 查询关联是否存在
groupMapping.forEach((k, v) -> {
List<Long> relIdList = v.stream()
.map(DataGroupRelCreateRequest::getRelId)
.collect(Collectors.toList());
// 查询关联
List<Long> presentRelIdList = dataGroupRelDAO.of()
.createWrapper()
.eq(DataGroupRelDO::getGroupId, k)
.in(DataGroupRelDO::getRelId, relIdList)
.then()
.stream()
.map(DataGroupRelDO::getRelId)
.distinct()
.collect(Collectors.toList());
if (!presentRelIdList.isEmpty()) {
// 删除待插入的重复数据
v.removeIf(s -> presentRelIdList.contains(s.getRelId()));
}
});
// 构建插入数据 // 构建插入数据
List<DataGroupRelDO> records = new ArrayList<>(); List<DataGroupRelDO> records = new ArrayList<>();
groupMapping.forEach((k, v) -> { groupRelListMap.forEach((k, v) -> {
v.forEach(s -> records.add(DataGroupRelDO.builder() v.forEach(s -> records.add(DataGroupRelDO.builder()
.groupId(k) .groupId(k)
.type(type) .type(type)
.userId(userId) .userId(userId)
.relId(s.getRelId()) .relId(s)
.build())); .build()));
}); });
// 不为空则插入 // 插入
if (!records.isEmpty()) { dataGroupRelDAO.insertBatch(records);
// 插入 // 删除缓存
dataGroupRelDAO.insertBatch(records); this.deleteCache(type, userId, groupRelListMap.keySet());
// 删除缓存
this.deleteCache(type, userId, groupMapping.keySet());
}
} }
@Override @Override

View File

@@ -101,7 +101,11 @@ export function getExecCommandLogTailToken(request: ExecLogTailRequest) {
* 下载批量执行日志文件 * 下载批量执行日志文件
*/ */
export function downloadExecCommandLogFile(id: number) { export function downloadExecCommandLogFile(id: number) {
return axios.get('/asset/exec-command-log/download', { unwrap: true, params: { id } }); return axios.get('/asset/exec-command-log/download', {
unwrap: true,
responseType: 'blob',
params: { id },
});
} }
/** /**

View File

@@ -94,7 +94,11 @@ export function getExecJobLogTailToken(request: ExecLogTailRequest) {
* 下载计划任务日志文件 * 下载计划任务日志文件
*/ */
export function downloadExecJobLogFile(id: number) { export function downloadExecJobLogFile(id: number) {
return axios.get('/asset/exec-job-log/download', { unwrap: true, params: { id } }); return axios.get('/asset/exec-job-log/download', {
unwrap: true,
responseType: 'blob',
params: { id },
});
} }
/** /**

View File

@@ -2,6 +2,52 @@ import Mock from 'mockjs';
// import './user'; // import './user';
import '@/views/dashboard/workplace/mock'; import '@/views/dashboard/workplace/mock';
// Mock XHR
interface XHR {
responseType: string;
timeout: number;
withCredentials: boolean;
onabort: () => void;
onerror: () => void;
onload: () => void;
onloadend: () => void;
onloadstart: () => void;
onprogress: () => void;
onreadystatechange: () => void;
ontimeout: () => void;
}
// Mock XHR Custom
interface XHRCustom extends XHR {
custom: XHRCustom;
xhr: XHR;
match: boolean;
}
// @ts-ignore
Mock.XHR.prototype.send = (() => {
// @ts-ignore
const _send = Mock.XHR.prototype.send;
const defaultEvent = () => {
};
return function (this: XHRCustom) {
if (!this.match) {
this.custom.xhr.responseType = this.responseType || '';
this.custom.xhr.timeout = this.timeout || 0;
this.custom.xhr.withCredentials = this.withCredentials || false;
this.custom.xhr.onabort = this.onabort || defaultEvent;
this.custom.xhr.onerror = this.onerror || defaultEvent;
this.custom.xhr.onload = this.onload || defaultEvent;
this.custom.xhr.onloadend = this.onloadend || defaultEvent;
this.custom.xhr.onloadstart = this.onloadstart || defaultEvent;
this.custom.xhr.onprogress = this.onprogress || defaultEvent;
this.custom.xhr.onreadystatechange = this.onreadystatechange || defaultEvent;
this.custom.xhr.ontimeout = this.ontimeout || defaultEvent;
}
return _send.apply(this, arguments);
};
})();
Mock.setup({ Mock.setup({
timeout: '600-1000', timeout: '600-1000',
}); });

View File

@@ -109,7 +109,7 @@ export function openDownloadFile(url: string) {
* 下载文件 * 下载文件
*/ */
export function downloadFile(res: any, fileName: string = '') { export function downloadFile(res: any, fileName: string = '') {
const blob = new Blob([res.data]); const blob = new Blob([res.data], { type: 'application/octet-stream' });
const tempLink = document.createElement('a'); const tempLink = document.createElement('a');
const blobURL = window.URL.createObjectURL(blob); const blobURL = window.URL.createObjectURL(blob);
tempLink.style.display = 'none'; tempLink.style.display = 'none';

View File

@@ -78,6 +78,9 @@
import UserSelector from '@/components/user/user/selector/index.vue'; import UserSelector from '@/components/user/user/selector/index.vue';
import HostSelector from '@/components/asset/host/selector/index.vue'; import HostSelector from '@/components/asset/host/selector/index.vue';
const emits = defineEmits(['clear']);
const { toOptions } = useDictStore();
const { visible, setVisible } = useVisible(); const { visible, setVisible } = useVisible();
const { loading, setLoading } = useLoading(); const { loading, setLoading } = useLoading();
@@ -94,10 +97,6 @@
const formModel = ref<HostConnectLogQueryRequest>({}); const formModel = ref<HostConnectLogQueryRequest>({});
const emits = defineEmits(['clear']);
const { toOptions } = useDictStore();
// 打开 // 打开
const open = (record: any) => { const open = (record: any) => {
renderForm({ ...defaultForm(), ...record }); renderForm({ ...defaultForm(), ...record });