7 changed files with 3182 additions and 7 deletions
-
20src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java
-
49src/main/java/com/gcc/commissionerreview/controller/IeComplaintsApiController.java
-
6src/main/java/com/gcc/commissionerreview/controller/MainController.java
-
98src/main/java/com/gcc/commissionerreview/controller/TenementController.java
-
318src/main/java/com/gcc/commissionerreview/service/IeComplaintsService.java
-
489src/main/java/com/gcc/commissionerreview/service/TenementService.java
-
2209src/main/resources/templates/modules/vendorreport.html
@ -0,0 +1,98 @@ |
|||||
|
package com.gcc.commissionerreview.controller; |
||||
|
|
||||
|
import java.time.LocalDate; |
||||
|
import java.time.format.DateTimeFormatter; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.http.ResponseEntity; |
||||
|
import org.springframework.web.bind.annotation.GetMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestParam; |
||||
|
import org.springframework.web.bind.annotation.RestController; |
||||
|
|
||||
|
import com.gcc.commissionerreview.service.IeComplaintsService; |
||||
|
import com.gcc.commissionerreview.service.TenementService; |
||||
|
|
||||
|
@RestController |
||||
|
@RequestMapping("/commissionerreview/api/tenement") |
||||
|
|
||||
|
public class TenementController { |
||||
|
|
||||
|
@Autowired |
||||
|
private TenementService tenementService; |
||||
|
|
||||
|
@GetMapping("/tenementDashboard") |
||||
|
public ResponseEntity<Map<String, Object>> getTenementDashboard( |
||||
|
|
||||
|
@RequestParam String fromDate, |
||||
|
@RequestParam String toDate) { |
||||
|
|
||||
|
return ResponseEntity.ok( |
||||
|
tenementService.getTenementDashboard( |
||||
|
fromDate, |
||||
|
toDate)); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/zoneActivity") |
||||
|
public ResponseEntity<Map<String, Object>> zoneActivity( |
||||
|
|
||||
|
@RequestParam(required = false) String fromDate, |
||||
|
@RequestParam(required = false) String toDate) { |
||||
|
|
||||
|
return ResponseEntity.ok( |
||||
|
tenementService.getZoneActivity(fromDate, toDate)); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/wardActivity") |
||||
|
public ResponseEntity<Map<String, Object>> wardActivity( |
||||
|
|
||||
|
@RequestParam String zone, |
||||
|
@RequestParam(required = false) String fromDate, |
||||
|
@RequestParam(required = false) String toDate) { |
||||
|
|
||||
|
return ResponseEntity.ok( |
||||
|
tenementService.getWardActivity( |
||||
|
zone, |
||||
|
fromDate, |
||||
|
toDate)); |
||||
|
} |
||||
|
// ================= CONTROLLER ================= |
||||
|
|
||||
|
@GetMapping("/getSchemeWiseReport") |
||||
|
public ResponseEntity<Map<String, Object>> getSchemeWiseReport( |
||||
|
|
||||
|
@RequestParam String ward, |
||||
|
|
||||
|
@RequestParam(required = false) String fromDate, |
||||
|
|
||||
|
@RequestParam(required = false) String toDate) { |
||||
|
|
||||
|
return ResponseEntity.ok( |
||||
|
|
||||
|
tenementService.getSchemeWiseReport( |
||||
|
ward, |
||||
|
fromDate, |
||||
|
toDate)); |
||||
|
} |
||||
|
|
||||
|
@GetMapping("/getComplaintDetails") |
||||
|
public Map<String, Object> getComplaintDetails( |
||||
|
|
||||
|
@RequestParam String ward, |
||||
|
@RequestParam String schemeid, |
||||
|
|
||||
|
@RequestParam(required = false) String fromDate, |
||||
|
@RequestParam(required = false) String toDate) { |
||||
|
|
||||
|
return tenementService.getComplaintDetails( |
||||
|
ward, |
||||
|
schemeid, |
||||
|
|
||||
|
fromDate, |
||||
|
toDate); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,489 @@ |
|||||
|
package com.gcc.commissionerreview.service; |
||||
|
|
||||
|
import java.time.LocalDate; |
||||
|
import java.time.format.DateTimeFormatter; |
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Collections; |
||||
|
import java.util.HashMap; |
||||
|
import java.util.LinkedHashMap; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
|
||||
|
import javax.sql.DataSource; |
||||
|
|
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.beans.factory.annotation.Qualifier; |
||||
|
import org.springframework.beans.factory.annotation.Value; |
||||
|
import org.springframework.core.env.Environment; |
||||
|
import org.springframework.jdbc.core.JdbcTemplate; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
import org.springframework.transaction.annotation.Transactional; |
||||
|
|
||||
|
@Service |
||||
|
|
||||
|
public class TenementService { |
||||
|
|
||||
|
@Autowired |
||||
|
@Value("${fileBaseUrl}") |
||||
|
|
||||
|
private String fileBaseUrl; |
||||
|
@Autowired |
||||
|
private JdbcTemplate jdbcTemplate; |
||||
|
@Autowired |
||||
|
private Environment environment; |
||||
|
|
||||
|
@Autowired |
||||
|
public void setDataSource(@Qualifier("mysqlTenementDataSource") DataSource tenementDataSource) { |
||||
|
this.jdbcTemplate = new JdbcTemplate(tenementDataSource); |
||||
|
} |
||||
|
|
||||
|
public TenementService(Environment environment) { |
||||
|
|
||||
|
this.environment = environment; |
||||
|
|
||||
|
this.fileBaseUrl = environment.getProperty("fileBaseUrl"); |
||||
|
} |
||||
|
|
||||
|
public Map<String, Object> getTenementDashboard( |
||||
|
|
||||
|
String fromDate, |
||||
|
String toDate) { |
||||
|
|
||||
|
Map<String, Object> response = new HashMap<>(); |
||||
|
|
||||
|
try { |
||||
|
|
||||
|
String sql = ""; |
||||
|
List<Map<String, Object>> result; |
||||
|
|
||||
|
// ✅ if no date filter |
||||
|
if (fromDate == null || fromDate.isBlank() |
||||
|
|| toDate == null || toDate.isBlank()) { |
||||
|
|
||||
|
sql = "SELECT " + |
||||
|
|
||||
|
"'Tenement' AS complaint_name, " + |
||||
|
|
||||
|
"COUNT(*) AS total_count, " + |
||||
|
|
||||
|
"COUNT(CASE " + |
||||
|
"WHEN final_status IN ('completed','verified') " + |
||||
|
"THEN 1 END) AS completed_count, " + |
||||
|
|
||||
|
"COUNT(CASE " + |
||||
|
"WHEN final_status = 'created' " + |
||||
|
"THEN 1 END) AS pending_count " + |
||||
|
|
||||
|
"FROM issue_list1"; |
||||
|
|
||||
|
result = jdbcTemplate.queryForList(sql); |
||||
|
|
||||
|
} else { |
||||
|
|
||||
|
// ✅ with date filter |
||||
|
sql = "SELECT " + |
||||
|
|
||||
|
"'Tenement' AS complaint_name, " + |
||||
|
|
||||
|
"COUNT(*) AS total_count, " + |
||||
|
|
||||
|
"COUNT(CASE " + |
||||
|
"WHEN final_status IN ('completed','verified') " + |
||||
|
"THEN 1 END) AS completed_count, " + |
||||
|
|
||||
|
"COUNT(CASE " + |
||||
|
"WHEN final_status = 'created' " + |
||||
|
"THEN 1 END) AS pending_count " + |
||||
|
|
||||
|
"FROM issue_list1 " + |
||||
|
|
||||
|
"WHERE DATE(cdate) BETWEEN ? AND ?"; |
||||
|
|
||||
|
result = jdbcTemplate.queryForList( |
||||
|
sql, |
||||
|
fromDate, |
||||
|
toDate); |
||||
|
} |
||||
|
|
||||
|
response.put("status", "Success"); |
||||
|
response.put("data", result); |
||||
|
|
||||
|
} catch (Exception e) { |
||||
|
|
||||
|
e.printStackTrace(); |
||||
|
|
||||
|
response.put("status", "Error"); |
||||
|
response.put("message", e.getMessage()); |
||||
|
} |
||||
|
|
||||
|
return response; |
||||
|
} |
||||
|
|
||||
|
public Map<String, Object> getZoneActivity( |
||||
|
|
||||
|
String fromDate, |
||||
|
String toDate) { |
||||
|
|
||||
|
Map<String, Object> response = new HashMap<>(); |
||||
|
|
||||
|
try { |
||||
|
|
||||
|
String sql = ""; |
||||
|
|
||||
|
List<Map<String, Object>> result; |
||||
|
|
||||
|
// ✅ PAGE LOAD -> fetch all data without date filter |
||||
|
if (fromDate == null || fromDate.isBlank() |
||||
|
|| toDate == null || toDate.isBlank()) { |
||||
|
|
||||
|
sql = |
||||
|
|
||||
|
"SELECT " + |
||||
|
|
||||
|
"am.zone, " + |
||||
|
|
||||
|
// ✅ total complaints |
||||
|
"COUNT(DISTINCT il1.id) AS total_complaint_count, " + |
||||
|
|
||||
|
// ✅ completed |
||||
|
"COUNT(DISTINCT CASE " + |
||||
|
"WHEN il1.final_status IN ('completed','verified') " + |
||||
|
"THEN il1.id END) " + |
||||
|
"AS total_complaint_closed_count, " + |
||||
|
|
||||
|
// ✅ pending |
||||
|
"COUNT(DISTINCT CASE " + |
||||
|
"WHEN il1.final_status = 'created' " + |
||||
|
"THEN il1.id END) " + |
||||
|
"AS total_complaint_pending_count " + |
||||
|
|
||||
|
"FROM asset_master am " + |
||||
|
|
||||
|
"LEFT JOIN asset_list al " + |
||||
|
"ON al.am_id = am.id " + |
||||
|
|
||||
|
"LEFT JOIN issue_list1 il1 " + |
||||
|
"ON il1.assetlist_id = al.id " + |
||||
|
|
||||
|
"GROUP BY am.zone " + |
||||
|
|
||||
|
"ORDER BY am.zone"; |
||||
|
|
||||
|
result = jdbcTemplate.queryForList(sql); |
||||
|
|
||||
|
} else { |
||||
|
|
||||
|
// ✅ SEARCH BUTTON -> apply date filter |
||||
|
sql = |
||||
|
|
||||
|
"SELECT " + |
||||
|
|
||||
|
"am.zone, " + |
||||
|
|
||||
|
// ✅ total complaints |
||||
|
"COUNT(DISTINCT il1.id) AS total_complaint_count, " + |
||||
|
|
||||
|
// ✅ completed |
||||
|
"COUNT(DISTINCT CASE " + |
||||
|
"WHEN il1.final_status IN ('completed','verified') " + |
||||
|
"THEN il1.id END) " + |
||||
|
"AS total_complaint_closed_count, " + |
||||
|
|
||||
|
// ✅ pending |
||||
|
"COUNT(DISTINCT CASE " + |
||||
|
"WHEN il1.final_status = 'created' " + |
||||
|
"THEN il1.id END) " + |
||||
|
"AS total_complaint_pending_count " + |
||||
|
|
||||
|
"FROM asset_master am " + |
||||
|
|
||||
|
"LEFT JOIN asset_list al " + |
||||
|
"ON al.am_id = am.id " + |
||||
|
|
||||
|
"LEFT JOIN issue_list1 il1 " + |
||||
|
"ON il1.assetlist_id = al.id " + |
||||
|
"AND DATE(il1.cdate) BETWEEN ? AND ? " + |
||||
|
|
||||
|
"GROUP BY am.zone " + |
||||
|
|
||||
|
"ORDER BY am.zone"; |
||||
|
|
||||
|
result = jdbcTemplate.queryForList( |
||||
|
sql, |
||||
|
fromDate, |
||||
|
toDate); |
||||
|
} |
||||
|
|
||||
|
response.put("status", "success"); |
||||
|
response.put("data", result); |
||||
|
|
||||
|
} catch (Exception e) { |
||||
|
|
||||
|
e.printStackTrace(); |
||||
|
|
||||
|
response.put("status", "error"); |
||||
|
response.put("message", e.getMessage()); |
||||
|
} |
||||
|
|
||||
|
return response; |
||||
|
} |
||||
|
|
||||
|
public Map<String, Object> getWardActivity( |
||||
|
|
||||
|
String zone, |
||||
|
String fromDate, |
||||
|
String toDate) { |
||||
|
|
||||
|
Map<String, Object> response = new HashMap<>(); |
||||
|
|
||||
|
try { |
||||
|
|
||||
|
StringBuilder sql = new StringBuilder(); |
||||
|
List<Object> params = new ArrayList<>(); |
||||
|
|
||||
|
sql.append("SELECT "); |
||||
|
sql.append("am.ward, "); |
||||
|
|
||||
|
// total |
||||
|
sql.append("COUNT(DISTINCT il1.id) "); |
||||
|
sql.append("AS total_complaint_count, "); |
||||
|
|
||||
|
// completed |
||||
|
sql.append("COUNT(DISTINCT CASE "); |
||||
|
sql.append("WHEN il1.final_status IN ('completed','verified') "); |
||||
|
sql.append("THEN il1.id END) "); |
||||
|
sql.append("AS total_complaint_closed_count, "); |
||||
|
|
||||
|
// pending |
||||
|
sql.append("COUNT(DISTINCT CASE "); |
||||
|
sql.append("WHEN il1.final_status = 'created' "); |
||||
|
sql.append("THEN il1.id END) "); |
||||
|
sql.append("AS total_complaint_pending_count "); |
||||
|
|
||||
|
sql.append("FROM asset_master am "); |
||||
|
|
||||
|
sql.append("LEFT JOIN asset_list al "); |
||||
|
sql.append("ON al.am_id = am.id "); |
||||
|
|
||||
|
sql.append("LEFT JOIN issue_list1 il1 "); |
||||
|
sql.append("ON il1.assetlist_id = al.id "); |
||||
|
|
||||
|
sql.append("WHERE am.zone = ? "); |
||||
|
params.add(zone); |
||||
|
|
||||
|
// date filter |
||||
|
if (fromDate != null && !fromDate.isBlank() |
||||
|
&& toDate != null && !toDate.isBlank()) { |
||||
|
|
||||
|
sql.append("AND DATE(il1.cdate) BETWEEN ? AND ? "); |
||||
|
params.add(fromDate); |
||||
|
params.add(toDate); |
||||
|
} |
||||
|
|
||||
|
sql.append("GROUP BY am.ward "); |
||||
|
sql.append("ORDER BY am.ward "); |
||||
|
|
||||
|
List<Map<String, Object>> result = jdbcTemplate.queryForList( |
||||
|
sql.toString(), |
||||
|
params.toArray()); |
||||
|
|
||||
|
response.put("status", "success"); |
||||
|
response.put("data", result); |
||||
|
|
||||
|
} catch (Exception e) { |
||||
|
|
||||
|
e.printStackTrace(); |
||||
|
|
||||
|
response.put("status", "error"); |
||||
|
response.put("message", e.getMessage()); |
||||
|
} |
||||
|
|
||||
|
return response; |
||||
|
} |
||||
|
// ================= SERVICE ================= |
||||
|
|
||||
|
public Map<String, Object> getSchemeWiseReport( |
||||
|
|
||||
|
String ward, |
||||
|
String fromDate, |
||||
|
String toDate) { |
||||
|
|
||||
|
Map<String, Object> response = new HashMap<>(); |
||||
|
|
||||
|
try { |
||||
|
|
||||
|
StringBuilder sql = new StringBuilder(); |
||||
|
|
||||
|
List<Object> params = new ArrayList<>(); |
||||
|
|
||||
|
sql.append("SELECT "); |
||||
|
|
||||
|
sql.append("am.scheme_name, "); |
||||
|
sql.append("am.id as schemeid, "); |
||||
|
|
||||
|
// TOTAL |
||||
|
sql.append("COUNT(DISTINCT il1.id) "); |
||||
|
sql.append("AS total_complaint_count, "); |
||||
|
|
||||
|
// COMPLETED |
||||
|
sql.append("COUNT(DISTINCT CASE "); |
||||
|
sql.append("WHEN il1.final_status IN ('completed','verified') "); |
||||
|
sql.append("THEN il1.id END) "); |
||||
|
sql.append("AS total_complaint_closed_count, "); |
||||
|
|
||||
|
// PENDING |
||||
|
sql.append("COUNT(DISTINCT CASE "); |
||||
|
sql.append("WHEN il1.final_status = 'created' "); |
||||
|
sql.append("THEN il1.id END) "); |
||||
|
sql.append("AS total_complaint_pending_count "); |
||||
|
|
||||
|
sql.append("FROM asset_master am "); |
||||
|
|
||||
|
sql.append("LEFT JOIN asset_list al "); |
||||
|
sql.append("ON al.am_id = am.id "); |
||||
|
|
||||
|
sql.append("LEFT JOIN issue_list1 il1 "); |
||||
|
sql.append("ON il1.assetlist_id = al.id "); |
||||
|
|
||||
|
sql.append("WHERE am.ward = ? "); |
||||
|
params.add(ward); |
||||
|
|
||||
|
// DATE FILTER |
||||
|
if (fromDate != null && !fromDate.isBlank() |
||||
|
&& toDate != null && !toDate.isBlank()) { |
||||
|
|
||||
|
sql.append("AND DATE(il1.cdate) BETWEEN ? AND ? "); |
||||
|
|
||||
|
params.add(fromDate); |
||||
|
params.add(toDate); |
||||
|
} |
||||
|
|
||||
|
sql.append("GROUP BY am.scheme_name, am.id "); |
||||
|
|
||||
|
sql.append("ORDER BY am.scheme_name "); |
||||
|
|
||||
|
List<Map<String, Object>> result = jdbcTemplate.queryForList( |
||||
|
sql.toString(), |
||||
|
params.toArray()); |
||||
|
|
||||
|
response.put("status", "success"); |
||||
|
response.put("data", result); |
||||
|
|
||||
|
} catch (Exception e) { |
||||
|
|
||||
|
e.printStackTrace(); |
||||
|
|
||||
|
response.put("status", "error"); |
||||
|
response.put("message", e.getMessage()); |
||||
|
} |
||||
|
|
||||
|
return response; |
||||
|
} |
||||
|
|
||||
|
public Map<String, Object> getComplaintDetails( |
||||
|
|
||||
|
String ward, |
||||
|
String schemeid, |
||||
|
String fromDate, |
||||
|
String toDate) { |
||||
|
|
||||
|
Map<String, Object> response = new HashMap<>(); |
||||
|
|
||||
|
try { |
||||
|
|
||||
|
StringBuilder sql = new StringBuilder(); |
||||
|
|
||||
|
List<Object> params = new ArrayList<>(); |
||||
|
|
||||
|
sql.append("SELECT "); |
||||
|
|
||||
|
sql.append("il1.id AS issuelist1_id, "); |
||||
|
sql.append("il1.final_status, "); |
||||
|
sql.append("DATE_FORMAT(il1.cdate,'%d-%m-%Y') AS created_date,"); |
||||
|
|
||||
|
// sql.append( |
||||
|
// "IFNULL(DATE_FORMAT(il1.cdate,'%d-%m-%Y %h:%i %p'),'') AS created_date, "); |
||||
|
|
||||
|
sql.append("IFNULL(il1.remarks,'') AS created_remarks, "); |
||||
|
|
||||
|
sql.append( |
||||
|
"CASE " + |
||||
|
"WHEN il1.before_image IS NOT NULL " + |
||||
|
"THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', il1.before_image) " + |
||||
|
"ELSE '' END AS before_image, "); |
||||
|
|
||||
|
/* |
||||
|
* sql.append( |
||||
|
* "IFNULL(DATE_FORMAT(il2.cdate,'%d-%m-%Y %h:%i %p'),'') AS completed_date, "); |
||||
|
*/ |
||||
|
sql.append("DATE_FORMAT(il2.cdate,'%d-%m-%Y') AS completed_date,"); |
||||
|
|
||||
|
sql.append( |
||||
|
"IFNULL(il2.remarks,'') AS completed_remarks, "); |
||||
|
|
||||
|
sql.append( |
||||
|
"CASE " + |
||||
|
"WHEN il2.after_image IS NOT NULL " + |
||||
|
"THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', il2.after_image) " + |
||||
|
"ELSE '' END AS after_image, "); |
||||
|
|
||||
|
sql.append( |
||||
|
"IFNULL(DATE_FORMAT(il3.cdate,'%d-%m-%Y %h:%i %p'),'') AS verified_date, "); |
||||
|
|
||||
|
sql.append( |
||||
|
"IFNULL(il3.remarks,'') AS verified_remarks, "); |
||||
|
|
||||
|
sql.append( |
||||
|
"CASE " + |
||||
|
"WHEN il3.Verify_image IS NOT NULL " + |
||||
|
"THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', il3.Verify_image) " + |
||||
|
"ELSE '' END AS verify_image "); |
||||
|
|
||||
|
sql.append("FROM issue_list1 il1 "); |
||||
|
|
||||
|
sql.append("LEFT JOIN asset_list al "); |
||||
|
sql.append("ON al.id = il1.assetlist_id "); |
||||
|
|
||||
|
sql.append("LEFT JOIN issue_list2 il2 "); |
||||
|
sql.append("ON il2.issuelist1_id = il1.id "); |
||||
|
|
||||
|
sql.append("LEFT JOIN issue_list3 il3 "); |
||||
|
sql.append("ON il3.issuelist1_id = il1.id "); |
||||
|
|
||||
|
sql.append("WHERE il1.ward = ? "); |
||||
|
params.add(ward); |
||||
|
|
||||
|
sql.append("AND al.am_id = ? "); |
||||
|
params.add(schemeid); |
||||
|
|
||||
|
// ✅ only if dates available |
||||
|
if (fromDate != null && !fromDate.isBlank() |
||||
|
&& toDate != null && !toDate.isBlank()) { |
||||
|
|
||||
|
sql.append("AND DATE(il1.cdate) BETWEEN ? AND ? "); |
||||
|
|
||||
|
params.add(fromDate); |
||||
|
params.add(toDate); |
||||
|
} |
||||
|
|
||||
|
sql.append("ORDER BY il1.id DESC "); |
||||
|
|
||||
|
List<Map<String, Object>> result = jdbcTemplate.queryForList( |
||||
|
sql.toString(), |
||||
|
params.toArray()); |
||||
|
|
||||
|
response.put("status", "success"); |
||||
|
response.put("data", result); |
||||
|
|
||||
|
} catch (Exception e) { |
||||
|
|
||||
|
e.printStackTrace(); |
||||
|
|
||||
|
response.put("status", "error"); |
||||
|
response.put("message", e.getMessage()); |
||||
|
} |
||||
|
|
||||
|
return response; |
||||
|
} |
||||
|
|
||||
|
} |
||||
2209
src/main/resources/templates/modules/vendorreport.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue