|
|
|
@ -2,6 +2,8 @@ package com.gcc.commissionerreview.service; |
|
|
|
|
|
|
|
import javax.sql.DataSource; |
|
|
|
|
|
|
|
import org.slf4j.Logger; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.beans.factory.annotation.Qualifier; |
|
|
|
import org.springframework.jdbc.core.JdbcTemplate; |
|
|
|
@ -9,7 +11,9 @@ import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
import java.sql.Date; |
|
|
|
import java.time.LocalDate; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.time.format.DateTimeFormatter; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Locale; |
|
|
|
import java.util.Map; |
|
|
|
@ -17,352 +21,398 @@ import java.util.Map; |
|
|
|
@Service |
|
|
|
public class AttendanceService { |
|
|
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(AttendanceService.class); |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private JdbcTemplate jdbcTemplate; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
public void setDataSource(@Qualifier("mysqlNULMDataSource") DataSource dataSource) { |
|
|
|
this.jdbcTemplate = new JdbcTemplate(dataSource); |
|
|
|
try { |
|
|
|
this.jdbcTemplate = new JdbcTemplate(dataSource); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("Method: setDataSource | Parameters: dataSource={} | Date: {} | Exception: {} - {}", |
|
|
|
dataSource, LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy", Locale.ENGLISH); |
|
|
|
|
|
|
|
public List<Map<String, Object>> getAbstractCounts() { |
|
|
|
String sql = "SELECT emp_type, COUNT(enrollment_id) AS totalCount, " |
|
|
|
+ "SUM(CASE WHEN facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " |
|
|
|
+ "SUM(CASE WHEN facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " |
|
|
|
+ "FROM enrollment_table " |
|
|
|
+ "WHERE isactive = 1 AND isdelete = 0 AND zone != 0 and emp_type ='Park' " |
|
|
|
+ "GROUP BY emp_type"; |
|
|
|
|
|
|
|
return jdbcTemplate.queryForList(sql); |
|
|
|
try { |
|
|
|
String sql = "SELECT emp_type, COUNT(enrollment_id) AS totalCount, " |
|
|
|
+ "SUM(CASE WHEN facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " |
|
|
|
+ "SUM(CASE WHEN facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " |
|
|
|
+ "FROM enrollment_table " |
|
|
|
+ "WHERE isactive = 1 AND isdelete = 0 AND zone != 0 and emp_type ='Park' " |
|
|
|
+ "GROUP BY emp_type"; |
|
|
|
|
|
|
|
return jdbcTemplate.queryForList(sql); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("Method: getAbstractCounts | Parameters: none | Date: {} | Exception: {} - {}", |
|
|
|
LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); |
|
|
|
return Collections.emptyList(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public List<Map<String, Object>> getZoneWisePercentage(String fromDateStr, String toDateStr) { |
|
|
|
LocalDate fromDate; |
|
|
|
LocalDate toDate; |
|
|
|
try { |
|
|
|
LocalDate fromDate; |
|
|
|
LocalDate toDate; |
|
|
|
|
|
|
|
if (fromDateStr == null || fromDateStr.trim().isEmpty()) { |
|
|
|
fromDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
if (fromDateStr == null || fromDateStr.trim().isEmpty()) { |
|
|
|
fromDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
if (toDateStr == null || toDateStr.trim().isEmpty()) { |
|
|
|
toDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
if (toDateStr == null || toDateStr.trim().isEmpty()) { |
|
|
|
toDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
String fromDateFormatted = fromDate.toString(); |
|
|
|
String toDateFormatted = toDate.toString(); |
|
|
|
|
|
|
|
String fromDateFormatted = fromDate.toString(); |
|
|
|
String toDateFormatted = toDate.toString(); |
|
|
|
|
|
|
|
String sql = "WITH count_data AS ( " |
|
|
|
+ "SELECT pd.region_id, " |
|
|
|
+ "COUNT(et.enrollment_id) AS total_count, " |
|
|
|
+ "SUM(CASE WHEN et.facial_attendance = 1 THEN 1 ELSE 0 END) AS facial_registered_count, " |
|
|
|
+ "SUM(CASE WHEN att.indatetime IS NOT NULL OR att.oddatetime IS NOT NULL THEN 1 ELSE 0 END) AS present_od_count " |
|
|
|
+ "FROM enrollment_table et " |
|
|
|
+ "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " |
|
|
|
+ "AND (DATE(att.indatetime) BETWEEN ? AND ? " |
|
|
|
+ "OR DATE(att.oddatetime) BETWEEN ? AND ?) " |
|
|
|
+ "LEFT JOIN park_details pd ON et.park_id = pd.park_id " |
|
|
|
+ "WHERE et.isactive = 1 AND et.emp_type = 'Park' AND pd.park_id != '' " |
|
|
|
+ "GROUP BY pd.region_id " |
|
|
|
+ ") " |
|
|
|
+ "SELECT cd.region_id, " |
|
|
|
+ "CASE WHEN cd.region_id = 1 THEN 'North Zone' " |
|
|
|
+ "WHEN cd.region_id = 2 THEN 'Central Zone' " |
|
|
|
+ "WHEN cd.region_id = 3 THEN 'South Zone' END AS ZoneName, " |
|
|
|
+ "cd.total_count AS totalCount, " |
|
|
|
+ "cd.facial_registered_count AS facialRegisteredCount, " |
|
|
|
+ "cd.present_od_count AS presentOdCount, " |
|
|
|
+ "CASE WHEN cd.total_count > 0 " |
|
|
|
+ "THEN ROUND((CAST(cd.facial_registered_count AS DECIMAL) / cd.total_count) * 100, 2) " |
|
|
|
+ "ELSE 0 END AS facialPercentage, " |
|
|
|
+ "CASE WHEN cd.facial_registered_count > 0 " |
|
|
|
+ "THEN ROUND((CAST(cd.present_od_count AS DECIMAL) / cd.facial_registered_count) * 100, 2) " |
|
|
|
+ "ELSE 0 END AS presentPercentage " |
|
|
|
+ "FROM count_data cd " |
|
|
|
+ "ORDER BY cd.region_id"; |
|
|
|
|
|
|
|
return jdbcTemplate.queryForList(sql, new Object[] { |
|
|
|
fromDateFormatted, toDateFormatted, |
|
|
|
fromDateFormatted, toDateFormatted }); |
|
|
|
String sql = "WITH count_data AS ( " |
|
|
|
+ "SELECT pd.region_id, " |
|
|
|
+ "COUNT(et.enrollment_id) AS total_count, " |
|
|
|
+ "SUM(CASE WHEN et.facial_attendance = 1 THEN 1 ELSE 0 END) AS facial_registered_count, " |
|
|
|
+ "SUM(CASE WHEN att.indatetime IS NOT NULL OR att.oddatetime IS NOT NULL THEN 1 ELSE 0 END) AS present_od_count " |
|
|
|
+ "FROM enrollment_table et " |
|
|
|
+ "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " |
|
|
|
+ "AND (DATE(att.indatetime) BETWEEN ? AND ? " |
|
|
|
+ "OR DATE(att.oddatetime) BETWEEN ? AND ?) " |
|
|
|
+ "LEFT JOIN park_details pd ON et.park_id = pd.park_id " |
|
|
|
+ "WHERE et.isactive = 1 AND et.emp_type = 'Park' AND pd.park_id != '' " |
|
|
|
+ "GROUP BY pd.region_id " |
|
|
|
+ ") " |
|
|
|
+ "SELECT cd.region_id, " |
|
|
|
+ "CASE WHEN cd.region_id = 1 THEN 'North Zone' " |
|
|
|
+ "WHEN cd.region_id = 2 THEN 'Central Zone' " |
|
|
|
+ "WHEN cd.region_id = 3 THEN 'South Zone' END AS ZoneName, " |
|
|
|
+ "cd.total_count AS totalCount, " |
|
|
|
+ "cd.facial_registered_count AS facialRegisteredCount, " |
|
|
|
+ "cd.present_od_count AS presentOdCount, " |
|
|
|
+ "CASE WHEN cd.total_count > 0 " |
|
|
|
+ "THEN ROUND((CAST(cd.facial_registered_count AS DECIMAL) / cd.total_count) * 100, 2) " |
|
|
|
+ "ELSE 0 END AS facialPercentage, " |
|
|
|
+ "CASE WHEN cd.facial_registered_count > 0 " |
|
|
|
+ "THEN ROUND((CAST(cd.present_od_count AS DECIMAL) / cd.facial_registered_count) * 100, 2) " |
|
|
|
+ "ELSE 0 END AS presentPercentage " |
|
|
|
+ "FROM count_data cd " |
|
|
|
+ "ORDER BY cd.region_id"; |
|
|
|
|
|
|
|
return jdbcTemplate.queryForList(sql, new Object[] { |
|
|
|
fromDateFormatted, toDateFormatted, |
|
|
|
fromDateFormatted, toDateFormatted }); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error( |
|
|
|
"Method: getZoneWisePercentage | Parameters: fromDateStr={}, toDateStr={} | Date: {} | Exception: {} - {}", |
|
|
|
fromDateStr, toDateStr, LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); |
|
|
|
return Collections.emptyList(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public List<Map<String, Object>> getZoneSummary(String empType, String fromDateStr, String toDateStr) { |
|
|
|
LocalDate fromDate; |
|
|
|
LocalDate toDate; |
|
|
|
try { |
|
|
|
LocalDate fromDate; |
|
|
|
LocalDate toDate; |
|
|
|
|
|
|
|
if (fromDateStr == null || fromDateStr.trim().isEmpty()) { |
|
|
|
fromDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
if (fromDateStr == null || fromDateStr.trim().isEmpty()) { |
|
|
|
fromDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
if (toDateStr == null || toDateStr.trim().isEmpty()) { |
|
|
|
toDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
if (toDateStr == null || toDateStr.trim().isEmpty()) { |
|
|
|
toDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); |
|
|
|
String fromDateTime = fromDate + " 00:00:00"; |
|
|
|
String toDateTime = toDate + " 23:59:59"; |
|
|
|
|
|
|
|
System.out.println("EmpType: " + empType + ", From: " + fromDateTime + ", To: " + toDateTime); |
|
|
|
|
|
|
|
String sql = "WITH facial_data AS ( " |
|
|
|
+ "SELECT zone, " |
|
|
|
+ "SUM(CASE WHEN facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " |
|
|
|
+ "SUM(CASE WHEN facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " |
|
|
|
+ "FROM enrollment_table " |
|
|
|
+ "WHERE isactive = 1 AND isdelete = 0 AND emp_type = ? AND zone != 0 " |
|
|
|
+ "GROUP BY zone " |
|
|
|
+ ") " |
|
|
|
+ "SELECT et.zone, " |
|
|
|
+ "COUNT(DISTINCT et.enrollment_id) AS TotalCount, " |
|
|
|
+ "COALESCE(fd.facialRegistered, 0) AS facialRegistered, " |
|
|
|
+ "COALESCE(fd.facialNotRegistered, 0) AS facialNotRegistered, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.indatetime >= ? AND att.indatetime <= ? THEN att.enrollment_id END) AS AttendanceMarked, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.oddatetime >= ? AND att.oddatetime <= ? THEN att.enrollment_id END) AS ODCount, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.leavedatetime >= ? AND att.leavedatetime <= ? THEN att.enrollment_id END) AS LeaveCount, " |
|
|
|
+ "COUNT(distinct et.incharge_id) AS SupervisorCount " |
|
|
|
+ "FROM enrollment_table et " |
|
|
|
+ "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " |
|
|
|
+ "LEFT JOIN facial_data fd ON et.zone = fd.zone " |
|
|
|
+ "LEFT JOIN park_details pd ON et.incharge_id = pd.supervisor_id AND pd.is_active = 1 AND pd.is_delete = 0 " |
|
|
|
+ "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 " |
|
|
|
+ "GROUP BY et.zone, fd.facialRegistered, fd.facialNotRegistered " |
|
|
|
+ "ORDER BY et.zone"; |
|
|
|
|
|
|
|
return jdbcTemplate.queryForList(sql, new Object[] { empType, fromDateTime, toDateTime, fromDateTime, |
|
|
|
toDateTime, fromDateTime, toDateTime, empType }); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error( |
|
|
|
"Method: getZoneSummary | Parameters: empType={}, fromDateStr={}, toDateStr={} | Date: {} | Exception: {} - {}", |
|
|
|
empType, fromDateStr, toDateStr, LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); |
|
|
|
return Collections.emptyList(); |
|
|
|
} |
|
|
|
|
|
|
|
String fromDateTime = fromDate + " 00:00:00"; |
|
|
|
String toDateTime = toDate + " 23:59:59"; |
|
|
|
|
|
|
|
System.out.println("EmpType: " + empType + ", From: " + fromDateTime + ", To: " + toDateTime); |
|
|
|
|
|
|
|
String sql = "WITH facial_data AS ( " |
|
|
|
+ "SELECT zone, " |
|
|
|
+ "SUM(CASE WHEN facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " |
|
|
|
+ "SUM(CASE WHEN facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " |
|
|
|
+ "FROM enrollment_table " |
|
|
|
+ "WHERE isactive = 1 AND isdelete = 0 AND emp_type = ? AND zone != 0 " |
|
|
|
+ "GROUP BY zone " |
|
|
|
+ ") " |
|
|
|
+ "SELECT et.zone, " |
|
|
|
+ "COUNT(DISTINCT et.enrollment_id) AS TotalCount, " |
|
|
|
+ "COALESCE(fd.facialRegistered, 0) AS facialRegistered, " |
|
|
|
+ "COALESCE(fd.facialNotRegistered, 0) AS facialNotRegistered, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.indatetime >= ? AND att.indatetime <= ? THEN att.enrollment_id END) AS AttendanceMarked, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.oddatetime >= ? AND att.oddatetime <= ? THEN att.enrollment_id END) AS ODCount, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.leavedatetime >= ? AND att.leavedatetime <= ? THEN att.enrollment_id END) AS LeaveCount, " |
|
|
|
+ "COUNT(distinct et.incharge_id) AS SupervisorCount " |
|
|
|
+ "FROM enrollment_table et " |
|
|
|
+ "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " |
|
|
|
+ "LEFT JOIN facial_data fd ON et.zone = fd.zone " |
|
|
|
+ "LEFT JOIN park_details pd ON et.incharge_id = pd.supervisor_id AND pd.is_active = 1 AND pd.is_delete = 0 " |
|
|
|
+ "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 " |
|
|
|
+ "GROUP BY et.zone, fd.facialRegistered, fd.facialNotRegistered " |
|
|
|
+ "ORDER BY et.zone"; |
|
|
|
|
|
|
|
return jdbcTemplate.queryForList(sql, new Object[] { empType, fromDateTime, toDateTime, fromDateTime, |
|
|
|
toDateTime, fromDateTime, toDateTime, empType }); |
|
|
|
} |
|
|
|
|
|
|
|
public List<Map<String, Object>> getDetailedList(String empType, String category, String fromDateStr, |
|
|
|
String toDateStr, Integer zone, String parkName) { |
|
|
|
LocalDate fromDate; |
|
|
|
LocalDate toDate; |
|
|
|
|
|
|
|
if (fromDateStr == null || fromDateStr.trim().isEmpty()) { |
|
|
|
fromDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
if (toDateStr == null || toDateStr.trim().isEmpty()) { |
|
|
|
toDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
String fromDateTime = fromDate + " 00:00:00"; |
|
|
|
String toDateTime = toDate + " 23:59:59"; |
|
|
|
|
|
|
|
String dateColumn; |
|
|
|
String filterDateColumn; |
|
|
|
|
|
|
|
if (category != null && category.equalsIgnoreCase("notmarked")) { |
|
|
|
dateColumn = "att.indatetime"; |
|
|
|
filterDateColumn = "att.indatetime"; |
|
|
|
|
|
|
|
String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, " |
|
|
|
+ "COALESCE(pd.park_name, '') AS park_name, et.park_id, emp.image as image " |
|
|
|
+ " FROM enrollment_table et " |
|
|
|
+ " LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " |
|
|
|
+ " LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " |
|
|
|
+ " WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 AND et.facial_attendance = 1 " |
|
|
|
+ " AND et.enrollment_id NOT IN (SELECT enrollment_id FROM attendance WHERE date(indatetime) BETWEEN ? AND ? " |
|
|
|
+ " OR date(oddatetime) BETWEEN ? AND ? OR date(leavedatetime) BETWEEN ? AND ?)"; |
|
|
|
java.util.List<Object> params = new java.util.ArrayList<>(); |
|
|
|
params.add(empType); |
|
|
|
params.add(fromDate); |
|
|
|
params.add(toDate); |
|
|
|
params.add(fromDate); |
|
|
|
params.add(toDate); |
|
|
|
params.add(fromDate); |
|
|
|
params.add(toDate); |
|
|
|
|
|
|
|
if (zone != null) { |
|
|
|
sql += " AND et.zone = ? "; |
|
|
|
params.add(zone); |
|
|
|
try { |
|
|
|
LocalDate fromDate; |
|
|
|
LocalDate toDate; |
|
|
|
|
|
|
|
if (fromDateStr == null || fromDateStr.trim().isEmpty()) { |
|
|
|
fromDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
if (parkName != null && !parkName.isEmpty() && !parkName.equals("-")) { |
|
|
|
sql += " AND et.park_id = ? "; |
|
|
|
params.add(parkName); |
|
|
|
if (toDateStr == null || toDateStr.trim().isEmpty()) { |
|
|
|
toDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
// sql += " order by " + dateColumn + " desc "; |
|
|
|
|
|
|
|
System.out.println("EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " |
|
|
|
+ toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); |
|
|
|
return jdbcTemplate.queryForList(sql, params.toArray()); |
|
|
|
} else if (category != null && category.equals("notregistered")) { |
|
|
|
|
|
|
|
String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, " |
|
|
|
+ "COALESCE(pd.park_name, '') AS park_name, et.park_id, emp.image as image " |
|
|
|
+ " FROM enrollment_table et " |
|
|
|
+ " LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " |
|
|
|
+ " LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " |
|
|
|
+ " WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 AND facial_attendance = 0 "; |
|
|
|
java.util.List<Object> params = new java.util.ArrayList<>(); |
|
|
|
params.add(empType); |
|
|
|
|
|
|
|
if (zone != null) { |
|
|
|
sql += " AND et.zone = ? "; |
|
|
|
String fromDateTime = fromDate + " 00:00:00"; |
|
|
|
String toDateTime = toDate + " 23:59:59"; |
|
|
|
|
|
|
|
String dateColumn; |
|
|
|
String filterDateColumn; |
|
|
|
|
|
|
|
if (category != null && category.equalsIgnoreCase("notmarked")) { |
|
|
|
dateColumn = "att.indatetime"; |
|
|
|
filterDateColumn = "att.indatetime"; |
|
|
|
|
|
|
|
String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, " |
|
|
|
+ "COALESCE(pd.park_name, '') AS park_name, et.park_id, emp.image as image " |
|
|
|
+ " FROM enrollment_table et " |
|
|
|
+ " LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " |
|
|
|
+ " LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " |
|
|
|
+ " WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 AND et.facial_attendance = 1 " |
|
|
|
+ " AND et.enrollment_id NOT IN (SELECT enrollment_id FROM attendance WHERE date(indatetime) BETWEEN ? AND ? " |
|
|
|
+ " OR date(oddatetime) BETWEEN ? AND ? OR date(leavedatetime) BETWEEN ? AND ?)"; |
|
|
|
java.util.List<Object> params = new java.util.ArrayList<>(); |
|
|
|
params.add(empType); |
|
|
|
params.add(fromDate); |
|
|
|
params.add(toDate); |
|
|
|
params.add(fromDate); |
|
|
|
params.add(toDate); |
|
|
|
params.add(fromDate); |
|
|
|
params.add(toDate); |
|
|
|
|
|
|
|
if (zone != null) { |
|
|
|
sql += " AND et.zone = ? "; |
|
|
|
params.add(zone); |
|
|
|
} |
|
|
|
|
|
|
|
if (parkName != null && !parkName.isEmpty() && !parkName.equals("-")) { |
|
|
|
sql += " AND et.park_id = ? "; |
|
|
|
params.add(parkName); |
|
|
|
} |
|
|
|
|
|
|
|
// sql += " order by " + dateColumn + " desc "; |
|
|
|
|
|
|
|
System.out.println( |
|
|
|
"EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " |
|
|
|
+ toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); |
|
|
|
return jdbcTemplate.queryForList(sql, params.toArray()); |
|
|
|
} else if (category != null && category.equals("notregistered")) { |
|
|
|
|
|
|
|
String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, " |
|
|
|
+ "COALESCE(pd.park_name, '') AS park_name, et.park_id, emp.image as image " |
|
|
|
+ " FROM enrollment_table et " |
|
|
|
+ " LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " |
|
|
|
+ " LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " |
|
|
|
+ " WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 AND facial_attendance = 0 "; |
|
|
|
java.util.List<Object> params = new java.util.ArrayList<>(); |
|
|
|
params.add(empType); |
|
|
|
|
|
|
|
if (zone != null) { |
|
|
|
sql += " AND et.zone = ? "; |
|
|
|
params.add(zone); |
|
|
|
} |
|
|
|
|
|
|
|
if (parkName != null && !parkName.isEmpty() && !parkName.equals("-")) { |
|
|
|
sql += " AND et.park_id = ? "; |
|
|
|
params.add(parkName); |
|
|
|
} |
|
|
|
|
|
|
|
// sql += " order by " + dateColumn + " desc "; |
|
|
|
|
|
|
|
System.out.println( |
|
|
|
"EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " |
|
|
|
+ toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); |
|
|
|
return jdbcTemplate.queryForList(sql, params.toArray()); |
|
|
|
|
|
|
|
} else if (category != null && category.equalsIgnoreCase("supervisor")) { |
|
|
|
|
|
|
|
// String sql = "SELECT et.enrollment_id, et.name, et.designation, |
|
|
|
// et.department, et.incharge_name, et.incharge_phoneno, emp.image as image " |
|
|
|
// + "FROM enrollment_table et " |
|
|
|
// + "LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " |
|
|
|
// + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone |
|
|
|
// != 0 " |
|
|
|
// + "AND et.enrollment_id IN (SELECT supervisor_id FROM park_details WHERE |
|
|
|
// is_active = 1 AND is_delete = 0) "; |
|
|
|
String sql = "SELECT pd.supervisor_id, pd.supervisor_name as name, pd.supervisor_designation AS designation, " |
|
|
|
+ |
|
|
|
" et.department, et.incharge_name, et.incharge_phoneno " + |
|
|
|
"FROM ( " + |
|
|
|
" SELECT DISTINCT supervisor_id, supervisor_name, supervisor_designation " + |
|
|
|
" FROM park_details " + |
|
|
|
" WHERE is_active = 1 AND is_delete = 0 AND zone = ? " + |
|
|
|
") pd " + |
|
|
|
"LEFT JOIN ( " + |
|
|
|
" SELECT DISTINCT incharge_id, department, incharge_name, incharge_phoneno " + |
|
|
|
" FROM enrollment_table " + |
|
|
|
" WHERE isactive = 1 AND isdelete = 0 and emp_type = ? " + |
|
|
|
") et ON pd.supervisor_id = et.incharge_id"; |
|
|
|
java.util.List<Object> params = new java.util.ArrayList<>(); |
|
|
|
params.add(zone); |
|
|
|
params.add(empType); |
|
|
|
|
|
|
|
// if (zone != null) { |
|
|
|
// sql += " AND et.zone = ? "; |
|
|
|
// params.add(zone); |
|
|
|
// } |
|
|
|
|
|
|
|
// sql += " ORDER BY et.name "; |
|
|
|
|
|
|
|
System.out.println("Supervisor - EmpType: " + empType + ", From: " + fromDateTime + ", To: " |
|
|
|
+ toDateTime + ", Zone: " + zone); |
|
|
|
return jdbcTemplate.queryForList(sql, params.toArray()); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
switch (category == null ? "present" : category.toLowerCase()) { |
|
|
|
case "od": |
|
|
|
dateColumn = "att.oddatetime"; |
|
|
|
filterDateColumn = "att.oddatetime"; |
|
|
|
break; |
|
|
|
case "leave": |
|
|
|
dateColumn = "att.leavedatetime"; |
|
|
|
filterDateColumn = "att.leavedatetime"; |
|
|
|
break; |
|
|
|
default: |
|
|
|
dateColumn = "att.indatetime"; |
|
|
|
filterDateColumn = "att.indatetime"; |
|
|
|
} |
|
|
|
|
|
|
|
String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, et.emp_id, " |
|
|
|
+ "COALESCE(pd.park_name, '') AS park_name, et.park_id, " |
|
|
|
+ "IFNULL(att.appversion,'') as appversion, IFNULL(att.apptype,'') as apptype, IFNULL(att.location,'') as location, " |
|
|
|
+ "DATE_FORMAT(att.indatetime, '%d-%m-%Y %h:%i %p') as intime, att.inphoto as inphoto, att.inby, " |
|
|
|
+ "DATE_FORMAT(att.outdatetime, '%d-%m-%Y %h:%i %p') as outtime, att.outphoto as outphoto, att.outby, " |
|
|
|
+ "DATE_FORMAT(att.oddatetime, '%d-%m-%Y %h:%i %p') as odtime, att.odby, et.zone, " |
|
|
|
+ "DATE_FORMAT(att.leavedatetime, '%d-%m-%Y %h:%i %p') as leavedatetime, att.leaveby " |
|
|
|
+ "FROM enrollment_table et " |
|
|
|
+ "LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " |
|
|
|
+ "INNER JOIN attendance att ON et.enrollment_id = att.enrollment_id " |
|
|
|
+ " AND " + filterDateColumn + " >= ? AND " + filterDateColumn + " <= ? " |
|
|
|
+ "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 " |
|
|
|
+ " AND " + filterDateColumn + " IS NOT NULL "; |
|
|
|
|
|
|
|
java.util.List<Object> params = new java.util.ArrayList<>(); |
|
|
|
params.add(fromDateTime); |
|
|
|
params.add(toDateTime); |
|
|
|
params.add(empType); |
|
|
|
|
|
|
|
if (zone != null) { |
|
|
|
sql += " AND et.zone = ? "; |
|
|
|
params.add(zone); |
|
|
|
} |
|
|
|
|
|
|
|
if (parkName != null && !parkName.isEmpty()) { |
|
|
|
sql += " AND et.park_id = ? "; |
|
|
|
params.add(parkName); |
|
|
|
} |
|
|
|
|
|
|
|
sql += " order by " + dateColumn + " desc "; |
|
|
|
|
|
|
|
System.out.println( |
|
|
|
"EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " |
|
|
|
+ toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); |
|
|
|
return jdbcTemplate.queryForList(sql, params.toArray()); |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error( |
|
|
|
"Method: getDetailedList | Parameters: empType={}, category={}, fromDateStr={}, toDateStr={}, zone={}, parkName={} | Date: {} | Exception: {} - {}", |
|
|
|
empType, category, fromDateStr, toDateStr, zone, parkName, LocalDateTime.now(), |
|
|
|
e.getClass().getName(), e.getMessage(), e); |
|
|
|
return Collections.emptyList(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (parkName != null && !parkName.isEmpty() && !parkName.equals("-")) { |
|
|
|
sql += " AND et.park_id = ? "; |
|
|
|
params.add(parkName); |
|
|
|
public List<Map<String, Object>> getParkWiseSummary(String fromDateStr, String toDateStr, Integer zone) { |
|
|
|
try { |
|
|
|
LocalDate fromDate; |
|
|
|
LocalDate toDate; |
|
|
|
|
|
|
|
if (fromDateStr == null || fromDateStr.trim().isEmpty()) { |
|
|
|
fromDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
// sql += " order by " + dateColumn + " desc "; |
|
|
|
|
|
|
|
System.out.println("EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " |
|
|
|
+ toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); |
|
|
|
return jdbcTemplate.queryForList(sql, params.toArray()); |
|
|
|
|
|
|
|
} else if (category != null && category.equalsIgnoreCase("supervisor")) { |
|
|
|
|
|
|
|
// String sql = "SELECT et.enrollment_id, et.name, et.designation, |
|
|
|
// et.department, et.incharge_name, et.incharge_phoneno, emp.image as image " |
|
|
|
// + "FROM enrollment_table et " |
|
|
|
// + "LEFT JOIN gccfacialdb.employees emp ON et.enrollment_id = emp.employeeid " |
|
|
|
// + "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone |
|
|
|
// != 0 " |
|
|
|
// + "AND et.enrollment_id IN (SELECT supervisor_id FROM park_details WHERE |
|
|
|
// is_active = 1 AND is_delete = 0) "; |
|
|
|
String sql = "SELECT pd.supervisor_id, pd.supervisor_name as name, pd.supervisor_designation AS designation, " |
|
|
|
+ |
|
|
|
" et.department, et.incharge_name, et.incharge_phoneno " + |
|
|
|
"FROM ( " + |
|
|
|
" SELECT DISTINCT supervisor_id, supervisor_name, supervisor_designation " + |
|
|
|
" FROM park_details " + |
|
|
|
" WHERE is_active = 1 AND is_delete = 0 AND zone = ? " + |
|
|
|
") pd " + |
|
|
|
"LEFT JOIN ( " + |
|
|
|
" SELECT DISTINCT incharge_id, department, incharge_name, incharge_phoneno " + |
|
|
|
" FROM enrollment_table " + |
|
|
|
" WHERE isactive = 1 AND isdelete = 0 and emp_type = ? " + |
|
|
|
") et ON pd.supervisor_id = et.incharge_id"; |
|
|
|
java.util.List<Object> params = new java.util.ArrayList<>(); |
|
|
|
params.add(zone); |
|
|
|
params.add(empType); |
|
|
|
|
|
|
|
// if (zone != null) { |
|
|
|
// sql += " AND et.zone = ? "; |
|
|
|
// params.add(zone); |
|
|
|
// } |
|
|
|
|
|
|
|
// sql += " ORDER BY et.name "; |
|
|
|
|
|
|
|
System.out.println("Supervisor - EmpType: " + empType + ", From: " + fromDateTime + ", To: " |
|
|
|
+ toDateTime + ", Zone: " + zone); |
|
|
|
return jdbcTemplate.queryForList(sql, params.toArray()); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
switch (category == null ? "present" : category.toLowerCase()) { |
|
|
|
case "od": |
|
|
|
dateColumn = "att.oddatetime"; |
|
|
|
filterDateColumn = "att.oddatetime"; |
|
|
|
break; |
|
|
|
case "leave": |
|
|
|
dateColumn = "att.leavedatetime"; |
|
|
|
filterDateColumn = "att.leavedatetime"; |
|
|
|
break; |
|
|
|
default: |
|
|
|
dateColumn = "att.indatetime"; |
|
|
|
filterDateColumn = "att.indatetime"; |
|
|
|
if (toDateStr == null || toDateStr.trim().isEmpty()) { |
|
|
|
toDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
String sql = "SELECT et.enrollment_id, et.name, et.designation, et.department, et.incharge_name, et.incharge_phoneno, et.emp_id, " |
|
|
|
+ "COALESCE(pd.park_name, '') AS park_name, et.park_id, " |
|
|
|
+ "IFNULL(att.appversion,'') as appversion, IFNULL(att.apptype,'') as apptype, IFNULL(att.location,'') as location, " |
|
|
|
+ "DATE_FORMAT(att.indatetime, '%d-%m-%Y %h:%i %p') as intime, att.inphoto as inphoto, att.inby, " |
|
|
|
+ "DATE_FORMAT(att.outdatetime, '%d-%m-%Y %h:%i %p') as outtime, att.outphoto as outphoto, att.outby, " |
|
|
|
+ "DATE_FORMAT(att.oddatetime, '%d-%m-%Y %h:%i %p') as odtime, att.odby, et.zone, " |
|
|
|
+ "DATE_FORMAT(att.leavedatetime, '%d-%m-%Y %h:%i %p') as leavedatetime, att.leaveby " |
|
|
|
String fromDateTime = fromDate + " 00:00:00"; |
|
|
|
String toDateTime = toDate + " 23:59:59"; |
|
|
|
|
|
|
|
System.out.println("Zone: " + zone + ", From: " + fromDateTime + ", To: " + toDateTime); |
|
|
|
|
|
|
|
String sql = "WITH facial_data AS ( " |
|
|
|
+ "SELECT et2.park_id, " |
|
|
|
+ "SUM(CASE WHEN et2.facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " |
|
|
|
+ "SUM(CASE WHEN et2.facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " |
|
|
|
+ "FROM enrollment_table et2 " |
|
|
|
+ "WHERE et2.isactive = 1 AND et2.isdelete = 0 AND et2.emp_type = 'Park' AND et2.zone = ? " |
|
|
|
+ "GROUP BY et2.park_id " |
|
|
|
+ ") " |
|
|
|
+ "SELECT et.park_id, COALESCE(pd.park_name, '') AS park_name, " |
|
|
|
+ "COUNT(DISTINCT et.enrollment_id) AS TotalCount, " |
|
|
|
+ "COALESCE(pd.supervisor_name, '') AS supervisor_name, COALESCE(pd.supervisor_mobile, '') AS supervisor_mobile, " |
|
|
|
+ "COALESCE(fd.facialRegistered, 0) AS facialRegistered, COALESCE(fd.facialNotRegistered, 0) AS facialNotRegistered, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.indatetime >= ? AND att.indatetime <= ? THEN att.enrollment_id END) AS AttendanceMarked, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.oddatetime >= ? AND att.oddatetime <= ? THEN att.enrollment_id END) AS ODCount, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.leavedatetime >= ? AND att.leavedatetime <= ? THEN att.enrollment_id END) AS LeaveCount, " |
|
|
|
+ "COUNT(distinct et.incharge_id) AS SupervisorCount " |
|
|
|
+ "FROM enrollment_table et " |
|
|
|
+ "LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " |
|
|
|
+ "INNER JOIN attendance att ON et.enrollment_id = att.enrollment_id " |
|
|
|
+ " AND " + filterDateColumn + " >= ? AND " + filterDateColumn + " <= ? " |
|
|
|
+ "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = ? AND et.zone != 0 " |
|
|
|
+ " AND " + filterDateColumn + " IS NOT NULL "; |
|
|
|
|
|
|
|
java.util.List<Object> params = new java.util.ArrayList<>(); |
|
|
|
params.add(fromDateTime); |
|
|
|
params.add(toDateTime); |
|
|
|
params.add(empType); |
|
|
|
|
|
|
|
if (zone != null) { |
|
|
|
sql += " AND et.zone = ? "; |
|
|
|
params.add(zone); |
|
|
|
} |
|
|
|
|
|
|
|
if (parkName != null && !parkName.isEmpty()) { |
|
|
|
sql += " AND et.park_id = ? "; |
|
|
|
params.add(parkName); |
|
|
|
} |
|
|
|
|
|
|
|
sql += " order by " + dateColumn + " desc "; |
|
|
|
|
|
|
|
System.out.println("EmpType: " + empType + ", Category: " + category + ", From: " + fromDateTime + ", To: " |
|
|
|
+ toDateTime + ", Zone: " + zone + ", ParkName: " + parkName); |
|
|
|
return jdbcTemplate.queryForList(sql, params.toArray()); |
|
|
|
+ "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " |
|
|
|
+ "LEFT JOIN facial_data fd ON et.park_id = fd.park_id " |
|
|
|
+ "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = 'Park' AND et.zone != 0 AND et.zone = ? " |
|
|
|
+ "GROUP BY et.park_id, pd.park_name, pd.supervisor_name, pd.supervisor_mobile, fd.facialRegistered, fd.facialNotRegistered " |
|
|
|
+ "ORDER BY pd.park_name"; |
|
|
|
|
|
|
|
return jdbcTemplate.queryForList(sql, |
|
|
|
new Object[] { zone, fromDateTime, toDateTime, fromDateTime, toDateTime, |
|
|
|
fromDateTime, toDateTime, zone }); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error( |
|
|
|
"Method: getParkWiseSummary | Parameters: fromDateStr={}, toDateStr={}, zone={} | Date: {} | Exception: {} - {}", |
|
|
|
fromDateStr, toDateStr, zone, LocalDateTime.now(), e.getClass().getName(), e.getMessage(), e); |
|
|
|
return Collections.emptyList(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public List<Map<String, Object>> getParkWiseSummary(String fromDateStr, String toDateStr, Integer zone) { |
|
|
|
LocalDate fromDate; |
|
|
|
LocalDate toDate; |
|
|
|
|
|
|
|
if (fromDateStr == null || fromDateStr.trim().isEmpty()) { |
|
|
|
fromDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
fromDate = LocalDate.parse(fromDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
if (toDateStr == null || toDateStr.trim().isEmpty()) { |
|
|
|
toDate = LocalDate.now(); |
|
|
|
} else { |
|
|
|
toDate = LocalDate.parse(toDateStr, INPUT_FORMAT); |
|
|
|
} |
|
|
|
|
|
|
|
String fromDateTime = fromDate + " 00:00:00"; |
|
|
|
String toDateTime = toDate + " 23:59:59"; |
|
|
|
|
|
|
|
System.out.println("Zone: " + zone + ", From: " + fromDateTime + ", To: " + toDateTime); |
|
|
|
|
|
|
|
String sql = "WITH facial_data AS ( " |
|
|
|
+ "SELECT et2.park_id, " |
|
|
|
+ "SUM(CASE WHEN et2.facial_attendance = 1 THEN 1 ELSE 0 END) AS facialRegistered, " |
|
|
|
+ "SUM(CASE WHEN et2.facial_attendance = 0 THEN 1 ELSE 0 END) AS facialNotRegistered " |
|
|
|
+ "FROM enrollment_table et2 " |
|
|
|
+ "WHERE et2.isactive = 1 AND et2.isdelete = 0 AND et2.emp_type = 'Park' AND et2.zone = ? " |
|
|
|
+ "GROUP BY et2.park_id " |
|
|
|
+ ") " |
|
|
|
+ "SELECT et.park_id, COALESCE(pd.park_name, '') AS park_name, " |
|
|
|
+ "COUNT(DISTINCT et.enrollment_id) AS TotalCount, " |
|
|
|
+ "COALESCE(pd.supervisor_name, '') AS supervisor_name, COALESCE(pd.supervisor_mobile, '') AS supervisor_mobile, " |
|
|
|
+ "COALESCE(fd.facialRegistered, 0) AS facialRegistered, COALESCE(fd.facialNotRegistered, 0) AS facialNotRegistered, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.indatetime >= ? AND att.indatetime <= ? THEN att.enrollment_id END) AS AttendanceMarked, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.oddatetime >= ? AND att.oddatetime <= ? THEN att.enrollment_id END) AS ODCount, " |
|
|
|
+ "COUNT(DISTINCT CASE WHEN att.leavedatetime >= ? AND att.leavedatetime <= ? THEN att.enrollment_id END) AS LeaveCount, " |
|
|
|
+ "COUNT(distinct et.incharge_id) AS SupervisorCount " |
|
|
|
+ "FROM enrollment_table et " |
|
|
|
+ "LEFT JOIN park_details pd ON et.park_id = pd.park_id AND pd.is_active = 1 AND pd.is_delete = 0 " |
|
|
|
+ "LEFT JOIN attendance att ON et.enrollment_id = att.enrollment_id " |
|
|
|
+ "LEFT JOIN facial_data fd ON et.park_id = fd.park_id " |
|
|
|
+ "WHERE et.isactive = 1 AND et.isdelete = 0 AND et.emp_type = 'Park' AND et.zone != 0 AND et.zone = ? " |
|
|
|
+ "GROUP BY et.park_id, pd.park_name, pd.supervisor_name, pd.supervisor_mobile, fd.facialRegistered, fd.facialNotRegistered " |
|
|
|
+ "ORDER BY pd.park_name"; |
|
|
|
|
|
|
|
return jdbcTemplate.queryForList(sql, new Object[] { zone, fromDateTime, toDateTime, fromDateTime, toDateTime, |
|
|
|
fromDateTime, toDateTime, zone }); |
|
|
|
} |
|
|
|
} |