Browse Source

Added DBFOT dashboards

master
Hariprasath S 11 hours ago
parent
commit
1357c87f28
  1. 19
      src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java
  2. 160
      src/main/java/com/gcc/commissionerreview/controller/DbfotApiController.java
  3. 10
      src/main/java/com/gcc/commissionerreview/controller/MainController.java
  4. 17
      src/main/java/com/gcc/commissionerreview/controller/RoadWarApiController.java
  5. 832
      src/main/java/com/gcc/commissionerreview/service/DbfotService.java
  6. 42
      src/main/java/com/gcc/commissionerreview/service/RoadWarService.java
  7. 150
      src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java
  8. 4
      src/main/resources/application.properties
  9. 1311
      src/main/resources/templates/modules/dbfot/CompDetails.html
  10. 2023
      src/main/resources/templates/modules/dbfot/locDetails.html
  11. 68
      src/main/resources/templates/modules/roadwarweb/roadwarregisterdashboard.html
  12. 40
      src/main/resources/templates/modules/streetvendor/overalldetails.html

19
src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java

@ -17,11 +17,11 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement @EnableTransactionManagement
public class DataSourceConfig { public class DataSourceConfig {
// private static String host = "localhost:3306";
// private static String dbpassword = "root";
private static String host = "localhost:3306";
private static String dbpassword = "root";
private static String host = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306";
private static String dbpassword = "gcc-facial-password";
// private static String host = "gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306";
// private static String dbpassword = "gcc-facial-password";
public static class MyDataSourceConfig { public static class MyDataSourceConfig {
@Primary @Primary
@ -346,4 +346,15 @@ public class DataSourceConfig {
return dataSource; return dataSource;
} }
////////// DBFOT TOILETS //////////////////////
@Bean(name = "mysqlDBFOT_TOILETSDataSource")
public DataSource mysqlDBFOT_TOILETSDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://" + host + "/dbfot_toilets");
dataSource.setUsername("root");
dataSource.setPassword(dbpassword);
return dataSource;
}
} }

160
src/main/java/com/gcc/commissionerreview/controller/DbfotApiController.java

@ -0,0 +1,160 @@
package com.gcc.commissionerreview.controller;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
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.DbfotService;
@RestController
@RequestMapping("/commissionerreview/api/dbfot")
public class DbfotApiController {
@Autowired
private DbfotService dbfotService;
@GetMapping("/getzones")
public Map<String, Object> ViewZoneDropdown() {
Map<String, Object> response = new HashMap<>();
List<Map<String, Object>> zones = dbfotService.ViewZoneDropdown();
if (!zones.isEmpty()) {
response.put("status", true);
response.put("message", "Zone list fetched successfully");
response.put("data", zones);
} else {
response.put("status", false);
response.put("message", "No zones found");
response.put("data", Collections.emptyList());
}
return response;
}
@GetMapping("/getwardbyzone")
public Map<String, Object> ViewWardDropdown(@RequestParam String zone) {
Map<String, Object> response = new HashMap<>();
List<Map<String, Object>> wards = dbfotService.ViewWardDropdown(zone);
if (!wards.isEmpty()) {
response.put("status", true);
response.put("message", "Ward list fetched successfully");
response.put("data", wards);
} else {
response.put("status", false);
response.put("message", "No wards found");
response.put("data", Collections.emptyList());
}
return response;
}
@GetMapping("/getpctstatus")
public Map<String, Object> ViewPctStatusDropdown() {
Map<String, Object> response = new HashMap<>();
List<Map<String, Object>> status = dbfotService.ViewPctStatusDropdown();
if (!status.isEmpty()) {
response.put("status", true);
response.put("message", "Pct Status fetched successfully");
response.put("data", status);
} else {
response.put("status", false);
response.put("message", "No Pct Status found");
response.put("data", Collections.emptyList());
}
return response;
}
// location overview
@GetMapping("/getdashboardsummary")
public Map<String, Object> getDashboardSummary(@RequestParam(required = false) String date,
@RequestParam(required = false) String zone, @RequestParam(required = false) String ward,
@RequestParam(required = false) String status, @RequestParam(required = false) String searchAddress) {
return dbfotService.getDashboardSummary(date, zone, ward, status, searchAddress);
}
@GetMapping("/getpctcomplaints")
public Map<String, Object> getPctComplaints(@RequestParam String pct, @RequestParam(required = false) String date,
@RequestParam(required = false) String zone, @RequestParam(required = false) String ward,
@RequestParam(required = false) String status, @RequestParam(required = false) String searchAddress,
@RequestParam(required = false, defaultValue = "ALL") String complaintStatus) {
return dbfotService.getPctComplaints(pct, date, zone, ward, status, searchAddress, complaintStatus);
}
@GetMapping("/getcomplainttimeline")
public Map<String, Object> getComplaintTimeline(
@RequestParam("complaint_id") String complaintId) {
return dbfotService.getComplaintTimeline(complaintId);
}
@GetMapping("/getmanpowerdetails")
public Map<String, Object> getManpowerDetails(@RequestParam("pct") String pct,
@RequestParam(required = false) String date, @RequestParam(required = false) String zone,
@RequestParam(required = false) String ward, @RequestParam(required = false) String status,
@RequestParam(required = false) String searchAddress) {
return dbfotService.getManpowerDetails(pct, date, zone, ward, status, searchAddress);
}
// complaints overview
@GetMapping("/getlocationsbyward")
public Map<String, Object> ViewLocationDropdown(@RequestParam String ward) {
Map<String, Object> response = new HashMap<>();
List<Map<String, Object>> wards = dbfotService.ViewLocationDropdown(ward);
if (!wards.isEmpty()) {
response.put("status", true);
response.put("message", "Location list fetched successfully");
response.put("data", wards);
} else {
response.put("status", false);
response.put("message", "No Location found");
response.put("data", Collections.emptyList());
}
return response;
}
@GetMapping("/getcomplaintsoverview")
public Map<String, Object> getComplaintsOverview(@RequestParam String date,
@RequestParam(required = false) String zone, @RequestParam(required = false) String ward,
@RequestParam(required = false) String location, @RequestParam(required = false) String status,
@RequestParam(required = false) String source, @RequestParam(required = false) String searchAddress) {
if (date == null || date.trim().isEmpty()) {
Map<String, Object> response = new HashMap<>();
response.put("status", "Failed");
response.put("message", "Date is mandatory");
return response;
}
return dbfotService.getComplaintsOverview(date, zone, ward, location, status, source, searchAddress);
}
}

10
src/main/java/com/gcc/commissionerreview/controller/MainController.java

@ -446,5 +446,15 @@ public class MainController {
return "modules/roadwarweb/roadwarregisterdashboard"; return "modules/roadwarweb/roadwarregisterdashboard";
} }
@GetMapping("/dbfot/locDetails")
public String locDetails(){
return "modules/dbfot/locDetails";
}
@GetMapping("/dbfot/CompDetails")
public String CompDetails(){
return "modules/dbfot/CompDetails";
}
} }

17
src/main/java/com/gcc/commissionerreview/controller/RoadWarApiController.java

