From 70f0b1381e579907e37758f88fdb2a56f0a7bc19 Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Thu, 4 Sep 2025 15:55:01 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E5=B0=86=E6=B6=89?= =?UTF-8?q?=E5=8F=8Ascence=5Fipobject=5Fdetail=E8=A7=86=E5=9B=BE=E7=9A=84S?= =?UTF-8?q?QL=E8=AF=AD=E5=8F=A5=E6=94=B9=E6=88=90=E5=8A=A8=E6=80=81sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1469827334504448]将涉及scence_ipobject_detail视图的SQL语句改成动态sql http://192.168.0.96:8090/demo/rdm.html#/task-detail/939050947543040/939050947543050/1469827334504448 --- .../IResourceCenterResourceService.java | 5 + .../resource/ResourceBuildSqlService.java | 3 +- .../resource/ResourceBuildSqlServiceImpl.java | 51 +++++ .../ResourceCenterResourceServiceImpl.java | 196 ++++++++++++++++++ 4 files changed, 254 insertions(+), 1 deletion(-) diff --git a/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/IResourceCenterResourceService.java b/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/IResourceCenterResourceService.java index 527c345c..04f4440d 100644 --- a/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/IResourceCenterResourceService.java +++ b/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/IResourceCenterResourceService.java @@ -99,4 +99,9 @@ public interface IResourceCenterResourceService { */ void addAccountInformation(List resourceList); + int getResourceCount(ResourceSearchVo searchVo); + + List getResourceIdList(ResourceSearchVo searchVo); + + List getResourceListByIdList(List idList); } diff --git a/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceBuildSqlService.java b/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceBuildSqlService.java index 894c9c3b..82f06344 100644 --- a/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceBuildSqlService.java +++ b/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceBuildSqlService.java @@ -130,7 +130,8 @@ public interface ResourceBuildSqlService { String buildGetAppEnvCountMapByAppSystemIdGroupByAppModuleIdSql(Long appSystemId); String buildGetResourceCountByDynamicConditionSql(ResourceSearchVo searchVo); -// String buildGetResourceIdListByDynamicConditionSql(ResourceSearchVo searchVo); + + String buildGetResourceIdListByDynamicConditionSql(ResourceSearchVo searchVo); String buildGetAppResourceCountSql(ResourceSearchVo searchVo); diff --git a/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceBuildSqlServiceImpl.java b/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceBuildSqlServiceImpl.java index d754c434..2a741f5a 100644 --- a/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceBuildSqlServiceImpl.java +++ b/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceBuildSqlServiceImpl.java @@ -1053,6 +1053,57 @@ public class ResourceBuildSqlServiceImpl implements ResourceBuildSqlService, IRe return null; } + @Override + public String buildGetResourceIdListByDynamicConditionSql(ResourceSearchVo searchVo) { + try { + ResourceEntityVo resourceEntityVo = resourceEntityMapper.getResourceEntityByName("scence_ipobject_detail"); + ResourceEntityConfigVo config = getResourceEntityConfigVo(resourceEntityVo); + List selectItemFieldNameList = new ArrayList<>(); + selectItemFieldNameList.add("id"); + List filterItemFieldNameList = new ArrayList<>(); + filterItemFieldNameList.add("id"); + ResourceQueryCriteriaVo queryCriteriaVo = new ResourceQueryCriteriaVo(searchVo); + List filterItemFieldNameList1 = getFilterItemFieldNameList(queryCriteriaVo); + System.out.println("filterItemFieldNameList1 = " + filterItemFieldNameList1); + filterItemFieldNameList.addAll(filterItemFieldNameList1); + JSONObject conditionConfigObj = new JSONObject(); + conditionConfigObj.put("conditionGroupList", searchVo.getConditionGroupList()); + conditionConfigObj.put("conditionGroupRelList", searchVo.getConditionGroupRelList()); + ResourceConditionConfigVo resourceConditionConfigVo = conditionConfigObj.toJavaObject(ResourceConditionConfigVo.class); + List filterItemFieldNameList2 = resourceConditionConfigVo.getFilterItemFieldNameList(); + System.out.println("filterItemFieldNameList2 = " + filterItemFieldNameList2); + filterItemFieldNameList.addAll(filterItemFieldNameList2); + config.setSelectItemFieldNameList(selectItemFieldNameList); + config.setFilterItemFieldNameList(filterItemFieldNameList); + Map fieldName2ColumnMap = new HashMap<>(); + PlainSelect plainSelect = getPlainSelect(config, fieldName2ColumnMap); + $sql.setDistinct(plainSelect, true); +// $sql.addSelectColumn(plainSelect, $sql.fun("count", fieldName2ColumnMap.get("id").toString()).withDistinct(true)); + /* + + AND (a.`name` LIKE CONCAT('%', #{keyword}, '%') OR a.`ip` LIKE CONCAT('%', #{keyword}, '%')) + + */ + if (StringUtils.isNotBlank(queryCriteriaVo.getKeyword())) { + String keyword = "'%" + queryCriteriaVo.getKeyword() + "%'"; + $sql.addWhereExpression(plainSelect, $sql.exp("(", + $sql.exp(fieldName2ColumnMap.get("name").toString(), "like", keyword), + "or", $sql.exp(fieldName2ColumnMap.get("ip").toString(), "like", keyword), + ")") + ); + } + SqlVo sqlVo = getSqlVoForResource(queryCriteriaVo, fieldName2ColumnMap); + resourceConditionConfigVo.buildConditionSqlVo(sqlVo, fieldName2ColumnMap); + $sql.addSql(plainSelect, sqlVo); + $sql.addOrderBy(plainSelect, fieldName2ColumnMap.get("id").toString()); + $sql.setLimit(plainSelect, searchVo.getStartNum(), searchVo.getPageSize()); + return plainSelect.toString(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + return null; + } + @Override public String buildGetAppResourceCountSql(ResourceSearchVo searchVo) { try { diff --git a/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceCenterResourceServiceImpl.java b/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceCenterResourceServiceImpl.java index bffbf765..d712b52e 100644 --- a/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceCenterResourceServiceImpl.java +++ b/src/main/java/neatlogic/module/cmdb/service/resourcecenter/resource/ResourceCenterResourceServiceImpl.java @@ -61,6 +61,9 @@ public class ResourceCenterResourceServiceImpl implements IResourceCenterResourc private final Logger logger = LoggerFactory.getLogger(ResourceCenterResourceServiceImpl.class); private final static List defaultAttrList = Arrays.asList("_id", "_uuid", "_name", "_fcu", "_fcd", "_lcu", "_lcd", "_inspectStatus", "_inspectTime", "_monitorStatus", "_monitorTime", "_typeId", "_typeName", "_typeLabel"); + private final String MYBATIS_MODE = "mybatis"; + private final String JSQLPARSER_MODE = "jsqlparser"; + private final String COMPARISON_ENABLED = "1"; @Resource ResourceMapper resourceMapper; @Resource @@ -86,6 +89,9 @@ public class ResourceCenterResourceServiceImpl implements IResourceCenterResourc @Resource private DataBaseViewInfoMapper dataBaseViewInfoMapper; + @Resource + private ResourceBuildSqlService resourceBuildSqlService; + @Override public ResourceSearchVo assembleResourceSearchVo(JSONObject jsonObj) { if(!jsonObj.containsKey("typeId") && !jsonObj.containsKey("typeIdList")){ @@ -576,4 +582,194 @@ public class ResourceCenterResourceServiceImpl implements IResourceCenterResourc } } } + + @Override + public int getResourceCount(ResourceSearchVo searchVo) { + String enable = ConfigManager.getConfig(CmdbTenantConfig.RESOURCECENTER_DATA_COMPARISON_MODE_ENABLE); + String mode = ConfigManager.getConfig(CmdbTenantConfig.RESOURCECENTER_SQL_MODE); + int oldRowNum = 0; + int newRowNum = 0; + if (Objects.equals(mode, JSQLPARSER_MODE) || Objects.equals(enable, COMPARISON_ENABLED)) { + String sql = resourceBuildSqlService.buildGetResourceCountSql(searchVo); + newRowNum = resourceMapper.getCountBySql(sql); + } + if (Objects.equals(mode, MYBATIS_MODE) || Objects.equals(enable, COMPARISON_ENABLED)) { + if (noFilterCondition(searchVo)) { + ResourceEntityVo resourceEntityVo = resourceEntityMapper.getResourceEntityByName("scence_ipobject_detail"); + if (resourceEntityVo != null) { + ResourceEntityConfigVo config = resourceEntityVo.getConfig(); + if (config != null) { + CiVo ciVo = ciMapper.getCiByName(config.getMainCi()); + if (ciVo != null) { + searchVo.setViewName(ciVo.getCiTableName(false)); + oldRowNum = resourceMapper.getAllResourceCount(searchVo); + } + } + } + } else { + oldRowNum = resourceMapper.getResourceCount(searchVo); + } + } + if (Objects.equals(enable, COMPARISON_ENABLED)) { + if (oldRowNum != newRowNum) { + JSONObject errorObj = new JSONObject(); + errorObj.put("newRowNum", newRowNum); + errorObj.put("oldRowNum", oldRowNum); + logger.error("资产清单新旧SQL获取rowNum结果不一致:{}", errorObj); + } + } + if (Objects.equals(mode, JSQLPARSER_MODE)) { + return newRowNum; + } else if (Objects.equals(mode, MYBATIS_MODE)) { + return oldRowNum; + } + return 0; + } + + @Override + public List getResourceIdList(ResourceSearchVo searchVo) { + String enable = ConfigManager.getConfig(CmdbTenantConfig.RESOURCECENTER_DATA_COMPARISON_MODE_ENABLE); + String mode = ConfigManager.getConfig(CmdbTenantConfig.RESOURCECENTER_SQL_MODE); + List newIdList = new ArrayList<>(); + List oldIdList = new ArrayList<>(); + if (Objects.equals(mode, JSQLPARSER_MODE) || Objects.equals(enable, COMPARISON_ENABLED)) { + String sql = resourceBuildSqlService.buildGetResourceIdListSql(searchVo); + newIdList = resourceMapper.getIdListBySql(sql); + } + if (Objects.equals(mode, MYBATIS_MODE) || Objects.equals(enable, COMPARISON_ENABLED)) { + oldIdList = resourceMapper.getResourceIdList(searchVo); + } + if (Objects.equals(enable, COMPARISON_ENABLED)) { + if (!Objects.equals(oldIdList, newIdList)) { + JSONObject errorObj = new JSONObject(); + errorObj.put("newIdList", newIdList); + errorObj.put("oldIdList", oldIdList); + logger.error("资产清单新旧SQL获取idList结果不一致:{}", errorObj); + } + } + if (Objects.equals(mode, JSQLPARSER_MODE)) { + return newIdList; + } else if (Objects.equals(mode, MYBATIS_MODE)) { + return oldIdList; + } + return new ArrayList<>(); + } + + @Override + public List getResourceListByIdList(List idList) { + String enable = ConfigManager.getConfig(CmdbTenantConfig.RESOURCECENTER_DATA_COMPARISON_MODE_ENABLE); + String mode = ConfigManager.getConfig(CmdbTenantConfig.RESOURCECENTER_SQL_MODE); + List newResourceList = new ArrayList<>(); + List oldResourceList = new ArrayList<>(); + if (Objects.equals(mode, JSQLPARSER_MODE) || Objects.equals(enable, COMPARISON_ENABLED)) { + String sql = resourceBuildSqlService.buildGetResourceListSql(idList); + newResourceList = resourceMapper.getResourceListBySql(sql); + } + if (Objects.equals(mode, MYBATIS_MODE) || Objects.equals(enable, COMPARISON_ENABLED)) { + oldResourceList = resourceMapper.getResourceListByIdList(idList); + } + if (Objects.equals(enable, COMPARISON_ENABLED)) { + checkResourceListIsEquals(newResourceList, oldResourceList); + } + if (Objects.equals(mode, JSQLPARSER_MODE)) { + return newResourceList; + } else if (Objects.equals(mode, MYBATIS_MODE)) { + return oldResourceList; + } + return new ArrayList<>(); + } + +// public Object example() { +// String enable = ConfigManager.getConfig(CmdbTenantConfig.RESOURCECENTER_DATA_COMPARISON_MODE_ENABLE); +// String mode = ConfigManager.getConfig(CmdbTenantConfig.RESOURCECENTER_SQL_MODE); +// if (Objects.equals(mode, JSQLPARSER_MODE) || Objects.equals(enable, COMPARISON_ENABLED)) { +// +// } +// if (Objects.equals(mode, MYBATIS_MODE) || Objects.equals(enable, COMPARISON_ENABLED)) { +// +// } +// if (Objects.equals(enable, COMPARISON_ENABLED)) { +// +// } +// if (Objects.equals(mode, JSQLPARSER_MODE)) { +// +// } else if (Objects.equals(mode, MYBATIS_MODE)) { +// +// } +// return null; +// } + + private boolean checkResourceListIsEquals(List resourceList, List oldResourceList) { + if (oldResourceList.size() != resourceList.size()) { + JSONObject errorObj = new JSONObject(); + errorObj.put("resourceList.size()", resourceList.size()); + errorObj.put("oldResourceList.size()", oldResourceList.size()); + logger.error("资产清单新旧SQL获取tbodyList结果不一致:{}", errorObj); + return false; + } + boolean flag = true; + resourceList.sort(Comparator.comparing(ResourceVo::getId)); + oldResourceList.sort(Comparator.comparing(ResourceVo::getId)); + for (int i = 0; i < resourceList.size(); i++) { + ResourceVo resourceVo = resourceList.get(i); + ResourceVo oldResourceVo = oldResourceList.get(i); + String resourceString = JSONObject.toJSONString(resourceVo); + String oldResourceString = JSONObject.toJSONString(oldResourceVo); + if (!Objects.equals(resourceString, oldResourceString)) { + JSONObject errorObj = new JSONObject(); + errorObj.put("index", i); + errorObj.put("resourceVo", resourceVo); + errorObj.put("oldResourceVo", oldResourceVo); + logger.error("资产清单新旧SQL获取tbodyList结果不一致:{}", errorObj); + flag = false; + } + } + return flag; + } + + private boolean noFilterCondition(ResourceSearchVo searchVo) { + if (StringUtils.isNotBlank(searchVo.getKeyword())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getBatchSearchList())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getStateIdList())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getVendorIdList())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getEnvIdList())) { + return false; + } + if (searchVo.getExistNoEnv()) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getAppSystemIdList())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getAppModuleIdList())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getDefaultValue())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getIdList())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getInspectStatusList())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getProtocolIdList())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getTagIdList())) { + return false; + } + if (CollectionUtils.isNotEmpty(searchVo.getInspectJobPhaseNodeStatusList())) { + return false; + } + return true; + } } -- Gitee