11package com .park .utmstack .service .compliance .config ;
22
3+ import com .fasterxml .jackson .databind .node .ObjectNode ;
4+ import com .park .utmstack .domain .chart_builder .UtmDashboard ;
5+ import com .park .utmstack .domain .chart_builder .UtmDashboardVisualization ;
6+ import com .park .utmstack .domain .chart_builder .UtmVisualization ;
7+ import com .park .utmstack .domain .chart_builder .types .ChartType ;
38import com .park .utmstack .domain .compliance .UtmComplianceReportConfig ;
49import com .park .utmstack .domain .compliance .UtmComplianceStandard ;
510import com .park .utmstack .domain .compliance .UtmComplianceStandardSection ;
11+ import com .park .utmstack .domain .compliance .enums .ComplianceStatus ;
612import com .park .utmstack .repository .compliance .UtmComplianceReportConfigRepository ;
713import com .park .utmstack .service .chart_builder .UtmDashboardService ;
14+ import com .park .utmstack .service .chart_builder .UtmDashboardVisualizationService ;
15+ import com .park .utmstack .service .elasticsearch .ElasticsearchService ;
816import com .park .utmstack .util .UtilPagination ;
9- import com .park .utmstack .util .exceptions .UtmPageNumberNotSupported ;
17+ import com .park .utmstack .util .chart_builder .elasticsearch_dsl .requests .RequestDsl ;
18+ import com .park .utmstack .util .exceptions .UtmElasticsearchException ;
19+ import org .opensearch .client .opensearch .core .SearchResponse ;
1020import org .springframework .dao .DataIntegrityViolationException ;
1121import org .springframework .data .domain .Page ;
1222import org .springframework .data .domain .PageImpl ;
1727import org .springframework .util .StringUtils ;
1828
1929import javax .persistence .EntityManager ;
30+ import java .util .Collections ;
2031import java .util .List ;
2132import java .util .Objects ;
2233import java .util .Optional ;
@@ -29,17 +40,24 @@ public class UtmComplianceReportConfigService {
2940 private final UtmDashboardService dashboardService ;
3041 private final UtmComplianceStandardService standardService ;
3142 private final UtmComplianceStandardSectionService standardSectionService ;
43+
44+ private final UtmDashboardVisualizationService dashboardVisualizationService ;
45+
46+ private final ElasticsearchService elasticsearchService ;
3247 private final EntityManager em ;
3348
3449 public UtmComplianceReportConfigService (UtmComplianceReportConfigRepository complianceReportConfigRepository ,
3550 UtmDashboardService dashboardService ,
3651 UtmComplianceStandardService standardService ,
3752 UtmComplianceStandardSectionService standardSectionService ,
53+ UtmDashboardVisualizationService dashboardVisualizationService , ElasticsearchService elasticsearchService ,
3854 EntityManager em ) {
3955 this .complianceReportConfigRepository = complianceReportConfigRepository ;
4056 this .dashboardService = dashboardService ;
4157 this .standardService = standardService ;
4258 this .standardSectionService = standardSectionService ;
59+ this .dashboardVisualizationService = dashboardVisualizationService ;
60+ this .elasticsearchService = elasticsearchService ;
4361 this .em = em ;
4462 }
4563
@@ -81,72 +99,31 @@ public void deleteReportsByStandardIdAndIdNotIn(Long standardId, List<Long> repo
8199 }
82100
83101 public Page <UtmComplianceReportConfig > getReportsByFilters (Long standardId , String solution , Long sectionId ,
84- String search , Pageable pageable ) {
85- StringBuilder script = new StringBuilder (
86- "SELECT cfg.* FROM utm_compliance_report_config cfg " +
87- "INNER JOIN utm_compliance_standard_section sec ON cfg.standard_section_id = sec.id " +
88- "INNER JOIN utm_compliance_standard st ON sec.standard_id = st.id " +
89- "LEFT JOIN utm_dashboard d ON cfg.dashboard_id = d.id" );
90-
91- StringBuilder countScript = new StringBuilder (
92- "SELECT COUNT(cfg.id) FROM utm_compliance_report_config cfg " +
93- "INNER JOIN utm_compliance_standard_section sec ON cfg.standard_section_id = sec.id " +
94- "INNER JOIN utm_compliance_standard st ON sec.standard_id = st.id " +
95- "LEFT JOIN utm_dashboard d ON cfg.dashboard_id = d.id" );
96-
97- boolean hasWhere = false ;
98-
99- if (standardId != null ) {
100- hasWhere = true ;
101- script .append (" WHERE st.id = " ).append (standardId );
102- countScript .append (" WHERE st.id = " ).append (standardId );
103- }
102+ String search , Boolean expandDashboard , Boolean setStatus , Pageable pageable ) throws UtmElasticsearchException {
104103
105- if (StringUtils .hasText (solution )) {
106- String condition = "cfg.config_solution ILIKE '%" + solution + "%'" ;
107- script .append (hasWhere ? " AND " : " WHERE " ).append (condition );
108- countScript .append (hasWhere ? " AND " : " WHERE " ).append (condition );
109- hasWhere = true ;
110- }
104+ Page <UtmComplianceReportConfig > page = complianceReportConfigRepository .getReportsByFilters (standardId , solution , sectionId , search , pageable );
111105
112- if (sectionId != null ) {
113- String condition = "sec.id = " + sectionId ;
114- script .append (hasWhere ? " AND " : " WHERE " ).append (condition );
115- countScript .append (hasWhere ? " AND " : " WHERE " ).append (condition );
116- }
117-
118- if (StringUtils .hasText (search )) {
119- String condition = "(cfg.config_report_name ILIKE '%" + search + "%' OR d.name ILIKE '%" + search + "%')" ;
120- script .append (hasWhere ? " AND " : " WHERE " ).append (condition );
121- countScript .append (hasWhere ? " AND " : " WHERE " ).append (condition );
106+ if (expandDashboard != null && expandDashboard ) {
107+ for (UtmComplianceReportConfig report : page ) {
108+ dashboardVisualizationService .findAllByIdDashboard (report .getDashboardId ()).ifPresent (report ::setDashboard );
109+ }
122110 }
123111
124- if (StringUtils .hasText (solution )) {
125- pageable .getSort ();
126- String sortField = pageable .getSort ().iterator ().next ().getProperty ();
127- String sortDirection = pageable .getSort ().iterator ().next ().getDirection ().name ();
128- script .append (" ORDER BY " ).append (sortField ).append (" " ).append (sortDirection );
112+ if (setStatus ) {
113+ for (UtmComplianceReportConfig report : page ) {
114+ report .setConfigReportStatus (this .getStatus (report .getAssociatedDashboard ()));
115+ }
129116 }
130117
131- List <UtmComplianceReportConfig > results = em .createNativeQuery (script .toString (), UtmComplianceReportConfig .class )
132- .setFirstResult (UtilPagination .getFirstForNativeSql (pageable .getPageSize (), pageable .getPageNumber ()))
133- .setMaxResults (pageable .getPageSize ())
134- .getResultList ();
135-
136- long total = ((Number ) em .createNativeQuery (countScript .toString ()).getSingleResult ()).longValue ();
118+ return page ;
137119
138- return new PageImpl <>(results , pageable , total );
139120 }
140121
141122
142123 public void deleteAllByConfigSolutionAndSectionIdAndDashboardId (String configSolution , Long sectionId , Long dashboardId ) {
143124 complianceReportConfigRepository .deleteAllByConfigSolutionAndStandardSectionIdAndDashboardId (configSolution , sectionId , dashboardId );
144125 }
145126
146- /**
147- * @param reports
148- * @param override
149- */
150127 public void importReports (List <UtmComplianceReportConfig > reports , boolean override ) throws Exception {
151128 final String ctx = CLASSNAME + ".importReports" ;
152129 try {
@@ -200,4 +177,23 @@ public void importReports(List<UtmComplianceReportConfig> reports, boolean overr
200177 throw new Exception (msg );
201178 }
202179 }
180+
181+ private ComplianceStatus getStatus (UtmDashboard dashboard ) throws UtmElasticsearchException {
182+ List <UtmDashboardVisualization > dashboardVisualizations = dashboardVisualizationService .findAllByIdDashboard (dashboard .getId ())
183+ .orElse (Collections .emptyList ());
184+
185+ UtmVisualization visualization = dashboardVisualizations .stream ().filter (d -> d .getVisualization ().getChartType ().equals (ChartType .LIST_CHART )
186+ || d .getVisualization ().getChartType ().equals (ChartType .TABLE_CHART ))
187+ .map (UtmDashboardVisualization ::getVisualization )
188+ .findFirst ()
189+ .orElse (null );
190+
191+ if (Objects .nonNull (visualization )){
192+ RequestDsl requestQuery = new RequestDsl (visualization );
193+ SearchResponse <ObjectNode > result = elasticsearchService .search (requestQuery .getSearchSourceBuilderForCount ().build (), ObjectNode .class );
194+ return result .hits ().total ().value () > 0 ? ComplianceStatus .COMPLAINT : ComplianceStatus .NON_COMPLAINT ;
195+ } else {
196+ return ComplianceStatus .NON_COMPLAINT ;
197+ }
198+ }
203199}
0 commit comments