@ -158,6 +158,23 @@ public class RoadWarApiController {
//for road war register dashboard //for road war register dashboard
@GetMapping("/getTotalRoadByGIS")
public Map<String, Object> getTotalRoadByGIS(){
Map<String, Object> response = new HashMap<>();
List<Map<String, Object>> roads = roadWarService.getTotalRoadByGIS();
if (!roads.isEmpty()) {
response.put("status", true);
response.put("message", "Total Road counts By GIS fetched successfully");
response.put("data", roads);
} else {
response.put("status", false);
response.put("message", "No roads counts found");
response.put("data", Collections.emptyList());
}
return response;
}
@GetMapping("/getdashboardsummary") @GetMapping("/getdashboardsummary")
public Map<String, Object> getDashboardSummary(@RequestParam(required = false) String zone, public Map<String, Object> getDashboardSummary(@RequestParam(required = false) String zone,
@RequestParam(required = false) String ward, @RequestParam(required = false) Integer roadType, @RequestParam(required = false) String ward, @RequestParam(required = false) Integer roadType,

832
src/main/java/com/gcc/commissionerreview/service/DbfotService.java

@ -0,0 +1,832 @@
package com.gcc.commissionerreview.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
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.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class DbfotService {
@Autowired
@Value("${fileBaseUrl}")
private String fileBaseUrl;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private Environment environment;
@Autowired
public void setDataSource(@Qualifier("mysqlDBFOT_TOILETSDataSource") DataSource DataSource) {
this.jdbcTemplate = new JdbcTemplate(DataSource);
}
public DbfotService(Environment environment) {
this.environment = environment;
this.fileBaseUrl = environment.getProperty("fileBaseUrl");
}
public List<Map<String, Object>> ViewZoneDropdown() {
String sql = "SELECT DISTINCT(zone) "
+ "FROM pct_master "
+ "WHERE isactive=1 AND isdelete=0 ORDER BY zone";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Collections.emptyList();
}
}
public List<Map<String, Object>> ViewWardDropdown(String zone) {
String sql = "SELECT DISTINCT(ward) "
+ "FROM pct_master "
+ "WHERE isactive=1 AND isdelete=0 AND zone=? ORDER BY ward";
try {
return jdbcTemplate.queryForList(sql,zone);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Collections.emptyList();
}
}
public List<Map<String, Object>> ViewPctStatusDropdown() {
String sql = "SELECT DISTINCT(status) "
+ "FROM pct_master "
+ "WHERE isactive=1 AND isdelete=0 ORDER BY status";
try {
return jdbcTemplate.queryForList(sql);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Collections.emptyList();
}
}
public Map<String, Object> getDashboardSummary(String date, String zone, String ward, String status,
String searchAddress) {
Map<String, Object> response = new HashMap<>();
try {
// Default date to today
String selectedDate = (date == null || date.trim().isEmpty()) ? java.time.LocalDate.now().toString()
: date.trim();
// ==========================================
// 1. OVERALL COUNTS - NO FILTERS
// ==========================================
String totalLocationsSql = "SELECT COUNT(*) FROM pct_master " + "WHERE isactive = 1 AND isdelete = 0";
Integer totalLocations = jdbcTemplate.queryForObject(totalLocationsSql, Integer.class);
String activeLocationsSql = "SELECT COUNT(*) FROM pct_master " + "WHERE UPPER(TRIM(status)) = 'ACTIVE' "
+ "AND isactive = 1 AND isdelete = 0";
Integer totalActiveLocations = jdbcTemplate.queryForObject(activeLocationsSql, Integer.class);
String totalComplaintsSql = "SELECT COUNT(*) FROM complaints_details "
+ "WHERE isactive = 1 AND isdelete = 0";
Integer totalComplaints = jdbcTemplate.queryForObject(totalComplaintsSql, Integer.class);
// ==========================================
// 2. BUILD FILTERS AND PARAMETERS
// ==========================================
StringBuilder filters = new StringBuilder();
List<Object> filterParams = new ArrayList<>();
if (zone != null && !zone.trim().isEmpty() && !"ALL".equalsIgnoreCase(zone.trim())) {
filters.append(" AND pm.zone = ? ");
filterParams.add(zone.trim());
}
if (ward != null && !ward.trim().isEmpty() && !"ALL".equalsIgnoreCase(ward.trim())) {
filters.append(" AND pm.ward = ? ");
filterParams.add(ward.trim());
}
if (status != null && !status.trim().isEmpty() && !"ALL".equalsIgnoreCase(status.trim())) {
filters.append(" AND UPPER(TRIM(pm.status)) = ? ");
filterParams.add(status.trim().toUpperCase());
}
if (searchAddress != null && !searchAddress.trim().isEmpty()) {
filters.append(" AND pm.address LIKE ? ");
filterParams.add("%" + searchAddress.trim() + "%");
}
// ==========================================
// 3. LOCATION TABLE
// ==========================================
String locationsSql = "SELECT " + " pm.id, " + " pm.pct, " + " pm.zone, " + " pm.ward, " + " pm.address, "
+ " pm.status, " + " COALESCE(mp.manpower_count, 0) AS manpower, "
+ " COALESCE(cc.total_complaints, 0) AS total_complaints, " + " COALESCE(cc.opened, 0) AS opened, "
+ " COALESCE(cc.under_review, 0) AS under_review, "
+ " COALESCE(cc.pending_closure, 0) AS pending_closure, " + " COALESCE(cc.closed, 0) AS closed " +
"FROM pct_master pm " +
// Manpower present per PCT on selected date
"LEFT JOIN ( " + " SELECT me.pct, COUNT(*) AS manpower_count " + " FROM man_power_employees me "
+ " WHERE me.att_date >= ? " + " AND me.att_date < DATE_ADD(?, INTERVAL 1 DAY) "
+ " AND me.isactive = 1 AND me.isdelete = 0 " + " AND EXISTS ( "
+ " SELECT 1 FROM man_power_details md " + " WHERE md.pct = me.pct "
+ " AND md.isactive = 1 AND md.isdelete = 0 " + " ) " + " GROUP BY me.pct "
+ ") mp ON mp.pct = pm.pct " +
// Complaint counts per PCT
"LEFT JOIN ( " + " SELECT " + " cd.pct, " + " COUNT(*) AS total_complaints, " +
" SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'OPEN' "
+ " THEN 1 ELSE 0 END) AS opened, " +
" SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'UNDER REVIEW' "
+ " THEN 1 ELSE 0 END) AS under_review, " +
" SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'PENDING CLOSURE' "
+ " THEN 1 ELSE 0 END) AS pending_closure, " +
" SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'CLOSED' "
+ " THEN 1 ELSE 0 END) AS closed " +
" FROM complaints_details cd " + " WHERE cd.isactive = 1 AND cd.isdelete = 0 "
+" AND cd.complaint_raised_on >= ? " +
" AND cd.complaint_raised_on < DATE_ADD(?, INTERVAL 1 DAY) "
+ " GROUP BY cd.pct " + ") cc ON cc.pct = pm.pct " +
"WHERE pm.isactive = 1 AND pm.isdelete = 0 " + filters + " ORDER BY pm.zone, pm.ward, pm.address";
// The first two parameters belong to the manpower subquery.
List<Object> locationParams = new ArrayList<>();
locationParams.add(java.sql.Date.valueOf(selectedDate));
locationParams.add(java.sql.Date.valueOf(selectedDate));
locationParams.add(java.sql.Date.valueOf(selectedDate));
locationParams.add(java.sql.Date.valueOf(selectedDate));
// Append filter parameters in SQL order.
locationParams.addAll(filterParams);
List<Map<String, Object>> locations = jdbcTemplate.queryForList(locationsSql, locationParams.toArray());
// ==========================================
// 4. TODAY'S COMPLAINTS - FILTERED
// ==========================================
String todayComplaintsSql = "SELECT COUNT(*) " + "FROM complaints_details cd "
+ "INNER JOIN pct_master pm ON pm.pct = cd.pct " + "WHERE cd.complaint_raised_on >= ? "
+ "AND cd.complaint_raised_on < DATE_ADD(?, INTERVAL 1 DAY) "
+ "AND cd.isactive = 1 AND cd.isdelete = 0 " + "AND pm.isactive = 1 AND pm.isdelete = 0 " + filters;
List<Object> todayParams = new ArrayList<>();
todayParams.add(java.sql.Date.valueOf(selectedDate));
todayParams.add(java.sql.Date.valueOf(selectedDate));
todayParams.addAll(filterParams);
Integer todaysComplaints = jdbcTemplate.queryForObject(todayComplaintsSql, Integer.class,
todayParams.toArray());
// ==========================================
// 5. MANPOWER PRESENT - FILTERED TOTAL
// ==========================================
int manpowerPresent = 0;
for (Map<String, Object> row : locations) {
Object manpower = row.get("manpower");
if (manpower instanceof Number) {
manpowerPresent += ((Number) manpower).intValue();
}
}
// ==========================================
// 6. RESPONSE
// ==========================================
response.put("totalLocations", totalLocations != null ? totalLocations : 0);
response.put("totalActiveLocations", totalActiveLocations != null ? totalActiveLocations : 0);
response.put("totalComplaints", totalComplaints != null ? totalComplaints : 0);
response.put("todaysComplaints", todaysComplaints != null ? todaysComplaints : 0);
response.put("manpowerPresent", manpowerPresent);
response.put("locations", locations);
response.put("status", "Success");
response.put("message", "Fetched dashboard summary Successfully");
} catch (Exception e) {
e.printStackTrace();
response.put("status", "Failed");
response.put("message", "Error while fetching dashboard summary");
}
return response;
}
public Map<String, Object> getPctComplaints(String pct, String date, String zone, String ward, String status,
String searchAddress, String complaintStatus) {
Map<String, Object> response = new HashMap<>();
try {
if (pct == null || pct.trim().isEmpty()) {
response.put("status", "Failed");
response.put("message", "PCT is required");
return response;
}
String pctValue = pct.trim();
// ==========================================
// 1. FETCH PCT DETAILS
// ==========================================
String pctSql = "SELECT id, pct, zone, ward, address, status " + "FROM pct_master "
+ "WHERE pct = ? AND isactive = 1 AND isdelete = 0";
List<Map<String, Object>> pctList = jdbcTemplate.queryForList(pctSql, pctValue);
if (pctList.isEmpty()) {
response.put("status", "Failed");
response.put("message", "PCT not found");
return response;
}
Map<String, Object> pctDetails = pctList.get(0);
// ==========================================
// 2. BUILD COMMON FILTERS
// ==========================================
StringBuilder conditions = new StringBuilder();
List<Object> commonParams = new ArrayList<>();
conditions.append(" AND cd.pct = ? ");
commonParams.add(pctValue);
conditions.append(" AND cd.isactive = 1 AND cd.isdelete = 0 ");
conditions.append(" AND pm.isactive = 1 AND pm.isdelete = 0 ");
if (date != null && !date.trim().isEmpty()) {
java.sql.Date selectedDate = java.sql.Date.valueOf(date.trim());
conditions.append(" AND cd.complaint_raised_on >= ? "
+ " AND cd.complaint_raised_on < DATE_ADD(?, INTERVAL 1 DAY) ");
commonParams.add(selectedDate);
commonParams.add(selectedDate);
}
if (zone != null && !zone.trim().isEmpty() && !"ALL".equalsIgnoreCase(zone.trim())) {
conditions.append(" AND pm.zone = ? ");
commonParams.add(zone.trim());
}
if (ward != null && !ward.trim().isEmpty() && !"ALL".equalsIgnoreCase(ward.trim())) {
conditions.append(" AND pm.ward = ? ");
commonParams.add(ward.trim());
}
if (status != null && !status.trim().isEmpty() && !"ALL".equalsIgnoreCase(status.trim())) {
conditions.append(" AND UPPER(TRIM(pm.status)) = ? ");
commonParams.add(status.trim().toUpperCase());
}
if (searchAddress != null && !searchAddress.trim().isEmpty()) {
conditions.append(" AND pm.address LIKE ? ");
commonParams.add("%" + searchAddress.trim() + "%");
}
String baseFrom = " FROM complaints_details cd " + " LEFT JOIN pct_master pm ON pm.pct = cd.pct "
+ " WHERE 1 = 1 " + conditions;
// ==========================================
// 3. COUNTS FOR ALL FIVE TABS
// ==========================================
String countsSql = "SELECT " + " COUNT(*) AS all_count, " +
" COALESCE(SUM(CASE " + " WHEN UPPER(TRIM(cd.status)) = 'OPEN' "
+ " THEN 1 ELSE 0 END), 0) AS opened, " +
" COALESCE(SUM(CASE " + " WHEN UPPER(TRIM(cd.status)) = 'UNDER REVIEW' "
+ " THEN 1 ELSE 0 END), 0) AS under_review, " +
" COALESCE(SUM(CASE " + " WHEN UPPER(TRIM(cd.status)) = 'PENDING CLOSURE' "
+ " THEN 1 ELSE 0 END), 0) AS pending_closure, " +
" COALESCE(SUM(CASE " + " WHEN UPPER(TRIM(cd.status)) = 'CLOSED' "
+ " THEN 1 ELSE 0 END), 0) AS closed " +
baseFrom;
Map<String, Object> tabCounts = jdbcTemplate.queryForMap(countsSql, commonParams.toArray());
// ==========================================
// 4. FETCH COMPLAINTS FOR SELECTED TAB
// ==========================================
StringBuilder complaintStatusCondition = new StringBuilder();
List<Object> complaintParams = new ArrayList<>(commonParams);
if (complaintStatus != null && !complaintStatus.trim().isEmpty()
&& !"ALL".equalsIgnoreCase(complaintStatus.trim())) {
String normalizedStatus = complaintStatus.trim().toUpperCase();
List<String> allowedStatuses = Arrays.asList("OPEN", "UNDER REVIEW", "PENDING CLOSURE", "CLOSED");
if (!allowedStatuses.contains(normalizedStatus)) {
response.put("status", "Failed");
response.put("message", "Invalid complaint status");
return response;
}
complaintStatusCondition.append(" AND UPPER(TRIM(cd.status)) = ? ");
complaintParams.add(normalizedStatus);
}
String complaintsSql = "SELECT " + " cd.id, " + " cd.pct, " + " cd.complaint_id, "
+ " cd.status AS complaint_status, " + " cd.source, " + " cd.description, "
+ " cd.complaint_raised_on, " + " cd.turn_around_time, " + " cd.created_date, " + " cd.location, "
+ " cd.address " + baseFrom + complaintStatusCondition
+ " ORDER BY cd.complaint_raised_on DESC, cd.id DESC";
List<Map<String, Object>> complaints = jdbcTemplate.queryForList(complaintsSql, complaintParams.toArray());
// ==========================================
// 5. RESPONSE
// ==========================================
response.put("status", "Success");
response.put("pctDetails", pctDetails);
response.put("tabCounts", tabCounts);
response.put("complaints", complaints);
response.put("selectedComplaintStatus", complaintStatus == null ? "ALL" : complaintStatus.toUpperCase());
} catch (Exception e) {
e.printStackTrace();
response.put("status", "Failed");
response.put("message", "Error while fetching PCT complaints");
}
return response;
}
public Map<String, Object> getComplaintTimeline(String complaintId) {
Map<String, Object> response = new HashMap<>();
try {
if (complaintId == null || complaintId.trim().isEmpty()) {
response.put("status", "Failed");
response.put("message", "Complaint ID is required");
return response;
}
String sql =
"SELECT " +
" cd.id AS complaint_detail_id, " +
" cd.complaint_id, " +
" cd.status AS current_status, " +
" cd.description, " +
" cd.source, " +
" cd.location, " +
" cd.address, " +
" cd.complaint_raised_on AS current_raised_on, " +
" cd.turn_around_time, " +
" ch.id AS history_id, " +
" ch.status AS history_status, " +
" ch.remarks, " +
" ch.complaint_raised_on, " +
" ch.complaint_raised_by, " +
" ch.complaint_updated_on, " +
" ch.complaint_updated_by, " +
" CASE " +
" WHEN ch.imgfile IS NOT NULL AND TRIM(ch.imgfile) <> '' " +
" THEN CONCAT('" + fileBaseUrl + "/gccofficialapp/files', ch.imgfile) " +
" ELSE NULL " +
" END AS imgfile " +
"FROM complaints_details cd " +
"LEFT JOIN complaints_history ch " +
" ON ch.complaint_id = cd.complaint_id " +
" AND ch.isactive = 1 " +
" AND ch.isdelete = 0 " +
"WHERE cd.complaint_id = ? " +
" AND cd.isactive = 1 " +
" AND cd.isdelete = 0 " +
"ORDER BY ch.complaint_updated_on DESC, ch.id DESC";
List<Map<String, Object>> rows =
jdbcTemplate.queryForList(sql, complaintId.trim());
if (rows.isEmpty()) {
response.put("status", "Failed");
response.put("message", "Complaint not found");
return response;
}
// Header information from complaints_details.
Map<String, Object> firstRow = rows.get(0);
Map<String, Object> complaint = new HashMap<>();
complaint.put("complaint_id", firstRow.get("complaint_id"));
complaint.put("current_status", firstRow.get("current_status"));
complaint.put("description", firstRow.get("description"));
complaint.put("source", firstRow.get("source"));
complaint.put("location", firstRow.get("location"));
complaint.put("address", firstRow.get("address"));
complaint.put("turn_around_time",firstRow.get("turn_around_time"));
complaint.put("complaint_raised_on",
firstRow.get("current_raised_on"));
// Timeline records from complaints_history.
List<Map<String, Object>> timeline = new ArrayList<>();
for (Map<String, Object> row : rows) {
// LEFT JOIN may return a complaint without history.
if (row.get("history_id") == null) {
continue;
}
Map<String, Object> history = new HashMap<>();
history.put("id", row.get("history_id"));
history.put("status", row.get("history_status"));
history.put("remarks", row.get("remarks"));
history.put("complaint_raised_on",
row.get("complaint_raised_on"));
history.put("complaint_raised_by",
row.get("complaint_raised_by"));
history.put("complaint_updated_on",
row.get("complaint_updated_on"));
history.put("complaint_updated_by",
row.get("complaint_updated_by"));
history.put("imgfile", row.get("imgfile"));
timeline.add(history);
}
response.put("status", "Success");
response.put("complaint", complaint);
response.put("timeline", timeline);
response.put("message", "Complaint timeline fetched successfully");
} catch (Exception e) {
e.printStackTrace();
response.put("status", "Failed");
response.put("message", "Error while fetching complaint timeline");
}
return response;
}
public Map<String, Object> getManpowerDetails(String pct, String date, String zone, String ward, String status,
String searchAddress) {
Map<String, Object> response = new HashMap<>();
try {
if (pct == null || pct.trim().isEmpty()) {
response.put("status", "Failed");
response.put("message", "PCT is required");
return response;
}
String selectedDate = (date == null || date.trim().isEmpty()) ? java.time.LocalDate.now().toString()
: date.trim();
java.sql.Date attendanceDate = java.sql.Date.valueOf(selectedDate);
StringBuilder filters = new StringBuilder();
List<Object> params = new ArrayList<>();
// Attendance date parameters
params.add(attendanceDate);
params.add(attendanceDate);
// The selected PCT
filters.append(" AND pm.pct = ? ");
params.add(pct.trim());
// Same dashboard filters
if (zone != null && !zone.trim().isEmpty() && !"ALL".equalsIgnoreCase(zone.trim())) {
filters.append(" AND pm.zone = ? ");
params.add(zone.trim());
}
if (ward != null && !ward.trim().isEmpty() && !"ALL".equalsIgnoreCase(ward.trim())) {
filters.append(" AND pm.ward = ? ");
params.add(ward.trim());
}
if (status != null && !status.trim().isEmpty() && !"ALL".equalsIgnoreCase(status.trim())) {
filters.append(" AND UPPER(TRIM(pm.status)) = ? ");
params.add(status.trim().toUpperCase());
}
if (searchAddress != null && !searchAddress.trim().isEmpty()) {
filters.append(" AND pm.address LIKE ? ");
params.add("%" + searchAddress.trim() + "%");
}
String sql = "SELECT " + " pm.id AS pct_id, " + " pm.pct, " + " pm.address, " + " pm.zone, " + " pm.ward, "
+ " pm.status AS pct_status, " + " me.id AS employee_id, " + " me.emp_name, "
+ " me.mobile_number, " + " me.att_date, " + " me.location, " + " CASE "
+ " WHEN me.imgfile IS NOT NULL " + " AND TRIM(me.imgfile) <> '' " + " THEN CONCAT('"
+ fileBaseUrl + "/gccofficialapp/files', me.imgfile) " + " ELSE NULL " + " END AS file_url " +
"FROM pct_master pm " +
"LEFT JOIN man_power_employees me " + " ON me.pct = pm.pct " + " AND me.att_date >= ? "
+ " AND me.att_date < DATE_ADD(?, INTERVAL 1 DAY) " + " AND me.isactive = 1 "
+ " AND me.isdelete = 0 " +
"WHERE pm.isactive = 1 " + " AND pm.isdelete = 0 " +
" AND EXISTS ( " + " SELECT 1 FROM man_power_details md " + " WHERE md.pct = pm.pct "
+ " AND md.isactive = 1 " + " AND md.isdelete = 0 " + " ) " +
filters +
" ORDER BY me.att_date DESC, me.id DESC";
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql, params.toArray());
if (rows.isEmpty()) {
response.put("status", "Failed");
response.put("message", "No manpower attendance found for the selected PCT and date");
response.put("employees", Collections.emptyList());
return response;
}
Map<String, Object> firstRow = rows.get(0);
Map<String, Object> pctDetails = new HashMap<>();
pctDetails.put("pct_id", firstRow.get("pct_id"));
pctDetails.put("pct", firstRow.get("pct"));
pctDetails.put("address", firstRow.get("address"));
pctDetails.put("zone", firstRow.get("zone"));
pctDetails.put("ward", firstRow.get("ward"));
pctDetails.put("status", firstRow.get("pct_status"));
pctDetails.put("date", selectedDate);
List<Map<String, Object>> employees = new ArrayList<>();
for (Map<String, Object> row : rows) {
Map<String, Object> employee = new HashMap<>();
employee.put("id", row.get("employee_id"));
employee.put("emp_name", row.get("emp_name"));
employee.put("mobile_number", row.get("mobile_number"));
employee.put("att_date", row.get("att_date"));
employee.put("location", row.get("location"));
employee.put("imgfile", row.get("file_url"));
employees.add(employee);
}
response.put("status", "Success");
response.put("message", "Manpower details fetched successfully");
response.put("pctDetails", pctDetails);
response.put("employees", employees);
} catch (Exception e) {
e.printStackTrace();
response.put("status", "Failed");
response.put("message", "Error while fetching manpower details");
}
return response;
}
// complainyts overview
public List<Map<String, Object>> ViewLocationDropdown(String ward) {
String sql = "SELECT DISTINCT(address),pct "
+ "FROM pct_master "
+ "WHERE isactive=1 AND isdelete=0 AND ward=? ORDER BY address";
try {
return jdbcTemplate.queryForList(sql,ward);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return Collections.emptyList();
}
}
public Map<String, Object> getComplaintsOverview(
String date,
String zone,
String ward,
String location,
String status,
String source,
String searchAddress) {
Map<String, Object> response = new HashMap<>();
try {
java.time.LocalDate selectedDate =
java.time.LocalDate.parse(date.trim());
StringBuilder filters = new StringBuilder();
List<Object> params = new ArrayList<>();
filters.append(" AND cd.complaint_raised_on >= ? ");
filters.append(" AND cd.complaint_raised_on < DATE_ADD(?, INTERVAL 1 DAY) ");
params.add(java.sql.Date.valueOf(selectedDate));
params.add(java.sql.Date.valueOf(selectedDate));
if (zone != null && !zone.trim().isEmpty()
&& !"ALL".equalsIgnoreCase(zone.trim())) {
filters.append(" AND pm.zone = ? ");
params.add(zone.trim());
}
if (ward != null && !ward.trim().isEmpty()
&& !"ALL".equalsIgnoreCase(ward.trim())) {
filters.append(" AND pm.ward = ? ");
params.add(ward.trim());
}
if (location != null && !location.trim().isEmpty()
&& !"ALL".equalsIgnoreCase(location.trim())) {
filters.append(" AND pm.pct = ? ");
params.add(location.trim());
}
if (status != null && !status.trim().isEmpty()
&& !"ALL".equalsIgnoreCase(status.trim())) {
filters.append(" AND UPPER(TRIM(cd.status)) = ? ");
params.add(status.trim().toUpperCase());
}
if (source != null && !source.trim().isEmpty()
&& !"ALL".equalsIgnoreCase(source.trim())) {
filters.append(" AND LOWER(TRIM(cd.source)) = LOWER(?) ");
params.add(source.trim());
}
if (searchAddress != null && !searchAddress.trim().isEmpty()) {
filters.append(" AND pm.address LIKE ? ");
params.add("%" + searchAddress.trim() + "%");
}
String baseWhere =
" FROM complaints_details cd " +
" INNER JOIN pct_master pm ON pm.pct = cd.pct " +
" WHERE cd.isactive = 1 AND cd.isdelete = 0 " +
" AND pm.isactive = 1 AND pm.isdelete = 0 " +
filters;
// 1. Summary cards: all filters apply.
String summarySql =
"SELECT COUNT(*) AS total_complaints, " +
"COALESCE(SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'OPEN' " +
"THEN 1 ELSE 0 END), 0) AS opened, " +
"COALESCE(SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'UNDER REVIEW' " +
"THEN 1 ELSE 0 END), 0) AS under_review, " +
"COALESCE(SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'PENDING CLOSURE' " +
"THEN 1 ELSE 0 END), 0) AS pending_closure, " +
"COALESCE(SUM(CASE WHEN UPPER(TRIM(cd.status)) = 'CLOSED' " +
"THEN 1 ELSE 0 END), 0) AS closed " +
baseWhere;
Map<String, Object> summary =
jdbcTemplate.queryForMap(summarySql, params.toArray());
// 2. DataTable: one row per complaint.
// The history subquery returns at most one row per complaint ID.
String tableSql =
"SELECT " +
" pm.pct, pm.zone, pm.ward, pm.address, " +
" cd.id AS complaint_detail_id, " +
" cd.complaint_id, cd.description, " +
" cd.turn_around_time, cd.source, cd.status, " +
" cd.complaint_raised_on AS raised_on, " +
" ch.closed_on " +
baseWhere +
" LEFT JOIN ( " +
" SELECT complaint_id, MAX(complaint_updated_on) AS closed_on " +
" FROM complaints_history " +
" WHERE UPPER(TRIM(status)) = 'CLOSED' " +
" AND isactive = 1 AND isdelete = 0 " +
" GROUP BY complaint_id " +
" ) ch ON ch.complaint_id = cd.complaint_id " +
" ORDER BY cd.complaint_raised_on DESC, cd.id DESC";
// Put the history join before WHERE in the final SQL.
tableSql =
"SELECT pm.pct, pm.zone, pm.ward, pm.address, " +
"cd.id AS complaint_detail_id, cd.complaint_id, " +
"cd.description, cd.turn_around_time, cd.source, cd.status, " +
"cd.complaint_raised_on AS raised_on, ch.closed_on " +
"FROM complaints_details cd " +
"INNER JOIN pct_master pm ON pm.pct = cd.pct " +
"LEFT JOIN ( " +
" SELECT complaint_id, MAX(complaint_updated_on) AS closed_on " +
" FROM complaints_history " +
" WHERE UPPER(TRIM(status)) = 'CLOSED' " +
" AND isactive = 1 AND isdelete = 0 " +
" GROUP BY complaint_id " +
") ch ON ch.complaint_id = cd.complaint_id " +
"WHERE cd.isactive = 1 AND cd.isdelete = 0 " +
"AND pm.isactive = 1 AND pm.isdelete = 0 " +
filters +
" ORDER BY cd.complaint_raised_on DESC, cd.id DESC";
List<Map<String, Object>> complaints =
jdbcTemplate.queryForList(tableSql, params.toArray());
response.put("totalComplaints", summary.get("total_complaints"));
response.put("opened", summary.get("opened"));
response.put("underReview", summary.get("under_review"));
response.put("pendingClosure", summary.get("pending_closure"));
response.put("closed", summary.get("closed"));
response.put("complaints", complaints);
response.put("status", "Success");
response.put("message", "Complaints overview fetched successfully");
} catch (Exception e) {
e.printStackTrace();
response.put("status", "Failed");
response.put("message", "Error while fetching complaints overview");
}
return response;
}
}

42
src/main/java/com/gcc/commissionerreview/service/RoadWarService.java

@ -1,6 +1,9 @@
package com.gcc.commissionerreview.service; package com.gcc.commissionerreview.service;
import java.net.URI;
import java.net.URL; import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -19,6 +22,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.itextpdf.text.Document; import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize; import com.itextpdf.text.PageSize;
@ -26,8 +30,8 @@ import com.itextpdf.text.Paragraph;
import com.itextpdf.text.DocumentException; import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element; import com.itextpdf.text.Element;
import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.text.pdf.PdfWriter;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itextpdf.text.BaseColor; import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk; import com.itextpdf.text.Chunk;
import com.itextpdf.text.Font; import com.itextpdf.text.Font;
@ -1522,6 +1526,40 @@ public class RoadWarService {
// for road war register dashboard // for road war register dashboard
public List<Map<String, Object>> getTotalRoadByGIS() {
try {
String url = "https://gisgcc.chennaicorporation.gov.in/Java/proxy.jsp?https://gisgcc.chennaicorporation.gov.in/server/rest/services/GCCDepts/IT_API/FeatureServer/0/query?where=interior_brr+IN+%28%27BRR%27%2C%27Interior%27%29&fullText=&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=4326&defaultSR=4326&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Meter&relationParam=&outFields=&returnGeometry=false&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&gdbVersion=&historicMoment=&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22objectid%22%2C%22outStatisticFieldName%22%3A%22count%22%7D%5D&returnZ=false&returnM=false&multipatchOption=xyFootprint&resultOffset=&resultRecordCount=&returnTrueCurves=false&returnExceededLimitFeatures=false&quantizationParameters=&returnCentroid=false&returnEnvelope=false&timeReferenceUnknownClient=false&maxRecordCountFactor=&sqlFormat=none&resultType=&featureEncoding=esriDefault&datumTransformation=&cacheHint=false&f=pjson";
RestTemplate restTemplate = new RestTemplate();
String responseBody = restTemplate.getForObject(URI.create(url), String.class);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode root = objectMapper.readTree(responseBody);
JsonNode features = root.path("features");
List<Map<String, Object>> roadList = new ArrayList<>();
if (features.isArray()) {
for (JsonNode feature : features) {
JsonNode props = feature.path("attributes");
String roadCount = props.path("count").asText();
Map<String, Object> roadInfo = new HashMap<>();
roadInfo.put("roadCount", roadCount);
roadList.add(roadInfo);
}
}
return roadList;
} catch (Exception e) {
e.printStackTrace();
return Collections.emptyList();
}
}
public Map<String, Object> getDashboardSummary( public Map<String, Object> getDashboardSummary(
String zone, String zone,
String ward, String ward,

150
src/main/java/com/gcc/commissionerreview/service/StreetVendorService.java

@ -79,9 +79,9 @@ public class StreetVendorService {
sql.append(" THEN vd.id "); sql.append(" THEN vd.id ");
sql.append(" END) AS committee_processed, "); sql.append(" END) AS committee_processed, ");
// 7. Total Processed
sql.append(" ( ");
// 7. Assistant Pending
sql.append(" (COUNT(DISTINCT vd.id) - ");
sql.append(" COUNT(DISTINCT CASE "); sql.append(" COUNT(DISTINCT CASE ");
sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' ");
sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' ");
@ -90,25 +90,10 @@ public class StreetVendorService {
sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' ");
sql.append(" AND vd.tamil_vending_category IS NOT NULL "); sql.append(" AND vd.tamil_vending_category IS NOT NULL ");
sql.append(" THEN vd.id "); sql.append(" THEN vd.id ");
sql.append(" END) ");
sql.append(" + COUNT(DISTINCT va1.vdid) ");
sql.append(" + COUNT(DISTINCT va2.vdid) ");
sql.append(" + COUNT(DISTINCT va3.vdid) ");
sql.append(" + COUNT(DISTINCT CASE ");
sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL ");
sql.append(" THEN vd.id ");
sql.append(" END) ");
sql.append(" ) AS total_processed, ");
// 8. Pending
sql.append(" ( ");
sql.append(" COUNT(DISTINCT vd.id) - ");
sql.append(" ( ");
sql.append(" END)) AS assistant_pending, ");
// 8. LI Pending = Assistant Processed - LI Processed
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT CASE "); sql.append(" COUNT(DISTINCT CASE ");
sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' ");
sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' ");
@ -117,22 +102,29 @@ public class StreetVendorService {
sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' ");
sql.append(" AND vd.tamil_vending_category IS NOT NULL "); sql.append(" AND vd.tamil_vending_category IS NOT NULL ");
sql.append(" THEN vd.id "); sql.append(" THEN vd.id ");
sql.append(" END) ");
sql.append(" + COUNT(DISTINCT va1.vdid) ");
sql.append(" + COUNT(DISTINCT va2.vdid) ");
sql.append(" + COUNT(DISTINCT va3.vdid) ");
sql.append(" + COUNT(DISTINCT CASE ");
sql.append(" END) - COUNT(DISTINCT va1.vdid) ");
sql.append(" ) AS li_pending, ");
// 9. ARO Pending = LI Processed - ARO Processed
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT va1.vdid) - COUNT(DISTINCT va2.vdid) ");
sql.append(" ) AS aro_pending, ");
// 10. EE Pending = ARO Processed - EE Processed
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT va2.vdid) - COUNT(DISTINCT va3.vdid) ");
sql.append(" ) AS ee_pending, ");
// 11. Committee Pending = EE Processed - Committee Processed
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT va3.vdid) - ");
sql.append(" COUNT(DISTINCT CASE ");
sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL "); sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL ");
sql.append(" THEN vd.id "); sql.append(" THEN vd.id ");
sql.append(" END) "); sql.append(" END) ");
sql.append(" ) AS committee_pending, ");
sql.append(" ) ");
sql.append(" ) AS pending, ");
// 9. Processed within 30 days
// 12. Processed within 30 days
sql.append(" COUNT(DISTINCT CASE "); sql.append(" COUNT(DISTINCT CASE ");
sql.append(" WHEN vrl.cdate IS NOT NULL "); sql.append(" WHEN vrl.cdate IS NOT NULL ");
sql.append(" AND DATEDIFF(vrl.cdate, vd.cdate) <= 30 "); sql.append(" AND DATEDIFF(vrl.cdate, vd.cdate) <= 30 ");
@ -227,9 +219,8 @@ public class StreetVendorService {
sql.append(" THEN vd.id "); sql.append(" THEN vd.id ");
sql.append(" END) AS committee_processed, "); sql.append(" END) AS committee_processed, ");
// 7. Total Processed
sql.append(" ( ");
// 7. Assistant Pending
sql.append(" (COUNT(DISTINCT vd.id) - ");
sql.append(" COUNT(DISTINCT CASE "); sql.append(" COUNT(DISTINCT CASE ");
sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' ");
sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' ");
@ -238,25 +229,10 @@ public class StreetVendorService {
sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' ");
sql.append(" AND vd.tamil_vending_category IS NOT NULL "); sql.append(" AND vd.tamil_vending_category IS NOT NULL ");
sql.append(" THEN vd.id "); sql.append(" THEN vd.id ");
sql.append(" END) ");
sql.append(" + COUNT(DISTINCT va1.vdid) ");
sql.append(" + COUNT(DISTINCT va2.vdid) ");
sql.append(" + COUNT(DISTINCT va3.vdid) ");
sql.append(" + COUNT(DISTINCT CASE ");
sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL ");
sql.append(" THEN vd.id ");
sql.append(" END) ");
sql.append(" ) AS total_processed, ");
// 8. Pending
sql.append(" ( ");
sql.append(" COUNT(DISTINCT vd.id) - ");
sql.append(" ( ");
sql.append(" END)) AS assistant_pending, ");
// 8. LI Pending = Assistant Processed - LI Processed
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT CASE "); sql.append(" COUNT(DISTINCT CASE ");
sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' "); sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' ");
sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' "); sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' ");
@ -265,20 +241,27 @@ public class StreetVendorService {
sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' "); sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' ");
sql.append(" AND vd.tamil_vending_category IS NOT NULL "); sql.append(" AND vd.tamil_vending_category IS NOT NULL ");
sql.append(" THEN vd.id "); sql.append(" THEN vd.id ");
sql.append(" END) ");
sql.append(" + COUNT(DISTINCT va1.vdid) ");
sql.append(" + COUNT(DISTINCT va2.vdid) ");
sql.append(" + COUNT(DISTINCT va3.vdid) ");
sql.append(" + COUNT(DISTINCT CASE ");
sql.append(" END) - COUNT(DISTINCT va1.vdid) ");
sql.append(" ) AS li_pending, ");
// 9. ARO Pending = LI Processed - ARO Processed
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT va1.vdid) - COUNT(DISTINCT va2.vdid) ");
sql.append(" ) AS aro_pending, ");
// 10. EE Pending = ARO Processed - EE Processed
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT va2.vdid) - COUNT(DISTINCT va3.vdid) ");
sql.append(" ) AS ee_pending, ");
// 11. Committee Pending = EE Processed - Committee Processed
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT va3.vdid) - ");
sql.append(" COUNT(DISTINCT CASE ");
sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL "); sql.append(" WHEN vrl.vdid IS NOT NULL OR vpl.vdid IS NOT NULL ");
sql.append(" THEN vd.id "); sql.append(" THEN vd.id ");
sql.append(" END) "); sql.append(" END) ");
sql.append(" ) ");
sql.append(" ) AS pending, ");
sql.append(" ) AS committee_pending, ");
// 9. Processed within 30 days // 9. Processed within 30 days
sql.append(" COUNT(DISTINCT CASE "); sql.append(" COUNT(DISTINCT CASE ");
@ -358,15 +341,17 @@ public class StreetVendorService {
sql.append(" COUNT(DISTINCT va1.vdid) AS li_processed, "); sql.append(" COUNT(DISTINCT va1.vdid) AS li_processed, ");
// 8. Pending
sql.append(" ( ");
sql.append(" COUNT(DISTINCT vd.id) - ");
sql.append(" COUNT(DISTINCT va1.vdid) ");
// 8. LI Pending = Assistant Processed - LI Processed
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT CASE ");
sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' ");
sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' ");
sql.append(" AND vd.tamil_landmark IS NOT NULL AND vd.tamil_landmark <> '' ");
sql.append(" AND vd.tamil_gender IS NOT NULL AND vd.tamil_gender <> '' ");
sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' ");
sql.append(" AND vd.tamil_vending_category IS NOT NULL ");
sql.append(" THEN vd.id ");
sql.append(" END) - COUNT(DISTINCT va1.vdid) ");
sql.append(" ) AS li_pending "); sql.append(" ) AS li_pending ");
@ -419,15 +404,16 @@ public class StreetVendorService {
// 8. Pending // 8. Pending
sql.append(" ( ");
sql.append(" COUNT(DISTINCT vd.id) - ");
sql.append(" ( ");
sql.append(" COUNT(DISTINCT va1.vdid) ");
sql.append(" ) ");
sql.append(" GREATEST(0, ");
sql.append(" COUNT(DISTINCT CASE ");
sql.append(" WHEN vd.tamil_name IS NOT NULL AND vd.tamil_name <> '' ");
sql.append(" AND vd.tamil_f_h_name IS NOT NULL AND vd.tamil_f_h_name <> '' ");
sql.append(" AND vd.tamil_landmark IS NOT NULL AND vd.tamil_landmark <> '' ");
sql.append(" AND vd.tamil_gender IS NOT NULL AND vd.tamil_gender <> '' ");
sql.append(" AND vd.tamil_present_district IS NOT NULL AND vd.tamil_present_district <> '' ");
sql.append(" AND vd.tamil_vending_category IS NOT NULL ");
sql.append(" THEN vd.id ");
sql.append(" END) - COUNT(DISTINCT va1.vdid) ");
sql.append(" ) AS li_pending "); sql.append(" ) AS li_pending ");

4
src/main/resources/application.properties

@ -1,2 +1,2 @@
spring.profiles.active=prod
#spring.profiles.active=dev
#spring.profiles.active=prod
spring.profiles.active=dev

1311
src/main/resources/templates/modules/dbfot/CompDetails.html
File diff suppressed because it is too large
View File

2023
src/main/resources/templates/modules/dbfot/locDetails.html
File diff suppressed because it is too large
View File

68
src/main/resources/templates/modules/roadwarweb/roadwarregisterdashboard.html

@ -577,7 +577,7 @@
<div class="total-roads-card"> <div class="total-roads-card">
<div class="total-roads-label">GCC TOTAL ROADS</div> <div class="total-roads-label">GCC TOTAL ROADS</div>
<div class="total-roads-count" id="erpMasterRoads">36807</div>
<div class="total-roads-count" id="erpMasterRoads">0</div>
</div> </div>
<div class="total-roads-card"> <div class="total-roads-card">
@ -1169,7 +1169,7 @@
<script> <script>
$(document).ready(function () { $(document).ready(function () {
/* loadOverallCount(); */
loadOverallCount();
loadDashboard(); loadDashboard();
$.ajax({ $.ajax({
url: '/commissionerreview/api/roadwarweb/getzones', url: '/commissionerreview/api/roadwarweb/getzones',
@ -1232,6 +1232,47 @@ $(document).ready(function () {
}); });
}); });
function loadOverallCount() {
$("#pageLoader").show();
$.ajax({
url: '/commissionerreview/api/roadwarweb/getTotalRoadByGIS',
type: 'GET',
dataType: 'json',
success: function(response) {
// Print the complete API response
console.log("getTotalRoadByGIS =", response);
// Print response as formatted JSON
//console.log(JSON.stringify(response, null, 2));
if (response.status) {
var data = response.data;
if (data && data.length > 0) {
$("#erpMasterRoads").text(data[0].roadCount);
} else {
$("#erpMasterRoads").text("0");
}
} else {
console.log(response.message);
$("#erpMasterRoads").text("0");
}
$("#pageLoader").hide();
},
error: function(xhr, status, error) {
$("#pageLoader").hide();
console.error("Error fetching total roads countsby GIS:", error);
}
});
}
$('#zone').change(function () { $('#zone').change(function () {
let zone = $(this).val(); let zone = $(this).val();
@ -1283,30 +1324,7 @@ $("#ward, #roadType, #swd").change(function() {
loadDashboard(); loadDashboard();
}); });
/* function loadOverallCount() {
$.ajax({
url: '/commissionerreview/api/roadwarweb/getoverallcount',
type: 'GET',
dataType: 'json',
success: function(response) {
if (response.length > 0 && response[0].status) {
var data = response[0].data[0];
$("#erpMasterRoads").text(data.erpMasterRoads);
} else {
console.log(response[0].message);
}
},
error: function(xhr, status, error) {
console.error("Error fetching overall counts:", error);
}
});
} */
function renderZoneCounts(data) { function renderZoneCounts(data) {

40
src/main/resources/templates/modules/streetvendor/overalldetails.html

@ -86,18 +86,25 @@
<tr> <tr>
<th rowspan="2" class="text-center">Zone</th> <th rowspan="2" class="text-center">Zone</th>
<th rowspan="2" class="text-center">Application Received</th> <th rowspan="2" class="text-center">Application Received</th>
<th colspan="5" class="text-center">Application Processed</th>
<th rowspan="2" class="text-center">Total Processed</th>
<th rowspan="2" class="text-center">Pending </th>
<th colspan="2" class="text-center">Assistant</th>
<th colspan="2" class="text-center">LI</th>
<th colspan="2" class="text-center">ARO</th>
<th colspan="2" class="text-center">EE</th>
<th colspan="2" class="text-center">Committee</th>
<th rowspan="2" class="text-center">Processed within 30 days</th> <th rowspan="2" class="text-center">Processed within 30 days</th>
</tr> </tr>
<tr> <tr>
<th class="text-center">Assistant Processed</th> <th class="text-center">Assistant Processed</th>
<th class="text-center">Assistant Pending</th>
<th class="text-center">LI Processed</th> <th class="text-center">LI Processed</th>
<th class="text-center">LI Pending</th>
<th class="text-center">ARO Processed</th> <th class="text-center">ARO Processed</th>
<th class="text-center">ARO Pending</th>
<th class="text-center">EE Processed</th> <th class="text-center">EE Processed</th>
<th class="text-center">EE Pending</th>
<th class="text-center">Committee Processed</th> <th class="text-center">Committee Processed</th>
<th class="text-center">Committee Pending</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -121,18 +128,25 @@
<tr> <tr>
<th rowspan="2" class="text-center">Ward</th> <th rowspan="2" class="text-center">Ward</th>
<th rowspan="2" class="text-center">Application Received</th> <th rowspan="2" class="text-center">Application Received</th>
<th colspan="5" class="text-center">Application Processed</th>
<th rowspan="2" class="text-center">Total Processed</th>
<th rowspan="2" class="text-center">Pending </th>
<th colspan="2" class="text-center">Assistant</th>
<th colspan="2" class="text-center">LI</th>
<th colspan="2" class="text-center">ARO</th>
<th colspan="2" class="text-center">EE</th>
<th colspan="2" class="text-center">Committee</th>
<th rowspan="2" class="text-center">Processed within 30 days</th> <th rowspan="2" class="text-center">Processed within 30 days</th>
</tr> </tr>
<tr> <tr>
<th class="text-center">Assistant Processed</th> <th class="text-center">Assistant Processed</th>
<th class="text-center">Assistant Pending</th>
<th class="text-center">LI Processed</th> <th class="text-center">LI Processed</th>
<th class="text-center">LI Pending</th>
<th class="text-center">ARO Processed</th> <th class="text-center">ARO Processed</th>
<th class="text-center">ARO Pending</th>
<th class="text-center">EE Processed</th> <th class="text-center">EE Processed</th>
<th class="text-center">EE Pending</th>
<th class="text-center">Committee Processed</th> <th class="text-center">Committee Processed</th>
<th class="text-center">Committee Pending</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@ -260,12 +274,15 @@ $('#fromDate, #toDate').on('change', function () {
{ data: 'application_received', defaultContent: '-', className: 'text-center' }, { data: 'application_received', defaultContent: '-', className: 'text-center' },
{ data: 'assistant_processed', defaultContent: '-', className: 'text-center' }, { data: 'assistant_processed', defaultContent: '-', className: 'text-center' },
{ data: 'assistant_pending', defaultContent: '-', className: 'text-center' },
{ data: 'li_processed', defaultContent: '-', className: 'text-center' }, { data: 'li_processed', defaultContent: '-', className: 'text-center' },
{ data: 'li_pending', defaultContent: '-', className: 'text-center' },
{ data: 'aro_processed', defaultContent: '-', className: 'text-center' }, { data: 'aro_processed', defaultContent: '-', className: 'text-center' },
{ data: 'aro_pending', defaultContent: '-', className: 'text-center' },
{ data: 'ee_processed', defaultContent: '-', className: 'text-center' }, { data: 'ee_processed', defaultContent: '-', className: 'text-center' },
{ data: 'ee_pending', defaultContent: '-', className: 'text-center' },
{ data: 'committee_processed', defaultContent: '-', className: 'text-center' }, { data: 'committee_processed', defaultContent: '-', className: 'text-center' },
{ data: 'total_processed', defaultContent: '-', className: 'text-center' },
{ data: 'pending', defaultContent: '-', className: 'text-center' },
{ data: 'committee_pending', defaultContent: '-', className: 'text-center' },
{ data: 'processed_within_30_days', defaultContent: '-', className: 'text-center' } { data: 'processed_within_30_days', defaultContent: '-', className: 'text-center' }
], ],
dom: 'Bfrtip', dom: 'Bfrtip',
@ -444,12 +461,15 @@ function openZoneModal(zoneCode) {
{ data: 'application_received', defaultContent: '-', className: 'text-center' }, { data: 'application_received', defaultContent: '-', className: 'text-center' },
{ data: 'assistant_processed', defaultContent: '-', className: 'text-center' }, { data: 'assistant_processed', defaultContent: '-', className: 'text-center' },
{ data: 'assistant_pending', defaultContent: '-', className: 'text-center' },
{ data: 'li_processed', defaultContent: '-', className: 'text-center' }, { data: 'li_processed', defaultContent: '-', className: 'text-center' },
{ data: 'li_pending', defaultContent: '-', className: 'text-center' },
{ data: 'aro_processed', defaultContent: '-', className: 'text-center' }, { data: 'aro_processed', defaultContent: '-', className: 'text-center' },
{ data: 'aro_pending', defaultContent: '-', className: 'text-center' },
{ data: 'ee_processed', defaultContent: '-', className: 'text-center' }, { data: 'ee_processed', defaultContent: '-', className: 'text-center' },
{ data: 'ee_pending', defaultContent: '-', className: 'text-center' },
{ data: 'committee_processed', defaultContent: '-', className: 'text-center' }, { data: 'committee_processed', defaultContent: '-', className: 'text-center' },
{ data: 'total_processed', defaultContent: '-', className: 'text-center' },
{ data: 'pending', defaultContent: '-', className: 'text-center' },
{ data: 'committee_pending', defaultContent: '-', className: 'text-center' },
{ data: 'processed_within_30_days', defaultContent: '-', className: 'text-center' } { data: 'processed_within_30_days', defaultContent: '-', className: 'text-center' }
], ],
dom: 'Bfrtip', dom: 'Bfrtip',

Loading…
Cancel
Save