Browse Source

Initial Commit

main
kanimozhi 9 months ago
commit
35ade71e83
  1. 9
      .gitignore
  2. 30
      gcc_officer_portal/HELP.md
  3. 25
      gcc_officer_portal/gccoffice.iml
  4. 837
      gcc_officer_portal/hs_err_pid26832.log
  5. 308
      gcc_officer_portal/mvnw
  6. 205
      gcc_officer_portal/mvnw.cmd
  7. 156
      gcc_officer_portal/pom.xml
  8. BIN
      gcc_officer_portal/src/.DS_Store
  9. BIN
      gcc_officer_portal/src/main/.DS_Store
  10. BIN
      gcc_officer_portal/src/main/java/.DS_Store
  11. BIN
      gcc_officer_portal/src/main/java/in/.DS_Store
  12. BIN
      gcc_officer_portal/src/main/java/in/gov/.DS_Store
  13. BIN
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/.DS_Store
  14. BIN
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/.DS_Store
  15. 26
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/GccOfficeApplication.java
  16. 151
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/controller/APIController.java
  17. 130
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/controller/MainController.java
  18. 1
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/controller/package-info.java
  19. 21
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/data/ComplaintType.java
  20. 1
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/data/package-info.java
  21. 1
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/entity/package-info.java
  22. 7
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/package-info.java
  23. 709
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/service/Petition.java
  24. 58
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/service/PetitionMaster.java
  25. 1
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/service/package-info.java
  26. 112
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/AgentAssignAPIController.java
  27. 320
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/AgentsAPIController.java
  28. 36
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/AttendanceAPIController.java
  29. 643
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/CampaignAPIController.java
  30. 29
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/CampaignDropdownApiController.java
  31. 100
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/CampaignReportAPIController.java
  32. 281
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/CategoryAPIController.java
  33. 219
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/MainController.java
  34. 26
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/WhatsappController.java
  35. 303
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/AddcategoryServices.java
  36. 214
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/AgentAssignService.java
  37. 665
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/AgentsService.java
  38. 116
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/AttendanceService.java
  39. 29
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/CampaignDropdownApiService.java
  40. 533
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/CampaignReportService.java
  41. 715
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/CampaignService.java
  42. 40
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/WhatsappMsgService.java
  43. BIN
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/.DS_Store
  44. 36
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/AttendanceApiController.java
  45. 71
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/AttendanceMainController.java
  46. 672
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ComplaintController.java
  47. 31
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ComplaintStatusMainController.java
  48. 278
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/DomesticWasteApiController.java
  49. 73
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/DomesticWasteMainController.java
  50. 85
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/FollowUpController.java
  51. 96
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/InprogresscallController.java
  52. 370
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/MainController.java
  53. 89
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/PublicFollowUpController.java
  54. 391
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAPIController.java
  55. 208
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAdminSettingsApiController.java
  56. 47
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAdminSettingsMainController.java
  57. 234
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAgentAssignAPIController.java
  58. 161
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAgentsAPIController.java
  59. 448
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcCallsController.java
  60. 38
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcPgrComplaintsMainController.java
  61. 68
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcTaskListAPIController.java
  62. 58
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ReportsMainController.java
  63. 563
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ScpApiController.java
  64. 55
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ScpMaincontroller.java
  65. 352
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/SocialMediaApiController.java
  66. 41
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/SocialMediaMainController.java
  67. 82
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/StatusCountController.java
  68. 27
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/WhatsappController.java
  69. 95
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/ComplaintService.java
  70. 308
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/DomesticWasteService.java
  71. 224
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/FollowUpService.java
  72. 102
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/InprogresscallService.java
  73. 52
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/PublicFollowUpService.java
  74. 123
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcAdminSettingService.java
  75. 1166
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcAgentAssignService.java
  76. 563
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcAgentsService.java
  77. 391
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcCallsService.java
  78. 357
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcService.java
  79. 291
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcTaskListService.java
  80. 361
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/ScpService.java
  81. 105
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/SocialMediaService.java
  82. 274
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/StatusCountService.java
  83. 48
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/WhatsappqaqcMsgService.java
  84. 174
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwaste/controller/DumpRegistrationAPIController.java
  85. 75
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwaste/controller/MainController.java
  86. 161
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwaste/service/OfficerService.java
  87. 40
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwaste/service/SMSService.java
  88. BIN
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/.DS_Store
  89. 111
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/controller/ApiController.java
  90. 142
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/controller/MainController.java
  91. 29
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/controller/WhatsappControllerCD.java
  92. 33
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/service/RegistrationService.java
  93. 41
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/service/WhatsappMsgService.java
  94. 58
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/controller/APIController.java
  95. 61
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/controller/MainController.java
  96. 1
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/controller/package-info.java
  97. 1
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/package-info.java
  98. 223
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/service/CircularMaster.java
  99. 1
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/service/package-info.java
  100. BIN
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/com_petition/.DS_Store

9
.gitignore

@ -0,0 +1,9 @@
gcc_officer_portal/.classpath
gcc_officer_portal/.DS_Store
/gcc_officer_portal/.idea
/gcc_officer_portal/.settings
gcc_officer_portal/.project
/gcc_officer_portal/bin
/gcc_officer_portal/.vscode
/gcc_officer_portal/gccoffice_uploads
/gcc_officer_portal/target

30
gcc_officer_portal/HELP.md

@ -0,0 +1,30 @@
# Read Me First
The following was discovered as part of building this project:
* The JVM level was changed from '1.8' to '17', review the [JDK Version Range](https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions#jdk-version-range) on the wiki for more details.
* The original package name 'in.gov.chennaicorporation.CM Dashboard2' is invalid and this project uses 'in.gov.chennaicorporation.CM.Dashboard2' instead.
# Getting Started
### Reference Documentation
For further reference, please consider the following sections:
* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.1.1/maven-plugin/reference/html/)
* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.1.1/maven-plugin/reference/html/#build-image)
* [Spring Security](https://docs.spring.io/spring-boot/docs/3.1.1/reference/htmlsingle/#web.security)
* [Thymeleaf](https://docs.spring.io/spring-boot/docs/3.1.1/reference/htmlsingle/#web.servlet.spring-mvc.template-engines)
* [Spring Web](https://docs.spring.io/spring-boot/docs/3.1.1/reference/htmlsingle/#web)
### Guides
The following guides illustrate how to use some features concretely:
* [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/)
* [Securing a Web Application](https://spring.io/guides/gs/securing-web/)
* [Spring Boot and OAuth2](https://spring.io/guides/tutorials/spring-boot-oauth2/)
* [Authenticating a User with LDAP](https://spring.io/guides/gs/authenticating-ldap/)
* [Handling Form Submission](https://spring.io/guides/gs/handling-form-submission/)
* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/)

25
gcc_officer_portal/gccoffice.iml

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="EclipseModuleManager">
<conelement value="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER" />
<src_description expected_position="0">
<src_folder value="file://$MODULE_DIR$/src/main/java" expected_position="0" />
<src_folder value="file://$MODULE_DIR$/src/main/resources" expected_position="1" />
<src_folder value="file://$MODULE_DIR$/src/test/java" expected_position="2" />
<src_folder value="file://$MODULE_DIR$/src/test/resources" expected_position="3" />
</src_description>
</component>
<component name="NewModuleRootManager">
<output url="file://$MODULE_DIR$/target/classes" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/resources" isTestSource="false" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="jdk" jdkName="JavaSE-17" jdkType="JavaSDK" />
<orderEntry type="library" name="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER" level="application" />
</component>
</module>

837
gcc_officer_portal/hs_err_pid26832.log

@ -0,0 +1,837 @@
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1048576 bytes. Error detail: AllocateHeap
# Possible reasons:
# The system is out of physical RAM or swap space
# This process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# JVM is running with Unscaled Compressed Oops mode in which the Java heap is
# placed in the first 4GB address space. The Java Heap base address is the
# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress
# to set the Java Heap base and to place the Java Heap above 4GB virtual address.
# This output file may be truncated or incomplete.
#
# Out of Memory Error (allocation.cpp:44), pid=26832, tid=20592
#
# JRE version: OpenJDK Runtime Environment Temurin-21.0.9+10 (21.0.9+10) (build 21.0.9+10-LTS)
# Java VM: OpenJDK 64-Bit Server VM Temurin-21.0.9+10 (21.0.9+10-LTS, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, parallel gc, windows-amd64)
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
--------------- S U M M A R Y ------------
Command Line: --add-modules=ALL-SYSTEM --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/sun.nio.fs=ALL-UNNAMED -Declipse.application=org.eclipse.jdt.ls.core.id1 -Dosgi.bundles.defaultStartLevel=4 -Declipse.product=org.eclipse.jdt.ls.core.product -Djava.import.generatesMetadataFilesAtProjectRoot=false -DDetectVMInstallationsJob.disabled=true -Dfile.encoding=utf8 -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m -Xlog:disable -javaagent:c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\lombok\lombok-1.18.39-4050.jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:\Users\prave\AppData\Roaming\Code\User\workspaceStorage\25fb85a1b34efdab544c011bc2bf6d24\redhat.java -Daether.dependencyCollector.impl=bf -Xms512m -Xmx2048m c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\server\plugins\org.eclipse.equinox.launcher_1.7.100.v20251111-0406.jar -configuration c:\Users\prave\AppData\Roaming\Code\User\globalStorage\redhat.java\1.51.0\config_win -data c:\Users\prave\AppData\Roaming\Code\User\workspaceStorage\25fb85a1b34efdab544c011bc2bf6d24\redhat.java\jdt_ws --pipe=\\.\pipe\lsp-d5fba1c1e6412e89965743a246dbdd77-sock
Host: 12th Gen Intel(R) Core(TM) i5-1235U, 12 cores, 15G, Windows 11 , 64 bit Build 26100 (10.0.26100.7623)
Time: Thu Jan 22 11:26:25 2026 India Standard Time elapsed time: 69020.358478 seconds (0d 19h 10m 20s)
--------------- T H R E A D ---------------
Current thread (0x00000230f45705e0): JavaThread "Attach Listener" daemon [_thread_in_vm, id=20592, stack(0x000000c78ea00000,0x000000c78eb00000) (1024K)]
Stack: [0x000000c78ea00000,0x000000c78eb00000]
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0x6d6e29]
V [jvm.dll+0x8b4b76]
V [jvm.dll+0x8b712e]
V [jvm.dll+0x8b7813]
V [jvm.dll+0x283d86]
V [jvm.dll+0xc1277]
V [jvm.dll+0x6d76d9]
V [jvm.dll+0x133466]
V [jvm.dll+0x3f7ea6]
V [jvm.dll+0x85e9ad]
V [jvm.dll+0x6d565d]
C [ucrtbase.dll+0x37b0]
C [KERNEL32.DLL+0x2e8d7]
C [ntdll.dll+0x8c53c]
--------------- P R O C E S S ---------------
Threads class SMR info:
_java_thread_list=0x00000230faca3ca0, length=39, elements={
0x0000023098908dc0, 0x00000230f45614b0, 0x00000230f4563420, 0x00000230f456e850,
0x00000230f45705e0, 0x00000230f45763e0, 0x00000230f457ec30, 0x00000230f458adc0,
0x00000230f458bab0, 0x00000230f47b9eb0, 0x00000230f48a9e90, 0x00000230f9527890,
0x00000230f97ca620, 0x00000230f96f2d90, 0x00000230f96f5910, 0x00000230f9b4fdb0,
0x00000230f9c46280, 0x00000230f9cdb360, 0x00000230f9cdb9f0, 0x00000230f9cdacd0,
0x00000230fabb76c0, 0x00000230fabb7030, 0x00000230fabb7d50, 0x00000230fabb83e0,
0x00000230fabb9100, 0x00000230fabb9790, 0x00000230fabb9e20, 0x00000230fabb69a0,
0x00000230fb6cead0, 0x00000230fb6cf160, 0x00000230fb6d1230, 0x00000230fb6d18c0,
0x00000230fb6ce440, 0x00000230fb6d0510, 0x00000230fb6d25e0, 0x00000230fb6d0ba0,
0x00000230fe9a2760, 0x00000230fce5b760, 0x00000230fce5a3b0
}
Java Threads: ( => current thread )
0x0000023098908dc0 JavaThread "main" [_thread_blocked, id=29784, stack(0x000000c78e300000,0x000000c78e400000) (1024K)]
0x00000230f45614b0 JavaThread "Reference Handler" daemon [_thread_blocked, id=3340, stack(0x000000c78e700000,0x000000c78e800000) (1024K)]
0x00000230f4563420 JavaThread "Finalizer" daemon [_thread_blocked, id=29684, stack(0x000000c78e800000,0x000000c78e900000) (1024K)]
0x00000230f456e850 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=29484, stack(0x000000c78e900000,0x000000c78ea00000) (1024K)]
=>0x00000230f45705e0 JavaThread "Attach Listener" daemon [_thread_in_vm, id=20592, stack(0x000000c78ea00000,0x000000c78eb00000) (1024K)]
0x00000230f45763e0 JavaThread "Service Thread" daemon [_thread_blocked, id=27276, stack(0x000000c78eb00000,0x000000c78ec00000) (1024K)]
0x00000230f457ec30 JavaThread "Monitor Deflation Thread" daemon [_thread_blocked, id=27608, stack(0x000000c78ec00000,0x000000c78ed00000) (1024K)]
0x00000230f458adc0 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=34740, stack(0x000000c78ed00000,0x000000c78ee00000) (1024K)]
0x00000230f458bab0 JavaThread "C1 CompilerThread0" daemon [_thread_blocked, id=24508, stack(0x000000c78ee00000,0x000000c78ef00000) (1024K)]
0x00000230f47b9eb0 JavaThread "Common-Cleaner" daemon [_thread_blocked, id=11336, stack(0x000000c78f000000,0x000000c78f100000) (1024K)]
0x00000230f48a9e90 JavaThread "Notification Thread" daemon [_thread_blocked, id=11316, stack(0x000000c78f100000,0x000000c78f200000) (1024K)]
0x00000230f9527890 JavaThread "Active Thread: Equinox Container: 1360559d-2ccf-4e7c-97d5-02e115a35c8d" [_thread_blocked, id=32484, stack(0x000000c78f200000,0x000000c78f300000) (1024K)]
0x00000230f97ca620 JavaThread "Refresh Thread: Equinox Container: 1360559d-2ccf-4e7c-97d5-02e115a35c8d" daemon [_thread_blocked, id=37444, stack(0x000000c78f300000,0x000000c78f400000) (1024K)]
0x00000230f96f2d90 JavaThread "Framework Event Dispatcher: Equinox Container: 1360559d-2ccf-4e7c-97d5-02e115a35c8d" daemon [_thread_blocked, id=17536, stack(0x000000c78f400000,0x000000c78f500000) (1024K)]
0x00000230f96f5910 JavaThread "Start Level: Equinox Container: 1360559d-2ccf-4e7c-97d5-02e115a35c8d" daemon [_thread_blocked, id=12892, stack(0x000000c78f500000,0x000000c78f600000) (1024K)]
0x00000230f9b4fdb0 JavaThread "Bundle File Closer" daemon [_thread_blocked, id=31452, stack(0x000000c78f600000,0x000000c78f700000) (1024K)]
0x00000230f9c46280 JavaThread "SCR Component Actor" daemon [_thread_blocked, id=34316, stack(0x000000c78f700000,0x000000c78f800000) (1024K)]
0x00000230f9cdb360 JavaThread "Worker-JM" [_thread_blocked, id=32188, stack(0x000000c78ef00000,0x000000c78f000000) (1024K)]
0x00000230f9cdb9f0 JavaThread "Java indexing" daemon [_thread_blocked, id=31624, stack(0x000000c790400000,0x000000c790500000) (1024K)]
0x00000230f9cdacd0 JavaThread "JNA Cleaner" daemon [_thread_blocked, id=36404, stack(0x000000c790800000,0x000000c790900000) (1024K)]
0x00000230fabb76c0 JavaThread "Thread-1" daemon [_thread_in_native, id=12596, stack(0x000000c790d00000,0x000000c790e00000) (1024K)]
0x00000230fabb7030 JavaThread "Thread-2" daemon [_thread_in_native, id=24072, stack(0x000000c790e00000,0x000000c790f00000) (1024K)]
0x00000230fabb7d50 JavaThread "Thread-3" daemon [_thread_in_native, id=14988, stack(0x000000c790f00000,0x000000c791000000) (1024K)]
0x00000230fabb83e0 JavaThread "Thread-4" daemon [_thread_in_native, id=31228, stack(0x000000c791000000,0x000000c791100000) (1024K)]
0x00000230fabb9100 JavaThread "Thread-5" daemon [_thread_in_native, id=29668, stack(0x000000c791100000,0x000000c791200000) (1024K)]
0x00000230fabb9790 JavaThread "Thread-6" daemon [_thread_in_native, id=35476, stack(0x000000c791200000,0x000000c791300000) (1024K)]
0x00000230fabb9e20 JavaThread "Thread-7" daemon [_thread_in_native, id=35760, stack(0x000000c791300000,0x000000c791400000) (1024K)]
0x00000230fabb69a0 JavaThread "Thread-8" daemon [_thread_in_native, id=6584, stack(0x000000c791400000,0x000000c791500000) (1024K)]
0x00000230fb6cead0 JavaThread "Thread-9" daemon [_thread_in_native, id=27284, stack(0x000000c791500000,0x000000c791600000) (1024K)]
0x00000230fb6cf160 JavaThread "Thread-10" daemon [_thread_in_native, id=16588, stack(0x000000c791600000,0x000000c791700000) (1024K)]
0x00000230fb6d1230 JavaThread "Thread-11" daemon [_thread_in_native, id=35392, stack(0x000000c791700000,0x000000c791800000) (1024K)]
0x00000230fb6d18c0 JavaThread "Thread-12" daemon [_thread_in_native, id=35996, stack(0x000000c791800000,0x000000c791900000) (1024K)]
0x00000230fb6ce440 JavaThread "Thread-13" daemon [_thread_in_native, id=29380, stack(0x000000c791900000,0x000000c791a00000) (1024K)]
0x00000230fb6d0510 JavaThread "pool-2-thread-1" [_thread_blocked, id=34476, stack(0x000000c791a00000,0x000000c791b00000) (1024K)]
0x00000230fb6d25e0 JavaThread "WorkspaceEventsHandler" [_thread_blocked, id=32308, stack(0x000000c791c00000,0x000000c791d00000) (1024K)]
0x00000230fb6d0ba0 JavaThread "pool-1-thread-1" [_thread_blocked, id=11900, stack(0x000000c791d00000,0x000000c791e00000) (1024K)]
0x00000230fe9a2760 JavaThread "Cleaner-0" daemon [_thread_blocked, id=31072, stack(0x000000c790600000,0x000000c790700000) (1024K)]
0x00000230fce5b760 JavaThread "Worker-10" [_thread_blocked, id=33584, stack(0x000000c790100000,0x000000c790200000) (1024K)]
0x00000230fce5a3b0 JavaThread "Worker-14" [_thread_blocked, id=26940, stack(0x000000c78e000000,0x000000c78e100000) (1024K)]
Total: 39
Other Threads:
0x000002309ad0e840 VMThread "VM Thread" [id=5504, stack(0x000000c78e600000,0x000000c78e700000) (1024K)]
0x000002309aadcb20 WatcherThread "VM Periodic Task Thread" [id=33820, stack(0x000000c78e500000,0x000000c78e600000) (1024K)]
0x000002309ac72c90 WorkerThread "GC Thread#0" [id=37872, stack(0x000000c78e400000,0x000000c78e500000) (1024K)]
0x00000230f9a1e5c0 WorkerThread "GC Thread#1" [id=32980, stack(0x000000c78f800000,0x000000c78f900000) (1024K)]
0x00000230f9cf7540 WorkerThread "GC Thread#2" [id=32124, stack(0x000000c78f900000,0x000000c78fa00000) (1024K)]
0x00000230f9e7dd70 WorkerThread "GC Thread#3" [id=22652, stack(0x000000c78fa00000,0x000000c78fb00000) (1024K)]
0x00000230f9e7e930 WorkerThread "GC Thread#4" [id=2664, stack(0x000000c78fb00000,0x000000c78fc00000) (1024K)]
0x00000230f9e7ecd0 WorkerThread "GC Thread#5" [id=30424, stack(0x000000c78fc00000,0x000000c78fd00000) (1024K)]
0x00000230f9ce0910 WorkerThread "GC Thread#6" [id=31488, stack(0x000000c78fd00000,0x000000c78fe00000) (1024K)]
0x00000230f9ce0cb0 WorkerThread "GC Thread#7" [id=37092, stack(0x000000c78fe00000,0x000000c78ff00000) (1024K)]
0x00000230f9e9d300 WorkerThread "GC Thread#8" [id=29804, stack(0x000000c78ff00000,0x000000c790000000) (1024K)]
0x00000230f9e9c0e0 WorkerThread "GC Thread#9" [id=33852, stack(0x000000c790000000,0x000000c790100000) (1024K)]
Total: 12
Threads with active compile tasks:
Total: 0
VM state: not at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread: None
Heap address: 0x0000000080000000, size: 2048 MB, Compressed Oops mode: 32-bit
CDS archive(s) mapped at: [0x00000230b2000000-0x00000230b2ba0000-0x00000230b2ba0000), size 12189696, SharedBaseAddress: 0x00000230b2000000, ArchiveRelocationMode: 1.
Compressed class space mapped at: 0x00000230b3000000-0x00000230f3000000, reserved size: 1073741824
Narrow klass base: 0x00000230b2000000, Narrow klass shift: 0, Narrow klass range: 0x100000000
GC Precious Log:
CardTable entry size: 512
CPUs: 12 total, 12 available
Memory: 16092M
Large Page Support: Disabled
NUMA Support: Disabled
Compressed Oops: Enabled (32-bit)
Alignments: Space 512K, Generation 512K, Heap 2M
Heap Min Capacity: 512M
Heap Initial Capacity: 512M
Heap Max Capacity: 2G
Pre-touch: Disabled
Parallel Workers: 10
Heap:
PSYoungGen total 4096K, used 321K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 2% used [0x00000000d5580000,0x00000000d5598740,0x00000000d5900000)
from space 512K, 43% used [0x00000000d5a00000,0x00000000d5a38000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462255K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c36be78,0x00000000b9b00000)
Metaspace used 90248K, committed 92160K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
Card table byte_map: [0x000002309a5f0000,0x000002309aa00000] _byte_map_base: 0x000002309a1f0000
Marking Bits: (ParMarkBitMap*) 0x00007ffbd2282460
Begin Bits: [0x00000230ad100000, 0x00000230af100000)
End Bits: [0x00000230af100000, 0x00000230b1100000)
Polling page: 0x0000023098ca0000
Metaspace:
Usage:
Non-class: 79.25 MB used.
Class: 8.88 MB used.
Both: 88.13 MB used.
Virtual space:
Non-class space: 128.00 MB reserved, 80.25 MB ( 63%) committed, 2 nodes.
Class space: 1.00 GB reserved, 9.75 MB ( <1%) committed, 1 nodes.
Both: 1.12 GB reserved, 90.00 MB ( 8%) committed.
Chunk freelists:
Non-Class: 15.32 MB
Class: 6.18 MB
Both: 21.50 MB
MaxMetaspaceSize: unlimited
CompressedClassSpaceSize: 1.00 GB
Initial GC threshold: 21.00 MB
Current GC threshold: 145.88 MB
CDS: on
- commit_granule_bytes: 65536.
- commit_granule_words: 8192.
- virtual_space_node_default_size: 8388608.
- enlarge_chunks_in_place: 1.
- use_allocation_guard: 0.
Internal statistics:
num_allocs_failed_limit: 9.
num_arena_births: 1724.
num_arena_deaths: 34.
num_vsnodes_births: 3.
num_vsnodes_deaths: 0.
num_space_committed: 1458.
num_space_uncommitted: 14.
num_chunks_returned_to_freelist: 138.
num_chunks_taken_from_freelist: 6138.
num_chunk_merges: 47.
num_chunk_splits: 3749.
num_chunks_enlarged: 2136.
num_inconsistent_stats: 0.
CodeHeap 'non-profiled nmethods': size=120000Kb used=26630Kb max_used=26630Kb free=93369Kb
bounds [0x00000230a5920000, 0x00000230a7330000, 0x00000230ace50000]
CodeHeap 'profiled nmethods': size=120000Kb used=48260Kb max_used=50444Kb free=71739Kb
bounds [0x000002309de50000, 0x00000230a0fa0000, 0x00000230a5380000]
CodeHeap 'non-nmethods': size=5760Kb used=1523Kb max_used=1614Kb free=4236Kb
bounds [0x00000230a5380000, 0x00000230a55f0000, 0x00000230a5920000]
CodeCache: size=245760Kb, used=76413Kb, max_used=78688Kb, free=169344Kb
total_blobs=20935, nmethods=20094, adapters=743, full_count=0
Compilation: enabled, stopped_count=0, restarted_count=0
Compilation events (20 events):
Event: 8962.924 Thread 0x00000230f458bab0 25341 ! 3 org.eclipse.osgi.container.ModuleDatabase::getTimestamp (25 bytes)
Event: 8962.929 Thread 0x00000230f458bab0 nmethod 25341 0x000002309fdb5710 code [0x000002309fdb5960, 0x000002309fdb62a8]
Event: 8972.371 Thread 0x00000230f458bab0 25342 ! 3 jdk.internal.ref.PhantomCleanable::isListEmpty (34 bytes)
Event: 8972.372 Thread 0x00000230f458bab0 nmethod 25342 0x000002309fdb5210 code [0x000002309fdb53c0, 0x000002309fdb5618]
Event: 8972.372 Thread 0x00000230f458bab0 25343 3 jdk.internal.misc.InnocuousThread::eraseThreadLocals (23 bytes)
Event: 8972.372 Thread 0x00000230f458bab0 nmethod 25343 0x000002309fdb4e90 code [0x000002309fdb5020, 0x000002309fdb5188]
Event: 9082.963 Thread 0x00000230f458bab0 25344 3 org.eclipse.osgi.storage.Storage::isReadOnly (10 bytes)
Event: 9082.964 Thread 0x00000230f458bab0 nmethod 25344 0x000002309fdb4a90 code [0x000002309fdb4c40, 0x000002309fdb4dc0]
Event: 9263.014 Thread 0x00000230f458bab0 25345 ! 3 org.eclipse.osgi.internal.framework.StorageSaver$StorageSaverTask::run (31 bytes)
Event: 9263.025 Thread 0x00000230f458bab0 nmethod 25345 0x000002309fdb4490 code [0x000002309fdb4660, 0x000002309fdb4900]
Event: 9263.025 Thread 0x00000230f458bab0 25346 ! 3 org.eclipse.osgi.storage.Storage::save (62 bytes)
Event: 9263.027 Thread 0x00000230f458bab0 nmethod 25346 0x000002309fd64f90 code [0x000002309fd65180, 0x000002309fd654f0]
Event: 9263.027 Thread 0x00000230f458bab0 25347 ! 3 org.eclipse.osgi.storage.Storage::save0 (246 bytes)
Event: 9263.035 Thread 0x00000230f458bab0 nmethod 25347 0x000002309fd60910 code [0x000002309fd60e20, 0x000002309fd63a08]
Event: 65357.865 Thread 0x00000230f458adc0 25348 ! 4 java.util.concurrent.locks.AbstractQueuedSynchronizer::tryInitializeHead (66 bytes)
Event: 65357.871 Thread 0x00000230f458adc0 nmethod 25348 0x00000230a7320e90 code [0x00000230a7321020, 0x00000230a73211d8]
Event: 68010.202 Thread 0x00000230f458adc0 25349 4 java.util.concurrent.TimeUnit::convert (73 bytes)
Event: 68010.211 Thread 0x00000230f458adc0 nmethod 25349 0x00000230a7321310 code [0x00000230a73214c0, 0x00000230a7321650]
Event: 68230.398 Thread 0x00000230f458adc0 25350 4 java.util.concurrent.ScheduledThreadPoolExecutor::canRunInCurrentRunState (61 bytes)
Event: 68230.417 Thread 0x00000230f458adc0 nmethod 25350 0x00000230a7321790 code [0x00000230a7321920, 0x00000230a73219e8]
GC Heap History (20 events):
Event: 1474.552 GC heap before
{Heap before GC invocations=1856 (full 5):
PSYoungGen total 4096K, used 3744K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 31% used [0x00000000d5a00000,0x00000000d5a28000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462167K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c355e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1474.554 GC heap after
{Heap after GC invocations=1856 (full 5):
PSYoungGen total 4096K, used 128K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 25% used [0x00000000d5980000,0x00000000d59a0000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462167K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c355e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1475.200 GC heap before
{Heap before GC invocations=1857 (full 5):
PSYoungGen total 4096K, used 3712K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 25% used [0x00000000d5980000,0x00000000d59a0000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462167K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c355e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1475.201 GC heap after
{Heap after GC invocations=1857 (full 5):
PSYoungGen total 4096K, used 128K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 25% used [0x00000000d5a00000,0x00000000d5a20000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462167K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c355e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1475.234 GC heap before
{Heap before GC invocations=1858 (full 5):
PSYoungGen total 4096K, used 3712K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 25% used [0x00000000d5a00000,0x00000000d5a20000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462167K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c355e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1475.236 GC heap after
{Heap after GC invocations=1858 (full 5):
PSYoungGen total 4096K, used 160K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 31% used [0x00000000d5980000,0x00000000d59a8000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462183K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c359e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1475.962 GC heap before
{Heap before GC invocations=1859 (full 5):
PSYoungGen total 4096K, used 3744K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 31% used [0x00000000d5980000,0x00000000d59a8000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462183K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c359e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1475.966 GC heap after
{Heap after GC invocations=1859 (full 5):
PSYoungGen total 4096K, used 160K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 31% used [0x00000000d5a00000,0x00000000d5a28000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462183K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c359e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1476.368 GC heap before
{Heap before GC invocations=1860 (full 5):
PSYoungGen total 4096K, used 3744K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 31% used [0x00000000d5a00000,0x00000000d5a28000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462183K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c359e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1476.370 GC heap after
{Heap after GC invocations=1860 (full 5):
PSYoungGen total 4096K, used 192K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 37% used [0x00000000d5980000,0x00000000d59b0000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462183K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c359e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1476.432 GC heap before
{Heap before GC invocations=1861 (full 5):
PSYoungGen total 4096K, used 3776K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 37% used [0x00000000d5980000,0x00000000d59b0000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462183K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c359e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1476.433 GC heap after
{Heap after GC invocations=1861 (full 5):
PSYoungGen total 4096K, used 160K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 31% used [0x00000000d5a00000,0x00000000d5a28000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462207K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c35fe78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1476.924 GC heap before
{Heap before GC invocations=1862 (full 5):
PSYoungGen total 4096K, used 3744K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 31% used [0x00000000d5a00000,0x00000000d5a28000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462207K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c35fe78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1476.925 GC heap after
{Heap after GC invocations=1862 (full 5):
PSYoungGen total 4096K, used 160K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 31% used [0x00000000d5980000,0x00000000d59a8000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462207K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c35fe78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1477.451 GC heap before
{Heap before GC invocations=1863 (full 5):
PSYoungGen total 4096K, used 3744K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 31% used [0x00000000d5980000,0x00000000d59a8000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462207K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c35fe78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1477.457 GC heap after
{Heap after GC invocations=1863 (full 5):
PSYoungGen total 4096K, used 192K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 37% used [0x00000000d5a00000,0x00000000d5a30000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462207K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c35fe78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1477.498 GC heap before
{Heap before GC invocations=1864 (full 5):
PSYoungGen total 4096K, used 3776K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 37% used [0x00000000d5a00000,0x00000000d5a30000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462207K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c35fe78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 1477.499 GC heap after
{Heap after GC invocations=1864 (full 5):
PSYoungGen total 4096K, used 64K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 12% used [0x00000000d5980000,0x00000000d5990000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462247K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c369e78,0x00000000b9b00000)
Metaspace used 90206K, committed 92096K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 68984.571 GC heap before
{Heap before GC invocations=1865 (full 5):
PSYoungGen total 4096K, used 3648K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 100% used [0x00000000d5580000,0x00000000d5900000,0x00000000d5900000)
from space 512K, 12% used [0x00000000d5980000,0x00000000d5990000,0x00000000d5a00000)
to space 512K, 0% used [0x00000000d5a00000,0x00000000d5a00000,0x00000000d5a80000)
ParOldGen total 945152K, used 462247K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c369e78,0x00000000b9b00000)
Metaspace used 90248K, committed 92160K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Event: 68984.653 GC heap after
{Heap after GC invocations=1865 (full 5):
PSYoungGen total 4096K, used 224K [0x00000000d5580000, 0x00000000d5a80000, 0x0000000100000000)
eden space 3584K, 0% used [0x00000000d5580000,0x00000000d5580000,0x00000000d5900000)
from space 512K, 43% used [0x00000000d5a00000,0x00000000d5a38000,0x00000000d5a80000)
to space 512K, 0% used [0x00000000d5980000,0x00000000d5980000,0x00000000d5a00000)
ParOldGen total 945152K, used 462255K [0x0000000080000000, 0x00000000b9b00000, 0x00000000d5580000)
object space 945152K, 48% used [0x0000000080000000,0x000000009c36be78,0x00000000b9b00000)
Metaspace used 90248K, committed 92160K, reserved 1179648K
class space used 9093K, committed 9984K, reserved 1048576K
}
Dll operation events (14 events):
Event: 0.016 Loaded shared library c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\java.dll
Event: 0.091 Loaded shared library c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\zip.dll
Event: 0.118 Loaded shared library C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\instrument.dll
Event: 0.124 Loaded shared library C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\net.dll
Event: 0.127 Loaded shared library C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\nio.dll
Event: 0.131 Loaded shared library C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\zip.dll
Event: 0.153 Loaded shared library C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\jimage.dll
Event: 0.239 Loaded shared library c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\verify.dll
Event: 1.661 Loaded shared library C:\Users\prave\AppData\Roaming\Code\User\globalStorage\redhat.java\1.51.0\config_win\org.eclipse.equinox.launcher\org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.1400.v20250801-0854\eclipse_11916.dll
Event: 3.560 Loaded shared library C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\management.dll
Event: 3.565 Loaded shared library C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\management_ext.dll
Event: 6.508 Loaded shared library C:\Users\prave\AppData\Local\Temp\jna-106927502\jna18306368855010564938.dll
Event: 7.230 Loaded shared library C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\sunmscapi.dll
Event: 7.459 Loaded shared library C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\extnet.dll
Deoptimization events (20 events):
Event: 1121.780 Thread 0x00000230fce5b760 DEOPT PACKING pc=0x00000230a5a9a148 sp=0x000000c7901fe700
Event: 1121.780 Thread 0x00000230fce5b760 DEOPT UNPACKING pc=0x00000230a53d3aa2 sp=0x000000c7901fe5e0 mode 2
Event: 1203.978 Thread 0x00000230801e5fe0 Uncommon trap: trap_request=0xffffff45 fr.pc=0x00000230a5f137b0 relative=0x0000000000001db0
Event: 1203.978 Thread 0x00000230801e5fe0 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000230a5f137b0 method=org.eclipse.core.internal.utils.StringPool.add(Ljava/lang/String;)Ljava/lang/String; @ 1 c2
Event: 1203.978 Thread 0x00000230801e5fe0 DEOPT PACKING pc=0x00000230a5f137b0 sp=0x000000c7932fecf0
Event: 1203.979 Thread 0x00000230801e5fe0 DEOPT UNPACKING pc=0x00000230a53d3aa2 sp=0x000000c7932fec78 mode 2
Event: 1259.282 Thread 0x00000230fb6d0ba0 DEOPT PACKING pc=0x00000230a06a8244 sp=0x000000c791dfecf0
Event: 1259.282 Thread 0x00000230fb6d0ba0 DEOPT UNPACKING pc=0x00000230a53d4242 sp=0x000000c791dfe1d0 mode 0
Event: 1274.587 Thread 0x00000230fb6d25e0 Uncommon trap: trap_request=0xffffff45 fr.pc=0x00000230a5a1f244 relative=0x0000000000001284
Event: 1274.587 Thread 0x00000230fb6d25e0 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000230a5a1f244 method=org.eclipse.core.runtime.Path.computeLength()I @ 92 c2
Event: 1274.587 Thread 0x00000230fb6d25e0 DEOPT PACKING pc=0x00000230a5a1f244 sp=0x000000c791cfef70
Event: 1274.587 Thread 0x00000230fb6d25e0 DEOPT UNPACKING pc=0x00000230a53d3aa2 sp=0x000000c791cfee48 mode 2
Event: 1398.459 Thread 0x00000230fce5b760 Uncommon trap: trap_request=0xffffffde fr.pc=0x00000230a6302c94 relative=0x0000000000000c54
Event: 1398.459 Thread 0x00000230fce5b760 Uncommon trap: reason=class_check action=maybe_recompile pc=0x00000230a6302c94 method=org.eclipse.core.internal.resources.SaveManager.writeElement(Lorg/eclipse/core/runtime/IPath;Ljava/lang/Object;Ljava/io/DataOutput;)V @ 13 c2
Event: 1398.459 Thread 0x00000230fce5b760 DEOPT PACKING pc=0x00000230a6302c94 sp=0x000000c7901ff110
Event: 1398.459 Thread 0x00000230fce5b760 DEOPT UNPACKING pc=0x00000230a53d3aa2 sp=0x000000c7901ff0b8 mode 2
Event: 1423.761 Thread 0x00000230fb6d25e0 Uncommon trap: trap_request=0xffffff45 fr.pc=0x00000230a72e2c9c relative=0x00000000000021dc
Event: 1423.761 Thread 0x00000230fb6d25e0 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00000230a72e2c9c method=org.eclipse.core.internal.utils.FileUtil.realPath(Lorg/eclipse/core/runtime/IPath;)Lorg/eclipse/core/runtime/IPath; @ 248 c2
Event: 1423.761 Thread 0x00000230fb6d25e0 DEOPT PACKING pc=0x00000230a72e2c9c sp=0x000000c791cfee70
Event: 1423.761 Thread 0x00000230fb6d25e0 DEOPT UNPACKING pc=0x00000230a53d3aa2 sp=0x000000c791cfee48 mode 2
Classes loaded (20 events):
Event: 336.224 Loading class java/lang/invoke/BoundMethodHandle$Species_LIL
Event: 336.224 Loading class java/lang/invoke/BoundMethodHandle$Species_LIL done
Event: 336.226 Loading class java/io/ObjectStreamClass$DeserializationConstructorsCache$Key$Impl
Event: 336.226 Loading class java/io/ObjectStreamClass$DeserializationConstructorsCache$Key$Impl done
Event: 337.392 Loading class java/util/stream/DistinctOps
Event: 337.392 Loading class java/util/stream/DistinctOps done
Event: 337.392 Loading class java/util/stream/DistinctOps$1
Event: 337.392 Loading class java/util/stream/DistinctOps$1 done
Event: 337.395 Loading class java/util/stream/DistinctOps$1$2
Event: 337.396 Loading class java/util/stream/DistinctOps$1$2 done
Event: 731.095 Loading class java/util/function/IntPredicate
Event: 731.096 Loading class java/util/function/IntPredicate done
Event: 731.111 Loading class java/util/regex/Pattern$Bound
Event: 731.111 Loading class java/util/regex/Pattern$Bound done
Event: 1100.147 Loading class javax/xml/transform/TransformerConfigurationException
Event: 1100.148 Loading class javax/xml/transform/TransformerConfigurationException done
Event: 1104.540 Loading class java/util/concurrent/ArrayBlockingQueue
Event: 1104.541 Loading class java/util/concurrent/ArrayBlockingQueue done
Event: 1104.606 Loading class java/util/concurrent/ConcurrentHashMap$KeySpliterator
Event: 1104.606 Loading class java/util/concurrent/ConcurrentHashMap$KeySpliterator done
Classes unloaded (20 events):
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b71a0 'org/codehaus/plexus/languages/java/jpms/ResolvePathsResult'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b6f60 'org/codehaus/plexus/compiler/CompilerResult'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b6d60 'org/codehaus/plexus/compiler/util/scan/SourceInclusionScanner'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b68d0 'org/codehaus/plexus/compiler/CompilerConfiguration'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b66d0 'org/apache/maven/shared/utils/logging/MessageBuilder'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b64d0 'org/codehaus/plexus/compiler/util/scan/mapping/SourceMapping'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b6270 'org/codehaus/plexus/compiler/util/scan/InclusionScanException'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b6000 'org/apache/maven/plugin/compiler/CompilationFailureException'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b5ce0 'org/codehaus/plexus/compiler/CompilerNotImplementedException'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b5a80 'org/codehaus/plexus/compiler/CompilerException'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b5818 'org/codehaus/plexus/compiler/manager/NoSuchCompilerException'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b5618 'org/codehaus/plexus/compiler/Compiler'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b5418 'org/codehaus/plexus/compiler/manager/CompilerManager'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b5200 'org/codehaus/plexus/languages/java/jpms/LocationManager'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b5000 'org/sonatype/plexus/components/cipher/PlexusCipher'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b4c18 'org/sonatype/plexus/components/sec/dispatcher/SecDispatcher'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b48e8 'org/apache/maven/plugin/compiler/TestCompilerMojo'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b4660 'org/apache/maven/plugin/compiler/HelpMojo'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b4330 'org/apache/maven/plugin/compiler/CompilerMojo'
Event: 1105.539 Thread 0x000002309ad0e840 Unloading class 0x00000230b36b4000 'org/apache/maven/plugin/compiler/AbstractCompilerMojo'
Classes redefined (0 events):
No events
Internal exceptions (20 events):
Event: 1117.826 Thread 0x00000230f9cd8570 Exception <a 'java/lang/NullPointerException'{0x00000000d5753ad0}> (0x00000000d5753ad0)
thrown [s\src\hotspot\share\runtime\sharedRuntime.cpp, line 625]
Event: 1117.826 Thread 0x00000230f9cd8570 Implicit null exception at 0x000002309fc03c9b to 0x000002309fc074eb
Event: 1117.826 Thread 0x00000230f9cd8570 Exception <a 'java/lang/NullPointerException'{0x00000000d5754708}> (0x00000000d5754708)
thrown [s\src\hotspot\share\runtime\sharedRuntime.cpp, line 625]
Event: 1117.826 Thread 0x00000230f9cd8570 Implicit null exception at 0x000002309fc03c9b to 0x000002309fc074eb
Event: 1117.826 Thread 0x00000230f9cd8570 Exception <a 'java/lang/NullPointerException'{0x00000000d57553a8}> (0x00000000d57553a8)
thrown [s\src\hotspot\share\runtime\sharedRuntime.cpp, line 625]
Event: 1117.828 Thread 0x00000230f9cd8570 Implicit null exception at 0x000002309fc03c9b to 0x000002309fc074eb
Event: 1117.828 Thread 0x00000230f9cd8570 Exception <a 'java/lang/NullPointerException'{0x00000000d57839d8}> (0x00000000d57839d8)
thrown [s\src\hotspot\share\runtime\sharedRuntime.cpp, line 625]
Event: 1117.828 Thread 0x00000230f9cd8570 Implicit null exception at 0x000002309fc03c9b to 0x000002309fc074eb
Event: 1117.828 Thread 0x00000230f9cd8570 Exception <a 'java/lang/NullPointerException'{0x00000000d5784410}> (0x00000000d5784410)
thrown [s\src\hotspot\share\runtime\sharedRuntime.cpp, line 625]
Event: 1117.828 Thread 0x00000230f9cd8570 Implicit null exception at 0x000002309fc03c9b to 0x000002309fc074eb
Event: 1117.828 Thread 0x00000230f9cd8570 Exception <a 'java/lang/NullPointerException'{0x00000000d57851e8}> (0x00000000d57851e8)
thrown [s\src\hotspot\share\runtime\sharedRuntime.cpp, line 625]
Event: 1117.828 Thread 0x00000230f9cd8570 Implicit null exception at 0x000002309fc03c9b to 0x000002309fc074eb
Event: 1117.828 Thread 0x00000230f9cd8570 Exception <a 'java/lang/NullPointerException'{0x00000000d5785e20}> (0x00000000d5785e20)
thrown [s\src\hotspot\share\runtime\sharedRuntime.cpp, line 625]
Event: 1117.828 Thread 0x00000230f9cd8570 Implicit null exception at 0x000002309fc03c9b to 0x000002309fc074eb
Event: 1117.828 Thread 0x00000230f9cd8570 Exception <a 'java/lang/NullPointerException'{0x00000000d5786ac0}> (0x00000000d5786ac0)
thrown [s\src\hotspot\share\runtime\sharedRuntime.cpp, line 625]
Event: 1119.962 Thread 0x00000230fce5a3b0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000d58559f8}> (0x00000000d58559f8)
thrown [s\src\hotspot\share\prims\jni.cpp, line 520]
Event: 1119.962 Thread 0x00000230fce5a3b0 Exception <a 'sun/nio/fs/WindowsException'{0x00000000d5856250}> (0x00000000d5856250)
thrown [s\src\hotspot\share\prims\jni.cpp, line 520]
Event: 1203.978 Thread 0x00000230801e5fe0 Implicit null exception at 0x00000230a5f11a4d to 0x00000230a5f1379c
Event: 1398.452 Thread 0x00000230fce5b760 Exception <a 'sun/nio/fs/WindowsException'{0x00000000d56acc98}> (0x00000000d56acc98)
thrown [s\src\hotspot\share\prims\jni.cpp, line 520]
Event: 1398.452 Thread 0x00000230fce5b760 Exception <a 'sun/nio/fs/WindowsException'{0x00000000d56ad7b0}> (0x00000000d56ad7b0)
thrown [s\src\hotspot\share\prims\jni.cpp, line 520]
ZGC Phase Switch (0 events):
No events
VM Operations (20 events):
Event: 67634.199 Executing VM operation: RendezvousGCThreads
Event: 67634.199 Executing VM operation: RendezvousGCThreads done
Event: 67934.832 Executing VM operation: HandshakeAllThreads (HandshakeForDeflation)
Event: 67934.832 Executing VM operation: HandshakeAllThreads (HandshakeForDeflation) done
Event: 67934.832 Executing VM operation: RendezvousGCThreads
Event: 67934.832 Executing VM operation: RendezvousGCThreads done
Event: 67995.041 Executing VM operation: HandshakeAllThreads (HandshakeForDeflation)
Event: 67995.041 Executing VM operation: HandshakeAllThreads (HandshakeForDeflation) done
Event: 67995.041 Executing VM operation: RendezvousGCThreads
Event: 67995.041 Executing VM operation: RendezvousGCThreads done
Event: 68055.225 Executing VM operation: HandshakeAllThreads (HandshakeForDeflation)
Event: 68055.225 Executing VM operation: HandshakeAllThreads (HandshakeForDeflation) done
Event: 68055.225 Executing VM operation: RendezvousGCThreads
Event: 68055.225 Executing VM operation: RendezvousGCThreads done
Event: 68984.569 Executing VM operation: ParallelGCFailedAllocation (Allocation Failure)
Event: 68984.653 Executing VM operation: ParallelGCFailedAllocation (Allocation Failure) done
Event: 69017.231 Executing VM operation: HandshakeAllThreads (HandshakeForDeflation)
Event: 69017.231 Executing VM operation: HandshakeAllThreads (HandshakeForDeflation) done
Event: 69017.231 Executing VM operation: RendezvousGCThreads
Event: 69017.231 Executing VM operation: RendezvousGCThreads done
Memory protections (0 events):
No events
Nmethod flushes (20 events):
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a032cd10
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0332810
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0382f10
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0629510
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a062c890
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a062cd10
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a063b090
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a065f690
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0660810
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0661810
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0666b90
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a066a610
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a066bb90
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a066d410
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0670010
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0670690
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0682b10
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0683790
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a0689c10
Event: 1105.621 Thread 0x000002309ad0e840 flushing nmethod 0x00000230a068c590
Events (20 events):
Event: 1417.694 Thread 0x00000230fe9a4ec0 Thread exited: 0x00000230fe9a4ec0
Event: 1419.690 Thread 0x00000230801e24d0 Thread exited: 0x00000230801e24d0
Event: 1419.692 Thread 0x00000230fabb8a70 Thread exited: 0x00000230fabb8a70
Event: 1419.692 Thread 0x00000230801e17b0 Thread exited: 0x00000230801e17b0
Event: 1419.693 Thread 0x00000230801df050 Thread exited: 0x00000230801df050
Event: 1419.693 Thread 0x00000230801e1120 Thread exited: 0x00000230801e1120
Event: 1419.693 Thread 0x00000230801df6e0 Thread exited: 0x00000230801df6e0
Event: 1419.693 Thread 0x00000230801e0400 Thread exited: 0x00000230801e0400
Event: 1419.965 Thread 0x00000230fe9a2df0 Thread exited: 0x00000230fe9a2df0
Event: 1419.965 Thread 0x00000230801dfd70 Thread exited: 0x00000230801dfd70
Event: 1419.966 Thread 0x00000230fe9a5be0 Thread exited: 0x00000230fe9a5be0
Event: 1458.586 Thread 0x00000230801e5fe0 Thread exited: 0x00000230801e5fe0
Event: 1463.752 Thread 0x00000230fe9a41a0 Thread exited: 0x00000230fe9a41a0
Event: 1477.704 Thread 0x00000230fe9a4830 Thread exited: 0x00000230fe9a4830
Event: 1523.757 Thread 0x00000230fce5bdf0 Thread exited: 0x00000230fce5bdf0
Event: 1583.770 Thread 0x00000230fce5aa40 Thread exited: 0x00000230fce5aa40
Event: 1643.773 Thread 0x00000230fce5d1a0 Thread exited: 0x00000230fce5d1a0
Event: 1703.788 Thread 0x00000230fdebe830 Thread exited: 0x00000230fdebe830
Event: 1763.795 Thread 0x00000230fe9a3480 Thread exited: 0x00000230fe9a3480
Event: 1823.801 Thread 0x00000230f9cd9290 Thread exited: 0x00000230f9cd9290
Dynamic libraries:
0x00007ff711860000 - 0x00007ff71186e000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\java.exe
0x00007ffc41000000 - 0x00007ffc41267000 C:\WINDOWS\SYSTEM32\ntdll.dll
0x00007ffc3ffb0000 - 0x00007ffc40079000 C:\WINDOWS\System32\KERNEL32.DLL
0x00007ffc3e8f0000 - 0x00007ffc3ecdf000 C:\WINDOWS\System32\KERNELBASE.dll
0x00007ffc3e150000 - 0x00007ffc3e29b000 C:\WINDOWS\System32\ucrtbase.dll
0x00007ffc2d680000 - 0x00007ffc2d698000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\jli.dll
0x00007ffc3f030000 - 0x00007ffc3f1f5000 C:\WINDOWS\System32\USER32.dll
0x00007ffc3e700000 - 0x00007ffc3e727000 C:\WINDOWS\System32\win32u.dll
0x00007ffc3f830000 - 0x00007ffc3f85b000 C:\WINDOWS\System32\GDI32.dll
0x00007ffc3e7c0000 - 0x00007ffc3e8ec000 C:\WINDOWS\System32\gdi32full.dll
0x00007ffc3e420000 - 0x00007ffc3e4c3000 C:\WINDOWS\System32\msvcp_win.dll
0x00007ffc15890000 - 0x00007ffc15b23000 C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.26100.7309_none_3e05feeae336a044\COMCTL32.dll
0x00007ffc3fdc0000 - 0x00007ffc3fe69000 C:\WINDOWS\System32\msvcrt.dll
0x00007ffc27460000 - 0x00007ffc2747e000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\VCRUNTIME140.dll
0x00007ffc3ff70000 - 0x00007ffc3ffa1000 C:\WINDOWS\System32\IMM32.DLL
0x00007ffc2e730000 - 0x00007ffc2e73c000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\vcruntime140_1.dll
0x00007ffc1a850000 - 0x00007ffc1a8dd000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\msvcp140.dll
0x00007ffbd15c0000 - 0x00007ffbd2360000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\server\jvm.dll
0x00007ffc3f770000 - 0x00007ffc3f824000 C:\WINDOWS\System32\ADVAPI32.dll
0x00007ffc40f10000 - 0x00007ffc40fb6000 C:\WINDOWS\System32\sechost.dll
0x00007ffc3ef10000 - 0x00007ffc3f028000 C:\WINDOWS\System32\RPCRT4.dll
0x00007ffc404b0000 - 0x00007ffc40524000 C:\WINDOWS\System32\WS2_32.dll
0x00007ffc3dfd0000 - 0x00007ffc3e02e000 C:\WINDOWS\SYSTEM32\POWRPROF.dll
0x00007ffc37b30000 - 0x00007ffc37b65000 C:\WINDOWS\SYSTEM32\WINMM.dll
0x00007ffc21ef0000 - 0x00007ffc21efb000 C:\WINDOWS\SYSTEM32\VERSION.dll
0x00007ffc3dfb0000 - 0x00007ffc3dfc4000 C:\WINDOWS\SYSTEM32\UMPDC.dll
0x00007ffc3ced0000 - 0x00007ffc3ceeb000 C:\WINDOWS\SYSTEM32\kernel.appcore.dll
0x00007ffc2d420000 - 0x00007ffc2d42a000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\jimage.dll
0x00007ffc3b2a0000 - 0x00007ffc3b4e2000 C:\WINDOWS\SYSTEM32\DBGHELP.DLL
0x00007ffc3f200000 - 0x00007ffc3f586000 C:\WINDOWS\System32\combase.dll
0x00007ffc40080000 - 0x00007ffc40156000 C:\WINDOWS\System32\OLEAUT32.dll
0x00007ffc37af0000 - 0x00007ffc37b2c000 C:\WINDOWS\SYSTEM32\dbgcore.DLL
0x00007ffc3ecf0000 - 0x00007ffc3ed95000 C:\WINDOWS\System32\bcryptPrimitives.dll
0x00007ffc2ab70000 - 0x00007ffc2ab7f000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\instrument.dll
0x00007ffc27440000 - 0x00007ffc27460000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\java.dll
0x00007ffc40620000 - 0x00007ffc40d73000 C:\WINDOWS\System32\SHELL32.dll
0x00007ffc3e4d0000 - 0x00007ffc3e63a000 C:\WINDOWS\System32\wintypes.dll
0x00007ffc3bd10000 - 0x00007ffc3c56e000 C:\WINDOWS\SYSTEM32\windows.storage.dll
0x00007ffc3fe70000 - 0x00007ffc3ff65000 C:\WINDOWS\System32\SHCORE.dll
0x00007ffc3f860000 - 0x00007ffc3f8c6000 C:\WINDOWS\System32\shlwapi.dll
0x00007ffc3e070000 - 0x00007ffc3e099000 C:\WINDOWS\SYSTEM32\profapi.dll
0x00007ffc17290000 - 0x00007ffc172a8000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\zip.dll
0x00007ffc272b0000 - 0x00007ffc272c0000 C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\net.dll
0x00007ffc36280000 - 0x00007ffc363a8000 C:\WINDOWS\SYSTEM32\WINHTTP.dll
0x00007ffc3d450000 - 0x00007ffc3d4bb000 C:\WINDOWS\system32\mswsock.dll
0x00007ffc171c0000 - 0x00007ffc171d6000 C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\nio.dll
0x00007ffc25bb0000 - 0x00007ffc25bc0000 c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\verify.dll
0x00007ffbfd210000 - 0x00007ffbfd254000 C:\Users\prave\AppData\Roaming\Code\User\globalStorage\redhat.java\1.51.0\config_win\org.eclipse.equinox.launcher\org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.1400.v20250801-0854\eclipse_11916.dll
0x00007ffc40300000 - 0x00007ffc40497000 C:\WINDOWS\System32\ole32.dll
0x00007ffc2d610000 - 0x00007ffc2d61a000 C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\management.dll
0x00007ffc2d600000 - 0x00007ffc2d60c000 C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\management_ext.dll
0x00007ffc404a0000 - 0x00007ffc404a8000 C:\WINDOWS\System32\PSAPI.DLL
0x00007ffc3d730000 - 0x00007ffc3d74b000 C:\WINDOWS\SYSTEM32\CRYPTSP.dll
0x00007ffc3ce30000 - 0x00007ffc3ce6a000 C:\WINDOWS\system32\rsaenh.dll
0x00007ffc3d500000 - 0x00007ffc3d52b000 C:\WINDOWS\SYSTEM32\USERENV.dll
0x00007ffc3e040000 - 0x00007ffc3e06a000 C:\WINDOWS\SYSTEM32\bcrypt.dll
0x00007ffc3d750000 - 0x00007ffc3d75c000 C:\WINDOWS\SYSTEM32\CRYPTBASE.dll
0x00007ffc3c900000 - 0x00007ffc3c934000 C:\WINDOWS\SYSTEM32\IPHLPAPI.DLL
0x00007ffc3fdb0000 - 0x00007ffc3fdba000 C:\WINDOWS\System32\NSI.dll
0x00007ffbf3ca0000 - 0x00007ffbf3ce9000 C:\Users\prave\AppData\Local\Temp\jna-106927502\jna18306368855010564938.dll
0x00007ffc37ac0000 - 0x00007ffc37ade000 C:\WINDOWS\SYSTEM32\dhcpcsvc6.DLL
0x00007ffc37950000 - 0x00007ffc37973000 C:\WINDOWS\SYSTEM32\dhcpcsvc.DLL
0x00007ffc246f0000 - 0x00007ffc246fe000 C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\sunmscapi.dll
0x00007ffc3e2a0000 - 0x00007ffc3e417000 C:\WINDOWS\System32\CRYPT32.dll
0x00007ffc3d950000 - 0x00007ffc3d980000 C:\WINDOWS\SYSTEM32\ncrypt.dll
0x00007ffc3d900000 - 0x00007ffc3d93f000 C:\WINDOWS\SYSTEM32\NTASN1.dll
0x00007ffc3c9a0000 - 0x00007ffc3cacc000 C:\WINDOWS\SYSTEM32\DNSAPI.dll
0x00007ffc36140000 - 0x00007ffc3614b000 C:\Windows\System32\rasadhlp.dll
0x00007ffc38040000 - 0x00007ffc380c6000 C:\WINDOWS\System32\fwpuclnt.dll
0x00007ffc22840000 - 0x00007ffc22849000 C:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\extnet.dll
JVMTI agents:
c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\lombok\lombok-1.18.39-4050.jar path:c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\instrument.dll, loaded, initialized, instrumentlib options:none
dbghelp: loaded successfully - version: 4.0.5 - missing functions: none
symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin;C:\WINDOWS\SYSTEM32;C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.26100.7309_none_3e05feeae336a044;c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\jre\21.0.9-win32-x86_64\bin\server;C:\Users\prave\AppData\Roaming\Code\User\globalStorage\redhat.java\1.51.0\config_win\org.eclipse.equinox.launcher\org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.1400.v20250801-0854;C:\Users\prave\AppData\Local\Temp\jna-106927502
VM Arguments:
jvm_args: --add-modules=ALL-SYSTEM --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/sun.nio.fs=ALL-UNNAMED -Declipse.application=org.eclipse.jdt.ls.core.id1 -Dosgi.bundles.defaultStartLevel=4 -Declipse.product=org.eclipse.jdt.ls.core.product -Djava.import.generatesMetadataFilesAtProjectRoot=false -DDetectVMInstallationsJob.disabled=true -Dfile.encoding=utf8 -XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx2G -Xms100m -Xlog:disable -javaagent:c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\lombok\lombok-1.18.39-4050.jar -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:\Users\prave\AppData\Roaming\Code\User\workspaceStorage\25fb85a1b34efdab544c011bc2bf6d24\redhat.java -Daether.dependencyCollector.impl=bf -Xms512m -Xmx2048m
java_command: c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\server\plugins\org.eclipse.equinox.launcher_1.7.100.v20251111-0406.jar -configuration c:\Users\prave\AppData\Roaming\Code\User\globalStorage\redhat.java\1.51.0\config_win -data c:\Users\prave\AppData\Roaming\Code\User\workspaceStorage\25fb85a1b34efdab544c011bc2bf6d24\redhat.java\jdt_ws --pipe=\\.\pipe\lsp-d5fba1c1e6412e89965743a246dbdd77-sock
java_class_path (initial): c:\Users\prave\.vscode\extensions\redhat.java-1.51.0-win32-x64\server\plugins\org.eclipse.equinox.launcher_1.7.100.v20251111-0406.jar
Launcher Type: SUN_STANDARD
[Global flags]
uintx AdaptiveSizePolicyWeight = 90 {product} {command line}
intx CICompilerCount = 4 {product} {ergonomic}
uintx GCTimeRatio = 4 {product} {command line}
bool HeapDumpOnOutOfMemoryError = true {manageable} {command line}
ccstr HeapDumpPath = c:\Users\prave\AppData\Roaming\Code\User\workspaceStorage\25fb85a1b34efdab544c011bc2bf6d24\redhat.java {manageable} {command line}
size_t InitialHeapSize = 536870912 {product} {command line}
size_t MaxHeapSize = 2147483648 {product} {command line}
size_t MaxNewSize = 715653120 {product} {ergonomic}
size_t MinHeapDeltaBytes = 524288 {product} {ergonomic}
size_t MinHeapSize = 536870912 {product} {command line}
size_t NewSize = 178782208 {product} {ergonomic}
uintx NonNMethodCodeHeapSize = 5839372 {pd product} {ergonomic}
uintx NonProfiledCodeHeapSize = 122909434 {pd product} {ergonomic}
size_t OldSize = 358088704 {product} {ergonomic}
uintx ProfiledCodeHeapSize = 122909434 {pd product} {ergonomic}
uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic}
bool SegmentedCodeCache = true {product} {ergonomic}
size_t SoftMaxHeapSize = 2147483648 {manageable} {ergonomic}
bool UseCompressedOops = true {product lp64_product} {ergonomic}
bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic}
bool UseParallelGC = true {product} {command line}
Logging:
Log output configuration:
#0: stdout all=off uptime,level,tags foldmultilines=false
#1: stderr all=off uptime,level,tags foldmultilines=false
Release file:
JAVA_VERSION="21.0.9"
MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.jvmstat jdk.attach jdk.charsets jdk.internal.opt jdk.zipfs jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.crypto.mscapi jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.internal.le jdk.internal.vm.ci jdk.internal.vm.compiler jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management jdk.management.agent jdk.jconsole jdk.jdeps jdk.jdwp.agent jdk.jdi jdk.jfr jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.random jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported jdk.unsupported.desktop jdk.xml.dom"
Environment Variables:
JAVA_HOME=C:\Program Files\Java\jdk-20
_JAVA_OPTIONS=-Xms512m -Xmx2048m
PATH=C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Oracle\Java\java8path;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Java\jdk-20\bin;C:\Program Files\Java\jre1.8.0_351\bin;C:\Program Files\Git\cmd;C:\Program Files\PuTTY\;C:\Program Files\nodejs\;C:\Program Files\apache-maven-3.9.11\bin;C:\Program Files\MySQL\MySQL Server 8.0\bin;C:\Users\prave\AppData\Local\Programs\Python\Launcher\;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Users\prave\AppData\Local\Microsoft\WindowsApps;C:\Users\prave\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\prave\AppData\Roaming\npm;E:\kafka\bin\windows;C:\Users\prave\AppData\Local\GitHubDesktop\bin;C:\Program Files\apache-maven-3.9.11\bin;C:\Program Files\MySQL\MySQL Server 8.0\bin
USERNAME=prave
OS=Windows_NT
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 154 Stepping 4, GenuineIntel
TMP=C:\Users\prave\AppData\Local\Temp
TEMP=C:\Users\prave\AppData\Local\Temp
Periodic native trim disabled
--------------- S Y S T E M ---------------
OS:
Windows 11 , 64 bit Build 26100 (10.0.26100.7623)
OS uptime: 7 days 2:47 hours
Hyper-V role detected
CPU: total 12 (initial active 12) (6 cores per cpu, 2 threads per core) family 6 model 154 stepping 4 microcode 0x423, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, adx, sha, fma, vzeroupper, clflush, clflushopt, clwb, hv, serialize, rdtscp, rdpid, fsrm, f16c, cet_ibt, cet_ss
Processor Information for processor 0
Max Mhz: 1300, Current Mhz: 1300, Mhz Limit: 1300
Processor Information for processor 1
Max Mhz: 1300, Current Mhz: 1300, Mhz Limit: 1300
Processor Information for processor 2
Max Mhz: 1300, Current Mhz: 1300, Mhz Limit: 1300
Processor Information for processor 3
Max Mhz: 1300, Current Mhz: 1300, Mhz Limit: 1300
Processor Information for processor 4
Max Mhz: 1300, Current Mhz: 900, Mhz Limit: 897
Processor Information for processor 5
Max Mhz: 1300, Current Mhz: 900, Mhz Limit: 897
Processor Information for processor 6
Max Mhz: 1300, Current Mhz: 900, Mhz Limit: 897
Processor Information for processor 7
Max Mhz: 1300, Current Mhz: 900, Mhz Limit: 897
Processor Information for processor 8
Max Mhz: 1300, Current Mhz: 900, Mhz Limit: 897
Processor Information for processor 9
Max Mhz: 1300, Current Mhz: 900, Mhz Limit: 897
Processor Information for processor 10
Max Mhz: 1300, Current Mhz: 900, Mhz Limit: 897
Processor Information for processor 11
Max Mhz: 1300, Current Mhz: 900, Mhz Limit: 897
Memory: 4k page, system-wide physical 16092M (957M free)
TotalPageFile size 38002M (AvailPageFile size 47M)
current process WorkingSet (physical memory assigned to process): 56M, peak: 1405M
current process commit charge ("private bytes"): 1319M, peak: 1357M
vm_info: OpenJDK 64-Bit Server VM (21.0.9+10-LTS) for windows-amd64 JRE (21.0.9+10-LTS), built on 2025-10-21T00:00:00Z by "admin" with unknown MS VC++:1942
END.

308
gcc_officer_portal/mvnw

@ -0,0 +1,308 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.2.0
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "$(uname)" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
else
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=$(java-config --jre-home)
fi
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="$(which javac)"
if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=$(which readlink)
if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
if $darwin ; then
javaHome="$(dirname "\"$javaExecutable\"")"
javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
else
javaExecutable="$(readlink -f "\"$javaExecutable\"")"
fi
javaHome="$(dirname "\"$javaExecutable\"")"
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=$(cd "$wdir/.." || exit 1; pwd)
fi
# end of workaround
done
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
# Remove \r in case we run on Windows within Git Bash
# and check out the repository with auto CRLF management
# enabled. Otherwise, we may read lines that are delimited with
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
# splitting rules.
tr -s '\r\n' ' ' < "$1"
fi
}
log() {
if [ "$MVNW_VERBOSE" = true ]; then
printf '%s\n' "$1"
fi
}
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
log "$MAVEN_PROJECTBASEDIR"
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
if [ -r "$wrapperJarPath" ]; then
log "Found $wrapperJarPath"
else
log "Couldn't find $wrapperJarPath, downloading it ..."
if [ -n "$MVNW_REPOURL" ]; then
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
else
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
fi
while IFS="=" read -r key value; do
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
safeValue=$(echo "$value" | tr -d '\r')
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
log "Downloading from: $wrapperUrl"
if $cygwin; then
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
fi
if command -v wget > /dev/null; then
log "Found wget ... using wget"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
log "Found curl ... using curl"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
else
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
fi
else
log "Falling back to using Java to download"
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaSource=$(cygpath --path --windows "$javaSource")
javaClass=$(cygpath --path --windows "$javaClass")
fi
if [ -e "$javaSource" ]; then
if [ ! -e "$javaClass" ]; then
log " - Compiling MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/javac" "$javaSource")
fi
if [ -e "$javaClass" ]; then
log " - Running MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
wrapperSha256Sum=""
while IFS="=" read -r key value; do
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
if [ -n "$wrapperSha256Sum" ]; then
wrapperSha256Result=false
if command -v sha256sum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
elif command -v shasum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
exit 1
fi
if [ $wrapperSha256Result = false ]; then
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
exit 1
fi
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
# shellcheck disable=SC2086 # safe args
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

205
gcc_officer_portal/mvnw.cmd

@ -0,0 +1,205 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.2.0
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %WRAPPER_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
SET WRAPPER_SHA_256_SUM=""
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
)
IF NOT %WRAPPER_SHA_256_SUM%=="" (
powershell -Command "&{"^
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
" exit 1;"^
"}"^
"}"
if ERRORLEVEL 1 goto error
)
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%

156
gcc_officer_portal/pom.xml

@ -0,0 +1,156 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!--<version>2.5.4</version>-->
<version>2.5.4</version> <!-- or the latest 3.x version -->
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--<packaging>war</packaging>-->
<groupId>in.gov.chennaicorporation</groupId>
<artifactId>gccoffice</artifactId>
<version>0.0.1</version>
<name>GCC OFFICE</name>
<description>GCC Applications and Dashboard</description>
<properties>
<java.version>17</java.version>
<bootstrap.version>4.0.0-2</bootstrap.version>
<webjars-locator.version>0.30</webjars-locator.version>
<lombok.version>1.18.2</lombok.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity6</artifactId>
<version>3.1.1.RELEASE</version> <!-- Replace with the appropriate version -->
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version> <!-- Replace with the appropriate version -->
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Use jakarta.persistence -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<!-- <dependency>
<groupId>in.gov.chennaicorporation</groupId>
<artifactId>Community-Hall-Booking</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency> -->
<!--
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version>
</dependency>
-->
</dependencies>
<!-- Spring Cloud dependencies -->
<!--
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

BIN
gcc_officer_portal/src/.DS_Store

BIN
gcc_officer_portal/src/main/.DS_Store

BIN
gcc_officer_portal/src/main/java/.DS_Store

BIN
gcc_officer_portal/src/main/java/in/.DS_Store

BIN
gcc_officer_portal/src/main/java/in/gov/.DS_Store

BIN
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/.DS_Store

BIN
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/.DS_Store

26
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/GccOfficeApplication.java

@ -0,0 +1,26 @@
package in.gov.chennaicorporation.gccoffice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
//import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
@EntityScan(basePackages = {
"in.gov.chennaicorporation.gccoffice",
"in.gov.chennaicorporation.gccoffice.taxcollection.entity"
})
@ComponentScan(basePackages = {
"in.gov.chennaicorporation.gccoffice",
"in.gov.chennaicorporation.gccoffice.taxcollection",
"in.gov.chennaicorporation.gccoffice.garbagecollection"
})
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
//@EnableDiscoveryClient
public class GccOfficeApplication {
public static void main(String[] args) {
//System.setProperty("spring.config.name", "gcc-portal");
SpringApplication.run(GccOfficeApplication.class, args);
}
}

151
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/controller/APIController.java

@ -0,0 +1,151 @@
package in.gov.chennaicorporation.gccoffice.c_petition.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import in.gov.chennaicorporation.gccoffice.c_petition.service.Petition;
import in.gov.chennaicorporation.gccoffice.c_petition.service.PetitionMaster;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("gcc/api/c_petition")
@RestController("cpRest") // Mayor Petition Rest
public class APIController {
private PetitionMaster petitionMaster;
private Petition petition;
@Autowired
public APIController(PetitionMaster petitionMaster,Petition petition) {
this.petitionMaster = petitionMaster;
this.petition = petition;
}
@GetMapping(value="/getComplaintTypes")
public List getComplaintTypeList() {
return petitionMaster.getComplaintType();
}
@GetMapping(value="/getOfficerList")
public List getOfficerList() {
return petitionMaster.getOfficerList();
}
@GetMapping(value="/getPetitionList")
public List getPetitionList() {
return petition.getPetitionList();
}
@GetMapping(value="/getUnmapPetitionList")
public List getUnmapPetitionList() {
return petition.getUnmapPetitionList();
}
@GetMapping(value="/getPetitionDetails")
public List getPetitionDetails(@RequestParam("petitionNo") String petitionNo) {
return petition.getPetitionDetails(petitionNo);
}
@PostMapping(value="/savePetition")
public String savePetition(
@RequestParam("createdBy") String createdBy,
@RequestParam("petition_type") String petitionType,
@RequestParam("petitionerName") String petitionerName,
@RequestParam("petitionerMobile") String petitionerMobile,
@RequestParam("complaintType") String petitionerComplaint,
@RequestParam("san_page1") MultipartFile page1,
@RequestParam("san_page2") MultipartFile page2,
@RequestParam("san_page3") MultipartFile page3,
@RequestParam("san_page4") MultipartFile page4) {
return petition.savePetition(petitionType,createdBy, petitionerName, petitionerMobile, petitionerComplaint, page1, page2, page3, page4);
}
@PostMapping(value="/updatePetition")
public Boolean updatePetition(
@RequestParam("petitionType") String petitionType,
@RequestParam("petitionNo") String petitionNo,
@RequestParam("createdBy") String createdBy,
@RequestParam("petitionerName") String petitionerName,
@RequestParam("petitionerMobile") String petitionerMobile,
@RequestParam("petitionerAddress") String petitionerAddress,
@RequestParam("petitionerPincode") String petitionerPincode,
@RequestParam("complaintType") String petitionerComplaint,
@RequestParam("complaintNature") String complaintNature) {
return petition.updatePetition(petitionNo, petitionType, createdBy, petitionerName, petitionerMobile, petitionerAddress, petitionerPincode, petitionerComplaint, complaintNature);
}
@PostMapping(value="/mapComplientToOfficer")
public Boolean updatePetition(
@RequestParam("petitionId") String petitionId,
@RequestParam("petitionNo") String petitionNo,
@RequestParam("createdBy") String createdBy,
@RequestParam(value = "", required = false) String mapOfficers) {
String com_mapping = mapOfficers;
// First before Mapping need to unmaps old list
petition.unmapComplient(petitionId, petitionNo);
if(com_mapping!=null) {
String[] com_mapping_parts = com_mapping.split(",");
for (String values : com_mapping_parts) {
String[] com_mapping_val = values.split("_");
if (com_mapping_val.length > 0) {
String complientId = com_mapping_val[0];
String offcierId = com_mapping_val[1];
petition.mapComplientToOfficer(createdBy, petitionId, petitionNo, complientId, offcierId);
}
}
}
return true;
}
@GetMapping(value="/getComplaintMappingDetails")
public List getComplaintMappingDetails(
@RequestParam("petitionId") String petitionId,
@RequestParam("petitionNo") String petitionNo,
@RequestParam("complaintTypeId") String complaintTypeId) {
return petition.getComplaintMappingDetails(petitionNo,petitionId,complaintTypeId);
}
@GetMapping(value="/getComplaintList")
public List getComplaintList() {
return petition.getComplaintList();
}
@GetMapping(value="/getComplaintListByPetitionId")
public List getComplaintList(@RequestParam("petitionId") String petitionId) {
return petition.getComplaintListByPetitionId(petitionId);
}
@GetMapping(value="/getComplaintDetails")
public List<?> getComplaintDetails(@RequestParam("mapId") String mapId) {
return petition.getComplaintDetails(mapId);
}
@GetMapping(value="/getComplaintActionDetails")
public List<?> getComplaintActionDetails(@RequestParam("mapId") String mapId) {
return petition.getComplaintActionDetails(mapId);
}
@PostMapping(value="/saveComplanitStatus")
public String saveComplanitStatus(
@RequestParam("createdBy") String createdBy,
@RequestParam("mapId") String mapId,
@RequestParam("complaintStatus") String complaintStatus,
@RequestParam("complaintActionText") String complaintActionText,
@RequestParam("action_san_page1") MultipartFile actionPage1,
@RequestParam("petitionId") String petitionId,
@RequestParam("petitionNo") String petitionNo) {
return petition.saveComplanitStatus(createdBy, mapId, complaintStatus, complaintActionText, actionPage1, petitionId, petitionNo);
}
}

130
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/controller/MainController.java

@ -0,0 +1,130 @@
package in.gov.chennaicorporation.gccoffice.c_petition.controller;
import org.hibernate.hql.internal.ast.tree.RestrictableStatement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.service.Base64Util;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/c_petition")
@Controller("CouncillorPetitionController")
public class MainController {
private final RestTemplate restTemplate;
private String BasePath = "modules/c_petition/";
@Autowired
public MainController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping({"", "/", "/index", "/dashboard"})
public String dashboard(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
return BasePath+"index";
}
@GetMapping({"/new_petition"})
public String newPetition(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
return BasePath+"new_petition";
}
@GetMapping("/petition-ack/{petitionNo}")
public String petitionAck(Model model,@PathVariable("petitionNo") String petitionNo) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
model.addAttribute("petitionNo",petitionNo);
return BasePath+"petition_ack";
}
@GetMapping("/petition-list")
public String petitionList(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
return BasePath+"petition_list";
}
@GetMapping("/unmapped-petition-list")
public String unMappedPetitionList(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
return BasePath+"petition_not_mapped_list";
}
@GetMapping("/update-petition")
public String petitionUpadte(Model model,@RequestParam(value="petitionNo", required = false) String petitionNo) {
if (petitionNo != null && !petitionNo.isEmpty()) {
// Decrypt the encrypted value
petitionNo = Base64Util.decodeBase64(petitionNo);
}
else {
petitionNo = null;
}
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
model.addAttribute("petitionNo",petitionNo);
return BasePath+"petition_update";
}
@GetMapping("/view-petition")
public String petitionView(Model model,@RequestParam(value="petitionNo", required = false) String petitionNo) {
if (petitionNo != null && !petitionNo.isEmpty()) {
// Decrypt the encrypted value
petitionNo = Base64Util.decodeBase64(petitionNo);
}
else {
petitionNo = null;
}
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
model.addAttribute("petitionNo",petitionNo);
return BasePath+"petition_view";
}
@GetMapping("/view-petition-modal")
public String petitionViewModal(Model model,@RequestParam(value="petitionNo", required = false) String petitionNo) {
if (petitionNo != null && !petitionNo.isEmpty()) {
// Decrypt the encrypted value
petitionNo = Base64Util.decodeBase64(petitionNo);
}
else {
petitionNo = null;
}
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
model.addAttribute("petitionNo",petitionNo);
return BasePath+"petition_view_modal_page";
}
@GetMapping("/search-petition")
public String petitionSearch(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
//model.addAttribute("petitionNo",petitionNo);
return BasePath+"petition_update";
}
@GetMapping("/complaint-list")
public String complaintList(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
return BasePath+"complaint_list";
}
}

1
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/controller/package-info.java

@ -0,0 +1 @@
package in.gov.chennaicorporation.gccoffice.c_petition.controller;

21
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/data/ComplaintType.java

@ -0,0 +1,21 @@
package in.gov.chennaicorporation.gccoffice.c_petition.data;
import java.util.Map;
public class ComplaintType {
private int complaintTypeId;
private String complaintType;
public ComplaintType(Map<String, Object> map) {
this.complaintTypeId = (int) map.get("complaint_typeid");
this.complaintType = (String) map.get("complaint_type");
}
public int getComplaintTypeId() {
return complaintTypeId;
}
public String getComplaintType() {
return complaintType;
}
}

1
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/data/package-info.java

@ -0,0 +1 @@
package in.gov.chennaicorporation.gccoffice.c_petition.data;

1
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/entity/package-info.java

@ -0,0 +1 @@
package in.gov.chennaicorporation.gccoffice.c_petition.entity;

7
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/package-info.java

@ -0,0 +1,7 @@
/**
*
*/
/**
*
*/
package in.gov.chennaicorporation.gccoffice.c_petition;

709
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/service/Petition.java

@ -0,0 +1,709 @@
package in.gov.chennaicorporation.gccoffice.c_petition.service;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.env.Environment;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import in.gov.chennaicorporation.gccoffice.m_petition.data.ComplaintType;
import in.gov.chennaicorporation.gccoffice.service.Base64Util;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
@Service("cPetitionService")
public class Petition {
private JdbcTemplate jdbcTemplate;
private final Environment environment;
private PetitionMaster petitionMaster;
@Autowired
public Petition(Environment environment,PetitionMaster petitionMaster) {
this.environment = environment;
this.petitionMaster = petitionMaster;
}
@Autowired
public void setDataSource(@Qualifier("mysqlCouncillorPetitionDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional(readOnly = true)
public List getComplaintTypeList() {
return petitionMaster.getComplaintType();
}
/*
@Transactional(readOnly = true)
public static List<ComplaintType> convertToComplaintTypes(List<Map<String, Object>> complaintTypeMaps) {
return complaintTypeMaps.stream()
.map(ComplaintType::new)
.collect(Collectors.toList());
}
*/
@Transactional(readOnly = true)
public static List<ComplaintType> convertToComplaintTypes(List<Map<String, Object>> complaintTypeMaps) {
List<ComplaintType> complaintTypes = new ArrayList<>();
for (Map<String, Object> complaintTypeMap : complaintTypeMaps) {
complaintTypes.add(new ComplaintType(complaintTypeMap));
}
return complaintTypes;
}
@Transactional(readOnly = true)
// Method to map complaint type IDs to their respective complaint types
public static String mapComplaintTypes(List<ComplaintType> complaintTypes, String complaint) {
String[] complaintIds = complaint.split(",");
StringBuilder complaintTxtBuilder = new StringBuilder();
for (String complaintId : complaintIds) {
int id = Integer.parseInt(complaintId);
for (ComplaintType type : complaintTypes) {
if (type.getComplaintTypeId() == id) {
if (complaintTxtBuilder.length() > 0) {
complaintTxtBuilder.append(",");
}
complaintTxtBuilder.append(type.getComplaintType());
break;
}
}
}
return complaintTxtBuilder.toString();
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getPetitionList() {
try {
String sqlQuery = "SELECT * FROM petition WHERE (`isactive`=1 AND `isdelete`=0)";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sqlQuery);
Base64Util.encodeBase64(sqlQuery);
// Iterate over the list of maps
for (Map<String, Object> map : result) {
// Get the value of the 'petitionNo' field from the map
String petitionNo = (String) map.get("petition_no");
// Encode the 'petitionNo' value using Base64Util
String petitionNoEncoded = Base64Util.encodeBase64(petitionNo);
// Add the encoded value as 'petitionNoEncode' to the map
map.put("petitionNoEncode", petitionNoEncoded);
}
return result;
} catch (DataAccessException e) {
e.printStackTrace();
return null; // Return null or handle error appropriately
}
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getUnmapPetitionList() {
try {
String sqlQuery = "SELECT "
+ " p.* "
+ "FROM "
+ " `petition` p "
+ "WHERE "
+ " p.`isactive` = 1 AND p.`isdelete` = 0 "
+ " AND NOT EXISTS ("
+ " SELECT 1 "
+ " FROM `petition_mapping` pm "
+ " WHERE (p.`petition_id` = pm.`petition_id`) AND (pm.`isactive` = 1 AND pm.`isdelete` = 0 ) "
+ " )";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sqlQuery);
// Iterate over the list of maps
for (Map<String, Object> map : result) {
// Get the value of the 'petitionNo' field from the map
String petitionNo = (String) map.get("petition_no");
// Encode the 'petitionNo' value using Base64Util
String petitionNoEncoded = Base64Util.encodeBase64(petitionNo);
// Add the encoded value as 'petitionNoEncode' to the map
map.put("petitionNoEncode", petitionNoEncoded);
}
return result;
} catch (DataAccessException e) {
e.printStackTrace();
return null; // Return null or handle error appropriately
}
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getPetitionDetails(String petitionNo) {
// String petitionNoEncoded = Base64Util.encodeBase64(petitionNo);
try {
String sqlQuery = "SELECT * FROM petition WHERE petition_no = ? AND (`isactive`=1 AND `isdelete`=0) LIMIT 1";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sqlQuery, petitionNo);
return result;
} catch (DataAccessException e) {
e.printStackTrace();
return null; // Return null or handle error appropriately
}
}
@Transactional
public String savePetition(
String petitionType,
String createdBy,
String petitionerName,
String petitionerMobile,
String petitionerComplaint,
MultipartFile page1,
MultipartFile page2,
MultipartFile page3,
MultipartFile page4) {
//System.out.println("I am from Service Page "+petitionerName);
//String complaintNature = "";
int lastInsertId = 0;
String sqlQuery = "INSERT INTO `petition` "
+ "(`petition_type`,`created_by`, `petitioner_name`, `petitioner_mobile`, "
+ "`petitioner_complaint`, `petitioner_complaint_txt`) "
+ "VALUES (?, ?, ?, ?, ?, ?)";
try {
// Complaint Type List
List complaintTypelist = getComplaintTypeList();
// Convert the list of maps to a list of ComplaintType objects
List<ComplaintType> complaintTypes = convertToComplaintTypes(complaintTypelist);
// Map complaint types
String petitionerComplaint_txt = mapComplaintTypes(complaintTypes, petitionerComplaint);
KeyHolder keyHolder = new GeneratedKeyHolder();
// Use JdbcTemplate's update method to execute the query with parameters
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sqlQuery, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, petitionType);
ps.setString(2, createdBy);
ps.setString(3, petitionerName);
ps.setString(4, petitionerMobile);
ps.setString(5, petitionerComplaint);
ps.setString(6, petitionerComplaint_txt);
return ps;
}, keyHolder);
// Get the last insert ID
lastInsertId = (int) keyHolder.getKey().longValue();
// Get the value of cp_ackno from application.properties
String ackno = environment.getProperty("cp_ackno");
String ackno_prefix = environment.getProperty("cp_ackno_prefix");
// Convert ackno to int if needed
int acknoInt = Integer.parseInt(ackno);
// Calculate the petition number
int petitionNo = (int) (lastInsertId + acknoInt);
// Construct the petition number string
String petitionNoString = ackno_prefix + petitionNo;
// Update the petition number in the database
updatePetitionNumber(lastInsertId, petitionNoString);
// Add Petition Scan File in the database
addPetitionFile(createdBy,lastInsertId, petitionNoString, page1, page2, page3, page4);
return petitionNoString; // If no exception, query executed successfully
} catch (DataAccessException e) {
// Handle exception (e.g., log error)
e.printStackTrace();
return "error"; // Query execution failed
}
}
@Transactional
public boolean updatePetitionNumber(int petitionId,String petitionNoString) {
String sqlQuery = "UPDATE `petition` SET `petition_no`='"+petitionNoString+"' WHERE `petition_id`='"+petitionId+"'";
jdbcTemplate.update(sqlQuery);
return true;
}
@Transactional
public String addPetitionFile(String createdBy,
int petitionId,
String petitionNoString,
MultipartFile page1,
MultipartFile page2,
MultipartFile page3,
MultipartFile page4) {
String fileName="";
for (int i = 1; i <= 4; i++) {
MultipartFile file = null;
switch (i) {
case 1:
file = page1;
fileName = "Scan1";
break;
case 2:
file = page2;
fileName = "Scan2";
break;
case 3:
file = page3;
fileName = "Scan3";
break;
case 4:
file = page4;
fileName = "Scan4";
break;
}
if (file != null && !file.isEmpty()) {
try {
// Get the bytes of the file
byte[] bytes = file.getBytes();
// Set the file path where you want to save it
String uploadDirectory = environment.getProperty("file.upload.directory");
String serviceFolderName = environment.getProperty("cp_foldername");
uploadDirectory = uploadDirectory + serviceFolderName;
// File name
fileName = petitionId + "_" + fileName + "_" + petitionNoString + "_" + file.getOriginalFilename();
//File Size
Long fileSize = file.getSize();
// File Type
String fileType = file.getContentType();
// Create directory if it doesn't exist
Path directoryPath = Paths.get(uploadDirectory);
if (!Files.exists(directoryPath)) {
Files.createDirectories(directoryPath);
}
String filePath = uploadDirectory + "/" + fileName;
// Create a new Path object
Path path = Paths.get(filePath);
// Write the bytes to the file
Files.write(path, bytes);
// Save the file path to a database
String sqlQuery = "INSERT INTO `pentition_files`(`created_by`, `file_name`, `file_size`, `file_type`, `petition_no`, `petition_id`) "
+ "VALUES ('"+createdBy+"','"+fileName+"','"+fileSize+"','"+fileType+"','"+petitionNoString+"','"+petitionId+"')";
jdbcTemplate.update(sqlQuery);
} catch (IOException e) {
e.printStackTrace();
return "Failed to save file " + file.getOriginalFilename();
}
}
}
return "success";
}
@Transactional
public boolean updatePetition(
String petitionType,
String petitionNo,
String createdBy,
String petitionerName,
String petitionerMobile,
String petitionerAddress,
String petitionerPincode,
String petitionerComplaint,
String complaintNature) {
try {
// Complaint Type List
List complaintTypelist = getComplaintTypeList();
// Convert the list of maps to a list of ComplaintType objects
List<ComplaintType> complaintTypes = convertToComplaintTypes(complaintTypelist);
// Map complaint types
String petitionerComplaint_txt = mapComplaintTypes(complaintTypes, petitionerComplaint);
/*
String sqlQuery = "UPDATE `petition` SET "
+ "`petition_type`='"+petitionType+"', `created_by`='"+createdBy+"', `petitioner_name`='"+petitionerName+"', `petitioner_mobile`='"+petitionerMobile+"', "
+ "`petitioner_address`='"+petitionerAddress+"', `petitioner_pincode`='"+petitionerPincode+"',"
+ "`petitioner_complaint`='"+petitionerComplaint+"', `petitioner_complaint_txt`='"+petitionerComplaint_txt+"', `complaint_nature`='"+complaintNature+"' "
+ "WHERE (`petition_no`='"+petitionNo+"') LIMIT 1";
// Use JdbcTemplate's update method to execute the query with parameters
jdbcTemplate.update(sqlQuery);
*/
String sqlQuery = "UPDATE `petition` SET "
+ "`petition_type` = ?, `created_by` = ?, `petitioner_name` = ?, `petitioner_mobile` = ?, "
+ "`petitioner_address` = ?, `petitioner_pincode` = ?, `petitioner_complaint` = ?, "
+ "`petitioner_complaint_txt` = ?, `complaint_nature` = ? "
+ "WHERE `petition_no` = ? LIMIT 1";
int rowsUpdated = jdbcTemplate.update(sqlQuery,
petitionType,
createdBy,
petitionerName,
petitionerMobile,
petitionerAddress,
petitionerPincode,
petitionerComplaint,
petitionerComplaint_txt, // Safely includes single quotes
complaintNature,
petitionNo
);
// Add Petition Scan File in the database
//addPetitionFile(createdBy,lastInsertId, petitionNoString, page1, page2, page3, page4);
return true; // If no exception, query executed successfully
} catch (DataAccessException e) {
// Handle exception (e.g., log error)
e.printStackTrace();
return false; // Query execution failed
}
}
@Transactional
public boolean updatePetitionStatus(String petitionId,String petitionNo) {
String status_value = "close";
List<Map<String, Object>> petitionMappingDetails = getPetitionMappingDetails(petitionNo, petitionId);
for (Map<String, Object> mapping : petitionMappingDetails) {
// Access values from the map using keys
Object status = mapping.get("status");
// Check if status is "close"
if (!"close".equals(status)) {
status_value = "partial";
}
}
String sqlQuery = "UPDATE `petition` SET `status`='"+status_value+"' WHERE `petition_no`='"+petitionNo+"' AND `petition_id`='"+petitionId+"' LIMIT 1";
jdbcTemplate.update(sqlQuery);
System.out.println(sqlQuery);
return true;
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getPetitionMappingDetails(String petitionNo, String petitionId) {
try {
String sqlQuery = "SELECT * FROM petition_mapping WHERE (`petition_id`= ? AND petition_no = ?) AND (`isactive`=1 AND `isdelete`=0)";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sqlQuery, petitionId, petitionNo);
return result;
} catch (DataAccessException e) {
e.printStackTrace();
return null; // Return null or handle error appropriately
}
}
@Transactional
public boolean unmapComplient(String petitionId, String petitionNo) {
String sqlQuery = "UPDATE `petition_mapping` SET `isactive`='0',`isdelete`='1' WHERE `petition_id`='"+petitionId+"' AND `petition_no`='"+petitionNo+"'";
jdbcTemplate.update(sqlQuery);
return true;
}
@Transactional
public boolean mapComplientToOfficer(
String createdBy, String petitionId, String petitionNo, String complaintId, String officerId) {
String sqlQuery = "INSERT INTO `petition_mapping`"
+ "(`created_by`, `off_id`, `petition_no`, `complaint_typeid`, `petition_id`) "
+ "VALUES (?, ?, ?, ?, ?)";
jdbcTemplate.update(sqlQuery, createdBy, officerId, petitionNo, complaintId, petitionId);
return true;
}
@Transactional
public boolean updateMapComplientStatus(String mapId,String status) {
String sqlQuery = "UPDATE `petition_mapping` SET `status`=? WHERE `mapid`=? LIMIT 1";
jdbcTemplate.update(sqlQuery, status, mapId);
System.out.println(sqlQuery);
return true;
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getComplaintMappingDetails(String petitionNo, String petitionId, String complaintTypeId) {
try {
String sqlQuery = "SELECT * FROM petition_mapping WHERE (`petition_id`= ? AND petition_no = ?) AND `complaint_typeid`= ? AND (`isactive`=1 AND `isdelete`=0) LIMIT 1";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sqlQuery, petitionId, petitionNo,complaintTypeId);
return result;
} catch (DataAccessException e) {
e.printStackTrace();
return null; // Return null or handle error appropriately
}
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getComplaintList() {
try {
String sqlQuery = "SELECT "
+ " p.`petition_id`, p.`cdate`, p.`created_by`, p.`isactive`, p.`isdelete`, p.`petition_no`, "
+ " p.`petitioner_address`, p.`petitioner_complaint`, p.`petitioner_complaint_txt`, "
+ " p.`petitioner_mobile`, p.`petitioner_name`, p.`complaint_nature`, p.`petitioner_pincode`, "
+ " pm.`mapid`, pm.`complaint_typeid`, pm.`off_id`, pm.`status`, om.`off_nm`, ctype.`complaint_type` "
+ " FROM "
+ " `petition` p, `petition_mapping` pm, `petition_master`.`officer_master` om, `petition_master`.`complaint_types` ctype "
+ " WHERE "
+ " (p.`isactive` = 1 AND p.`isdelete` = 0) "
+ " AND (pm.`isactive` = 1 AND pm.`isdelete` = 0) "
+ " AND (om.`isactive` = 1 AND om.`isdelete` = 0) "
+ " AND (om.`off_id` = pm.`off_id`) "
+ " AND (ctype.`complaint_typeid` = pm.`complaint_typeid`) "
+ " AND (p.`petition_id` = pm.`petition_id`)"
+ " ";
System.out.println(sqlQuery);
List<Map<String, Object>> result = jdbcTemplate.queryForList(sqlQuery);
// Iterate over the list of maps
for (Map<String, Object> map : result) {
// Get the value of the 'petitionNo' field from the map
String petitionNo = (String) map.get("petition_no");
// Encode the 'petitionNo' value using Base64Util
String petitionNoEncoded = Base64Util.encodeBase64(petitionNo);
// Add the encoded value as 'petitionNoEncode' to the map
map.put("petitionNoEncode", petitionNoEncoded);
}
return result;
} catch (DataAccessException e) {
e.printStackTrace();
return null; // Return null or handle error appropriately
}
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getComplaintListByPetitionId(String petitionId) {
try {
String sqlQuery = "SELECT "
+ " p.`petition_id`, p.`cdate`, p.`created_by`, p.`isactive`, p.`isdelete`, p.`petition_no`, "
+ " p.`petitioner_address`, p.`petitioner_complaint`, p.`petitioner_complaint_txt`, "
+ " p.`petitioner_mobile`, p.`petitioner_name`, p.`complaint_nature`, p.`petitioner_pincode`, p.`status` petition_status, "
+ " pm.`mapid`, pm.`complaint_typeid`, pm.`off_id`, pm.`status` complaint_status, pm.`cdate` mappedOn, om.`off_nm`, ctype.`complaint_type` "
+ " FROM "
+ " `mayor_petition`.`petition` p,`mayor_petition`.`petition_mapping` pm, `petition_master`.`officer_master` om, `petition_master`.`complaint_types` ctype "
+ " WHERE "
+ " (p.`petition_id` = '"+petitionId+"' AND p.`isactive` = 1 AND p.`isdelete` = 0) "
+ " AND (pm.`isactive` = 1 AND pm.`isdelete` = 0) "
+ " AND (om.`isactive` = 1 AND om.`isdelete` = 0) "
+ " AND (om.`off_id` = pm.`off_id`) "
+ " AND (ctype.`complaint_typeid` = pm.`complaint_typeid`) "
+ " AND (p.`petition_id` = pm.`petition_id`)"
+ " ";
System.out.println(sqlQuery);
List<Map<String, Object>> result = jdbcTemplate.queryForList(sqlQuery);
// Iterate over the list of maps
for (Map<String, Object> map : result) {
// Get the value of the 'petitionNo' field from the map
String petitionNo = (String) map.get("petition_no");
// Encode the 'petitionNo' value using Base64Util
String petitionNoEncoded = Base64Util.encodeBase64(petitionNo);
// Add the encoded value as 'petitionNoEncode' to the map
map.put("petitionNoEncode", petitionNoEncoded);
}
return result;
} catch (DataAccessException e) {
e.printStackTrace();
return null; // Return null or handle error appropriately
}
}
@Transactional(readOnly = true)
public List<Map<String, Object>> getComplaintDetails(String mapid) {
try {
String sqlQuery = "SELECT "
+ " p.`petition_id`, p.`cdate`, p.`created_by`, p.`isactive`, p.`isdelete`, p.`petition_no`, "
+ " p.`petitioner_address`, p.`petitioner_complaint`, p.`petitioner_complaint_txt`, "
+ " p.`petitioner_mobile`, p.`petitioner_name`, p.`complaint_nature`, p.`petitioner_pincode`, "
+ " pm.`mapid`, pm.`complaint_typeid`, pm.`off_id`, pm.`status`, om.`off_nm`, ctype.`complaint_type`, "
+ " COALESCE(pf.`mtm_pet_file_id`, 'No file available') AS mtm_pet_file_id, "
+ " COALESCE(pf.`cdate`, '') AS file_cdate, "
+ " COALESCE(pf.`created_by`, 'N/A') AS file_created_by, "
+ " COALESCE(pf.`file_name`, 'No file available') AS file_name, "
+ " COALESCE(pf.`file_size`, 0) AS file_size, "
+ " COALESCE(pf.`file_type`, 'Unknown') AS file_type, "
+ " COALESCE(pf.`isactive`, 0) AS file_isactive, "
+ " COALESCE(pf.`isdelete`, 0) AS file_isdelete "
+ " FROM "
+ " `petition` p "
+ " JOIN `petition_mapping` pm ON p.`petition_id` = pm.`petition_id` "
+ " JOIN `petition_master`.`officer_master` om ON om.`off_id` = pm.`off_id` "
+ " JOIN `petition_master`.`complaint_types` ctype ON ctype.`complaint_typeid` = pm.`complaint_typeid` "
+ " LEFT JOIN `pentition_files` pf ON p.`petition_id` = pf.`petition_id` "
+ " WHERE "
+ " pm.`mapid` = '" + mapid + "' "
+ " AND p.`isactive` = 1 AND p.`isdelete` = 0 "
+ " AND pm.`isactive` = 1 AND pm.`isdelete` = 0 "
+ " AND om.`isactive` = 1 AND om.`isdelete` = 0 ";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sqlQuery);
// Iterate over the list of maps
for (Map<String, Object> map : result) {
// Get the value of the 'petitionNo' field from the map
String petitionNo = (String) map.get("petition_no");
// Encode the 'petitionNo' value using Base64Util
String petitionNoEncoded = Base64Util.encodeBase64(petitionNo);
// Add the encoded value as 'petitionNoEncode' to the map
map.put("petitionNoEncode", petitionNoEncoded);
}
return result;
} catch (DataAccessException e) {
e.printStackTrace();
return null; // Return null or handle error appropriately
}
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getComplaintActionDetails(String mapId) {
try {
String sqlQuery = "SELECT * FROM `petition_action_taken` WHERE (`mapid`= ? AND `isactive`=1 AND `isdelete`=0) LIMIT 1";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sqlQuery, mapId);
return result;
} catch (DataAccessException e) {
e.printStackTrace();
return null; // Return null or handle error appropriately
}
}
@Transactional
public String saveComplanitStatus(
String createdBy,
String mapId,
String complaintStatus,
String complaintActionText,
MultipartFile actionPage1,
String petitionId,
String petitionNo) {
//System.out.println("I am from Service Page "+petitionerName);
//String complaintNature = "";
int lastInsertId = 0;
String sqlQuery = "INSERT INTO `petition_action_taken` "
+ "(`created_by`, `off_id`, `mapid`, `status`, "
+ "`comments`) "
+ "VALUES (?, ?, ?, ?, ?)";
try {
KeyHolder keyHolder = new GeneratedKeyHolder();
// Use JdbcTemplate's update method to execute the query with parameters
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sqlQuery, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, createdBy);
ps.setString(2, createdBy);
ps.setString(3, mapId);
ps.setString(4, complaintStatus);
ps.setString(5, complaintActionText);
return ps;
}, keyHolder);
// Get the last insert ID
lastInsertId = (int)keyHolder.getKey().longValue();
String actionID = "error";
if(lastInsertId>0) {
// Update Complaint Status
updateMapComplientStatus(mapId,"close");
// Update Petition Status
updatePetitionStatus(petitionId,petitionNo);
// Add Action Scan File in the database
addActionFile(mapId,lastInsertId, actionPage1);
actionID = ""+lastInsertId;
}
return actionID; // If no exception, query executed successfully
} catch (DataAccessException e) {
// Handle exception (e.g., log error)
e.printStackTrace();
return "error"; // Query execution failed
}
}
@Transactional
public String addActionFile( String mapId, int solmapid,
MultipartFile page1) {
MultipartFile file = page1;
String fileName = "Scan1_"+solmapid;
if (file != null && !file.isEmpty()) {
try {
// Get the bytes of the file
byte[] bytes = file.getBytes();
// Set the file path where you want to save it
String uploadDirectory = environment.getProperty("file.upload.directory");
String serviceFolderName = environment.getProperty("cp_foldername");
String serviceActionFolderName = environment.getProperty("cp_action_Foldername");
uploadDirectory = uploadDirectory + serviceFolderName +"/"+ serviceActionFolderName;
// File name
fileName = mapId + "_" + fileName + "_" + file.getOriginalFilename();
//File Size
Long fileSize = file.getSize();
// File Type
String fileType = file.getContentType();
// Create directory if it doesn't exist
Path directoryPath = Paths.get(uploadDirectory);
if (!Files.exists(directoryPath)) {
Files.createDirectories(directoryPath);
}
String filePath = uploadDirectory + "/" + fileName;
// Create a new Path object
Path path = Paths.get(filePath);
// Write the bytes to the file
Files.write(path, bytes);
// Save the file path to a database
String sqlQuery = "UPDATE `petition_action_taken` SET "
+ "`file_name`='"+fileName+"', "
+ "`file_size`='"+fileSize+"', "
+ "`file_type`='"+fileType+"' "
+ "WHERE `solmapid`='"+solmapid+"' LIMIT 1";
jdbcTemplate.update(sqlQuery);
} catch (IOException e) {
e.printStackTrace();
return "Failed to save file " + file.getOriginalFilename();
}
}
return "success";
}
}

58
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/service/PetitionMaster.java

@ -0,0 +1,58 @@
package in.gov.chennaicorporation.gccoffice.c_petition.service;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service("CPetitionMaster")
public class PetitionMaster {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysqlPetitionMasterDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getComplaintType(){
String SqlQuery = "";
SqlQuery = "SELECT * FROM `complaint_types` WHERE `isactive`=1 AND `isdelete`=0";
List<Map<String, Object>> result = jdbcTemplate.queryForList(SqlQuery);
return result;
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getOfficerList(){
String SqlQuery = "";
SqlQuery = "SELECT * FROM `officer_master` WHERE `isactive`=1 AND `isdelete`=0";
List<Map<String, Object>> result = jdbcTemplate.queryForList(SqlQuery);
return result;
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getPetitionTypes(){
String SqlQuery = "";
SqlQuery = "SELECT * FROM `petition_types` WHERE `isactive`=1 AND `isdelete`=0 ORDER BY `orderby` ASC";
List<Map<String, Object>> result = jdbcTemplate.queryForList(SqlQuery);
return result;
}
}

1
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/c_petition/service/package-info.java

@ -0,0 +1 @@
package in.gov.chennaicorporation.gccoffice.c_petition.service;

112
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/AgentAssignAPIController.java

@ -0,0 +1,112 @@
package in.gov.chennaicorporation.gccoffice.callcenter.controller;
import java.util.ArrayList;
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.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentAssignService;
@RequestMapping("/gcc/api/callcenter/admin")
@RestController("callcentercontroller")
public class AgentAssignAPIController
{
private AgentAssignService campaignmaster;
@Autowired
public AgentAssignAPIController(AgentAssignService campaignmaster) {
this.campaignmaster = campaignmaster;
}
@GetMapping("/getcategory")
public List<Map<String, Object>> getcategory()
{
return campaignmaster.getcategory();
}
@GetMapping("/getcampaignbycategory")
public List<Map<String, Object>> getcampaignbycategory(@RequestParam int id)
{
return campaignmaster.getcampaignbycategory(id);
}
// @GetMapping("/getcampaignbyid")
// public List<Map<String, Object>> getcampaignbyid(@RequestParam int id)
// {
// return campaignmaster.getcampaignbyid(id);
// }
@GetMapping("/getagentsfortask")
public List<Map<String, Object>> getagentsfortask(@RequestParam int id)
{
return campaignmaster.getagentsfortask(id);
}
@PostMapping("/addagentsfortask")
public ResponseEntity<List<Map<String, Object>>> addagentsfortask(@RequestBody List<Map<String, Object>> requestList) {
//System.out.println("Received POST request with data: " + requestList);
List<Map<String, Object>> insertedAgents = new ArrayList<>(); // To store successfully inserted agents
try {
for (Map<String, Object> request : requestList) {
int agentId = (int) request.get("agentId");
int categoryId = (int) request.get("categoryId");
int campaignId = (int) request.get("campaignId");
// Call the service method to insert the agent details
int rowsAffected = campaignmaster.addagentsfortask(agentId, categoryId, campaignId);
if (rowsAffected > 0) {
// If the insert was successful, add the agent data to the response list
Map<String, Object> insertedAgent = new HashMap<>();
insertedAgent.put("categoryId", categoryId);
insertedAgent.put("campaignId", campaignId);
insertedAgent.put("agentId", agentId);
insertedAgents.add(insertedAgent); // Add the successfully inserted agent to the list
} else {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Collections.singletonList(Collections.singletonMap("error", "Failed to add agent for campaignId: " + campaignId)));
}
}
// Return the list of successfully inserted agents
return ResponseEntity.status(HttpStatus.CREATED).body(insertedAgents);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(Collections.singletonList(Collections.singletonMap("error", "Invalid request data: " + e.getMessage())));
}
}
@GetMapping("/getassignedcampaign")
public List<Map<String, Object>> checkcampaigninassignedtable(@RequestParam int id)
{
return campaignmaster.checkcampaigninassignedtable(id);
}
@GetMapping("/deleteassignedbyid")
public int editagentsfortask(@RequestParam int id)
{
return campaignmaster.editagentsfortask(id);
}
@GetMapping("/getcampaignbyid")
public List<Map<String, Object>> getcampaignquestionbyid(@RequestParam int id){
return campaignmaster.getcampaignquestionbyid(id);
}
}

320
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/AgentsAPIController.java

@ -0,0 +1,320 @@
package in.gov.chennaicorporation.gccoffice.callcenter.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentsService;
@RequestMapping("/gcc/api/agents")
@RestController
public class AgentsAPIController {
@Autowired
private AgentsService agentsService;
@GetMapping("/excel")
public List<Map<String, Object>> fetchDataFromExcel(@RequestParam int categoryId,@RequestParam Long campaignId) {
try {
return agentsService.fetchDataFromExcel(categoryId,campaignId);
} catch (IOException e) {
e.printStackTrace();
return null; // Handle the exception as needed
}
}
@PostMapping("/saveExcelData")
public String saveExcelData( @RequestParam int categoryId,@RequestParam Long campaignId,@RequestParam String filePath) {
try {
// Fetch data from Excel
List<Map<String, Object>> excelData = agentsService.getExcelData(categoryId,campaignId, filePath);
// Save data into the database
agentsService.saveExcelData(excelData);
return "Data saved successfully";
} catch (IOException e) {
e.printStackTrace();
return "Failed to save data";
}
}
@GetMapping("/getdataByIds")
public List<Map<String, Object>> getdataByIds(@RequestParam List<Integer> ids) {
return agentsService.getdataByIds(ids);
}
@GetMapping("/getPendingDataByIds")
public List<Map<String, Object>> getPendingDataByIds(@RequestParam List<Integer> ids) {
return agentsService.getPendingDataByIds(ids);
}
// @PostMapping("/updatecall")
// public ResponseEntity<String> updatecall(@RequestBody Map<String, Object> callData)
// {
// String call_status = (String) callData.get("call_status");
// int data_id = (int) callData.get("data_id");
// int agent_id=(int) callData.get("agent_id");
// int campaign_id=(int) callData.get("campaign_id");
//
// if (call_status == null || call_status.isEmpty()) {
// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Call status is required.");
// }
//
// agentsService.saveInLogsTable(campaign_id, agent_id, data_id,call_status);
//
// return ResponseEntity.ok("Data Inserted successfully.");
// }
@GetMapping("/getAgentNames")
public List<Map<String, Object>> getAgentsNameById(@RequestParam List<Integer> agentIds){
return agentsService.getAgentsNameById(agentIds);
}
@GetMapping("/getDataFields")
public List<Map<String, Object>> getDataDetailsById(
@RequestParam String originalDataIds) throws JsonProcessingException {
// Parse originalDataIds from JSON string
ObjectMapper objectMapper = new ObjectMapper();
List<List<Integer>> originalDataIdsList = objectMapper.readValue(originalDataIds, new TypeReference<List<List<Integer>>>() {});
// Prepare a list to hold the results for each sub-array
List<Map<String, Object>> groupedResults = new ArrayList<>();
// Iterate through each sub-array of originalDataIds
for (List<Integer> dataIds : originalDataIdsList) {
List<Map<String, Object>> results = agentsService.getDataDetailsById(dataIds);
// Group results according to your business logic
Map<String, Object> combinedResult = new HashMap<>();
for (Map<String, Object> result : results) {
combinedResult.putAll(result);
}
groupedResults.add(combinedResult);
}
return groupedResults;
}
@GetMapping("/getCompletedDataFields")
public Map<String, Object> getCompletedDataDetailsById(
@RequestParam String originalCDataIds) throws JsonProcessingException {
// Parse originalDataIds from JSON string
ObjectMapper objectMapper = new ObjectMapper();
List<Integer> originalCDataIdsList = objectMapper.readValue(originalCDataIds, new TypeReference<List<Integer>>() {});
// Prepare a list to hold the results for each sub-array
//List<Map<String, Object>> groupedCompletedResults = new ArrayList<>();
List<Integer> completedDataIds = new ArrayList<>(); // List to hold data_ids with Complete_count > 0
// Iterate through each sub-array of originalDataIds
List<Map<String, Object>> results = agentsService.getCompletedDataDetailsById(originalCDataIdsList);
// Group results according to your business logic
//Map<String, Object> CompletedcombinedResult = new HashMap<>();
for (Map<String, Object> result : results) {
if (result.get("Complete_count") != null && ((Number) result.get("Complete_count")).intValue() > 0) {
completedDataIds.add((Integer) result.get("data_id"));
}
//groupedCompletedResults.add(result);
}
// Prepare the final response containing grouped results and completed dataIds
Map<String, Object> response = new HashMap<>();
//response.put("groupedCompletedResults", groupedCompletedResults);
response.put("completedDataIds", completedDataIds);
return response;
}
@GetMapping("/getCompletedDataById")
public List<Map<String, Object>> getCompletedDataById(@RequestParam List<Integer> completedDataIds){
return agentsService.getCompletedDataById(completedDataIds);
}
@PostMapping("/furtherAssignedAgents")
public ResponseEntity<Map<String, String>> updateAgentAssigndata(
@RequestBody Map<String, Object> requestData) {
String campaign_id = (String) requestData.get("campaign_id");
String category_id = (String) requestData.get("category_id");
String call_per_agent = (String) requestData.get("call_per_agent");
// Correct key name for selected agents
List<String> selectedAgentsList = (List<String>) requestData.get("selected_agents");
//System.out.println("campaign_id=" + campaign_id);
//System.out.println("category_id=" + category_id);
//System.out.println("call_per_agent=" + call_per_agent);
//System.out.println("selectedAgentsList=" + selectedAgentsList);
int campaignId = Integer.parseInt(campaign_id);
int categoryId = Integer.parseInt(category_id);
int callperagent = Integer.parseInt(call_per_agent);
agentsService.resetAgentAssignmentForNextDay(categoryId,campaignId);
int calls_assign = callperagent * selectedAgentsList.size();
//System.out.println("calls_assign== " + calls_assign);
List<Integer> DataIds=agentsService.getDataIdForFurtherAssign(categoryId, campaignId);
//System.out.println("dataids=== " + DataIds);
if (!DataIds.isEmpty()) {
int dataIndex = 0; // Initialize data index pointer
for (String agentId : selectedAgentsList) {
int selectedAgentId = Integer.parseInt(agentId);
agentsService.addAgentsForCampaign(selectedAgentId, categoryId, campaignId);
// Iterate for noOfCalls times and assign data IDs to the current agent
for (int i = 0; i < callperagent && dataIndex < DataIds.size(); i++, dataIndex++) {
int DataId = DataIds.get(dataIndex);
agentsService.updateAgentForCampaign(
selectedAgentId,
categoryId,
campaignId,
DataId
);
}
}
}
else {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Map.of("status", "error", "message", "No data available for Further assign."));
}
return ResponseEntity.ok(Map.of("status", "success", "message", "Campaign details saved successfully"));
}
////////////////////Ajith code//////////////////////
@GetMapping("/Campaignview")
public ResponseEntity<?> getCampaignview(@RequestParam int categoryId, @RequestParam int agentId, @RequestParam int dataId) {
try {
List<Map<String, Object>> response = agentsService.getFilteredFields(categoryId, agentId, dataId);
if (response.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No matching data found.");
}
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error: " + e.getMessage());
}
}
@GetMapping("/questions")
public List<Map<String, Object>> getCampaignQuestions(
@RequestParam int categoryId,
@RequestParam int campaignId) {
return agentsService.getCampaignQuestions(categoryId, campaignId);
}
@GetMapping("/fetchAnswer")
public List<Map<String, Object>> fetchAnswer(
@RequestParam int campaignId,
@RequestParam int agentId,
@RequestParam int questionId,
@RequestParam int dataId) {
return agentsService.FetchAnswer(campaignId,agentId,questionId,dataId);
}
@PostMapping("/submitAnswers")
public ResponseEntity<String> submitAnswers(@RequestBody Map<String, List<Map<String, Object>>> requestData) {
List<Map<String, Object>> answers = requestData.get("answers");
if (answers == null || answers.isEmpty()) {
return ResponseEntity.badRequest().body("No answers provided.");
}
agentsService.saveAnswers(answers);
return ResponseEntity.ok("Answers submitted successfully");
}
@GetMapping("/callstatus")
public List<Map<String, Object>> getCallStatus() {
//System.out.println("dropdown");
return agentsService.getCallStatus();
}
@GetMapping("/checkCounts")
public List<Map<String, Object>> checkCounts(
@RequestParam int campaignId,
@RequestParam int dataId) {
return agentsService.checkCounts(campaignId,dataId);
}
@PostMapping("/savecall")
public ResponseEntity<String> savecall(@RequestBody Map<String, Object> callData) {
String call_status = (String) callData.get("call_status");
String remarks = (String) callData.get("remarks");
int data_id = Integer.parseInt(callData.get("data_id").toString());
int agent_id = Integer.parseInt(callData.get("agent_id").toString());
int campaign_id = Integer.parseInt(callData.get("campaign_id").toString());
// System.out.println("controler");
//System.out.println(call_status);
// Add a debug statement to check the received values
// System.out.println("Received call_status: " + call_status);
if (call_status == null || call_status.isEmpty()) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Call status is required.");
}
agentsService.saveCallLogs(call_status, remarks,data_id,agent_id);
agentsService.saveInLogsTable(campaign_id, agent_id, data_id,call_status,remarks);
return ResponseEntity.ok("Data Inserted successfully.");
}
}

36
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/AttendanceAPIController.java

@ -0,0 +1,36 @@
package in.gov.chennaicorporation.gccoffice.callcenter.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@RequestMapping("/gcc/api/attendance")
@RestController
public class AttendanceAPIController {
private AppConfig appConfig;
private final RestTemplate restTemplate;
@Autowired
public AttendanceAPIController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@GetMapping("/getAttendancedetails")
public String getAttendancedetails(@RequestParam String fromDate,@RequestParam String toDate){
String apiUrl = appConfig.attendanceReport + "/callcenter/api/attendance/getattendancereport"+"?fromDate="+ fromDate + "&toDate="+ toDate;
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
return responseEntity.getBody();
}
}

643
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/CampaignAPIController.java

@ -0,0 +1,643 @@
package in.gov.chennaicorporation.gccoffice.callcenter.controller;
import org.apache.poi.ss.usermodel.*;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.callcenter.service.AddcategoryServices;
import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentAssignService;
import in.gov.chennaicorporation.gccoffice.callcenter.service.CampaignService;
@RestController("callcenterapicontroller")
@RequestMapping("gcc/api/campaign")
public class CampaignAPIController {
@Autowired
private CampaignService campaignService;
@Autowired
private AddcategoryServices addCategoryServices; // Injecting the service
@Autowired
private AgentAssignService agentsAssignService;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private Environment environment;
@GetMapping("/getCampaignDetails")
public ResponseEntity<Map<String, Object>> getCampaignDetails() {
Map<String, Object> response = new HashMap<>();
List<Map<String, Object>> data = campaignService.getCampaignDetails();
response.put("data", data);
return ResponseEntity.ok(response);
}
// Endpoint to get campaign details by ID
@GetMapping("/getCampaignDetailsById")
public @ResponseBody List<Map<String, Object>> getCampaignDetailsById(@RequestParam("campaign_id") Long campaignId) {
return campaignService.getCampaignDetailsById(campaignId);
}
@PostMapping("/updateCampaign")
public ResponseEntity<String> updateCampaign(
@RequestBody Map<String, Object> requestData) {
Long campaign_id = ((Number) requestData.get("campaign_id")).longValue();
String end_date = (String) requestData.get("end_date");
List<Map<String, Object>> questionsData =
(List<Map<String, Object>>) requestData.get("questionsData");
if (campaign_id == null) {
return ResponseEntity.badRequest().body("Campaign ID is required.");
}
try {
// Update campaign details
campaignService.updateCampaign(campaign_id, end_date);
// Save questions and answers
for (Map<String, Object> questionMap : questionsData) {
String category = (String) questionMap.get("category");
String question = (String) questionMap.get("question");
String answerType = (String) questionMap.get("answerType");
List<String> answers = (List<String>) questionMap.get("answers");
if (category != null && question != null && answerType != null) {
campaignService.saveQuestionsAndAnswers(
category,
String.valueOf(campaign_id), // Corrected data type
question,
answerType,
answers
);
}
}
return ResponseEntity.ok("Campaign updated successfully.");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error updating campaign: " + e.getMessage());
}
}
//save question and ansewers for campaign
@PostMapping("/saveQuestionsAndAnswers")
public ResponseEntity<String> saveQuestions(@RequestBody List<Map<String, Object>> requestData) {
String response = campaignService.saveQuestionsAnswers(requestData);
return ResponseEntity.ok(response);
}
//save file and get path
private String saveFile(MultipartFile file) throws IOException {
String uploadDirectory = environment.getProperty("file.upload.directory");
String folderName = environment.getProperty("campaign.foldername");
String fileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + "_" + file.getOriginalFilename();
String folderPath = uploadDirectory + "/" + folderName + "/excel/";
Path dirPath = Paths.get(folderPath);
if (!Files.exists(dirPath)) {
Files.createDirectories(dirPath);
}
Path filePath = dirPath.resolve(fileName);
Files.write(filePath, file.getBytes());
return filePath.toAbsolutePath().toString();
}
//read uploaded excel data and make condition for each category uploading same excel columns are other some other?
private List<Map<String, Object>> readExcelData(InputStream inputStream, List<String> categoryColumns) throws IOException {
List<Map<String, Object>> dataList = new ArrayList<>();
try (Workbook workbook = new XSSFWorkbook(inputStream)) {
Sheet sheet = workbook.getSheetAt(0);
FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
// Read header row from Excel
Row headerRow = sheet.getRow(0);
List<String> excelHeaders = new ArrayList<>();
for (Cell cell : headerRow) {
excelHeaders.add(cell.getStringCellValue().trim());
}
// Compare Excel headers with category columns
if (!excelHeaders.containsAll(categoryColumns)) {
// throw new IllegalArgumentException("Excel data does not match the category columns.");
}
// Proceed with reading data only if headers match
for (Row row : sheet) {
if (row.getRowNum() == 0) continue; // Skip header row
Map<String, Object> dataMap = new HashMap<>();
for (Cell cell : row) {
String cellValue = "";
switch (formulaEvaluator.evaluateInCell(cell).getCellType()) {
case STRING:
cellValue = cell.getStringCellValue();
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
cellValue = new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
} else {
// Check if value is an integer (whole number)
if (cell.getNumericCellValue() % 1 == 0) {
cellValue = String.valueOf((long) cell.getNumericCellValue()); // Format as integer
} else {
cellValue = String.valueOf(cell.getNumericCellValue()); // Keep decimal values as they are
}
}
break;
case BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
default:
cellValue = "Unknown";
break;
}
// Map cell data to correct column name
dataMap.put(excelHeaders.get(cell.getColumnIndex()), cellValue);
}
if (!dataMap.isEmpty()) {
dataList.add(dataMap);
}
}
}
return dataList;
}
@GetMapping("/getExcelData")
public ResponseEntity<List<Map<String, Object>>> getExcelData(@RequestParam("filePath") String filePath) {
try {
// Read data from the uploaded Excel file
List<Map<String, Object>> excelData = readExcelData(new FileInputStream(filePath), null);
// Return data as JSON
return ResponseEntity.ok(excelData);
} catch (IOException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
@GetMapping("/getlastCampaignid")
public List<Map<String, Object>> getLastRow()
{
return campaignService.getLastRow();
}
@GetMapping("/startcampaign")
public List<Map<String, Object>> getDataforAgents(@RequestParam int campaign_id,@RequestParam int calls_per_agent)
{
return campaignService.getDataforAgents(campaign_id, calls_per_agent);
}
@GetMapping("/viewcampaignstatus")
public List<Map<String, Object>> viewcampaignstatus(@RequestParam int campaign_id)
{
return campaignService.viewcampaignstatus(campaign_id);
}
@GetMapping("/viewcompletedby")
public List<Map<String, Object>> viewcompletedby(@RequestParam int campaign_id,@RequestParam int agent_id)
{
return campaignService.viewcompletedby(campaign_id,agent_id);
}
@PostMapping(value = "/savecampaign", consumes = {"multipart/form-data"})
public ResponseEntity<Map<String, String>> saveCampaign(
@RequestParam String campaignId,
@RequestParam String categoryId,
@RequestParam String eventStartDate,
@RequestParam String eventEndDate,
@RequestParam int noOfCalls,
@RequestParam String description,
@RequestParam(required = false) String questionsData, // JSON as String
@RequestParam(required = false) String selectedAgents // JSON string
) {
// Convert JSON strings to List objects
List<Map<String, Object>> questionsDataList = new ArrayList<>();
List<String> selectedAgentsList = new ArrayList<>();
try {
if (questionsData != null) {
questionsDataList = new ObjectMapper().readValue(questionsData, new TypeReference<List<Map<String, Object>>>() {});
}
if (selectedAgents != null) {
selectedAgentsList = new ObjectMapper().readValue(selectedAgents, new TypeReference<List<String>>() {});
}
} catch (JsonProcessingException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(Map.of("status", "error", "message", "Invalid JSON format in request data"));
}
// Campaign Details Mapping
Map<String, Object> campaignDetails = new HashMap<>();
campaignDetails.put("campaign_id", campaignId);
campaignDetails.put("category_id", categoryId);
campaignDetails.put("start_date", eventStartDate);
campaignDetails.put("end_date", eventEndDate);
campaignDetails.put("calls_per_agent", noOfCalls);
campaignDetails.put("description", description);
try {
campaignService.saveCampaignDetails(campaignDetails);
// Step 3: Assign Agents for the Campaign
if (!selectedAgentsList.isEmpty()) {
int parsedCampaignId = Integer.parseInt(campaignId);
int parsedCategoryId = Integer.parseInt(categoryId);
System.out.println("selectedAgentsList====== " + selectedAgentsList);
int calls_assign = noOfCalls * selectedAgentsList.size();
System.out.println("calls_assign== " + calls_assign);
List<Integer> DataIds=agentsAssignService.getDataIdForInitialAssign(parsedCategoryId, parsedCampaignId);
for (String agentId : selectedAgentsList) {
int selectedAgentId = Integer.parseInt(agentId);
agentsAssignService.addAgentsForCampaign(selectedAgentId, parsedCategoryId, parsedCampaignId);
}
//System.out.println("dataids=== " + DataIds);
if (!DataIds.isEmpty()) {
int dataIndex = 0; // Initialize data index pointer
for (String agentId : selectedAgentsList) {
int selectedAgentId = Integer.parseInt(agentId);
// Iterate for noOfCalls times and assign data IDs to the current agent
for (int i = 0; i < noOfCalls && dataIndex < DataIds.size(); i++, dataIndex++) {
int DataId = DataIds.get(dataIndex);
agentsAssignService.updateAgentForCampaign(
selectedAgentId,
parsedCategoryId,
parsedCampaignId,
DataId
);
}
}
// Update campaign status to 'ONGOING' after successful assignment
campaignService.updateCampaignStatus(parsedCampaignId, parsedCategoryId);
}
else {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Map.of("status", "error", "message", "No data available for initial assignment."));
}
}
// Step 4: Save Questions and Answers
if (!questionsDataList.isEmpty()) {
for (Map<String, Object> questionMap : questionsDataList) {
String question = (String) questionMap.get("question");
String answerType = (String) questionMap.get("answerType");
List<String> answers = (List<String>) questionMap.get("answers");
if (question != null && answerType != null) {
campaignService.saveQuestionsAndAnswers(
categoryId,
campaignId,
question,
answerType,
answers
);
} else {
System.out.println("Skipping invalid question data: " + questionMap);
}
}
}
}
catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("status", "error", "message", "Failed to save campaign details: " + e.getMessage()));
}
return ResponseEntity.ok(Map.of("status", "success", "message", "Campaign details saved successfully"));
}
//save excel data separate method
@PostMapping(value = "/saveexcelcampaign" ,consumes = {"multipart/form-data"})
public Map<String, String> saveExcelCampaign(
@RequestParam String name,
@RequestParam String category,
@RequestPart MultipartFile file) {
//System.out.println("Received campaign data:");
//System.out.println("Name: " + name);
//System.out.println("Category: " + category);
//System.out.println("File Name: " + file.getOriginalFilename());
Map<String, Object> campaignDetails = new HashMap<>();
campaignDetails.put("campaign_name", name);
campaignDetails.put("category_id", category);
try {
// Get category-specific columns
List<Map<String, Object>> categoryColumns = addCategoryServices.getCategoryColumns(Integer.parseInt(category));
/*
//System.out.println("categorycolmns: " + categoryColumns);
List<String> expectedHeaders = categoryColumns.stream()
.map(column -> column.get("column_name").toString())
.collect(Collectors.toList());
*/
List<String> expectedHeaders = new ArrayList<String>();
for (Map<String, Object> column : categoryColumns) {
Object columnNameObj = column.get("column_name");
if (columnNameObj != null) {
expectedHeaders.add(columnNameObj.toString());
}
}
// Fetch field_ columns from upload_data table
List<String> fieldColumns = campaignService.getUploadDataFieldColumns();
//System.out.println("fieldColumns: " + fieldColumns);
// Read uploaded Excel data and extract headers
List<Map<String, Object>> excelData = readExcelData(file.getInputStream(), expectedHeaders);
// System.out.println("excedata: " + excelData );
List<String> uploadedHeaders = new ArrayList<>(excelData.get(0).keySet()); // Extract headers from first row
//System.out.println("uploadeddata : " + uploadedHeaders);
// Check column count mismatch with field_ columns
if (uploadedHeaders.size() > fieldColumns.size()) {
Map<String, String> response = new HashMap<>();
response.put("status", "column_mismatch"); // Changed status to differentiate
response.put("message", "Extend the columns in Database, Inform Admin.");
return response;
}
// Validate headers
if (!new HashSet<>(expectedHeaders).equals(new HashSet<>(uploadedHeaders))) {
Map<String, String> response = new HashMap<>();
response.put("status", "header_mismatch"); // Changed status to differentiate
response.put("message", "Excel data does not match the category columns.");
return response;
}
String fileUrl = saveFile(file);
campaignDetails.put("excel_url", fileUrl);
//System.out.println("Campaign Details: " + campaignDetails);
//System.out.println("Excel Data: " + excelData);
campaignService.saveCampaignDetailsExcel(campaignDetails);
int lastId = campaignService.getLastInsertedCampaignId();
String excelUrl = campaignService.getExcelUrlByCampaignId(lastId);
//List<Map<String, Object>> excelDatas = readExcelDataupdated(new FileInputStream(excelUrl));
List<Map<String, Object>> excelDatas = readExcelData(new FileInputStream(excelUrl), uploadedHeaders);
//System.out.println("excelDatas:" + excelDatas);
for (Map<String, Object> row : excelDatas) {
campaignService.saveUploadData(category, lastId, row,expectedHeaders);
//System.out.println("exceldatas:" + excelDatas);
}
Map<String, String> response = new HashMap<>();
response.put("status", "success");
response.put("message", "Campaign and Excel saved successfully");
return response;
}
catch (IOException e) {
e.printStackTrace();
Map<String, String> response = new HashMap<>();
response.put("status", "error");
response.put("message", "Failed to save campaign details: "+ e.getMessage());
return response;
}
}
@GetMapping("/availableAgents")
public ResponseEntity<List<Map<String, Object>>> getAvailableAgents() {
// Query 1: Fetch OUTBOUND agents
String outboundAgentsQuery = "SELECT agent_name, agent_id, calling_type " +
"FROM gcc_1913_qaqc.agents_list " +
"WHERE calling_type='OUTBOUND'";
List<Map<String, Object>> outboundAgents = jdbcTemplate.queryForList(outboundAgentsQuery);
//System.out.println("outboundagents" + outboundAgents);
// Query 2: Fetch agents from ongoing campaigns
String ongoingCampaignAgentsQuery = "SELECT ca.agent_id " +
"FROM gcc_1913_campaign.campaign_request cr " +
"JOIN gcc_1913_campaign.agent_assign ca " +
"ON ca.campaign_id = cr.campaign_id " +
"WHERE cr.campaign_status = 'ONGOING'";
List<Map<String, Object>> ongoingAgents = jdbcTemplate.queryForList(ongoingCampaignAgentsQuery);
//System.out.println("ongoingAgents" + ongoingAgents);
// Extract agent IDs from both lists
/*
Set<Integer> ongoingAgentIds = ongoingAgents.stream()
.map(agent -> (Integer) agent.get("agent_id"))
.collect(Collectors.toSet());
// Filter OUTBOUND agents who are NOT in ongoing agents
List<Map<String, Object>> availableAgents = outboundAgents.stream()
.filter(agent -> !ongoingAgentIds.contains(agent.get("agent_id")))
.collect(Collectors.toList());
*/
Set<Integer> ongoingAgentIds = new HashSet<>();
for (Map<String, Object> agent : ongoingAgents) {
Object idObj = agent.get("agent_id");
if (idObj != null) {
ongoingAgentIds.add(Integer.parseInt(idObj.toString()));
}
}
// Filter OUTBOUND agents who are NOT in ongoing agents
List<Map<String, Object>> availableAgents = new ArrayList<>();
for (Map<String, Object> agent : outboundAgents) {
Object idObj = agent.get("agent_id");
if (idObj != null) {
Integer agentId = Integer.parseInt(idObj.toString());
if (!ongoingAgentIds.contains(agentId)) {
availableAgents.add(agent);
}
}
}
return ResponseEntity.ok(availableAgents);
}
private Object getCellValue(Cell cell) {
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue().trim();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
return cell.getDateCellValue(); // Return Date for date-formatted cells
}
double numericValue = cell.getNumericCellValue();
// ✅ Convert numeric values that are likely mobile numbers to string
if (String.valueOf((long) numericValue).length() >= 10) { // Assuming mobile numbers are at least 10 digits
return String.valueOf((long) numericValue);
}
// ✅ Convert to int if no decimal part, else keep as double
return (numericValue % 1 == 0) ? (int) numericValue : numericValue;
case BOOLEAN:
return cell.getBooleanCellValue();
case FORMULA:
return cell.getCellFormula(); // Return formula as string
case BLANK:
return "";
default:
return "";
}
}
//question and answers report page api
@GetMapping("/question-answers")
public ResponseEntity<?> getQuestionAnswers(@RequestParam int campaignId) {
List<Map<String, Object>> response = campaignService.getQuestionAnswers(campaignId);
return ResponseEntity.ok(response);
}
//dizo campaignlist apicontroller
// Query Parameter Approach
@GetMapping("/statistics")
public ResponseEntity<Map<String, Object>> getCampaignStatisticsByQuery(@RequestParam int campaignId) {
Map<String, Object> statistics = campaignService.getCampaignStatistics(campaignId);
return ResponseEntity.ok(statistics);
}
@GetMapping("/assignagentid")
public ResponseEntity<List<Map<String, Object>>> getAllAgents() {
List<Map<String, Object>> assignAgentId = campaignService.getAllAgents();
return ResponseEntity.ok(assignAgentId);
}
@PostMapping("/close")
public ResponseEntity<String> closeCampaign(@RequestParam("campaignId") int campaignId) {
if (campaignId <= 0) {
return ResponseEntity.badRequest().body("Invalid Campaign ID");
}
System.out.println("Received request to close campaign ID: " + campaignId); // Debugging log
int rowsUpdated = campaignService.closeCampaign(campaignId);
if (rowsUpdated > 0) {
return ResponseEntity.ok("Campaign closed successfully");
} else {
return ResponseEntity.status(400).body("Failed to close campaign. Campaign ID " + campaignId + " may not exist.");
}
}
@PostMapping("/auto-close")
public ResponseEntity<String> autoCloseExpiredCampaigns() {
int rowsUpdated = campaignService.autoCloseExpiredCampaigns();
if (rowsUpdated > 0) {
return ResponseEntity.ok(rowsUpdated + " expired campaigns closed successfully.");
} else {
return ResponseEntity.ok("No expired campaigns found.");
}
}
}

29
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/CampaignDropdownApiController.java

@ -0,0 +1,29 @@
package in.gov.chennaicorporation.gccoffice.callcenter.controller;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.callcenter.service.CampaignDropdownApiService;
@RequestMapping("gcc/api")
@RestController
public class CampaignDropdownApiController {
@Autowired
private CampaignDropdownApiService dropdownApiService;
@GetMapping("/getAnswerTypes")
@ResponseBody
public List<Map<String, Object>> getAnswerTypes() {
return dropdownApiService.getAnswerTypes();
}
}

100
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/CampaignReportAPIController.java

@ -0,0 +1,100 @@
package in.gov.chennaicorporation.gccoffice.callcenter.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.callcenter.service.CampaignReportService;
@RestController
@RequestMapping("gcc/api/campaignreport")
public class CampaignReportAPIController {
@Autowired
private CampaignReportService campaignReportService;
@GetMapping("/getcampaignData")
public List<Map<String, Object>> getCampaignData(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
List<Map<String, Object>> campaignData = campaignReportService.getCampaignData(startDate, endDate);
//System.out.println("Campaign Data: " + campaignData); // Debugging log
return campaignData;
}
@GetMapping("/getagentdatacount")
public List<Map<String, Object>> getAgentwiseData(@RequestParam String campaign_id) {
List<Map<String, Object>> agentData = campaignReportService.getAgentwiseData(campaign_id);
//System.out.println("Agent Data: " + agentData);
return agentData;
}
@GetMapping("/getReportCampaignid")
public ResponseEntity<?> getAgentReportCampaignId(@RequestParam String campaign_id) {
List<Map<String, Object>> agentData = campaignReportService.getAgentReportCampaignId(campaign_id);
//System.out.println("Agent Data: " + agentData);
return ResponseEntity.ok(agentData);
}
//question and answers report page api
@GetMapping("/question-answers")
public ResponseEntity<?> getQuestionAnswers(@RequestParam int campaign_id) {
List<Map<String, Object>> response = campaignReportService.getQuestionAnswers(campaign_id);
return ResponseEntity.ok(response);
}
// @GetMapping("/download-excel")
// public void downloadFilteredCSV(
// @RequestParam int categoryId,
// @RequestParam int campaignId,
//
//
//
// HttpServletResponse response) throws IOException {
//
// // Set response headers
// response.setContentType("text/csv");
// response.setHeader("Content-Disposition", "attachment; filename=filtered_data.csv");
//
// // Generate CSV and write to response
// PrintWriter writer = response.getWriter();
// campaignReportService.generateCSV(categoryId, campaignId, writer);
// writer.flush();
// writer.close();
// }
@GetMapping("/download-excel")
public void downloadFilteredCSV(
@RequestParam int categoryId,
@RequestParam int campaignId,
HttpServletResponse response) throws IOException {
String filename = campaignReportService.getCampaignName(campaignId);
// Format campaign name for file safety (remove spaces/special characters)
//String safeCampaignName = filename.replaceAll("[^a-zA-Z0-9]", "_");
// Set response headers
response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".csv");
// Generate CSV and write to response
PrintWriter writer = response.getWriter();
campaignReportService.generateCSV(categoryId, campaignId, writer);
writer.flush();
writer.close();
}
}

281
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/CategoryAPIController.java

@ -0,0 +1,281 @@
package in.gov.chennaicorporation.gccoffice.callcenter.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.callcenter.service.AddcategoryServices;
@RequestMapping("/gcc/api/category")
@RestController
public class CategoryAPIController {
@Autowired
private AddcategoryServices addCategoryServices; // Injecting the service
@PostMapping("/save")
public ResponseEntity<String> saveCategoryDetails(@RequestBody Map<String, Object> payload) {
try {
addCategoryServices.saveCategoryDetails(payload);
return ResponseEntity.ok("Category and columns saved successfully.");
} catch (IllegalArgumentException e) {
return ResponseEntity.badRequest().body("Validation Error: " + e.getMessage());
} catch (Exception e) {
return ResponseEntity.status(500).body("Internal Server Error: " + e.getMessage());
}
}
// Endpoint to save category details
// @PostMapping("/save")
// public ResponseEntity<String> saveCategoryDetails(@RequestBody Map<String, Object> payload) {
// try {
// addCategoryServices.saveCategoryDetails(payload); // Call the service method to save category details
// return ResponseEntity.ok("Category details saved successfully.");
// } catch (IllegalArgumentException e) {
// return ResponseEntity.badRequest().body("Error: " + e.getMessage());
// } catch (Exception e) {
// return ResponseEntity.status(500).body("Error saving category details: " + e.getMessage());
// }
// }
// Endpoint to get all categories
@GetMapping("/list")
public List<Map<String, Object>> getAllCategories() {
return addCategoryServices.getAllCategories();
}
@GetMapping("/showcategoryId")
public ResponseEntity<?> getCategoryById(@RequestParam("category_id") int categoryId) {
Map<String, Object> category = addCategoryServices.showCategory(categoryId);
if (category.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found");
}
return ResponseEntity.ok(category);
}
@PostMapping("/deleteColumnById")
public ResponseEntity<Map<String, Object>> deleteCategoryColumnById(@RequestParam("columnId") int columnId) {
boolean updated = addCategoryServices.removeColumnById(columnId);
Map<String, Object> response = new HashMap<>();
response.put("success", updated);
return ResponseEntity.ok(response);
}
@PostMapping("/updateCategoryColumns")
public ResponseEntity<Map<String, Object>> updateCategoryColumnsById(@RequestBody Map<String, Object> requestData) {
try {
int categoryId = (int) requestData.get("categoryId");
List<Map<String, Object>> columns = (List<Map<String, Object>>) requestData.get("columns");
boolean allUpdated = true;
for (Map<String, Object> column : columns) {
int columnId = (int) column.get("id");
String columnName = (String) column.get("name");
boolean updated = addCategoryServices.updateColumnById(categoryId,columnId, columnName);
if (!updated) {
allUpdated = false;
}
}
Map<String, Object> response = new HashMap<>();
response.put("success", allUpdated);
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Map.of("error", "Invalid data format"));
}
}
@PostMapping("/addNewColumns")
public ResponseEntity<Map<String, Object>> addNewCategoryColumnsById(@RequestBody Map<String, Object> requestData) {
try {
int categoryId = (int) requestData.get("categoryId");
List<Map<String, Object>> columns = (List<Map<String, Object>>) requestData.get("columns");
boolean allUpdated = true;
for (Map<String, Object> column : columns) {
String columnName = (String) column.get("name");
boolean updated = addCategoryServices.addnewupdateColumn(categoryId, columnName);
if (!updated) {
allUpdated = false;
}
}
Map<String, Object> response = new HashMap<>();
response.put("success", allUpdated);
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Map.of("error", "Invalid data format"));
}
}
@PutMapping("/update/{categoryId}")
public ResponseEntity<String> updateCategoryWithColumns(
@PathVariable("categoryId") int categoryId,
@RequestBody Map<String, Object> payload) {
String categoryName = (String) payload.get("categoryName");
List<String> columns = (List<String>) payload.get("columns");
try {
int rowsAffected = addCategoryServices.updateCategoryWithColumns(categoryId, categoryName, columns);
return rowsAffected > 0
? ResponseEntity.ok("Category and columns updated successfully")
: ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found or update failed");
} catch (IllegalArgumentException e) {
return ResponseEntity.badRequest().body("Validation Error: " + e.getMessage());
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error updating category: " + e.getMessage());
}
}
// // Endpoint to get a category by its ID
// @GetMapping("/showcategoryId")
// public ResponseEntity<?> getCategoryById(@RequestParam("category_id") int categoryId) {
// Map<String, Object> category = addCategoryServices.showCategory(categoryId);
//
// if (category == null) {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found");
// }
//
// return ResponseEntity.ok(category);
// }
//
// @PutMapping("/update/{categoryId}")
// public ResponseEntity<String> updateCategoryWithColumns(
// @PathVariable("categoryId") int categoryId,
// @RequestBody Map<String, Object> payload) {
//
// String categoryName = (String) payload.get("categoryName");
// List<String> columns = (List<String>) payload.get("columns");
//
// try {
// int rowsAffected = addCategoryServices.updateCategoryWithColumns(categoryId, categoryName, columns);
// if (rowsAffected > 0) {
// return ResponseEntity.ok("Category and columns updated successfully");
// } else {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found or update failed");
// }
// } catch (IllegalArgumentException e) {
// return ResponseEntity.badRequest().body("Validation Error: " + e.getMessage());
// } catch (Exception e) {
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body("Error updating category: " + e.getMessage());
// }
// }
// @GetMapping("/showcategoryId")
// public ResponseEntity<?> showCategoryId(@RequestParam("category_id") int categoryId) {
// try {
// Map<String, Object> category = addCategoryServices.showCategory(categoryId);
// if (category != null && !category.isEmpty()) {
// return ResponseEntity.ok(category);
// } else {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found");
// }
// } catch (Exception e) {
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body("Error retrieving category: " + e.getMessage());
// }
// }
// @PutMapping("/update/{categoryId}")
// public ResponseEntity<String> updateCategory(
// @PathVariable("categoryId") int categoryId,
// @RequestParam String categoryName) {
//
// // Validate input
// if (categoryName == null || categoryName.trim().isEmpty()) {
// return ResponseEntity.badRequest().body("Category name cannot be empty");
// }
//
// try {
// // Call the service method to update the category
// int rowsAffected = addCategoryServices.updateCategory(categoryId, categoryName);
// if (rowsAffected > 0) {
// return ResponseEntity.ok("Category updated successfully");
// } else {
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Category not found or update failed");
// }
// } catch (Exception e) {
// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// .body("Error updating category: " + e.getMessage());
// }
// }
// Endpoint to delete a category by its ID
@DeleteMapping("/delete/{categoryId}")
public ResponseEntity<String> deleteCategory(
@PathVariable("categoryId") int categoryId) {
try {
// Call the service method to delete the category
addCategoryServices.deleteCategory(categoryId);
return ResponseEntity.ok("Category deleted successfully");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error deleting category: " + e.getMessage());
}
}
//hari category api populate
@GetMapping("/getcategory")
public List<Map<String, Object>> getcategory(){
return addCategoryServices.getcategory();
}
// Get category-specific columns based on category_id
@GetMapping("/getCategoryColumns")
public List<Map<String, Object>> getCategoryColumns(@RequestParam int category_id) {
return addCategoryServices.getCategoryColumns(category_id);
}
@GetMapping("/getcampaignbycategory")
public List<Map<String, Object>> getcampaignbycategory(@RequestParam int id)
{
return addCategoryServices.getcampaignbycategory(id);
}
}

219
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/MainController.java

@ -0,0 +1,219 @@
package in.gov.chennaicorporation.gccoffice.callcenter.controller;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.callcenter.service.AddcategoryServices;
import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentsService;
import in.gov.chennaicorporation.gccoffice.callcenter.service.AttendanceService;
import in.gov.chennaicorporation.gccoffice.callcenter.service.AgentAssignService;
import in.gov.chennaicorporation.gccoffice.callcenter.service.CampaignService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/callcenter")
@Controller("callCenterCampaignMainController")
public class MainController {
@Autowired
private AgentAssignService campaignmaster;
@Autowired
private CampaignService campaignService;
@Autowired
private AddcategoryServices addCategoryServices;
@Autowired
private AgentsService agentsService;
@Autowired
private AttendanceService attendanceSerivce;
private AppConfig appConfig;
private RestTemplate restTemplate;
@Autowired
public MainController(AgentAssignService campaignmaster,AgentsService agentsService,CampaignService campaignService,AddcategoryServices addCategoryServices,RestTemplate restTemplate, AppConfig appConfig)
{
this.campaignmaster=campaignmaster;
this.campaignService=campaignService;
this.addCategoryServices=addCategoryServices;
this.agentsService=agentsService;
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@GetMapping("/admin/addcategory")
public String addcategory(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
List<Map<String, Object>> categories = addCategoryServices.getAllCategories();
//System.out.println(categories);
model.addAttribute("categories", categories);
return "modules/callcenter/addcategory";
}
@GetMapping("/admin/createcampaign")
public String createcampaign(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
/*
* List<Map<String, Object>> campaigns = campaignService.getCampaignDetails();
*
*
* System.out.println("campaignlist:"+campaigns);
*
* model.addAttribute("campaigns", campaigns);
*/
return "modules/callcenter/createcampaign"; // Name of the Thymeleaf template (e.g., campaignList.html)
}
@GetMapping("/admin/campaignlist")
public String viewCampaignList(Model model)
{
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
List<Map<String, Object>> campaigns = campaignService.getDetailsForStart();
model.addAttribute("campaigns", campaigns);
List<Map<String, Object>> activeCampaigns =campaignService.getActiveCampaigns();
model.addAttribute("activeCampaigns", activeCampaigns);
return "modules/callcenter/campaignlist";
}
@GetMapping("/agentscampaign")
public String targetPage(Model model)
{
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
List<Map<String, Object>> agentsCampaigns=agentsService.getAgentsALLCampaigns(userId);
List<Map<String, Object>> agentsCampaignsList=agentsService.getAgentsALLCampaignsList(userId);
List<Map<String, Object>> agentsCampaignsList1=agentsService.getAgentsALLCampaignsList1(userId);
//List<Map<String, Object>> CampActions=agentsService.getCallCategories();
//model.addAttribute("CampActions", CampActions);
model.addAttribute("agentsCampaignsList", agentsCampaignsList);
model.addAttribute("agentsCampaigns", agentsCampaigns);
model.addAttribute("agentsCampaignsList1", agentsCampaignsList1);
//System.out.println("Agents Campaigns List: " + agentsCampaignsList);
//System.out.println("Agents Campaigns : " + agentsCampaigns);
return "modules/callcenter/agentscampaign";
}
@GetMapping("/admin/campaignreport")
public String campaignreport(Model model)
{
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/callcenter/campaignreport";
}
@GetMapping("/attendancereport")
public String AttendanceList(
@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate,
Model model) {
List<Map<String, Object>> attendanceData = Collections.emptyList();
if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) {
String apiUrl = appConfig.attendanceReport + "/callcenter/api/attendance/getattendancereport?fromDate=" + fromDate + "&toDate=" + toDate;
try {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
String responseBody = responseEntity.getBody();
if (responseBody != null && !responseBody.isEmpty()) {
ObjectMapper objectMapper = new ObjectMapper();
if (responseBody.trim().startsWith("{")) {
// Single object response
Map<String, Object> singleData = objectMapper.readValue(responseBody, new TypeReference<>() {});
attendanceData = List.of(singleData);
} else {
// Array response
attendanceData = objectMapper.readValue(responseBody, new TypeReference<>() {});
}
}
} catch (Exception e) {
System.err.println("Error fetching attendance data: " + e.getMessage());
}
}
model.addAttribute("attendanceData", attendanceData);
model.addAttribute("fromDate", fromDate);
model.addAttribute("toDate", toDate);
model.addAttribute("LoginUserId", LoginUserInfo.getLoginUserId());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
return "modules/callcenter/attendancereport";
}
}

26
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/controller/WhatsappController.java

@ -0,0 +1,26 @@
package in.gov.chennaicorporation.gccoffice.callcenter.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.callcenter.service.WhatsappMsgService;
@RestController
@RequestMapping("/gcc/api/whatsapp")
public class WhatsappController {
@Autowired
private WhatsappMsgService whatsappMsgService;
@PostMapping("/send-whatsapp-message")
public ResponseEntity<String> sendWhatsAppMessage(@RequestParam String msgUrl) {
String response = whatsappMsgService.sendMsg(msgUrl);
return ResponseEntity.ok(response);
}
}

303
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/AddcategoryServices.java

@ -0,0 +1,303 @@
package in.gov.chennaicorporation.gccoffice.callcenter.service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Locale.Category;
import java.util.Map;
import javax.sql.DataSource;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import java.sql.PreparedStatement;
import java.sql.Statement;
@Service
public class AddcategoryServices {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// public void saveCategoryDetails(Map<String, Object> categoryData) {
// String sql = "INSERT INTO category (category_name, isactive, isdelete, created_date) VALUES (?, 1, 0, CURRENT_TIMESTAMP)";
//
// // Ensure that the key "categoryname" matches exactly what is being sent from the frontend
// String categoryName = (String) categoryData.get("categoryname");
//
// // Check if categoryName is null or empty and handle it properly
// if (categoryName == null || categoryName.trim().isEmpty()) {
// throw new IllegalArgumentException("Category name cannot be null or empty");
// }
//
// jdbcTemplate.update(sql, categoryName);
// }
@Transactional
public void saveCategoryDetails(Map<String, Object> categoryData) {
String categoryName = (String) categoryData.get("categoryname");
List<String> columns = (List<String>) categoryData.get("columns");
if (categoryName == null || categoryName.trim().isEmpty()) {
throw new IllegalArgumentException("Category name cannot be null or empty");
}
if (columns == null || columns.isEmpty() || columns.contains("")) {
throw new IllegalArgumentException("At least one column name is required");
}
// Insert into category table and get the generated category_id
String categorySql = "INSERT INTO category (category_name, isactive, isdelete, created_date) VALUES (?, 1, 0, CURRENT_TIMESTAMP)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(categorySql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, categoryName);
return ps;
}, keyHolder);
Integer categoryId = keyHolder.getKey().intValue(); // Extract generated category_id
// Insert columns into category_columns table
String columnSql = "INSERT INTO category_columns (category_id, column_name, isactive, isdelete, created_date) VALUES (?, ?, 1, 0, CURRENT_TIMESTAMP)";
jdbcTemplate.batchUpdate(columnSql, columns, columns.size(),
(PreparedStatement ps, String column) -> {
ps.setInt(1, categoryId);
ps.setString(2, column);
});
}
@Transactional
public List<Map<String, Object>> getAllCategories() {
String SqlQuery = "SELECT category_id,category_name FROM category where isactive=1 and isdelete=0";
List<Map<String, Object>> result = jdbcTemplate.queryForList(SqlQuery);
return result;
}
public Map<String, Object> showCategory(int categoryId) {
String categorySql = "SELECT category_id, category_name FROM category WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
Map<String, Object> category;
try {
category = jdbcTemplate.queryForMap(categorySql, categoryId);
} catch (EmptyResultDataAccessException e) {
return Collections.emptyMap();
}
String columnsSql = "SELECT id,column_name FROM category_columns WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
List<Map<String,Object>> columns = jdbcTemplate.queryForList(columnsSql,categoryId);
category.put("columns", columns);
return category;
}
@Transactional
public int updateCategoryWithColumns(int categoryId, String categoryName, List<String> columns) {
if (categoryName == null || categoryName.trim().isEmpty()) {
throw new IllegalArgumentException("Category name cannot be empty");
}
if (columns == null || columns.size() < 2 || columns.contains("")) {
throw new IllegalArgumentException("At least two column names are required");
}
String updateCategorySql = "UPDATE category SET category_name = ? WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
int categoryUpdateCount = jdbcTemplate.update(updateCategorySql, categoryName, categoryId);
if (categoryUpdateCount == 0) {
throw new IllegalArgumentException("Category not found or update failed.");
}
String deleteColumnsSql = "DELETE FROM category_columns WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
jdbcTemplate.update(deleteColumnsSql, categoryId);
String insertColumnsSql = "INSERT INTO category_columns (category_id, column_name, isactive, isdelete, created_date) VALUES (?, ?, 1, 0, CURRENT_TIMESTAMP)";
jdbcTemplate.batchUpdate(insertColumnsSql, columns, columns.size(), (PreparedStatement ps, String column) -> {
ps.setInt(1, categoryId);
ps.setString(2, column);
});
return categoryUpdateCount;
}
// @Transactional
// public int updateCategoryWithColumns(int categoryId, String categoryName, List<String> columns) {
// if (categoryName == null || categoryName.trim().isEmpty()) {
// throw new IllegalArgumentException("Category name cannot be empty");
// }
// if (columns == null || columns.isEmpty() || columns.contains("")) {
// throw new IllegalArgumentException("At least one column name is required");
// }
//
// String updateCategorySql = "UPDATE category SET category_name = ? WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
// int categoryUpdateCount = jdbcTemplate.update(updateCategorySql, categoryName, categoryId);
//
// if (categoryUpdateCount == 0) {
// throw new IllegalArgumentException("Category not found or update failed.");
// }
//
// String deleteColumnsSql = "DELETE FROM category_columns WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
// jdbcTemplate.update(deleteColumnsSql, categoryId);
//
// String insertColumnsSql = "INSERT INTO category_columns (category_id, column_name, isactive, isdelete, created_date) VALUES (?, ?, 1, 0, CURRENT_TIMESTAMP)";
// jdbcTemplate.batchUpdate(insertColumnsSql, columns, columns.size(), (PreparedStatement ps, String column) -> {
// ps.setInt(1, categoryId);
// ps.setString(2, column);
// });
//
// return categoryUpdateCount;
// }
// // Method to show a category by its ID
// public Map<String, Object> showCategory(int categoryId) {
// // Fetch category details
// String categorySql = "SELECT category_id, category_name FROM category WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
// Map<String, Object> category;
// try {
// category = jdbcTemplate.queryForMap(categorySql, categoryId);
// } catch (EmptyResultDataAccessException e) {
// return null; // If no category found
// }
//
// // Fetch category columns
// String columnsSql = "SELECT column_name FROM category_columns WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
// List<String> columns = jdbcTemplate.queryForList(columnsSql, String.class, categoryId);
//
// // Add columns to response
// category.put("columns", columns);
// return category;
// }
//
//
// @Transactional
// public int updateCategoryWithColumns(int categoryId, String categoryName, List<String> columns) {
// // Validate input
// if (categoryName == null || categoryName.trim().isEmpty()) {
// throw new IllegalArgumentException("Category name cannot be empty");
// }
// if (columns == null || columns.isEmpty() || columns.contains("")) {
// throw new IllegalArgumentException("At least one column name is required");
// }
//
// // Update category name
// String updateCategorySql = "UPDATE category SET category_name = ? WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
// int categoryUpdateCount = jdbcTemplate.update(updateCategorySql, categoryName, categoryId);
//
// if (categoryUpdateCount == 0) {
// throw new IllegalArgumentException("Category not found or update failed.");
// }
//
// // Remove existing category columns before inserting new ones
// String deleteColumnsSql = "DELETE FROM category_columns WHERE category_id = ?";
// jdbcTemplate.update(deleteColumnsSql, categoryId);
//
// // Insert updated columns
// String insertColumnsSql = "INSERT INTO category_columns (category_id, column_name, isactive, isdelete, created_date) VALUES (?, ?, 1, 0, CURRENT_TIMESTAMP)";
// jdbcTemplate.batchUpdate(insertColumnsSql, columns, columns.size(),
// (PreparedStatement ps, String column) -> {
// ps.setInt(1, categoryId);
// ps.setString(2, column);
// });
//
// return categoryUpdateCount;
// }
// // Method to update a category's name by its ID
// public int updateCategory(int categoryId, String categoryName) {
// String sql = "UPDATE category SET category_name = ? WHERE category_id = ? AND isactive = 1 AND isdelete = 0";
// return jdbcTemplate.update(sql, categoryName, categoryId);
// }
// Method to delete a category by its name
public void deleteCategory(int categoryId) {
// String sql = "DELETE FROM category WHERE category_id = ?";
String sql = "UPDATE category SET isactive=0 , isdelete=1 WHERE category_id = ?";
jdbcTemplate.update(sql, categoryId);
}
//hari populate category services
@Transactional
public List<Map<String, Object>> getcategory() {
String sqlQuery = "SELECT category_id,category_name FROM category where isactive='1' and isdelete='0'";
return jdbcTemplate.queryForList(sqlQuery);
}
public List<Map<String, Object>> getCategoryColumns(int categoryId) {
String sqlQuery = "SELECT column_name FROM category_columns WHERE category_id = ? AND isactive = 1";
return jdbcTemplate.queryForList(sqlQuery, categoryId);
}
// Fetch category with columns
public List<Map<String, Object>> getCategoriesWithColumns() {
String sqlQuery = "SELECT c.category_id, c.category_name, cc.column " +
"FROM gcc_1913_campaign.category c " +
"INNER JOIN gcc_1913_campaign.category_columns cc ON c.category_id = cc.category_id " +
"WHERE c.isactive = 1 AND c.isdelete = 0 " +
"AND cc.isactive = 1 AND cc.isdelete = 0";
return jdbcTemplate.queryForList(sqlQuery);
}
@Transactional
public List<Map<String, Object>> getcampaignbycategory(int id) {
String sqlQuery = "SELECT cr.campaign_id,cr.campaign_name FROM campaign_request cr JOIN category c ON cr.category_id=c.category_id where cr.category_id=? and cr.isactive='1'";
return jdbcTemplate.queryForList(sqlQuery,id);
}
public boolean removeColumnById(int columnId) {
String sql = "UPDATE category_columns SET isactive = 0, isdelete = 1 WHERE id = ?";
int rowsAffected = jdbcTemplate.update(sql, columnId);
return rowsAffected > 0; // Returns true if at least one row was updated, otherwise false
}
public boolean updateColumnById(int categoryId,int columnId, String columnName) {
String sql = "UPDATE category_columns SET column_name = ? WHERE id = ? and category_id=?";
int rowsAffected = jdbcTemplate.update(sql, columnName, columnId,categoryId);
return rowsAffected > 0;
}
public boolean addnewupdateColumn(int categoryId, String columnName) {
//String sql = "UPDATE category_columns SET column_name = ? WHERE id = ? and category_id=?";
String sql = "INSERT INTO category_columns (category_id, column_name) VALUES (?, ?)";
int rowsAffected = jdbcTemplate.update(sql, categoryId,columnName);
return rowsAffected > 0;
}
}

214
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/AgentAssignService.java

@ -0,0 +1,214 @@
package in.gov.chennaicorporation.gccoffice.callcenter.service;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class AgentAssignService
{
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
public void setDataSource2(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
private JdbcTemplate jdbcTemplate2;
@Transactional
public List<Map<String, Object>> getcategory() {
String sqlQuery = "SELECT category_id,category_name FROM gcc_1913_campaign.category where isactive='1' and isdelete='0'";
return jdbcTemplate.queryForList(sqlQuery);
}
@Transactional
public List<Map<String, Object>> getcampaignbycategory(int id) {
String sqlQuery = "SELECT cr.campaign_id, cr.campaign_name " +
"FROM gcc_1913_campaign.campaign_request cr " +
"JOIN gcc_1913_campaign.category c ON cr.category_id = c.category_id " +
"WHERE cr.category_id = ? AND campaign_status='PENDING' " +
"AND cr.isactive = '1' ";
return jdbcTemplate.queryForList(sqlQuery,id);
}
@Transactional
public List<Map<String, Object>> getcampaignbyid(int id) {
String sqlQuery = "SELECT * FROM gcc_1913_campaign.campaign_request where isactive='1' and campaign_id=?";
return jdbcTemplate.queryForList(sqlQuery,id);
}
@Transactional
public List<Map<String, Object>> getagentsfortask(int id) {
String sqlQuery = "SELECT al.agent_id,al.agent_name\r\n"
+ "FROM gcc_1913_qaqc.agents_list al\r\n"
+ "LEFT JOIN gcc_1913_campaign.agent_assign aa ON al.agent_id = aa.agent_id AND aa.isactive = '1' AND aa.campaign_id = ?\r\n"
+ "WHERE aa.agent_id IS NULL AND al.calling_type='OUTBOUND'AND al.isactive='1' AND al.isdelete='0'";
return jdbcTemplate.queryForList(sqlQuery,id);
}
@Transactional
public int addagentsfortask(int agent_id, int category_id, int campaign_id) {
String insertSql = "INSERT INTO gcc_1913_campaign.agent_assign (agent_id, category_id, campaign_id) VALUES (?, ?, ?)";
int rowsInserted = jdbcTemplate.update(insertSql, agent_id, category_id, campaign_id);
return rowsInserted;
}
@Transactional
public void addAgentsForCampaign(int selectedAgentId, int categoryId, int campaignId) {
String insertSql = "INSERT INTO gcc_1913_campaign.agent_assign (agent_id, category_id, campaign_id) VALUES (?, ?, ?)";
try {
int rowsInserted = jdbcTemplate.update(insertSql, selectedAgentId, categoryId, campaignId);
if (rowsInserted > 0) {
System.out.println("Successfully inserted agent ID in agent_assign== " + selectedAgentId + " into campaign ID " + campaignId);
} else {
System.out.println("No rows inserted for agent ID " + selectedAgentId);
}
} catch (DataAccessException | NumberFormatException ex) {
System.err.println("Error inserting data: " + ex.getMessage());
throw new RuntimeException("Failed to insert agents for campaign. Please try again.", ex);
}
}
@Transactional
public void updateAgentForCampaign(int selectedAgentId, int categoryId, int campaignId,int DataId) {
String updateSql = "UPDATE gcc_1913_campaign.upload_data SET agent_id = ? WHERE campaign_id = ? AND category_id = ? AND data_id=?";
try {
int rowsUpdated = jdbcTemplate.update(updateSql, selectedAgentId,campaignId,categoryId,DataId);
/* if (rowsUpdated > 0) {
System.out.println("Successfully updated agent ID in upload_data== " + selectedAgentId + " for campaign ID " + campaignId);
} else {
System.out.println("No rows updated for agent ID " + selectedAgentId);
}*/
} catch (DataAccessException | NumberFormatException ex) {
System.err.println("Error updating data: " + ex.getMessage());
throw new RuntimeException("Failed to update agents for campaign. Please try again.", ex);
}
}
@Transactional
public List<Integer> getDataIdForInitialAssign(int categoryId, int campaignId) {
String sql = "SELECT data_id FROM gcc_1913_campaign.upload_data "
+ "WHERE category_id = ? AND campaign_id = ? "
+ "AND agent_id IS NULL AND is_processed = 0 ORDER BY data_id";
// Correctly specify the return type for jdbcTemplate.queryForList
return jdbcTemplate.queryForList(sql, Integer.class, categoryId, campaignId);
}
@Transactional
public List<Map<String, Object>> checkcampaigninassignedtable(int id)
{
String sqlQuery = "SELECT al.agent_id,al.agent_name,aa.assigned_id\r\n"
+ "FROM gcc_1913_qaqc.agents_list al\r\n"
+ "JOIN gcc_1913_campaign.agent_assign aa ON al.agent_id = aa.agent_id\r\n"
+ "JOIN gcc_1913_campaign.campaign_request c ON aa.campaign_id=c.campaign_id\r\n"
+ "WHERE aa.campaign_id = ? AND aa.isactive = '1' AND al.calling_type='OUTBOUND'AND al.isactive='1' AND al.isdelete='0'";
return jdbcTemplate.queryForList(sqlQuery,id);
}
@Transactional
public int editagentsfortask(int assigned_id) {
String updateSql = "UPDATE gcc_1913_campaign.agent_assign SET isactive='0', isdelete='1',status='NOT_ASSIGNED' WHERE assigned_id=?";
int rowsInserted = jdbcTemplate.update(updateSql,assigned_id);
return rowsInserted;
}
@Transactional
public List<Map<String, Object>> getcampaignquestionbyid(int id) {
String sqlQuery = " SELECT " +
" cr.campaign_id, " +
" cr.campaign_name, " +
" cr.category_id, " +
" cr.start_date, " +
" cr.end_date, " +
" cr.no_of_agents, " +
" cr.calls_per_agent, " +
" cr.description, " +
" cr.created_date, " +
" cr.excel_url, " +
" cr.isactive, " +
" cr.campaign_status, " +
" cq.questions, " +
" cq.question_id, " +
" cq.answer_type_id, " +
" cat.type_name, " +
" ca.campaign_answer " + // Campaign Answer can be NULL
"FROM gcc_1913_campaign.campaign_request cr " +
"JOIN gcc_1913_campaign.campaign_questions cq " +
" ON cr.campaign_id = cq.campaign_id " +
"LEFT JOIN gcc_1913_campaign.campaign_answers ca " + // LEFT JOIN to include questions with no answers
" ON cq.question_id = ca.question_id " +
"JOIN gcc_1913_campaign.answer_type cat " +
" ON cat.answer_type_id = cq.answer_type_id " +
"WHERE cr.isactive = 1 AND cr.campaign_id = ?";
List<Map<String, Object>> queryResult = jdbcTemplate.queryForList(sqlQuery, id);
// Map to group answers by question_id
Map<Integer, Map<String, Object>> groupedData = new LinkedHashMap();
for (Map<String, Object> row : queryResult) {
Integer questionId = (Integer) row.get("question_id");
String campaignAnswer = (String) row.get("campaign_answer"); // Can be null
// Check if this question_id already exists in the map
if (!groupedData.containsKey(questionId)) {
// Copy the row data (excluding campaign_answer) and initialize answers list
Map<String, Object> newRow = new LinkedHashMap<>(row);
newRow.remove("campaign_answer"); // Remove individual answer
newRow.put("campaign_answers", new ArrayList<String>()); // Initialize answer list
groupedData.put(questionId, newRow);
}
// Only add answers if they are not null
if (campaignAnswer != null) {
((List<String>) groupedData.get(questionId).get("campaign_answers")).add(campaignAnswer);
}
}
// Convert grouped data to a list
return new ArrayList<>(groupedData.values());
}
}

665
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/AgentsService.java

@ -0,0 +1,665 @@
package in.gov.chennaicorporation.gccoffice.callcenter.service;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import javax.transaction.Transactional;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class AgentsService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
public void setDataSource2(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
private JdbcTemplate jdbcTemplate2;
// Utility method to get cell value based on type
private String getCellValue(Cell cell) {
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue();
case NUMERIC:
// Check if the numeric cell contains a date
if (DateUtil.isCellDateFormatted(cell)) {
return new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
}
return String.valueOf((long) cell.getNumericCellValue()); // Cast to long to avoid scientific notation
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
case FORMULA:
return cell.getCellFormula();
default:
return "";
}
}
// Parse integer values (for ID)
private Integer parseInteger(String value) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
return null; // return null if parsing fails
}
}
// Parse long values (for Mobile number)
private Long parseLong(String value) {
try {
return Long.parseLong(value);
} catch (NumberFormatException e) {
return null; // return null if parsing fails
}
}
// Example fetch method
public List<Map<String, Object>> fetchDataFromExcel(int categoryId,Long campaignId) throws IOException {
String excelUrl = getExcelUrlByCampaignId(campaignId);
List<Map<String, Object>>data=getExcelData(categoryId,campaignId, excelUrl);
return saveExcelData(data);
}
public String getExcelUrlByCampaignId(Long campaignId) {
String sql = "SELECT excel_url\r\n"
+ "FROM gcc_1913_campaign.campaign_request\r\n"
+ "WHERE campaign_id = ?";
return jdbcTemplate.queryForObject(sql, String.class, campaignId);
}
public List<Map<String, Object>> getExcelData(int categoryId,Long campaignId,String filePath) throws IOException {
List<Map<String, Object>> data = new ArrayList<>();
File file = new File(filePath);
try (FileInputStream fis = new FileInputStream(file);
Workbook workbook = new XSSFWorkbook(fis)) {
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
if (row.getRowNum() == 0) continue; // skip header row
Map<String, Object> rowData = new HashMap<>();
// Add the campaign_id and category_id to each row
rowData.put("category_id", categoryId);
rowData.put("campaign_id", campaignId);
// Convert ID to Integer
rowData.put("ID", getCellValue(row.getCell(0)));
// Name remains String
rowData.put("Name", getCellValue(row.getCell(1)));
// Address remains String
rowData.put("Address", getCellValue(row.getCell(2)));
// Dues remains String (you can convert if necessary)
rowData.put("Balance amount", parseLong(getCellValue(row.getCell(3))));
// Convert Mobile number to Long
rowData.put("Mobile number", parseLong(getCellValue(row.getCell(4))));
rowData.put("Tiny url", getCellValue(row.getCell(5)));
data.add(rowData);
}
}
return data;
}
public List<Map<String, Object>> saveExcelData(List<Map<String, Object>> data) {
// Prepare SQL query for inserting the specified columns
String sql = "INSERT INTO gcc_1913_campaign.upload_data (category_id, campaign_id, field_1, field_2, field_3, field_4, field_5,field_6) " +
"VALUES (?, ?, ?, ?, ?, ?, ?,?)";
// Loop through the data list and insert each row into the database
for (Map<String, Object> row : data) {
jdbcTemplate.update(sql,
row.get("category_id"), // Category ID
row.get("campaign_id"), // Campaign ID
row.get("ID"), // ID (String)
row.get("Name"), // Name (String)
row.get("Address"), // Address (String)
row.get("Balance amount"), // Dues if any (String)
row.get("Mobile number"), // Mobile number (Long)
row.get("Tiny url")
);
}
// Return the inserted data (if needed)
return data; // Optionally return the inserted data or change the return type as per your use case
}
//For Assigned tasks
// @Transactional
// public List<Map<String, Object>> getAgentsALLCampaigns(int agent_id) {
// String SqlQuery = "SELECT \r\n"
// + " c.category_name,\r\n"
// + " cr.campaign_name,\r\n"
// + " cr.calls_per_agent,\r\n"
// + " aa.campaign_id,\r\n"
// + " aa.agent_id,\r\n"
// + " (SELECT COUNT(data_id) \r\n"
// + " FROM gcc_1913_campaign.upload_data up \r\n"
// + " WHERE up.agent_id = aa.agent_id \r\n"
// + " AND up.campaign_id = cr.campaign_id\r\n"
// + " ) AS calls_assigned,\r\n"
// + " (SELECT COUNT(CASE WHEN up.field_14 IS NULL THEN 1 END) \r\n"
// + " FROM gcc_1913_campaign.upload_data up \r\n"
// + " WHERE up.agent_id = aa.agent_id \r\n"
// + " AND up.campaign_id = cr.campaign_id\r\n"
// + " ) AS pending_count,\r\n"
// + " (SELECT COUNT(CASE WHEN up.field_14 IS NOT NULL THEN 1 END) \r\n"
// + " FROM gcc_1913_campaign.upload_data up \r\n"
// + " WHERE up.agent_id = aa.agent_id \r\n"
// + " AND up.campaign_id = cr.campaign_id\r\n"
// + " ) AS complete_count,\r\n"
// + " (SELECT COUNT(CASE WHEN up.field_14 ='CALL_BACK_LATER' OR up.field_14 = 'UNATTENDED' THEN 1 END) \r\n"
// + " FROM gcc_1913_campaign.upload_data up \r\n"
// + " WHERE up.agent_id = aa.agent_id \r\n"
// + " AND up.campaign_id = cr.campaign_id\r\n"
// + " ) AS followup_count\r\n"
// + " \r\n"
// + "FROM \r\n"
// + " gcc_1913_campaign.agent_assign aa\r\n"
// + "JOIN \r\n"
// + " gcc_1913_qaqc.agents_list al ON aa.agent_id = al.agent_id\r\n"
// + "JOIN \r\n"
// + " gcc_1913_campaign.campaign_request cr ON cr.campaign_id = aa.campaign_id\r\n"
// + "JOIN \r\n"
// + " gcc_1913_campaign.category c ON cr.category_id = c.category_id\r\n"
// + "WHERE \r\n"
// + " aa.agent_id = ? \r\n"
// + " AND aa.isactive = '1'\r\n"
// + " AND cr.isactive = '0'";
//
// return jdbcTemplate.queryForList(SqlQuery,agent_id);
// }
@Transactional
public List<Map<String, Object>> getdataByIds(List<Integer> ids) {
// Construct the SQL query with placeholders for the number of IDs
String inSql = String.join(",", Collections.nCopies(ids.size(), "?"));
String SqlQuery = "SELECT data_id, field_1 as id, field_2 as name, field_3 as address, field_4 as dues, field_5 as cellnumber,field_6 as viewdetails,field_14 as call_status,field_15 as remarks " +
"FROM gcc_1913_campaign.upload_data " +
"WHERE data_id IN (" + inSql + ")";
// Convert the list of ids to an Object array
return jdbcTemplate.queryForList(SqlQuery, ids.toArray());
}
@Transactional
public void saveCallLogs(String call_status,String remarks ,int data_id,int agent_id)
{
String SqlQuery = "UPDATE gcc_1913_campaign.upload_data SET call_status = ?, remarks=?, updated_date = NOW() ,updated_agent_id=?, is_processed=1 WHERE (data_id = ? )";
jdbcTemplate.update(SqlQuery,call_status, remarks,agent_id,data_id);
}
@Transactional
public int saveInLogsTable(int campaignId, int agentId, int dataId, String call_status,String remarks) {
String sqlQuery = "INSERT INTO gcc_1913_campaign.call_logs (campaign_id,agent_id,data_id,call_status,remarks) VALUES (?, ?, ?,?,?)";
int rowsAffected = 0;
try {
rowsAffected = jdbcTemplate.update(sqlQuery, campaignId, agentId, dataId,call_status,remarks);
//System.out.println("Inserted into call_logs successfully. Rows affected: " + rowsAffected);
} catch (Exception e) {
System.err.println("Error inserting into call_logs: " + e.getMessage());
// Log the exception or rethrow it based on your error-handling strategy
}
return rowsAffected;
}
@Transactional
public List<Map<String, Object>> getPendingDataByIds(List<Integer> ids) {
// Construct the SQL query with placeholders for the number of IDs
String inSql = String.join(",", Collections.nCopies(ids.size(), "?"));
String SqlQuery = "SELECT data_id, field_1 as id, field_2 as name, field_3 as address, field_4 as dues, field_5 as cellnumber,field_6 as viewdetails,field_14 as call_status,field_15 as remarks " +
"FROM gcc_1913_campaign.upload_data " +
"WHERE data_id IN (" + inSql + ") " +
"AND field_14 IN ('UNATTENDED', 'CALL_BACK_LATER')";
// Convert the list of ids to an Object array
return jdbcTemplate.queryForList(SqlQuery, ids.toArray());
}
@Transactional
public List<Map<String, Object>> getAgentsNameById(List<Integer> agentIds)
{
String inSql = String.join(",", Collections.nCopies(agentIds.size(), "?"));
String SqlQuery ="select agent_name,agent_id from gcc_1913_qaqc.agents_list where agent_id IN (" + inSql + ")";
return jdbcTemplate.queryForList(SqlQuery, agentIds.toArray());
}
//agents performance
@Transactional
public List<Map<String, Object>> getDataDetailsById(List<Integer> dataIds)
{
if (dataIds.isEmpty()) {
// Handle the case where dataIds is empty to avoid SQL syntax error.
throw new IllegalArgumentException("The dataIds list is empty, cannot execute query.");
}
String inSql = String.join(",", Collections.nCopies(dataIds.size(), "?"));
String SqlQuery ="SELECT\r\n"
+ " COUNT(*) AS Assigned_count,\r\n"
+ " COUNT(CASE WHEN field_14 IS NOT NULL THEN 1 END) AS Complete_count,\r\n"
+ " COUNT(CASE WHEN field_14 IS NULL THEN 1 END) AS Pending_count ,\r\n"
+ " COUNT(CASE WHEN field_14 = 'INFORMATION_GIVEN' THEN 1 END) AS Information_Given_count,\r\n"
+ " COUNT(CASE WHEN field_14 = 'UNATTENDED' THEN 1 END) AS Unattended_count,\r\n"
+ " COUNT(CASE WHEN field_14 = 'CALL_BACK_LATER' THEN 1 END) AS Call_back_later_count,\r\n"
+ " COUNT(CASE WHEN field_14 = 'SWITCH_OFF' THEN 1 END) AS Switch_off_count,\r\n"
+ " COUNT(CASE WHEN field_14 = 'WRONG_NUMBER' THEN 1 END) AS Wrong_number_count,\r\n"
+ " CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((COUNT(CASE WHEN field_14 IS NOT NULL THEN 1 END) * 100.0 / COUNT(*)), 0)END AS Percentage\r\n"
+ "FROM gcc_1913_campaign.upload_data\r\n"
+ "WHERE data_id IN (" + inSql + ")";
List<Map<String, Object>> results = jdbcTemplate.queryForList(SqlQuery, dataIds.toArray());
return results;
}
@Transactional
public List<Map<String, Object>> getCompletedDataDetailsById(List<Integer> CdataIds)
{
if (CdataIds.isEmpty()) {
// Handle the case where dataIds is empty to avoid SQL syntax error.
throw new IllegalArgumentException("The CdataIds list is empty, cannot execute query.");
}
String inSql = String.join(",", Collections.nCopies(CdataIds.size(), "?"));
String SqlQuery ="SELECT\r\n"
+ " data_id,\r\n" // Add data_id to the result
+ " COUNT(*) AS Assigned_count,\r\n"
+ " COUNT(CASE WHEN field_14 IS NOT NULL THEN 1 END) AS Complete_count,\r\n"
+ " COUNT(CASE WHEN field_14 IS NULL THEN 1 END) AS Pending_count,\r\n"
+ " COUNT(CASE WHEN field_14 = 'INFORMATION_GIVEN' THEN 1 END) AS Information_Given_count,\r\n"
+ " COUNT(CASE WHEN field_14 = 'UNATTENDED' THEN 1 END) AS Unattended_count,\r\n"
+ " COUNT(CASE WHEN field_14 = 'CALL_BACK_LATER' THEN 1 END) AS Call_back_later_count,\r\n"
+ " COUNT(CASE WHEN field_14 = 'SWITCH_OFF' THEN 1 END) AS Switch_off_count,\r\n"
+ " COUNT(CASE WHEN field_14 = 'WRONG_NUMBER' THEN 1 END) AS Wrong_number_count,\r\n"
+ " CASE WHEN COUNT(*) = 0 THEN 0 ELSE ROUND((COUNT(CASE WHEN field_14 IS NOT NULL THEN 1 END) * 100.0 / COUNT(*)), 0) END AS Percentage\r\n"
+ "FROM gcc_1913_campaign.upload_data\r\n"
+ "WHERE data_id IN (" + inSql + ")\r\n"
+ "GROUP BY data_id"; // Group by data_id
return jdbcTemplate.queryForList(SqlQuery, CdataIds.toArray());
}
@Transactional
public List<Map<String,Object>> getCompletedDataById(List<Integer> completedDataIds)
{
if (completedDataIds.isEmpty()) {
// Handle the case where dataIds is empty to avoid SQL syntax error.
throw new IllegalArgumentException("The completedDataIds list is empty, cannot execute query.");
}
String inSql = String.join(",", Collections.nCopies(completedDataIds.size(), "?"));
String SqlQuery = "SELECT field_1 as id, field_2 as name, field_3 as address, " +
"field_5 as cellnumber, field_14 as call_status, updated_date as updated_date,field_15 as remarks, " +
"(SELECT COUNT(data_id) FROM call_logs WHERE data_id = upload_data.data_id) as call_count " +
"FROM gcc_1913_campaign.upload_data " +
"WHERE data_id IN (" + inSql + ")";
return jdbcTemplate.queryForList(SqlQuery, completedDataIds.toArray());
}
@Transactional
public void addAgentsForCampaign(int selectedAgentId, int categoryId, int campaignId) {
String checkSql = "SELECT COUNT(*) FROM gcc_1913_campaign.agent_assign "
+ "WHERE agent_id = ? AND category_id = ? AND campaign_id = ?";
String insertSql = "INSERT INTO gcc_1913_campaign.agent_assign (agent_id, category_id, campaign_id) VALUES (?, ?, ?)";
try {
// Check if the record already exists
int count = jdbcTemplate.queryForObject(checkSql, Integer.class, selectedAgentId, categoryId, campaignId);
if (count == 0) {
// Insert only if no existing record found
int rowsInserted = jdbcTemplate.update(insertSql, selectedAgentId, categoryId, campaignId);
if (rowsInserted > 0) {
System.out.println("Successfully inserted agent ID " + selectedAgentId + " into campaign ID " + campaignId);
} else {
System.out.println("No rows inserted for agent ID " + selectedAgentId);
}
} else {
System.out.println("Agent ID " + selectedAgentId + " is already assigned to campaign ID " + campaignId);
}
} catch (DataAccessException | NumberFormatException ex) {
System.err.println("Error inserting data: " + ex.getMessage());
throw new RuntimeException("Failed to insert agents for campaign. Please try again.", ex);
}
}
@Transactional
public void updateAgentForCampaign(int selectedAgentId, int categoryId, int campaignId,int DataId) {
String updateSql = "UPDATE gcc_1913_campaign.upload_data SET agent_id = ? WHERE campaign_id = ? AND category_id = ? AND data_id=?";
try {
int rowsUpdated = jdbcTemplate.update(updateSql, selectedAgentId,campaignId,categoryId,DataId);
/* if (rowsUpdated > 0) {
System.out.println("Successfully updated agent ID in upload_data== " + selectedAgentId + " for campaign ID " + campaignId);
} else {
System.out.println("No rows updated for agent ID " + selectedAgentId);
}*/
} catch (DataAccessException | NumberFormatException ex) {
System.err.println("Error updating data: " + ex.getMessage());
throw new RuntimeException("Failed to update agents for campaign. Please try again.", ex);
}
}
@Transactional
public List<Integer> getDataIdForFurtherAssign(int categoryId, int campaignId) {
String sql = "SELECT data_id FROM gcc_1913_campaign.upload_data "
+ "WHERE category_id = ? "
+ "AND campaign_id = ? "
+ "AND is_processed = 0 "
+ "ORDER BY data_id";
return jdbcTemplate.queryForList(sql, Integer.class, categoryId, campaignId);
}
@Transactional
public void resetAgentAssignmentForNextDay(int categoryId, int campaignId) {
String sql = "UPDATE gcc_1913_campaign.upload_data "
+ "SET agent_id = NULL, "
+ " call_status = NULL, "
+ " remarks = NULL, "
+ " updated_agent_id = NULL, "
+ " updated_date = NULL, "
+ " is_processed = 0 "
+ "WHERE category_id = ? "
+ " AND campaign_id = ? "
+ " AND call_status IN ('CALL BACK LATER', 'UNATTENDED')";
jdbcTemplate.update(sql, categoryId, campaignId);
}
//////////////////////Ajith code///////////////////
@Transactional
public List<Map<String, Object>> getFilteredFields(int categoryId, int agentId, int dataId) {
List<Map<String, Object>> resultList = new ArrayList<>();
// Fetch ordered field column names
String fetchColumnsSQL = "SELECT COLUMN_NAME " +
"FROM INFORMATION_SCHEMA.COLUMNS " +
"WHERE TABLE_SCHEMA = 'gcc_1913_campaign' " +
"AND TABLE_NAME = 'upload_data' " +
"AND COLUMN_NAME LIKE 'field_%' " +
"ORDER BY CAST(SUBSTRING(COLUMN_NAME, 7) AS UNSIGNED)";
List<String> fieldColumns = jdbcTemplate.queryForList(fetchColumnsSQL, String.class);
if (fieldColumns.isEmpty()) {
throw new RuntimeException("No matching columns found");
}
// Fetch ordered fields data
String query1 = "SELECT " + String.join(", ", fieldColumns) + " FROM gcc_1913_campaign.upload_data WHERE data_id = ?";
List<Map<String, Object>> orderedFieldsList = jdbcTemplate.queryForList(query1, dataId);
if (orderedFieldsList.isEmpty()) {
throw new RuntimeException("No data found for data_id: " + dataId);
}
Map<String, Object> orderedFields = orderedFieldsList.get(0);
// Fetch category columns
String query2 = "SELECT column_name FROM gcc_1913_campaign.category_columns WHERE category_id = ? and isactive=1 ";
List<String> categoryColumns = new ArrayList<>(jdbcTemplate.queryForList(query2, String.class, categoryId));
//System.out.println("service===="+categoryColumns);
if (categoryColumns.isEmpty()) {
throw new RuntimeException("No category columns found for category_id: " + categoryId);
}
int categoryCount = categoryColumns.size();
// Collect first 'categoryCount' non-null values from orderedFields
List<Object> nonNullValues = new ArrayList<>();
for (String field : fieldColumns) {
Object value = orderedFields.get(field);
if (value != null) {
nonNullValues.add(value);
if (nonNullValues.size() == categoryCount) {
break; // Stop after collecting required count
}
}
}
if (nonNullValues.size() < categoryCount) {
throw new RuntimeException("Not enough non-null values to match category columns");
}
// Map category columns to non-null ordered field values
Map<String, Object> finalMapping = new HashMap<>();
for (int i = 0; i < categoryCount; i++) {
finalMapping.put(categoryColumns.get(i), nonNullValues.get(i));
}
resultList.add(finalMapping);
return resultList;
}
@Transactional
public List<Map<String, Object>> getCampaignQuestions(int categoryId, int campaignId) {
// Fetch questions along with answer type
// String questionQuery = "SELECT cq.*, at.type_name " +
// "FROM gcc_1913_campaign.campaign_questions cq " +
// "JOIN gcc_1913_campaign.answer_type at " +
// "ON cq.answer_type_id = at.answer_type_id " +
//
// "WHERE cq.category_id = ? AND cq.campaign_id = ? ";
String questionQuery="SELECT cq.questions AS questions, \r\n"
+ " MIN(cq.question_id) AS question_id, \r\n"
+ " MIN(cq.category_id) AS category_id, \r\n"
+ " MIN(cq.campaign_id) AS campaign_id, \r\n"
+ " MIN(cq.answer_type_id) AS answer_type_id, \r\n"
+ " MIN(cat.type_name) AS type_name \r\n"
+ "FROM gcc_1913_campaign.campaign_questions cq \r\n"
+ "JOIN gcc_1913_campaign.answer_type cat \r\n"
+ " ON cq.answer_type_id = cat.answer_type_id \r\n"
+ "WHERE cq.category_id = ? \r\n"
+ "AND cq.campaign_id = ? \r\n"
+ "AND cq.isactive = 1\r\n"
+ "GROUP BY cq.questions\r\n"
+ "ORDER BY MIN(cq.question_id)";
List<Map<String, Object>> questions = jdbcTemplate.queryForList(questionQuery, categoryId, campaignId);
// Iterate over each question and fetch answers
for (Map<String, Object> question : questions) {
int questionId = (int) question.get("question_id");
// String answerQuery = "SELECT campaign_answer FROM gcc_1913_campaign.campaign_answers " +
// "WHERE question_id = ?";
String answerQuery="SELECT distinct(question_id) as qid, campaign_answer, created_date FROM gcc_1913_campaign.campaign_answers\r\n"
+ "WHERE question_id = ?";
List<Map<String, Object>> answers = jdbcTemplate.queryForList(answerQuery, questionId);
/*
// Extract answer values and add to the question map
List<String> answerList = answers.stream()
.map(a -> (String) a.get("campaign_answer"))
.collect(Collectors.toList());
*/
List<String> answerList = new ArrayList<String>();
for (Map<String, Object> a : answers) {
Object ansObj = a.get("campaign_answer");
if (ansObj != null) {
answerList.add(ansObj.toString());
}
}
question.put("answers", answerList);
}
return questions;
}
@Transactional
public List<Map<String, Object>> FetchAnswer(int campaignId,int agentId,int questionId,int dataId) {
String sqlQuery = "SELECT distinct(campaign_answer) FROM gcc_1913_campaign.questions_answers where campaign_id=? and agent_id=? and question_id=? and data_id=?; ";
//System.out.println("dropdown l");
return jdbcTemplate.queryForList(sqlQuery,campaignId,agentId,questionId,dataId);
}
@Transactional
public void saveAnswers(List<Map<String, Object>> answers) {
String sql = "INSERT INTO gcc_1913_campaign.questions_answers " +
"(campaign_id, data_id, agent_id, question_id, campaign_answer, created_date) " +
"VALUES (?, ?, ?, ?, ?, NOW())";
for (Map<String, Object> answer : answers) {
jdbcTemplate.update(sql,
answer.get("campaign_id"),
answer.get("data_id"),
answer.get("agent_id"),
answer.get("question_id"),
answer.get("campaign_answer")
);
}
}
@Transactional
public List<Map<String, Object>> getCallStatus() {
String sqlQuery = "SELECT * FROM gcc_1913_campaign.calls_status ";
//System.out.println("dropdown l");
return jdbcTemplate.queryForList(sqlQuery);
}
@Transactional
public List<Map<String, Object>> checkCounts(int campaignId, int dataId) {
// Query to get the count of answered questions for a given dataId
String answersCountQuery = "SELECT COUNT(distinct(question_id)) AS answersCount FROM gcc_1913_campaign.questions_answers WHERE data_id = ?";
// Query to get the count of required questions for a given campaignId
String questionsCountQuery = "SELECT COUNT(distinct(questions)) AS questionsCount FROM gcc_1913_campaign.campaign_questions WHERE campaign_id = ?";
// Execute queries
int answersCount = jdbcTemplate.queryForObject(answersCountQuery, Integer.class, dataId);
int questionsCount = jdbcTemplate.queryForObject(questionsCountQuery, Integer.class, campaignId);
// Construct response as a list of maps
return List.of(Map.of(
"answersCount", answersCount,
"questionsCount", questionsCount
));
}
@Transactional
public List<Map<String, Object>> getAgentsALLCampaignsList(int agent_id) {
String SqlQuery = "SELECT * FROM gcc_1913_campaign.upload_data ud inner join gcc_1913_campaign.campaign_request cr on ud.campaign_id=cr.campaign_id where cr.campaign_status='ONGOING'"+
" and ud.agent_id = ? and ud.is_processed=0 ";
//System.out.println("text");
return jdbcTemplate.queryForList(SqlQuery,agent_id);
}
@Transactional
public List<Map<String, Object>> getAgentsALLCampaignsList1(int agent_id) {
String SqlQuery = "SELECT * FROM gcc_1913_campaign.upload_data ud inner join gcc_1913_campaign.campaign_request cr on ud.campaign_id=cr.campaign_id where cr.campaign_status='ONGOING'"+
" and ud.agent_id = ? and ud.is_processed=1";
// System.out.println("text");
return jdbcTemplate.queryForList(SqlQuery,agent_id);
}
@Transactional
public List<Map<String, Object>> getAgentsALLCampaigns(int agent_id) {
String SqlQuery = "SELECT c.category_name,cr.*,\r\n"
+ "(SELECT COUNT(data_id)\r\n"
+ "FROM gcc_1913_campaign.upload_data up\r\n"
+ "WHERE up.agent_id = aa.agent_id \r\n"
+ "AND up.campaign_id = cr.campaign_id\r\n"
+ ") AS calls_assigned,\r\n"
+ "(SELECT COUNT(CASE WHEN up.call_status IS NOT NULL THEN 1 END) \r\n"
+ "FROM gcc_1913_campaign.upload_data up \r\n"
+ "WHERE up.agent_id = aa.agent_id \r\n"
+ "AND up.campaign_id = cr.campaign_id\r\n"
+ ") AS complete_count,\r\n"
+ "(SELECT COUNT(CASE WHEN up.call_status IS NULL THEN 1 END) \r\n"
+ "FROM gcc_1913_campaign.upload_data up \r\n"
+ "WHERE up.agent_id = aa.agent_id \r\n"
+ "AND up.campaign_id = cr.campaign_id\r\n"
+ ") AS pending_count\r\n"
+ "FROM gcc_1913_campaign.agent_assign aa\r\n"
+ "JOIN gcc_1913_campaign.campaign_request cr ON cr.campaign_id=aa.campaign_id\r\n"
+ "JOIN gcc_1913_campaign.category c ON c.category_id=cr.category_id\r\n"
+ "WHERE cr.campaign_status='ONGOING' AND aa.isactive=1 AND cr.isactive=1 AND aa.agent_id=?";
return jdbcTemplate.queryForList(SqlQuery,agent_id);
}
// public List<Map<String, Object>> getCallCategories()
// {
// String query = "SELECT id,call_status FROM gcc_1913_campaign.calls_status WHERE isactive=1 AND isdelete=0";
// return jdbcTemplate.queryForList(query);
// }
}

116
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/AttendanceService.java

@ -0,0 +1,116 @@
package in.gov.chennaicorporation.gccoffice.callcenter.service;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class AttendanceService {
// private JdbcTemplate jdbcTemplate;
//
//
// @Autowired
// public void setDataSource(@Qualifier("BiometricDataSource") DataSource dataSource) {
// this.jdbcTemplate = new JdbcTemplate(dataSource);
// }
//
//
// public List<Map<String, Object>> getAttendanceReport(String fromDate, String toDate) {
// String reportQuery;
//
// if (fromDate != null && toDate != null) {
// // Query with date filter if dates are provided
// reportQuery = "SELECT d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, " +
// "c.device_name, CAST(a.officepunch AS DATE) AS punch_date, MIN(a.OFFICEPUNCH) AS PUNCHIN, " +
// "CASE WHEN MAX(a.OFFICEPUNCH) = MIN(a.OFFICEPUNCH) THEN NULL ELSE MAX(a.OFFICEPUNCH) END AS PUNCHOUT " +
// "FROM machinerawpunch a, tbl_realtime_userinfo b, tbl_fkdevice_status c, zone_div_mast d, " +
// "tblemployee e, tbldepartment f " +
// "WHERE a.paycode = b.user_id AND a.deviceid = c.device_id AND c.device_name = d.devname " +
// "AND a.paycode = e.paycode AND e.departmentcode = f.departmentcode " +
// "AND CAST(a.officepunch AS DATE) BETWEEN ? AND ? " +
// "AND a.paycode LIKE '%19130%' " +
// "GROUP BY d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, " +
// "c.device_name, CAST(a.officepunch AS DATE) " +
// "ORDER BY d.zone, d.division, b.user_id, CAST(a.officepunch AS DATE)";
//
// // Execute query with date parameters
// return jdbcTemplate.queryForList(reportQuery, fromDate, toDate);
//
// } else {
// // Query without date filter
// reportQuery = "SELECT d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, " +
// "c.device_name, CAST(a.officepunch AS DATE) AS punch_date, MIN(a.OFFICEPUNCH) AS PUNCHIN, " +
// "CASE WHEN MAX(a.OFFICEPUNCH) = MIN(a.OFFICEPUNCH) THEN NULL ELSE MAX(a.OFFICEPUNCH) END AS PUNCHOUT " +
// "FROM machinerawpunch a, tbl_realtime_userinfo b, tbl_fkdevice_status c, zone_div_mast d, " +
// "tblemployee e, tbldepartment f " +
// "WHERE a.paycode = b.user_id AND a.deviceid = c.device_id AND c.device_name = d.devname " +
// "AND a.paycode = e.paycode AND e.departmentcode = f.departmentcode " +
// "AND a.paycode LIKE '%19130%' " +
// "GROUP BY d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, " +
// "c.device_name, CAST(a.officepunch AS DATE) " +
// "ORDER BY d.zone, d.division, b.user_id, CAST(a.officepunch AS DATE)";
//
// // Execute query without date parameters
// return jdbcTemplate.queryForList(reportQuery);
// }
// }
//
//
//
//// public List<Map<String, Object>> getAttendanceReport(String fromDate, String toDate) {
//// System.out.println("Service Layer: Generating attendance report");
////
//// String reportQuery = "SELECT d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, c.device_name, " +
//// "CAST(a.officepunch AS DATE) AS punch_date, MIN(a.OFFICEPUNCH) AS PUNCHIN, " +
//// "CASE WHEN MAX(a.OFFICEPUNCH) = MIN(a.OFFICEPUNCH) THEN NULL ELSE MAX(a.OFFICEPUNCH) END AS PUNCHOUT " +
//// "FROM machinerawpunch a, tbl_realtime_userinfo b, tbl_fkdevice_status c, zone_div_mast d, " +
//// "tblemployee e, tbldepartment f " +
//// "WHERE a.paycode = b.user_id AND a.deviceid = c.device_id AND c.device_name = d.devname " +
//// "AND a.paycode = e.paycode AND e.departmentcode = f.departmentcode ";
////
//// // Dynamic date filter
//// if (fromDate != null && toDate != null) {
//// reportQuery += "AND CAST(a.officepunch AS DATE) BETWEEN ? AND ? ";
//// } else if (fromDate != null) {
//// reportQuery += "AND CAST(a.officepunch AS DATE) = ? ";
//// } else {
//// throw new IllegalArgumentException("fromDate or toDate must be provided");
//// }
////
//// reportQuery += "AND a.paycode LIKE '%19130%' " +
//// "GROUP BY d.zone, d.division, b.user_id, b.user_name, f.departmentname, e.designation, c.device_name, " +
//// "CAST(a.officepunch AS DATE) " +
//// "ORDER BY d.zone, d.division, b.user_id, CAST(a.officepunch AS DATE)";
////
//// // Execute query based on dates
//// if (fromDate != null && toDate != null) {
//// return jdbcTemplate.queryForList(reportQuery, fromDate, toDate);
//// } else {
//// return jdbcTemplate.queryForList(reportQuery, fromDate);
//// }
//// }
//
//// public List<Map<String, Object>> getAttendanceReport() {
//// System.out.println("check 2");
//// String reportQuery ="SELECT d.zone,d.division,b.user_id,b.user_name,f.departmentname,e.designation,c.device_name,CAST(a.officepunch AS DATE) as punch_date,MIN(a.OFFICEPUNCH) AS PUNCHIN,\r\n"
//// + "CASE WHEN MAX(a.OFFICEPUNCH) = MIN(a.OFFICEPUNCH) THEN NULL ELSE MAX(a.OFFICEPUNCH) END AS PUNCHOUT FROM machinerawpunch a,tbl_realtime_userinfo b,tbl_fkdevice_status c,\r\n"
//// + "zone_div_mast d,tblemployee e,tbldepartment f WHERE a.paycode = b.user_id AND a.deviceid = c.device_id AND c.device_name = d.devname AND a.paycode = e.paycode AND \r\n"
//// + "e.departmentcode = f.departmentcode AND CAST(officepunch AS DATE) BETWEEN '2024-10-01' AND '2024-10-10'\r\n"
//// + "AND a.paycode LIKE '%19130%' \r\n"
//// + "GROUP BY d.zone,d.division,b.user_id,b.user_name,f.departmentname,e.designation,c.device_name,CAST(a.officepunch AS DATE)\r\n"
//// + "ORDER BY d.zone,d.division,b.user_id,CAST(a.officepunch AS DATE)";
//// System.out.println("check 3");
//// List<Map<String,Object>> reports = jdbcTemplate.queryForList(reportQuery);
//// System.out.println("check 4");
//// return reports;
//// }
}

29
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/CampaignDropdownApiService.java

@ -0,0 +1,29 @@
package in.gov.chennaicorporation.gccoffice.callcenter.service;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class CampaignDropdownApiService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String,Object>> getAnswerTypes(){
String sql = "SELECT answer_type_id,type_name FROM answer_type";
return jdbcTemplate.queryForList(sql);
}
}

533
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/CampaignReportService.java

@ -0,0 +1,533 @@
package in.gov.chennaicorporation.gccoffice.callcenter.service;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class CampaignReportService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSourcemysql(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
public void setDataSource2(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getCampaignData(String startDate, String endDate) {
StringBuilder query = new StringBuilder(
"SELECT " +
" cr.campaign_id, " +
" cr.category_id, " +
" cr.campaign_name, " +
" cc.category_name, " +
" cr.start_date, " +
" cr.end_date, " +
" COUNT(ud.campaign_id) AS total_count, " +
" COUNT(ud.agent_id) AS assigned_count, " +
" COUNT(ud.campaign_id) - COUNT(ud.agent_id) AS not_assigned_count, " +
" COUNT(CASE WHEN ud.call_status = 'INFORMATION GIVEN' THEN 1 ELSE NULL END) AS informationgiven_count, " +
" COUNT(CASE WHEN ud.call_status = 'CALL BACK LATER' THEN 1 ELSE NULL END) AS callback_count, " +
" COUNT(CASE WHEN ud.call_status = 'UNATTENDED' THEN 1 ELSE NULL END) AS unattended_count, " +
" COUNT(CASE WHEN ud.call_status = 'SWITCH OFF' THEN 1 ELSE NULL END) AS switchoff_count, " +
" COUNT(CASE WHEN ud.call_status = 'WRONG NUMBER' THEN 1 ELSE NULL END) AS wrongnumber_count " +
"FROM gcc_1913_campaign.campaign_request cr " +
"JOIN gcc_1913_campaign.upload_data ud ON cr.campaign_id = ud.campaign_id " +
"JOIN gcc_1913_campaign.category cc ON cr.category_id = cc.category_id " +
"WHERE cr.campaign_status IN ('ONGOING', 'CLOSED') " +
"AND ud.agent_id IS NOT NULL "
);
// Apply date filter dynamically if dates are provided
if (startDate != null && endDate != null) {
query.append("AND DATE(cr.created_date) BETWEEN ? AND ? ");
}
query.append("GROUP BY cr.campaign_id ");
query.append("ORDER BY cr.campaign_id DESC");
// Execute query with or without parameters
if (startDate != null && endDate != null) {
return jdbcTemplate.queryForList(query.toString(), startDate, endDate);
} else {
return jdbcTemplate.queryForList(query.toString());
}
}
public List<Map<String, Object>> getAgentwiseData(String campaignId) {
String query = "SELECT aa.agent_id, al.agent_name, \r\n"
+ " COUNT(ud.agent_id) AS assigned_count, \r\n"
+ " COUNT(CASE WHEN ud.is_processed = 1 THEN 1 ELSE NULL END) AS completed_count, \r\n"
+ " COUNT(ud.agent_id) - COUNT(CASE WHEN ud.is_processed = 1 THEN 1 ELSE NULL END) AS pending_count, \r\n"
+ " COUNT(CASE WHEN ud.call_status = 'INFORMATION GIVEN' THEN 1 ELSE NULL END) AS informationgiven_count, \r\n"
+ " COUNT(CASE WHEN ud.call_status = 'CALL BACK LATER' THEN 1 ELSE NULL END) AS callback_count, \r\n"
+ " COUNT(CASE WHEN ud.call_status = 'UNATTENDED' THEN 1 ELSE NULL END) AS unattended_count, \r\n"
+ " COUNT(CASE WHEN ud.call_status = 'SWITCH OFF' THEN 1 ELSE NULL END) AS switchoff_count, \r\n"
+ " COUNT(CASE WHEN ud.call_status = 'WRONG NUMBER' THEN 1 ELSE NULL END) AS wrongnumber_count, \r\n"
+ " CASE \r\n"
+ " WHEN COUNT(ud.agent_id) = 0 THEN 0 \r\n"
+ " ELSE FLOOR((COUNT(CASE WHEN ud.is_processed = 1 THEN 1 ELSE NULL END) * 100) / COUNT(ud.agent_id))\r\n"
+ " END AS completed_percentage\r\n"
+ "FROM gcc_1913_campaign.agent_assign aa \r\n"
+ "JOIN gcc_1913_qaqc.agents_list al ON al.agent_id = aa.agent_id \r\n"
+ "JOIN gcc_1913_campaign.upload_data ud ON ud.agent_id = aa.agent_id AND ud.campaign_id = aa.campaign_id\r\n"
+ "WHERE aa.campaign_id = ? AND aa.isactive = 1 AND aa.isdelete = 0 AND ud.agent_id IS NOT NULL \r\n"
+ "GROUP BY aa.agent_id, al.agent_name \r\n"
+ "ORDER BY aa.agent_id";
return jdbcTemplate.queryForList(query, campaignId);
}
//report for campaign details
public List<Map<String, Object>> getAgentReportCampaignId(String campaignId) {
String query = "SELECT cr.category_id,cr.campaign_id, cc.category_name, \r\n"
+ " cr.start_date, cr.end_date, \r\n"
+ " cr.description, date (cr.created_date) as created_date \r\n"
+ " FROM gcc_1913_campaign.category cc \r\n"
+ " join gcc_1913_campaign.campaign_request cr on cr.category_id = cc.category_id \r\n"
+ " where cr.campaign_id = ?;";
return jdbcTemplate.queryForList(query, campaignId);
}
//get campaignname
public String getCampaignName(int campaignId) {
String query = "SELECT campaign_name FROM gcc_1913_campaign.campaign_request WHERE campaign_id = ?";
return jdbcTemplate.queryForObject(query, String.class, campaignId);
}
//question and answers counts with percentage in report page method
public List<Map<String, Object>> getQuestionAnswers(int campaignId) {
String sql = "SELECT cq.question_id, cq.questions, ca.campaign_answer,"
+ " COUNT(qa.campaign_answer) AS answer_count,"
+ " FLOOR("
+ " IFNULL((COUNT(qa.campaign_answer) / NULLIF(total_info.total_information_given, 0)) * 100, 0)"
+ " ) AS answer_percentage"
+ " FROM "
+ " gcc_1913_campaign.campaign_questions cq"
+ " JOIN "
+ " gcc_1913_campaign.campaign_answers ca "
+ " ON cq.question_id = ca.question_id AND cq.campaign_id = ca.campaign_id"
+ " LEFT JOIN "
+ " gcc_1913_campaign.questions_answers qa "
+ " ON cq.question_id = qa.question_id "
+ " AND ca.campaign_answer = qa.campaign_answer "
+ " AND cq.campaign_id = qa.campaign_id"
+ " LEFT JOIN ("
+ " SELECT campaign_id, COUNT(*) AS total_information_given"
+ " FROM gcc_1913_campaign.upload_data "
+ " WHERE call_status = 'INFORMATION GIVEN'"
+ " GROUP BY campaign_id"
+ " ) AS total_info ON total_info.campaign_id = cq.campaign_id"
+ " WHERE "
+ " cq.campaign_id = ? "
+ " AND cq.isactive = 1 "
+ " AND cq.isdelete = 0"
+ " GROUP BY "
+ " cq.question_id, cq.questions, ca.campaign_answer, total_info.total_information_given"
+ " ORDER BY "
+ " cq.question_id";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, campaignId);
Map<Integer, Map<String, Object>> responseMap = new LinkedHashMap<>();
for (Map<String, Object> row : result) {
int questionId = (int) row.get("question_id");
if (!responseMap.containsKey(questionId)) {
Map<String, Object> questionData = new HashMap<>();
questionData.put("question_id", questionId);
questionData.put("questions", row.get("questions"));
questionData.put("answers", new ArrayList<>());
responseMap.put(questionId, questionData);
}
Map<String, Object> answerData = new HashMap<>();
answerData.put("campaign_answer", row.get("campaign_answer"));
answerData.put("answer_count", row.get("answer_count"));
answerData.put("answer_percentage", row.get("answer_percentage"));
((List<Map<String, Object>>) responseMap.get(questionId).get("answers")).add(answerData);
}
return new ArrayList<>(responseMap.values());
}
//
// public void generateCSV(int categoryId, int campaignId, PrintWriter writer) {
// List<Map<String, Object>> resultList = new ArrayList<>();
//
// // Fetch ordered field column names
// String fetchColumnsSQL = "SELECT COLUMN_NAME " +
// "FROM INFORMATION_SCHEMA.COLUMNS " +
// "WHERE TABLE_SCHEMA = 'gcc_1913_campaign' " +
// "AND TABLE_NAME = 'upload_data' " +
// "AND COLUMN_NAME LIKE 'field_%' " +
// "ORDER BY CAST(SUBSTRING(COLUMN_NAME, 7) AS UNSIGNED)";
//
// List<String> fieldColumns = jdbcTemplate.queryForList(fetchColumnsSQL, String.class);
//
// if (fieldColumns.isEmpty()) {
// writer.println("No matching columns found");
// return;
// }
//
// // Fetch ordered fields data based on campaign_id, including data_id, agent_id, and call_status
// String query1 = "SELECT data_id, " + String.join(", ", fieldColumns) + ", agent_id, call_status,remarks " +
// "FROM gcc_1913_campaign.upload_data WHERE campaign_id = ?";
//
// List<Map<String, Object>> orderedFieldsList = jdbcTemplate.queryForList(query1, campaignId);
//
// if (orderedFieldsList.isEmpty()) {
// writer.println("No data found for campaign_id: " + campaignId);
// return;
// }
//
// // Fetch category columns
// String query2 = "SELECT column_name FROM gcc_1913_campaign.category_columns WHERE category_id = ? AND isactive=1";
// List<String> categoryColumns = jdbcTemplate.queryForList(query2, String.class, categoryId);
//
// if (categoryColumns.isEmpty()) {
// writer.println("No category columns found for category_id: " + categoryId);
// return;
// }
//
// int categoryCount = categoryColumns.size();
//
// // Fetch Agent Names from agent_id
// String fetchAgentSQL = "SELECT agent_id, agent_name FROM gcc_1913_qaqc.agents_list";
// Map<Integer, String> agentMap = jdbcTemplate.query(fetchAgentSQL, rs -> {
// Map<Integer, String> map = new HashMap<>();
// while (rs.next()) {
// map.put(rs.getInt("agent_id"), rs.getString("agent_name"));
// }
// return map;
// });
//
// // Fetch Questions for given campaign_id
// String fetchQuestionsQuery = "SELECT question_id, questions FROM gcc_1913_campaign.campaign_questions WHERE campaign_id = ?";
// Map<Integer, String> questionsMap = jdbcTemplate.query(fetchQuestionsQuery, rs -> {
// Map<Integer, String> map = new LinkedHashMap<>();
// while (rs.next()) {
// map.put(rs.getInt("question_id"), rs.getString("questions"));
// }
// return map;
// }, campaignId);
//
// // Fetch Answers mapped to questions and grouped by data_id
// String fetchAnswersQuery = "SELECT data_id, question_id, campaign_answer FROM gcc_1913_campaign.questions_answers " +
// "WHERE campaign_id = ?";
// Map<Integer, Map<Integer, String>> answersMap = jdbcTemplate.query(fetchAnswersQuery, rs -> {
// Map<Integer, Map<Integer, String>> map = new HashMap<>();
// while (rs.next()) {
// int dataId = rs.getInt("data_id");
// int questionId = rs.getInt("question_id");
// String answer = rs.getString("campaign_answer");
//
// map.computeIfAbsent(dataId, k -> new HashMap<>()).put(questionId, answer);
// }
// return map;
// }, campaignId);
//
// // Process each row and collect data
// for (Map<String, Object> orderedFields : orderedFieldsList) {
// List<Object> nonNullValues = new ArrayList<>();
// for (String field : fieldColumns) {
// Object value = orderedFields.get(field);
// if (value != null) {
// nonNullValues.add(value);
// if (nonNullValues.size() == categoryCount) {
// break; // Stop after collecting required count
// }
// }
// }
//
// if (nonNullValues.size() < categoryCount) {
// continue; // Skip if not enough non-null values
// }
//
// Integer dataId = orderedFields.get("data_id") != null ? ((Number) orderedFields.get("data_id")).intValue() : null;
//
// // Map category columns to non-null ordered field values
// Map<String, Object> finalMapping = new LinkedHashMap<>();
//
// // Add category columns
// for (int i = 0; i < categoryCount; i++) {
// finalMapping.put(categoryColumns.get(i), nonNullValues.get(i));
// }
//
// // Add Questions and Corresponding Answers for this specific data_id
// Map<Integer, String> currentAnswers = answersMap.getOrDefault(dataId, new HashMap<>());
// for (Map.Entry<Integer, String> entry : questionsMap.entrySet()) {
// Integer questionId = entry.getKey();
// String questionText = entry.getValue();
// String answer = currentAnswers.getOrDefault(questionId, "-"); // Default to "-"
//
// finalMapping.put(questionText, answer);
// }
//
// //Integer agentId = ((Number) orderedFields.get("agent_id")).intValue();
//
// Integer agentId = orderedFields.get("agent_id") != null ? ((Number) orderedFields.get("agent_id")).intValue() : null;
// String agentName = agentMap.getOrDefault(agentId, "Not Assigned");
// finalMapping.put("Agent Name", agentName);
//
// String callstatus = orderedFields.get("call_status") != null ? orderedFields.get("call_status").toString() : "-";
// finalMapping.put("Call Status", callstatus);
//
// // Add Remarks
// String remarks = orderedFields.get("remarks") != null ? orderedFields.get("remarks").toString() : "-";
//
// finalMapping.put("Remarks", remarks);
//
// resultList.add(finalMapping);
// }
//
// // Write CSV data
// if (resultList.isEmpty()) {
// writer.println("No Data Available");
// return;
// }
//
// // Extract headers from the first row
// String headers = String.join(",", resultList.get(0).keySet());
// writer.println(headers);
//
// // Write data rows
// for (Map<String, Object> rowData : resultList) {
// List<String> values = rowData.values().stream()
// .map(value -> value != null ? value.toString() : "")
// .collect(Collectors.toList());
// writer.println(String.join(",", values));
// }
// }
// Method to escape CSV values
private String escapeCsvValue(String value) {
if (value == null) return "";
// If the value contains commas, double quotes, or newlines, wrap it in quotes and escape inner quotes
if (value.contains(",") || value.contains("\"") || value.contains("\n")) {
value = "\"" + value.replace("\"", "\"\"") + "\"";
}
return value;
}
public void generateCSV(int categoryId, int campaignId, PrintWriter writer) {
List<Map<String, Object>> resultList = new ArrayList<>();
// Fetch ordered field column names
String fetchColumnsSQL = "SELECT COLUMN_NAME " +
"FROM INFORMATION_SCHEMA.COLUMNS " +
"WHERE TABLE_SCHEMA = 'gcc_1913_campaign' " +
"AND TABLE_NAME = 'upload_data' " +
"AND COLUMN_NAME LIKE 'field_%' " +
"ORDER BY CAST(SUBSTRING(COLUMN_NAME, 7) AS UNSIGNED)";
List<String> fieldColumns = jdbcTemplate.queryForList(fetchColumnsSQL, String.class);
if (fieldColumns.isEmpty()) {
writer.println("No matching columns found");
return;
}
// Fetch ordered fields data based on campaign_id, including data_id, agent_id, and call_status
String query1 = "SELECT data_id, " + String.join(", ", fieldColumns) + ", agent_id, call_status,remarks,DATE(updated_date) as updated_date " +
"FROM gcc_1913_campaign.upload_data WHERE campaign_id = ?";
List<Map<String, Object>> orderedFieldsList = jdbcTemplate.queryForList(query1, campaignId);
if (orderedFieldsList.isEmpty()) {
writer.println("No data found for campaign_id: " + campaignId);
return;
}
// Fetch category columns
String query2 = "SELECT column_name FROM gcc_1913_campaign.category_columns WHERE category_id = ? AND isactive=1";
List<String> categoryColumns = jdbcTemplate.queryForList(query2, String.class, categoryId);
if (categoryColumns.isEmpty()) {
writer.println("No category columns found for category_id: " + categoryId);
return;
}
int categoryCount = categoryColumns.size();
// Fetch Agent Names from agent_id
String fetchAgentSQL = "SELECT agent_id, agent_name FROM gcc_1913_qaqc.agents_list";
Map<Integer, String> agentMap = jdbcTemplate.query(fetchAgentSQL, rs -> {
Map<Integer, String> map = new HashMap<>();
while (rs.next()) {
map.put(rs.getInt("agent_id"), rs.getString("agent_name"));
}
return map;
});
// Fetch Questions for given campaign_id
String fetchQuestionsQuery = "SELECT question_id, questions FROM gcc_1913_campaign.campaign_questions WHERE campaign_id = ?";
Map<Integer, String> questionsMap = jdbcTemplate.query(fetchQuestionsQuery, rs -> {
Map<Integer, String> map = new LinkedHashMap<>();
while (rs.next()) {
map.put(rs.getInt("question_id"), rs.getString("questions"));
}
return map;
}, campaignId);
// Fetch Answers mapped to questions and grouped by data_id
String fetchAnswersQuery = "SELECT data_id, question_id, campaign_answer FROM gcc_1913_campaign.questions_answers " +
"WHERE campaign_id = ?";
Map<Integer, Map<Integer, String>> answersMap = jdbcTemplate.query(fetchAnswersQuery, rs -> {
Map<Integer, Map<Integer, String>> map = new HashMap<>();
while (rs.next()) {
int dataId = rs.getInt("data_id");
int questionId = rs.getInt("question_id");
String answer = rs.getString("campaign_answer");
map.computeIfAbsent(dataId, k -> new HashMap<>()).put(questionId, answer);
}
return map;
}, campaignId);
// Process each row and collect data
for (Map<String, Object> orderedFields : orderedFieldsList) {
List<Object> nonNullValues = new ArrayList<>();
for (String field : fieldColumns) {
Object value = orderedFields.get(field);
if (value != null) {
nonNullValues.add(value);
if (nonNullValues.size() == categoryCount) {
break; // Stop after collecting required count
}
}
}
if (nonNullValues.size() < categoryCount) {
continue; // Skip if not enough non-null values
}
Integer dataId = orderedFields.get("data_id") != null ? ((Number) orderedFields.get("data_id")).intValue() : null;
// Map category columns to non-null ordered field values
Map<String, Object> finalMapping = new LinkedHashMap<>();
// Add category columns
for (int i = 0; i < categoryCount; i++) {
finalMapping.put(categoryColumns.get(i), nonNullValues.get(i));
}
// Add Questions and Corresponding Answers for this specific data_id
Map<Integer, String> currentAnswers = answersMap.getOrDefault(dataId, new HashMap<>());
for (Map.Entry<Integer, String> entry : questionsMap.entrySet()) {
Integer questionId = entry.getKey();
String questionText = entry.getValue();
String answer = currentAnswers.getOrDefault(questionId, "-"); // Default to "-"
finalMapping.put(questionText, answer);
}
Integer agentId = orderedFields.get("agent_id") != null ? ((Number) orderedFields.get("agent_id")).intValue() : null;
String agentName = agentMap.getOrDefault(agentId, "Not Assigned");
finalMapping.put("Agent Name", agentName);
String callstatus = orderedFields.get("call_status") != null ? orderedFields.get("call_status").toString() : "-";
finalMapping.put("Call Status", callstatus);
// Add Remarks
String remarks = orderedFields.get("remarks") != null ? orderedFields.get("remarks").toString() : "-";
finalMapping.put("Remarks", remarks);
String up_date = orderedFields.get("updated_date") != null ? orderedFields.get("updated_date").toString() : "-";
finalMapping.put("Updated_Date", up_date);
resultList.add(finalMapping);
}
// Write CSV data
if (resultList.isEmpty()) {
writer.println("No Data Available");
return;
}
/*
// Extract headers from the first row and escape them
String headers = resultList.get(0).keySet().stream()
.map(this::escapeCsvValue) // Escape each header value
.collect(Collectors.joining(","));
writer.println(headers);
// Write data rows
for (Map<String, Object> rowData : resultList) {
List<String> values = rowData.values().stream()
.map(value -> escapeCsvValue(value != null ? value.toString() : ""))
.collect(Collectors.toList());
writer.println(String.join(",", values));
}
*/
// Extract headers from the first row and escape them
Map<String, Object> firstRow = resultList.get(0);
StringBuilder headerBuilder = new StringBuilder();
int headerIndex = 0;
for (String key : firstRow.keySet()) {
if (headerIndex > 0) {
headerBuilder.append(",");
}
headerBuilder.append(escapeCsvValue(key));
headerIndex++;
}
writer.println(headerBuilder.toString());
// Write data rows
for (Map<String, Object> rowData : resultList) {
StringBuilder rowBuilder = new StringBuilder();
int valueIndex = 0;
for (Object value : rowData.values()) {
if (valueIndex > 0) {
rowBuilder.append(",");
}
rowBuilder.append(
escapeCsvValue(value != null ? value.toString() : "")
);
valueIndex++;
}
writer.println(rowBuilder.toString());
}
}
}

715
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/CampaignService.java

@ -0,0 +1,715 @@
package in.gov.chennaicorporation.gccoffice.callcenter.service;
import java.io.File;
import java.io.IOException;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Service
public class CampaignService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSourcemysql(@Qualifier("mysql1913CampaignDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
public void setDataSource2(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Autowired
private JdbcTemplate jdbcTemplate2;
//Method to save file and return its URL
public String saveFile(MultipartFile file) {
String fileName = file.getOriginalFilename();
String filePath = "/uploads/" + fileName; // Path to save the file
try {
File destinationFile = new File(filePath);
file.transferTo(destinationFile); // Save the file locally
} catch (IOException e) {
throw new RuntimeException("Failed to store file " + fileName, e);
}
return filePath; // Return the file path (URL) for saving to the database
}
//Method to save campaign details into the database
public void saveCampaignDetails(Map<String, Object> campaignDetails) {
String sql = "UPDATE gcc_1913_campaign.campaign_request " +
"SET start_date = :start_date, " +
"end_date = :end_date, " +
"calls_per_agent = :calls_per_agent, " +
"description = :description " +
"WHERE campaign_id = :campaign_id";
// Using NamedParameterJdbcTemplate for mapping campaignDetails into query
NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
namedJdbcTemplate.update(sql, campaignDetails);
}
// Method to save campaign details into the database
public String saveCampaignDetailsExcel(Map<String, Object> campaignDetailsExcel) {
campaignDetailsExcel.putIfAbsent("campaign_status", "PENDING");
String sql = "INSERT INTO gcc_1913_campaign.campaign_request (campaign_name, category_id, excel_url,campaign_status) " +
"VALUES (:campaign_name, :category_id, :excel_url ,:campaign_status)";
// Using NamedParameterJdbcTemplate for mapping campaignDetails into query
NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
namedJdbcTemplate.update(sql, campaignDetailsExcel);
// Return the category to use in the next step
return campaignDetailsExcel.get("category_id").toString();
}
// campaign_status change as ongoing in campaign_request table
@Transactional
public void updateCampaignStatus(int campaignId, int categoryId) {
String checkSql = "SELECT COUNT(*) FROM gcc_1913_campaign.agent_assign "
+ "WHERE campaign_id = ? AND category_id = ? AND status = 'ASSIGNED'";
int assignedCount = jdbcTemplate.queryForObject(checkSql, Integer.class, campaignId, categoryId);
if (assignedCount > 0) {
String updateSql = "UPDATE gcc_1913_campaign.campaign_request "
+ "SET campaign_status = 'ONGOING' WHERE campaign_id = ? AND category_id = ?";
jdbcTemplate.update(updateSql, campaignId, categoryId);
System.out.println("Campaign status updated to ONGOING for campaign ID: " + campaignId);
} else {
System.out.println("No agents assigned yet. Campaign status remains PENDING.");
}
}
//Validated uploaded excel column count with field column in our DB
public List<String> getUploadDataFieldColumns() {
String query = "SELECT column_name FROM information_schema.columns "
+ "WHERE table_schema = 'gcc_1913_campaign' "
+ "AND table_name = 'upload_data' "
+ "AND column_name LIKE 'field_%'";
return jdbcTemplate.queryForList(query, String.class);
}
public String saveQuestionsAnswers(List<Map<String, Object>> questionsData) {
for (Map<String, Object> question : questionsData) {
String questionText = (String) question.get("question");
String answerType = (String) question.get("answerType");
// Validate and parse categoryId and campaignId
Integer categoryId = Integer.parseInt(question.get("categoryId").toString());
Integer campaignId = Integer.parseInt(question.get("campaignId").toString());
List<String> answers = (List<String>) question.get("answers");
// Insert question and get generated question_id
String questionInsertQuery = "INSERT INTO gcc_1913_campaign.campaign_questions (category_id, campaign_id, questions, answer_type_id) VALUES (?, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(questionInsertQuery, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, categoryId);
ps.setInt(2, campaignId);
ps.setString(3, questionText);
ps.setString(4, answerType);
return ps;
}, keyHolder);
Integer questionId = keyHolder.getKey().intValue();
// Insert answers if available
if (answers != null && !answers.isEmpty()) {
String answerInsertQuery = "INSERT INTO gcc_1913_campaign.campaign_answers (category_id, campaign_id, question_id, campaign_answer) VALUES (?, ?, ?, ?)";
for (String answer : answers) {
jdbcTemplate.update(answerInsertQuery, categoryId, campaignId, questionId, answer);
}
}
}
return "Questions and Answers saved successfully!";
}
public void saveQuestionsAndAnswers(String category, String campaignId, String question, String answerType, List<String> answers) {
// Convert category and answerType to integers once to avoid redundant parsing
int categoryId = Integer.parseInt(category);
int answerTypeId = Integer.parseInt(answerType);
int campaignIdd = Integer.parseInt(campaignId);
// Query to insert question into campaign_questions and retrieve generated question_id
String query1 = "INSERT INTO gcc_1913_campaign.campaign_questions (category_id, campaign_id, questions, answer_type_id) VALUES (?, ?, ?, ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(query1, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, categoryId);
ps.setInt(2, campaignIdd);
ps.setString(3, question);
ps.setInt(4, answerTypeId);
return ps;
}, keyHolder);
int questionId = keyHolder.getKey().intValue();
// If answerType is NOT "Text" (ID = 1), save answers
if (answerTypeId != 1 && answers != null && !answers.isEmpty()) {
String query2 = "INSERT INTO gcc_1913_campaign.campaign_answers (category_id, campaign_id, question_id, campaign_answer) VALUES (?, ?, ?, ?)";
for (String answer : answers) {
jdbcTemplate.update(query2, categoryId, campaignId, questionId, answer);
}
}
System.out.println("Inserted Question ID: " + questionId + " with Answers: " + (answers != null ? answers : "None"));
}
//
// public Map<String, Object> getCampaignDetailsById(Long campaign_id) {
// String sql = "SELECT * FROM gcc_1913_campaign.campaign_request WHERE campaign_id = ?";
// return jdbcTemplate.queryForMap(sql, campaign_id);
// }
public void updateCampaign(Long campaign_id, String end_date) {
String sql = "UPDATE gcc_1913_campaign.campaign_request SET end_date = ? WHERE campaign_id = ?";
jdbcTemplate.update(sql, end_date,campaign_id);
}
public List<Map<String, Object>> getCampaignDetails() {
String sql = "SELECT campaign_id, " +
" campaign_name, " +
" CONCAT(" +
" DATE_FORMAT(start_date, '%d/%m/%Y'), " +
" ' to ', " +
" DATE_FORMAT(end_date, '%d/%m/%Y')" +
" ) AS event_dates, " +
" no_of_agents, " +
" calls_per_agent, " +
" (no_of_agents)*(calls_per_agent) as total_calls, " +
" description " +
"FROM gcc_1913_campaign.campaign_request;";
List<Map<String, Object>> campaigns = jdbcTemplate.queryForList(sql);
return campaigns;
}
public List<Map<String, Object>> getLastRow()
{
String sqlQuery ="SELECT campaign_id\r\n"
+ "FROM gcc_1913_campaign.campaign_request\r\n"
+ "ORDER BY campaign_id DESC\r\n"
+ "LIMIT 1";
return jdbcTemplate.queryForList(sqlQuery);
}
public String getLastInsertedCategoryId() {
String sqlQuery = "SELECT category_id " +
"FROM gcc_1913_campaign.campaign_request " +
"ORDER BY campaign_id DESC " +
"LIMIT 1";
return jdbcTemplate.queryForObject(sqlQuery, String.class);
}
public Integer getLastInsertedCampaignId()
{
String sqlQuery ="SELECT campaign_id\r\n"
+ "FROM gcc_1913_campaign.campaign_request\r\n"
+ "ORDER BY campaign_id DESC\r\n"
+ "LIMIT 1";
return jdbcTemplate.queryForObject(sqlQuery,Integer.class);
}
public List<Map<String, Object>> getDetailsForStart()
{
String sqlQuery ="SELECT cr.campaign_id,cr.category_id,ca.category_name,cr.campaign_name,start_date\r\n"
+ "FROM gcc_1913_campaign.campaign_request cr \r\n"
+ "join gcc_1913_campaign.category ca ON cr.category_id = ca.category_id \r\n"
+ "where cr.campaign_status='ONGOING' AND cr.isactive='1' and cr.isdelete='0' \r\n"
+ "order by cr.campaign_id desc";
return jdbcTemplate.queryForList(sqlQuery);
}
public List<Map<String, Object>> getDataforAgents(int campaign_id, int calls_per_agent)
{
List<Map<String, Object>> assignedAgent_list =getAssignedAgentId(campaign_id);
List<Map<String, Object>> data_list =getDataId(campaign_id);
List<Map<String, Object>> task = getTask(assignedAgent_list,data_list,calls_per_agent,campaign_id);
// Perform the update query here
if (task != null && !task.isEmpty()) {
assignAgentIds(task);
updateAgentStatus(campaign_id);
}
return task;
}
//Method to update agent_id for each data_id in upload_data table
public void assignAgentIds(List<Map<String, Object>> taskList) {
String updateQuery = "UPDATE gcc_1913_campaign.upload_data SET agent_id = ? WHERE data_id = ? AND campaign_id = ?";
// Loop through each agent's task list
for (Map<String, Object> task : taskList) {
Integer agentId = (Integer) task.get("agent_id");
Integer campaignId = (Integer) task.get("campaign_id");
List<Integer> dataIds = (List<Integer>) task.get("data_ids");
// Update each data_id with the respective agent_id
for (Integer dataId : dataIds) {
jdbcTemplate.update(updateQuery, agentId, dataId, campaignId);
}
}
}
//Example update method
private void updateAgentStatus(int campaign_id) {
String updateQuery = "UPDATE gcc_1913_campaign.campaign_request SET isactive = '0', isdelete='1' WHERE campaign_id = ?";
jdbcTemplate.update(updateQuery, campaign_id);
}
private List<Map<String, Object>> getTask(List<Map<String, Object>> assignedAgent_list, List<Map<String, Object>> data_list,
int calls_per_agent,int campaign_id) {
List<Map<String, Object>> result = new ArrayList<>();
int dataIndex = 0;
// Loop through each assigned ID
for (Map<String, Object> assigned : assignedAgent_list) {
// Create a map to store the assigned_id and corresponding data_ids
Map<String, Object> assignedTaskMap = new HashMap<>();
List<Integer> assignedDataIds = new ArrayList<>();
// Get assigned_id
Integer agent_id = (Integer) assigned.get("agent_id");
// Loop to assign the appropriate number of data IDs (calls_per_agent)
for (int i = 0; i < calls_per_agent; i++) {
if (dataIndex >= data_list.size()) {
// Exit if we run out of data IDs
break;
}
Map<String, Object> data = data_list.get(dataIndex);
Integer data_id = (Integer) data.get("data_id");
assignedDataIds.add(data_id);
dataIndex++;
}
// Put the agent_id and the corresponding data_ids in the map
assignedTaskMap.put("agent_id", agent_id);
assignedTaskMap.put("data_ids", assignedDataIds);
assignedTaskMap.put("campaign_id", campaign_id);
// Add the map to the result list
result.add(assignedTaskMap);
}
return result;
}
private List<Map<String, Object>> getDataId(int campaign_id) {
String sqlQuery ="SELECT data_id\r\n"
+ "from gcc_1913_campaign.upload_data\r\n"
+ "where campaign_id=?";
return jdbcTemplate.queryForList(sqlQuery, new Object[]{campaign_id});
}
private List<Map<String, Object>> getAssignedAgentId(int campaign_id) {
String sqlQuery ="SELECT agent_id\r\n"
+ "FROM gcc_1913_campaign.agent_assign \r\n"
+ "where campaign_id=? and isactive='1'";
return jdbcTemplate.queryForList(sqlQuery, new Object[]{campaign_id});
}
public List<Map<String, Object>> getActiveCampaigns()
{
String sqlQuery ="SELECT cr.campaign_id,cr.calls_per_agent,cr.category_id,cr.campaign_name,c.category_name,cr.start_date,cr.end_date,cr.description,cr.campaign_status\r\n"
+ "FROM gcc_1913_campaign.campaign_request cr\r\n"
+ "JOIN gcc_1913_campaign.category c ON cr.category_id=c.category_id\r\n"
+ "where cr.isactive='1' and cr.campaign_status IN ('ONGOING', 'CLOSED') Order by cr.campaign_id desc";
return jdbcTemplate.queryForList(sqlQuery);
}
public List<Map<String, Object>> viewcampaignstatus(int campaign_id) {
String sqlQuery ="SELECT \r\n"
+ "aa.campaign_id as campaign_id,\r\n"
+ " al.agent_id as agent_id,\r\n"
+ " al.agent_name as agent_name,\r\n"
+ " COUNT(up.agent_id) AS Assigned_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 IS NOT NULL THEN 1 END) AS Complete_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 IS NULL THEN 1 END) AS Pending_count,\r\n"
+ " ROUND(\r\n"
+ " (COUNT(CASE WHEN up.field_14 IS NOT NULL THEN 1 END) * 100) / \r\n"
+ " COUNT(up.agent_id)\r\n"
+ " ) as Percentage,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'INFORMATION_GIVEN' THEN 1 END) AS Information_Given_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'UNATTENDED' THEN 1 END) AS Unattended_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'CALL_BACK_LATER' THEN 1 END) AS Call_back_later_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'SWITCH_OFF' THEN 1 END) AS Switch_off_count,\r\n"
+ " COUNT(CASE WHEN up.field_14 = 'WRONG_NUMBER' THEN 1 END) AS Wrong_number_count\r\n"
+ "FROM gcc_1913_campaign.agent_assign aa\r\n"
+ "JOIN gcc_1913_qaqc.agents_list al ON al.agent_id = aa.agent_id\r\n"
+ "JOIN gcc_1913_campaign.upload_data up ON up.agent_id = al.agent_id AND up.campaign_id = ?\r\n"
+ "WHERE aa.campaign_id = ? AND aa.isactive = '1'\r\n"
+ "GROUP BY aa.campaign_id,al.agent_id, al.agent_name";
return jdbcTemplate.queryForList(sqlQuery,campaign_id,campaign_id);
}
public List<Map<String, Object>> viewcompletedby(int campaign_id, int agent_id) {
String sqlQuery ="SELECT \r\n"
+ "up.data_id as data_id,up.field_1 as id, up.field_2 as name, up.field_3 as address,field_5 as cellnumber, field_14 as call_status, \r\n"
+ "count(cl.data_id) as call_count,updated_date as updated_date,field_15 as remarks\r\n"
+ "FROM gcc_1913_campaign.agent_assign aa\r\n"
+ "JOIN gcc_1913_campaign.upload_data up ON up.agent_id = aa.agent_id AND up.campaign_id = ?\r\n"
+ "JOIN gcc_1913_campaign.call_logs cl ON cl.data_id=up.data_id\r\n"
+ "WHERE aa.campaign_id = ? AND aa.isactive = '1' AND aa.agent_id=? AND up.field_14 IS NOT NULL\r\n"
+ "group by up.data_id,up.field_1, up.field_2";
return jdbcTemplate.queryForList(sqlQuery,campaign_id,campaign_id,agent_id);
}
public String getExcelUrlByCampaignId(int lastId) {
String sqlQuery = "SELECT excel_url FROM gcc_1913_campaign.campaign_request WHERE campaign_id = ?";
return jdbcTemplate.queryForObject(sqlQuery, String.class, lastId);
}
public void saveUploadData(String category, int campaignId, Map<String, Object> rowData, List<String> expectedHeaders) {
int fieldCount = rowData.size();
List<String> columnNames = new ArrayList<>();
for (int i = 1; i <= fieldCount; i++) {
columnNames.add("field_" + i);
}
String columnNamesString = String.join(", ", columnNames);
//String placeholders = columnNames.stream().map(col -> "?").collect(Collectors.joining(", "));
StringBuilder placeholdersBuilder = new StringBuilder();
for (int i = 0; i < columnNames.size(); i++) {
if (i > 0) {
placeholdersBuilder.append(", ");
}
placeholdersBuilder.append("?");
}
String placeholders = placeholdersBuilder.toString();
String sql = "INSERT INTO gcc_1913_campaign.upload_data (category_id, campaign_id, " + columnNamesString + ") VALUES (?, ?, " + placeholders + ")";
//System.out.println("SQL Query========= " + sql);
List<Object> values = new ArrayList<>();
values.add(category);
values.add(campaignId);
// Ensure rowData values are ordered based on expected headers
for (String header : expectedHeaders) {
values.add(rowData.getOrDefault(header, "")); // Ensures the correct mapping
}
final Logger logger = LoggerFactory.getLogger(CampaignService.class);
try {
jdbcTemplate.update(sql, values.toArray());
} catch (Exception e) {
logger.error("Error inserting upload data for campaign {}: {}", campaignId, e.getMessage());
}
}
// public void saveUploadData(String category, int campaignId, Map<String, Object> rowData) {
// // Get total number of fields in the row
// int fieldCount = rowData.size();
//
// // Generate dynamic column names as field_1, field_2, ..., field_N
// List<String> columnNames = new ArrayList<>();
// for (int i = 1; i <= fieldCount; i++) {
// columnNames.add("field_" + i);
// }
//
// // Build dynamic SQL query
// String columnNamesString = String.join(", ", columnNames);
// String placeholders = columnNames.stream().map(col -> "?").collect(Collectors.joining(", "));
//
// String sql = "INSERT INTO upload_data (category_id, campaign_id, " + columnNamesString + ") VALUES (?, ?, " + placeholders + ")";
//
// System.out.println("SQL Query========= " + sql);
//
// // Prepare values list
// List<Object> values = new ArrayList<>();
// values.add(category);
// values.add(campaignId);
// values.addAll(rowData.values()); // Add row data values dynamically
//
//
//
// final Logger logger = LoggerFactory.getLogger(CampaignService.class);
// try {
// jdbcTemplate.update(sql, values.toArray());
// } catch (Exception e) {
// logger.error("Error inserting upload data for campaign {}: {}", campaignId, e.getMessage());
// }
// }
//Agent List
public List<Map<String, Object>> getAllAgents() {
String sql = "SELECT agent_id, agent_name FROM gcc_1913_qaqc.agents_list WHERE calling_type = 'OUTBOUND' AND isactive = '1'";
return jdbcTemplate.queryForList(sql);
}
//count based on total, completed and pending
public Map<String, Object> getCampaignStatistics(int campaignId) {
Map<String, Object> result = new HashMap<>();
// Total Count
String totalQuery = "SELECT COUNT(*) AS total FROM gcc_1913_campaign.upload_data WHERE campaign_id = ?";
int totalCount = jdbcTemplate.queryForObject(totalQuery, Integer.class, campaignId);
result.put("totalCount", totalCount);
// Completed Count (agent_id is not null and call_status is null)
String completedQuery = "SELECT COUNT(*) AS completed FROM gcc_1913_campaign.upload_data ud\r\n"
+ "JOIN gcc_1913_campaign.campaign_request cr ON ud.campaign_id = cr.campaign_id\r\n"
+ "WHERE ud.campaign_id = ? AND cr.campaign_status = 'ONGOING' AND ud.agent_id IS NOT NULL AND\r\n"
+ "( ud.call_status NOT IN ('CALL BACK LATER','UNATTENDED'))";
int completedCount = jdbcTemplate.queryForObject(completedQuery, Integer.class, campaignId);
result.put("completedCount", completedCount);
// Pending Count (agent_id is not null and call_status is not null)
String pendingQuery = "SELECT COUNT(*) AS pending FROM gcc_1913_campaign.upload_data ud\r\n"
+ "JOIN gcc_1913_campaign.campaign_request cr ON ud.campaign_id = cr.campaign_id\r\n"
+ "WHERE ud.campaign_id = ? AND ud.agent_id IS NOT NULL \r\n"
+ "AND (ud.call_status IS NULL OR ud.call_status IN ('CALL BACK LATER','UNATTENDED'))";
int pendingCount = jdbcTemplate.queryForObject(pendingQuery, Integer.class, campaignId);
result.put("pendingCount", pendingCount);
return result;
}
public List<Map<String, Object>> getCampaignDetailsById(Long campaign_id) {
String sql = "SELECT \r\n"
+ " cr.campaign_id, \r\n"
+ " cr.campaign_name, \r\n"
+ " cr.category_id, \r\n"
+ " cr.start_date, \r\n"
+ " cr.end_date, \r\n"
+ " cr.calls_per_agent, \r\n"
+ " cr.description, \r\n"
+ " cr.created_date, \r\n"
+ " cr.excel_url, \r\n"
+ " cr.isactive, \r\n"
+ " cr.isdelete, \r\n"
+ " cr.campaign_status, \r\n"
+ " cq.question_id, \r\n"
+ " cq.questions, \r\n"
+ " cq.answer_type_id, \r\n"
+ " at.type_name, \r\n"
+ " ca.id AS answer_id, \r\n"
+ " ca.campaign_answer\r\n"
+ "FROM gcc_1913_campaign.campaign_request cr\r\n"
+ "JOIN gcc_1913_campaign.campaign_questions cq \r\n"
+ " ON cr.campaign_id = cq.campaign_id\r\n"
+ "LEFT JOIN gcc_1913_campaign.answer_type at\r\n"
+ " ON cq.answer_type_id = at.answer_type_id \r\n"
+ "LEFT JOIN gcc_1913_campaign.campaign_answers ca\r\n"
+ " ON cq.question_id = ca.question_id\r\n"
+ "WHERE cr.campaign_id = ?";
List<Map<String, Object>> results = jdbcTemplate.queryForList(sql, campaign_id);
// Group answers by question_id
Map<Long, Map<String, Object>> groupedData = new LinkedHashMap();
for (Map<String, Object> row : results) {
Object questionIdObj = row.get("question_id");
Long questionId = null;
// Convert Integer to Long if needed
if (questionIdObj instanceof Integer) {
questionId = ((Integer) questionIdObj).longValue();
} else if (questionIdObj instanceof Long) {
questionId = (Long) questionIdObj;
}
if (questionId == null) continue;
if (!groupedData.containsKey(questionId)) {
// Ensure `campaign_answer` is initialized correctly
List<String> answers = new ArrayList<>();
if (row.get("campaign_answer") != null) {
answers.add(row.get("campaign_answer").toString());
}
row.put("campaign_answer", answers);
groupedData.put(questionId, row);
} else {
// Append the answer to the existing question
List<String> answers = (List<String>) groupedData.get(questionId).get("campaign_answer");
if (row.get("campaign_answer") != null) {
answers.add(row.get("campaign_answer").toString());
}
}
}
return new ArrayList<>(groupedData.values());
}
//question and answers counts with percentage in report page method
public List<Map<String, Object>> getQuestionAnswers(int campaignId) {
String sql = "SELECT cq.question_id, cq.questions, ca.campaign_answer, " +
"COUNT(qa.campaign_answer) AS answer_count, " +
"FLOOR(IFNULL((COUNT(qa.campaign_answer) / " +
"(SELECT COUNT(*) FROM gcc_1913_campaign.upload_data " +
"WHERE campaign_id = cq.campaign_id AND call_status = 'INFORMATION GIVEN') * 100), 0)) AS answer_percentage " +
"FROM campaign_questions cq " +
"JOIN campaign_answers ca ON cq.question_id = ca.question_id AND cq.campaign_id = ca.campaign_id " +
"LEFT JOIN questions_answers qa ON cq.question_id = qa.question_id AND ca.campaign_answer = qa.campaign_answer AND cq.campaign_id = qa.campaign_id " +
"WHERE cq.campaign_id = ? AND cq.isactive = 1 AND cq.isdelete = 0 " +
"GROUP BY cq.question_id, cq.questions, ca.campaign_answer " +
"ORDER BY cq.question_id;";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, campaignId);
Map<Integer, Map<String, Object>> responseMap = new LinkedHashMap<>();
for (Map<String, Object> row : result) {
int questionId = (int) row.get("question_id");
if (!responseMap.containsKey(questionId)) {
Map<String, Object> questionData = new HashMap<>();
questionData.put("question_id", questionId);
questionData.put("questions", row.get("questions"));
questionData.put("answers", new ArrayList<>());
responseMap.put(questionId, questionData);
}
Map<String, Object> answerData = new HashMap<>();
answerData.put("campaign_answer", row.get("campaign_answer"));
answerData.put("answer_count", row.get("answer_count"));
answerData.put("answer_percentage", row.get("answer_percentage"));
((List<Map<String, Object>>) responseMap.get(questionId).get("answers")).add(answerData);
}
return new ArrayList<>(responseMap.values());
}
//////////////dizo//////////////
public int closeCampaign(int campaignId) {
String sql = "UPDATE gcc_1913_campaign.campaign_request SET campaign_status = 'CLOSED' WHERE campaign_id = ?";
int rowsAffected = jdbcTemplate.update(sql, campaignId);
if (rowsAffected == 0) {
System.out.println("Failed to update. Check if campaignId exists: " + campaignId);
} else {
System.out.println("Campaign ID " + campaignId + " successfully updated to CLOSED.");
}
return rowsAffected;
}
public int autoCloseExpiredCampaigns() {
String sql = "UPDATE gcc_1913_campaign.campaign_request " +
"SET campaign_status = 'CLOSED' " +
"WHERE campaign_status = 'ONGOING' AND end_date < CURRENT_DATE";
int rowsAffected = jdbcTemplate.update(sql);
if (rowsAffected == 0) {
System.out.println("No expired campaigns found to close.");
} else {
System.out.println(rowsAffected + " campaigns successfully updated to CLOSED.");
}
return rowsAffected;
}
// Scheduled job to run daily at midnight
/*
* @Scheduled(cron = "0 0 0 * * ?") public void scheduledAutoClose() {
* System.out.println("Running scheduled auto-close for expired campaigns...");
* autoCloseExpiredCampaigns(); }
*/
}

40
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenter/service/WhatsappMsgService.java

@ -0,0 +1,40 @@
package in.gov.chennaicorporation.gccoffice.callcenter.service;
import java.net.HttpURLConnection;
import java.net.URL;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class WhatsappMsgService {
public String sendMsg(String msgUrl) {
String response ="";
try{
HttpURLConnection connection =null;
URL url = new URL(msgUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response=responseCode+"";
System.out.println("Response Code: " + responseCode);
}catch (Exception e){
e.printStackTrace();
}
return response;
}
public String sendSMS(String SMS_Url) {
RestTemplate restTemplate = new RestTemplate();
String response =restTemplate.getForObject(SMS_Url,String.class);
return response;
}
}

BIN
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/.DS_Store

36
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/AttendanceApiController.java

@ -0,0 +1,36 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@RequestMapping("/gcc/api/callenter/attendance")
@RestController
public class AttendanceApiController {
private AppConfig appConfig;
private final RestTemplate restTemplate;
@Autowired
public AttendanceApiController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@GetMapping("/getAttendancedetails")
public String getAttendancedetails(@RequestParam String fromDate,@RequestParam String toDate){
String apiUrl = appConfig.attendanceReport + "/callcenter/api/attendance/getattendancereport"+"?fromDate="+ fromDate + "&toDate="+ toDate;
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
return responseEntity.getBody();
}
}

71
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/AttendanceMainController.java

@ -0,0 +1,71 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.client.RestTemplate;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/callcenterattendance")
@Controller("callCenterAttendanceController")
public class AttendanceMainController {
@Autowired
private AppConfig appConfig;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/attendancereport")
public String AttendanceList(
@RequestParam(required = false) String fromDate,
@RequestParam(required = false) String toDate,
Model model) {
List<Map<String, Object>> attendanceData = Collections.emptyList();
if (fromDate != null && !fromDate.isEmpty() && toDate != null && !toDate.isEmpty()) {
String apiUrl = appConfig.attendanceReport + "/callcenter/api/attendance/getattendancereport?fromDate=" + fromDate + "&toDate=" + toDate;
try {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
String responseBody = responseEntity.getBody();
if (responseBody != null && !responseBody.isEmpty()) {
ObjectMapper objectMapper = new ObjectMapper();
if (responseBody.trim().startsWith("{")) {
// Single object response
Map<String, Object> singleData = objectMapper.readValue(responseBody, new TypeReference<>() {});
attendanceData = List.of(singleData);
} else {
// Array response
attendanceData = objectMapper.readValue(responseBody, new TypeReference<>() {});
}
}
} catch (Exception e) {
System.err.println("Error fetching attendance data: " + e.getMessage());
}
}
model.addAttribute("attendanceData", attendanceData);
model.addAttribute("fromDate", fromDate);
model.addAttribute("toDate", toDate);
model.addAttribute("LoginUserId", LoginUserInfo.getLoginUserId());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
return "modules/callcenter/attendancereport";
}
}

672
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ComplaintController.java

@ -0,0 +1,672 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.ComplaintService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import org.springframework.http.*;
import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import org.springframework.web.multipart.MultipartFile;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.Base64;
@CrossOrigin
@RestController
@RequestMapping("gcc/api/callcenterqaqc/pgrcomplaint")
public class ComplaintController {
private final RestTemplate restTemplate;
public ComplaintController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Autowired
private ComplaintService complaintService;
@GetMapping("/getComplaintCategories")
public @ResponseBody String getComplaintCategories() {
return complaintService.fetchComplaintCategories();
}
@GetMapping("/getComplaintSubTypes")
public @ResponseBody String getComplaintSubTypes(@RequestParam String groupId) {
return complaintService.fetchComplaintSubTypes(groupId);
}
@GetMapping("/getComplaintDetailsbyId")
public List<Map<String, Object>> getComplaintDetailsById(@RequestParam String complaintid) {
return complaintService.fetchComplaintDetailsById(complaintid);
}
@GetMapping("/getComplaintDetailsByMobile")
public List<Map<String, Object>> getComplaintDetailsByMobile(@RequestParam String mobileNo) {
return complaintService.fetchComplaintDetailsByMobile(mobileNo);
}
@PostMapping("/register")
public ResponseEntity<?> registerComplaint(
@RequestParam(value = "ComplainantName", required = false) String complainantName,
@RequestParam(value = "ComplainantAddr", required = false) String complainantAddr,
@RequestParam(value = "MobileNo", required = false) String mobileNo,
@RequestParam(value = "Email", required = false) String email,
@RequestParam(value = "ComplaintType", required = false) String complaintType,
@RequestParam(value = "ComplaintTitle", required = false) String complaintTitle,
@RequestParam(value = "ComplaintDetails", required = false) String complaintDetails,
@RequestParam(value = "StreetId", required = false) String streetId,
@RequestParam(value = "Comp_Image", required = false) String compImage,
@RequestParam(value = "latitude", required = false) String latitude,
@RequestParam(value = "longtitude", required = false) String longtitude,
@RequestParam(value = "Landmark", required = false) String landmark,
@RequestParam(value = "gender", required = false) String gender) {
String externalUrl = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice";
try {
// Create the URL object
URL url = new URL(externalUrl);
// Create the HttpURLConnection object
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setDoOutput(true);
// Create the parameters string, handling null values
String params = "serviceId=RegComplaint" + "&ComplainantName="
+ URLEncoder.encode(complainantName != null ? complainantName : "", "UTF-8") + "&ComplainantAddr="
+ URLEncoder.encode(complainantAddr != null ? complainantAddr : "", "UTF-8") + "&MobileNo="
+ URLEncoder.encode(mobileNo != null ? mobileNo : "", "UTF-8") + "&Email="
+ URLEncoder.encode(email != null ? email : "", "UTF-8") + "&ComplaintType="
+ URLEncoder.encode(complaintType != null ? complaintType : "", "UTF-8") + "&ComplaintTitle="
+ URLEncoder.encode(complaintTitle != null ? complaintTitle : "", "UTF-8") + "&ComplaintDetails="
+ URLEncoder.encode(complaintDetails != null ? complaintDetails : "", "UTF-8") + "&StreetId="
+ URLEncoder.encode(streetId != null ? streetId : "", "UTF-8") + "&Comp_Image="
+ URLEncoder.encode(compImage != null ? compImage : "", "UTF-8") + "&latitude="
+ URLEncoder.encode(latitude != null ? latitude : "", "UTF-8") + "&longtitude="
+ URLEncoder.encode(longtitude != null ? longtitude : "", "UTF-8") + "&Landmark="
+ URLEncoder.encode(landmark != null ? landmark : "", "UTF-8") + "&gender="
+ URLEncoder.encode(gender != null ? gender : "", "UTF-8") + "&compmode=2";
// Write parameters to request body
try (OutputStream os = conn.getOutputStream()) {
byte[] input = params.getBytes("UTF-8");
os.write(input, 0, input.length);
}
// Read the response
int responseCode = conn.getResponseCode();
BufferedReader reader;
if (responseCode == HttpURLConnection.HTTP_OK) {
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
reader = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
// Return the response from the external API
//return ResponseEntity.status(responseCode).body(response.toString());
ObjectMapper mapper = new ObjectMapper();
Map<String, String> responseMap = mapper.readValue(response.toString(), Map.class);
String complaintNo = responseMap.getOrDefault("Complaint Number", "N/A");
//System.out.println("complaintNo===="+complaintNo);
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(Map.of("complaintNumber", complaintNo));
} catch (IOException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("An error occurred while processing the request.");
}
}
@PostMapping("/updateComplaint")
public ResponseEntity<String> updateComplaint(@RequestParam("ComplaintId") String complaintId,
@RequestParam(value = "Message", required = false) String message,
@RequestParam(value = "Status") String status,
@RequestPart(value = "Comp_Image", required = false) MultipartFile compImage) {
String userType = "Public";
//System.out.println("message:-" + message + "\n UserType:-" + userType + "\n Status:-" + status);
//System.out.println(compImage == null);
String externalUrl = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice";
try {
// Convert and compress the image to base64 if provided
String base64Image = null;
if (compImage != null && !compImage.isEmpty()) {
base64Image = compressAndEncodeToBase64(compImage);
//System.out.println("imageee" + base64Image);
}
// Construct the POST body with parameters
String params = "serviceId=UpdateComplaint" + "&ComplaintId="
+ URLEncoder.encode(complaintId != null ? complaintId : "", "UTF-8") + "&Message="
+ URLEncoder.encode(message != null ? message : "", "UTF-8") + "&UserType="
+ URLEncoder.encode(userType, "UTF-8") + "&Status="
+ URLEncoder.encode(status != null ? status : "", "UTF-8") + "&Comp_Image="
+ URLEncoder.encode(compImage != null ? base64Image : "", "UTF-8")
+ "&Token=718333469976265947044293";
// Open connection and send POST request
URL url = new URL(externalUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// Send parameters
OutputStream os = conn.getOutputStream();
os.write(params.getBytes());
os.flush();
os.close();
// Handle the response
int responseCode = conn.getResponseCode();
BufferedReader reader;
if (responseCode == HttpURLConnection.HTTP_OK) {
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
reader = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
return ResponseEntity.status(responseCode).body(response.toString());
} catch (IOException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("An error occurred while processing the request.");
}
}
private String compressAndEncodeToBase64(MultipartFile file) throws IOException {
// Convert MultipartFile to BufferedImage
BufferedImage originalImage = ImageIO.read(file.getInputStream());
// Resize/Compress the image
int targetWidth = 800; // You can adjust the width as needed
int targetHeight = (int) (originalImage.getHeight() * (800.0 / originalImage.getWidth())); // Preserve aspect
// ratio
BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, targetWidth, targetHeight, null);
g.dispose();
// Compress the image by writing it to a ByteArrayOutputStream in JPEG format
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(resizedImage, "jpg", baos); // You can change the format to "png" or "jpg"
byte[] compressedBytes = baos.toByteArray();
// Convert the compressed image to base64
return Base64.getEncoder().encodeToString(compressedBytes);
}
////////////////////////////////////// PGR Check //////////////////////////////////////////
@GetMapping("/checktypeforduplicate")
public ResponseEntity<?> getComplaintMatch(
@RequestParam("mobileNo") String mobileNo,
@RequestParam("complaintId") String complaintId,
@RequestParam("streetName") String streetName
) {
try {
// 1. Map complaintId to complaint title
Map<String, String> complaintIdToTitle = new HashMap<>();
complaintIdToTitle.put("97", "Removal of Garbage");
complaintIdToTitle.put("98", "Overflowing of Garbage Bin");
complaintIdToTitle.put("99", "Removal of Debris");
complaintIdToTitle.put("100", "Absenteeism of Sweepers");
complaintIdToTitle.put("101", "Absenteeism of Door to door garbage Collector");
complaintIdToTitle.put("102", "Improper Sweeping");
complaintIdToTitle.put("103", "Provison of Garbage Bin");
complaintIdToTitle.put("104", "Broken Bin");
complaintIdToTitle.put("105", "Shifting of Garbage Bin");
complaintIdToTitle.put("106", "Cleaning of Water Table");
complaintIdToTitle.put("107", "Nuisance by Garbage Tractor/Truck");
complaintIdToTitle.put("108", "Burning of Garbage");
complaintIdToTitle.put("109", "Garbage Lorry without Net");
complaintIdToTitle.put("110", "Spilling of Garbage from Lorry");
complaintIdToTitle.put("111", "Burning of Garbage at Dumping Ground");
complaintIdToTitle.put("112", "Pot hole fill up / Repairs to the damaged surface");
complaintIdToTitle.put("113", "Relaying of Road");
complaintIdToTitle.put("114", "Formation of New Road");
complaintIdToTitle.put("115", "Repairs to existing Footpath");
complaintIdToTitle.put("116", "Request to provide Footpath");
complaintIdToTitle.put("117", "Removal of Shops in the Footpath");
complaintIdToTitle.put("118", "Mosquito Menace");
complaintIdToTitle.put("119", "Street Dogs");
complaintIdToTitle.put("120", "Stray Cattle");
complaintIdToTitle.put("121", "Stray Pigs");
complaintIdToTitle.put("122", "Death of Stray Animals");
complaintIdToTitle.put("123", "Public Health / Dengue / Malaria / Gastro Enteritis");
complaintIdToTitle.put("124", "Transfer Station Smell");
complaintIdToTitle.put("125", "Flies Menace from Dumping Ground");
complaintIdToTitle.put("126", "Open Defecation");
complaintIdToTitle.put("127", "Illegal Draining of Sewage to SWD / Open Site");
complaintIdToTitle.put("128", "Complaints regarding unhygenic Restaurants");
complaintIdToTitle.put("129", "Complaints regarding quality of food in hotels");
complaintIdToTitle.put("130", "Road Side Eateries");
complaintIdToTitle.put("131", "Slaughter House related complaints");
complaintIdToTitle.put("132", "Unauthorized Sale of Meat and Meat products");
complaintIdToTitle.put("133", "Illegal Slaughtering");
complaintIdToTitle.put("134", "Unhygenic and Improper Transport of Meat and Livestock");
complaintIdToTitle.put("135", "Biomedical waste / Health hazard waste removal");
complaintIdToTitle.put("136", "Complaints regarding Corporation Hospitals");
complaintIdToTitle.put("137", "Complaints regarding CDH");
complaintIdToTitle.put("138", "Stagnation of Water");
complaintIdToTitle.put("139", "Obstruction of Water Flow");
complaintIdToTitle.put("140", "Desilting of Drain");
complaintIdToTitle.put("141", "Desilting of Canal");
complaintIdToTitle.put("142", "Repairs to Storm Water Drain");
complaintIdToTitle.put("143", "Covering Manholes of Storm Water Drain");
complaintIdToTitle.put("144", "New Drain Construction");
complaintIdToTitle.put("145", "Disposal of Removed Silt on the Road");
complaintIdToTitle.put("146", "Non burning of Street lights");
complaintIdToTitle.put("147", "Electric shock due to street light");
complaintIdToTitle.put("148", "Damage to the Electric pole");
complaintIdToTitle.put("149", "New Street lights");
complaintIdToTitle.put("150", "Shifting of Street light pole");
complaintIdToTitle.put("151", "Overhead cable wires running in a haphazard manner");
complaintIdToTitle.put("152", "Removal of Fallen Trees");
complaintIdToTitle.put("153", "Complaints regarding Park");
complaintIdToTitle.put("154", "Complaints regarding Playground");
complaintIdToTitle.put("155", "Complaints regarding Centre Median");
complaintIdToTitle.put("156", "Complaints regarding Traffic Island");
complaintIdToTitle.put("157", "Unauthorized Tree Cutting");
complaintIdToTitle.put("158", "Obstruction of Trees");
complaintIdToTitle.put("159", "Complaints regarding Public Toilets");
complaintIdToTitle.put("160", "Complaints regarding Free Usage of Public Toilets");
complaintIdToTitle.put("161", "Complaints regarding Cleanliness of Toilets in Theatre");
complaintIdToTitle.put("162", "Complaints regarding Cleanliness of Toilets in Shopping Complex");
complaintIdToTitle.put("163", "Building Plan Sanction");
complaintIdToTitle.put("164", "Violation of DCR/Building By laws");
complaintIdToTitle.put("165", "Unauthorized / Illegal Construction");
complaintIdToTitle.put("166", "Complaints related to Property Tax");
complaintIdToTitle.put("167", "Complaints related to Professional Tax");
complaintIdToTitle.put("168", "Complaints related to Trade Licence");
complaintIdToTitle.put("174", "Name Error (Spelling Related)");
complaintIdToTitle.put("175", "Change of Address in Electoral Roll");
complaintIdToTitle.put("176", "Issue of Voter ID");
complaintIdToTitle.put("177", "Inclusion, Deletion, Correction in Voter List");
complaintIdToTitle.put("178", "Complaints regarding Voter List");
complaintIdToTitle.put("179", "Name not found in the Electoral Roll");
complaintIdToTitle.put("180", "Issue of Birth and Death Certificate");
complaintIdToTitle.put("181", "Encroachment on the Public Property");
complaintIdToTitle.put("182", " Complaints related to Schools");
complaintIdToTitle.put("183", "Sanction of Financial Assistance under Moovalaur Thirumana Thittam");
complaintIdToTitle.put("184", "Complaints related to issue of all types of Registration Certificate");
complaintIdToTitle.put("185", "Slow Progress of Work");
complaintIdToTitle.put("186", "Poor Quality of Work");
complaintIdToTitle.put("187", "Unauthorized Advertisement Boards");
complaintIdToTitle.put("188", "Complaints regarding Bridges / Flyovers / Subways");
complaintIdToTitle.put("189", "Complaints related Shopping Complex");
complaintIdToTitle.put("190", "Complaints regarding Community Hall");
complaintIdToTitle.put("191", "Complaints regarding Burial Ground");
complaintIdToTitle.put("192", "Complaints regarding any other CoC building");
complaintIdToTitle.put("193", "Parking Issue");
complaintIdToTitle.put("195", "Complaints Regarding Plastics");
complaintIdToTitle.put("196", "No electricity in public toilet");
complaintIdToTitle.put("197", "No water supply in public toilet");
complaintIdToTitle.put("198", "Public toilet blockage");
complaintIdToTitle.put("199", "Public toilet cleaning");
complaintIdToTitle.put("200", "Burning of street light in daytime");
complaintIdToTitle.put("201", "Illegal Parking on foot path");
complaintIdToTitle.put("202", "Complaints regarding non availability of Doctors");
complaintIdToTitle.put("203", "Complaints regarding non availability of medicines");
complaintIdToTitle.put("204", "Complaints regarding laboratory issues");
complaintIdToTitle.put("205", "Issues regarding amma baby care kits (After Delivery)");
complaintIdToTitle.put("206", "Issues regarding Amma nutrition kit for pregnant woman");
complaintIdToTitle.put("207", "Issues regarding Muthulakshmi Reddy Maternity Benefit Scheme (MRMBS)");
complaintIdToTitle.put("208", "Issues regarding janani suraksha yojana scheme (JSY)");
complaintIdToTitle.put("209", "Travel pass related complaints");
complaintIdToTitle.put("210", "Food related complaints");
complaintIdToTitle.put("212", "Covid Health Related Queries");
complaintIdToTitle.put("213", "Hospital and Covid care centre(CCC) Related Queries");
complaintIdToTitle.put("214", "Medical Emergencies");
complaintIdToTitle.put("215", "Essentials and Medicines");
complaintIdToTitle.put("216", "PSYCHO-SOCIO support");
complaintIdToTitle.put("218", "Quarantine and isolation Related Queries");
complaintIdToTitle.put("219", "General Health Queries");
complaintIdToTitle.put("220", "Disinfection request");
complaintIdToTitle.put("221", "Non Covid Health Related Queries");
complaintIdToTitle.put("222", "Milling/Scraping of Road before Relaying of Road");
complaintIdToTitle.put("226", "Food Requirement");
complaintIdToTitle.put("227", "Relief Center Requirement");
complaintIdToTitle.put("228", "Covid19 Ambulance Service");
complaintIdToTitle.put("229", "Air Quality");
complaintIdToTitle.put("230", "Online Payment Issue");
complaintIdToTitle.put("231", "General Revision Objection");
complaintIdToTitle.put("232", "Water Mixed with Sewarage");
complaintIdToTitle.put("233", "Sewerage Overflow");
complaintIdToTitle.put("234", "Drinking water supply");
complaintIdToTitle.put("235", "Electricity Shock");
complaintIdToTitle.put("236", "Electricity Unavailability");
complaintIdToTitle.put("237", "Insufficient Barricading");
complaintIdToTitle.put("238", "Fallen poles/towers/hoardings/other infra");
complaintIdToTitle.put("239", "Fallen EB cables");
complaintIdToTitle.put("240", "Project information not provided (Thiruvotriyur High Road)");
complaintIdToTitle.put("241", "Project information not provided (Arunachaleshwar Road)");
complaintIdToTitle.put("242", "Project information not provided (MC Road)");
complaintIdToTitle.put("243", "Project information not provided (Washermenpet Metro)");
complaintIdToTitle.put("244", "Project information not provided (Khadar Nawas Khan Road)");
complaintIdToTitle.put("245", "Project information not provided (Race Course road + Guindy MMI)");
complaintIdToTitle.put("246", "Advance information on consultation not provided (Thiruvotriyur High Road)");
complaintIdToTitle.put("247", "Advance information on consultation not provided (Arunachaleshwar Road)");
complaintIdToTitle.put("248", "Advance information on consultation not provided (MC Road)");
complaintIdToTitle.put("249", "Advance information on consultation not provided (Washermenpet Metro)");
complaintIdToTitle.put("250", "Advance information on consultation not provided (Khadar Nawas Khan Road)");
complaintIdToTitle.put("251", "Advance information on consultation not provided (Race Course road + Guindy MMI)");
complaintIdToTitle.put("252", "Location and area of consultation not provided (Thiruvotriyur High Road)");
complaintIdToTitle.put("253", "Location and area of consultation not provided (Arunachaleshwar Road)");
complaintIdToTitle.put("254", "Location and area of consultation not provided (MC Road)");
complaintIdToTitle.put("255", "Location and area of consultation not provided (Washermenpet Metro)");
complaintIdToTitle.put("256", "Location and area of consultation not provided (Khadar Nawas Khan Road)");
complaintIdToTitle.put("257", "Location and area of consultation not provided (Race Course road + Guindy MMI)");
complaintIdToTitle.put("258", "Information on detailed work plan not provided (Thiruvotriyur High Road)");
complaintIdToTitle.put("259", "Information on detailed work plan not provided (Arunachaleshwar Road)");
complaintIdToTitle.put("260", "Information on detailed work plan not provided (MC Road)");
complaintIdToTitle.put("261", "Information on detailed work plan not provided (Washermenpet Metro)");
complaintIdToTitle.put("262", "Information on detailed work plan not provided (Khadar Nawas Khan Road)");
complaintIdToTitle.put("263", "Information on detailed work plan not provided (Race Course road + Guindy MMI)");
complaintIdToTitle.put("264", "Others (Thiruvotriyur High Road)");
complaintIdToTitle.put("265", "Others (Arunachaleshwar Road)");
complaintIdToTitle.put("266", "Others (MC Road)");
complaintIdToTitle.put("267", "Others (Washermenpet Metro)");
complaintIdToTitle.put("268", "Others (Khadar Nawas Khan Road)");
complaintIdToTitle.put("269", "Others (Race Course road + Guindy MMI)");
complaintIdToTitle.put("270", "No information in advance provided on the date and time of civil works (Thiruvotriyur High Road)");
complaintIdToTitle.put("271", "No information in advance provided on the date and time of civil works (Arunachaleshwar Road)");
complaintIdToTitle.put("272", "No information in advance provided on the date and time of civil works (MC Road)");
complaintIdToTitle.put("273", "No information in advance provided on the date and time of civil works (Washermenpet Metro)");
complaintIdToTitle.put("274", "No information in advance provided on the date and time of civil works (Khadar Nawas Khan Road)");
complaintIdToTitle.put("275", "No information in advance provided on the date and time of civil works (Race Course road + Guindy MMI)");
complaintIdToTitle.put("276", "No information provided on the nature and schedule of civil work (Thiruvotriyur High Road)");
complaintIdToTitle.put("277", "No information provided on the nature and schedule of civil work (Arunachaleshwar Road)");
complaintIdToTitle.put("278", "No information provided on the nature and schedule of civil work (MC Road)");
complaintIdToTitle.put("279", "No information provided on the nature and schedule of civil work (Washermenpet Metro)");
complaintIdToTitle.put("280", "No information provided on the nature and schedule of civil work (Khadar Nawas Khan Road)");
complaintIdToTitle.put("281", "No information provided on the nature and schedule of civil work (Race Course road + Guindy MMI)");
complaintIdToTitle.put("282", "No consultation carried out with the people affected by the civil works (Thiruvotriyur High Road)");
complaintIdToTitle.put("283", "No consultation carried out with the people affected by the civil works (Arunachaleshwar Road)");
complaintIdToTitle.put("284", "No consultation carried out with the people affected by the civil works (MC Road)");
complaintIdToTitle.put("285", "No consultation carried out with the people affected by the civil works (Washermenpet Metro)");
complaintIdToTitle.put("286", "No consultation carried out with the people affected by the civil works (Khadar Nawas Khan Road)");
complaintIdToTitle.put("287", "No consultation carried out with the people affected by the civil works (Race Course road + Guindy MMI)");
complaintIdToTitle.put("288", "No arrangement made for temporary displacement (Thiruvotriyur High Road)");
complaintIdToTitle.put("289", "No arrangement made for temporary displacement (Arunachaleshwar Road)");
complaintIdToTitle.put("290", "No arrangement made for temporary displacement (MC Road)");
complaintIdToTitle.put("291", "No arrangement made for temporary displacement (Washermenpet Metro)");
complaintIdToTitle.put("292", "No arrangement made for temporary displacement (Khadar Nawas Khan Road)");
complaintIdToTitle.put("293", "No arrangement made for temporary displacement (Race Course road + Guindy MMI)");
complaintIdToTitle.put("294", "No display board on the project installed at work site (Thiruvotriyur High Road)");
complaintIdToTitle.put("295", "No display board on the project installed at work site (Arunachaleshwar Road)");
complaintIdToTitle.put("296", "No display board on the project installed at work site (MC Road)");
complaintIdToTitle.put("297", "No display board on the project installed at work site (Washermenpet Metro)");
complaintIdToTitle.put("298", "No display board on the project installed at work site (Khadar Nawas Khan Road)");
complaintIdToTitle.put("299", "No display board on the project installed at work site (Race Course road + Guindy MMI)");
complaintIdToTitle.put("300", "Temporary access to structures not provided and or not adequate (Thiruvotriyur High Road)");
complaintIdToTitle.put("301", "Temporary access to structures not provided and or not adequate (Arunachaleshwar Road)");
complaintIdToTitle.put("302", "Temporary access to structures not provided and or not adequate (MC Road)");
complaintIdToTitle.put("303", "Temporary access to structures not provided and or not adequate (Washermenpet Metro)");
complaintIdToTitle.put("304", "Temporary access to structures not provided and or not adequate (Khadar Nawas Khan Road)");
complaintIdToTitle.put("305", "Temporary access to structures not provided and or not adequate (Race Course road + Guindy MMI)");
complaintIdToTitle.put("306", "No safety measures taken at worksite (Thiruvotriyur High Road)");
complaintIdToTitle.put("307", "No safety measures taken at worksite (Arunachaleshwar Road)");
complaintIdToTitle.put("308", "No safety measures taken at worksite (MC Road)");
complaintIdToTitle.put("309", "No safety measures taken at worksite (Washermenpet Metro)");
complaintIdToTitle.put("310", "No safety measures taken at worksite (Khadar Nawas Khan Road)");
complaintIdToTitle.put("311", "No safety measures taken at worksite (Race Course road + Guindy MMI)");
complaintIdToTitle.put("312", "Water supply disrupted and alternate arrangement not provided (Thiruvotriyur High Road)");
complaintIdToTitle.put("313", "Water supply disrupted and alternate arrangement not provided (Arunachaleshwar Road)");
complaintIdToTitle.put("314", "Water supply disrupted and alternate arrangement not provided (MC Road)");
complaintIdToTitle.put("315", "Water supply disrupted and alternate arrangement not provided (Washermenpet Metro)");
complaintIdToTitle.put("316", "Water supply disrupted and alternate arrangement not provided (Khadar Nawas Khan Road)");
complaintIdToTitle.put("317", "Water supply disrupted and alternate arrangement not provided (Race Course road + Guindy MMI)");
complaintIdToTitle.put("318", "Electricity supply disrupted and alternate arrangement not provided (Thiruvotriyur High Road)");
complaintIdToTitle.put("319", "Electricity supply disrupted and alternate arrangement not provided (Arunachaleshwar Road)");
complaintIdToTitle.put("320", "Electricity supply disrupted and alternate arrangement not provided (MC Road)");
complaintIdToTitle.put("321", "Electricity supply disrupted and alternate arrangement not provided (Washermenpet Metro)");
complaintIdToTitle.put("322", "Electricity supply disrupted and alternate arrangement not provided (Khadar Nawas Khan Road)");
complaintIdToTitle.put("323", "Electricity supply disrupted and alternate arrangement not provided (Race Course road + Guindy MMI)");
complaintIdToTitle.put("324", "Disposal of debris not appropriately managed (Thiruvotriyur High Road)");
complaintIdToTitle.put("325", "Disposal of debris not appropriately managed (Arunachaleshwar Road)");
complaintIdToTitle.put("326", "Disposal of debris not appropriately managed (MC Road)");
complaintIdToTitle.put("327", "Disposal of debris not appropriately managed (Washermenpet Metro)");
complaintIdToTitle.put("328", "Disposal of debris not appropriately managed (Khadar Nawas Khan Road)");
complaintIdToTitle.put("329", "Disposal of debris not appropriately managed (Race Course road + Guindy MMI)");
complaintIdToTitle.put("330", " Temporary arrangement for parking not provided (Thiruvotriyur High Road)");
complaintIdToTitle.put("331", " Temporary arrangement for parking not provided (Arunachaleshwar Road)");
complaintIdToTitle.put("332", " Temporary arrangement for parking not provided (MC Road)");
complaintIdToTitle.put("333", " Temporary arrangement for parking not provided (Washermenpet Metro)");
complaintIdToTitle.put("334", " Temporary arrangement for parking not provided (Khadar Nawas Khan Road)");
complaintIdToTitle.put("335", " Temporary arrangement for parking not provided (Race Course road + Guindy MMI)");
complaintIdToTitle.put("336", "GRM and helpline numbers not displayed at worksite (Thiruvotriyur High Road)");
complaintIdToTitle.put("337", "GRM and helpline numbers not displayed at worksite (Arunachaleshwar Road)");
complaintIdToTitle.put("338", "GRM and helpline numbers not displayed at worksite (MC Road)");
complaintIdToTitle.put("339", "GRM and helpline numbers not displayed at worksite (Washermenpet Metro)");
complaintIdToTitle.put("340", "GRM and helpline numbers not displayed at worksite (Khadar Nawas Khan Road)");
complaintIdToTitle.put("341", "GRM and helpline numbers not displayed at worksite (Race Course road + Guindy MMI)");
complaintIdToTitle.put("342", "Drinking water/ other basic needs for Labour not available at worksite (Thiruvotriyur High Road)");
complaintIdToTitle.put("343", "Drinking water/ other basic needs for Labour not available at worksite (Arunachaleshwar Road)");
complaintIdToTitle.put("344", "Drinking water/ other basic needs for Labour not available at worksite (MC Road)");
complaintIdToTitle.put("345", "Drinking water/ other basic needs for Labour not available at worksite (Washermenpet Metro)");
complaintIdToTitle.put("346", "Drinking water/ other basic needs for Labour not available at worksite (Khadar Nawas Khan Road)");
complaintIdToTitle.put("347", "Drinking water/ other basic needs for Labour not available at worksite (Race Course road + Guindy MMI)");
complaintIdToTitle.put("348", "Noise levels are very high (Thiruvotriyur High Road)");
complaintIdToTitle.put("349", "Noise levels are very high (Arunachaleshwar Road)");
complaintIdToTitle.put("350", "Noise levels are very high (MC Road)");
complaintIdToTitle.put("351", "Noise levels are very high (Washermenpet Metro)");
complaintIdToTitle.put("352", "Noise levels are very high (Khadar Nawas Khan Road)");
complaintIdToTitle.put("353", "Noise levels are very high (Race Course road + Guindy MMI)");
complaintIdToTitle.put("354", " Sprinkling of water at worksite not carried out (Thiruvotriyur High Road)");
complaintIdToTitle.put("355", " Sprinkling of water at worksite not carried out (Arunachaleshwar Road)");
complaintIdToTitle.put("356", " Sprinkling of water at worksite not carried out (MC Road)");
complaintIdToTitle.put("357", " Sprinkling of water at worksite not carried out (Washermenpet Metro)");
complaintIdToTitle.put("358", " Sprinkling of water at worksite not carried out (Khadar Nawas Khan Road)");
complaintIdToTitle.put("359", " Sprinkling of water at worksite not carried out (Race Course road + Guindy MMI)");
complaintIdToTitle.put("360", "The worksite is not barricaded; (Thiruvotriyur High Road)");
complaintIdToTitle.put("361", "The worksite is not barricaded; (Arunachaleshwar Road)");
complaintIdToTitle.put("362", "The worksite is not barricaded; (MC Road)");
complaintIdToTitle.put("363", "The worksite is not barricaded; (Washermenpet Metro)");
complaintIdToTitle.put("364", "The worksite is not barricaded; (Khadar Nawas Khan Road)");
complaintIdToTitle.put("365", "The worksite is not barricaded; (Race Course road + Guindy MMI)");
complaintIdToTitle.put("366", " No information on number of labour working at the site (Thiruvotriyur High Road)");
complaintIdToTitle.put("367", " No information on number of labour working at the site (Arunachaleshwar Road)");
complaintIdToTitle.put("368", " No information on number of labour working at the site (MC Road)");
complaintIdToTitle.put("369", " No information on number of labour working at the site (Washermenpet Metro)");
complaintIdToTitle.put("370", " No information on number of labour working at the site (Khadar Nawas Khan Road)");
complaintIdToTitle.put("371", " No information on number of labour working at the site (Race Course road + Guindy MMI)");
complaintIdToTitle.put("372", "Labourer not using the safety equipment (Thiruvotriyur High Road)");
complaintIdToTitle.put("373", "Labourer not using the safety equipment (Arunachaleshwar Road)");
complaintIdToTitle.put("374", "Labourer not using the safety equipment (MC Road)");
complaintIdToTitle.put("375", "Labourer not using the safety equipment (Washermenpet Metro)");
complaintIdToTitle.put("376", "Labourer not using the safety equipment (Khadar Nawas Khan Road)");
complaintIdToTitle.put("377", "Labourer not using the safety equipment (Race Course road + Guindy MMI)");
complaintIdToTitle.put("378", "Sewerage pipe is damaged (Thiruvotriyur High Road)");
complaintIdToTitle.put("379", "Sewerage pipe is damaged (Arunachaleshwar Road)");
complaintIdToTitle.put("380", "Sewerage pipe is damaged (MC Road)");
complaintIdToTitle.put("381", "Sewerage pipe is damaged (Washermenpet Metro)");
complaintIdToTitle.put("382", "Sewerage pipe is damaged (Khadar Nawas Khan Road)");
complaintIdToTitle.put("383", "Sewerage pipe is damaged (Race Course road + Guindy MMI)");
complaintIdToTitle.put("384", "Others (Thiruvotriyur High Road)");
complaintIdToTitle.put("385", "Others (Arunachaleshwar Road)");
complaintIdToTitle.put("386", "Others (MC Road)");
complaintIdToTitle.put("387", "Others (Washermenpet Metro)");
complaintIdToTitle.put("388", "Others (Khadar Nawas Khan Road)");
complaintIdToTitle.put("389", "Others (Race Course road + Guindy MMI)");
complaintIdToTitle.put("390", "Insufficient Barricading (Thiruvotriyur High Road)");
complaintIdToTitle.put("391", "Insufficient Barricading (Arunachaleshwar Road)");
complaintIdToTitle.put("392", "Insufficient Barricading (MC Road)");
complaintIdToTitle.put("393", "Insufficient Barricading (Washermenpet Metro)");
complaintIdToTitle.put("394", "Insufficient Barricading (Khadar Nawas Khan Road)");
complaintIdToTitle.put("395", "Insufficient Barricading (Race Course road + Guindy MMI)");
complaintIdToTitle.put("396", "Non Removal of Debris (Thiruvotriyur High Road)");
complaintIdToTitle.put("397", "Non Removal of Debris (Arunachaleshwar Road)");
complaintIdToTitle.put("398", "Non Removal of Debris (MC Road)");
complaintIdToTitle.put("399", "Non Removal of Debris (Washermenpet Metro)");
complaintIdToTitle.put("400", "Non Removal of Debris (Khadar Nawas Khan Road)");
complaintIdToTitle.put("401", "Non Removal of Debris (Race Course road + Guindy MMI)");
complaintIdToTitle.put("402", "Potholes fill up (Thiruvotriyur High Road)");
complaintIdToTitle.put("403", "Potholes fill up (Arunachaleshwar Road)");
complaintIdToTitle.put("404", "Potholes fill up (MC Road)");
complaintIdToTitle.put("405", "Potholes fill up (Washermenpet Metro)");
complaintIdToTitle.put("406", "Potholes fill up (Khadar Nawas Khan Road)");
complaintIdToTitle.put("407", "Potholes fill up (Race Course road + Guindy MMI)");
complaintIdToTitle.put("408", "Damage to utilities (TNEB, CMWSSB, BSNL) (Thiruvotriyur High Road)");
complaintIdToTitle.put("409", "Damage to utilities (TNEB, CMWSSB, BSNL) (Arunachaleshwar Road)");
complaintIdToTitle.put("410", "Damage to utilities (TNEB, CMWSSB, BSNL) (MC Road)");
complaintIdToTitle.put("411", "Damage to utilities (TNEB, CMWSSB, BSNL) (Washermenpet Metro)");
complaintIdToTitle.put("412", "Damage to utilities (TNEB, CMWSSB, BSNL) (Khadar Nawas Khan Road)");
complaintIdToTitle.put("413", "Damage to utilities (TNEB, CMWSSB, BSNL) (Race Course road + Guindy MMI)");
complaintIdToTitle.put("414", "Encroaching Public Space (Thiruvotriyur High Road)");
complaintIdToTitle.put("415", "Encroaching Public Space (Arunachaleshwar Road)");
complaintIdToTitle.put("416", "Encroaching Public Space (MC Road)");
complaintIdToTitle.put("417", "Encroaching Public Space (Washermenpet Metro)");
complaintIdToTitle.put("418", "Encroaching Public Space (Khadar Nawas Khan Road)");
complaintIdToTitle.put("419", "Encroaching Public Space (Race Course road + Guindy MMI)");
complaintIdToTitle.put("420", "Need Pathway ramp (Thiruvotriyur High Road)");
complaintIdToTitle.put("421", "Need Pathway ramp (Arunachaleshwar Road)");
complaintIdToTitle.put("422", "Need Pathway ramp (MC Road)");
complaintIdToTitle.put("423", "Need Pathway ramp (Washermenpet Metro)");
complaintIdToTitle.put("424", "Need Pathway ramp (Khadar Nawas Khan Road)");
complaintIdToTitle.put("425", "Need Pathway ramp (Race Course road + Guindy MMI)");
complaintIdToTitle.put("426", "Cleanliness in Parks");
complaintIdToTitle.put("427", "Greenary in Parks");
complaintIdToTitle.put("428", "Play Equipment");
complaintIdToTitle.put("429", "Opening and closing hours");
complaintIdToTitle.put("430", "Toilets in parks");
complaintIdToTitle.put("431", "Non functional lights/ no lights in parks");
complaintIdToTitle.put("432", "Safety in parks/playgrounds");
complaintIdToTitle.put("433", "Women related safety issues in parks");
complaintIdToTitle.put("434", "Availability or cleanliness of dustbins in public toilets");
complaintIdToTitle.put("435", "Cleanliness/ water supply in toilets");
complaintIdToTitle.put("436", "Broken sinks, toilets or urinals and doors");
complaintIdToTitle.put("437", "Request for new toilet");
complaintIdToTitle.put("438", "Illegal activities in toilet");
complaintIdToTitle.put("439", "Toilets not in use/ closed");
complaintIdToTitle.put("440", "Inadequate lighting in and around the toilet");
complaintIdToTitle.put("441", "Safety in public toilets");
complaintIdToTitle.put("442", "Cleanliness in footpath");
complaintIdToTitle.put("443", "Electrical wires/obstruction on footpath");
complaintIdToTitle.put("444", "Unsafe dark spots/ corners");
complaintIdToTitle.put("445", "Public defecation/urination");
complaintIdToTitle.put("446", "Women related safety issues");
complaintIdToTitle.put("447", "Inadequate light in a particular location or spot/ dark spots");
String expectedType;
if (complaintIdToTitle.containsKey(complaintId)) {
expectedType = complaintIdToTitle.get(complaintId).trim().toLowerCase();
} else {
// Fallback: Use sub-type text directly if not found in map (i.e. for "Others")
expectedType = complaintId.trim().toLowerCase();
}
// 2. Date range: last 7 days
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate today = LocalDate.now();
String endDate = today.format(formatter);
String startDate = today.minusDays(7).format(formatter);
int repYear = today.getYear();
// 3. Construct external URL
String externalUrl = String.format(
"https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=getComplaintListWithImg" +
"&From_date=%s&To_date=%s&jsonResp=Yes&UserType=Public&Token=&PageIndex=null&Status=null&repYear=%d&MobileNo=%s",
startDate, endDate, repYear, mobileNo
);
System.out.println("External API URL: " + externalUrl);
// 4. Fetch and parse response
RestTemplate restTemplate = new RestTemplate();
String json = restTemplate.getForObject(externalUrl, String.class);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootArray = mapper.readTree(json);
boolean found = false;
if (rootArray.isArray() && rootArray.size() > 0) {
JsonNode complaintList = rootArray.get(0).path("ComplaintListHistory");
if (complaintList.isArray()) {
for (JsonNode item : complaintList) {
String type = item.path("complainttype").asText("").trim().toLowerCase();
String street = item.path("Street").asText("").trim().toLowerCase();
if (type.equals(expectedType) &&
street.equals(streetName.trim().toLowerCase())) {
found = true;
break;
}
}
}
}
// 5. Return response
Map<String, Object> response = new HashMap<>();
response.put("duplicate", found);
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Collections.singletonMap("error", "Failed to process the request"));
}
}
}

31
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ComplaintStatusMainController.java

@ -0,0 +1,31 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/callcenterqaqccomplaintstatus")
@Controller("callCenterQaQcComplaintStatusController")
public class ComplaintStatusMainController {
@GetMapping("/complaintstatus")
public String viewstatuscheck(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/callcenterqaqc/complaintstatus";
}
}

278
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/DomesticWasteApiController.java

@ -0,0 +1,278 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
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.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.DomesticWasteService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@RestController
@RequestMapping("/gcc/api/domestic_waste")
public class DomesticWasteApiController {
@Autowired
private AppConfig appConfig;
@Autowired
private RestTemplate restTemplate;
@Autowired
private DomesticWasteService domesticWasteService;
@GetMapping("/getitems")
public ResponseEntity<Map<String, Object>> getItemsList() {
String apiUrl = appConfig.domesticurl + "/get-all-masters";
Map<String, Object> responseMap = new HashMap<>();
try {
String response = restTemplate.getForObject(apiUrl, String.class);
responseMap.put("status", "success");
responseMap.put("data", new ObjectMapper().readValue(response, Object.class)); // parse JSON array into list
return ResponseEntity.ok(responseMap);
} catch (HttpClientErrorException | HttpServerErrorException ex) {
responseMap.put("status", "error");
responseMap.put("code", ex.getStatusCode().value());
responseMap.put("message", ex.getStatusText());
responseMap.put("details", ex.getResponseBodyAsString());
return ResponseEntity.status(ex.getStatusCode()).body(responseMap);
} catch (ResourceAccessException ex) {
responseMap.put("status", "error");
responseMap.put("code", HttpStatus.SERVICE_UNAVAILABLE.value());
responseMap.put("message", "Service unavailable");
responseMap.put("details", ex.getMessage());
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(responseMap);
} catch (Exception ex) {
responseMap.put("status", "error");
responseMap.put("code", HttpStatus.INTERNAL_SERVER_ERROR.value());
responseMap.put("message", "Unexpected error");
responseMap.put("details", ex.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseMap);
}
}
@PostMapping("/saverequest")
public ResponseEntity<?> saveRequest(
@RequestParam String user_name,
@RequestParam String mobile,
@RequestParam String address,
@RequestParam String latitude,
@RequestParam String longitude,
@RequestParam String street_name,
@RequestParam String street_id,
@RequestParam String remarks,
@RequestParam("items") String itemsJson,
@RequestParam String userId,@RequestParam String zone,@RequestParam String ward) {
try {
Map<String, Object> result = domesticWasteService.saveMultipleWasteRequests(
user_name, mobile, address,
latitude, longitude,
street_name, street_id, remarks,
itemsJson,userId,zone,ward
);
return ResponseEntity.ok(result);
} catch (Exception e) {
return ResponseEntity.status(500).body(Map.of("status", false, "message", e.getMessage()));
}
}
@GetMapping("/getalldomesticwastelist")
public Map<String, Object> getFilterReports(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate,
@RequestParam(required = false) String mobile,
@RequestParam(required = false) String requestId) {
Map<String, Object> response = new HashMap<>();
try {
System.out.println("startDate="+startDate);
System.out.println("endDate="+endDate);
System.out.println("mobile="+mobile);
System.out.println("requestId="+requestId);
List<Map<String, Object>> details =domesticWasteService.getAllComplaintsList(startDate,endDate,mobile,requestId) ;
System.out.println(details);
if (details == null || details.isEmpty()) {
response.put("status", "nodata");
response.put("message", "No Data");
}
else {
response.put("status", "success");
response.put("details", details);
}
}
catch (Exception e) {
response.put("status", "error");
response.put("message", "An error occurred while fetching data.");
e.printStackTrace();
}
return response;
}
@GetMapping("/checkstatusbymobile")
public Map<String, Object> getStatusByMobileNumber(
@RequestParam(required = false) String mobile) {
Map<String, Object> response = new HashMap<>();
try {
System.out.println("mobile=" + mobile);
// Construct external API URL
String url = appConfig.domesticurl + "/get-user-bymobile?mobile=" + mobile;
// Call the external API
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> apiResponse = restTemplate.getForEntity(url, String.class);
if (apiResponse.getStatusCode().is2xxSuccessful() && apiResponse.getBody() != null) {
ObjectMapper mapper = new ObjectMapper();
// Convert JSON string to List of Maps
List<Map<String, Object>> itemsList = mapper.readValue(apiResponse.getBody(),
new TypeReference<List<Map<String, Object>>>() {});
if (itemsList.isEmpty()) {
response.put("status", "no data");
response.put("data", Collections.emptyList());
} else {
response.put("status", "success");
response.put("data", itemsList);
}
} else {
response.put("status", "no data");
response.put("data", Collections.emptyList());
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
@GetMapping("/getpendingcomplaints")
public Map<String, Object> getpendingcomplaints(
@RequestParam String startDate,
@RequestParam String endDate,
@RequestParam (required = false) String mobile) {
Map<String, Object> response = new HashMap<>();
try {
List<Map<String,Object>> list = domesticWasteService.getpendingcomplaints(startDate,endDate,mobile);
if (!list.isEmpty()) {
response.put("status", "success");
response.put("data", list);
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
@GetMapping("/getDetailsByReqId")
public Map<String, Object> getDetailsByReqId(
@RequestParam String requestId) {
Map<String, Object> response = new HashMap<>();
try {
List<Map<String,Object>> list = domesticWasteService.getDetailsByReqId(requestId);
if (!list.isEmpty()) {
response.put("status", "success");
response.put("data", list);
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
@PostMapping("/cancelbyagents")
public ResponseEntity<Map<String, Object>> saveAnswer(@RequestParam String requestId,@RequestParam String remarks,@RequestParam String userId) {
Map<String, Object> response = new HashMap<>();
try {
boolean success = domesticWasteService.changeStatus(requestId,remarks,userId);
if (success) {
response.put("status", "success");
response.put("message", "Complaint cancelled successfully!");
return ResponseEntity.ok(response);
} else {
response.put("status", "error");
response.put("message", "Fail to Update.");
return ResponseEntity.status(500).body(response);
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", "Exception: " + e.getMessage());
return ResponseEntity.status(500).body(response);
}
}
}

73
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/DomesticWasteMainController.java

@ -0,0 +1,73 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAgentsService;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/domestic_waste")
@Controller("callCenterDomesticWasteController")
public class DomesticWasteMainController {
@Autowired
private QaqcAgentsService agentsService;
@GetMapping("/registerpage")
public String viewDomesticWastepage(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("userId",userId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
return "modules/callcenterqaqc/domesticwastecomplaints";
}
@GetMapping("/checkstatus")
public String viewComplaintspage(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("userId",userId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
return "modules/callcenterqaqc/domesticwastecheckstatus";
}
@GetMapping("/cancelpage")
public String viewpendingpage(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("userId",userId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
return "modules/callcenterqaqc/domesticwastecancel";
}
}

85
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/FollowUpController.java

@ -0,0 +1,85 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.FollowUpService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcCallsService;
@RequestMapping("gcc/api/callcenterqaqc/agent/followupcalls")
@RestController
public class FollowUpController {
@Autowired
RestTemplate restTemplate;
@Autowired
private QaqcCallsService qaqcCallsService;
@Autowired
private FollowUpService followService;
@PostMapping("/update")
@ResponseBody
public ResponseEntity<String> updateCallDetails(@RequestParam("complaintNumber") String complaintNumber,
@RequestParam("dataId") int dataId,
@RequestParam("userId") String userId,
@RequestParam("action") String action,
@RequestParam(value = "remainderDate", required = false,defaultValue = "-") String remainderDate,
@RequestParam("remarks") String remarks) {
try {
// System.out.println("Updating Complaint Number: " + complaintNumber);
// System.out.println("Updating Data ID: " + dataId);
// System.out.println("Action: " + action);
// System.out.println("Remarks: " + remarks);
int updated_agent = Integer.parseInt(userId);
// System.out.println("updated_agent: " + updated_agent);
Map<String, Object> complaintDetails = qaqcCallsService.getComplaintDetails(dataId);
Integer agentId = (Integer) complaintDetails.get("agent_id");
Map<String, Object> erp_username=qaqcCallsService.getErpnameById(agentId);
String Erpname=(String) erp_username.get("erp_username");
if ("WRONG_ASSIGN".equals(action)) {
boolean statusUpdated = qaqcCallsService.ChangeStatusInErp(complaintNumber, remarks, action, Erpname);
if (!statusUpdated) {
return ResponseEntity.ok("error");
}
}
// Update complaint details
followService.updateFollowupComplaintDetails(complaintNumber, dataId, action, remarks,updated_agent);
followService.updateComplaintHistoryDetails(complaintNumber, dataId, action, remarks,updated_agent, remainderDate);
Map<String, Object> logDetails = qaqcCallsService.getComplaintDetails(dataId);
// Upload to logs
followService.uploadComplaintDetailsInLogs(logDetails, action, complaintNumber,remainderDate);
return ResponseEntity.ok("Success");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error");
}
}
@GetMapping("/getoffsubmittedcalls")
public List<Map<String, Object>> getFollowupSubmitDetails(@RequestParam int userId)
{
return followService.getFollowupSubmitDetails(userId);
}
}

96
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/InprogresscallController.java

@ -0,0 +1,96 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.InprogresscallService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcCallsService;
@RequestMapping("gcc/api/callcenterqaqc/agent/inprogresscalls")
@RestController
public class InprogresscallController {
@Autowired
InprogresscallService inprogresscallService;
@Autowired
RestTemplate restTemplate;
@Autowired
private QaqcCallsService qaqcCallsService;
@PostMapping("/update")
@ResponseBody
public ResponseEntity<String> updateCallDetails(@RequestParam("complaintNumber") String complaintNumber,
@RequestParam("dataId") int dataId,
@RequestParam("userId") String userId,
@RequestParam("action") String action,
@RequestParam(value = "remainderDate", required = false,defaultValue = "-") String remainderDate,
@RequestParam("remarks") String remarks) {
try {
// System.out.println("Updating Complaint Number: " + complaintNumber);
// System.out.println("Updating Data ID: " + dataId);
// System.out.println("Action: " + action);
// System.out.println("Remarks: " + remarks);
int updated_agent = Integer.parseInt(userId);
// System.out.println("updated_agent: " + updated_agent);
//to insert incorrect office mobile number details in table
if (action.equals("MOBILE_NUM")) {
inprogresscallService.saveMobileNumDetails(complaintNumber, remarks);
}
Map<String, Object> complaintDetails = qaqcCallsService.getComplaintDetails(dataId);
Integer agentId = (Integer) complaintDetails.get("agent_id");
Map<String, Object> erp_username=qaqcCallsService.getErpnameById(agentId);
String Erpname=(String) erp_username.get("erp_username");
if ("WRONG_ASSIGN".equals(action)) {
boolean statusUpdated = qaqcCallsService.ChangeStatusInErp(complaintNumber, remarks, action, Erpname);
if (!statusUpdated) {
return ResponseEntity.ok("error");
}
}
// Update complaint details
inprogresscallService.updateInprogressComplaintDetails(complaintNumber, dataId, action, remarks,updated_agent);
inprogresscallService.updateComplaintHistoryDetails(complaintNumber, dataId, action, remarks,updated_agent, remainderDate);
Map<String, Object> logDetails = qaqcCallsService.getComplaintDetails(dataId);
// Upload to logs
qaqcCallsService.uploadComplaintDetailsInLogs(logDetails, action, complaintNumber,remainderDate);
return ResponseEntity.ok("Success");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error");
}
}
@GetMapping("/getinprogresssubmittedcalls")
public List<Map<String, Object>> getInprogressSubmitDetails(@RequestParam int userId)
{
return inprogresscallService.getInprogressSubmitDetails(userId);
}
}

370
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/MainController.java

@ -0,0 +1,370 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.FollowUpService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.InprogresscallService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.PublicFollowUpService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAdminSettingService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAgentsService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcCallsService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcService;
import in.gov.chennaicorporation.gccoffice.entity.AppUserEntity;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/callcenterqaqc")
@Controller("callCenterQaQcMainController")
public class MainController {
@Autowired
private QaqcService qaqcService;
@Autowired
private QaqcAgentsService agentsService;
@Autowired
private QaqcAdminSettingService adminService;
@Autowired
private InprogresscallService inprogresscallService;
@Autowired
private QaqcCallsService qaqcCallsService;
@Autowired
private FollowUpService followUpService;
@Autowired
private PublicFollowUpService publicService;
@GetMapping("/admin/qaqcgrievancedashboard")
public String viewqaqcdashboard(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
List<Map<String,Object>> previousday=agentsService.getPreviousDayDashboardCounts();
model.addAttribute("previousday", previousday);
//System.out.println(previousday);
List<Map<String,Object>> agentcount=agentsService.getAgentPreviousDayCount();
model.addAttribute("agentcount", agentcount);
return "modules/callcenterqaqc/qaqcgrievancedashboard";
}
@GetMapping("/admin/qaqcassigntaskagents")
public String viewAgentAssign(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/callcenterqaqc/qaqctaskagentassign";
}
@GetMapping("/admin/qaqcfollowuplist")
public String viewAdminFollowuplist(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/callcenterqaqc/qaqcfollowuplist";
}
@GetMapping("/admin/unattendedcomplaints")
public String viewAdminUnattendedClose(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("userId", userId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
return "modules/callcenterqaqc/unattendedclosing";
}
@GetMapping("/agent/agentgrievancedashboard")
public String viewAgentGrievenceDashboardpage(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate,
Model model
) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
// Default dates if not provided
if (startDate == null || endDate == null) {
LocalDate today = LocalDate.now();
startDate = today.toString();
endDate = today.toString();
}
List<Map<String, Object>> details = agentsService.getAgentDashboard(userId, startDate, endDate);
model.addAttribute("details", details);
List<Map<String, Object>> details2 = agentsService.getAgentPerformanceData(userId, startDate, endDate);
model.addAttribute("details2", details2);
List<Map<String, Object>> tasks = agentsService.getAgentTaskDetails(userId, startDate, endDate);
model.addAttribute("tasks", tasks);
//System.out.println("tasks: "+tasks);
return "modules/callcenterqaqc/agentgrievancedashboard";
}
@PostMapping("/agent/agentgrievancedashboard")
public String viewAgentGrievenceDashboard(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate,
Model model
) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
// Default dates if not provided
if (startDate == null || endDate == null) {
LocalDate today = LocalDate.now();
startDate = today.toString();
endDate = today.toString();
}
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
// System.out.println("startdate: "+startDate );
// System.out.println("enddate:" + endDate);
List<Map<String, Object>> details = agentsService.getAgentDashboard(userId, startDate, endDate);
model.addAttribute("details", details);
List<Map<String, Object>> details2 = agentsService.getAgentPerformanceData(userId, startDate, endDate);
model.addAttribute("details2", details2);
List<Map<String, Object>> tasks = agentsService.getAgentTaskDetails(userId, startDate, endDate);
model.addAttribute("tasks", tasks);
return "modules/callcenterqaqc/agentgrievancedashboard";
}
@GetMapping("/agent/qaqccalls")
public String viewAgentQaqcCalls( @RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate,Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("userId",userId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
// Default dates if not provided
if (startDate == null || endDate == null) {
LocalDate today = LocalDate.now();
startDate = today.toString();
endDate = today.toString();
}
List<Map<String, Object>> details = agentsService.getAgentDashboard(userId, startDate, endDate);
model.addAttribute("details", details);
List<Map<String, Object>> qaqcCallslists=qaqcCallsService.getClosedComplaints(userId);
model.addAttribute("qaqcCallsLists",qaqcCallslists);
List<Map<String, Object>> qaqcCallsAction=qaqcCallsService.getCallCategories();
model.addAttribute("qaqcCallsActioin",qaqcCallsAction);
List<Map<String, Object>> qaqcSubmitDetails=qaqcCallsService.getSubmitDetails(userId);
model.addAttribute("qaqcSubmitDetails",qaqcSubmitDetails);
return "modules/callcenterqaqc/agentqaqccalls";
}
@GetMapping("agent/qaqcinprogresscall")
public String viewqaqcin_progress_call( @RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate,Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("userId",userId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
// Default dates if not provided
if (startDate == null || endDate == null) {
LocalDate today = LocalDate.now();
startDate = today.toString();
endDate = today.toString();
}
List<Map<String, Object>> details = agentsService.getAgentDashboard(userId, startDate, endDate);
model.addAttribute("details", details);
List<Map<String, Object>> inprogresslists=inprogresscallService.getInProgressCalls(userId);
model.addAttribute("inprogresslists", inprogresslists);
List<Map<String, Object>> qaqcactionlists=inprogresscallService.getActionsCatergory();
model.addAttribute("qaqcactionlists", qaqcactionlists);
List<Map<String, Object>> inSubmitDetails=inprogresscallService.getInprogressSubmitDetails(userId);
model.addAttribute("inSubmitDetails",inSubmitDetails);
return "modules/callcenterqaqc/agentqaqcinprogresscalls";
}
@GetMapping("/agent/qaqcfollowupcalls")
public String viewAgentQaqcFollowupCalls(@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate,Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("userId",userId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
// Default dates if not provided
if (startDate == null || endDate == null) {
LocalDate today = LocalDate.now();
startDate = today.toString();
endDate = today.toString();
}
List<Map<String, Object>> details = agentsService.getAgentDashboard(userId, startDate, endDate);
model.addAttribute("details", details);
List<Map<String, Object>> qaqcfollowuplists=followUpService.getFollowUpCalls(userId);
model.addAttribute("qaqcfollowuplists",qaqcfollowuplists);
List<Map<String, Object>> qaqccategorylists=followUpService.getFollowUpCatergory();
model.addAttribute("qaqccategorylists",qaqccategorylists);
List<Map<String, Object>> fcSubmitDetails=followUpService.getFollowupSubmitDetails(userId);
model.addAttribute("fcSubmitDetails",fcSubmitDetails);
return "modules/callcenterqaqc/agentqaqcfollowupcalls";
}
@GetMapping("/agent/qaqcpublicfollowupcalls")
public String viewAgentQaqcPublicFollowupCalls(@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate,Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("userId",userId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
// Default dates if not provided
if (startDate == null || endDate == null) {
LocalDate today = LocalDate.now();
startDate = today.toString();
endDate = today.toString();
}
List<Map<String, Object>> details = agentsService.getAgentDashboard(userId, startDate, endDate);
model.addAttribute("details", details);
List<Map<String, Object>> qaqcfollowuplists=publicService.getFollowUpCalls(userId);
model.addAttribute("qaqcfollowuplists",qaqcfollowuplists);
List<Map<String, Object>> qaqccategorylists=publicService.getFollowUpCatergory();
model.addAttribute("qaqccategorylists",qaqccategorylists);
List<Map<String, Object>> fcSubmitDetails=publicService.getFollowupSubmitDetails(userId);
model.addAttribute("fcSubmitDetails",fcSubmitDetails);
return "modules/callcenterqaqc/agentqaqcpublicfollowupcalls";
}
}

89
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/PublicFollowUpController.java

@ -0,0 +1,89 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.FollowUpService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.PublicFollowUpService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcCallsService;
@RequestMapping("gcc/api/callcenterqaqc/agent/publicfollowupcalls")
@RestController
public class PublicFollowUpController {
@Autowired
RestTemplate restTemplate;
@Autowired
private QaqcCallsService qaqcCallsService;
@Autowired
private FollowUpService followService;
@Autowired
private PublicFollowUpService publicService;
@PostMapping("/update")
@ResponseBody
public ResponseEntity<String> updateCallDetails(@RequestParam("complaintNumber") String complaintNumber,
@RequestParam("dataId") int dataId,
@RequestParam("userId") String userId,
@RequestParam("action") String action,
@RequestParam(value = "remainderDate", required = false,defaultValue = "-") String remainderDate,
@RequestParam("remarks") String remarks) {
try {
// System.out.println("Updating Complaint Number: " + complaintNumber);
// System.out.println("Updating Data ID: " + dataId);
// System.out.println("Action: " + action);
// System.out.println("Remarks: " + remarks);
int updated_agent = Integer.parseInt(userId);
// System.out.println("updated_agent: " + updated_agent);
Map<String, Object> complaintDetails = qaqcCallsService.getComplaintDetails(dataId);
Integer agentId = (Integer) complaintDetails.get("agent_id");
Map<String, Object> erp_username=qaqcCallsService.getErpnameById(agentId);
String Erpname=(String) erp_username.get("erp_username");
if ("COMPLETED".equals(action) || "REOPEN".equals(action) ||"WRONG_ASSIGN".equals(action))
{
boolean statusUpdated =qaqcCallsService.ChangeStatusInErp(complaintNumber, remarks, action,Erpname);
System.out.println("statusUpdated="+statusUpdated);
if (!statusUpdated)
{
return ResponseEntity.ok("error");
}
}
// Update complaint details
followService.updateFollowupComplaintDetails(complaintNumber, dataId, action, remarks,updated_agent);
followService.updateComplaintHistoryDetails(complaintNumber, dataId, action, remarks,updated_agent, remainderDate);
Map<String, Object> logDetails = qaqcCallsService.getComplaintDetails(dataId);
// Upload to logs
followService.uploadComplaintDetailsInLogs(logDetails, action, complaintNumber,remainderDate);
return ResponseEntity.ok("Success");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error");
}
}
@GetMapping("/getpubsubmittedcalls")
public List<Map<String, Object>> getFollowupSubmitDetails(@RequestParam int userId)
{
return publicService.getFollowupSubmitDetails(userId);
}
}

391
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAPIController.java

@ -0,0 +1,391 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.FollowUpService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@RequestMapping("gcc/api/callcenterqaqc")
@RestController("GrivanceQCapiController")
public class QaqcAPIController {
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public QaqcAPIController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@Autowired
private QaqcService qaqcService;
@Autowired
private FollowUpService followUpService;
@GetMapping("/getComplaintDetails/{complaintNumber}")
public Map<String, Object> getComplaintDetails(
@PathVariable String complaintNumber,
@RequestParam(required = false) String gender,
@RequestParam(required = false) String compmode,
@RequestParam(required = false) String deptname) {
Map<String, Object> resultMap = new HashMap<>();
try {
String url = "https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=getComplaintByID&ComplaintId="
+ complaintNumber + "&imgUrlonly=yes";
System.out.println("Request URL: " + url);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
String responseBody = responseEntity.getBody();
//System.out.println("Response Body: " + responseBody);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(responseBody);
JsonNode complaintDetails = rootNode.path(0).path("ComplaintListHistory").path(0);
String registerDate=complaintDetails.path("complaintopendate").asText("N/A");
//System.out.println("registerdate====="+registerDate);
String formattedDate = "N/A"; // Default value if parsing fails
if (!registerDate.equals("N/A") && !registerDate.isEmpty()) {
try {
// Parse the input date string
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
Date date = inputFormat.parse(registerDate);
// Format the date to dd-MM-yyyy
SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
formattedDate = outputFormat.format(date);
} catch (Exception e) {
e.printStackTrace(); // Log exception for debugging
}
}
if (!complaintDetails.isMissingNode()) {
// Existing fields
resultMap.put("complaintid", complaintDetails.path("complaintid").asText("N/A"));
resultMap.put("complaintdate", formattedDate);
resultMap.put("complainantName", complaintDetails.path("CustomerName").asText("N/A"));
resultMap.put("mobileNumber", complaintDetails.path("CustomerMobile").asText("N/A"));
resultMap.put("complaintType", complaintDetails.path("complainttype").asText("N/A"));
resultMap.put("description", complaintDetails.path("complaintdetails").asText("N/A"));
resultMap.put("currentStatus", complaintDetails.path("complaintcurrentstatus").asText("N/A"));
resultMap.put("Street", complaintDetails.path("Street").asText("N/A"));
resultMap.put("Area", complaintDetails.path("Area").asText("N/A"));
resultMap.put("Landmark", complaintDetails.path("Landmark").asText("N/A"));
resultMap.put("Location", complaintDetails.path("Location").asText("N/A"));
resultMap.put("Zone", complaintDetails.path("Zone").asText("N/A"));
resultMap.put("Division", complaintDetails.path("Division").asText("N/A"));
resultMap.put("OfficialMobile", complaintDetails.path("OfficialMobile").asText("N/A"));
resultMap.put("gender", gender != null ? gender : complaintDetails.path("GENDER").asText("N/A"));
resultMap.put("deptname", deptname != null ? deptname : complaintDetails.path("DEPT_NAME").asText("N/A"));
resultMap.put("compmode", compmode != null ? compmode : complaintDetails.path("COMP_MODE").asText("N/A"));
// Comments section
JsonNode comments = complaintDetails.path("Comments");
if (!comments.isMissingNode()) {
List<Map<String, Object>> commentList = new ArrayList<>();
for (JsonNode commentNode : comments) {
Map<String, Object> commentData = new HashMap<>();
// Extracting comment details
commentData.put("user", commentNode.path("user").asText("N/A"));
commentData.put("message", commentNode.path("message").asText("N/A"));
commentData.put("comment_date", commentNode.path("comment_date").asText("N/A"));
// Handling media link (Image) as part of userimages array for each comment
JsonNode userImages = commentNode.path("userimages");
if (!userImages.isMissingNode() && userImages.isArray() && userImages.size() > 0) {
String mediaLink = userImages.get(0).path("Comp_Image").asText(null);
// If media link is valid, add it to the comment data
if (mediaLink != null && !mediaLink.equals("null") && !mediaLink.isEmpty()) {
commentData.put("Comp_Image", mediaLink);
} else {
commentData.put("Comp_Image", "No image available");
}
} else {
commentData.put("Comp_Image", "No image available");
}
// Add the comment data to the list
commentList.add(commentData);
}
resultMap.put("comments", commentList);
}
// Handling media link (Image) as part of userimages array
String mediaLink = complaintDetails.path("mediaLink").asText(null);
List<Map<String, String>> userImagesList = new ArrayList<>();
Map<String, String> imageMap = new HashMap<>();
imageMap.put("Comp_Image", mediaLink != null && !mediaLink.equals("null") ? mediaLink : null);
userImagesList.add(imageMap);
resultMap.put("userimages", userImagesList);
// System.out.println("Image URL from API: " + mediaLink);
}
} else {
resultMap.put("error", "Failed to retrieve complaint details.");
}
} catch (Exception e) {
e.printStackTrace();
resultMap.put("error", "Error processing request");
}
return resultMap;
}
@GetMapping("/followuplist")
@ResponseBody
public List<Map<String, Object>> getFollowUpList(
@RequestParam(value = "callStatus", required = false) String callStatus,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate fromDate,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate toDate) {
// Set default 'toDate' to a future date (1 year ahead) if not provided
if (toDate == null) {
toDate = LocalDate.now().plusMonths(1); // Set to one year ahead or any other future date
//toDate= qaqcService.getMaxRemainderdate();
}
// Set default 'fromDate' to the start of the current month if not provided
if (fromDate == null) {
fromDate = LocalDate.now().withDayOfMonth(1); // Start from the first day of the current month
}
// Print debug info
// System.out.println("Received callStatus: " + callStatus);
// System.out.println("From Date: " + fromDate);
// System.out.println("To Date: " + toDate);
// Call the service to fetch the filtered data based on the status and date range
return qaqcService.getFollowUpDetailsByStatus(callStatus, fromDate, toDate);
}
@GetMapping("/followup/todayCount")
public ResponseEntity<Map<String, Long>> getTodayFollowUpCount(@RequestParam String followupStatus) {
LocalDate today = LocalDate.now(); // Get the current date
Map<String, Long> counts = qaqcService.countFollowUpsByDateAndStatus(today, followupStatus);
return ResponseEntity.ok(counts); // Return the count in the response
}
@GetMapping("/callhistory")
public ResponseEntity<List<Map<String, Object>>> getCallHistory(@RequestParam String complaintNumber) {
List<Map<String, Object>> callHistory = followUpService.getCallHistory(complaintNumber);
if (callHistory.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Collections.emptyList());
}
return ResponseEntity.ok(callHistory);
}
@GetMapping("/getfilterreport")
public Map<String, Object> getFilterReports(
@RequestParam String startDate,
@RequestParam String endDate,
@RequestParam String status,
@RequestParam String group,
@RequestParam String type,
@RequestParam String mode,
@RequestParam String zone,
@RequestParam String region) {
Map<String, Object> response = new HashMap<>();
try {
LocalDate fromLocalDate = LocalDate.parse(startDate, DateTimeFormatter.ISO_DATE);
LocalDate toLocalDate = LocalDate.parse(endDate, DateTimeFormatter.ISO_DATE);
String formattedFromDate = fromLocalDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
String formattedToDate = toLocalDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
String url="https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=ms_dashboard_details&From_date="+formattedFromDate+"&To_date="+formattedToDate+"&jsonResp=Yes&Status="+status+"&isQcuser=Yes"+"&ComplaintType="+type+"&ComplaintGroupId="+group+"&compmode="+mode+"&Zoneid="+zone+"&RegionId="+region;
System.out.println(url);
RestTemplate restTemplate = new RestTemplate();
// Fetch response as String
ResponseEntity<String> responses = restTemplate.getForEntity(url, String.class);
String rawResponse = responses.getBody();
// Preprocess response to remove invalid characters if needed
if (rawResponse != null) {
//rawResponse = rawResponse.replaceAll("\"\"", "\""); // Replace double-double quotes
//rawResponse = rawResponse.replaceAll("(?<![,{])\"R", "\"R"); // Example: Fix missing commas
}
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> responseMap = objectMapper.readValue(rawResponse, Map.class);
List<Map<String, Object>> details = (List<Map<String, Object>>) responseMap.get("Details");
//System.out.println(details);
if (details == null) {
response.put("status", "nodata");
response.put("message", "No Data, please change criteria");
}
else {
response.put("status", "success");
response.put("details", details);
}
}
catch (Exception e) {
response.put("status", "error");
response.put("message", "An error occurred while fetching data.");
e.printStackTrace();
}
return response;
}
@GetMapping("/getunattendedcount")
public Map<String, Object> GetUnattendedComplaints(@RequestParam int ucount)
{
Map<String, Object> response = new HashMap<>();
try {
// Logging input parameters
//System.out.println("Received Data: " + ucount);
// Fetch unattended complaints
List<Map<String, Object>> details = qaqcService.getUnattendedlist(ucount);
if (details != null && !details.isEmpty()) {
response.put("status", "success");
response.put("details", details);
} else {
response.put("status", "nodata");
response.put("message", "No unattended complaints found for the given criteria.");
}
} catch (Exception e) {
System.err.println("Error while fetching unattended complaints: " + e.getMessage());
e.printStackTrace(); // Log the complete stack trace for debugging
response.put("status", "error");
response.put("message", "An error occurred while fetching unattended complaints. Please try again.");
}
return response;
}
@PostMapping("/closingunattendedcomplaints")
public ResponseEntity<Map<String, Object>> closeUnattendedComplaints(@RequestBody Map<String, Object> request) {
Map<String, Object> response = new HashMap<>();
try {
// Extract values from request map
String userId = (String) request.get("userId");
String remarks = (String) request.get("remarks");
List<String> complaintNumbers = (List<String>) request.get("complaintNumbers");
if (userId == null || remarks == null || complaintNumbers == null || complaintNumbers.isEmpty()) {
response.put("status", "error");
response.put("message", "Invalid request data.");
return ResponseEntity.badRequest().body(response);
}
// Get ERP Username
String erp_name = qaqcService.getErpusernamebyId(userId);
//System.out.println("ERP Name: " + erp_name);
List<String> completedComplaints = new ArrayList<>();
List<String> failedComplaints = new ArrayList<>();
// Process each complaint number
for (String complaintNumber : complaintNumbers) {
boolean isSuccess = qaqcService.ChangeStatusInErp(complaintNumber, erp_name, remarks);
if (isSuccess) {
completedComplaints.add(complaintNumber);
} else {
failedComplaints.add(complaintNumber);
}
}
int updated=qaqcService.UpdateInHistoryTable(completedComplaints);
//System.out.println("Updated rows in history table: " + updated);
int updateInlogs=qaqcService.insertInLogs(completedComplaints,remarks,userId);
//System.out.println("Updated rows in logs table: " + updateInlogs);
//System.out.println("failedComplaints===="+failedComplaints);
// Response handling
if (complaintNumbers.size() == completedComplaints.size()) {
response.put("status", "success");
response.put("message", "All complaints Completed successfully.");
response.put("completedCount", completedComplaints.size());
} else if (!completedComplaints.isEmpty()) {
response.put("status", "partial_success");
response.put("message", "Some complaints failed to process.");
response.put("completedCount", completedComplaints.size());
response.put("failedCount", failedComplaints.size());
response.put("failedComplaints", failedComplaints);
} else {
response.put("status", "error");
response.put("message", "Failed to process all complaints.");
}
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", "An internal server error occurred.");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
}

208
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAdminSettingsApiController.java

@ -0,0 +1,208 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAdminSettingService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@RequestMapping("gcc/api/callcenterqaqc/adminsettings")
@RestController
public class QaqcAdminSettingsApiController {
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public QaqcAdminSettingsApiController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@Autowired
private QaqcAdminSettingService adminService;
@PostMapping("/saveproductivity")
public ResponseEntity<Map<String, String>> saveproductivity(@RequestParam int productivity_count)
{
Map<String, String> response = new HashMap<>();
try {
// Save task ID
int rowsInserted = adminService.saveProductivity(productivity_count);
if (rowsInserted > 0) {
response.put("status", "success");
response.put("message", "Productivity inserted successfully");
return ResponseEntity.ok(response);
}
response.put("status", "fail");
response.put("message", "Productivity not saved");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response); // Change to BAD_REQUEST for failure
} catch (Exception e) {
// Logging the error
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Error saving task", e);
response.put("status", "error");
response.put("message", "Failed to save productivity");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
@PostMapping("/updateproductivity")
public ResponseEntity<Map<String, String>> updateProductivityById(@RequestBody Map<String, Integer> requestData)
{ Map<String, String> response = new HashMap<>();
try {
// Save task ID
int productivityCount = requestData.getOrDefault("productivity_count", 0); // Default to 0 if not provided
int rowsUpdated = adminService.updateProductivity(productivityCount);
if (rowsUpdated > 0) {
response.put("status", "success");
response.put("message", "Productivity saved successfully");
return ResponseEntity.ok(response);
}
response.put("status", "fail");
response.put("message", "Productivity not saved");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response); // Change to BAD_REQUEST for failure
} catch (Exception e) {
// Logging the error
Logger.getLogger(getClass().getName()).log(Level.SEVERE, "Error saving task", e);
response.put("status", "error");
response.put("message", "Failed to save productivity");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
@GetMapping("/getproductivity")
public Integer getProductivity()
{
return adminService.getProductivity();
}
@GetMapping("/getadminsettingcounts")
public List<Map<String, Object>> getadminsettingcounts()
{
return adminService.getAdminSettingCounts();
}
@GetMapping("/assigncallingtype")
public List<Map<String, Object>> assigncallingtype()
{
return adminService.getAgentsForCallingtype();
}
@PostMapping("/updateCallType") // Bulk update endpoint
public ResponseEntity<Map<String, String>> updateCallType(@RequestBody List<Map<String, Object>> selectedAgents) {
Map<String, String> response = new HashMap<>();
try {
int rowsUpdated = 0;
// Loop through each selected agent and update their calling_type
for (Map<String, Object> agent : selectedAgents) {
String callingType = (String) agent.get("calling_type");
// Parse agent_id to Integer if it's passed as a String
int agentId = Integer.parseInt(agent.get("agent_id").toString()); // Ensure it's parsed as Integer
// Update calling type for the agent
rowsUpdated += adminService.updateCallType(callingType, agentId);
}
adminService.saveCallingTypeInSettings();
if (rowsUpdated > 0) {
response.put("status", "success");
response.put("message", "Agents Assigned successfully");
return ResponseEntity.ok(response);
} else {
response.put("status", "error");
response.put("message", "No agents updated");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
} catch (Exception e) {
response.put("status", "error");
response.put("message", "Error occurred while updating calling types: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
@PostMapping("/updateagentname")
public ResponseEntity<Map<String, String>> updateAgentnameById(@RequestBody Map<String, String> requestData){
Map<String, String> response = new HashMap<>();
try {
// Extract and convert agent_id to int
String agentIdStr = requestData.get("agent_id");
String updatedName = requestData.get("agent_name");
// Validate input
if (agentIdStr == null || updatedName == null || updatedName.trim().isEmpty()) {
response.put("status", "error");
response.put("message", "Agent ID and name are required!");
return ResponseEntity.badRequest().body(response);
}
int agentId;
try {
agentId = Integer.parseInt(agentIdStr);
} catch (NumberFormatException e) {
response.put("status", "error");
response.put("message", "Invalid Agent ID format!");
return ResponseEntity.badRequest().body(response);
}
// Call service layer to update the agent name
int updatedRows = adminService.updateAgentName(agentId, updatedName); // Now agentId is an int
if (updatedRows == -1) { // If name already exists
response.put("status", "error");
response.put("message", "Agent name already exists!");
return ResponseEntity.status(HttpStatus.CONFLICT).body(response);
} else if (updatedRows > 0) {
response.put("status", "success");
response.put("message", "Agent name updated successfully!");
return ResponseEntity.ok(response);
} else {
response.put("status", "error");
response.put("message", "Agent not found or update failed.");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
}
}
catch (Exception e) {
response.put("status", "error");
response.put("message", "Error occurred while updating Agent name " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
}

47
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAdminSettingsMainController.java

@ -0,0 +1,47 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAdminSettingService;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/callcenterqaqcadminsettings")
@Controller("callCenterQaQcAdminSettingsController")
public class QaqcAdminSettingsMainController {
@Autowired
private QaqcAdminSettingService adminService;
@GetMapping("/adminsettings")
public String viewAdminSettings(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
List<Map<String, Object>> Counts=adminService.getAdminSettingCounts();
model.addAttribute("Counts", Counts);
List<Map<String, Object>> agents=adminService.getAgentsForCallingtype();
model.addAttribute("Agents", agents);
return "modules/callcenterqaqc/qaqcadminsettings";
}
}

234
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAgentAssignAPIController.java

@ -0,0 +1,234 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.security.SecureRandom;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAdminSettingService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAgentAssignService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@RestController
@RequestMapping("gcc/api/callcenterqaqc/agentassign")
public class QaqcAgentAssignAPIController {
private final RestTemplate restTemplate;
@Autowired
public QaqcAgentAssignAPIController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Autowired
private QaqcAgentAssignService agentAssignService;
@Autowired
private QaqcAdminSettingService adminService;
@GetMapping("/getavailableagents")
public ResponseEntity<Map<String, Object>> getAvailableAgents(@RequestParam int totalDataCount) {
Map<String, Object> response = new HashMap<>();
try {
// Fetch available agents
List<Map<String, Object>> availableAgents = agentAssignService.getAvailableOutboundAgents();
Integer productivity_count = adminService.getProductivity();
if (availableAgents.isEmpty() || totalDataCount == 0) {
response.put("status", "error");
response.put("message", "No available agents or totalDataCount must be greater than 0.");
return ResponseEntity.ok(response);
}
// Process and filter agents based on productivity_count
List<Map<String, Object>> filteredAgents = new ArrayList<>();
for (Map<String, Object> agent : availableAgents) {
Integer agentId = (Integer) agent.get("agent_id");
String agentName = (String) agent.get("agent_name");
Integer todayCount=agentAssignService.getTodayCountForAgent(agentId);
Integer campaignPendingCount = agentAssignService.getCampaignPendingCountForAgent(agentId);
Integer pendingCounts=todayCount+campaignPendingCount;
// Log the details of each agent
//System.out.println("Agent ID: " + agentId + ", Today Count: " + todayCount +", Campaign Pending Count: " + campaignPendingCount + ", Pending Counts: " + pendingCounts);
if(pendingCounts<productivity_count) {
filteredAgents.add(Map.of(
"agent_id", agentId,
"agent_name", agentName,
"campaignPendingCount", campaignPendingCount,
"todayCount",todayCount
));
//System.out.println("Agent added to filteredAgents: " + agentName);
}
}
//System.out.println("Filtered Agents Size: " + filteredAgents.size());
if (filteredAgents.isEmpty()) {
response.put("status", "error");
response.put("message", "No Available Agents,To continue Increase the Productivity");
return ResponseEntity.ok(response);
}
// Calculate agent_available_count based on filtered agents
int agent_available_count = filteredAgents.size();
// Calculate calls per agent using filtered agent count
int calls_per_agent = totalDataCount / agent_available_count;
int remainder = totalDataCount % agent_available_count;
// Distribute calls_per_agent and remainder
List<Map<String, Object>> finalFilteredAgents = new ArrayList<>();
filteredAgents.sort(Comparator.comparingInt(agent -> (Integer) agent.get("campaignPendingCount")));
for (int i = 0; i < filteredAgents.size(); i++) {
Map<String, Object> agent = filteredAgents.get(i);
Integer agentId = (Integer) agent.get("agent_id");
String agentName = (String) agent.get("agent_name");
Integer todayCount = (Integer) agent.get("todayCount");
Integer campaignPendingCount = (Integer) agent.get("campaignPendingCount");
// Add 1 extra call for agents handling the remainder, starting from the first agent
int additionalCalls = (i < remainder) ? 1 : 0;
int totalCallsCount = todayCount+campaignPendingCount + calls_per_agent + additionalCalls;
if (totalCallsCount < productivity_count) {
finalFilteredAgents.add(Map.of(
"agent_id", agentId,
"agent_name", agentName,
"totalCallsCount", totalCallsCount,
"todayCount",todayCount,
"campaignPendingCount", campaignPendingCount,
"calls_per_agent", calls_per_agent + additionalCalls
));
// System.out.println("Agent added to final======filteredAgents: " + agentName);
}
}
//System.out.println("Final Filtered Agents Size: " + finalFilteredAgents.size());
if (finalFilteredAgents.isEmpty()) {
response.put("status", "error");
response.put("message", "No Available Agents,To continue Increase the Productivity");
return ResponseEntity.ok(response);
}
int agent_available_count2 = finalFilteredAgents.size();
// Calculate calls per agent using filtered agent count
int calls_per_agent2 = totalDataCount / agent_available_count2;
int remainder2 = totalDataCount % agent_available_count2;
// Distribute calls_per_agent and remainder
List<Map<String, Object>> LastfinalFilteredAgents = new ArrayList<>();
finalFilteredAgents.sort(Comparator.comparingInt(agent -> (Integer) agent.get("campaignPendingCount")));
for (int i = 0; i < finalFilteredAgents.size(); i++) {
Map<String, Object> agent = finalFilteredAgents.get(i);
Integer agentId = (Integer) agent.get("agent_id");
String agentName = (String) agent.get("agent_name");
Integer todayCount1 = (Integer) agent.get("todayCount");
Integer campaignPendingCount = (Integer) agent.get("campaignPendingCount");
// Add 1 extra call for agents handling the remainder, starting from the first agent
int additionalCalls1 = (i < remainder2) ? 1 : 0;
int totalCallsCount1 = todayCount1+campaignPendingCount + calls_per_agent2 + additionalCalls1;
if (totalCallsCount1 < productivity_count) {
LastfinalFilteredAgents.add(Map.of(
"agent_id", agentId,
"agent_name", agentName,
"totalCallsCount", totalCallsCount1,
"todayCount1",todayCount1,
"campaignPendingCount", campaignPendingCount,
"calls_per_agent", calls_per_agent2 + additionalCalls1
));
// System.out.println("Agent added to Lastfinal======LastfinalFilteredAgents: " + agentName);
}
}
//System.out.println("Filtered Agents Size: " + LastfinalFilteredAgents.size());
if (LastfinalFilteredAgents.isEmpty()) {
response.put("status", "error");
response.put("message", "No Available Agents,To continue Increase the Productivity");
return ResponseEntity.ok(response);
}
// Build response
response.put("status", "success");
response.put("message", "Available agents fetched successfully");
response.put("available_agents", LastfinalFilteredAgents);
response.put("productivity_count", productivity_count);
response.put("agent_available_count", LastfinalFilteredAgents.size());
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
// Return error response in case of failure
response.put("status", "error");
response.put("message", "Failed to fetch available agents");
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
@PostMapping("/taskassign")
public ResponseEntity<Map<String, Object>> assignTasks(@RequestBody Map<String, Object> requestData) {
Map<String, Object> response;
try {
// Delegate transactional work to the service
response = agentAssignService.assignTasksTransactionally(requestData);
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
response = new HashMap<>();
response.put("status", "error");
response.put("message", "An error occurred: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
@GetMapping("/deleteRecords")
public ResponseEntity<String> deleteRecordsInUploadData() {
try {
int rowsAffected = agentAssignService.deleteUploadDataTable();
if (rowsAffected > 0) {
return ResponseEntity.ok("success");
} else {
return ResponseEntity.ok("No records to delete");
}
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error deleting records");
}
}
}

161
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcAgentsAPIController.java

@ -0,0 +1,161 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAgentsService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("gcc/api/callcenterqaqc/agent")
@RestController
public class QaqcAgentsAPIController {
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public QaqcAgentsAPIController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@Autowired
private QaqcAgentsService agentsService;
@GetMapping("/getdataforagents")
public ResponseEntity<Map<String, Object>> getdataforagents(@RequestParam int agent_id,@RequestParam int qaqc_id)
{
Map<String, Object> response = new HashMap<>();
try {
List<Map<String, Object>> tasks = agentsService.getdataforagents(agent_id,qaqc_id);
if (tasks.isEmpty()) {
response.put("status", "no_data");
response.put("message", "No data found for the given agent_id and qaqc_id.");
} else {
// Success case
response.put("status", "success");
response.put("message", "Data retrieved successfully.");
response.put("tasks", tasks);
}
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", "An error occurred: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
}
}
@PostMapping("/savecallstatus")
public ResponseEntity<String> savecallstatus(@RequestParam String call_status,@RequestParam String remarks,@RequestParam String complaintNumber)//get full body data
{
agentsService.savecallstatus(call_status, remarks,complaintNumber);//get all dbdata and save here and service also
agentsService.savecallstatusinlogs(call_status, remarks,complaintNumber);//get all dbdata and save here and service also
return ResponseEntity.ok("Data Inserted successfully.");
}
@GetMapping("/getagentperformancecount")
public List<Map<String, Object>> getAgentPerformanceCount(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
List<Map<String, Object>> counts = agentsService.getAgentPerformanceCount(startDate, endDate);
// System.out.println("fromdates: " + startDate);
// System.out.println("todate: " + endDate);
// System.out.println("overallcounts: " + counts );
return counts;
}
@GetMapping("/getagentperformancelist")
public List<Map<String, Object>> getAgentPerformanceList(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
// Fetch agent performance data from service
List<Map<String, Object>> agentPerformanceData = agentsService.getAgentPerformanceList(startDate, endDate);
// Log or return the data
//System.out.println("Agent Performance Data: " + agentPerformanceData);
return agentPerformanceData;
}
@GetMapping("/agenttaskwise")
public List<Map<String, Object>> getAgentTaskwiseData(@RequestParam String agentId,@RequestParam String startDate,@RequestParam String endDate) {
// Call the service to fetch agent task-wise data
List<Map<String, Object>> agentTaskwiseData = agentsService.getAgentTaskwiseData(agentId, startDate, endDate);
//System.out.println("Agent Task Wise Data: " + agentTaskwiseData);
return agentTaskwiseData;
}
@GetMapping("/agentattendedcomplaints")
public List<Map<String,Object>> getAttendedComplaintStatus(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate,
@RequestParam(required = false) String complaintNumber,
@RequestParam(required = false) String complaintMobileNumber){
List<Map<String, Object>> agentAttendedData = agentsService.getAttendedComplaintStatus(startDate, endDate, complaintNumber, complaintMobileNumber);
//System.out.println("Agent attended Data: " + agentAttendedData);
return agentAttendedData;
}
@GetMapping("/attendedcomplaintshistory")
public List<Map<String,Object>> getAttendedComplainthistory(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate,
@RequestParam(required = false) String complaintNumber,
@RequestParam(required = false) String complaintMobileNumber){
List<Map<String, Object>> agentAttendedData = agentsService.getAttendedComplainthistory(startDate, endDate, complaintNumber, complaintMobileNumber);
//System.out.println("Agent attended Data: " + agentAttendedData);
return agentAttendedData;
}
@GetMapping("/agenttaskassign")
public List<Map<String, Object>> getAgentTaskwiseAssign(@RequestParam String agentId) {
// Call the service to fetch agent task-wise data
List<Map<String, Object>> agentTaskwiseAssign = agentsService.getAgentTaskwiseAssign(agentId);
//System.out.println("Agent Task Wise Assign: " + agentTaskwiseAssign);
return agentTaskwiseAssign;
}
}

448
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcCallsController.java

@ -0,0 +1,448 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
//import java.util.stream.Stream;
import java.text.ParseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcCallsService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("gcc/api/callcenterqaqc/agent/qaqccalls")
@RestController
public class QaqcCallsController {
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public QaqcCallsController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@Autowired
private QaqcCallsService qaqcCallsService;
@PostMapping("/update")
@ResponseBody
public ResponseEntity<String> updateCallDetails(@RequestParam("complaintNumber") String complaintNumber,
@RequestParam("dataId") int dataId, @RequestParam("action") String action,
@RequestParam("userId") String userId,
@RequestParam(value = "remainderDate", required = false, defaultValue = "-") String remainderDate,
@RequestParam("remarks") String remarks) {
try {
// System.out.println("Updating Complaint Number: " + complaintNumber);
// System.out.println("Updating Data ID: " + dataId);
// System.out.println("Action: " + action);
// System.out.println("Remarks: " + remarks);
int updated_agent = Integer.parseInt(userId);
// System.out.println("updated_agent: " + updated_agent);
// Map<String,Object> followUpComplaint =
// qaqcCallsService.checkComplaintDetail(complaintNumber);
//
// try {
// int followupid = (int) followUpComplaint.get("id");
// // update complaintstaus if exist in followup call logs table
// if (followUpComplaint != null &&!followUpComplaint.isEmpty())
// {
// qaqcCallsService.updateFollowupCallLogs(complaintNumber, action, remarks,followupid);
// }
//
// }
// catch(Exception e)
// {
// System.out.println("Exception:"+e);
// }
//to insert incorrect office mobile number details in table
if(action.equals("MOBILE_NUM")) {
qaqcCallsService.saveMobileNumDetails(complaintNumber, remarks); }
// Get complaint details
Map<String, Object> complaintDetails =qaqcCallsService.getComplaintDetails(dataId);
Integer agentId = (Integer) complaintDetails.get("agent_id");
Map<String,Object> erp_username=qaqcCallsService.getErpnameById(agentId);
String Erpname=(String) erp_username.get("erp_username");
// Handle COMPLETED and REOPEN actions
if ("COMPLETED".equals(action) || "REOPEN".equals(action) ||"WRONG_ASSIGN".equals(action))
{
boolean statusUpdated =qaqcCallsService.ChangeStatusInErp(complaintNumber, remarks, action,Erpname);
System.out.println("statusUpdated="+statusUpdated);
if (!statusUpdated)
{
return ResponseEntity.ok("error");
}
}
// Execute common update methods
qaqcCallsService.updateComplaintDetails(complaintNumber, dataId, action,remarks,updated_agent);
qaqcCallsService.updateComplaintHistoryDetails(complaintNumber,dataId, action, remarks,updated_agent, remainderDate);
Map<String, Object> logDetails =qaqcCallsService.getComplaintDetails(dataId);
qaqcCallsService.uploadComplaintDetailsInLogs(logDetails, action,complaintNumber, remainderDate);
return ResponseEntity.ok("Success");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error");
}
}
@GetMapping("/getComplaintDetails")
public Map<String, Object> getComplaintDetails(@RequestParam String complaintNumber) {
Map<String, Object> resultMap = new HashMap<>();
try {
String url = "https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=getComplaintByID&ComplaintId="
+ complaintNumber + "&imgUrlonly=yes&isQcuser=Yes&jsonResp=Yes";
System.out.println("Request URL: " + url);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
String responseBody = responseEntity.getBody();
//System.out.println("Response Body: " + responseBody);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(responseBody);
JsonNode complaintDetails = rootNode.path(0).path("ComplaintListHistory").path(0);
String registerDate = complaintDetails.path("complaintopendate").asText("N/A");
String ClosedDate = complaintDetails.path("complaintcloseddate").asText("N/A");
String ReopenDate = complaintDetails.path("REOPENDDATE").asText("N/A");
String FinalcloseDate = complaintDetails.path("FINALCLOSEDDATE").asText("N/A");
//System.out.println("registerdate=====" + registerDate);
String formattedDate = "N/A"; // Default value if parsing fails
if (!registerDate.equals("N/A") && !registerDate.isEmpty()) {
try {
// Parse the input date string
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
Date date = inputFormat.parse(registerDate);
// Format the date to dd-MM-yyyy
SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
formattedDate = outputFormat.format(date);
} catch (Exception e) {
e.printStackTrace(); // Log exception for debugging
}
}
/*
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDateTime maxDate = Stream.of(registerDate, ClosedDate, ReopenDate, FinalcloseDate)
.filter(date -> date != null && !date.equalsIgnoreCase("null"))
.map(date -> {
try {
return LocalDateTime.parse(date, inputFormatter);
} catch (DateTimeParseException e) {
return null; // Skip invalid date formats
}
})
.filter(Objects::nonNull)
.max(LocalDateTime::compareTo) // Find the greatest date
.orElse(null); // Default to null if no valid dates are found
String greatestDateFormatted = (maxDate != null) ? maxDate.format(outputFormatter) : "N/A";
*/
SimpleDateFormat inputFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
SimpleDateFormat outputFormatter = new SimpleDateFormat("dd-MM-yyyy");
Date maxDate = null;
// Put all date strings into array
String[] dates = { registerDate, ClosedDate, ReopenDate, FinalcloseDate };
for (int i = 0; i < dates.length; i++) {
String dateStr = dates[i];
if (dateStr == null || "null".equalsIgnoreCase(dateStr)) {
continue;
}
try {
Date parsedDate = inputFormatter.parse(dateStr);
if (maxDate == null || parsedDate.after(maxDate)) {
maxDate = parsedDate;
}
} catch (ParseException e) {
// Ignore invalid date formats
}
}
String greatestDateFormatted =
(maxDate != null) ? outputFormatter.format(maxDate) : "N/A";
if (!complaintDetails.isMissingNode()) {
// Existing fields
resultMap.put("complaintid", complaintDetails.path("complaintid").asText("N/A"));
resultMap.put("complaintdate", formattedDate);
resultMap.put("complainantName", complaintDetails.path("CustomerName").asText("N/A"));
resultMap.put("mobileNumber", complaintDetails.path("CustomerMobile").asText("N/A"));
resultMap.put("complaintType", complaintDetails.path("complainttype").asText("N/A"));
resultMap.put("description", complaintDetails.path("complaintdetails").asText("N/A"));
resultMap.put("currentStatus", complaintDetails.path("complaintcurrentstatus").asText("N/A"));
resultMap.put("OfficialMobile", complaintDetails.path("OfficialMobile").asText("N/A"));
resultMap.put("Street", complaintDetails.path("Street").asText("N/A"));
resultMap.put("Area", complaintDetails.path("Area").asText("N/A"));
resultMap.put("Landmark", complaintDetails.path("Landmark").asText("N/A"));
resultMap.put("Location", complaintDetails.path("Location").asText("N/A"));
resultMap.put("Zone", complaintDetails.path("Zone").asText("N/A"));
resultMap.put("Division", complaintDetails.path("Division").asText("N/A"));
resultMap.put("gender", complaintDetails.path("GENDER").asText("N/A"));
resultMap.put("deptname", complaintDetails.path("DEPT_NAME").asText("N/A"));
resultMap.put("compmode", complaintDetails.path("COMP_MODE").asText("N/A"));
resultMap.put("greatestDate", greatestDateFormatted);
// Comments section
JsonNode comments = complaintDetails.path("Comments");
if (!comments.isMissingNode()) {
List<Map<String, Object>> commentList = new ArrayList<>();
for (JsonNode commentNode : comments) {
Map<String, Object> commentData = new HashMap<>();
// Extracting comment details
commentData.put("user", commentNode.path("user").asText("N/A"));
commentData.put("message", commentNode.path("message").asText("N/A"));
commentData.put("comment_date", commentNode.path("comment_date").asText("N/A"));
// Handling media link (Image) as part of userimages array for each comment
JsonNode userImages = commentNode.path("userimages");
if (!userImages.isMissingNode() && userImages.isArray() && userImages.size() > 0) {
String mediaLink = userImages.get(0).path("Comp_Image").asText(null);
// If media link is valid, add it to the comment data
if (mediaLink != null && !mediaLink.equals("null") && !mediaLink.isEmpty()) {
commentData.put("Comp_Image", mediaLink);
} else {
commentData.put("Comp_Image", "No image available");
}
} else {
commentData.put("Comp_Image", "No image available");
}
// Add the comment data to the list
commentList.add(commentData);
}
resultMap.put("comments", commentList);
}
// Handling media link (Image) as part of userimages array
String mediaLink = complaintDetails.path("mediaLink").asText(null);
List<Map<String, String>> userImagesList = new ArrayList<>();
Map<String, String> imageMap = new HashMap<>();
imageMap.put("Comp_Image", mediaLink != null && !mediaLink.equals("null") ? mediaLink : null);
userImagesList.add(imageMap);
resultMap.put("userimages", userImagesList);
//System.out.println("Image URL from API: " + mediaLink);
}
} else {
resultMap.put("error", "Failed to retrieve complaint details.");
}
} catch (Exception e) {
e.printStackTrace();
resultMap.put("error", "Error processing request");
}
return resultMap;
}
@GetMapping("/getComplaintDetailsByMobileNumber")
public Map<String, Object> getComplaintDetailsByMobileNumber(@RequestParam String complaintMobileNumber,
@RequestParam(required = false) String startDate, @RequestParam(required = false) String endDate,
@RequestParam String complaintYear) {
// System.out.println("Computed Start Date: " + startDate);
// System.out.println("Computed End Date: " + endDate);
// System.out.println("Computed Year: " + complaintYear);
// System.out.println("Computed MobileNumber: " + complaintMobileNumber);
Map<String, Object> resultMap = new HashMap<>();
List<Map<String, Object>> complaintsList = new ArrayList<>();
try {
// Determine current year's starting date and today's date
LocalDate currentDate = LocalDate.now();
LocalDate yearStartDate = currentDate.withDayOfYear(1);
// Set default dates if startDate or endDate are empty
if (startDate == null || startDate.isEmpty()) {
startDate = yearStartDate.toString(); // Set to current year's start date
}
if (endDate == null || endDate.isEmpty()) {
endDate = currentDate.toString(); // Set to today's date
}
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
startDate = LocalDate.parse(startDate, inputFormatter).format(outputFormatter);
endDate = LocalDate.parse(endDate, inputFormatter).format(outputFormatter);
// Debug logs (optional)
// System.out.println("Formatted Start Date: " + startDate);
// System.out.println("Formatted End Date: " + endDate);
String url = "https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=getComplaintListWithImg&From_date="
+ startDate + "&To_date=" + endDate
+ "&jsonResp=Yes&UserType=Public&Token=&PageIndex=null&Status=null&repYear=" + complaintYear
+ "&MobileNo=" + complaintMobileNumber;
System.out.println("Request URL: " + url);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
String responseBody = responseEntity.getBody();
// System.out.println("Response Body: " + responseBody);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(responseBody);
JsonNode complaintListHistory = rootNode.path(0).path("ComplaintListHistory");
if (complaintListHistory.isArray()) {
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy");
for (JsonNode complaintDetails : complaintListHistory) {
Map<String, Object> complaintMap = new HashMap<>();
String registerDate = complaintDetails.path("complaintopendate").asText("N/A");
Date parsedDate = null;
if (!registerDate.equals("N/A") && !registerDate.isEmpty() && !"null".equalsIgnoreCase(registerDate)) {
try {
parsedDate = inputFormat.parse(registerDate);
String formattedDate = outputFormat.format(parsedDate);
complaintMap.put("complaintdate", formattedDate);
} catch (Exception e) {
e.printStackTrace();
complaintMap.put("complaintdate", "N/A");
}
} else {
complaintMap.put("complaintdate", "N/A");
}
// Add complaint details to the map
complaintMap.put("complaintid", complaintDetails.path("complaintid").asText("N/A"));
complaintMap.put("complainantName", complaintDetails.path("CustomerName").asText("N/A"));
complaintMap.put("mobileNumber", complaintDetails.path("CustomerMobile").asText("N/A"));
complaintMap.put("complaintType", complaintDetails.path("complainttype").asText("N/A"));
complaintMap.put("currentStatus",complaintDetails.path("complaintcurrentstatus").asText("N/A"));
complaintMap.put("OfficialMobile", complaintDetails.path("OfficialMobile").asText("N/A"));
complaintMap.put("Street", complaintDetails.path("Street").asText("N/A"));
complaintMap.put("Area", complaintDetails.path("Area").asText("N/A"));
complaintMap.put("Landmark", complaintDetails.path("Landmark").asText("N/A"));
complaintMap.put("Location", complaintDetails.path("Location").asText("N/A"));
complaintMap.put("Zone", complaintDetails.path("Zone").asText("N/A"));
complaintMap.put("Division", complaintDetails.path("Division").asText("N/A"));
String closedDate = complaintDetails.path("complaintcloseddate").asText("N/A");
// Check if the value is explicitly "null" (as a string)
if ("null".equalsIgnoreCase(closedDate)) {
closedDate = "N/A";
}
complaintMap.put("complaintcloseddate", closedDate);
complaintMap.put("parsedComplaintDate", parsedDate);
// Add the complaint to the list
complaintsList.add(complaintMap);
}
// Sort complaintsList by parsedComplaintDate in descending order
complaintsList.sort((a, b) -> {
Date dateA = (Date) a.get("parsedComplaintDate");
Date dateB = (Date) b.get("parsedComplaintDate");
if (dateA == null && dateB == null) return 0;
if (dateA == null) return 1;
if (dateB == null) return -1;
return dateB.compareTo(dateA);
});
for (Map<String, Object> complaint : complaintsList) {
complaint.remove("parsedComplaintDate");
}
}
resultMap.put("status", "success");
resultMap.put("complaints", complaintsList);
} else {
resultMap.put("status", "error");
resultMap.put("message", "Failed to retrieve complaint details.");
}
} catch (Exception e) {
e.printStackTrace();
resultMap.put("status", "error");
resultMap.put("message", "Error processing request");
}
return resultMap;
}
@GetMapping("/getqcsubmittedcalls")
public List<Map<String, Object>> getSubmittedList(@RequestParam int userId)
{
return qaqcCallsService.getSubmitDetails(userId);
}
/*
* System.out.println("Computed Start Date: " + startDate);
* System.out.println("Computed End Date: " + endDate);
* System.out.println("Computed Year: " + complaintYear);
* System.out.println("Computed MobileNumber: " + complaintMobileNumber);
*
* String url
* ="https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=getComplaintListWithImg&From_date="
* +startDate+"&To_date="+endDate+
* "&jsonResp=Yes&UserType=Public&Token=&PageIndex=null&Status=null&repYear="+
* complaintYear+"&MobileNo="+complaintMobileNumber;
*
* System.out.println("Request URL: " + url);
*
*/
}

38
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcPgrComplaintsMainController.java

@ -0,0 +1,38 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAgentsService;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/callcenterqaqccomplaintsregistration")
@Controller("callCenterQaQcComplaintsRegistrationController")
public class QaqcPgrComplaintsMainController {
@Autowired
private QaqcAgentsService agentsService;
@GetMapping("/pgrcomplaint")
public String viewPGRpage(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("userId",userId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
return "modules/callcenterqaqc/pgrcomplaints";
}
}

68
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/QaqcTaskListAPIController.java

@ -0,0 +1,68 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
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 org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAdminSettingService;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcTaskListService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@RequestMapping("gcc/api/callcenterqaqc/qaqctasklist")
@RestController
public class QaqcTaskListAPIController {
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public QaqcTaskListAPIController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@Autowired
private QaqcTaskListService tasklist;
@GetMapping("/overalltaskcount")
public List<Map<String, Object>> getComplaintAndCallStatusCounts(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
List<Map<String, Object>> counts = tasklist.getComplaintAndCallStatusCounts(startDate, endDate);
//System.out.println("overallcounts:" + counts);
return counts;
}
@GetMapping("/taskdatacount")
public List<Map<String, Object>> getTaskwiseData(
@RequestParam(required = false) String startDate,
@RequestParam(required = false) String endDate) {
List<Map<String, Object>> taskdata = tasklist.getTaskwiseData(startDate, endDate);
//System.out.println("taskdata "+ taskdata);
return taskdata;
}
@GetMapping("/agentdatacount")
public List<Map<String, Object>> getAgentwiseData(@RequestParam String qaqc_id)
{
List<Map<String, Object>> agentwisedata = tasklist.getAgentwiseData(qaqc_id);
//System.out.println("agentdata "+agentwisedata);
return agentwisedata;
}
}

58
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ReportsMainController.java

@ -0,0 +1,58 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/callcenterqaqcreports")
@Controller("callCenterQaQcReportsController")
public class ReportsMainController {
@GetMapping("/overallreport")
public String viewOverallReports(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
return "modules/callcenterqaqc/overallreport";
}
@GetMapping("/qaqctasklist")
public String viewqaqctasklist(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/callcenterqaqc/qaqctasklist";
}
@GetMapping("/qaqcagentperformance")
public String viewAgentPerformance(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(LoginUserId);
model.addAttribute("LoginUserId",LoginUserId);
String agent_name=LoginUserInfo.getCurrentUserDetails().getUsername();
model.addAttribute("agent_name", agent_name);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/callcenterqaqc/qaqcagentperformance";
}
}

563
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ScpApiController.java

@ -0,0 +1,563 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.ScpService;
@RestController
@RequestMapping("/gcc/api/scp")
public class ScpApiController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private ObjectMapper objectMapper;
@Autowired
private ScpService scpservice;
@GetMapping("/getdatabyfilters")
public Map<String, Object> getdatabyfilters(
@RequestParam String startDate,
@RequestParam String endDate,
@RequestParam String zone,
@RequestParam String ward) {
Map<String, Object> response = new HashMap<>();
try {
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
String formattedStartDate = LocalDate.parse(startDate, inputFormat).format(outputFormat);
String formattedEndDate = LocalDate.parse(endDate, inputFormat).format(outputFormat);
// Build API URL
String apiUrl = "https://gccservices.in/gccofficialapp/api/asset/scpfilterReports"
+ "?assetTypeId=2"
+ "&fromDate=" + formattedStartDate
+ "&toDate=" + formattedEndDate
+ "&loginId=5662";
if (!zone.isEmpty()) {
apiUrl += "&zone=" + zone;
}
if (!ward.isEmpty()) {
apiUrl += "&ward=" + ward;
}
System.out.println("apiUrl=" + apiUrl);
// Call the external API
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> apiResponse = restTemplate.getForEntity(apiUrl, String.class);
if (apiResponse.getStatusCode().is2xxSuccessful() && apiResponse.getBody() != null) {
ObjectMapper mapper = new ObjectMapper();
// Parse full JSON
JsonNode rootNode = mapper.readTree(apiResponse.getBody());
// Extract "scpreport" array
JsonNode reportNode = rootNode.path("scpreport");
if (reportNode.isMissingNode() || !reportNode.isArray() || reportNode.size() == 0) {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
} else {
// Convert JSON array → List<Map<String, Object>>
List<Map<String, Object>> reportList = mapper.convertValue(
reportNode,
new TypeReference<List<Map<String, Object>>>() {}
);
response.put("status", "success");
response.put("data", reportList);
if(zone.isEmpty() && ward.isEmpty()) {
response.put("table", "table1");
}
else if(ward.isEmpty() && !zone.isEmpty()) {
response.put("table", "table2");
}
else if(!ward.isEmpty() && !zone.isEmpty()) {
response.put("table", "table3");
}
}
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
@GetMapping("/getzones")
public ResponseEntity<Map<String, Object>> getzones() {
String apiUrl = "https://gccservices.in/gccrestservices/dropdown/api/zone";
Map<String, Object> responseMap = new HashMap<>();
try {
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(apiUrl, String.class);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootArray = objectMapper.readTree(response);
// ✅ The response is an array, so get the first element
if (rootArray.isArray() && rootArray.size() > 0) {
JsonNode firstObject = rootArray.get(0);
boolean status = firstObject.path("status").asBoolean(false);
if (status) {
JsonNode dataArray = firstObject.path("data");
responseMap.put("status", "success");
responseMap.put("code", 200);
responseMap.put("message", "Data found");
responseMap.put("data", objectMapper.convertValue(
dataArray, new TypeReference<List<Map<String, Object>>>() {}));
return ResponseEntity.ok(responseMap);
} else {
responseMap.put("status", "failure");
responseMap.put("code", 404);
responseMap.put("message", "No Zones found");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(responseMap);
}
} else {
responseMap.put("status", "failure");
responseMap.put("code", 404);
responseMap.put("message", "Invalid response format");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(responseMap);
}
} catch (Exception ex) {
responseMap.put("status", "error");
responseMap.put("code", HttpStatus.INTERNAL_SERVER_ERROR.value());
responseMap.put("message", "Unexpected error occurred");
responseMap.put("details", ex.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseMap);
}
}
@GetMapping("/getwardbyzone")
public ResponseEntity<Map<String, Object>> getwardbyzone( @RequestParam String zone) {
String apiUrl = "https://gccservices.in/gccrestservices/dropdown/api/wardbyzone?zoneId="+zone;
Map<String, Object> responseMap = new HashMap<>();
try {
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(apiUrl, String.class);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootArray = objectMapper.readTree(response);
// ✅ The response is an array, so get the first element
if (rootArray.isArray() && rootArray.size() > 0) {
JsonNode firstObject = rootArray.get(0);
boolean status = firstObject.path("status").asBoolean(false);
if (status) {
JsonNode dataArray = firstObject.path("data");
responseMap.put("status", "success");
responseMap.put("code", 200);
responseMap.put("message", "Data found");
responseMap.put("data", objectMapper.convertValue(
dataArray, new TypeReference<List<Map<String, Object>>>() {}));
return ResponseEntity.ok(responseMap);
} else {
responseMap.put("status", "failure");
responseMap.put("code", 404);
responseMap.put("message", "No Zones found");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(responseMap);
}
} else {
responseMap.put("status", "failure");
responseMap.put("code", 404);
responseMap.put("message", "Invalid response format");
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(responseMap);
}
} catch (Exception ex) {
responseMap.put("status", "error");
responseMap.put("code", HttpStatus.INTERNAL_SERVER_ERROR.value());
responseMap.put("message", "Unexpected error occurred");
responseMap.put("details", ex.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(responseMap);
}
}
@GetMapping("/getstreetdetails")
public Map<String, Object> getstreetdetails(
@RequestParam String startDate,
@RequestParam String endDate,
@RequestParam String variable) {
Map<String, Object> response = new HashMap<>();
try {
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
String formattedStartDate = LocalDate.parse(startDate, inputFormat).format(outputFormat);
String formattedEndDate = LocalDate.parse(endDate, inputFormat).format(outputFormat);
// 🔹 Call external API
String apiUrl = "https://gccservices.in/gccofficialapp/api/asset/scpReportAssetList"
+ "?assetTypeId=2"
+ "&fromDate=" + formattedStartDate
+ "&toDate=" + formattedEndDate
+ "&loginId=5662"
+ "&status=Cleaned"
+ "&streetid=" + variable;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> apiResponse = restTemplate.getForEntity(apiUrl, String.class);
List<Map<String, Object>> reportData = new ArrayList<>();
if (apiResponse.getStatusCode().is2xxSuccessful() && apiResponse.getBody() != null) {
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(apiResponse.getBody());
JsonNode reportNode = rootNode.path("scpreport");
if (reportNode.isArray() && reportNode.size() > 0) {
reportData = mapper.convertValue(
reportNode,
new TypeReference<List<Map<String, Object>>>() {}
);
}
}
if (reportData.isEmpty()) {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
} else {
// 🔹 Enrich each data item with questions_part
List<Map<String, Object>> enrichedData = scpservice.enrichScpReportWithQuestions(reportData);
response.put("status", "success");
response.put("data", enrichedData);
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
// @PostMapping("/saveanswer")
// public ResponseEntity<Map<String, Object>> saveAnswer(@RequestBody List<Map<String, Object>> answers) {
// Map<String, Object> response = new HashMap<>();
//
// try {
// boolean success = scpservice.saveAnswers(answers);
// if (success) {
// response.put("status", "success");
// response.put("message", "Feedback submitted successfully!");
// return ResponseEntity.ok(response);
// } else {
// response.put("status", "error");
// response.put("message", "Fail to Save.");
// return ResponseEntity.status(500).body(response);
// }
// } catch (Exception e) {
// e.printStackTrace();
// response.put("status", "error");
// response.put("message", "Exception: " + e.getMessage());
// return ResponseEntity.status(500).body(response);
// }
// }
@PostMapping("/saveanswer")
public ResponseEntity<Map<String, Object>> saveAnswer(@RequestBody List<Map<String, Object>> answers) {
Map<String, Object> response = new HashMap<>();
try {
String result = scpservice.saveAnswers(answers);
if ("success".equals(result)) {
response.put("status", "success");
response.put("message", "Feedback submitted successfully!");
return ResponseEntity.ok(response);
} else if ("duplicate".equals(result)) {
response.put("status", "duplicate");
response.put("message", "Already submitted by another one, So refresh the page");
return ResponseEntity.ok(response);
} else {
response.put("status", "error");
response.put("message", "Fail to Save.");
return ResponseEntity.ok(response);
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", "Exception: " + e.getMessage());
return ResponseEntity.status(500).body(response);
}
}
@GetMapping("/getreportdatabyfilters")
public Map<String, Object> getreportdatabyfilters(
@RequestParam String startDate,
@RequestParam String endDate,
@RequestParam String zone,
@RequestParam String ward) {
Map<String, Object> response = new HashMap<>();
try {
DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");
String formattedStartDate = LocalDate.parse(startDate, inputFormat).format(outputFormat);
String formattedEndDate = LocalDate.parse(endDate, inputFormat).format(outputFormat);
// Build API URL
String apiUrl = "https://gccservices.in/gccofficialapp/api/asset/scpfilterReports"
+ "?assetTypeId=2"
+ "&fromDate=" + formattedStartDate
+ "&toDate=" + formattedEndDate
+ "&loginId=5662";
if (!zone.isEmpty()) {
apiUrl += "&zone=" + zone;
}
if (!ward.isEmpty()) {
apiUrl += "&ward=" + ward;
}
System.out.println("apiUrl=" + apiUrl);
// Call the external API
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> apiResponse = restTemplate.getForEntity(apiUrl, String.class);
if (apiResponse.getStatusCode().is2xxSuccessful() && apiResponse.getBody() != null) {
ObjectMapper mapper = new ObjectMapper();
// Parse full JSON
JsonNode rootNode = mapper.readTree(apiResponse.getBody());
// Extract "scpreport" array
JsonNode reportNode = rootNode.path("scpreport");
if (reportNode.isMissingNode() || !reportNode.isArray() || reportNode.size() == 0) {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
} else {
// Convert JSON array → List<Map<String, Object>>
List<Map<String, Object>> reportList = mapper.convertValue(
reportNode,
new TypeReference<List<Map<String, Object>>>() {}
);
// Declare dbMap outside conditional blocks
Map<String, Map<String, Object>> dbMap = new HashMap<>();
List<Map<String, Object>> dbList = new ArrayList<>();
/*
// Fetch DB data based on filters
if (zone.isEmpty() && ward.isEmpty()) {
dbList = scpservice.getZoneWiseReportData();
dbMap = dbList.stream().collect(Collectors.toMap(
row -> String.valueOf(row.get("zone")),
row -> row
));
} else if (ward.isEmpty() && !zone.isEmpty()) {
dbList = scpservice.getWardWiseReportData(zone);
dbMap = dbList.stream().collect(Collectors.toMap(
row -> String.valueOf(row.get("ward")),
row -> row
));
} else if (!ward.isEmpty() && !zone.isEmpty()) {
dbList = scpservice.getStreetWiseReportData(zone, ward);
dbMap = dbList.stream().collect(Collectors.toMap(
row -> String.valueOf(row.get("streetid")),
row -> row
));
}
*/
// Fetch DB data based on filters
if (zone.isEmpty() && ward.isEmpty()) {
dbList = scpservice.getZoneWiseReportData();
for (Map<String, Object> row : dbList) {
String key = String.valueOf(row.get("zone"));
dbMap.put(key, row);
}
} else if (ward.isEmpty() && !zone.isEmpty()) {
dbList = scpservice.getWardWiseReportData(zone);
for (Map<String, Object> row : dbList) {
String key = String.valueOf(row.get("ward"));
dbMap.put(key, row);
}
} else if (!ward.isEmpty() && !zone.isEmpty()) {
dbList = scpservice.getStreetWiseReportData(zone, ward);
for (Map<String, Object> row : dbList) {
String key = String.valueOf(row.get("streetid"));
dbMap.put(key, row);
}
}
// Merge API data with DB data
// Merge API data with DB data
for (int i = 0; i < reportList.size(); i++) {
Map<String, Object> apiRow = reportList.get(i);
String variableValue = String.valueOf(apiRow.get("VARIABLE"));
boolean isLast = (i == reportList.size() - 1); // check if it's the last element
if (dbMap.containsKey(variableValue)) {
Map<String, Object> dbRow = dbMap.get(variableValue);
apiRow.put("Completed", dbRow.get("Completed"));
apiRow.put("Yes", dbRow.get("YesCount"));
apiRow.put("No", dbRow.get("NoCount"));
apiRow.put("Available", dbRow.get("AvailableCount"));
apiRow.put("Not Available", dbRow.get("NotAvailableCount"));
apiRow.put("Image Not Clear", dbRow.get("ImageNotClearCount"));
apiRow.put("LidGoodYesCount", dbRow.get("LidGoodYesCount"));
apiRow.put("LidGoodNoCount", dbRow.get("LidGoodNoCount"));
} else {
// If last list → use "-"
if (isLast) {
apiRow.put("Completed", "-");
apiRow.put("Yes", "-");
apiRow.put("No", "-");
apiRow.put("Available", "-");
apiRow.put("Not Available", "-");
apiRow.put("Image Not Clear", "-");
apiRow.put("LidGoodYesCount", "-");
apiRow.put("LidGoodNoCount", "-");
} else {
// For all others → use 0
apiRow.put("Completed", 0);
apiRow.put("Yes", 0);
apiRow.put("No", 0);
apiRow.put("Available", 0);
apiRow.put("Not Available", 0);
apiRow.put("Image Not Clear", 0);
apiRow.put("LidGoodYesCount", 0);
apiRow.put("LidGoodNoCount", 0);
}
}
}
response.put("status", "success");
response.put("data", reportList);
if(zone.isEmpty() && ward.isEmpty()) {
response.put("table", "table1");
}
else if(ward.isEmpty() && !zone.isEmpty()) {
response.put("table", "table2");
}
else if(!ward.isEmpty() && !zone.isEmpty()) {
response.put("table", "table3");
}
}
} else {
response.put("status", "nodata");
response.put("data", Collections.emptyList());
}
} catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
@GetMapping("/getdetailreportdata")
public Map<String, Object> getDetailreportdatabyfilters(
@RequestParam String startDate,
@RequestParam String endDate) {
Map<String, Object> response = new HashMap<>();
try {
List<Map<String,Object>> list=scpservice.getdetailreport(startDate,endDate);
if(list.isEmpty()) {
response.put("status", "nodata");
response.put("message", "No Data");
}
else {
response.put("status", "success");
response.put("data", list);
response.put("message", "Fetched Data Successfully");
}
}
catch (Exception e) {
e.printStackTrace();
response.put("status", "error");
response.put("message", e.getMessage());
}
return response;
}
}

55
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/ScpMaincontroller.java

@ -0,0 +1,55 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.QaqcAgentsService;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/callcenterqaqcscp")
@Controller("callCenterQaQcScpController")
public class ScpMaincontroller {
@Autowired
private QaqcAgentsService agentsService;
@GetMapping("/scpverification")
public String viewDomesticWastepage(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("userId",userId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
return "modules/callcenterqaqc/scpverification";
}
@GetMapping("/scpreport")
public String viewReportPage(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("userId",userId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
List<Map<String, Object>> agent=agentsService.getAgentName(userId);
model.addAttribute("agent", agent);
return "modules/callcenterqaqc/scpreport";
}
}

352
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/SocialMediaApiController.java

@ -0,0 +1,352 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.SocialMediaService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@RequestMapping("gcc/api/callcenterqaqc/socialmedia")
@RestController
public class SocialMediaApiController {
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public SocialMediaService socialservice;
@Autowired
public SocialMediaApiController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@PostMapping("/update")
@ResponseBody
public ResponseEntity<String> updateCallDetails(@RequestParam("complaintNumber") String complaintNumber,
@RequestParam("userId") String userId,@RequestParam("action") String action,@RequestParam("remarks") String remarks
) {
try {
// System.out.println("Updating Complaint Number: " + complaintNumber);
// System.out.println("userId= " + userId);
// System.out.println("action= " + action);
// System.out.println("remarks="+remarks);
int updated_agent = Integer.parseInt(userId);
// System.out.println("updated_agent: " + updated_agent);
if(remarks.isEmpty())
{
remarks="N/A";
}
String erp_name=socialservice.getErpusernamebyId(userId);
// System.out.println("erp_name=="+erp_name);
if (erp_name.isEmpty()) {
return ResponseEntity.ok("erpname");
}
if ("COMPLETED".equals(action) || "REOPEN".equals(action))
{
boolean statusUpdated =ChangeStatusInErp(complaintNumber,action,remarks,erp_name);
System.out.println("statusUpdated="+statusUpdated);
if (!statusUpdated)
{
return ResponseEntity.ok("error");
}
}
Map<String, Object> details =getDetailsByComplaintNumber(complaintNumber);
int rowInserted=socialservice.uploadComplaintDetailsInLogs(details,action,remarks,updated_agent);
if(rowInserted!=1)
{
return ResponseEntity.ok("save");
}
return ResponseEntity.ok("Success");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error");
}
}
public Map<String, Object> getDetailsByComplaintNumber(String complaintNumber) {
Map<String, Object> resultMap = new HashMap<>();
try {
String url = "https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=getComplaintByID&ComplaintId="
+ complaintNumber + "&imgUrlonly=yes";
System.out.println("Request URL: " + url);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
String responseBody = responseEntity.getBody();
//System.out.println("Response Body: " + responseBody);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(responseBody);
JsonNode complaintDetails = rootNode.path(0).path("ComplaintListHistory").path(0);
String registerDate=complaintDetails.path("complaintopendate").asText("N/A");
//System.out.println("registerdate====="+registerDate);
String formattedDate = "N/A"; // Default value if parsing fails
if (!registerDate.equals("N/A") && !registerDate.isEmpty()) {
try {
// Parse the input date string
SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
Date date = inputFormat.parse(registerDate);
// Format the date to dd-MM-yyyy
SimpleDateFormat outputFormat = new SimpleDateFormat("dd-MM-yyyy");
formattedDate = outputFormat.format(date);
} catch (Exception e) {
e.printStackTrace(); // Log exception for debugging
}
}
if (!complaintDetails.isMissingNode()) {
// Existing fields
resultMap.put("complaintid", complaintDetails.path("complaintid").asText("N/A"));
resultMap.put("complaintdate", formattedDate);
resultMap.put("complainantName", complaintDetails.path("CustomerName").asText("N/A"));
resultMap.put("mobileNumber", complaintDetails.path("CustomerMobile").asText("N/A"));
resultMap.put("complaintType", complaintDetails.path("complainttype").asText("N/A"));
resultMap.put("description", complaintDetails.path("complaintdetails").asText("N/A"));
resultMap.put("currentStatus", complaintDetails.path("complaintcurrentstatus").asText("N/A"));
resultMap.put("Street", complaintDetails.path("Street").asText("N/A"));
resultMap.put("Area", complaintDetails.path("Area").asText("N/A"));
resultMap.put("Landmark", complaintDetails.path("Landmark").asText("N/A"));
resultMap.put("Location", complaintDetails.path("Location").asText("N/A"));
resultMap.put("Zone", complaintDetails.path("Zone").asText("N/A"));
resultMap.put("Division", complaintDetails.path("Division").asText("N/A"));
resultMap.put("OfficialMobile", complaintDetails.path("OfficialMobile").asText("N/A"));
resultMap.put("gender", complaintDetails.path("GENDER").asText("N/A"));
resultMap.put("deptname",complaintDetails.path("DEPT_NAME").asText("N/A"));
resultMap.put("compmode", complaintDetails.path("COMP_MODE").asText("N/A"));
resultMap.put("Officialname", complaintDetails.path("Officialname").asText("N/A"));
}
} else {
resultMap.put("error", "Failed to retrieve complaint details.");
}
} catch (Exception e) {
e.printStackTrace();
resultMap.put("error", "Error processing request");
}
return resultMap;
}
public boolean ChangeStatusInErp(String complaintNumber,String action ,String remarks,String erp_name) {
String baseUrl = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?";
String status = "";
//String Erpname ="QAops1";
try {
// Encode parameters
String encodedComplaintNumber = URLEncoder.encode(complaintNumber, StandardCharsets.UTF_8.toString()).replace("+", "%20");
String encodedRemarks = URLEncoder.encode(remarks, StandardCharsets.UTF_8.toString()).replace("+", "%20");
String encodedErpname = URLEncoder.encode(erp_name, StandardCharsets.UTF_8.toString()).replace("+", "%20");
// Determine status based on action
if ("COMPLETED".equals(action)) {
status = "11";
} else if ("REOPEN".equals(action)) {
status = "9";
} else {
return false; // Invalid action, return false
}
// Construct the URL
String urlString = baseUrl
+ "serviceId=UpdateComplaint"
+ "&ComplaintId=" + encodedComplaintNumber
+ "&Message=" + encodedRemarks
+ "&UserType=Official"
+ "&Status=" + status
+ "&Comp_Image="
+ "&erp_username=" + encodedErpname;
System.out.println("ERP Hitting URL="+urlString);
// Send the request
return sendRequest(urlString);
// return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private boolean sendRequest(String urlString) {
try {
URL url = new URL(urlString);
URLConnection urlcon = url.openConnection();
InputStream stream = urlcon.getInputStream();
StringBuilder responseBuilder = new StringBuilder();
int i;
while ((i = stream.read()) != -1) {
responseBuilder.append((char) i);
}
stream.close();
// Parse the response
String response = responseBuilder.toString();
//System.out.println("Raw Response: " + response);
// Check ResultStatus in the response
if (response.contains("\"ResultStatus\": true")) {
//System.out.println("ResultStatus is true in the response.");
return true;
} else {
System.out.println("ResultStatus is false or not present in the response.");
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@GetMapping("/getsocialmediacomps")
public Map<String, Object> viewSocialMediaData(
@RequestParam String startDate,
@RequestParam String endDate,
@RequestParam String status,
@RequestParam String group,
@RequestParam String type,
@RequestParam String zone,
@RequestParam String region) {
Map<String, Object> response = new HashMap<>();
try {
LocalDate fromLocalDate = LocalDate.parse(startDate, DateTimeFormatter.ISO_DATE);
LocalDate toLocalDate = LocalDate.parse(endDate, DateTimeFormatter.ISO_DATE);
String formattedFromDate = fromLocalDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
String formattedToDate = toLocalDate.format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
String mode="SOCIAL MEDIA";
String encoded_mode=URLEncoder.encode(mode, StandardCharsets.UTF_8.toString()).replace("+", "%20");
//String url="https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=ms_dashboard_details&From_date="+formattedFromDate+"&To_date="+formattedToDate+"&jsonResp=Yes&Status="+status+"&isQcuser=Yes"+"&ComplaintType="+type+"&ComplaintGroupId="+group+"&compmode="+encoded_mode+"&Zoneid="+zone;
//String url="https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=ms_dashboard_details&From_date="+formattedFromDate+"&To_date="+formattedToDate+"&jsonResp=Yes&Status="+status+"&isQcuser=Yes"+"&ComplaintType="+type+"&ComplaintGroupId="+group+"&compmode="+mode+"&Zoneid="+zone;
String url="https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=ms_dashboard_details&From_date="+formattedFromDate+"&To_date="+formattedToDate+"&jsonResp=Yes&Status="+status+"&isQcuser=Yes"+"&ComplaintType="+type+"&ComplaintGroupId="+group+"&compmode="+mode+"&Zoneid="+zone+"&RegionId="+region;
System.out.println(url);
RestTemplate restTemplate = new RestTemplate();
// Fetch response as String
ResponseEntity<String> responses = restTemplate.getForEntity(url, String.class);
String rawResponse = responses.getBody();
// Preprocess response to remove invalid characters if needed
if (rawResponse != null) {
//rawResponse = rawResponse.replaceAll("\"\"", "\""); // Replace double-double quotes
//rawResponse = rawResponse.replaceAll("(?<![,{])\"R", "\"R"); // Example: Fix missing commas
}
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> responseMap = objectMapper.readValue(rawResponse, Map.class);
List<Map<String, Object>> details = (List<Map<String, Object>>) responseMap.get("Details");
//System.out.println(details);
if (details == null) {
response.put("status", "nodata");
response.put("message", "No Data, please change criteria");
}
else {
response.put("status", "success");
response.put("details", details);
}
}
catch (Exception e) {
response.put("status", "error");
response.put("message", "An error occurred while fetching data.");
e.printStackTrace();
}
return response;
}
@GetMapping("/socialmediacompletedlist")
public Map<String, Object> viewSocialMediaCompletedData(
@RequestParam String startDate,
@RequestParam String endDate, @RequestParam String status,
@RequestParam String zone) {
System.out.printf("==================="+startDate,endDate,zone);
Map<String, Object> response = new HashMap<>();
try {
LocalDate fromLocalDate = LocalDate.parse(startDate, DateTimeFormatter.ISO_DATE);
LocalDate toLocalDate = LocalDate.parse(endDate, DateTimeFormatter.ISO_DATE);
String formattedFromDate = fromLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
String formattedToDate = toLocalDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
List<Map<String, Object>> details= socialservice.getdetails(formattedFromDate,formattedToDate,status,zone);
if(details==null)
{
response.put("status", "nodata");
response.put("message", "No data for Selected filter");
}
else {
response.put("status", "success");
response.put("details", details);
}
}
catch (DateTimeParseException e) {
response.put("status", "error");
response.put("message", "Invalid date format. Please use 'yyyy-MM-dd'.");
e.printStackTrace();
}
catch (Exception e) {
response.put("status", "error");
response.put("message", "An error occurred while fetching data.");
e.printStackTrace();
}
return response;
}
}

41
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/SocialMediaMainController.java

@ -0,0 +1,41 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/callcenterqaqcsocialmedia")
@Controller("callCenterQaQcSocialMediaController")
public class SocialMediaMainController {
@GetMapping("/socialmediacomplaints")
public String viewSocialMediaComplaints(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("userId", userId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
return "modules/callcenterqaqc/socialmediacomplaints";
}
@GetMapping("/smfinishedcomplaints")
public String viewSocialMediaCompletedComplaints(Model model) {
String loginUserId = LoginUserInfo.getLoginUserId();
int userId = Integer.parseInt(loginUserId);
model.addAttribute("LoginUserId", loginUserId);
model.addAttribute("userId", userId);
model.addAttribute("agent_name", LoginUserInfo.getCurrentUserDetails().getUsername());
model.addAttribute("UserRole", LoginUserInfo.getUserRole());
return "modules/callcenterqaqc/socialmediacompletedlist";
}
}

82
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/StatusCountController.java

@ -0,0 +1,82 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.StatusCountService;
@RequestMapping("gcc/api/callcenterqaqc")
@RestController
public class StatusCountController {
@Autowired
private StatusCountService statusCountService;
@Autowired
public StatusCountController(StatusCountService statusCountService) {
this.statusCountService = statusCountService;
}
@GetMapping("/dashboard")
public ResponseEntity<Map<String, Object>> getDashboardData(
@RequestParam(value = "startDate", required = false, defaultValue = "") String fromDate,
@RequestParam(value = "endDate", required = false, defaultValue = "") String toDate,
@RequestParam(value = "dropdown1", required = false, defaultValue = "") String compType,
@RequestParam(value = "dropdown2", required = false, defaultValue = "") String zoneName,
@RequestParam(value = "dropdown3", required = false,defaultValue = "") String compMode,
@RequestParam(value = "dropdown4", required = false, defaultValue = "") String compGroup,
@RequestParam(value = "regiondropdown", required = false, defaultValue = "") String region) {
Map<String, Object> counts = statusCountService.fetchComplaintCounts(fromDate, toDate, compType, zoneName, compMode, compGroup,region);
//System.out.println("counts:" + counts);
//System.out.println("group:" + compGroup);
return ResponseEntity.ok(counts);
}
@GetMapping("/getComplaintTypesByGroup")
public ResponseEntity<List<String>> getComplaintTypesByGroup(@RequestParam String group) {
List<String> complaintTypes = statusCountService.fetchComplaintTypes(group);
return ResponseEntity.ok(complaintTypes);
}
@GetMapping("/getComplaintGroup")
public ResponseEntity<List<String>> getComplaintGroup() {
List<String> complaintGroup= statusCountService.fetchComplaintGroup();
//System.out.println("types:"+complaintTypes);
return ResponseEntity.ok(complaintGroup);
}
@GetMapping("/getModes")
public ResponseEntity<List<String>> getModes() {
List<String> modes= statusCountService.fetchModes();
//System.out.println("types:"+modes);
return ResponseEntity.ok(modes);
}
@GetMapping("/getZones")
public ResponseEntity<List<String>> getZones() {
List<String> zones= statusCountService.fetchZones();
//System.out.println("types:"+zones);
return ResponseEntity.ok(zones);
}
}

27
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/controller/WhatsappController.java

@ -0,0 +1,27 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.callcenterqaqc.service.WhatsappqaqcMsgService;
@RestController("callcenterqaqcwhatsapp")
@RequestMapping("/gcc/qaqc/api/whatsapp")
public class WhatsappController {
@Autowired
private WhatsappqaqcMsgService whatsappqaqcMsgService;
@PostMapping("/send-whatsapp-message")
public ResponseEntity<String> sendWhatsAppMessage(@RequestParam String msgUrl,@RequestParam String tamilmsgUrl) {
String response = whatsappqaqcMsgService.sendMsg(msgUrl,tamilmsgUrl);
return ResponseEntity.ok(response);
}
}

95
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/ComplaintService.java

@ -0,0 +1,95 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.sql.DataSource;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.naming.java.javaURLContextFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class ComplaintService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
private final String baseUrl = "https://erp.chennaicorporation.gov.in/pgr/newmobileservice";
public String fetchComplaintCategories() {
RestTemplate restTemplate = new RestTemplate();
String url = baseUrl + "?serviceId=getComplCategory&ComplaintGroupId=null";
return restTemplate.getForObject(url, String.class);
}
public String fetchComplaintSubTypes(String groupId) {
RestTemplate restTemplate = new RestTemplate();
String url = baseUrl + "?serviceId=getComplCategory&ComplaintGroupId=" + groupId;
return restTemplate.getForObject(url, String.class);
}
public List<Map<String, Object>> fetchComplaintDetailsById(String complaintId) {
RestTemplate restTemplate = new RestTemplate();
String url = baseUrl + "?serviceId=getComplaintByID&ComplaintId=" + complaintId;
String response = restTemplate.getForObject(url, String.class);
try {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(response, new TypeReference<List<Map<String, Object>>>() {
});
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public List<Map<String, Object>> fetchComplaintDetailsByMobile(String mobileNo) {
RestTemplate restTemplate = new RestTemplate();
String url = baseUrl
+ "?serviceId=getComplaintListWithImg&From_date=01/01/2024&To_date=20/08/2024&jsonResp=Yes&UserType=Public&MobileNo="
+ mobileNo + "&PageIndex=null&Status=null&repYear=2024";
String response = restTemplate.getForObject(url, String.class);
try {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(response, new TypeReference<List<Map<String, Object>>>() {
});
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public int saveInLogs(String mobileNo, String complaintNo,String userId) {
int agent_id;
try {
agent_id = Integer.parseInt(userId);
} catch (NumberFormatException e) {
return 0;
}
String sql = "INSERT INTO pgr_complaint_reg (user_mobile_num, complaint_number, agent_id) VALUES (?, ?, ?)";
return jdbcTemplate.update(sql, mobileNo, complaintNo, agent_id);
}
}

308
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/DomesticWasteService.java

@ -0,0 +1,308 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@Service
public class DomesticWasteService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Value("${fileBaseUrl}")
private String fileBaseUrl;
@Autowired
public void setDatasource(@Qualifier("mysqlDomesticWasteDataSource") DataSource datasource) {
this.jdbcTemplate=new JdbcTemplate(datasource);
}
public Map<String, Object> saveMultipleWasteRequests(String user_name, String mobile, String address,
String latitude, String longitude,
String street_name, String street_id, String remarks,
String itemsJson,String userId,String zone, String ward) {
int agent_id=Integer.parseInt(userId);
int is_app=3;
String remarks1;
if (remarks == null || remarks.trim().isEmpty()) {
remarks1 = "-";
} else {
remarks1 = remarks;
}
try {
ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, Object>> items = objectMapper.readValue(itemsJson, new TypeReference<>() {});
String sofaSize = null; // declare before lambda
for (Map<String, Object> item : items) {
if ("2".equals(item.get("item_id").toString())) { // Sofa id = 2
Object sizeObj = item.get("sofa_size"); // match your JS payload key
if (sizeObj != null && !sizeObj.toString().isEmpty()) {
sofaSize = sizeObj.toString();
}
break; // found sofa, no need to loop further
}
}
final String finalSofaSize = sofaSize;
// Step 1: Insert main request (one time)
String insertMainSql = "INSERT INTO user_request_table " +
"(request_id, user_name, mobile, address, latitude, longitude, street_name, street_id, remarks,agent_id,is_app,zone,division,sofa_type) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?,?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(con -> {
PreparedStatement ps = con.prepareStatement(insertMainSql, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, "TEMP"); // placeholder
ps.setString(2, user_name);
ps.setString(3, mobile);
ps.setString(4, address);
ps.setString(5, latitude);
ps.setString(6, longitude);
ps.setString(7, street_name);
ps.setString(8, street_id);
ps.setString(9, remarks1);
ps.setInt(10, agent_id);
ps.setInt(11, is_app);
ps.setString(12, zone);
ps.setString(13, ward);
ps.setString(14, finalSofaSize);
return ps;
}, keyHolder);
int generatedId = keyHolder.getKey().intValue();
String requestId = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + generatedId;
// Update request_id in user_request_table
jdbcTemplate.update("UPDATE user_request_table SET request_id = ? WHERE id = ?", requestId, generatedId);
String insertItemSql = "INSERT INTO items (iteam_id, quantity, req_table_id, requedt_id) VALUES (?, ?, ?, ?)";
for (Map<String, Object> item : items) {
Object itemIdObj = item.get("item_id");
Object quantityObj = item.get("quantity");
if (itemIdObj == null || quantityObj == null) {
continue;
}
int itemId = Integer.parseInt(itemIdObj.toString());
int quantity = Integer.parseInt(quantityObj.toString());
jdbcTemplate.update(insertItemSql, itemId, quantity, generatedId, requestId);
}
return Map.of("status", true,"message", "Request saved successfully","requestId", requestId);
}
catch (Exception e) {
e.printStackTrace();
return Map.of("status", false, "message", "Error: " + e.getMessage());
}
}
public List<Map<String, Object>> getAllComplaintsList(String startDate, String endDate, String mobile, String requestId) {
StringBuilder sql = new StringBuilder(
"SELECT u.*, sm.status_master AS status_name, DATE(u.cdate) AS created_date " +
"FROM user_request_table u " +
"JOIN status_master sm ON sm.id = u.status_id " +
"WHERE u.is_active = 1 AND u.is_delete = 0 AND sm.is_active = 1 AND sm.is_delete = 0 "
);
List<Object> params = new ArrayList<>();
if (startDate != null && !startDate.isEmpty() && endDate != null && !endDate.isEmpty()) {
sql.append(" AND DATE(u.cdate) BETWEEN ? AND ? ");
params.add(startDate);
params.add(endDate);
}
if (mobile != null && !mobile.isEmpty()) {
sql.append(" AND u.mobile = ? ");
params.add(mobile);
}
if (requestId != null && !requestId.isEmpty()) {
sql.append(" AND u.request_id = ? ");
params.add(requestId);
}
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql.toString(), params.toArray());
for (Map<String, Object> complaint : result) {
Number reqTableId = (Number) complaint.get("id");
List<Map<String, Object>> itemList = getItemsByRequestId(reqTableId.intValue());
complaint.put("items", itemList);
}
return result;
}
public List<Map<String, Object>> getpendingcomplaints(String startDate, String endDate, String mobile) {
StringBuilder sql = new StringBuilder("SELECT u.*, sm.status_master AS status_name, DATE(u.cdate) AS created_date"
+ " FROM user_request_table u "
+ " JOIN status_master sm ON sm.id = u.status"
+ " WHERE u.is_active = 1 AND u.is_delete = 0 AND u.status IN (1,3) "
);
List<Object> params = new ArrayList<>();
if (startDate != null && !startDate.isEmpty() && endDate != null && !endDate.isEmpty()) {
sql.append(" AND DATE(u.cdate) BETWEEN ? AND ? ");
params.add(startDate);
params.add(endDate);
}
if (mobile != null && !mobile.isEmpty()) {
sql.append(" AND u.mobile = ? ");
params.add(mobile);
}
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql.toString(), params.toArray());
for (Map<String, Object> complaint : result) {
Number reqTableId = (Number) complaint.get("id");
List<Map<String, Object>> itemList = getItemsByRequestId(reqTableId.intValue());
complaint.put("items", itemList);
}
return result;
}
public List<Map<String, Object>> getItemsByRequestId(int reqTableId) {
String itemSql = "SELECT i.iteam_id, im.item_name, i.quantity " +
"FROM items i " +
"LEFT JOIN item_master im ON i.iteam_id = im.id " +
"WHERE i.is_active = 1 AND i.is_delete = 0 AND i.req_table_id = ?";
return jdbcTemplate.queryForList(itemSql, reqTableId);
}
public List<Map<String, Object>> getDetailsByReqId(String requestId) {
String sql = "SELECT " +
"u.id, u.request_id, u.user_name, u.mobile, u.address, u.latitude, u.longitude, " +
"u.zone, u.division, u.street_name, u.quantity AS main_quantity, u.remarks, " +
"CONCAT('" + fileBaseUrl + "/gccofficialapp/files', u.image_url) AS image_url, " +
"DATE_FORMAT(u.cdate, '%d-%m-%Y') AS cdate, " +
"u.is_active, u.is_delete, u.street_id, sm.status_master AS status, u.is_app, " +
"DATE_FORMAT(u.close_date, '%d-%m-%Y') AS close_date, " +
"CONCAT('" + fileBaseUrl + "/gccofficialapp/files', u.officer_upload_url) AS officer_upload_url, " +
"itm.iteam_id, itm.quantity, im.item_name " +
"FROM user_request_table u " +
"LEFT JOIN items itm ON u.id = itm.req_table_id " +
"LEFT JOIN item_master im ON itm.iteam_id = im.id AND im.is_active = 1 " +
"LEFT JOIN status_master sm ON sm.id = u.status AND sm.is_active = 1 AND sm.is_delete = 0 " +
"WHERE u.request_id = ? AND u.is_active = 1";
List<Map<String, Object>> rawList = jdbcTemplate.queryForList(sql, requestId);
Map<Integer, Map<String, Object>> groupedMap = new LinkedHashMap<>();
for (Map<String, Object> row : rawList) {
Integer id = (Integer) row.get("id");
Map<String, Object> item = null;
if (row.get("item_name") != null) {
item = new LinkedHashMap<>();
item.put("item_name", row.get("item_name"));
item.put("quantity", row.get("quantity"));
}
if (groupedMap.containsKey(id)) {
if (item != null) {
((List<Map<String, Object>>) groupedMap.get(id).get("items")).add(item);
}
} else {
Map<String, Object> newEntry = new LinkedHashMap<>();
newEntry.put("id", id);
newEntry.put("request_id", row.get("request_id"));
newEntry.put("user_name", row.get("user_name"));
newEntry.put("mobile", row.get("mobile"));
newEntry.put("address", row.get("address"));
newEntry.put("latitude", row.get("latitude"));
newEntry.put("longitude", row.get("longitude"));
newEntry.put("zone", row.get("zone"));
newEntry.put("division", row.get("division"));
newEntry.put("street_name", row.get("street_name"));
newEntry.put("main_quantity", row.get("main_quantity"));
newEntry.put("remarks", row.get("remarks"));
newEntry.put("image_url", row.get("image_url"));
newEntry.put("cdate", row.get("cdate"));
newEntry.put("is_active", row.get("is_active"));
newEntry.put("is_delete", row.get("is_delete"));
newEntry.put("street_id", row.get("street_id"));
newEntry.put("status", row.get("status")); // Now this is human-readable
newEntry.put("is_app", row.get("is_app"));
newEntry.put("close_date", row.get("close_date"));
newEntry.put("officer_upload_url", row.get("officer_upload_url"));
List<Map<String, Object>> items = new ArrayList<>();
if (item != null) {
items.add(item);
}
newEntry.put("items", items);
groupedMap.put(id, newEntry);
}
}
return new ArrayList<>(groupedMap.values());
}
public boolean changeStatus(String requestId, String remarks, String userId) {
String sql = "UPDATE user_request_table " +
"SET status = 5, " +
"officer_remark = ?, " +
"cancelled_by = ?, " +
"rejecttype = 'Without Location', " +
"reject_latitude = 0.0, " +
"reject_longitude = 0.0 " +
"WHERE request_id = ?";
int result = jdbcTemplate.update(sql, remarks, userId, requestId);
return result > 0;
}
}

224
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/FollowUpService.java

@ -0,0 +1,224 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.time.LocalDateTime;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class FollowUpService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getFollowUpCalls(int agent_id) {
String query = "SELECT data_id, complaint_number, complaint_date,complaint_person_name, complaint_mobilenumber, " +
"complaint_type, official_name, official_mobilenum, call_category, complaint_mode, department " +
"FROM gcc_1913_qaqc.qaqc_upload_data " +
"WHERE call_category = 'OFFICIALFOLLOWUP' AND agent_id = ? AND is_processed = FALSE";
return jdbcTemplate.queryForList(query, agent_id);
}
public List<Map<String, Object>> getFollowUpCatergory()
{
String query = "SELECT call_status " +
"FROM gcc_1913_qaqc.call_status WHERE call_category_id = 2 and isactive='1'";
return jdbcTemplate.queryForList(query);
}
//public List<Map<String, Object>> getAgentCallStatus(int agentId) {
//
// String query = "SELECT " +
// " (SELECT SUM(aa.data_count) " +
// " FROM agent_assigned aa " +
// " WHERE aa.agent_id = ?) AS total_data_count, " +
// " COUNT(CASE WHEN cl.call_status = 'COMPLETED' THEN 1 END) AS completed_count, " +
// " COUNT(CASE WHEN cl.call_status != 'COMPLETED' THEN 1 END) AS pending_count " +
// "FROM " +
// " qaqc_call_logs cl " +
// "WHERE " +
// " cl.agent_id = ?";
// return jdbcTemplate.queryForList(query,agentId);
//
// }
public void updateFollowupComplaintDetails(String complaintNumber,int dataId, String action, String remarks,int updated_agent)
{
String query = "UPDATE gcc_1913_qaqc.qaqc_upload_data " +
"SET call_status = ?, " + " remarks = ?, updated_agent=?," +
" updated_date = CURRENT_TIMESTAMP, " + " is_processed = TRUE " +
"WHERE data_id = ? " +" AND complaint_number = ? ";
int rowsUpdated = jdbcTemplate.update(query, action, remarks,updated_agent, dataId,complaintNumber);
//System.out.println("Rows Updated in upload data: " + rowsUpdated);
}
@Transactional
public int uploadComplaintDetailsInLogs(Map<String, Object> logDetails, String action, String complaintNumber, String remainderDate) {
//System.out.println("Complaint Details: " + logDetails);
// Extract other field values from complaintDetails
int qaqcid = (int) logDetails.get("qaqc_id");
String ccategory = logDetails.get("call_category").toString();
String personName = logDetails.get("complaint_person_name").toString();
String personMobNo = logDetails.get("complaint_mobilenumber").toString();
String complaintDate = logDetails.get("complaint_date").toString();
String cType = logDetails.get("complaint_type").toString();
String cMode = logDetails.get("complaint_mode").toString();
String department = logDetails.get("department").toString();
String cGroup = logDetails.get("complaint_group").toString();
String officialName = logDetails.get("official_name").toString();
String officialMobileNum = logDetails.get("official_mobilenum").toString();
String callStatus = logDetails.get("call_status").toString();
String remarks = logDetails.get("remarks").toString();
int agentId = (int) logDetails.get("agent_id");
int updated_agent=(int)logDetails.get("updated_agent");
boolean isProcessed = (boolean)logDetails.get("is_processed");
LocalDateTime currentDate = LocalDateTime.now();
// Determine which table to insert into based on the action
if (action.equals("FOLLOWUP")) {
String query ="INSERT INTO gcc_1913_qaqc.qaqc_followup_call_logs (qaqc_id, call_category, agent_id, complaint_number, complaint_date,complaint_person_name, "
+ "complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name,remainder_date, official_mobilenum, call_status, remarks,updated_agent) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)";
int rowsAffected = jdbcTemplate.update(query, qaqcid, ccategory, agentId, complaintNumber, complaintDate,personName,
personMobNo, cType, cMode, department, cGroup, officialName,remainderDate, officialMobileNum, callStatus, remarks,
updated_agent);
//System.out.println("Rows Updated in qaqc_followup_call_logs : " + rowsAffected);
}
String query1 = "INSERT INTO gcc_1913_qaqc.qaqc_call_logs (qaqc_id, call_category, agent_id, complaint_number,complaint_date, complaint_person_name, "
+ "complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name, official_mobilenum, call_status, remarks, is_processed,updated_agent) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)";
int rowsAffected1 = jdbcTemplate.update(query1, qaqcid, ccategory, agentId, complaintNumber,complaintDate, personName,
personMobNo, cType, cMode, department, cGroup, officialName, officialMobileNum, callStatus, remarks,
isProcessed,updated_agent);
//System.out.println("Rows Updated in qaqc_call_logs: " + rowsAffected1);
return rowsAffected1;
}
/*
@Transactional
public int uploadComplaintDetailsInLogs(Map<String, Object> logDetails, String action, String complaintNumber, String remainderDate) {
//System.out.println("Complaint Details: " + logDetails);
// Extract other field values from complaintDetails
int qaqcid = (int) logDetails.get("qaqc_id");
String ccategory = logDetails.get("call_category").toString();
String personName = logDetails.get("complaint_person_name").toString();
String personMobNo = logDetails.get("complaint_mobilenumber").toString();
String complaintDate = logDetails.get("complaint_date").toString();
String cType = logDetails.get("complaint_type").toString();
String cMode = logDetails.get("complaint_mode").toString();
String department = logDetails.get("department").toString();
String cGroup = logDetails.get("complaint_group").toString();
String officialName = logDetails.get("official_name").toString();
String officialMobileNum = logDetails.get("official_mobilenum").toString();
String callStatus = logDetails.get("call_status").toString();
String remarks = logDetails.get("remarks").toString();
int agentId = (int) logDetails.get("agent_id");
int updated_agent=(int)logDetails.get("updated_agent");
boolean isProcessed = (boolean)logDetails.get("is_processed");
LocalDateTime currentDate = LocalDateTime.now();
// Determine which table to insert into based on the action
if (action.equals("FOLLOWUP")) {
String query = "UPDATE gcc_1913_qaqc.qaqc_followup_call_logs "
+ "SET qaqc_id = ?, call_category = ?, agent_id = ?, remainder_date = ?, call_status = ?, remarks = ?, updated_agent = ?, updated_date = CURRENT_TIMESTAMP "
+ "WHERE complaint_number = ? "
+ "AND id = (SELECT max_id FROM (SELECT MAX(id) AS max_id FROM gcc_1913_qaqc.qaqc_followup_call_logs WHERE complaint_number = ?) AS temp)";
int rowsAffected = jdbcTemplate.update(query,qaqcid, ccategory,agentId,remainderDate, callStatus, remarks,updated_agent,complaintNumber,complaintNumber);
//System.out.println("Rows Updated in qaqc_followup_call_logs : " + rowsAffected);
String query1 = "INSERT INTO gcc_1913_qaqc.qaqc_call_logs (qaqc_id, call_category, agent_id, complaint_number, complaint_date,complaint_person_name, "
+ "complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name,remainder_date, official_mobilenum, call_status, remarks, is_processed,updated_agent) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?)";
int rowsAffected1 = jdbcTemplate.update(query1, qaqcid, ccategory, agentId, complaintNumber, complaintDate,personName,
personMobNo, cType, cMode, department, cGroup, officialName,remainderDate, officialMobileNum, callStatus, remarks,
isProcessed,updated_agent);
//System.out.println("Rows Updated in qaqc_call_logs : " + rowsAffected1);
return rowsAffected + rowsAffected1;
} else {
String query = "UPDATE gcc_1913_qaqc.qaqc_followup_call_logs "
+ "SET qaqc_id = ?, call_category = ?, agent_id = ?, call_status = ?, remarks = ?, updated_agent = ?, updated_date = CURRENT_TIMESTAMP "
+ "WHERE complaint_number = ? "
+ "AND id = (SELECT max_id FROM (SELECT MAX(id) AS max_id FROM gcc_1913_qaqc.qaqc_followup_call_logs WHERE complaint_number = ?) AS temp)";
int rowsAffected = jdbcTemplate.update(query,qaqcid, ccategory,agentId, callStatus, remarks,updated_agent,complaintNumber,complaintNumber);
//System.out.println("Rows Updated in qaqc_followup_call_logs : " + rowsAffected);
String query1 = "INSERT INTO gcc_1913_qaqc.qaqc_call_logs (qaqc_id, call_category, agent_id, complaint_number,complaint_date, complaint_person_name, "
+ "complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name, official_mobilenum, call_status, remarks, is_processed,updated_agent) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)";
int rowsAffected1 = jdbcTemplate.update(query1, qaqcid, ccategory, agentId, complaintNumber,complaintDate, personName,
personMobNo, cType, cMode, department, cGroup, officialName, officialMobileNum, callStatus, remarks,
isProcessed,updated_agent);
//System.out.println("Rows Updated in qaqc_call_logs: " + rowsAffected1);
return rowsAffected + rowsAffected1;
}
}
*/
public List<Map<String, Object>> getCallHistory(String complaintNumber)
{
String query = "SELECT complaint_number, agent_id, remainder_date, remarks, created_date " +
"FROM gcc_1913_qaqc.qaqc_call_logs " +
"WHERE complaint_number = ? and call_status='FOLLOWUP'";
return jdbcTemplate.queryForList(query, complaintNumber);
}
public List<Map<String, Object>> getFollowupSubmitDetails(int userId) {
String query = "SELECT complaint_number, complaint_date,complaint_person_name, complaint_mobilenumber,official_name,official_mobilenum, " +
"complaint_type, call_status, remarks " +
"FROM gcc_1913_qaqc.qaqc_upload_data " +
"WHERE call_category = 'OFFICIALFOLLOWUP' AND agent_id = ? AND is_processed = '1'";
return jdbcTemplate.queryForList(query,userId);
}
public void updateComplaintHistoryDetails(String complaintNumber, int dataId, String action, String remarks,int updated_agent,
String remainderDate) {
String query = "UPDATE gcc_1913_qaqc.qaqc_upload_data_history \r\n"
+ "SET call_status = ?, remarks = ?, updated_date = CURRENT_TIMESTAMP, remainder_date = ?,updated_agent=?\r\n"
+ "WHERE data_id = ? AND complaint_number = ?";
int rowsUpdated = jdbcTemplate.update(query, action, remarks, remainderDate, updated_agent,dataId, complaintNumber);
//System.out.println("Rows Updated in upload history: " + rowsUpdated);
}
}

102
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/InprogresscallService.java

@ -0,0 +1,102 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
@Service
public class InprogresscallService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getActionsCatergory()
{
String query = "SELECT call_status " +
"FROM gcc_1913_qaqc.call_status WHERE call_category_id = 3 and isactive='1'";
return jdbcTemplate.queryForList(query);
}
// public List<Map<String, Object>> getInProgressCalls(int agent_id) {
// String sql = "SELECT complaint_number, " +
// " official_name , " +
// " official_mobilenum , " +
// " complaint_type, " +
// " call_category, " +
// " complaint_mode, " +
// " department " +
//
// "FROM gcc_1913_qaqc.qaqc_upload_data " +
// "WHERE call_category ='inprogress' and agent_id= ?";
//
//
// return jdbcTemplate.queryForList(sql, agent_id);
// }
public List<Map<String, Object>> getInProgressCalls(int agent_id) {
String query = "SELECT data_id, complaint_number, complaint_date,complaint_person_name, complaint_mobilenumber, " +
"complaint_type, official_name, official_mobilenum, call_category, complaint_mode, department " +
"FROM gcc_1913_qaqc.qaqc_upload_data " +
"WHERE (call_category = 'PROCESSING' OR call_category = 'REOPENED' OR call_category = 'REDRESSED' OR call_category = 'INPROGRESS') " +
" AND is_processed = FALSE " +
" AND agent_id = ?";
return jdbcTemplate.queryForList(query, agent_id);
}
public void updateInprogressComplaintDetails(String complaintNumber,int dataId, String action, String remarks,int updated_agent)
{
String query = "UPDATE gcc_1913_qaqc.qaqc_upload_data " +
"SET call_status = ?, " + " remarks = ?,updated_agent=?, " +
" updated_date = CURRENT_TIMESTAMP, " + " is_processed = TRUE " +
"WHERE data_id = ? " +" AND complaint_number = ?";
int rowsUpdated = jdbcTemplate.update(query, action, remarks,updated_agent, dataId,complaintNumber);
//System.out.println("Rows Updated in upload data: " + rowsUpdated);
}
public void saveMobileNumDetails(String complaintNumber, String remarks) {
String query = "insert into officer_mobileno (complaint_number,remarks) values(?,?)";
int rowsUpdated = jdbcTemplate.update(query, complaintNumber, remarks);
//System.out.println("Rows Updated: " + rowsUpdated);
}
public List<Map<String, Object>> getInprogressSubmitDetails(int userId) {
String query = "SELECT complaint_number, complaint_date,complaint_person_name, complaint_mobilenumber,official_name,official_mobilenum, " +
"complaint_type, call_status, remarks " +
"FROM gcc_1913_qaqc.qaqc_upload_data " +
"WHERE (call_category = 'PROCESSING' OR call_category = 'REOPENED' OR call_category = 'REDRESSED' OR call_category = 'INPROGRESS') AND agent_id = ? AND is_processed = '1'";
return jdbcTemplate.queryForList(query,userId);
}
public void updateComplaintHistoryDetails(String complaintNumber, int dataId, String action, String remarks,int updated_agent,
String remainderDate) {
String query = "UPDATE gcc_1913_qaqc.qaqc_upload_data_history \r\n"
+ "SET call_status = ?, remarks = ?, updated_date = CURRENT_TIMESTAMP, remainder_date = ?,updated_agent=?\r\n"
+ "WHERE data_id = ? AND complaint_number = ?";
int rowsUpdated = jdbcTemplate.update(query, action, remarks, remainderDate,updated_agent, dataId, complaintNumber);
//System.out.println("Rows Updated in upload data history: " + rowsUpdated);
}
}

52
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/PublicFollowUpService.java

@ -0,0 +1,52 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class PublicFollowUpService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getFollowUpCalls(int agent_id) {
String query = "SELECT data_id, complaint_number, complaint_date,complaint_person_name, complaint_mobilenumber, " +
"complaint_type, official_name, official_mobilenum, call_category, complaint_mode, department " +
"FROM gcc_1913_qaqc.qaqc_upload_data " +
"WHERE call_category = 'PUBLICFOLLOWUP' AND agent_id = ? AND is_processed = FALSE";
return jdbcTemplate.queryForList(query, agent_id);
}
public List<Map<String, Object>> getFollowUpCatergory()
{
String query = "SELECT call_status " +
"FROM gcc_1913_qaqc.call_status WHERE call_category_id = 4 and isactive='1'";
return jdbcTemplate.queryForList(query);
}
public List<Map<String, Object>> getFollowupSubmitDetails(int userId) {
String query = "SELECT complaint_number, complaint_date,complaint_person_name, complaint_mobilenumber,official_name,official_mobilenum, " +
"complaint_type, call_status, remarks " +
"FROM gcc_1913_qaqc.qaqc_upload_data " +
"WHERE call_category = 'PUBLICFOLLOWUP' AND agent_id = ? AND is_processed = '1'";
return jdbcTemplate.queryForList(query,userId);
}
}

123
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcAdminSettingService.java

@ -0,0 +1,123 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class QaqcAdminSettingService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional
public int updateProductivity(int productivity_count) {
String updateSql = "UPDATE productivity SET productivity_count=? where isactive='1' and isdelete='0'";
return jdbcTemplate.update(updateSql,productivity_count);
}
@Transactional
public int saveProductivity(int productivity_count) {
String insertSql = "INSERT INTO productivity (productivity_count) VALUES (?)";
return jdbcTemplate.update(insertSql, productivity_count);
}
@Transactional
public Integer getProductivity() {
String insertSql = "select productivity_count\r\n"
+ "from productivity\r\n"
+ "where isactive='1' and isdelete='0'"
+ "LIMIT 1";
return jdbcTemplate.queryForObject(insertSql, Integer.class);
}
@Transactional
public List<Map<String, Object>> getAdminSettingCounts() {
String sqlQuery = "SELECT " +
"COALESCE(p.productivity_count, 0) AS productivity_count, " +
"COUNT(al.agent_id) AS total_count, " +
"COALESCE(p.inbound_count, 0) AS inbound_count, " +
"COALESCE(p.outbound_count, 0) AS outbound_count, " +
"COALESCE(p.inbound_count, 0) + COALESCE(p.outbound_count, 0) As assigned, " +
"(COUNT(al.agent_id) - (COALESCE(p.inbound_count, 0) + COALESCE(p.outbound_count, 0))) AS notassigned " +
"FROM productivity p " +
"JOIN agents_list al " +
"WHERE p.isactive = '1' AND p.isdelete = '0' AND al.isactive = '1' AND al.isdelete = '0' " +
"GROUP BY p.productivity_count, p.inbound_count, p.outbound_count";
return jdbcTemplate.queryForList(sqlQuery);
}
@Transactional
public int saveCallingTypeInSettings() {
// Query to get inbound and outbound counts
String selectSql = "SELECT\r\n"
+ "SUM(CASE WHEN calling_type = 'INBOUND' THEN 1 ELSE 0 END) AS inbound, \r\n"
+ "SUM(CASE WHEN calling_type = 'OUTBOUND' THEN 1 ELSE 0 END) AS outbound \r\n"
+ "FROM agents_list \r\n"
+ "WHERE isactive = '1' AND isdelete = '0'";
// Fetch the counts
Map<String, Object> result = jdbcTemplate.queryForMap(selectSql);
int inbound = ((Number) result.get("inbound")).intValue(); // Convert to int
int outbound = ((Number) result.get("outbound")).intValue(); // Convert to int
//Corrected SQL syntax for updating multiple columns
String updateSql = "UPDATE productivity SET inbound_count = ?, outbound_count = ? WHERE isactive = '1' AND isdelete = '0'";
return jdbcTemplate.update(updateSql, inbound, outbound);
}
@Transactional
public int updateCallType(String calling_type,int agent_id) {
String updateSql = "UPDATE agents_list SET calling_type=? WHERE agent_id=? AND isactive='1'";
return jdbcTemplate.update(updateSql,calling_type,agent_id);
}
@Transactional
public List<Map<String, Object>> getAgentsForCallingtype()
{
String sqlQuery = "select al.agent_id as agent_id,ap.username as username,al.agent_name as agent_name,al.mobile_number as mobile_number,\r\n"
+ "al.calling_type as calling_type\r\n"
+ "from gcc_1913_qaqc.agents_list al\r\n"
+ "LEFT join gcc_apps.appusers ap on ap.userid=al.agent_id\r\n"
+ "where al.isactive='1' and al.isdelete='0'";
return jdbcTemplate.queryForList(sqlQuery);
}
public int updateAgentName(int agentId, String updatedName) {
// Query to check if the name exists for another agent
String checkSql = "SELECT COUNT(*) FROM agents_list WHERE agent_name = ? AND agent_id <> ? AND isactive = '1'";
int count = jdbcTemplate.queryForObject(checkSql, Integer.class, updatedName, agentId);
if (count > 0) {
return -1; // Indicate that the name already exists
}
// Proceed with the update if the name is unique
String updateSql = "UPDATE agents_list SET agent_name = ? WHERE agent_id = ? AND isactive = '1'";
return jdbcTemplate.update(updateSql, updatedName, agentId);
}
}

1166
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcAgentAssignService.java
File diff suppressed because it is too large
View File

563
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcAgentsService.java

@ -0,0 +1,563 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class QaqcAgentsService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional
public List<Map<String, Object>> getAgentsAllTasksCounts(int agent_id) {
String SqlQuery = "SELECT \r\n"
+ " cr.taskid,\r\n"
+ " cr.call_category,\r\n"
+ " cr.description,\r\n"
+ " aa.qaqc_id,\r\n"
+ " aa.agent_id,\r\n"
+ " aa.created_date,\r\n"
+ " (SELECT COUNT(data_id) \r\n"
+ " FROM qaqc_upload_data up \r\n"
+ " WHERE up.agent_id = aa.agent_id \r\n"
+ " AND up.qaqc_id = cr.qaqc_id\r\n"
+ " ) AS calls_assigned,\r\n"
+ " (SELECT COUNT(CASE WHEN up.call_status IS NULL THEN 1 END) \r\n"
+ " FROM qaqc_upload_data up \r\n"
+ " WHERE up.agent_id = aa.agent_id \r\n"
+ " AND up.qaqc_id = cr.qaqc_id\r\n"
+ " ) AS pending_count,\r\n"
+ " (SELECT COUNT(CASE WHEN up.call_status IS NOT NULL THEN 1 END) \r\n"
+ " FROM qaqc_upload_data up \r\n"
+ " WHERE up.agent_id = aa.agent_id \r\n"
+ " AND up.qaqc_id = cr.qaqc_id\r\n"
+ " ) AS complete_count,\r\n"
+ " (SELECT COUNT(CASE WHEN up.call_status ='CALL_BACK_LATER' OR up.field_9 = 'UNATTENDED' THEN 1 END) \r\n"
+ " FROM qaqc_upload_data up \r\n"
+ " WHERE up.agent_id = aa.agent_id \r\n"
+ " AND up.qaqc_id = cr.qaqc_id\r\n"
+ " ) AS followup_count\r\n"
+ " \r\n"
+ "FROM \r\n"
+ " agent_assigned aa\r\n"
+ "JOIN \r\n"
+ " agents_list al ON aa.agent_id = al.agent_id\r\n"
+ "JOIN \r\n"
+ " qaqc_request cr ON cr.qaqc_id = aa.qaqc_id\r\n"
+ "WHERE \r\n"
+ " aa.agent_id = ? \r\n"
+ " AND aa.isactive = '1'";
return jdbcTemplate.queryForList(SqlQuery,agent_id);
}
public List<Map<String, Object>> getdataforagents(int agent_id,int qaqc_id) {
String sqlQuery = "select *\r\n"
+ "from qaqc_upload_data\r\n"
+ "where agent_id=? and qaqc_id=?";
return jdbcTemplate.queryForList(sqlQuery,agent_id,qaqc_id);
}
@Transactional
public void savecallstatus(String call_status, String remarks,String complaintNumber)
{
String SqlQuery = "UPDATE qaqc_upload_data SET call_status = ?,remarks=?, updated_date = NOW() WHERE (complaint_number = ? )";
jdbcTemplate.update(SqlQuery,call_status, remarks,complaintNumber);
}
@Transactional
public void savecallstatusinlogs(String call_status, String remarks,String complaintNumber) {
// Step 1: Fetch details from the source table using the complaintNumber
String selectQuery = "SELECT * FROM qaqc_upload_data WHERE complaint_number = ?";
Map<String, Object> details = jdbcTemplate.queryForMap(selectQuery, complaintNumber);
// Extract the required fields from the result (modify based on your table structure)
String detailField1 = (String) details.get("qaqc_id");
String detailField2 = (String) details.get("agent_id");
String detailField3 = (String) details.get("complaint_number");
String detailField4 = (String) details.get("complaint_person_name");
String detailField5 = (String) details.get("complaint_mobilenumber");
String detailField6 = (String) details.get("complaint_type");
String detailField7 = (String) details.get("complaint_mode");
String detailField8 = (String) details.get("department");
String detailField9 = (String) details.get("complaint_group");
String detailField10 = (String) details.get("official_name");
String detailField11 = (String) details.get("official_mobilenum");
// Step 2: Insert the fetched details along with call_status and remarks into qaqc_call_logs
String insertQuery = "INSERT INTO qaqc_call_logs (qaqc_id, agent_id, complaint_number, complaint_person_name, complaint_mobilenumber,complaint_type,complaint_mode,department,complaint_group,official_name,official_mobilenum) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
jdbcTemplate.update(insertQuery,detailField1, detailField2,detailField3,detailField4,detailField5,detailField6,detailField7,detailField8,detailField9,detailField10,detailField11,call_status,remarks);
}
public List<Map<String,Object>> getPreviousDayDashboardCounts()
{
String sqlQuery = "SELECT \r\n"
+ " COUNT(DISTINCT assigned_stats.agent_id) AS TotalAgents, \r\n"
+ " SUM(COALESCE(assigned_stats.Assigned, 0)) AS TotalAssigned, \r\n"
+ " SUM(COALESCE(completed_stats.TotalCompleted, 0)) AS TotalCompleted, \r\n"
+ " SUM(COALESCE(assigned_stats.Assigned, 0) - COALESCE(completed_stats.TotalCompleted, 0)) AS TotalPending \r\n"
+ "FROM \r\n"
+ " (SELECT al.agent_id AS agent_id, SUM(aa.data_count) AS Assigned \r\n"
+ " FROM agent_assigned aa \r\n"
+ " JOIN agents_list al ON aa.agent_id = al.agent_id \r\n"
+ " WHERE DATE(aa.created_date) = DATE(SUBDATE(CURDATE(), 1)) \r\n"
+ " GROUP BY al.agent_id) AS assigned_stats \r\n"
+ "LEFT JOIN \r\n"
+ " (SELECT agent_id, COUNT(DISTINCT (complaint_number)) AS TotalCompleted \r\n"
+ " FROM qaqc_call_logs \r\n"
+ " WHERE DATE(created_date) = DATE(SUBDATE(CURDATE(), 1)) \r\n"
+ " GROUP BY agent_id) AS completed_stats \r\n"
+ "ON assigned_stats.agent_id = completed_stats.agent_id;";
return jdbcTemplate.queryForList(sqlQuery);
}
// public List<Map<String,Object>> getAgentPreviousDayCount()
// {
// String sqlQuery = "SELECT DISTINCT \r\n"
// + " assigned_stats.agent_id, \r\n"
// + " assigned_stats.agent_name as agent_name, -- Use the alias assigned_stats here instead of aa\r\n"
// + " COALESCE(assigned_stats.Assigned, 0) AS Assigned, \r\n"
// + " COALESCE(completed_stats.TotalCompleted, 0) AS TotalCompleted, \r\n"
// + " COALESCE(assigned_stats.Assigned, 0) - COALESCE(completed_stats.TotalCompleted, 0) AS Pending, \r\n"
// + " CASE \r\n"
// + " WHEN COALESCE(assigned_stats.Assigned, 0) = 0 THEN 0 \r\n"
// + " ELSE ROUND(COALESCE(completed_stats.TotalCompleted, 0) * 100.0 / COALESCE(assigned_stats.Assigned, 1)) \r\n"
// + " END AS CompletionPercentage, \r\n"
// + " COALESCE(call_stats.Completed_count, 0) AS Completed_count, \r\n"
// + " COALESCE(call_stats.Reopened_count, 0) AS Reopened_count, \r\n"
// + " COALESCE(call_stats.Followup_count, 0) AS Followup_count, \r\n"
// + " COALESCE(call_stats.Other_count, 0) AS Other_count \r\n"
// + "FROM \r\n"
// + " (SELECT al.agent_id AS agent_id, al.agent_name AS agent_name, SUM(aa.data_count) AS Assigned \r\n"
// + " FROM agent_assigned aa \r\n"
// + " JOIN agents_list al ON aa.agent_id = al.agent_id \r\n"
// + " WHERE DATE(aa.created_date) = DATE(SUBDATE(CURDATE(), 1)) \r\n"
// + " GROUP BY al.agent_id,al.agent_name) AS assigned_stats -- The alias 'assigned_stats' is used here\r\n"
// + "LEFT JOIN \r\n"
// + " (SELECT agent_id, COUNT(qaqc_id) AS TotalCompleted \r\n"
// + " FROM qaqc_call_logs \r\n"
// + " WHERE DATE(created_date) = DATE(SUBDATE(CURDATE(), 1)) \r\n"
// + " GROUP BY agent_id) AS completed_stats ON assigned_stats.agent_id = completed_stats.agent_id \r\n"
// + "LEFT JOIN \r\n"
// + " (SELECT agent_id, \r\n"
// + " SUM(CASE WHEN call_status IN ('COMPLETED', 'FOLLOWUP_COMPLETED') THEN 1 ELSE 0 END) AS Completed_count, \r\n"
// + " SUM(CASE WHEN call_status = 'REOPEN' THEN 1 ELSE 0 END) AS Reopened_count, \r\n"
// + " SUM(CASE WHEN call_status = 'FOLLOWUP' THEN 1 ELSE 0 END) AS Followup_count, \r\n"
// + " SUM(CASE WHEN call_status NOT IN ('COMPLETED', 'FOLLOWUP_COMPLETED', 'REOPEN', 'FOLLOWUP') THEN 1 ELSE 0 END) AS Other_count \r\n"
// + " FROM qaqc_call_logs \r\n"
// + " WHERE DATE(created_date) = DATE(SUBDATE(CURDATE(), 1)) \r\n"
// + " GROUP BY agent_id) AS call_stats ON assigned_stats.agent_id = call_stats.agent_id;\r\n";
//
// return jdbcTemplate.queryForList(sqlQuery);
// }
public List<Map<String,Object>> getAgentPreviousDayCount()
{
String sqlQuery = "SELECT DISTINCT \r\n"
+ " assigned_stats.agent_id, \r\n"
+ " assigned_stats.agent_name as agent_name, -- Use the alias assigned_stats here instead of aa\r\n"
+ " COALESCE(assigned_stats.Assigned, 0) AS Assigned, \r\n"
+ " COALESCE(completed_stats.TotalCompleted, 0) AS TotalCompleted, \r\n"
+ " COALESCE(assigned_stats.Assigned, 0) - COALESCE(completed_stats.TotalCompleted, 0) AS Pending, \r\n"
+ " CASE \r\n"
+ " WHEN COALESCE(assigned_stats.Assigned, 0) = 0 THEN 0 \r\n"
+ " ELSE ROUND(COALESCE(completed_stats.TotalCompleted, 0) * 100.0 / COALESCE(assigned_stats.Assigned, 1)) \r\n"
+ " END AS CompletionPercentage, \r\n"
+ " COALESCE(call_stats.Completed_count, 0) AS Completed_count, \r\n"
+ " COALESCE(call_stats.Reopened_count, 0) AS Reopened_count, \r\n"
+ " COALESCE(call_stats.Followup_count, 0) AS Followup_count, \r\n"
+ " COALESCE(call_stats.Other_count, 0) AS Other_count \r\n"
+ "FROM \r\n"
+ " (SELECT al.agent_id AS agent_id, al.agent_name AS agent_name, SUM(aa.data_count) AS Assigned \r\n"
+ " FROM agent_assigned aa \r\n"
+ " JOIN agents_list al ON aa.agent_id = al.agent_id \r\n"
+ " WHERE DATE(aa.created_date) = DATE(SUBDATE(CURDATE(), 1)) \r\n"
+ " GROUP BY al.agent_id,al.agent_name) AS assigned_stats -- The alias 'assigned_stats' is used here\r\n"
+ "LEFT JOIN \r\n"
+ " (SELECT agent_id, count(DISTINCT (complaint_number)) AS TotalCompleted \r\n"
+ " FROM qaqc_call_logs \r\n"
+ " WHERE DATE(created_date) = DATE(SUBDATE(CURDATE(), 1)) \r\n"
+ " GROUP BY agent_id) AS completed_stats ON assigned_stats.agent_id = completed_stats.agent_id \r\n"
+ "LEFT JOIN \r\n"
+ " (SELECT agent_id, \r\n"
+ " SUM(CASE WHEN call_status IN ('COMPLETED', 'FOLLOWUP_COMPLETED') THEN 1 ELSE 0 END) AS Completed_count, \r\n"
+ " SUM(CASE WHEN call_status = 'REOPEN' THEN 1 ELSE 0 END) AS Reopened_count, \r\n"
+ " SUM(CASE WHEN call_status = 'FOLLOWUP' THEN 1 ELSE 0 END) AS Followup_count, \r\n"
+ " SUM(CASE WHEN call_status NOT IN ('COMPLETED', 'FOLLOWUP_COMPLETED', 'REOPEN', 'FOLLOWUP') THEN 1 ELSE 0 END) AS Other_count \r\n"
+ " FROM qaqc_call_logs \r\n"
+ " WHERE DATE(created_date) = DATE(SUBDATE(CURDATE(), 1)) \r\n"
+ " GROUP BY agent_id) AS call_stats ON assigned_stats.agent_id = call_stats.agent_id \r\n"
+ " ORDER BY agent_name \r\n;";
return jdbcTemplate.queryForList(sqlQuery);
}
public List<Map<String, Object>> getAgentDashboard(int userId, String startDate, String endDate) {
String sql = "SELECT " +
" COALESCE(SUM(aa.data_count), 0) AS Total_Calls_assigned, " +
" COALESCE(SUM(CASE WHEN qr.call_category = 'closed' THEN aa.data_count ELSE 0 END), 0) AS Closed_Call_count, " +
" COALESCE(SUM(CASE WHEN qr.call_category IN ('inprogress', 'redressed', 'reopened','processing') THEN aa.data_count ELSE 0 END), 0) AS Inprogress_Call_count, " +
" COALESCE(SUM(CASE WHEN qr.call_category = 'officialfollowup' THEN aa.data_count ELSE 0 END), 0) AS Followup_Call_count, " +
" COALESCE(SUM(CASE WHEN qr.call_category = 'publicfollowup' THEN aa.data_count ELSE 0 END), 0) AS PublicFollowup_Call_count " +
"FROM agent_assigned aa " +
"LEFT JOIN qaqc_request qr ON aa.qaqc_id = qr.qaqc_id " +
"WHERE aa.agent_id = ? " +
"AND DATE(qr.created_date) BETWEEN ? AND ?";
return jdbcTemplate.queryForList(sql, userId, startDate, endDate);
}
public List<Map<String, Object>> getAgentPerformanceData(int agentId, String startDate, String endDate) {
String sql = "SELECT \n"
+ " COALESCE(total_data_count, 0) AS total_data_count,\n" // Ensure total_data_count is 0 if null
+ " COALESCE(completed_count, 0) AS completed_count,\n" // Ensure completed_count is 0 if null
+ " COALESCE((total_data_count - completed_count), 0) AS pending_count,\n" // Ensure pending_count is 0
+ " CASE \n"
+ " WHEN COALESCE(total_data_count, 0) > 0 THEN ROUND((COALESCE(completed_count, 0) / total_data_count) * 100, 1)\n"
+ " ELSE 0\n"
+ " END AS completed_percentage\n"
+ "FROM \n"
+ " (\n"
+ " SELECT \n"
+ " (SELECT COALESCE(SUM(aa.data_count), 0) \n"
+ " FROM agent_assigned aa \n"
+ " WHERE aa.agent_id = ? AND DATE(aa.created_date) BETWEEN ? AND ?) AS total_data_count,\n"
+ " \n"
+ " (SELECT COALESCE(COUNT(*), 0) \n"
+ " FROM qaqc_call_logs cl \n"
+ " WHERE cl.agent_id = ?\n"
+ " AND DATE(cl.created_date) BETWEEN ? AND ? \n"
+ " AND cl.call_status IS NOT NULL) AS completed_count\n"
+ " ) AS combined";
return jdbcTemplate.queryForList(sql, agentId, startDate, endDate, agentId, startDate, endDate);
}
public List<Map<String, Object>> getAgentTaskDetails(int userId, String startDate, String endDate) {
String sql = "WITH LatestCallLogs AS ( " +
" SELECT " +
" cl.qaqc_id, " +
" cl.agent_id, " +
" cl.complaint_number, " +
" cl.call_status, " +
" cl.created_date, " +
" ROW_NUMBER() OVER (PARTITION BY cl.qaqc_id, cl.agent_id, cl.complaint_number ORDER BY cl.created_date DESC) AS row_num " +
" FROM " +
" qaqc_call_logs cl " +
") " +
"SELECT DISTINCT " +
" qr.taskid AS taskid, " +
" qr.call_category AS call_category, " +
" DATE(aa.created_date) AS cdate, " +
" aa.data_count AS assigned, " +
" COUNT(lcl.agent_id) AS callstaken, " +
" (aa.data_count - COUNT(lcl.agent_id)) AS pending, " +
" ROUND((CASE WHEN aa.data_count > 0 THEN (COUNT(lcl.agent_id) / aa.data_count) * 100 ELSE 0 END), 2) AS percentage, " +
" COUNT(CASE WHEN lcl.call_status IN ('COMPLETED', 'FOLLOWUP_COMPLETED') THEN 1 END) AS Completed, " +
" COUNT(CASE WHEN lcl.call_status = 'REOPEN' THEN 1 END) AS Reopened, " +
" COUNT(CASE WHEN lcl.call_status = 'FOLLOWUP' THEN 1 END) AS Followup, " +
" COUNT(CASE WHEN lcl.call_status NOT IN ('COMPLETED', 'FOLLOWUP_COMPLETED', 'REOPEN', 'FOLLOWUP') THEN 1 END) AS Others " +
"FROM " +
" qaqc_request qr " +
"JOIN " +
" agent_assigned aa ON aa.qaqc_id = qr.qaqc_id " +
"JOIN " +
" agents_list al ON al.agent_id = aa.agent_id " +
"LEFT JOIN " +
" LatestCallLogs lcl ON qr.qaqc_id = lcl.qaqc_id AND al.agent_id = lcl.agent_id AND lcl.row_num = 1 " +
"WHERE " +
" al.agent_id = ? AND aa.data_count != 0 " +
" AND DATE(aa.created_date) BETWEEN ? AND ? " +
"GROUP BY " +
" taskid, cdate, assigned, call_category";
return jdbcTemplate.queryForList(sql, userId, startDate, endDate);
}
public List<Map<String, Object>> getAgentPerformanceCount(String startDate, String endDate) {
String sql = "SELECT " +
"t2.total_calls, " +
"t3.completed_calls, " +
"t2.total_calls - t3.completed_calls AS pending_calls, " +
"t4.no_of_agents " +
"FROM " +
"( " +
" SELECT " +
" SUM(aa.data_count) AS total_calls " +
" FROM " +
" agent_assigned aa " +
" INNER JOIN " +
" qaqc_request qr " +
" ON " +
" aa.qaqc_id = qr.qaqc_id " +
" WHERE " +
" (? IS NULL OR date(qr.created_date) BETWEEN ? AND ?) " +
") AS t2, " +
"( " +
" SELECT " +
" SUM(qr.total_data) AS total_data, " +
" COUNT(CASE WHEN qcl.call_status IS NOT NULL THEN qcl.qaqc_id END) AS completed_calls" +
" FROM " +
" qaqc_request qr " +
" LEFT JOIN " +
" qaqc_upload_data_history qcl " +
" ON " +
" qr.qaqc_id = qcl.qaqc_id " +
" WHERE " +
" (? IS NULL OR date(qr.created_date) BETWEEN ? AND ?) " +
") AS t3, " +
"( " +
" SELECT " +
" COUNT(DISTINCT aa.agent_id) AS no_of_agents " +
" FROM " +
" agent_assigned aa " +
" WHERE " +
" (? IS NULL OR date(aa.created_date) BETWEEN ? AND ?) " +
") AS t4";
// Prepare the parameters for the query
Object[] params = new Object[] {
startDate, startDate, endDate, // For t2
startDate, startDate, endDate, // For t3
startDate, startDate, endDate // For t4
};
// Execute the query and return the results as a List of Maps
return jdbcTemplate.queryForList(sql, params);
}
public List<Map<String, Object>> getAgentPerformanceList(String startDate, String endDate) {
// Base query with subqueries for Assigned, Completed, and Pending
StringBuilder query = new StringBuilder(
"SELECT DISTINCT " +
" assigned_stats.agent_id, " +
" assigned_stats.agent_name, " +
" COALESCE(assigned_stats.Assigned, 0) AS Assigned, " +
" COALESCE(completed_stats.TotalCompleted, 0) AS TotalCompleted, " +
" COALESCE(assigned_stats.Assigned, 0) - COALESCE(completed_stats.TotalCompleted, 0) AS Pending, " +
" CASE WHEN COALESCE(assigned_stats.Assigned, 0) = 0 THEN 0 ELSE " +
" ROUND(COALESCE(completed_stats.TotalCompleted, 0) * 100.0 / COALESCE(assigned_stats.Assigned, 1), 2) " +
" END AS CompletionPercentage, " +
" COALESCE(call_stats.Completed_count, 0) AS Completed_count, " +
" COALESCE(call_stats.Reopened_count, 0) AS Reopened_count, " +
" COALESCE(call_stats.Followup_count, 0) AS Followup_count, " +
" COALESCE(call_stats.Other_count, 0) AS Other_count " +
"FROM " +
" (SELECT al.agent_id as agent_id, al.agent_name as agent_name,SUM(aa.data_count) AS Assigned " +
" FROM agent_assigned aa JOIN agents_list al ON aa.agent_id=al.agent_id " +
" WHERE (? IS NULL OR DATE(aa.created_date) >= STR_TO_DATE(?, '%Y-%m-%d')) " + // Conditional date filtering
" AND (? IS NULL OR DATE(aa.created_date) <= STR_TO_DATE(?, '%Y-%m-%d')) " +
" GROUP BY al.agent_id,al.agent_name) AS assigned_stats " + // The alias 'assigned_stats' is used here
"LEFT JOIN " +
" (SELECT agent_id, COUNT(call_status) AS TotalCompleted " +
" FROM qaqc_upload_data_history " +
" WHERE (? IS NULL OR DATE(created_date) >= STR_TO_DATE(?, '%Y-%m-%d')) " + // Conditional date filtering
" AND (? IS NULL OR DATE(created_date) <= STR_TO_DATE(?, '%Y-%m-%d')) " +
" GROUP BY agent_id) AS completed_stats ON assigned_stats.agent_id = completed_stats.agent_id " +
"LEFT JOIN " +
" (SELECT agent_id, " +
" SUM(CASE WHEN call_status IN ('COMPLETED', 'FOLLOWUP_COMPLETED') THEN 1 ELSE 0 END) AS Completed_count, " +
" SUM(CASE WHEN call_status = 'REOPEN' THEN 1 ELSE 0 END) AS Reopened_count, " +
" SUM(CASE WHEN call_status = 'FOLLOWUP' THEN 1 ELSE 0 END) AS Followup_count, " +
" SUM(CASE WHEN call_status NOT IN ('COMPLETED', 'FOLLOWUP_COMPLETED', 'REOPEN', 'FOLLOWUP') THEN 1 ELSE 0 END) AS Other_count " +
" FROM qaqc_upload_data_history " +
" WHERE (? IS NULL OR DATE(created_date) >= STR_TO_DATE(?, '%Y-%m-%d')) " + // Conditional date filtering
" AND (? IS NULL OR DATE(created_date) <= STR_TO_DATE(?, '%Y-%m-%d')) " +
" GROUP BY agent_id) AS call_stats ON assigned_stats.agent_id = call_stats.agent_id"
);
// Execute query with date range parameters
return jdbcTemplate.queryForList(
query.toString(),
startDate, startDate, endDate, endDate, // Parameters for assigned_stats
startDate, startDate, endDate, endDate, // Parameters for completed_stats
startDate, startDate, endDate, endDate // Parameters for call_stats
);
}
public List<Map<String, Object>> getAgentTaskwiseData(String agentId,String startDate, String endDate) {
String query="WITH LatestCallLogs AS (\r\n"
+ " SELECT \r\n"
+ " cl.qaqc_id,\r\n"
+ " cl.agent_id,\r\n"
+ " cl.complaint_number,\r\n"
+ " cl.call_status,\r\n"
+ " cl.created_date,\r\n"
+ " ROW_NUMBER() OVER (PARTITION BY cl.qaqc_id, cl.agent_id, cl.complaint_number ORDER BY cl.created_date DESC) AS row_num\r\n"
+ " FROM \r\n"
+ " qaqc_call_logs cl\r\n"
+ ")\r\n"
+ "SELECT DISTINCT \r\n"
+ " qr.taskid as taskid,\r\n"
+ " date(aa.created_date) as cdate,\r\n"
+ " aa.data_count AS assigned,\r\n"
+ " COUNT(lcl.agent_id) AS callstaken,\r\n"
+ " (aa.data_count - COUNT(lcl.agent_id)) AS pending,\r\n"
+ " ROUND((COUNT(lcl.agent_id) / aa.data_count) * 100, 2) AS percentage,\r\n"
+ " COUNT(CASE WHEN lcl.call_status IN ('COMPLETED', 'FOLLOWUP_COMPLETED') THEN 1 END) AS Completed,\r\n"
+ " COUNT(CASE WHEN lcl.call_status = 'REOPEN' THEN 1 END) AS Reopened,\r\n"
+ " COUNT(CASE WHEN lcl.call_status = 'FOLLOWUP' THEN 1 END) AS Followup,\r\n"
+ " COUNT(CASE WHEN lcl.call_status NOT IN ('COMPLETED', 'FOLLOWUP_COMPLETED', 'REOPEN', 'FOLLOWUP') THEN 1 END) AS Others\r\n"
+ "FROM \r\n"
+ " qaqc_request qr\r\n"
+ "JOIN \r\n"
+ " agent_assigned aa ON aa.qaqc_id = qr.qaqc_id\r\n"
+ "JOIN \r\n"
+ " agents_list al ON al.agent_id = aa.agent_id\r\n"
+ "LEFT JOIN \r\n"
+ " LatestCallLogs lcl ON qr.qaqc_id = lcl.qaqc_id AND al.agent_id = lcl.agent_id AND lcl.row_num = 1\r\n"
+ "WHERE \r\n"
+ " al.agent_id = ? AND DATE(qr.created_date) >= ? AND DATE(qr.created_date) <= ? \r\n"
+ "GROUP BY \r\n"
+ " taskid, cdate, assigned";
return jdbcTemplate.queryForList(query, agentId,startDate,endDate);
}
public List<Map<String, Object>> getAttendedComplaintStatus(
String startDate, String endDate, String complaintNumber, String complaintMobileNumber) {
// Base query with JOIN to include agent_name
StringBuilder query = new StringBuilder(
"SELECT qcl.*,date(qcl.created_date) as updated_date, al.agent_name " +
"FROM qaqc_call_logs qcl " +
"LEFT JOIN agents_list al ON qcl.agent_id = al.agent_id " +
"WHERE 1=1 ");
// List to store query parameters
List<Object> params = new ArrayList<>();
// Add date range condition if provided
if (startDate != null && !startDate.isEmpty()) {
query.append("AND DATE(qcl.created_date) >= ? ");
params.add(startDate);
}
if (endDate != null && !endDate.isEmpty()) {
query.append("AND DATE(qcl.created_date) <= ? ");
params.add(endDate);
}
// Add complaint number condition if provided
if (complaintNumber != null && !complaintNumber.isEmpty()) {
query.append("AND qcl.complaint_number = ? ");
params.add(complaintNumber);
}
// Add complaint mobile number condition if provided
if (complaintMobileNumber != null && !complaintMobileNumber.isEmpty()) {
query.append("AND qcl.complaint_mobilenumber = ? ");
params.add(complaintMobileNumber);
}
// Add ORDER BY clause
query.append("ORDER BY qcl.created_date DESC ");
// Add LIMIT clause only if complaintNumber is provided
if (complaintNumber != null && !complaintNumber.isEmpty()) {
query.append("LIMIT 1 ");
}
// Execute the query with dynamic parameters
return jdbcTemplate.queryForList(query.toString(), params.toArray());
}
public List<Map<String, Object>> getAttendedComplainthistory(
String startDate, String endDate, String complaintNumber, String complaintMobileNumber) {
// Base query with JOIN to include agent_name
StringBuilder query = new StringBuilder(
"SELECT qcl.*, al.agent_name " +
"FROM qaqc_call_logs qcl " +
"LEFT JOIN agents_list al ON qcl.agent_id = al.agent_id " +
"WHERE 1=1 ");
// List to store query parameters
List<Object> params = new ArrayList<>();
// Add date range condition if provided
if (startDate != null && !startDate.isEmpty()) {
query.append("AND DATE(qcl.created_date) >= ? ");
params.add(startDate);
}
if (endDate != null && !endDate.isEmpty()) {
query.append("AND DATE(qcl.created_date) <= ? ");
params.add(endDate);
}
// Add complaint number condition if provided
if (complaintNumber != null && !complaintNumber.isEmpty()) {
query.append("AND qcl.complaint_number = ? ");
params.add(complaintNumber);
}
// Add complaint mobile number condition if provided
if (complaintMobileNumber != null && !complaintMobileNumber.isEmpty()) {
query.append("AND qcl.complaint_mobilenumber = ? ");
params.add(complaintMobileNumber);
}
// Group by qcl.id and agent_name to avoid SQL error
query.append("GROUP BY qcl.id, al.agent_name ");
// Add ordering clause
query.append("ORDER BY qcl.created_date DESC");
// Execute the query with dynamic parameters
return jdbcTemplate.queryForList(query.toString(), params.toArray());
}
public List<Map<String, Object>> getAgentTaskwiseAssign(String agentId) {
String query="SELECT * FROM qaqc_upload_data_history where agent_id=? ";
return jdbcTemplate.queryForList(query, agentId);
}
public List<Map<String, Object>> getAgentName(int userId) {
String query="SELECT agent_name \r\n"
+ "FROM agents_list\r\n"
+ "where agent_id=?";
return jdbcTemplate.queryForList(query, userId);
}
}

391
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcCallsService.java

@ -0,0 +1,391 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.time.LocalDateTime;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@Service
@Transactional
public class QaqcCallsService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getClosedComplaints(int agent_id) {
String query = "SELECT data_id, complaint_number, complaint_date,complaint_person_name, complaint_mobilenumber, complaint_type,official_name, official_mobilenum,complaint_mode, department,call_category " +
"FROM gcc_1913_qaqc.qaqc_upload_data " +
"WHERE call_category = 'CLOSED' " +
" AND is_processed = FALSE " + // Fetch only unprocessed entries
" AND agent_id = ?";
return jdbcTemplate.queryForList(query, agent_id);
}
public List<Map<String, Object>> getCallCategories()
{
String query = "SELECT call_status " +
"FROM gcc_1913_qaqc.call_status WHERE call_category_id ='1' and isactive='1'";
return jdbcTemplate.queryForList(query);
}
@Transactional
public int uploadComplaintDetailsInLogs(Map<String, Object> logDetails, String action, String complaintNumber, String remainderDate) {
//System.out.println("Complaint Details: " + logDetails);
// Extract other field values from complaintDetails
int qaqcid = (int) logDetails.get("qaqc_id");
String ccategory = logDetails.get("call_category").toString();
String complaintDate = logDetails.get("complaint_date").toString();
String personName = logDetails.get("complaint_person_name").toString();
String personMobNo = logDetails.get("complaint_mobilenumber").toString();
String cType = logDetails.get("complaint_type").toString();
String cMode = logDetails.get("complaint_mode").toString();
String department = logDetails.get("department").toString();
String cGroup = logDetails.get("complaint_group").toString();
String officialName = logDetails.get("official_name").toString();
String officialMobileNum = logDetails.get("official_mobilenum").toString();
String callStatus = logDetails.get("call_status").toString();
String remarks = logDetails.get("remarks").toString();
int agentId = (int) logDetails.get("agent_id");
int updated_agent=(int)logDetails.get("updated_agent");
boolean isProcessed = (boolean)logDetails.get("is_processed");
LocalDateTime currentDate = LocalDateTime.now();
// Determine which table to insert into based on the action
if (action.equals("FOLLOWUP")) {
String query = "INSERT INTO gcc_1913_qaqc.qaqc_followup_call_logs (qaqc_id, call_category, agent_id, complaint_number,complaint_date, complaint_person_name, "
+ "complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name, remainder_date,official_mobilenum, call_status, remarks,created_date,updated_agent) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?)";
int rowsAffected = jdbcTemplate.update(query, qaqcid, ccategory, agentId, complaintNumber, complaintDate,personName,
personMobNo, cType, cMode, department, cGroup, officialName,remainderDate, officialMobileNum,callStatus,
remarks,currentDate,updated_agent);
//System.out.println("Rows Inserted in qaqc_followup_call_logs : " + rowsAffected);
String query1 = "INSERT INTO gcc_1913_qaqc.qaqc_call_logs (qaqc_id, call_category, agent_id, complaint_number,complaint_date, complaint_person_name, "
+ "complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name,remainder_date, official_mobilenum, call_status, remarks, is_processed,updated_agent) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?)";
int rowsAffected1 = jdbcTemplate.update(query1, qaqcid, ccategory, agentId, complaintNumber, complaintDate,personName,
personMobNo, cType, cMode, department, cGroup, officialName,remainderDate, officialMobileNum, callStatus, remarks,
isProcessed,updated_agent);
//System.out.println("Rows Inserted in qaqc_call_logs : " + rowsAffected1);
return rowsAffected + rowsAffected1;
} else {
String query = "INSERT INTO gcc_1913_qaqc.qaqc_call_logs (qaqc_id, call_category, agent_id, complaint_number, complaint_date,complaint_person_name, "
+ "complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name, official_mobilenum, call_status, remarks, is_processed,updated_agent) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)";
int rowsAffected = jdbcTemplate.update(query, qaqcid, ccategory, agentId, complaintNumber,complaintDate, personName,
personMobNo, cType, cMode, department, cGroup, officialName, officialMobileNum, callStatus, remarks,
isProcessed,updated_agent);
//System.out.println("Rows Inserted in qaqc_call_logs: " + rowsAffected);
return rowsAffected;
}
}
public void updateComplaintDetails(String complaintNumber,int dataId, String action, String remarks,int updated_agent)
{
String query = "UPDATE gcc_1913_qaqc.qaqc_upload_data " +
"SET call_status = ?, " + " remarks = ?,updated_agent=?, " +
" updated_date = CURRENT_TIMESTAMP, " + " is_processed = TRUE " +
"WHERE data_id = ? " +" AND complaint_number = ? " +" AND call_category = 'CLOSED'";
int rowsUpdated = jdbcTemplate.update(query, action, remarks,updated_agent, dataId,complaintNumber);
//System.out.println("Rows Updated in upload data: " + rowsUpdated);
}
public Map<String, Object> getComplaintDetails(int dataId) {
String query = "Select * from gcc_1913_qaqc.qaqc_upload_data where data_id = ?";
return jdbcTemplate.queryForMap(query, dataId);
}
public Map<String, Object> getErpnameById(Integer agentId) {
String query = "Select erp_username from agents_list where agent_id = ?";
return jdbcTemplate.queryForMap(query, agentId);
}
// public boolean ChangeStatusInErp(String complaintNumber, String remarks, String action,String Erpname) {
// String urlString = "";
//
// if(remarks.isEmpty()) {
// remarks="N/A";
// }
//
// if("COMPLETED".equals(action) || "WRONG_ASSIGN".equals(action)) {
//
// urlString="https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?serviceId=UpdateComplaint&ComplaintId="+complaintNumber+"&Message="+remarks+"&UserType=Official&Status=11&erp_username="+Erpname;
// System.out.println(urlString);
// //urlencode
// try {
//
// URL url = new URL(urlString);
// URLConnection urlcon=url.openConnection();
// InputStream stream=urlcon.getInputStream();
// StringBuilder responseBuilder = new StringBuilder();
// int i;
// while((i=stream.read())!=-1){
// responseBuilder.append((char) i);
// }
// stream.close();
//
// // Parse the response
// String response = responseBuilder.toString();
// System.out.println("Raw Response from ERP if Completed: " + response); // Debug: Print the raw response
//
// // Check ResultStatus in the response
// if (response.contains("\"ResultStatus\": true")) {
// System.out.println("ResultStatus is true in the response."); // Debug: Positive ResultStatus
// return true;
// }
// else {
// System.out.println("ResultStatus is false or not present in the response."); // Debug: Negative or missing ResultStatus
// return false;
// }
// } catch (Exception e) {
// e.printStackTrace();
// return false;
// }
// }
//
// if("REOPEN".equals(action)) {
// urlString="https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?serviceId=UpdateComplaint&ComplaintId="+complaintNumber+"&Message="+remarks+"&UserType=Official&Status=9&Comp_Image=64baseString&erp_username="+Erpname;
// System.out.println(urlString);
// try {
// URL url = new URL(urlString);
// URLConnection urlcon=url.openConnection();
// InputStream stream=urlcon.getInputStream();
// StringBuilder responseBuilder = new StringBuilder();
// int i;
// while((i=stream.read())!=-1){
// responseBuilder.append((char) i);
// }
// stream.close();
//
// // Parse the response
// String response = responseBuilder.toString();
// System.out.println("Raw Response from ERP if Reopen: " + response);
//
// // Check ResultStatus in the response
// if (response.contains("\"ResultStatus\": true")) {
// System.out.println("ResultStatus is true in the response."); // Debug: Positive ResultStatus
// return true;
// }
// else {
// System.out.println("ResultStatus is false or not present in the response."); // Debug: Negative or missing ResultStatus
// return false;
// }
// } catch (Exception e) {
// e.printStackTrace();
// return false;
// }
// }
// return false;
//
// }
// public boolean ChangeStatusInErp(String complaintNumber, String remarks, String action, String Erpname) {
// String urlString = "";
//
// if (remarks.isEmpty()) {
// remarks = "N/A";
// }
//
// try {
// // Encode parameters
// String encodedComplaintNumber = URLEncoder.encode(complaintNumber, StandardCharsets.UTF_8.toString()).replace("+", "%20");
// String encodedRemarks = URLEncoder.encode(remarks, StandardCharsets.UTF_8.toString()).replace("+", "%20");
// String encodedErpname = URLEncoder.encode(Erpname, StandardCharsets.UTF_8.toString()).replace("+", "%20");
//
// if ("COMPLETED".equals(action) || "WRONG_ASSIGN".equals(action)) {
// urlString = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?"
// + "serviceId=UpdateComplaint"
// + "&ComplaintId=" + encodedComplaintNumber
// + "&Message=" + encodedRemarks
// + "&UserType=Official"
// + "&Status=11"
// + "&erp_username=" + encodedErpname;
//
// System.out.println(urlString);
//
// return sendRequest(urlString);
// }
//
// if ("REOPEN".equals(action)) {
// urlString = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?"
// + "serviceId=UpdateComplaint"
// + "&ComplaintId=" + encodedComplaintNumber
// + "&Message=" + encodedRemarks
// + "&UserType=Official"
// + "&Status=9"
// + "&Comp_Image=64baseString"
// + "&erp_username=" + encodedErpname;
//
// System.out.println(urlString);
//
// return sendRequest(urlString);
// }
// } catch (Exception e) {
// e.printStackTrace();
// return false;
// }
//
// return false;
// }
public boolean ChangeStatusInErp(String complaintNumber, String remarks, String action, String Erpname) {
String baseUrl = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?";
String status = "";
if (remarks.isEmpty()) {
remarks = "N/A";
}
try {
// Encode parameters
String encodedComplaintNumber = URLEncoder.encode(complaintNumber, StandardCharsets.UTF_8.toString()).replace("+", "%20");
String encodedRemarks = URLEncoder.encode(remarks, StandardCharsets.UTF_8.toString()).replace("+", "%20");
String encodedErpname = URLEncoder.encode(Erpname, StandardCharsets.UTF_8.toString()).replace("+", "%20");
// Determine status based on action
if ("COMPLETED".equals(action) || "WRONG_ASSIGN".equals(action)) {
status = "11";
} else if ("REOPEN".equals(action)) {
status = "9";
} else {
return false; // Invalid action, return false
}
// Construct the URL
String urlString = baseUrl
+ "serviceId=UpdateComplaint"
+ "&ComplaintId=" + encodedComplaintNumber
+ "&Message=" + encodedRemarks
+ "&UserType=Official"
+ "&Status=" + status
+ "&Comp_Image="
+ "&erp_username=" + encodedErpname;
System.out.println(urlString);
// Send the request
return sendRequest(urlString);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private boolean sendRequest(String urlString) {
try {
URL url = new URL(urlString);
URLConnection urlcon = url.openConnection();
InputStream stream = urlcon.getInputStream();
StringBuilder responseBuilder = new StringBuilder();
int i;
while ((i = stream.read()) != -1) {
responseBuilder.append((char) i);
}
stream.close();
// Parse the response
String response = responseBuilder.toString();
//System.out.println("Raw Response: " + response);
// Check ResultStatus in the response
if (response.contains("\"ResultStatus\": true")) {
//System.out.println("ResultStatus is true in the response.");
return true;
} else {
System.out.println("ResultStatus is false or not present in the response.");
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public void saveMobileNumDetails(String complaintNumber, String remarks) {
String query = "insert into officer_mobileno (complaint_number,remarks) values(?,?)";
int rowsUpdated = jdbcTemplate.update(query, complaintNumber, remarks);
//System.out.println("Rows Updated: " + rowsUpdated);
}
public Map<String,Object> checkComplaintDetail(String complaintNumber) {
String query = "select id,complaint_number from qaqc_followup_call_logs where complaint_number = ?";
try {
return jdbcTemplate.queryForMap(query, complaintNumber);
} catch (Exception e) {
System.out.println("Complaint number not found");
return null;
}
}
public void updateFollowupCallLogs(String complaintNumber, String action, String remarks, int followupid) {
//System.out.println(complaintNumber+action+remarks);
String query = "update gcc_1913_qaqc.qaqc_followup_call_logs set call_status = ?,remarks = ? where complaint_number= ? and id =?";
int rowsUpdated = jdbcTemplate.update(query, action, remarks, complaintNumber, followupid);
//System.out.println("Rows Updated in followup: " + rowsUpdated);
}
public List<Map<String, Object>> getSubmitDetails(int userId) {
String query = "SELECT complaint_number, complaint_date,complaint_person_name, complaint_mobilenumber, " +
"complaint_type, call_status, remarks " +
"FROM gcc_1913_qaqc.qaqc_upload_data " +
"WHERE agent_id = ? AND call_category = 'CLOSED' AND is_processed = '1'";
return jdbcTemplate.queryForList(query,userId);
}
public void updateComplaintHistoryDetails(String complaintNumber, int dataId, String action, String remarks,int updated_agent,
String remainderDate) {
String query = "UPDATE gcc_1913_qaqc.qaqc_upload_data_history \r\n"
+ "SET call_status = ?, remarks = ?, updated_date = CURRENT_TIMESTAMP, remainder_date = ?,updated_agent=?\r\n"
+ "WHERE data_id = ? AND complaint_number = ? AND call_category = 'CLOSED'";
int rowsUpdated = jdbcTemplate.update(query, action, remarks, remainderDate,updated_agent, dataId, complaintNumber);
//System.out.println("Rows Updated in upload history: " + rowsUpdated);
}
}

357
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcService.java

@ -0,0 +1,357 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;
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.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class QaqcService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Map<String, Object>> getFollowUpDetailsByStatus(String callStatus, LocalDate fromDate, LocalDate toDate) {
// Start the SQL query
String sql = "SELECT " +
"f.id, " +
"f.qaqc_id, " +
"f.call_category, " +
"f.complaint_number, " +
"f.agent_id, " +
"f.complaint_person_name, " +
"f.complaint_mobilenumber, " +
"f.complaint_type, " +
"f.complaint_mode, " +
"f.department, " +
"f.complaint_group, " +
"f.official_name, " +
"f.official_mobilenum, " +
"f.call_status, " +
"f.remainder_date, " +
"f.remarks, " +
"f.created_date, " +
"r.taskid " +
"FROM qaqc_followup_call_logs f " +
"LEFT JOIN qaqc_request r ON f.qaqc_id = r.qaqc_id ";
// List to hold the query parameters
List<Object> params = new ArrayList<>();
boolean hasCondition = false;
// Filter by callStatus if provided
if (callStatus != null && !callStatus.isEmpty()) {
sql += " WHERE f.call_status = ?";
params.add(callStatus);
hasCondition = true;
}
// Filter by date range (fromDate to toDate) if both are provided
if (fromDate != null && toDate != null) {
if (hasCondition) {
sql += " AND f.remainder_date BETWEEN ? AND ?";
} else {
sql += " WHERE f.remainder_date BETWEEN ? AND ?";
hasCondition = true;
}
params.add(fromDate);
params.add(toDate);
}
// If only fromDate is provided
else if (fromDate != null) {
if (hasCondition) {
sql += " AND f.remainder_date >= ?";
} else {
sql += " WHERE f.remainder_date >= ?";
hasCondition = true;
}
params.add(fromDate);
}
// If only toDate is provided (include records with remainder_date greater than toDate)
else if (toDate != null) {
if (hasCondition) {
sql += " AND (f.remainder_date <= ? OR f.remainder_date > ?)";
} else {
sql += " WHERE (f.remainder_date <= ? OR f.remainder_date > ?)";
hasCondition = true;
}
params.add(toDate); // <= toDate condition
params.add(toDate); // > toDate condition
}
// Final debugging: print the query and parameters
//System.out.println("Final SQL Query: " + sql);
//System.out.println("Query Parameters: " + params);
// Execute the query with the dynamically added parameters
return jdbcTemplate.queryForList(sql, params.toArray());
}
/*
public Map<String, Long> countFollowUpsByDateAndStatus(LocalDate today, String followupStatus) {
String sqlNotClosed = "SELECT COUNT(*) FROM qaqc_followup_call_logs " +
"WHERE call_status = ? AND DATE(remainder_date) = ? AND call_category NOT IN ('CLOSED')";
String sqlClosed = "SELECT COUNT(*) FROM qaqc_followup_call_logs " +
"WHERE call_status = ? AND DATE(remainder_date) = ? AND call_category IN ('CLOSED')";
long countNotClosed = jdbcTemplate.queryForObject(sqlNotClosed, new Object[]{followupStatus, today}, Long.class);
long countClosed = jdbcTemplate.queryForObject(sqlClosed, new Object[]{followupStatus, today}, Long.class);
Map<String, Long> result = new HashMap<>();
result.put("officialfollowup", countNotClosed);
result.put("publicfollowup", countClosed);
return result;
}
*/
public Map<String, Long> countFollowUpsByDateAndStatus(LocalDate today, String followupStatus) {
String sqlNotClosed = "SELECT COUNT(*) FROM qaqc_followup_call_logs " +
"WHERE call_status = ? AND DATE(remainder_date) = ? AND call_category NOT IN ('CLOSED','PUBLICFOLLOWUP')";
String sqlClosed = "SELECT COUNT(*) FROM qaqc_followup_call_logs " +
"WHERE call_status = ? AND DATE(remainder_date) = ? AND call_category IN ('CLOSED','PUBLICFOLLOWUP')";
long countNotClosed = jdbcTemplate.queryForObject(sqlNotClosed, new Object[]{followupStatus, today}, Long.class);
long countClosed = jdbcTemplate.queryForObject(sqlClosed, new Object[]{followupStatus, today}, Long.class);
Map<String, Long> result = new HashMap<>();
result.put("officialfollowup", countNotClosed);
result.put("publicfollowup", countClosed);
return result;
}
public List<Map<String, Object>> getUnattendedlist(Integer ucount) {
String query1="SELECT \r\n"
+ " MIN(complaint_date) AS complaint_date, \r\n"
+ " MIN(call_category) AS call_category, \r\n"
+ " MIN(complaint_person_name) AS complaint_person_name, \r\n"
+ " MIN(complaint_mobilenumber) AS complaint_mobilenumber, \r\n"
+ " complaint_number AS complaint_number, \r\n"
+ " MIN(complaint_group) AS complaint_group, \r\n"
+ " MIN(complaint_type) AS complaint_type, \r\n"
+ " MIN(complaint_mode) AS complaint_mode \r\n"
+ " FROM qaqc_upload_data_history \r\n"
+ " WHERE unattended_msg = 0 \r\n"
+ " AND call_status = 'UNATTENDED' \r\n"
+ " AND call_category IN ('CLOSED', 'PUBLICFOLLOWUP') \r\n"
+ " GROUP BY complaint_number \r\n"
+ " HAVING COUNT(*) >= ? \r\n"
+ " LIMIT 100";
// Log query and parameters for debugging
//System.out.println("Executing query: " + query1);
//System.out.println("With parameters: " + ucount);
List<Map<String, Object>> results = jdbcTemplate.queryForList(query1, ucount);
// Log results for debugging
//System.out.println("Query results: " + results);
return results.isEmpty() ? Collections.emptyList() : results;
}
public boolean ChangeStatusInErp(String complaintNumber,String erp_name,String remarks) {
String baseUrl = "https://erp.chennaicorporation.gov.in/pgr/external/mobileservice?";
String status = "11";
//String Erpname ="QAops1";
try {
// Encode parameters
String encodedComplaintNumber = URLEncoder.encode(complaintNumber, StandardCharsets.UTF_8.toString()).replace("+", "%20");
String encodedRemarks = URLEncoder.encode(remarks, StandardCharsets.UTF_8.toString()).replace("+", "%20");
String encodedErpname = URLEncoder.encode(erp_name, StandardCharsets.UTF_8.toString()).replace("+", "%20");
//System.out.println("encodedComplaintNumber===="+encodedComplaintNumber);
//System.out.println("encodedErpname===="+encodedErpname);
//System.out.println("encodedRemarks===="+encodedRemarks);
// Construct the URL
String urlString = baseUrl
+ "serviceId=UpdateComplaint"
+ "&ComplaintId=" + encodedComplaintNumber
+ "&Message=" + encodedRemarks
+ "&UserType=Official"
+ "&Status=" + status
+ "&Comp_Image="
+ "&erp_username=" + encodedErpname;
System.out.println("ERP Hitting URL="+urlString);
// Send the request
return sendRequest(urlString);
//return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private boolean sendRequest(String urlString) {
try {
URL url = new URL(urlString);
URLConnection urlcon = url.openConnection();
InputStream stream = urlcon.getInputStream();
StringBuilder responseBuilder = new StringBuilder();
int i;
while ((i = stream.read()) != -1) {
responseBuilder.append((char) i);
}
stream.close();
// Parse the response
String response = responseBuilder.toString();
//System.out.println("Raw Response: " + response);
// Check ResultStatus in the response
if (response.contains("\"ResultStatus\": true")) {
//System.out.println("ResultStatus is true in the response.");
return true;
} else {
System.out.println("ResultStatus is false or not present in the response.");
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public String getErpusernamebyId(String userId) {
String query="SELECT erp_username FROM gcc_1913_qaqc.agents_list\r\n"
+ "where calling_type='1913ADMIN' and agent_id=?";
//System.out.println("query"+query);
//String erpUsername = jdbcTemplate.queryForObject(query,new Object[]{userId},String.class);
String erpUsername = jdbcTemplate.queryForObject(query,String.class,userId);
return erpUsername;
}
public int UpdateInHistoryTable(List<String> completedComplaints) {
int totalUpdated = 0;
for (String cnum : completedComplaints) {
String query = "UPDATE qaqc_upload_data_history SET unattended_msg = 1 WHERE complaint_number = ?";
// Update using JdbcTemplate and accumulate the count
int rowsUpdated = jdbcTemplate.update(query, cnum);
// Accumulate the number of successfully updated rows
totalUpdated += rowsUpdated;
}
return totalUpdated; // Return the total number of updated rows
}
public int insertInLogs(List<String> completedComplaints,String remarks,String userId) {
int totalUpdated = 0;
int rowsUpdated=0;
for (String cnum : completedComplaints) {
List<Map<String,Object>>details=getComplaintsLatestDetails(cnum);
if(!details.isEmpty()) {
for (Map<String, Object> detail : details) {
int qaqc_id = Integer.parseInt(detail.get("qaqc_id").toString());
String call_category = "UNATTENDED";
int agent_id = Integer.parseInt(detail.get("agent_id").toString());
// # id, qaqc_id, call_category, agent_id, complaint_number, complaint_date, complaint_person_name,
// complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name, official_mobilenum,
// call_status, remainder_date, remarks, created_date, is_processed, updated_agent
String complaint_number = detail.get("complaint_number").toString();
String complaint_date = detail.get("complaint_date").toString();
String complaint_person_name = detail.get("complaint_person_name").toString();
String complaint_mobilenumber = detail.get("complaint_mobilenumber").toString();
String complaint_type = detail.get("complaint_type").toString();
String complaint_mode = detail.get("complaint_mode").toString();
String department = detail.get("department").toString();
String complaint_group = detail.get("complaint_group").toString();
String official_name = detail.get("official_name").toString();
String official_mobilenum = detail.get("official_mobilenum").toString();
String call_status = "COMPLETED";
String upremarks=remarks;
int is_processed=1;
int updated_agent = Integer.parseInt(userId);
String query = "INSERT INTO gcc_1913_qaqc.qaqc_call_logs (qaqc_id, call_category, agent_id, complaint_number, complaint_date,complaint_person_name, "
+ "complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name, official_mobilenum, call_status, remarks, is_processed,updated_agent) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)";
rowsUpdated = jdbcTemplate.update(query, qaqc_id, call_category, agent_id, complaint_number,complaint_date, complaint_person_name,
complaint_mobilenumber, complaint_type, complaint_mode, department, complaint_group, official_name, official_mobilenum, call_status, upremarks,
is_processed,updated_agent);
totalUpdated += rowsUpdated;
}
}
else {
return 0;
}
}
return totalUpdated;
}
public List<Map<String,Object>> getComplaintsLatestDetails(String complaint_number){
String query = "SELECT * FROM qaqc_upload_data_history WHERE complaint_number = ? ORDER BY created_date DESC LIMIT 1";
List<Map<String,Object>> getCompNumber = jdbcTemplate.queryForList(query, complaint_number);
return getCompNumber;
}
}

291
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/QaqcTaskListService.java

@ -0,0 +1,291 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class QaqcTaskListService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// old overalltaskcount wise method
// public List<Map<String, Object>> getComplaintAndCallStatusCounts(String startDate, String endDate) {
// String sql = "SELECT " +
// "t1.total_tasks, " +
// "t2.total_calls, " +
// "t3.completed_calls, " +
// "t2.total_calls - t3.completed_calls AS pending_calls " +
// "FROM " +
// "( " +
// " SELECT " +
// " COUNT(qaqc_id) AS total_tasks " +
// " FROM " +
// " qaqc_request " +
// " WHERE " +
// " (? IS NULL OR created_date BETWEEN ? AND ?) " +
// ") AS t1, " +
// "( " +
// " SELECT " +
// " SUM(total_data) AS total_calls " +
// " FROM " +
// " qaqc_request " +
// " WHERE " +
// " (? IS NULL OR created_date BETWEEN ? AND ?) " +
// ") AS t2, " +
// "( " +
// " SELECT " +
// " SUM(qr.total_data) AS total_data, " +
// " COUNT(CASE WHEN qcl.qaqc_id IS NOT NULL THEN qcl.qaqc_id END) AS completed_calls " +
// " FROM " +
// " qaqc_request qr " +
// " LEFT JOIN " +
// " qaqc_call_logs qcl " +
// " ON " +
// " qr.qaqc_id = qcl.qaqc_id " +
// " WHERE " +
// " (? IS NULL OR qcl.created_date BETWEEN ? AND ?) " +
// ") AS t3;";
//
// // Prepare the parameters for the query
// Object[] params = new Object[] {
// startDate, startDate, endDate,
// startDate, startDate, endDate,
// startDate, startDate, endDate
// };
//
// // Execute the query and return the results as a List of Maps
// return jdbcTemplate.queryForList(sql, params);
// }
//updated overalltaskcount method
public List<Map<String, Object>> getComplaintAndCallStatusCounts(String startDate, String endDate) {
// Start constructing the SQL query dynamically
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("t1.total_tasks, ")
.append("t2.total_calls, ")
.append("t3.completed_calls, ")
.append("t2.total_calls - t3.completed_calls AS pending_calls, ")
.append("t4.no_of_agents ")
.append("FROM ")
.append("( ")
.append(" SELECT ")
.append(" COUNT(qaqc_id) AS total_tasks ")
.append(" FROM ")
.append(" qaqc_request qr ");
// Adding dynamic WHERE conditions for date range if provided
if (startDate != null && endDate != null) {
sql.append("WHERE DATE(qr.created_date) >= ? AND DATE(qr.created_date) <= ? ");
}
sql.append(") AS t1, ")
.append("( ")
.append(" SELECT ")
.append(" SUM(aa.data_count) AS total_calls ")
.append(" FROM ")
.append(" agent_assigned aa ")
.append(" INNER JOIN ")
.append(" qaqc_request qr ")
.append(" ON ")
.append(" aa.qaqc_id = qr.qaqc_id ");
if (startDate != null && endDate != null) {
sql.append("WHERE DATE(qr.created_date) >= ? AND DATE(qr.created_date) <= ? ");
}
sql.append(") AS t2, ")
.append("( ")
.append(" SELECT ")
.append(" SUM(qr.total_data) AS total_data, ")
.append(" COUNT(CASE WHEN qcl.call_status IS NOT NULL THEN qcl.qaqc_id END) AS completed_calls ")
.append(" FROM ")
.append(" qaqc_request qr ")
.append(" LEFT JOIN ")
.append(" qaqc_upload_data_history qcl ")
.append(" ON ")
.append(" qr.qaqc_id = qcl.qaqc_id ");
if (startDate != null && endDate != null) {
sql.append("WHERE DATE(qcl.created_date) >= ? AND DATE(qcl.created_date) <= ? ");
}
sql.append(") AS t3, ")
.append("( ")
.append(" SELECT ")
.append(" COUNT(DISTINCT aa.agent_id) AS no_of_agents ")
.append(" FROM ")
.append(" agent_assigned aa ");
if (startDate != null && endDate != null) {
sql.append("WHERE DATE(aa.created_date) >= ? AND DATE(aa.created_date) <= ? ");
}
sql.append(") AS t4;");
// Prepare the parameters dynamically based on the presence of the date range
List<Object> params = new ArrayList<>();
if (startDate != null && endDate != null) {
params.add(startDate);
params.add(endDate);
params.add(startDate);
params.add(endDate);
params.add(startDate);
params.add(endDate);
params.add(startDate);
params.add(endDate);
}
// Execute the query and return the results as a List of Maps
return jdbcTemplate.queryForList(sql.toString(), params.toArray());
}
//old taskwise querymethod
// public List<Map<String, Object>> getTaskwiseData(String startDate, String endDate) {
// // Base query
// StringBuilder query = new StringBuilder(
// "SELECT " +
// " qr.taskid, " +
// " MAX(qr.total_data) AS Assigned, " +
// " MAX(qr.created_date) AS TaskCreatedDate, " +
// " COUNT(CASE WHEN acl.qaqc_id IS NOT NULL THEN qr.qaqc_id END) AS TotalCompleted, " +
// " MAX(qr.total_data) - COUNT(CASE WHEN acl.qaqc_id IS NOT NULL THEN qr.qaqc_id END) AS Pending, " + // Pending calculated as Assigned - TotalCompleted
// " COUNT(CASE WHEN acl.call_status = 'COMPLETED' THEN 1 END) AS Completed, " +
// " COUNT(CASE WHEN acl.call_status = 'REOPENED' THEN 1 END) AS Reopened, " +
// " COUNT(CASE WHEN acl.call_status = 'FOLLOWUP' THEN 1 END) AS Followup " +
// "FROM qaqc_request qr " +
// "LEFT JOIN qaqc_call_logs acl " +
// "ON qr.qaqc_id = acl.qaqc_id "
// );
//
// // Adding dynamic WHERE conditions for date range
// if (startDate != null && endDate != null) {
// query.append("WHERE qr.created_date BETWEEN ? AND ? ");
// }
//
// // Grouping by taskid
// query.append("GROUP BY qr.taskid");
//
// // Query Execution
// if (startDate != null && endDate != null) {
// return jdbcTemplate.queryForList(query.toString(), startDate, endDate);
// } else {
// return jdbcTemplate.queryForList(query.toString());
// }
// }
//updated taskwisedata query method
public List<Map<String, Object>> getTaskwiseData(String startDate, String endDate) {
// Base query with subqueries for Assigned and Pending calculations
StringBuilder query = new StringBuilder(
"SELECT " +
" qr.qaqc_id, " +
" qr.taskid, " +
" qr.call_category, " +
" qr.description, " +
" (" +
" SELECT SUM(aa.data_count) " +
" FROM agent_assigned aa " +
" WHERE aa.qaqc_id = qr.qaqc_id" +
" ) AS Assigned, " +
" MAX(DATE(qr.created_date)) AS TaskCreatedDate, " +
" COUNT(CASE WHEN acl.call_status IS NOT NULL THEN acl.qaqc_id END) AS TotalCompleted, " +
" (" +
" SELECT SUM(aa.data_count) " +
" FROM agent_assigned aa " +
" WHERE aa.qaqc_id = qr.qaqc_id" +
" ) - COUNT(CASE WHEN acl.call_status IS NOT NULL THEN acl.qaqc_id END) AS Pending, " +
" COUNT(CASE WHEN acl.call_status IN ('COMPLETED', 'FOLLOWUP_COMPLETED') THEN 1 END) AS Completed, " +
" COUNT(CASE WHEN acl.call_status = 'REOPEN' THEN 1 END) AS Reopened, " +
" COUNT(CASE WHEN acl.call_status = 'FOLLOWUP' THEN 1 END) AS Followup, " +
" COUNT(CASE WHEN acl.call_status NOT IN ('COMPLETED', 'FOLLOWUP_COMPLETED', 'REOPEN', 'FOLLOWUP') THEN 1 ELSE NULL END) AS Others " +
"FROM qaqc_request qr " +
"LEFT JOIN qaqc_upload_data_history acl " +
"ON qr.qaqc_id = acl.qaqc_id "
);
// Adding dynamic WHERE conditions for date range if provided
if (startDate != null && endDate != null) {
query.append("WHERE DATE(qr.created_date) >= ? AND DATE(qr.created_date) <= ? ");
}
// Grouping by taskid and qaqc_id to calculate Assigned and Pending
query.append("GROUP BY qr.taskid, qr.qaqc_id ");
// Adding ORDER BY clause for descending order of created_date
query.append("ORDER BY TaskCreatedDate DESC, qr.qaqc_id DESC");
// Query execution with parameters for start and end dates if available
if (startDate != null && endDate != null) {
return jdbcTemplate.queryForList(query.toString(), startDate, endDate);
} else {
return jdbcTemplate.queryForList(query.toString());
}
}
public List<Map<String, Object>> getAgentwiseData(String qaqc_id) {
String query= "SELECT DISTINCT \r\n"
+ " al.agent_id,\r\n"
+ " al.agent_name AS agentName,\r\n"
+ " qr.taskid AS taskId,\r\n"
+ " qr.fromdate AS fromdate,\r\n"
+ " qr.todate AS todate,\r\n"
+ " qr.description AS description,\r\n"
+ " qr.call_category AS call_category,\r\n"
+ " qr.complaint_region AS complaint_region,\r\n"
+ " qr.complaint_group AS complaint_group,\r\n"
+ " qr.complaint_type AS complaint_type,\r\n"
+ " qr.complaint_mode AS complaint_mode,\r\n"
+ " qr.complaint_zone AS complaint_zone,\r\n"
+ " DATE(qr.created_date) AS TaskCreatedDate,\r\n"
+ " aa.data_count AS assigned,\r\n"
+ " COUNT(lcl.call_status) AS callstaken,\r\n"
+ " (aa.data_count - COUNT(lcl.call_status)) AS pending,\r\n"
+ " ROUND((COUNT(lcl.call_status) / aa.data_count) * 100, 2) AS percentage,\r\n"
+ " COUNT(CASE WHEN lcl.call_status IN ('COMPLETED', 'FOLLOWUP_COMPLETED') THEN 1 END) AS Completed,\r\n"
+ " COUNT(CASE WHEN lcl.call_status = 'REOPEN' THEN 1 END) AS Reopened,\r\n"
+ " COUNT(CASE WHEN lcl.call_status = 'FOLLOWUP' THEN 1 END) AS Followup,\r\n"
+ " COUNT(CASE WHEN lcl.call_status NOT IN ('COMPLETED', 'FOLLOWUP_COMPLETED', 'REOPEN', 'FOLLOWUP') THEN 1 END) AS Others\r\n"
+ "FROM qaqc_request qr\r\n"
+ "JOIN agent_assigned aa ON aa.qaqc_id = qr.qaqc_id\r\n"
+ "JOIN agents_list al ON al.agent_id = aa.agent_id\r\n"
+ "LEFT JOIN qaqc_upload_data_history lcl ON qr.qaqc_id = lcl.qaqc_id AND al.agent_id = lcl.agent_id \r\n"
+ "WHERE qr.qaqc_id = ?\r\n"
+ "GROUP BY al.agent_id, al.agent_name, aa.data_count";
return jdbcTemplate.queryForList(query, qaqc_id);
}
}

361
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/ScpService.java

@ -0,0 +1,361 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class ScpService {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysqlScpDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// Method to enrich report data with questions_part
public List<Map<String, Object>> enrichScpReportWithQuestions(List<Map<String, Object>> reportData) {
// Step 1: Fetch all questions
String questionSql = "SELECT id AS question_id, questions AS question, answer_type, isactive, isdelete FROM questions WHERE isactive=1 AND isdelete=0";
List<Map<String, Object>> questionList = jdbcTemplate.queryForList(questionSql);
// Step 2: Fetch all answers (master answers)
String answerSql = "SELECT question_id, answer FROM answers WHERE isactive=1 AND isdelete=0";
List<Map<String, Object>> answerList = jdbcTemplate.queryForList(answerSql);
// Convert answerList to Map<question_id, List<String>> for easy mapping
Map<Integer, List<String>> answerMasterMap = new HashMap<>();
for (Map<String, Object> ans : answerList) {
Integer qid = (Integer) ans.get("question_id");
String answerVal = (String) ans.get("answer");
answerMasterMap.computeIfAbsent(qid, k -> new ArrayList<>()).add(answerVal);
}
/*
// Step 3: Fetch all scp_report entries for these scp_ids
List<Long> scpIds = reportData.stream()
.map(d -> ((Number) d.get("id")).longValue())
.collect(Collectors.toList());
// Step 4: Get existing scp_ids from scp_report
Set<Long> existingScpIds = new HashSet<>();
if (!scpIds.isEmpty()) {
String inClause = scpIds.stream().map(id -> "?").collect(Collectors.joining(","));
String sql = "SELECT DISTINCT scp_id FROM scp_report WHERE isactive=1 AND isdelete=0 AND scp_id IN (" + inClause + ")";
List<Map<String, Object>> existingList = jdbcTemplate.queryForList(sql, scpIds.toArray());
for (Map<String, Object> row : existingList) {
existingScpIds.add(((Number) row.get("scp_id")).longValue());
}
}
// Step 5: Filter out already answered scp_ids
List<Map<String, Object>> filteredReportData = reportData.stream()
.filter(d -> !existingScpIds.contains(((Number) d.get("id")).longValue()))
.collect(Collectors.toList());
*/
// Step 3: Fetch all scp_report entries for these scp_ids
List<Long> scpIds = new ArrayList<Long>();
for (Map<String, Object> d : reportData) {
Object idObj = d.get("id");
if (idObj instanceof Number) {
scpIds.add(((Number) idObj).longValue());
}
}
// Step 4: Get existing scp_ids from scp_report
Set<Long> existingScpIds = new HashSet<Long>();
if (!scpIds.isEmpty()) {
// Build the IN clause placeholders
StringBuilder inClause = new StringBuilder();
for (int i = 0; i < scpIds.size(); i++) {
if (i > 0) inClause.append(",");
inClause.append("?");
}
String sql = "SELECT DISTINCT scp_id FROM scp_report WHERE isactive=1 AND isdelete=0 AND scp_id IN ("
+ inClause.toString() + ")";
List<Map<String, Object>> existingList = jdbcTemplate.queryForList(sql, scpIds.toArray());
for (Map<String, Object> row : existingList) {
Object scpIdObj = row.get("scp_id");
if (scpIdObj instanceof Number) {
existingScpIds.add(((Number) scpIdObj).longValue());
}
}
}
// Step 5: Filter out already answered scp_ids
List<Map<String, Object>> filteredReportData = new ArrayList<Map<String, Object>>();
for (Map<String, Object> d : reportData) {
Object idObj = d.get("id");
if (idObj instanceof Number) {
Long id = ((Number) idObj).longValue();
if (!existingScpIds.contains(id)) {
filteredReportData.add(d);
}
}
}
// Step 6: Attach questions only to the filtered list
for (Map<String, Object> report : filteredReportData) {
Long scpId = ((Number) report.get("id")).longValue();
List<Map<String, Object>> questionsPart = new ArrayList<>();
for (Map<String, Object> question : questionList) {
Integer qid = (Integer) question.get("question_id");
Map<String, Object> questionPart = new HashMap<>();
questionPart.put("question_id", qid);
questionPart.put("question", question.get("question"));
questionPart.put("answer_type", question.get("answer_type"));
questionPart.put("answer_master", answerMasterMap.getOrDefault(qid, Collections.emptyList()));
// Empty answers since these scp_ids don’t exist yet
Map<String, Object> answersMap = new HashMap<>();
answersMap.put("scp_id", scpId);
answersMap.put("question_id", qid);
answersMap.put("answer", null);
answersMap.put("agent_id", null);
questionPart.put("answers", answersMap);
questionsPart.add(questionPart);
}
report.put("questions_part", questionsPart);
}
return filteredReportData;
}
// public boolean saveAnswers(List<Map<String, Object>> answers) {
// if (answers == null || answers.isEmpty()) return false;
//
// String sql = "INSERT INTO scp_report (scp_id, question_id, answer, agent_id, zone, ward, streetid, street_name, last_feedback_date) "
// + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
//
// int[][] result = jdbcTemplate.batchUpdate(sql, answers, answers.size(), (ps, answer) -> {
//
// // Convert safely to String or Integer
// String scpIdStr = getSafeString(answer.get("scp_id"));
// String questionIdStr = getSafeString(answer.get("question_id"));
// String answerStr = getSafeString(answer.get("answer"));
// String agentIdStr = getSafeString(answer.get("agent_id"));
// String zone = getSafeString(answer.get("zone"));
// String ward = getSafeString(answer.get("ward"));
// String streetId = getSafeString(answer.get("street_id"));
// String streetName = getSafeString(answer.get("street_name"));
// String lastFeedback = getSafeString(answer.get("lastfeedback"));
//
// // Parse integers only if not null
// Integer scpId = (scpIdStr != null) ? Integer.parseInt(scpIdStr) : null;
// Integer questionId = (questionIdStr != null) ? Integer.parseInt(questionIdStr) : null;
// Integer agentId = (agentIdStr != null) ? Integer.parseInt(agentIdStr) : null;
//
// // Set parameters
// ps.setObject(1, scpId);
// ps.setObject(2, questionId);
// ps.setObject(3, answerStr);
// ps.setObject(4, agentId);
// ps.setObject(5, zone);
// ps.setObject(6, ward);
// ps.setObject(7, streetId);
// ps.setObject(8, streetName);
// ps.setObject(9, lastFeedback);
// });
//
// return result.length > 0;
// }
public String saveAnswers(List<Map<String, Object>> answers) {
if (answers == null || answers.isEmpty()) return "error";
/*
// Step 1: Extract unique scp_ids from the list
List<Integer> scpIds = answers.stream()
.map(a -> {
String idStr = getSafeString(a.get("scp_id"));
return (idStr != null) ? Integer.parseInt(idStr) : null;
})
.filter(Objects::nonNull)
.distinct()
.toList();
*/
// Step 1: Extract unique scp_ids from the list
List<Integer> scpIds = new ArrayList<Integer>();
Set<Integer> uniqueIds = new HashSet<Integer>();
for (Map<String, Object> a : answers) {
Object scpIdObj = a.get("scp_id");
String idStr = getSafeString(scpIdObj);
if (idStr != null) {
try {
Integer id = Integer.parseInt(idStr);
if (!uniqueIds.contains(id)) {
uniqueIds.add(id);
scpIds.add(id);
}
} catch (NumberFormatException e) {
// Skip invalid numbers
}
}
}
// Step 2: Check if any of these scp_ids already exist in DB
String checkSql = "SELECT COUNT(*) FROM scp_report WHERE scp_id IN (:ids)";
Map<String, Object> params = new HashMap<>();
params.put("ids", scpIds);
NamedParameterJdbcTemplate namedJdbc = new NamedParameterJdbcTemplate(jdbcTemplate);
Integer count = namedJdbc.queryForObject(checkSql, params, Integer.class);
if (count != null && count > 0) {
// Duplicate found — stop processing
return "duplicate";
}
// Step 3: Insert new answers
String insertSql = "INSERT INTO scp_report (scp_id, question_id, answer, agent_id, zone, ward, streetid, street_name, last_feedback_date) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
int[][] result = jdbcTemplate.batchUpdate(insertSql, answers, answers.size(), (ps, answer) -> {
String scpIdStr = getSafeString(answer.get("scp_id"));
String questionIdStr = getSafeString(answer.get("question_id"));
String answerStr = getSafeString(answer.get("answer"));
String agentIdStr = getSafeString(answer.get("agent_id"));
String zone = getSafeString(answer.get("zone"));
String ward = getSafeString(answer.get("ward"));
String streetId = getSafeString(answer.get("street_id"));
String streetName = getSafeString(answer.get("street_name"));
String lastFeedback = getSafeString(answer.get("lastfeedback"));
Integer scpId = (scpIdStr != null) ? Integer.parseInt(scpIdStr) : null;
Integer questionId = (questionIdStr != null) ? Integer.parseInt(questionIdStr) : null;
Integer agentId = (agentIdStr != null) ? Integer.parseInt(agentIdStr) : null;
ps.setObject(1, scpId);
ps.setObject(2, questionId);
ps.setObject(3, answerStr);
ps.setObject(4, agentId);
ps.setObject(5, zone);
ps.setObject(6, ward);
ps.setObject(7, streetId);
ps.setObject(8, streetName);
ps.setObject(9, lastFeedback);
});
return (result.length > 0) ? "success" : "error";
}
// Helper method
private String getSafeString(Object val) {
if (val == null) return null;
String s = val.toString().trim();
return s.isEmpty() ? null : s;
}
public List<Map<String, Object>> getZoneWiseReportData() {
String sql = "SELECT "
+ "sr.zone,"
+ " COALESCE(COUNT(DISTINCT sr.scp_id), 0) AS Completed,"
+ " SUM(CASE WHEN sr.answer = 'Yes' THEN 1 ELSE 0 END) AS YesCount,"
+ " SUM(CASE WHEN sr.answer = 'No' THEN 1 ELSE 0 END) AS NoCount,"
+ " SUM(CASE WHEN sr.answer = 'Available' THEN 1 ELSE 0 END) AS AvailableCount,"
+ " SUM(CASE WHEN sr.answer = 'Not Available' THEN 1 ELSE 0 END) AS NotAvailableCount,"
+ " SUM(CASE WHEN sr.answer = 'Image Not Clear' THEN 1 ELSE 0 END) AS ImageNotClearCount,"
+ " SUM(CASE WHEN sr.answer = 'Yes,it is in good condition' THEN 1 ELSE 0 END) AS LidGoodYesCount,"
+ " SUM(CASE WHEN sr.answer = 'No,it is not in good condition' THEN 1 ELSE 0 END) AS LidGoodNoCount"
+ " FROM scp_report sr"
+ " WHERE sr.isactive = 1 AND sr.isdelete = 0"
+ " GROUP BY sr.zone"
+ " ORDER BY sr.zone";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getWardWiseReportData(String zone) {
String sql = "SELECT "
+ "sr.zone,"
+ "sr.ward,"
+ " COALESCE(COUNT(DISTINCT sr.scp_id), 0) AS Completed,"
+ " SUM(CASE WHEN sr.answer = 'Yes' THEN 1 ELSE 0 END) AS YesCount,"
+ " SUM(CASE WHEN sr.answer = 'No' THEN 1 ELSE 0 END) AS NoCount,"
+ " SUM(CASE WHEN sr.answer = 'Available' THEN 1 ELSE 0 END) AS AvailableCount,"
+ " SUM(CASE WHEN sr.answer = 'Not Available' THEN 1 ELSE 0 END) AS NotAvailableCount,"
+ " SUM(CASE WHEN sr.answer = 'Image Not Clear' THEN 1 ELSE 0 END) AS ImageNotClearCount,"
+ " SUM(CASE WHEN sr.answer = 'Yes,it is in good condition' THEN 1 ELSE 0 END) AS LidGoodYesCount,"
+ " SUM(CASE WHEN sr.answer = 'No,it is not in good condition' THEN 1 ELSE 0 END) AS LidGoodNoCount"
+ " FROM scp_report sr"
+ " WHERE sr.isactive = 1 AND sr.isdelete = 0 AND sr.zone= ?"
+ " GROUP BY sr.zone,sr.ward"
+ " ORDER BY sr.zone,sr.ward";
return jdbcTemplate.queryForList(sql,zone);
}
public List<Map<String, Object>> getStreetWiseReportData(String zone,String ward) {
String sql = "SELECT "
+ "sr.zone,"
+ "sr.ward,"
+ "sr.streetid,"
+ " COALESCE(COUNT(DISTINCT sr.scp_id), 0) AS Completed,"
+ " SUM(CASE WHEN sr.answer = 'Yes' THEN 1 ELSE 0 END) AS YesCount,"
+ " SUM(CASE WHEN sr.answer = 'No' THEN 1 ELSE 0 END) AS NoCount,"
+ " SUM(CASE WHEN sr.answer = 'Available' THEN 1 ELSE 0 END) AS AvailableCount,"
+ " SUM(CASE WHEN sr.answer = 'Not Available' THEN 1 ELSE 0 END) AS NotAvailableCount,"
+ " SUM(CASE WHEN sr.answer = 'Image Not Clear' THEN 1 ELSE 0 END) AS ImageNotClearCount,"
+ " SUM(CASE WHEN sr.answer = 'Yes,it is in good condition' THEN 1 ELSE 0 END) AS LidGoodYesCount,"
+ " SUM(CASE WHEN sr.answer = 'No,it is not in good condition' THEN 1 ELSE 0 END) AS LidGoodNoCount"
+ " FROM scp_report sr"
+ " WHERE sr.isactive = 1 AND sr.isdelete = 0 AND sr.zone=? AND sr.ward=?"
+ " GROUP BY sr.streetid, sr.street_name,sr.zone,sr.ward"
+ " ORDER BY sr.zone,sr.ward,sr.streetid";
return jdbcTemplate.queryForList(sql,zone,ward);
}
public List<Map<String,Object>> getdetailreport(String startDate, String endDate) {
String sql = "SELECT "
+ "sr.zone,"
+ "sr.ward,"
+ "sr.street_name,"
+ " COALESCE(COUNT(DISTINCT sr.scp_id), 0) AS Completed,"
+ " SUM(CASE WHEN sr.answer = 'Yes' THEN 1 ELSE 0 END) AS YesCount,"
+ " SUM(CASE WHEN sr.answer = 'No' THEN 1 ELSE 0 END) AS NoCount,"
+ " SUM(CASE WHEN sr.answer = 'Available' THEN 1 ELSE 0 END) AS AvailableCount,"
+ " SUM(CASE WHEN sr.answer = 'Not Available' THEN 1 ELSE 0 END) AS NotAvailableCount,"
+ " SUM(CASE WHEN sr.answer = 'Image Not Clear' THEN 1 ELSE 0 END) AS ImageNotClearCount,"
+ " SUM(CASE WHEN sr.answer = 'Yes,it is in good condition' THEN 1 ELSE 0 END) AS LidGoodYesCount,"
+ " SUM(CASE WHEN sr.answer = 'No,it is not in good condition' THEN 1 ELSE 0 END) AS LidGoodNoCount"
+ " FROM scp_report sr"
+ " WHERE sr.isactive = 1 AND sr.isdelete = 0 AND DATE(sr.created_date) BETWEEN ? AND ?"
+ " GROUP BY sr.streetid, sr.street_name,sr.zone,sr.ward"
+ " ORDER BY sr.zone,sr.ward,sr.streetid";
return jdbcTemplate.queryForList(sql,startDate,endDate);
}
}

105
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/SocialMediaService.java

@ -0,0 +1,105 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.time.LocalDateTime;
import java.util.ArrayList;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class SocialMediaService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(@Qualifier("mysql1913QAQCDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional
public int uploadComplaintDetailsInLogs(Map<String, Object> details,String action,String remarks,int updated_agent) {
//System.out.println("Complaint Details: " + details);
// Extract other field values from complaintDetails
String complaintNumber = details.get("complaintid").toString();
String complaintDate = details.get("complaintdate").toString();
String personName = details.get("complainantName").toString();
String personMobNo = details.get("mobileNumber").toString();
String cType = details.get("complaintType").toString();
String cMode = details.get("compmode").toString();
String department = details.get("deptname").toString();
String officialName = details.get("Officialname").toString();
String officialMobileNum = details.get("OfficialMobile").toString();
String callStatus = action;
String remarksfield = remarks;
String zone = details.get("Zone").toString();
int updated_by=updated_agent;
LocalDateTime currentDate = LocalDateTime.now();
String query = "INSERT INTO gcc_1913_qaqc.social_media_completed (complaint_number,zone,complaint_date, complaint_person_name,remarks, "
+ "complaint_mobilenumber, complaint_type, complaint_mode, department, official_name,official_mobilenum, call_status,created_date,updated_by) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?)";
int rowsAffected = jdbcTemplate.update(query, complaintNumber,zone, complaintDate,personName,remarksfield,
personMobNo, cType, cMode, department, officialName, officialMobileNum,callStatus,
currentDate,updated_by);
//System.out.println("Rows Inserted in table : " + rowsAffected);
return rowsAffected;
}
public List<Map<String, Object>> getdetails(String formattedFromDate, String formattedToDate, String status, String zone) {
StringBuilder query = new StringBuilder("SELECT * FROM gcc_1913_qaqc.social_media_completed WHERE DATE(created_date) BETWEEN ? AND ? ");
List<Object> params = new ArrayList<>();
params.add(formattedFromDate);
params.add(formattedToDate);
if (zone != null && !zone.isEmpty()) {
query.append(" AND zone = ?");
params.add(zone);
}
if (status != null && !status.equals("ALL")) {
query.append(" AND call_status = ?");
params.add(status);
}
// Log the query and parameters for debugging
//System.out.println("Executing query: " + query.toString());
//System.out.println("With parameters: " + params);
// Execute the query
List<Map<String, Object>> results = jdbcTemplate.queryForList(query.toString(), params.toArray());
// Log the results for debugging
//System.out.println("Query results: " + results);
return results.isEmpty() ? null : results;
}
public String getErpusernamebyId(String userId) {
String query="SELECT erp_username FROM gcc_1913_qaqc.agents_list\r\n"
+ "where calling_type='SOCIALMEDIA' and agent_id=?";
//System.out.println("query====="+query);
//String erpUsername = jdbcTemplate.queryForObject(query,new Object[]{userId},String.class);
String erpUsername = jdbcTemplate.queryForObject(query,String.class,userId);
return erpUsername;
}
}

274
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/StatusCountService.java

@ -0,0 +1,274 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@Service
public class StatusCountService {
private RestTemplate restTemplate;
private ObjectMapper objectMapper;
@Autowired
private AppConfig appconfig;
public StatusCountService(RestTemplate restTemplate, ObjectMapper objectMapper) {
this.restTemplate = restTemplate;
this.objectMapper = objectMapper;
}
public Map<String, Object> fetchComplaintCounts(String fromDate, String toDate, String compType, String zoneName, String compMode, String compGroup, String region) {
//https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=common_api&jsonResp=Yes&subService=dashboardAbs&fromDate=&toDate=&compType=&zoneName=&compMode=&compGroup=
String apiUrl;
if ("SOCIAL MEDIA".equalsIgnoreCase(compMode)) {
apiUrl = appconfig.qaqcurl+"serviceId=common_api&jsonResp=Yes"
+ "&subService=dashboardAbs"
+ "&fromDate=" + fromDate
+ "&toDate=" + toDate;
}
else {
apiUrl = appconfig.qaqcurl+"serviceId=common_api&jsonResp=Yes"
+ "&subService=dashboardAbs"
+ "&fromDate=" + fromDate
+ "&toDate=" + toDate
+"&excludeMode=7";
}
// Append parameters based on their availability
if (!compType.isEmpty()) {
apiUrl += "&compType=" + compType;
}
if (!zoneName.isEmpty()) {
apiUrl += "&zoneName=" + zoneName;
}
if (!compMode.isEmpty()) {
apiUrl += "&compMode=" + compMode;
}
if (!compGroup.isEmpty()) {
apiUrl += "&compGroup=" + compGroup;
}
if (!region.isEmpty()) {
apiUrl += "&region=" + region;
}
Map<String, Object> counts = new HashMap<>();
System.out.println("url: " + apiUrl);
try {
// Get the raw response
String response = restTemplate.getForObject(apiUrl, String.class);
//System.out.println("API Response: " + response); // Log the response for debugging
JsonNode jsonResponse = objectMapper.readTree(response);
// Check if "ListResult" exists and is an array
JsonNode listResult = jsonResponse.path("ListResult");
if (listResult.isArray() && !listResult.isEmpty()) {
JsonNode resultNode = listResult.get(0);
if (resultNode != null && !resultNode.isNull()) {
counts.put("Total Complaints", resultNode.path("RECEIVED").asText(""));
counts.put("In Progress", resultNode.path("PENDING").asText(""));
counts.put("Redressed", resultNode.path("REDRESSED").asText(""));
counts.put("Reopened", resultNode.path("REOPEN").asText(""));
counts.put("Closed", resultNode.path("CLOSED").asText(""));
}
}
//System.out.println(fromDate);
//System.out.println(toDate);
String url="https://erp.chennaicorporation.gov.in/pgr/newmobileservice?serviceId=ms_dashboard_details&From_date="+fromDate+"&To_date="+toDate+"&jsonResp=Yes&Status=closed&isQcuser=Yes&ComplaintType="+compType+"&ComplaintGroupId="+compGroup+"&compmode="+compMode+"&Zoneid="+zoneName+"&RegionId="+region;
System.out.println("url==="+url);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response1 = restTemplate.getForEntity(url, String.class);
String rawResponse = response1.getBody();
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> responseMap = objectMapper.readValue(rawResponse, Map.class);
List<Map<String, Object>> details = (List<Map<String, Object>>) responseMap.get("Details");
/*
long completedCount = (details == null || details.isEmpty()) ? 0 :
details.stream().filter(entry -> "Completed".equals(entry.get("Current Status"))).count();
*/
long completedCount = 0;
if (details != null && !details.isEmpty()) {
for (Map<String, Object> entry : details) {
Object statusObj = entry.get("Current Status");
if ("Completed".equals(statusObj)) {
completedCount++;
}
}
}
counts.put("Withdraw", String.valueOf(completedCount));
int closedCount = Integer.parseInt(String.valueOf(counts.getOrDefault("Closed", "0")));
closedCount -= completedCount; // Adjust closed count
counts.put("Closed", String.valueOf(closedCount));
} catch (Exception e) {
e.printStackTrace();
}
return counts;
}
public List<String> fetchComplaintTypes(String compGroup) {
// Construct the API URL with the compGroup parameter
String apiUrl = appconfig.qaqcurl +
"serviceId=common_api&jsonResp=Yes&subService=compTypelist&compGroup=" + compGroup;
List<String> complaintTypes = new ArrayList<>();
try {
// Call the external API
ResponseEntity<String> response = restTemplate.getForEntity(apiUrl, String.class);
if (response.getStatusCode() == HttpStatus.OK) {
// Parse the response JSON
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(response.getBody());
// Navigate to "ListResult" and extract "COMPLAINTTYPENAME"
JsonNode listResultNode = rootNode.path("ListResult");
if (listResultNode.isArray()) {
for (JsonNode item : listResultNode) {
String complaintTypeName = item.path("COMPLAINTTYPENAME").asText().trim();
complaintTypes.add(complaintTypeName);
}
}
}
} catch (Exception e) {
System.err.println("Error fetching complaint types for compGroup " + compGroup + ": " + e.getMessage());
}
return complaintTypes;
}
//for complaintgroup api
public List<String> fetchComplaintGroup() {
String apiUrl = appconfig.qaqcurl+"serviceId=common_api&jsonResp=Yes&subService=compGrouplist";
List<String> complaintGroup = new ArrayList();
try {
// Call the external API
ResponseEntity<String> response = restTemplate.getForEntity(apiUrl, String.class);
if (response.getStatusCode() == HttpStatus.OK) {
// Parse the response JSON
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(response.getBody());
// Navigate to "ListResult" and extract "COMPLAINTTYPENAME"
JsonNode listResultNode = rootNode.path("ListResult");
if (listResultNode.isArray()) {
for (JsonNode item : listResultNode) {
String complaintTypeName = item.path("COMPLAINTGROUPNAME").asText().trim();
complaintGroup.add(complaintTypeName);
}
}
}
} catch (Exception e) {
System.err.println("Error fetching complaint types: " + e.getMessage());
}
return complaintGroup;
}
//for modes api
public List<String> fetchModes() {
String apiUrl = appconfig.qaqcurl+"serviceId=common_api&jsonResp=Yes&subService=compModelist";
List<String> modes = new ArrayList();
try {
// Call the external API
ResponseEntity<String> response = restTemplate.getForEntity(apiUrl, String.class);
if (response.getStatusCode() == HttpStatus.OK) {
// Parse the response JSON
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(response.getBody());
// Navigate to "ListResult" and extract "COMPLAINTTYPENAME"
JsonNode listResultNode = rootNode.path("ListResult");
if (listResultNode.isArray()) {
for (JsonNode item : listResultNode) {
String complaintModeName = item.path("COMP_MODE").asText().trim();
modes.add(complaintModeName);
}
}
}
} catch (Exception e) {
System.err.println("Error fetching complaint types: " + e.getMessage());
}
return modes;
}
// for zones api
public List<String> fetchZones() {
String apiUrl = appconfig.qaqcurl+"serviceId=common_api&jsonResp=Yes&subService=zoneNamelist";
List<String> zones = new ArrayList();
try {
// Call the external API
ResponseEntity<String> response = restTemplate.getForEntity(apiUrl, String.class);
if (response.getStatusCode() == HttpStatus.OK) {
// Parse the response JSON
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(response.getBody());
// Navigate to "ListResult" and extract "COMPLAINTTYPENAME"
JsonNode listResultNode = rootNode.path("ListResult");
if (listResultNode.isArray()) {
for (JsonNode item : listResultNode) {
String complaintzone = item.path("NAME").asText().trim();
zones.add(complaintzone);
}
}
}
} catch (Exception e) {
System.err.println("Error fetching complaint types: " + e.getMessage());
}
return zones;
}
}

48
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/callcenterqaqc/service/WhatsappqaqcMsgService.java

@ -0,0 +1,48 @@
package in.gov.chennaicorporation.gccoffice.callcenterqaqc.service;
import java.net.HttpURLConnection;
import java.net.URL;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class WhatsappqaqcMsgService {
public String sendMsg(String msgUrl, String tamilmsgUrl) {
StringBuilder response = new StringBuilder();
response.append("English Message Response: ").append(sendWhatsAppMessage(msgUrl)).append("\n");
response.append("Tamil Message Response: ").append(sendWhatsAppMessage(tamilmsgUrl));
return response.toString();
}
private String sendWhatsAppMessage(String urlString) {
String response = "";
try {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response = String.valueOf(responseCode);
System.out.println("Response Code for URL: " + urlString + " is " + responseCode);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public String sendSMS(String SMS_Url) {
RestTemplate restTemplate = new RestTemplate();
String response =restTemplate.getForObject(SMS_Url,String.class);
return response;
}
}

174
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwaste/controller/DumpRegistrationAPIController.java

@ -0,0 +1,174 @@
package in.gov.chennaicorporation.gccoffice.cdwaste.controller;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.cdwaste.service.OfficerService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
@RestController
@RequestMapping("/gcc/api/dumpregistration")
public class DumpRegistrationAPIController {
@Autowired
private OfficerService officerService;
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public DumpRegistrationAPIController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@GetMapping("/wastecollectorlist")
public ResponseEntity<String> getWasteCollectorList(
@RequestParam(required = false) Long mobileNo,
@RequestParam(required = false) Long refId) {
StringBuilder apiUrl = new StringBuilder(appConfig.dumpregister + "/dumpregistration/api/wastecollectorlist");
// If at least one param is present, append '?'
if (mobileNo != null || refId != null) {
apiUrl.append("?");
}
// Append parameters
List<String> params = new ArrayList<>();
if (mobileNo != null) {
params.add("mobileNo=" + mobileNo);
}
if (refId != null) {
params.add("refId=" + refId);
}
apiUrl.append(String.join("&", params));
try {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl.toString(), String.class);
return ResponseEntity.ok(responseEntity.getBody());
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Failed to fetch data: " + e.getMessage());
}
}
@GetMapping("/getallcharges")
public ResponseEntity<String> getpaymentcharges() {
String apiUrl = appConfig.dumpregister + "/dumpregistration/dropdown/api/getallcharges";
try {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
return ResponseEntity.ok(responseEntity.getBody()); // Return the real response, not a fixed string
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Failed to fetch data: " + e.getMessage());
}
}
@PostMapping("/saveWasteRequest")
public ResponseEntity<String> saveWasteRequest(@RequestBody Map<String, Object> payload) {
try {
officerService.saveRequestDetails(payload);
return ResponseEntity.ok("Saved successfully");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error saving request");
}
}
@GetMapping("/getless1tonlist")
public ResponseEntity<String> getWasteCollectorLess1TonList() {
StringBuilder apiUrl = new StringBuilder(appConfig.dumpregister + "/dumpregistration/api/getless1tonlist");
try {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl.toString(), String.class);
return ResponseEntity.ok(responseEntity.getBody());
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Failed to fetch data: " + e.getMessage());
}
}
@GetMapping("/getless1tonlistbyId")
public ResponseEntity<String> getWasteCollectorLess1TonListbyId(@RequestParam(required = true) Long refId) {
if (refId == null) {
return ResponseEntity.badRequest().body("refId is required");
}
try {
String apiUrl = appConfig.dumpregister + "/dumpregistration/api/getless1tonlistbyid?refId=" + refId;
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
return ResponseEntity.ok(responseEntity.getBody());
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Failed to fetch data: " + e.getMessage());
}
}
@GetMapping("/getAllDetails")
public ResponseEntity<?> getAllRequestDetails(
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate fromDate,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate toDate,
@RequestParam(required = false) String wastequantity,
@RequestParam(required = false) String zone) {
try {
List<Map<String, Object>> response = officerService.getAllRequestDetails(fromDate, toDate, wastequantity, zone);
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Collections.singletonMap("error", "Failed to fetch data: " + e.getMessage()));
}
}
@GetMapping("/getquantity")
public List<Map<String, Object>> getwastequantity() {
return officerService.getAllwastequantity();
}
//fetch all zones
@GetMapping("/getzones")
public ResponseEntity<?> getAllZones() {
try {
List<Map<String, Object>> response = officerService.getZonesList();
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Collections.singletonMap("error", "Failed to fetch data: " + e.getMessage()));
}
}
}

75
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwaste/controller/MainController.java

@ -0,0 +1,75 @@
package in.gov.chennaicorporation.gccoffice.cdwaste.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/dumpregistration")
@Controller("dumpregistrationMainController")
public class MainController {
private final LoginUserInfo loginUserInfo;
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public MainController(RestTemplate restTemplate,LoginUserInfo loginUserInfo,
AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
this.loginUserInfo = loginUserInfo;
}
@GetMapping("/officer")
public String viewOfficer(Model model)
{
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/cdwastecollect/officer";
}
@GetMapping("/lessthanoneton")
public String viewLessoneTonList(Model model)
{
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/cdwastecollect/lessoneton";
}
@GetMapping("/overallreport")
public String wasteCollectionReports(Model model)
{
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
String UserRole = LoginUserInfo.getUserRole();
model.addAttribute("UserRole", UserRole);
return "modules/cdwastecollect/reports";
}
}

161
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwaste/service/OfficerService.java

@ -0,0 +1,161 @@
package in.gov.chennaicorporation.gccoffice.cdwaste.service;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
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.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
@Service
public class OfficerService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private RestTemplate restTemplate;
@Autowired
private SMSService smsService;
@Autowired
public void setDataSourcemysql(@Qualifier("mysqlCDManagerSystemDataSource") DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional
public void saveRequestDetails(Map<String, Object> payload) {
double actualWeight = Double.parseDouble(payload.get("actualWeight").toString());
String paymentType = payload.get("paymentType").toString();
/*
* double processingCharge =
* Double.parseDouble(payload.get("processingCharge").toString()); double
* wasteCharge = Double.parseDouble(payload.get("wasteCharge").toString());
*/
double processingCharge = payload.get("processingCharge") != null
? Double.parseDouble(payload.get("processingCharge").toString())
: 0.0;
double wasteCharge = payload.get("wasteCharge") != null
? Double.parseDouble(payload.get("wasteCharge").toString())
: 0.0;
double totalCharge = Double.parseDouble(payload.get("totalCharge").toString());
String paymentMobNo = payload.get("paymentMobileNo") != null ? payload.get("paymentMobileNo").toString() : null;
String refId = payload.get("refId") != null ? payload.get("refId").toString() : null;
// ✅ Check if record exists
String checkSql = "SELECT COUNT(*) FROM waste_collectors_request WHERE refid = ?";
Integer count = jdbcTemplate.queryForObject(checkSql, new Object[]{refId}, Integer.class);
if (count != null && count > 0) {
// ✅ Update the existing record
String updateSql = "UPDATE waste_collectors_request SET actual_weight = ?, payment_type = ?, processing_charge = ?, waste_collection_charge = ?, total_charge = ?, payment_mobile_no = ? WHERE refid = ?";
jdbcTemplate.update(updateSql, actualWeight, paymentType, processingCharge, wasteCharge, totalCharge, paymentMobNo, refId);
// ✅ Send WhatsApp message if payment type is 'generateLink' and mobile number is provided
if ("generateLink".equalsIgnoreCase(paymentType) && paymentMobNo != null && !paymentMobNo.isBlank()) {
sendWhatsappMessage(refId, actualWeight, totalCharge, paymentMobNo);
}
} else {
throw new RuntimeException("No request found for Ref ID: " + refId);
}
}
public void sendWhatsappMessage(String refId, double actualWeight, double totalCharge, String mobileNumber) {
try {
String message = String.format(
"Your request (Request ID: *%s*) has been processed. Please proceed with the payment.\n\nActual Weight: *%.0f kg*\nAmount Payable: *%.0f*",
refId, actualWeight, totalCharge
);
String encodedMessage = URLEncoder.encode(message, StandardCharsets.UTF_8);
String encodedHeader = URLEncoder.encode("C&D Waste Collection – Payment Request", StandardCharsets.UTF_8);
String encodedFooter = URLEncoder.encode("Greater Chennai Corporation", StandardCharsets.UTF_8);
String redirectUrlParam = URLEncoder.encode("dumpregistration/paymentform?requestId=" + refId, StandardCharsets.UTF_8);
String apiUrl = "https://media.smsgupshup.com/GatewayAPI/rest?userid=2000233507" +
"&password=h2YjFNcJ" +
"&send_to=" + mobileNumber +
"&v=1.1&format=json&msg_type=TEXT&method=SENDMESSAGE" +
"&msg=" + encodedMessage +
"&isTemplate=true" +
"&header=" + encodedHeader +
"&footer=" + encodedFooter +
"&buttonUrlParam=" + redirectUrlParam;
// Optional: log URL before hitting for debugging
System.out.println("WhatsApp API URL: " + apiUrl);
// Make API call
// restTemplate.getForObject(apiUrl, String.class);
smsService.sendMsg(apiUrl);
} catch (Exception e) {
e.printStackTrace();
// Optionally log or alert failure
}
}
public List<Map<String, Object>> getAllRequestDetails(LocalDate fromDate, LocalDate toDate, String wastequantity, String zone) {
StringBuilder query = new StringBuilder(
"SELECT wcr.id, wcr.name, wcr.mobile_no, wcr.area, wcr.zone, qm.quantity, " +
"wtm.waste_type, dl.location, wcr.actual_weight, wcr.payment_status,wcr.waste_collection_charge, " +
"wcr.processing_charge, wcr.total_charge, DATE_FORMAT(wcr.cdate, '%d-%m-%Y') AS request_date, wcr.refid " +
"FROM waste_collectors_request wcr " +
"JOIN dumping_location dl ON wcr.dump_location_id = dl.id " +
"JOIN waste_type_master wtm ON wcr.waste_type_id = wtm.id " +
"JOIN quantity_master qm ON wcr.waste_quantity_id = qm.id " +
"WHERE wcr.cdate BETWEEN ? AND ?");
LocalDateTime fromDateTime = fromDate.atStartOfDay();
LocalDateTime toDateTime = toDate.atTime(LocalTime.MAX);
List<Object> params = new ArrayList<>();
params.add(fromDateTime);
params.add(toDateTime);
if (wastequantity != null && !wastequantity.isEmpty()) {
query.append(" AND qm.quantity = ?");
params.add(wastequantity);
}
if (zone != null && !zone.isEmpty()) {
query.append(" AND wcr.zone = ?");
params.add(zone);
}
return jdbcTemplate.queryForList(query.toString(), params.toArray());
}
public List<Map<String, Object>> getAllwastequantity() {
String sql = " SELECT id,quantity FROM quantity_master where is_active = 1 ";
return jdbcTemplate.queryForList(sql);
}
public List<Map<String, Object>> getZonesList() {
String sql = " SELECT id,zone_name from zones where is_active = 1 ";
return jdbcTemplate.queryForList(sql);
}
}

40
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwaste/service/SMSService.java

@ -0,0 +1,40 @@
package in.gov.chennaicorporation.gccoffice.cdwaste.service;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.net.HttpURLConnection;
import java.net.URL;
@Service
public class SMSService {
public String sendMsg(String msgUrl) {
System.out.println("Whatsapp URL :-"+msgUrl);
String response ="";
try{
HttpURLConnection connection =null;
URL url = new URL(msgUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response=responseCode+"";
System.out.println("Response Code: " + responseCode);
}catch (Exception e){
e.printStackTrace();
}
return response;
}
public String sendSMS(String SMS_Url) {
System.out.println("SMS URL:- "+ SMS_Url);
RestTemplate restTemplate = new RestTemplate();
String response =restTemplate.getForObject(SMS_Url,String.class);
return response;
}
}

BIN
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/.DS_Store

111
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/controller/ApiController.java

@ -0,0 +1,111 @@
package in.gov.chennaicorporation.gccoffice.cdwastecollectorregistrations.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.MultipartFile;
import in.gov.chennaicorporation.gccoffice.cdwastecollectorregistrations.service.RegistrationService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
@RestController("cdapiController")
@RequestMapping("/gcc/api/registration")
public class ApiController {
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public ApiController(RestTemplate restTemplate, AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
}
@Autowired
private Environment environment;
@GetMapping("/pending")
public String getUserDetails(){
String apiUrl = appConfig.cdwastecollectors + "/volunteer/wastecollectors/api/getuserdetails";
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
return responseEntity.getBody();
}
@GetMapping("/pendingbyid")
public String getUserDetailsById(@RequestParam("registerId") Long registerId){
String apiUrl = appConfig.cdwastecollectors + "/volunteer/wastecollectors/api/getuserbyid"+"?registerId="+ registerId;
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
return responseEntity.getBody();
}
// @PostMapping("/acceptbyid")
// public String acceptRegistration(@RequestParam("registerId") Long registerId) {
// // Your logic to accept the registration
// String apiUrl = appConfig.cdwastecollectors +"/volunteer/wastecollector/api/accept"+"?registerId="+ registerId;
// ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
// return responseEntity.getBody();
// }
@PostMapping("/acceptbyid")
public ResponseEntity<String> acceptRegistration(@RequestParam("registerId") Long registerId) {
String apiUrl = appConfig.cdwastecollectors + "/volunteer/wastecollectors/api/accept?registerId=" + registerId;
ResponseEntity<String> responseEntity = restTemplate.postForEntity(apiUrl, null, String.class);
return ResponseEntity.ok("Registration Accepted for ID: " + registerId);
}
@PostMapping("/rejectbyid")
public ResponseEntity<String> rejectRegistration(
@RequestParam("registerId") Long registerId,
@RequestParam("reason") String reason) {
String apiUrl = appConfig.cdwastecollectors + "/volunteer/wastecollectors/api/reject?registerId=" + registerId + "&reason=" + reason;
ResponseEntity<String> responseEntity = restTemplate.postForEntity(apiUrl, null, String.class);
return ResponseEntity.ok("Registration Rejected for ID: " + registerId);
}
@GetMapping("/approvallist")
public String getApprovalDetails(){
String apiUrl = appConfig.cdwastecollectors + "/volunteer/wastecollectors/api/approvedlist";
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
return responseEntity.getBody();
}
@GetMapping("/rejectedlist")
public String getRejectedDetails(){
String apiUrl = appConfig.cdwastecollectors + "/volunteer/wastecollectors/api/rejectedlist";
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
return responseEntity.getBody();
}
}

142
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/controller/MainController.java

@ -0,0 +1,142 @@
package in.gov.chennaicorporation.gccoffice.cdwastecollectorregistrations.controller;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import in.gov.chennaicorporation.gccoffice.cdwastecollectorregistrations.service.RegistrationService;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
import org.springframework.http.MediaType;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@RequestMapping("/gcc/cdwaste")
@Controller("cdcontroller")
public class MainController {
private final LoginUserInfo loginUserInfo;
private final RestTemplate restTemplate;
private final AppConfig appConfig;
@Autowired
public MainController(RestTemplate restTemplate,LoginUserInfo loginUserInfo,
AppConfig appConfig) {
this.restTemplate = restTemplate;
this.appConfig = appConfig;
this.loginUserInfo = loginUserInfo;
}
@Autowired
private RegistrationService registrationservice;
@GetMapping("/registration")
public String SavecdRegistraion(Model model){
return "modules/cdwaste/registration";
}
@GetMapping("/pending")
public String Pendinglist(Model model) throws JsonMappingException, JsonProcessingException {
String apiUrl = appConfig.cdwastecollectors + "/volunteer/wastecollectors/api/getuserdetails";
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
// Get the response body
String responseBody = responseEntity.getBody();
ObjectMapper objectMapper = new ObjectMapper();
if (responseBody != null && !responseBody.isEmpty()) {
// Check if the response is an object or an array
if (responseBody.trim().startsWith("{")) { // Single object case
Map<String, Object> userDetails = objectMapper.readValue(responseBody, new TypeReference<Map<String, Object>>() {});
model.addAttribute("userDetails", List.of(userDetails)); // Convert to a list for consistency
} else { // It's expected to be an array
List<Map<String, Object>> userDetails = objectMapper.readValue(responseBody, new TypeReference<List<Map<String, Object>>>() {});
model.addAttribute("userDetails", userDetails); // Add the list directly
}
} else {
// If response is null or empty, pass an empty list to the model
model.addAttribute("userDetails", Collections.emptyList());
}
return "modules/cdwaste/pending"; // Return the view
}
@GetMapping("/approval")
public String approvalList(Model model) throws JsonMappingException, JsonProcessingException {
String apiUrl = appConfig.cdwastecollectors + "/volunteer/wastecollectors/api/approvedlist";
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
// Get the response body
String responseBody = responseEntity.getBody();
ObjectMapper objectMapper = new ObjectMapper();
if (responseBody != null && !responseBody.isEmpty()) {
// Check if the response is an object or an array
if (responseBody.trim().startsWith("{")) { // Single object case
Map<String, Object> approvalDetails = objectMapper.readValue(responseBody, new TypeReference<Map<String, Object>>() {});
model.addAttribute("approvalDetails", List.of(approvalDetails)); // Convert to list
} else { // It's an array
List<Map<String, Object>> approvalDetails = objectMapper.readValue(responseBody, new TypeReference<List<Map<String, Object>>>() {});
model.addAttribute("approvalDetails", approvalDetails);
}
} else {
model.addAttribute("approvalDetails", Collections.emptyList());
}
return "modules/cdwaste/approval"; // Return the appropriate view
}
@GetMapping("/rejected")
public String rejectedList(Model model) throws JsonMappingException, JsonProcessingException {
String apiUrl = appConfig.cdwastecollectors + "/volunteer/wastecollectors/api/rejectedlist";
ResponseEntity<String> responseEntity = restTemplate.getForEntity(apiUrl, String.class);
// Get the response body
String responseBody = responseEntity.getBody();
ObjectMapper objectMapper = new ObjectMapper();
if (responseBody != null && !responseBody.isEmpty()) {
// Check if the response is an object or an array
if (responseBody.trim().startsWith("{")) { // Single object case
Map<String, Object> rejectedDetails = objectMapper.readValue(responseBody, new TypeReference<Map<String, Object>>() {});
model.addAttribute("rejectedDetails", List.of(rejectedDetails)); // Convert to list
} else { // It's an array
List<Map<String, Object>> rejectedDetails = objectMapper.readValue(responseBody, new TypeReference<List<Map<String, Object>>>() {});
model.addAttribute("rejectedDetails", rejectedDetails);
}
} else {
model.addAttribute("rejectedDetails", Collections.emptyList());
}
return "modules/cdwaste/rejected"; // Return the appropriate view
}
}

29
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/controller/WhatsappControllerCD.java

@ -0,0 +1,29 @@
package in.gov.chennaicorporation.gccoffice.cdwastecollectorregistrations.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import in.gov.chennaicorporation.gccoffice.cdwastecollectorregistrations.service.WhatsappMsgService;
@RestController("whatsappconCD")
@RequestMapping("/gcc/api/cd/whatsapp")
public class WhatsappControllerCD {
@Autowired
private WhatsappMsgService whatsappMsgService;
@PostMapping("/send-whatsapp-message")
public ResponseEntity<String> sendWhatsAppMessage(@RequestParam String msgUrl) {
String response = whatsappMsgService.sendMsg(msgUrl);
return ResponseEntity.ok(response);
}
}

33
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/service/RegistrationService.java

@ -0,0 +1,33 @@
package in.gov.chennaicorporation.gccoffice.cdwastecollectorregistrations.service;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Service
public class RegistrationService {
@Autowired
private JdbcTemplate jdbcTemplate;
}

41
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/cdwastecollectorregistrations/service/WhatsappMsgService.java

@ -0,0 +1,41 @@
package in.gov.chennaicorporation.gccoffice.cdwastecollectorregistrations.service;
import java.net.HttpURLConnection;
import java.net.URL;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service("whatsappServiceCD")
public class WhatsappMsgService {
public String sendMsg(String msgUrl) {
String response ="";
try{
HttpURLConnection connection =null;
URL url = new URL(msgUrl);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
int responseCode = connection.getResponseCode();
response=responseCode+"";
System.out.println("Response Code: " + responseCode);
}catch (Exception e){
e.printStackTrace();
}
return response;
}
public String sendSMS(String SMS_Url) {
RestTemplate restTemplate = new RestTemplate();
String response =restTemplate.getForObject(SMS_Url,String.class);
return response;
}
}

58
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/controller/APIController.java

@ -0,0 +1,58 @@
package in.gov.chennaicorporation.gccoffice.circular.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import in.gov.chennaicorporation.gccoffice.circular.service.CircularMaster;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("gcc/api/circular")
@RestController("circularRest") // Circular Rest
public class APIController {
private CircularMaster circularMaster;
@Autowired
public APIController(CircularMaster circularMaster) {
this.circularMaster = circularMaster;
}
@GetMapping(value="/getCircularTypes")
public List getCircularTypeList() {
return circularMaster.getCircularType();
}
@GetMapping(value="/getDeprtmentList")
public List getDepartmentList() {
return circularMaster.getDepartment();
}
@GetMapping(value="/getCircularList")
public List getCircularList() {
return circularMaster.getCircular();
}
@PostMapping(value="/saveCircular")
public String savePetition(
@RequestParam("createdBy") String createdBy,
@RequestParam("doc_cat") String circularCategory,
@RequestParam("circularType") String circularType,
@RequestParam("department") String department,
@RequestParam("Date") String Date,
@RequestParam("subject") String subject,
@RequestParam("scan_page1") MultipartFile scan_file1) {
return circularMaster.saveCircular(createdBy,circularCategory,circularType,department,Date,subject,scan_file1);
}
@GetMapping(value="/getReport")
public List getReport() {
return circularMaster.getReport();
}
}

61
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/controller/MainController.java

@ -0,0 +1,61 @@
package in.gov.chennaicorporation.gccoffice.circular.controller;
import org.hibernate.hql.internal.ast.tree.RestrictableStatement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import in.gov.chennaicorporation.gccoffice.service.Base64Util;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/gcc/circular")
@Controller("CircularController")
public class MainController {
private final RestTemplate restTemplate;
private Environment environment;
private String BasePath = "modules/circular/";
@Autowired
public MainController(RestTemplate restTemplate,Environment environment) {
this.restTemplate = restTemplate;
this.environment = environment;
}
@GetMapping({"", "/", "/index", "/dashboard"})
public String dashboard(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
return BasePath+"index";
}
@GetMapping({"/new"})
public String newCircular(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
return BasePath+"new_circular";
}
@GetMapping("/list")
public String inbox(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
String uploadDirectory = environment.getProperty("file.upload.directory");
String serviceFolderName = environment.getProperty("cir_foldername");
uploadDirectory = uploadDirectory + serviceFolderName;
model.addAttribute("uploadDirectory",uploadDirectory);
return BasePath+"inbox";
}
@GetMapping("/report")
public String report(Model model) {
String LoginUserId = LoginUserInfo.getLoginUserId();
model.addAttribute("LoginUserId",LoginUserId);
return BasePath+"report";
}
}

1
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/controller/package-info.java

@ -0,0 +1 @@
package in.gov.chennaicorporation.gccoffice.circular.controller;

1
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/package-info.java

@ -0,0 +1 @@
package in.gov.chennaicorporation.gccoffice.circular;

223
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/service/CircularMaster.java

@ -0,0 +1,223 @@
package in.gov.chennaicorporation.gccoffice.circular.service;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.PreparedStatement;
import java.sql.Statement;
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.core.env.Environment;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import in.gov.chennaicorporation.gccoffice.m_petition.data.ComplaintType;
@Service("CircularMaster")
public class CircularMaster {
private JdbcTemplate jdbcTemplate;
private Environment environment;
private JdbcTemplate appjdbcTemplate;
@Autowired
public void setDataSource(Environment environment,
@Qualifier("mysqlCircularDataSource") DataSource dataSource,
@Qualifier("mysqlAppDataSource") DataSource appdataSource) {
this.environment = environment;
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.appjdbcTemplate = new JdbcTemplate(appdataSource);
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getCircularType(){
String SqlQuery = "";
SqlQuery = "SELECT * FROM `circular_types` WHERE `isactive`=1 AND `isdelete`=0";
List<Map<String, Object>> result = jdbcTemplate.queryForList(SqlQuery);
return result;
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getDepartment(){
String SqlQuery = "";
SqlQuery = "SELECT * FROM `departments` WHERE `isactive`=1 AND `isdelete`=0 Order By name";
List<Map<String, Object>> result = appjdbcTemplate.queryForList(SqlQuery);
return result;
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getCircular(){
String SqlQuery = "";
SqlQuery = "SELECT cd.*, cf.*, CASE WHEN cf.cid IS NOT NULL THEN 'true' ELSE 'false' END AS file_exits, gcc_apps.departments.name as department_name, circular_types.name as circular_type_name FROM circular_data cd LEFT JOIN circular_files cf ON cd.cid = cf.cid, gcc_apps.departments, circular_types where gcc_apps.departments.did=department AND circular_types.tid=circular_type ORDER BY cd.cid Desc";
List<Map<String, Object>> result = jdbcTemplate.queryForList(SqlQuery);
return result;
}
@Transactional
public String saveCircular(
String createdBy,
String circularCategory,
String circularType,
String department,
String Date,
String subject,
MultipartFile scan_file1) {
//System.out.println("I am from Service Page "+petitionerName);
//String complaintNature = "";
int lastInsertId = 0;
String sqlQuery = "INSERT INTO `circular_data` "
+ "(`createdBy`,`category`, `circular_type`, `department`, "
+ "`Date`, `subject`) "
+ "VALUES (?, ?, ?, ?, ?, ?)";
try {
KeyHolder keyHolder = new GeneratedKeyHolder();
// Use JdbcTemplate's update method to execute the query with parameters
jdbcTemplate.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sqlQuery, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, createdBy);
ps.setString(2, circularCategory);
ps.setString(3, circularType);
ps.setString(4, department);
ps.setString(5, Date);
ps.setString(6, subject);
return ps;
}, keyHolder);
// Get the last insert ID
lastInsertId = (int) keyHolder.getKey().longValue();
String lastInsertId_txt = String.valueOf(lastInsertId);
// Add Petition Scan File in the database
addCircularFile(createdBy, lastInsertId, scan_file1);
return lastInsertId_txt; // If no exception, query executed successfully
} catch (DataAccessException e) {
// Handle exception (e.g., log error)
String sqlQuery2 = "UPDATE `circular_data` SET `isactive`=0, `isdelete`=1 WHERE `cid`="+lastInsertId+" LIMIT 1";
jdbcTemplate.update(sqlQuery2);
e.printStackTrace();
return "error"; // Query execution failed
}
}
@Transactional
public String addCircularFile(String createdBy,
int cid,
MultipartFile page1) {
String fileName="";
for (int i = 1; i <= 4; i++) {
MultipartFile file = null;
switch (i) {
case 1:
file = page1;
fileName = "Scan1";
break;
}
if (file != null && !file.isEmpty()) {
try {
// Get the bytes of the file
byte[] bytes = file.getBytes();
// Set the file path where you want to save it
String uploadDirectory = environment.getProperty("file.upload.directory");
String serviceFolderName = environment.getProperty("cir_foldername");
uploadDirectory = uploadDirectory + serviceFolderName;
// File name
fileName = cid + "_" + fileName + "_" + file.getOriginalFilename();
//File Size
Long fileSize = file.getSize();
// File Type
String fileType = file.getContentType();
// Create directory if it doesn't exist
Path directoryPath = Paths.get(uploadDirectory);
if (!Files.exists(directoryPath)) {
Files.createDirectories(directoryPath);
}
String filePath = uploadDirectory + "/" + fileName;
// Create a new Path object
Path path = Paths.get(filePath);
// Write the bytes to the file
Files.write(path, bytes);
// Save the file path to a database
String sqlQuery = "INSERT INTO `circular_files` ( `cid`, `created_by`, `file_name`, `file_size`, `file_type`) "
+ "VALUES ('"+cid+"', '"+createdBy+"','"+fileName+"','"+fileSize+"','"+fileType+"')";
jdbcTemplate.update(sqlQuery);
} catch (IOException e) {
e.printStackTrace();
return "Failed to save file " + file.getOriginalFilename();
}
}
}
return "success";
}
@Transactional(readOnly = true)
public List<Map<String,Object>> getReport(){
String SqlQuery = "";
String dynamic_query ="";
SqlQuery = "SELECT * FROM `circular_types` WHERE `isactive`=1 AND `isdelete`=0 ORDER BY `tid`";
List<Map<String, Object>> circular_types_result = jdbcTemplate.queryForList(SqlQuery);
for(Map<String, Object> type : circular_types_result) {
String typeId = type.get("tid").toString();
String typeName = type.get("name").toString();
dynamic_query += "SUM(CASE WHEN ct.tid = '" + typeId + "' THEN 1 ELSE 0 END) AS `dynamic_" + typeName + "`, ";
}
// Remove the trailing comma and space from dynamic_query
dynamic_query = dynamic_query.substring(0, dynamic_query.length() - 2);
// Construct the SQL query with the dynamic part
SqlQuery = "SELECT "
+ " d.name, "
+ "SUM(CASE WHEN ct.tid != '0' THEN 1 ELSE 0 END) as total, "
+ dynamic_query + " "
+ "FROM "
+ "gcc_apps.departments d "
+ "LEFT JOIN circular.circular_data cd ON cd.department = d.did "
+ "LEFT JOIN circular.circular_types ct ON cd.circular_type = ct.tid "
+ "GROUP BY d.name";
System.out.println(SqlQuery);
List<Map<String, Object>> result = jdbcTemplate.queryForList(SqlQuery);
return result;
}
}

1
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/circular/service/package-info.java

@ -0,0 +1 @@
package in.gov.chennaicorporation.gccoffice.circular.service;

BIN
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/com_petition/.DS_Store

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save